Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,102 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Changed

#### Remove Deprecated Docker/Zep Storage Options ([LISA-70](https://linear.app/tonycasey/issue/LISA-70))

Simplified the CLI by removing deprecated storage options now that git-mem is the sole backend:

- **Removed from `lisa init`**:
- Storage mode prompts (local Docker, Zep Cloud, skip)
- `--mode`, `--endpoint`, `--group` options
- `--zep-api-key`, `--zep-project-id` options
- Docker compose file scaffolding

- **Removed commands**:
- `lisa up` - Docker Compose start
- `lisa down` - Docker Compose stop

- **Simplified `lisa doctor`**:
- Removed Docker, Neo4j, and Zep connectivity checks
- Now checks: git repository, Lisa structure, Claude hooks, git-mem notes

- **Cleaned up**:
- Deleted `docker.ts` module
- Deleted `.lisa/docker/` templates
- Simplified `.env.template` (removed STORAGE_MODE, GRAPHITI_ENDPOINT, NEO4J_* vars)
- Removed `DeploymentMode`, `IGraphitiConfig` types
- Removed `DEFAULT_ENDPOINT`, `ZEP_CLOUD_ENDPOINT` constants

---

## [2.27.0] - 2026-02-20

### Changed

#### Git-Mem: Replace All Memory Backends ([LISA-34](https://linear.app/tonycasey/issue/LISA-34))

**Major architecture change**: Replaced all memory backends (MCP, Neo4j, Zep) with git-mem, a git-based memory system using git notes. This eliminates external database dependencies and simplifies the architecture.

- All memory operations now use `refs/notes/mem` in the git repository
- Repository provides natural scoping - no need for group IDs
- Memories persist as git notes, visible via `git notes --ref=mem`
- Removed MCP, Neo4j, and Zep repository implementations
- Added `GitMemAdapter` and `GitMemTaskAdapter` for clean abstraction
- Simplified DI container with fewer backends to manage

#### Remove Group ID System ([LISA-59](https://linear.app/tonycasey/issue/LISA-59))

Removed the group ID system (~630 lines deleted). The git repository itself now provides scoping - memories are stored in `refs/notes/mem` which is repo-specific.

- Removed `group:${groupId}` tagging from all storage services
- Removed `groupIds`/`groupId` parameters from method signatures
- Deleted `src/lib/skills/common/group-id.ts` (~163 lines)
- Deleted `src/lib/skills/shared/utils/group-id.ts` (~183 lines)
- Simplified interfaces: `IMemoryService`, `ITaskService`, `ISkillMemoryService`, `ISkillTaskService`
- Backward compatible: existing memories with `group:` tags remain stored

#### Consolidate Skills Service Factories ([LISA-58](https://linear.app/tonycasey/issue/LISA-58))

Consolidated skills service factory patterns for cleaner dependency injection.

#### Consolidate Git into GitHub Skill ([LISA-19](https://linear.app/tonycasey/issue/LISA-19), [LISA-33](https://linear.app/tonycasey/issue/LISA-33))

- Merged `/git` skill into `/github` skill
- Renamed `/init-review` to `/review`
- Single skill for all GitHub and git workflow operations

### Added

#### Repo Profile Generation Service ([LISA-11](https://linear.app/tonycasey/issue/LISA-11))

Added `RepoProfileService` for generating repository profiles with project metadata and structure analysis.

#### Git-Powered Memory: Phase 4 Indexing ([LISA-10](https://linear.app/tonycasey/issue/LISA-10))

Added `GitIndexingService` for indexing git history into memory. Completes the git-powered memory feature.

- Indexes commits, branches, tags, and file history
- Extracts facts from commit messages and diffs
- Supports incremental indexing (only new commits)

#### Git-Powered Memory: Phase 3 Heuristic Extraction ([LISA-9](https://linear.app/tonycasey/issue/LISA-9))

Added heuristic extraction for git-powered memory without LLM dependency.

- Pattern-based extraction from commit messages
- Detects decisions, conventions, and architectural changes
- Fast local processing without API calls

#### LLM Environment Variable Support ([LISA-16](https://linear.app/tonycasey/issue/LISA-16))

Added environment variable support for LLM feature toggles and budget controls.

- `LISA_LLM_ENABLED` - Master switch for LLM features
- `LISA_LLM_BUDGET` - Monthly token budget
- `LISA_LLM_FEATURES` - Comma-separated list of enabled features
- Environment variables override preference store settings

### Fixed

#### Neo4j Write Fallback for Memory ([LISA-17](https://linear.app/tonycasey/issue/LISA-17))
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@tonycasey/lisa",
"version": "2.26.0",
"version": "2.27.0",
"description": "Long-term memory for AI coding assistants. Automatic context persistence, task tracking, and knowledge capture across coding sessions. Supports Claude Code and OpenCode.",
"bin": {
"lisa": "dist/lib/cli.js",
Expand Down
60 changes: 3 additions & 57 deletions src/lib/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,14 @@ import {
doctorCommand,
initCommand,
cleanupPreviousInstall,
upCommand,
downCommand,
registerHookCommands,
registerKnowledgeCommands,
registerSkillCommands,
registerIssueCommands,
registerPrCommands,
TEMPLATE_ROOT,
VERSION,
DEFAULT_ENDPOINT,
DEFAULT_GROUP,
type DeploymentMode,
type CliSupport,
} from './commands';

Expand Down Expand Up @@ -50,13 +46,8 @@ program

program
.command('init')
.description('Scaffold .lisa, .claude/.opencode, and Docker assets')
.option('-e, --endpoint <url>', 'MCP endpoint')
.option('-g, --group <id>', 'Default group id')
.description('Scaffold .lisa and .claude/.opencode directories')
.option('-f, --force', 'Overwrite existing files')
.option('-m, --mode <mode>', 'Deployment mode: local or zep-cloud')
.option('--zep-api-key <key>', 'Zep API key (for zep-cloud mode)')
.option('--zep-project-id <id>', 'Zep project ID (for zep-cloud mode)')
.option('-y, --yes', 'Skip prompts, use defaults')
.option('--isolated', 'Install to .claude/lib for non-npm projects (Python, Go, etc.)')
.option('--claude-only', 'Only scaffold for Claude Code')
Expand All @@ -71,7 +62,6 @@ program
const log = cliLogger.child({ command: 'init' });
const verbose = cmd.verbose && !cmd.quiet;
log.info('Starting init command', {
mode: cmd.mode,
claudeOnly: cmd.claudeOnly,
opencodeOnly: cmd.opencodeOnly,
verbose,
Expand All @@ -91,14 +81,8 @@ program
// If neither flag is set, cliSupport remains undefined and prompts will be shown

await initCommand({
endpoint: cmd.endpoint,
group: cmd.group,
force: cmd.force,
cwd: process.cwd(),
includeDocker: true,
mode: cmd.mode as DeploymentMode | undefined,
zepApiKey: cmd.zepApiKey,
zepProjectId: cmd.zepProjectId,
yes: cmd.yes,
isolated: cmd.isolated,
cliSupport,
Expand All @@ -114,13 +98,8 @@ program

program
.command('setup')
.description('Scaffold .lisa and .claude/.opencode only (no Docker assets)')
.option('-e, --endpoint <url>', 'MCP endpoint')
.option('-g, --group <id>', 'Default group id')
.description('Alias for init - scaffold .lisa and .claude/.opencode directories')
.option('-f, --force', 'Overwrite existing files')
.option('-m, --mode <mode>', 'Deployment mode: local or zep-cloud')
.option('--zep-api-key <key>', 'Zep API key (for zep-cloud mode)')
.option('--zep-project-id <id>', 'Zep project ID (for zep-cloud mode)')
.option('-y, --yes', 'Skip prompts, use defaults')
.option('--isolated', 'Install to .claude/lib for non-npm projects (Python, Go, etc.)')
.option('--claude-only', 'Only scaffold for Claude Code')
Expand All @@ -145,14 +124,8 @@ program
}

await initCommand({
endpoint: cmd.endpoint,
group: cmd.group,
force: cmd.force,
cwd: process.cwd(),
includeDocker: false,
mode: cmd.mode as DeploymentMode | undefined,
zepApiKey: cmd.zepApiKey,
zepProjectId: cmd.zepProjectId,
yes: cmd.yes,
isolated: cmd.isolated,
cliSupport,
Expand All @@ -163,39 +136,15 @@ program
}, services);
});

program
.command('up')
.description('Start Neo4j/Graph/graphiti-mcp via docker compose')
.option('-c, --compose <file>', 'Compose file', 'docker-compose.graphiti.yml')
.action(async (cmd) => {
const composeFile = path.resolve(process.cwd(), cmd.compose);
const services = createCliServices(TEMPLATE_ROOT);
await upCommand({ composeFile }, services);
});

program
.command('down')
.description('Stop Neo4j/Graph/graphiti-mcp via docker compose')
.option('-c, --compose <file>', 'Compose file', 'docker-compose.graphiti.yml')
.action(async (cmd) => {
const composeFile = path.resolve(process.cwd(), cmd.compose);
const services = createCliServices(TEMPLATE_ROOT);
await downCommand({ composeFile }, services);
});

program
.command('doctor')
.description('Validate Lisa configuration and backend connectivity')
.option('-c, --compose <file>', 'Compose file', 'docker-compose.graphiti.yml')
.option('-e, --endpoint <url>', 'MCP endpoint override')
.description('Validate Lisa configuration and setup')
.option('-v, --verbose', 'Show detailed diagnostics')
.option('--json', 'Output results as JSON')
.action(async (cmd) => {
const services = createCliServices(TEMPLATE_ROOT);
await doctorCommand({
cwd: process.cwd(),
compose: cmd.compose,
endpoint: cmd.endpoint,
verbose: cmd.verbose,
json: cmd.json,
}, services);
Expand Down Expand Up @@ -319,10 +268,7 @@ if (require.main === module) {
export {
initCommand,
doctorCommand,
upCommand,
downCommand,
cleanupPreviousInstall,
DEFAULT_ENDPOINT,
DEFAULT_GROUP,
TEMPLATE_ROOT,
runScan,
Expand Down
35 changes: 0 additions & 35 deletions src/lib/commands/docker.ts

This file was deleted.

Loading
Loading