learning-agent 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +92 -1
- package/README.md +109 -81
- package/dist/cli.js +2026 -1466
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +66 -45
- package/dist/index.js +214 -83
- package/dist/index.js.map +1 -1
- package/package.json +21 -11
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-utils.ts","../src/cli/shared.ts","../src/types.ts","../src/storage/jsonl.ts","../src/storage/sqlite.ts","../src/storage/compact.ts","../src/cli/commands/stats.ts","../src/cli/commands/list.ts","../src/cli/commands/search.ts","../src/cli/commands/rebuild.ts","../src/cli/commands/export.ts","../src/cli/commands/import.ts","../src/cli/commands/compact.ts","../src/embeddings/model.ts","../src/embeddings/nomic.ts","../src/search/vector.ts","../src/search/ranking.ts","../src/capture/quality.ts","../src/capture/triggers.ts","../src/retrieval/session.ts","../src/retrieval/plan.ts","../src/index.ts","../src/cli/commands/download-model.ts","../src/cli/commands/show.ts","../src/cli/commands/update.ts","../src/cli/commands/delete.ts","../src/cli/commands/learn.ts","../src/capture/integration.ts","../src/cli/commands/detect.ts","../src/cli/commands/capture.ts","../src/cli/commands/init.ts","../src/cli/commands/hooks.ts","../src/cli/commands/setup.ts","../src/cli/commands/load-session.ts","../src/cli/commands/check-plan.ts","../src/cli.ts"],"names":["join","mkdir","dirname","readFile","createHash","mtime","writeFile","rename","lines","appendFile","program","statSync","chalk","homedir","existsSync","DEFAULT_LIMIT","modelPath","size","SHOW_JSON_INDENT"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * CLI utility functions.\n *\n * Pure functions extracted from cli.ts for testability.\n */\n\n/**\n * Format bytes to human-readable string.\n *\n * @param bytes - Number of bytes\n * @returns Formatted string (e.g., \"1.5 KB\", \"2.0 MB\")\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n if (bytes < 1024) return `${bytes} B`;\n const kb = bytes / 1024;\n if (kb < 1024) return `${kb.toFixed(1)} KB`;\n const mb = kb / 1024;\n return `${mb.toFixed(1)} MB`;\n}\n\n/**\n * Parse limit option and validate it's a positive integer.\n *\n * @param value - String value from command option\n * @param name - Option name for error message\n * @returns Parsed integer\n * @throws Error if value is not a valid positive integer\n */\nexport function parseLimit(value: string, name: string): number {\n const parsed = parseInt(value, 10);\n if (Number.isNaN(parsed) || parsed <= 0) {\n throw new Error(`Invalid ${name}: must be a positive integer`);\n }\n return parsed;\n}\n\n/**\n * Get repository root from environment variable or current directory.\n *\n * @returns Repository root path for lesson storage\n */\nexport function getRepoRoot(): string {\n return process.env['LEARNING_AGENT_ROOT'] ?? process.cwd();\n}\n","/**\n * Shared CLI utilities and constants\n *\n * This module provides common functionality used across CLI commands:\n * - Output formatters (success, error, info, warn)\n * - Global options handling\n * - Constants for formatting and limits\n * - Hook configuration\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport { getRepoRoot } from '../cli-utils.js';\n\n// ============================================================================\n// Output Formatting\n// ============================================================================\n\n/** Output helper functions for consistent formatting */\nexport const out = {\n success: (msg: string): void => console.log(chalk.green('[ok]'), msg),\n error: (msg: string): void => console.error(chalk.red('[error]'), msg),\n info: (msg: string): void => console.log(chalk.blue('[info]'), msg),\n warn: (msg: string): void => console.log(chalk.yellow('[warn]'), msg),\n};\n\n// ============================================================================\n// Global Options\n// ============================================================================\n\n/** Global options interface */\nexport interface GlobalOpts {\n verbose: boolean;\n quiet: boolean;\n}\n\n/**\n * Get global options from command.\n */\nexport function getGlobalOpts(cmd: Command): GlobalOpts {\n const opts = cmd.optsWithGlobals() as { verbose?: boolean; quiet?: boolean };\n return {\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n };\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default limit for search results */\nexport const DEFAULT_SEARCH_LIMIT = '10';\n\n/** Default limit for list results */\nexport const DEFAULT_LIST_LIMIT = '20';\n\n/** Default limit for check-plan results */\nexport const DEFAULT_CHECK_PLAN_LIMIT = '5';\n\n/** Length of ISO date prefix (YYYY-MM-DD) */\nexport const ISO_DATE_PREFIX_LENGTH = 10;\n\n/** Decimal places for average calculations */\nexport const AVG_DECIMAL_PLACES = 1;\n\n/** Decimal places for relevance scores */\nexport const RELEVANCE_DECIMAL_PLACES = 2;\n\n/** Indentation for JSON pretty-printing */\nexport const JSON_INDENT_SPACES = 2;\n\n// ============================================================================\n// Hook Constants\n// ============================================================================\n\n/** Pre-commit hook reminder message */\nexport const PRE_COMMIT_MESSAGE = `Before committing, have you captured any valuable lessons from this session?\nConsider: corrections, mistakes, or insights worth remembering.\n\nTo capture a lesson:\n npx lna capture --trigger \"what happened\" --insight \"what to do\" --yes`;\n\n/** Pre-commit hook shell script template */\nexport const PRE_COMMIT_HOOK_TEMPLATE = `#!/bin/sh\n# Learning Agent pre-commit hook\n# Reminds Claude to consider capturing lessons before commits\n\nnpx lna hooks run pre-commit\n`;\n\n/** Marker to identify our hook in Claude Code settings (v0.2.1+: uses lna alias) */\nexport const CLAUDE_HOOK_MARKER = 'lna load-session';\n\n/** Legacy marker for backward compatibility with v0.2.0 hooks */\nexport const CLAUDE_HOOK_MARKER_LEGACY = 'learning-agent load-session';\n\n/** Claude Code SessionStart hook configuration */\nexport const CLAUDE_HOOK_CONFIG = {\n matcher: 'startup|resume|compact',\n hooks: [\n {\n type: 'command',\n command: 'npx lna load-session 2>/dev/null || true',\n },\n ],\n};\n\n/** Marker comment to identify our hook in git hooks */\nexport const HOOK_MARKER = '# Learning Agent pre-commit hook';\n\n// ============================================================================\n// Claude Settings Helpers\n// ============================================================================\n\n/**\n * Get path to Claude Code settings file.\n */\nexport function getClaudeSettingsPath(global: boolean): string {\n if (global) {\n return join(homedir(), '.claude', 'settings.json');\n }\n const repoRoot = getRepoRoot();\n return join(repoRoot, '.claude', 'settings.json');\n}\n\n/**\n * Read Claude Code settings from file.\n */\nexport async function readClaudeSettings(settingsPath: string): Promise<Record<string, unknown>> {\n if (!existsSync(settingsPath)) {\n return {};\n }\n const content = await readFile(settingsPath, 'utf-8');\n return JSON.parse(content) as Record<string, unknown>;\n}\n\n/**\n * Check if settings contain learning-agent hooks.\n */\nexport function hasClaudeHook(settings: Record<string, unknown>): boolean {\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks?.SessionStart) return false;\n\n return hooks.SessionStart.some((entry) => {\n const hookEntry = entry as { hooks?: Array<{ command?: string }> };\n return hookEntry.hooks?.some((h) =>\n h.command?.includes(CLAUDE_HOOK_MARKER) || h.command?.includes(CLAUDE_HOOK_MARKER_LEGACY)\n );\n });\n}\n\n/**\n * Add learning-agent hook to settings.\n */\nexport function addLearningAgentHook(settings: Record<string, unknown>): void {\n if (!settings.hooks) {\n settings.hooks = {};\n }\n const hooks = settings.hooks as Record<string, unknown[]>;\n if (!hooks.SessionStart) {\n hooks.SessionStart = [];\n }\n hooks.SessionStart.push(CLAUDE_HOOK_CONFIG);\n}\n\n/**\n * Remove learning-agent hooks from settings.\n * Returns true if any hooks were removed.\n */\nexport function removeLearningAgentHook(settings: Record<string, unknown>): boolean {\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks?.SessionStart) return false;\n\n const originalLength = hooks.SessionStart.length;\n hooks.SessionStart = hooks.SessionStart.filter((entry) => {\n const hookEntry = entry as { hooks?: Array<{ command?: string }> };\n return !hookEntry.hooks?.some((h) =>\n h.command?.includes(CLAUDE_HOOK_MARKER) || h.command?.includes(CLAUDE_HOOK_MARKER_LEGACY)\n );\n });\n\n return hooks.SessionStart.length < originalLength;\n}\n\n/**\n * Write Claude Code settings atomically.\n */\nexport async function writeClaudeSettings(settingsPath: string, settings: Record<string, unknown>): Promise<void> {\n const dir = dirname(settingsPath);\n await mkdir(dir, { recursive: true });\n\n const tempPath = settingsPath + '.tmp';\n await writeFile(tempPath, JSON.stringify(settings, null, 2) + '\\n', 'utf-8');\n await rename(tempPath, settingsPath);\n}\n","/**\n * Lesson type definitions using Zod schemas\n */\n\nimport { createHash } from 'node:crypto';\nimport { z } from 'zod';\n\n// Source of lesson capture\nexport const SourceSchema = z.enum([\n 'user_correction',\n 'self_correction',\n 'test_failure',\n 'manual',\n]);\n\n// Context about when lesson was learned\nexport const ContextSchema = z.object({\n tool: z.string(),\n intent: z.string(),\n});\n\n// Code pattern (bad -> good)\nexport const PatternSchema = z.object({\n bad: z.string(),\n good: z.string(),\n});\n\n// Severity levels for lessons\nexport const SeveritySchema = z.enum(['high', 'medium', 'low']);\n\n// Lesson type - semantic marker for lesson quality tier\nexport const LessonTypeSchema = z.enum(['quick', 'full']);\n\n/**\n * Unified Lesson schema.\n *\n * The `type` field is a semantic marker:\n * - 'quick': Minimal lesson for fast capture\n * - 'full': Important lesson (typically has evidence/severity)\n *\n * All fields except core identity are optional for flexibility.\n * Semantic meaning is preserved through convention, not schema enforcement.\n */\nexport const LessonSchema = z.object({\n // Core identity (required)\n id: z.string(),\n type: LessonTypeSchema,\n trigger: z.string(),\n insight: z.string(),\n\n // Metadata (required)\n tags: z.array(z.string()),\n source: SourceSchema,\n context: ContextSchema,\n created: z.string(), // ISO8601\n confirmed: z.boolean(),\n\n // Relationships (required, can be empty arrays)\n supersedes: z.array(z.string()),\n related: z.array(z.string()),\n\n // Extended fields (optional - typically present for 'full' type)\n evidence: z.string().optional(),\n severity: SeveritySchema.optional(),\n pattern: PatternSchema.optional(),\n\n // Lifecycle fields (optional)\n deleted: z.boolean().optional(),\n retrievalCount: z.number().optional(),\n});\n\n// Tombstone for deletions (append-only delete marker)\nexport const TombstoneSchema = z.object({\n id: z.string(),\n deleted: z.literal(true),\n deletedAt: z.string(), // ISO8601\n});\n\n// Type exports\nexport type Lesson = z.infer<typeof LessonSchema>;\nexport type LessonType = z.infer<typeof LessonTypeSchema>;\nexport type Tombstone = z.infer<typeof TombstoneSchema>;\nexport type Source = z.infer<typeof SourceSchema>;\nexport type Severity = z.infer<typeof SeveritySchema>;\nexport type Context = z.infer<typeof ContextSchema>;\nexport type Pattern = z.infer<typeof PatternSchema>;\n\n/**\n * Generate deterministic lesson ID from insight text.\n * Format: L + 8 hex characters from SHA-256 hash\n */\nexport function generateId(insight: string): string {\n const hash = createHash('sha256').update(insight).digest('hex');\n return `L${hash.slice(0, 8)}`;\n}\n","/**\n * JSONL storage layer for lessons\n *\n * Append-only storage with last-write-wins deduplication.\n * Source of truth - git trackable.\n */\n\nimport { appendFile, mkdir, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { LessonSchema, type Lesson } from '../types.js';\n\n/** Relative path to lessons file from repo root */\nexport const LESSONS_PATH = '.claude/lessons/index.jsonl';\n\n/** Options for reading lessons */\nexport interface ReadLessonsOptions {\n /** If true, throw on first parse error. Default: false (skip errors) */\n strict?: boolean;\n /** Callback for each parse error in non-strict mode */\n onParseError?: (error: ParseError) => void;\n}\n\n/** Parse error details */\nexport interface ParseError {\n /** 1-based line number */\n line: number;\n /** Error message */\n message: string;\n /** Original error */\n cause: unknown;\n}\n\n/** Result of reading lessons */\nexport interface ReadLessonsResult {\n /** Successfully parsed lessons */\n lessons: Lesson[];\n /** Number of lines skipped due to errors */\n skippedCount: number;\n}\n\n/**\n * Append a lesson to the JSONL file.\n * Creates directory structure if missing.\n */\nexport async function appendLesson(repoRoot: string, lesson: Lesson): Promise<void> {\n const filePath = join(repoRoot, LESSONS_PATH);\n await mkdir(dirname(filePath), { recursive: true });\n\n const line = JSON.stringify(lesson) + '\\n';\n await appendFile(filePath, line, 'utf-8');\n}\n\n/**\n * Parse and validate a single JSON line.\n * @returns Parsed lesson or null if invalid\n */\nfunction parseJsonLine(\n line: string,\n lineNumber: number,\n strict: boolean,\n onParseError?: (error: ParseError) => void\n): Lesson | null {\n // Try to parse JSON\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch (err) {\n const parseError: ParseError = {\n line: lineNumber,\n message: `Invalid JSON: ${(err as Error).message}`,\n cause: err,\n };\n if (strict) {\n throw new Error(`Parse error on line ${lineNumber}: ${parseError.message}`);\n }\n onParseError?.(parseError);\n return null;\n }\n\n // Validate against schema\n const result = LessonSchema.safeParse(parsed);\n if (!result.success) {\n const parseError: ParseError = {\n line: lineNumber,\n message: `Schema validation failed: ${result.error.message}`,\n cause: result.error,\n };\n if (strict) {\n throw new Error(`Parse error on line ${lineNumber}: ${parseError.message}`);\n }\n onParseError?.(parseError);\n return null;\n }\n\n return result.data;\n}\n\n/**\n * Read all non-deleted lessons from the JSONL file.\n * Applies last-write-wins deduplication by ID.\n * Returns result object with lessons and skippedCount.\n *\n * @param repoRoot - Repository root directory\n * @param options - Optional settings for error handling\n * @returns Result with lessons array and count of skipped lines\n */\nexport async function readLessons(\n repoRoot: string,\n options: ReadLessonsOptions = {}\n): Promise<ReadLessonsResult> {\n const { strict = false, onParseError } = options;\n const filePath = join(repoRoot, LESSONS_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return { lessons: [], skippedCount: 0 };\n }\n throw err;\n }\n\n const lessons = new Map<string, Lesson>();\n let skippedCount = 0;\n\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i]!.trim();\n if (!trimmed) continue;\n\n const lesson = parseJsonLine(trimmed, i + 1, strict, onParseError);\n if (!lesson) {\n skippedCount++;\n continue;\n }\n\n if (lesson.deleted) {\n lessons.delete(lesson.id);\n } else {\n lessons.set(lesson.id, lesson);\n }\n }\n\n return { lessons: Array.from(lessons.values()), skippedCount };\n}\n","/**\n * SQLite storage layer with FTS5 for full-text search\n *\n * Rebuildable index - not the source of truth.\n * Stored in .claude/.cache (gitignored).\n */\n\nimport { createHash } from 'node:crypto';\nimport { mkdirSync, statSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport Database from 'better-sqlite3';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\nimport type { Lesson } from '../types.js';\n\nimport { LESSONS_PATH, readLessons } from './jsonl.js';\n\n/** Relative path to database file from repo root */\nexport const DB_PATH = '.claude/.cache/lessons.sqlite';\n\n/** SQL schema for lessons database */\nconst SCHEMA_SQL = `\n -- Main lessons table\n CREATE TABLE IF NOT EXISTS lessons (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n trigger TEXT NOT NULL,\n insight TEXT NOT NULL,\n evidence TEXT,\n severity TEXT,\n tags TEXT NOT NULL DEFAULT '',\n source TEXT NOT NULL,\n context TEXT NOT NULL DEFAULT '{}',\n supersedes TEXT NOT NULL DEFAULT '[]',\n related TEXT NOT NULL DEFAULT '[]',\n created TEXT NOT NULL,\n confirmed INTEGER NOT NULL DEFAULT 0,\n deleted INTEGER NOT NULL DEFAULT 0,\n retrieval_count INTEGER NOT NULL DEFAULT 0,\n last_retrieved TEXT,\n embedding BLOB,\n content_hash TEXT\n );\n\n -- FTS5 virtual table for full-text search\n CREATE VIRTUAL TABLE IF NOT EXISTS lessons_fts USING fts5(\n id,\n trigger,\n insight,\n tags,\n content='lessons',\n content_rowid='rowid'\n );\n\n -- Trigger to sync FTS on INSERT\n CREATE TRIGGER IF NOT EXISTS lessons_ai AFTER INSERT ON lessons BEGIN\n INSERT INTO lessons_fts(rowid, id, trigger, insight, tags)\n VALUES (new.rowid, new.id, new.trigger, new.insight, new.tags);\n END;\n\n -- Trigger to sync FTS on DELETE\n CREATE TRIGGER IF NOT EXISTS lessons_ad AFTER DELETE ON lessons BEGIN\n INSERT INTO lessons_fts(lessons_fts, rowid, id, trigger, insight, tags)\n VALUES ('delete', old.rowid, old.id, old.trigger, old.insight, old.tags);\n END;\n\n -- Trigger to sync FTS on UPDATE\n CREATE TRIGGER IF NOT EXISTS lessons_au AFTER UPDATE ON lessons BEGIN\n INSERT INTO lessons_fts(lessons_fts, rowid, id, trigger, insight, tags)\n VALUES ('delete', old.rowid, old.id, old.trigger, old.insight, old.tags);\n INSERT INTO lessons_fts(rowid, id, trigger, insight, tags)\n VALUES (new.rowid, new.id, new.trigger, new.insight, new.tags);\n END;\n\n -- Index for common queries\n CREATE INDEX IF NOT EXISTS idx_lessons_created ON lessons(created);\n CREATE INDEX IF NOT EXISTS idx_lessons_confirmed ON lessons(confirmed);\n CREATE INDEX IF NOT EXISTS idx_lessons_severity ON lessons(severity);\n\n -- Metadata table for sync tracking\n CREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n`;\n\n/**\n * Create database schema for lessons storage.\n */\nfunction createSchema(database: DatabaseType): void {\n database.exec(SCHEMA_SQL);\n}\n\nlet db: DatabaseType | null = null;\n\n/**\n * Compute deterministic content hash for embedding cache validation.\n * Format: SHA-256 hex of \"trigger insight\"\n */\nexport function contentHash(trigger: string, insight: string): string {\n return createHash('sha256').update(`${trigger} ${insight}`).digest('hex');\n}\n\n/**\n * Open or create the SQLite database.\n *\n * Creates directory structure and schema if needed.\n * Returns a singleton instance - subsequent calls return the same connection.\n *\n * **Resource lifecycle:**\n * - First call creates the database file (if needed) and opens a connection\n * - Connection uses WAL mode for better concurrent access\n * - Connection remains open until `closeDb()` is called\n *\n * **Note:** Most code should not call this directly. Higher-level functions\n * like `searchKeyword` and `rebuildIndex` call it internally.\n *\n * @param repoRoot - Path to repository root (database stored at `.claude/.cache/lessons.sqlite`)\n * @returns The singleton database connection\n *\n * @see {@link closeDb} for releasing resources\n */\nexport function openDb(repoRoot: string): DatabaseType {\n if (db) return db;\n\n const dbPath = join(repoRoot, DB_PATH);\n\n // Create directory synchronously (better-sqlite3 is sync)\n const dir = dirname(dbPath);\n mkdirSync(dir, { recursive: true });\n\n db = new Database(dbPath);\n\n // Enable WAL mode for better concurrent access\n db.pragma('journal_mode = WAL');\n\n createSchema(db);\n\n return db;\n}\n\n/**\n * Close the database connection and release resources.\n *\n * **Resource lifecycle:**\n * - The database is opened lazily on first call to `openDb()` or any function that uses it\n * (e.g., `searchKeyword`, `rebuildIndex`, `syncIfNeeded`, `getCachedEmbedding`)\n * - Once opened, the connection remains active until `closeDb()` is called\n * - After closing, subsequent database operations will reopen the connection\n *\n * **When to call:**\n * - At the end of CLI commands to ensure clean process exit\n * - When transitioning between repositories in long-running processes\n * - Before process exit in graceful shutdown handlers\n *\n * **Best practices for long-running processes:**\n * - In single-operation scripts: call before exit\n * - In daemon/server processes: call in shutdown handler\n * - Not necessary to call between operations in the same repository\n *\n * @example\n * ```typescript\n * // CLI command pattern\n * try {\n * await searchKeyword(repoRoot, 'typescript', 10);\n * // ... process results\n * } finally {\n * closeDb();\n * }\n *\n * // Graceful shutdown pattern\n * process.on('SIGTERM', () => {\n * closeDb();\n * process.exit(0);\n * });\n * ```\n */\nexport function closeDb(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n\n/**\n * Get cached embedding for a lesson if content hash matches.\n * Returns null if no cache exists or hash mismatches.\n */\nexport function getCachedEmbedding(\n repoRoot: string,\n lessonId: string,\n expectedHash?: string\n): number[] | null {\n const database = openDb(repoRoot);\n const row = database\n .prepare('SELECT embedding, content_hash FROM lessons WHERE id = ?')\n .get(lessonId) as { embedding: Buffer | null; content_hash: string | null } | undefined;\n\n if (!row || !row.embedding || !row.content_hash) {\n return null;\n }\n\n // If expected hash provided, validate it matches\n if (expectedHash && row.content_hash !== expectedHash) {\n return null;\n }\n\n // Convert Buffer to Float32Array then to number[]\n const float32 = new Float32Array(\n row.embedding.buffer,\n row.embedding.byteOffset,\n row.embedding.byteLength / 4\n );\n return Array.from(float32);\n}\n\n/**\n * Cache an embedding for a lesson with content hash.\n */\nexport function setCachedEmbedding(\n repoRoot: string,\n lessonId: string,\n embedding: Float32Array | number[],\n hash: string\n): void {\n const database = openDb(repoRoot);\n\n // Convert to Buffer for storage\n const float32 = embedding instanceof Float32Array ? embedding : new Float32Array(embedding);\n const buffer = Buffer.from(float32.buffer, float32.byteOffset, float32.byteLength);\n\n database\n .prepare('UPDATE lessons SET embedding = ?, content_hash = ? WHERE id = ?')\n .run(buffer, hash, lessonId);\n}\n\n/** DB row type for lessons table */\ninterface LessonRow {\n id: string;\n type: string;\n trigger: string;\n insight: string;\n evidence: string | null;\n severity: string | null;\n tags: string;\n source: string;\n context: string;\n supersedes: string;\n related: string;\n created: string;\n confirmed: number;\n deleted: number;\n retrieval_count: number;\n last_retrieved: string | null;\n embedding: Buffer | null;\n}\n\n/**\n * Convert a database row to a typed Lesson object.\n * Maps NULL to undefined for optional fields (lossless roundtrip).\n */\nfunction rowToLesson(row: LessonRow): Lesson {\n const lesson: Lesson = {\n id: row.id,\n type: row.type as 'quick' | 'full',\n trigger: row.trigger,\n insight: row.insight,\n tags: row.tags ? row.tags.split(',').filter(Boolean) : [],\n source: row.source as Lesson['source'],\n context: JSON.parse(row.context) as Lesson['context'],\n supersedes: JSON.parse(row.supersedes) as string[],\n related: JSON.parse(row.related) as string[],\n created: row.created,\n confirmed: row.confirmed === 1,\n };\n\n // Optional fields: map NULL -> undefined (lossless roundtrip)\n if (row.evidence !== null) {\n lesson.evidence = row.evidence;\n }\n if (row.severity !== null) {\n lesson.severity = row.severity as 'high' | 'medium' | 'low';\n }\n if (row.deleted === 1) {\n lesson.deleted = true;\n }\n if (row.retrieval_count > 0) {\n lesson.retrievalCount = row.retrieval_count;\n }\n\n return lesson;\n}\n\n/** Cached embedding with its content hash */\ninterface CachedEmbeddingData {\n embedding: Buffer;\n contentHash: string;\n}\n\n/**\n * Collect cached embeddings from existing lessons for preservation.\n */\nfunction collectCachedEmbeddings(database: DatabaseType): Map<string, CachedEmbeddingData> {\n const cache = new Map<string, CachedEmbeddingData>();\n const rows = database\n .prepare('SELECT id, embedding, content_hash FROM lessons WHERE embedding IS NOT NULL')\n .all() as Array<{ id: string; embedding: Buffer; content_hash: string | null }>;\n\n for (const row of rows) {\n if (row.embedding && row.content_hash) {\n cache.set(row.id, { embedding: row.embedding, contentHash: row.content_hash });\n }\n }\n return cache;\n}\n\n/** SQL for inserting a lesson row */\nconst INSERT_LESSON_SQL = `\n INSERT INTO lessons (id, type, trigger, insight, evidence, severity, tags, source, context, supersedes, related, created, confirmed, deleted, retrieval_count, last_retrieved, embedding, content_hash)\n VALUES (@id, @type, @trigger, @insight, @evidence, @severity, @tags, @source, @context, @supersedes, @related, @created, @confirmed, @deleted, @retrieval_count, @last_retrieved, @embedding, @content_hash)\n`;\n\n/**\n * Get the mtime of the JSONL file, or null if it doesn't exist.\n */\nfunction getJsonlMtime(repoRoot: string): number | null {\n const jsonlPath = join(repoRoot, LESSONS_PATH);\n try {\n const stat = statSync(jsonlPath);\n return stat.mtimeMs;\n } catch {\n return null;\n }\n}\n\n/**\n * Get the last synced mtime from metadata table.\n */\nfunction getLastSyncMtime(database: DatabaseType): number | null {\n const row = database\n .prepare('SELECT value FROM metadata WHERE key = ?')\n .get('last_sync_mtime') as { value: string } | undefined;\n return row ? parseFloat(row.value) : null;\n}\n\n/**\n * Store the last synced mtime in metadata table.\n */\nfunction setLastSyncMtime(database: DatabaseType, mtime: number): void {\n database\n .prepare('INSERT OR REPLACE INTO metadata (key, value) VALUES (?, ?)')\n .run('last_sync_mtime', mtime.toString());\n}\n\n/**\n * Rebuild the SQLite index from the JSONL source of truth.\n * Preserves embeddings where content hash is unchanged.\n * Updates the last sync mtime after successful rebuild.\n */\nexport async function rebuildIndex(repoRoot: string): Promise<void> {\n const database = openDb(repoRoot);\n const { lessons } = await readLessons(repoRoot);\n\n const cachedEmbeddings = collectCachedEmbeddings(database);\n database.exec('DELETE FROM lessons');\n\n if (lessons.length === 0) {\n // Still update mtime even for empty file\n const mtime = getJsonlMtime(repoRoot);\n if (mtime !== null) {\n setLastSyncMtime(database, mtime);\n }\n return;\n }\n\n const insert = database.prepare(INSERT_LESSON_SQL);\n const insertMany = database.transaction((items: Lesson[]) => {\n for (const lesson of items) {\n const newHash = contentHash(lesson.trigger, lesson.insight);\n const cached = cachedEmbeddings.get(lesson.id);\n const hasValidCache = cached && cached.contentHash === newHash;\n\n insert.run({\n id: lesson.id,\n type: lesson.type,\n trigger: lesson.trigger,\n insight: lesson.insight,\n evidence: lesson.evidence ?? null,\n severity: lesson.severity ?? null,\n tags: lesson.tags.join(','),\n source: lesson.source,\n context: JSON.stringify(lesson.context),\n supersedes: JSON.stringify(lesson.supersedes),\n related: JSON.stringify(lesson.related),\n created: lesson.created,\n confirmed: lesson.confirmed ? 1 : 0,\n deleted: lesson.deleted ? 1 : 0,\n retrieval_count: lesson.retrievalCount ?? 0,\n last_retrieved: null, // Reset on rebuild since we're rebuilding from source\n embedding: hasValidCache ? cached.embedding : null,\n content_hash: hasValidCache ? cached.contentHash : null,\n });\n }\n });\n\n insertMany(lessons);\n\n // Update last sync mtime\n const mtime = getJsonlMtime(repoRoot);\n if (mtime !== null) {\n setLastSyncMtime(database, mtime);\n }\n}\n\n/** Options for syncIfNeeded */\nexport interface SyncOptions {\n /** Force rebuild even if JSONL unchanged */\n force?: boolean;\n}\n\n/**\n * Sync the index if JSONL has changed since last sync.\n * Returns true if a rebuild was performed, false if skipped.\n */\nexport async function syncIfNeeded(\n repoRoot: string,\n options: SyncOptions = {}\n): Promise<boolean> {\n const { force = false } = options;\n\n // Check JSONL mtime\n const jsonlMtime = getJsonlMtime(repoRoot);\n if (jsonlMtime === null && !force) {\n // No JSONL file exists\n return false;\n }\n\n const database = openDb(repoRoot);\n const lastSyncMtime = getLastSyncMtime(database);\n\n // Rebuild if forced, no previous sync, or JSONL is newer\n const needsRebuild = force || lastSyncMtime === null || (jsonlMtime !== null && jsonlMtime > lastSyncMtime);\n\n if (needsRebuild) {\n await rebuildIndex(repoRoot);\n return true;\n }\n\n return false;\n}\n\n/**\n * Search lessons using FTS5 keyword search.\n * Returns matching lessons up to the specified limit.\n * Increments retrieval count for all returned lessons.\n */\nexport async function searchKeyword(\n repoRoot: string,\n query: string,\n limit: number\n): Promise<Lesson[]> {\n const database = openDb(repoRoot);\n\n // Check if there are any lessons\n const countResult = database.prepare('SELECT COUNT(*) as cnt FROM lessons').get() as {\n cnt: number;\n };\n if (countResult.cnt === 0) return [];\n\n // Use FTS5 MATCH for search\n const rows = database\n .prepare(\n `\n SELECT l.*\n FROM lessons l\n JOIN lessons_fts fts ON l.rowid = fts.rowid\n WHERE lessons_fts MATCH ?\n LIMIT ?\n `\n )\n .all(query, limit) as LessonRow[];\n\n // Increment retrieval count for matched lessons\n if (rows.length > 0) {\n incrementRetrievalCount(repoRoot, rows.map((r) => r.id));\n }\n\n return rows.map(rowToLesson);\n}\n\n/** Retrieval statistics for a lesson */\nexport interface RetrievalStat {\n id: string;\n count: number;\n lastRetrieved: string | null;\n}\n\n/**\n * Increment retrieval count for a list of lesson IDs.\n * Updates both count and last_retrieved timestamp.\n * Non-existent IDs are silently ignored.\n */\nexport function incrementRetrievalCount(repoRoot: string, lessonIds: string[]): void {\n if (lessonIds.length === 0) return;\n\n const database = openDb(repoRoot);\n const now = new Date().toISOString();\n\n const update = database.prepare(`\n UPDATE lessons\n SET retrieval_count = retrieval_count + 1,\n last_retrieved = ?\n WHERE id = ?\n `);\n\n const updateMany = database.transaction((ids: string[]) => {\n for (const id of ids) {\n update.run(now, id);\n }\n });\n\n updateMany(lessonIds);\n}\n\n/**\n * Get retrieval statistics for all lessons.\n * Returns id, retrieval count, and last retrieved timestamp for each lesson.\n */\nexport function getRetrievalStats(repoRoot: string): RetrievalStat[] {\n const database = openDb(repoRoot);\n\n const rows = database\n .prepare('SELECT id, retrieval_count, last_retrieved FROM lessons')\n .all() as Array<{ id: string; retrieval_count: number; last_retrieved: string | null }>;\n\n return rows.map((row) => ({\n id: row.id,\n count: row.retrieval_count,\n lastRetrieved: row.last_retrieved,\n }));\n}\n","/**\n * Compaction and auto-archive for lessons\n *\n * Handles:\n * - Archiving old lessons (>90 days with 0 retrievals)\n * - Removing tombstones through JSONL rewrite\n * - Tracking compaction thresholds\n */\n\nimport { appendFile, mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport type { Lesson } from '../types.js';\n\nimport { LESSONS_PATH, readLessons } from './jsonl.js';\n\n/** Relative path to archive directory from repo root */\nexport const ARCHIVE_DIR = '.claude/lessons/archive';\n\n/** Number of tombstones that triggers automatic compaction */\nexport const TOMBSTONE_THRESHOLD = 100;\n\n/** Age threshold for archiving (in days) */\nexport const ARCHIVE_AGE_DAYS = 90;\n\n/** Milliseconds per day for time calculations */\nconst MS_PER_DAY = 1000 * 60 * 60 * 24;\n\n/** Month offset for JavaScript's 0-indexed months */\nconst MONTH_INDEX_OFFSET = 1;\n\n/** Padding length for month in archive filename (e.g., \"01\" not \"1\") */\nconst MONTH_PAD_LENGTH = 2;\n\n/**\n * Result of a compaction operation\n */\nexport interface CompactResult {\n /** Number of lessons moved to archive */\n archived: number;\n /** Number of tombstones removed */\n tombstonesRemoved: number;\n /** Number of lessons remaining in index.jsonl */\n lessonsRemaining: number;\n}\n\n/**\n * Generate archive file path for a given date.\n * Format: .claude/lessons/archive/YYYY-MM.jsonl\n */\nexport function getArchivePath(repoRoot: string, date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + MONTH_INDEX_OFFSET).padStart(MONTH_PAD_LENGTH, '0');\n return join(repoRoot, ARCHIVE_DIR, `${year}-${month}.jsonl`);\n}\n\n/**\n * Parse raw JSONL lines from the lessons file.\n * Returns all lines (including invalid ones) as parsed objects or null.\n */\nasync function parseRawJsonlLines(\n repoRoot: string\n): Promise<Array<{ line: string; parsed: Record<string, unknown> | null }>> {\n const filePath = join(repoRoot, LESSONS_PATH);\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n return [];\n }\n\n const results: Array<{ line: string; parsed: Record<string, unknown> | null }> = [];\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const parsed = JSON.parse(trimmed) as Record<string, unknown>;\n results.push({ line: trimmed, parsed });\n } catch {\n results.push({ line: trimmed, parsed: null });\n }\n }\n return results;\n}\n\n/**\n * Count the number of tombstones (deleted: true records) in the JSONL file.\n */\nexport async function countTombstones(repoRoot: string): Promise<number> {\n const lines = await parseRawJsonlLines(repoRoot);\n let count = 0;\n for (const { parsed } of lines) {\n if (parsed && parsed['deleted'] === true) {\n count++;\n }\n }\n return count;\n}\n\n/**\n * Check if compaction is needed based on tombstone count.\n */\nexport async function needsCompaction(repoRoot: string): Promise<boolean> {\n const count = await countTombstones(repoRoot);\n return count >= TOMBSTONE_THRESHOLD;\n}\n\n/**\n * Rewrite the JSONL file without tombstones.\n * Applies last-write-wins deduplication.\n */\nexport async function rewriteWithoutTombstones(repoRoot: string): Promise<number> {\n const filePath = join(repoRoot, LESSONS_PATH);\n const tempPath = filePath + '.tmp';\n\n // Read deduplicated lessons (already handles last-write-wins)\n const { lessons } = await readLessons(repoRoot);\n\n // Count tombstones before rewrite\n const tombstoneCount = await countTombstones(repoRoot);\n\n // Ensure directory exists\n await mkdir(dirname(filePath), { recursive: true });\n\n // Write clean lessons to temp file\n const lines = lessons.map((lesson) => JSON.stringify(lesson) + '\\n');\n await writeFile(tempPath, lines.join(''), 'utf-8');\n\n // Atomic rename\n await rename(tempPath, filePath);\n\n return tombstoneCount;\n}\n\n/**\n * Determine if a lesson should be archived based on age and retrieval count.\n * Lessons are archived if older than ARCHIVE_AGE_DAYS and never retrieved.\n *\n * @param lesson - The lesson to evaluate\n * @param now - Current date for age calculation\n * @returns true if lesson should be archived\n */\nfunction shouldArchive(lesson: Lesson, now: Date): boolean {\n const created = new Date(lesson.created);\n const ageMs = now.getTime() - created.getTime();\n const ageDays = ageMs / MS_PER_DAY;\n\n // Archive if: older than threshold AND never retrieved\n return ageDays > ARCHIVE_AGE_DAYS && (lesson.retrievalCount === undefined || lesson.retrievalCount === 0);\n}\n\n/**\n * Archive old lessons that haven't been retrieved.\n * Moves lessons >90 days old with 0 retrievals to archive files.\n * Returns the number of lessons archived.\n */\nexport async function archiveOldLessons(repoRoot: string): Promise<number> {\n const { lessons } = await readLessons(repoRoot);\n const now = new Date();\n\n const toArchive: Lesson[] = [];\n const toKeep: Lesson[] = [];\n\n for (const lesson of lessons) {\n if (shouldArchive(lesson, now)) {\n toArchive.push(lesson);\n } else {\n toKeep.push(lesson);\n }\n }\n\n if (toArchive.length === 0) {\n return 0;\n }\n\n // Group lessons by archive file (YYYY-MM)\n const archiveGroups = new Map<string, Lesson[]>();\n for (const lesson of toArchive) {\n const created = new Date(lesson.created);\n const archivePath = getArchivePath(repoRoot, created);\n const group = archiveGroups.get(archivePath) ?? [];\n group.push(lesson);\n archiveGroups.set(archivePath, group);\n }\n\n // Create archive directory\n const archiveDir = join(repoRoot, ARCHIVE_DIR);\n await mkdir(archiveDir, { recursive: true });\n\n // Append to archive files\n for (const [archivePath, archiveLessons] of archiveGroups) {\n const lines = archiveLessons.map((l) => JSON.stringify(l) + '\\n').join('');\n await appendFile(archivePath, lines, 'utf-8');\n }\n\n // Rewrite main file without archived lessons\n const filePath = join(repoRoot, LESSONS_PATH);\n const tempPath = filePath + '.tmp';\n await mkdir(dirname(filePath), { recursive: true });\n\n const lines = toKeep.map((lesson) => JSON.stringify(lesson) + '\\n');\n await writeFile(tempPath, lines.join(''), 'utf-8');\n await rename(tempPath, filePath);\n\n return toArchive.length;\n}\n\n/**\n * Run full compaction: archive old lessons and remove tombstones.\n */\nexport async function compact(repoRoot: string): Promise<CompactResult> {\n // Count tombstones BEFORE any operations (archiving also rewrites the file)\n const tombstonesBefore = await countTombstones(repoRoot);\n\n // First, archive old lessons\n const archived = await archiveOldLessons(repoRoot);\n\n // Then, remove tombstones (may be fewer now if archiving removed some)\n const tombstonesAfterArchive = await countTombstones(repoRoot);\n await rewriteWithoutTombstones(repoRoot);\n\n // Total tombstones removed = before - after rewrite (which is 0 after rewrite)\n // But we want to report what was actually in the file before compaction\n const tombstonesRemoved = archived > 0 ? tombstonesBefore : tombstonesAfterArchive;\n\n // Get final count\n const { lessons } = await readLessons(repoRoot);\n\n return {\n archived,\n tombstonesRemoved,\n lessonsRemaining: lessons.length,\n };\n}\n","/**\n * Stats command - Show database health and statistics\n */\n\nimport type { Command } from 'commander';\nimport { statSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { formatBytes, getRepoRoot } from '../../cli-utils.js';\nimport { countTombstones, DB_PATH, getRetrievalStats, LESSONS_PATH, readLessons, syncIfNeeded } from '../../storage/index.js';\nimport { AVG_DECIMAL_PLACES } from '../shared.js';\n\n/**\n * Register the stats command with the program.\n */\nexport function registerStatsCommand(program: Command): void {\n program\n .command('stats')\n .description('Show database health and statistics')\n .action(async () => {\n const repoRoot = getRepoRoot();\n\n // Sync index to ensure accurate stats\n await syncIfNeeded(repoRoot);\n\n // Read lessons from JSONL to get accurate counts\n const { lessons } = await readLessons(repoRoot);\n const deletedCount = await countTombstones(repoRoot);\n const totalLessons = lessons.length;\n\n // Get retrieval stats from SQLite\n const retrievalStats = getRetrievalStats(repoRoot);\n const totalRetrievals = retrievalStats.reduce((sum, s) => sum + s.count, 0);\n const avgRetrievals = totalLessons > 0 ? (totalRetrievals / totalLessons).toFixed(AVG_DECIMAL_PLACES) : '0.0';\n\n // Get storage sizes\n const jsonlPath = join(repoRoot, LESSONS_PATH);\n const dbPath = join(repoRoot, DB_PATH);\n\n let dataSize = 0;\n let indexSize = 0;\n\n try {\n dataSize = statSync(jsonlPath).size;\n } catch {\n // File doesn't exist\n }\n\n try {\n indexSize = statSync(dbPath).size;\n } catch {\n // File doesn't exist\n }\n\n const totalSize = dataSize + indexSize;\n\n // Format output\n const deletedInfo = deletedCount > 0 ? ` (${deletedCount} deleted)` : '';\n console.log(`Lessons: ${totalLessons} total${deletedInfo}`);\n console.log(`Retrievals: ${totalRetrievals} total, ${avgRetrievals} avg per lesson`);\n console.log(`Storage: ${formatBytes(totalSize)} (index: ${formatBytes(indexSize)}, data: ${formatBytes(dataSize)})`);\n });\n}\n","/**\n * List command - List all lessons\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot, parseLimit } from '../../cli-utils.js';\nimport { readLessons } from '../../storage/index.js';\nimport { DEFAULT_LIST_LIMIT, getGlobalOpts, out } from '../shared.js';\n\n/**\n * Register the list command with the program.\n */\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all lessons')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_LIST_LIMIT)\n .action(async function (this: Command, options: { limit: string }) {\n const repoRoot = getRepoRoot();\n const limit = parseLimit(options.limit, 'limit');\n const { verbose, quiet } = getGlobalOpts(this);\n\n const { lessons, skippedCount } = await readLessons(repoRoot);\n\n if (lessons.length === 0) {\n console.log('No lessons found. Get started with: learn \"Your first lesson\"');\n if (skippedCount > 0) {\n out.warn(`${skippedCount} corrupted lesson(s) skipped.`);\n }\n return;\n }\n\n const toShow = lessons.slice(0, limit);\n\n // Show summary unless quiet mode\n if (!quiet) {\n out.info(`Showing ${toShow.length} of ${lessons.length} lesson(s):\\n`);\n }\n\n for (const lesson of toShow) {\n console.log(`[${chalk.cyan(lesson.id)}] ${lesson.insight}`);\n if (verbose) {\n console.log(` Type: ${lesson.type} | Source: ${lesson.source}`);\n console.log(` Created: ${lesson.created}`);\n if (lesson.context) {\n console.log(` Context: ${lesson.context.tool} - ${lesson.context.intent}`);\n }\n } else {\n console.log(` Type: ${lesson.type} | Source: ${lesson.source}`);\n }\n if (lesson.tags.length > 0) {\n console.log(` Tags: ${lesson.tags.join(', ')}`);\n }\n console.log();\n }\n\n if (skippedCount > 0) {\n out.warn(`${skippedCount} corrupted lesson(s) skipped.`);\n }\n });\n}\n","/**\n * Search command - Search lessons by keyword\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot, parseLimit } from '../../cli-utils.js';\nimport { searchKeyword, syncIfNeeded } from '../../storage/index.js';\nimport { DEFAULT_SEARCH_LIMIT, getGlobalOpts, out } from '../shared.js';\n\n/**\n * Register the search command with the program.\n */\nexport function registerSearchCommand(program: Command): void {\n program\n .command('search <query>')\n .description('Search lessons by keyword')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_SEARCH_LIMIT)\n .action(async function (this: Command, query: string, options: { limit: string }) {\n const repoRoot = getRepoRoot();\n const limit = parseLimit(options.limit, 'limit');\n const { verbose, quiet } = getGlobalOpts(this);\n\n // Sync index if JSONL has changed\n await syncIfNeeded(repoRoot);\n\n const results = await searchKeyword(repoRoot, query, limit);\n\n if (results.length === 0) {\n console.log('No lessons match your search. Try a different query or use \"list\" to see all lessons.');\n return;\n }\n\n if (!quiet) {\n out.info(`Found ${results.length} lesson(s):\\n`);\n }\n for (const lesson of results) {\n console.log(`[${chalk.cyan(lesson.id)}] ${lesson.insight}`);\n console.log(` Trigger: ${lesson.trigger}`);\n if (verbose && lesson.context) {\n console.log(` Context: ${lesson.context.tool} - ${lesson.context.intent}`);\n console.log(` Created: ${lesson.created}`);\n }\n if (lesson.tags.length > 0) {\n console.log(` Tags: ${lesson.tags.join(', ')}`);\n }\n console.log();\n }\n });\n}\n","/**\n * Rebuild command - Rebuild SQLite index from JSONL\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { rebuildIndex, syncIfNeeded } from '../../storage/index.js';\n\n/**\n * Register the rebuild command with the program.\n */\nexport function registerRebuildCommand(program: Command): void {\n program\n .command('rebuild')\n .description('Rebuild SQLite index from JSONL')\n .option('-f, --force', 'Force rebuild even if unchanged')\n .action(async (options: { force?: boolean }) => {\n const repoRoot = getRepoRoot();\n if (options.force) {\n console.log('Forcing index rebuild...');\n await rebuildIndex(repoRoot);\n console.log('Index rebuilt.');\n } else {\n const rebuilt = await syncIfNeeded(repoRoot);\n if (rebuilt) {\n console.log('Index rebuilt (JSONL changed).');\n } else {\n console.log('Index is up to date.');\n }\n }\n });\n}\n","/**\n * Export command - Export lessons as JSON to stdout\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { readLessons } from '../../storage/index.js';\nimport { JSON_INDENT_SPACES } from '../shared.js';\n\n/**\n * Register the export command with the program.\n */\nexport function registerExportCommand(program: Command): void {\n program\n .command('export')\n .description('Export lessons as JSON to stdout')\n .option('--since <date>', 'Only include lessons created after this date (ISO8601)')\n .option('--tags <tags>', 'Filter by tags (comma-separated, OR logic)')\n .action(async (options: { since?: string; tags?: string }) => {\n const repoRoot = getRepoRoot();\n\n const { lessons } = await readLessons(repoRoot);\n\n let filtered = lessons;\n\n // Filter by date if --since provided\n if (options.since) {\n const sinceDate = new Date(options.since);\n if (Number.isNaN(sinceDate.getTime())) {\n console.error(`Invalid date format: ${options.since}. Use ISO8601 format (e.g., 2024-01-15).`);\n process.exit(1);\n }\n filtered = filtered.filter((lesson) => new Date(lesson.created) >= sinceDate);\n }\n\n // Filter by tags if --tags provided (OR logic)\n if (options.tags) {\n const filterTags = options.tags.split(',').map((t) => t.trim());\n filtered = filtered.filter((lesson) => lesson.tags.some((tag) => filterTags.includes(tag)));\n }\n\n // Output JSON to stdout (portable format for sharing)\n console.log(JSON.stringify(filtered, null, JSON_INDENT_SPACES));\n });\n}\n","/**\n * Import command - Import lessons from a JSONL file\n */\n\nimport type { Command } from 'commander';\nimport { readFile } from 'node:fs/promises';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { appendLesson, readLessons, syncIfNeeded } from '../../storage/index.js';\nimport { LessonSchema } from '../../types.js';\nimport type { Lesson } from '../../types.js';\n\n/**\n * Register the import command with the program.\n */\nexport function registerImportCommand(program: Command): void {\n program\n .command('import <file>')\n .description('Import lessons from a JSONL file')\n .action(async (file: string) => {\n const repoRoot = getRepoRoot();\n\n // Read input file\n let content: string;\n try {\n content = await readFile(file, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n console.error(`Error: File not found: ${file}`);\n } else {\n console.error(`Error reading file: ${(err as Error).message}`);\n }\n process.exit(1);\n }\n\n // Get existing lesson IDs\n const { lessons: existingLessons } = await readLessons(repoRoot);\n const existingIds = new Set(existingLessons.map((l) => l.id));\n\n // Parse and validate each line\n const lines = content.split('\\n');\n let imported = 0;\n let skipped = 0;\n let invalid = 0;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // Parse JSON\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n invalid++;\n continue;\n }\n\n // Validate schema\n const result = LessonSchema.safeParse(parsed);\n if (!result.success) {\n invalid++;\n continue;\n }\n\n const lesson: Lesson = result.data;\n\n // Skip if ID already exists\n if (existingIds.has(lesson.id)) {\n skipped++;\n continue;\n }\n\n // Append lesson\n await appendLesson(repoRoot, lesson);\n existingIds.add(lesson.id);\n imported++;\n }\n\n // Sync SQLite index after import\n await syncIfNeeded(repoRoot);\n\n // Format summary\n const lessonWord = imported === 1 ? 'lesson' : 'lessons';\n const parts: string[] = [];\n if (skipped > 0) parts.push(`${skipped} skipped`);\n if (invalid > 0) parts.push(`${invalid} invalid`);\n\n if (parts.length > 0) {\n console.log(`Imported ${imported} ${lessonWord} (${parts.join(', ')})`);\n } else {\n console.log(`Imported ${imported} ${lessonWord}`);\n }\n });\n}\n","/**\n * Compact command - Archive old lessons and remove tombstones\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { compact, countTombstones, needsCompaction, rebuildIndex, TOMBSTONE_THRESHOLD } from '../../storage/index.js';\n\n/**\n * Register the compact command with the program.\n */\nexport function registerCompactCommand(program: Command): void {\n program\n .command('compact')\n .description('Compact lessons: archive old lessons and remove tombstones')\n .option('-f, --force', 'Run compaction even if below threshold')\n .option('--dry-run', 'Show what would be done without making changes')\n .action(async (options: { force?: boolean; dryRun?: boolean }) => {\n const repoRoot = getRepoRoot();\n\n const tombstones = await countTombstones(repoRoot);\n const needs = await needsCompaction(repoRoot);\n\n if (options.dryRun) {\n console.log('Dry run - no changes will be made.\\n');\n console.log(`Tombstones found: ${tombstones}`);\n console.log(`Compaction needed: ${needs ? 'yes' : 'no'}`);\n return;\n }\n\n if (!needs && !options.force) {\n console.log(`Compaction not needed (${tombstones} tombstones, threshold is ${TOMBSTONE_THRESHOLD}).`);\n console.log('Use --force to compact anyway.');\n return;\n }\n\n console.log('Running compaction...');\n const result = await compact(repoRoot);\n\n console.log('\\nCompaction complete:');\n console.log(` Archived: ${result.archived} lesson(s)`);\n console.log(` Tombstones removed: ${result.tombstonesRemoved}`);\n console.log(` Lessons remaining: ${result.lessonsRemaining}`);\n\n // Rebuild SQLite index after compaction\n await rebuildIndex(repoRoot);\n console.log(' Index rebuilt.');\n });\n}\n","/**\n * Embedding model resolution using node-llama-cpp's built-in resolver.\n *\n * Uses resolveModelFile for automatic download and caching.\n * Model is stored in ~/.node-llama-cpp/models/ by default.\n */\n\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { resolveModelFile } from 'node-llama-cpp';\n\n/**\n * HuggingFace URI for EmbeddingGemma-300M (Q4_0 quantization).\n *\n * - Size: ~278MB\n * - Dimensions: 768 (default), supports MRL truncation to 512/256/128\n * - Context: 2048 tokens\n */\nexport const MODEL_URI = 'hf:ggml-org/embeddinggemma-300M-qat-q4_0-GGUF/embeddinggemma-300M-qat-Q4_0.gguf';\n\n/**\n * Expected model filename after download.\n * node-llama-cpp uses format: hf_{org}_{filename}\n */\nexport const MODEL_FILENAME = 'hf_ggml-org_embeddinggemma-300M-qat-Q4_0.gguf';\n\n/** Default model directory used by node-llama-cpp */\nconst DEFAULT_MODEL_DIR = join(homedir(), '.node-llama-cpp', 'models');\n\n/**\n * Check if the embedding model is available locally.\n *\n * @returns true if model file exists\n */\nexport function isModelAvailable(): boolean {\n return existsSync(join(DEFAULT_MODEL_DIR, MODEL_FILENAME));\n}\n\n/**\n * Resolve the embedding model path, downloading if necessary.\n *\n * Uses node-llama-cpp's resolveModelFile for automatic download with progress.\n *\n * @param options - Optional configuration\n * @param options.cli - Show download progress in console (default: true)\n * @returns Path to the resolved model file\n *\n * @example\n * ```typescript\n * const modelPath = await resolveModel();\n * const llama = await getLlama();\n * const model = await llama.loadModel({ modelPath });\n * ```\n */\nexport async function resolveModel(options: { cli?: boolean } = {}): Promise<string> {\n const { cli = true } = options;\n return resolveModelFile(MODEL_URI, { cli });\n}\n","/**\n * Text embedding via node-llama-cpp with EmbeddingGemma model\n *\n * **Resource lifecycle:**\n * - Model is loaded lazily on first embedding call (~150MB in memory)\n * - Once loaded, the model remains in memory until `unloadEmbedding()` is called\n * - Loading is slow (~1-3s); keeping loaded improves subsequent call performance\n *\n * **Memory usage:**\n * - Embedding model: ~150MB RAM when loaded\n * - Embeddings themselves: ~3KB per embedding (768 dimensions x 4 bytes)\n *\n * @see {@link unloadEmbedding} for releasing memory\n * @see {@link getEmbedding} for the lazy-loading mechanism\n */\n\nimport { getLlama, LlamaEmbeddingContext } from 'node-llama-cpp';\n\nimport { isModelAvailable, resolveModel } from './model.js';\n\n/** Singleton embedding context */\nlet embeddingContext: LlamaEmbeddingContext | null = null;\n\n/**\n * Get the LlamaEmbeddingContext instance for generating embeddings.\n *\n * **Lazy loading behavior:**\n * - First call loads the embedding model (~150MB) into memory\n * - Loading takes ~1-3 seconds depending on hardware\n * - Subsequent calls return the cached instance immediately\n * - Downloads model automatically if not present\n *\n * **Resource lifecycle:**\n * - Once loaded, model stays in memory until `unloadEmbedding()` is called\n * - For CLI commands: typically load once, use, then unload on exit\n * - For long-running processes: keep loaded for performance\n *\n * @returns The singleton embedding context\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * // Direct usage (prefer embedText for simple cases)\n * const ctx = await getEmbedding();\n * const result = await ctx.getEmbeddingFor('some text');\n *\n * // Ensure cleanup\n * process.on('exit', () => unloadEmbedding());\n * ```\n *\n * @see {@link embedText} for simpler text-to-vector conversion\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function getEmbedding(): Promise<LlamaEmbeddingContext> {\n if (embeddingContext) return embeddingContext;\n\n // Resolve model path (downloads if needed)\n const modelPath = await resolveModel({ cli: true });\n\n // Load llama and model\n const llama = await getLlama();\n const model = await llama.loadModel({ modelPath });\n embeddingContext = await model.createEmbeddingContext();\n\n return embeddingContext;\n}\n\n/**\n * Unload the embedding context to free memory (~150MB).\n *\n * **Resource lifecycle:**\n * - Disposes the underlying LlamaEmbeddingContext\n * - Releases ~150MB of RAM used by the model\n * - After unloading, subsequent embedding calls will reload the model\n *\n * **When to call:**\n * - At the end of CLI commands to ensure clean process exit\n * - In memory-constrained environments after batch processing\n * - Before process exit in graceful shutdown handlers\n * - When switching to a different model (if supported in future)\n *\n * **Best practices:**\n * - For single-operation scripts: call before exit\n * - For daemon/server processes: call in shutdown handler\n * - Not needed between embedding calls in the same process\n *\n * @example\n * ```typescript\n * // CLI command pattern\n * try {\n * const embedding = await embedText('some text');\n * // ... use embedding\n * } finally {\n * unloadEmbedding();\n * closeDb();\n * }\n *\n * // Graceful shutdown pattern\n * process.on('SIGTERM', () => {\n * unloadEmbedding();\n * closeDb();\n * process.exit(0);\n * });\n * ```\n *\n * @see {@link getEmbedding} for loading the model\n * @see {@link closeDb} for database cleanup (often used together)\n */\nexport function unloadEmbedding(): void {\n if (embeddingContext) {\n embeddingContext.dispose();\n embeddingContext = null;\n }\n}\n\n/**\n * Embed a single text string into a vector.\n *\n * **Lazy loading:** First call loads the embedding model (~150MB, ~1-3s).\n * Subsequent calls use the cached model and complete in milliseconds.\n *\n * @param text - The text to embed\n * @returns A 768-dimensional vector (number[])\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * const vector = await embedText('TypeScript error handling');\n * console.log(vector.length); // 768\n *\n * // Remember to clean up when done\n * unloadEmbedding();\n * ```\n *\n * @see {@link embedTexts} for batch embedding\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function embedText(text: string): Promise<number[]> {\n const ctx = await getEmbedding();\n const result = await ctx.getEmbeddingFor(text);\n return Array.from(result.vector);\n}\n\n/**\n * Embed multiple texts into vectors.\n *\n * **Lazy loading:** First call loads the embedding model (~150MB, ~1-3s).\n * Subsequent calls use the cached model.\n *\n * **Performance:** More efficient than calling `embedText` in a loop\n * when processing multiple texts, as model loading happens only once.\n *\n * @param texts - Array of texts to embed\n * @returns Array of 768-dimensional vectors, same order as input\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * const texts = ['first text', 'second text'];\n * const vectors = await embedTexts(texts);\n * console.log(vectors.length); // 2\n * console.log(vectors[0].length); // 768\n *\n * // Remember to clean up when done\n * unloadEmbedding();\n * ```\n *\n * @see {@link embedText} for single text embedding\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function embedTexts(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n\n const ctx = await getEmbedding();\n const results: number[][] = [];\n\n for (const text of texts) {\n const result = await ctx.getEmbeddingFor(text);\n results.push(Array.from(result.vector));\n }\n\n return results;\n}\n\n// Re-export isModelAvailable for test utilities\nexport { isModelAvailable };\n","/**\n * Vector search with cosine similarity\n *\n * Embeds query text and ranks lessons by semantic similarity.\n * Uses SQLite cache to avoid recomputing embeddings.\n */\n\nimport { embedText } from '../embeddings/nomic.js';\nimport { contentHash, getCachedEmbedding, setCachedEmbedding } from '../storage/sqlite.js';\nimport { readLessons } from '../storage/jsonl.js';\nimport type { Lesson } from '../types.js';\n\n/**\n * Calculate cosine similarity between two vectors.\n * Returns value between -1 (opposite) and 1 (identical).\n */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Vectors must have same length');\n }\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i]! * b[i]!;\n normA += a[i]! * a[i]!;\n normB += b[i]! * b[i]!;\n }\n\n const magnitude = Math.sqrt(normA) * Math.sqrt(normB);\n if (magnitude === 0) return 0;\n\n return dotProduct / magnitude;\n}\n\n/** Lesson with similarity score */\nexport interface ScoredLesson {\n lesson: Lesson;\n score: number;\n}\n\n/** Options for vector search */\nexport interface SearchVectorOptions {\n /** Maximum number of results to return (default: 10) */\n limit?: number;\n}\n\n/** Default number of results to return */\nconst DEFAULT_LIMIT = 10;\n\n/**\n * Search lessons by vector similarity to query text.\n * Returns top N lessons sorted by similarity score (descending).\n * Uses embedding cache to avoid recomputing embeddings.\n */\nexport async function searchVector(\n repoRoot: string,\n query: string,\n options?: SearchVectorOptions\n): Promise<ScoredLesson[]> {\n const limit = options?.limit ?? DEFAULT_LIMIT;\n // Read all lessons\n const { lessons } = await readLessons(repoRoot);\n if (lessons.length === 0) return [];\n\n // Embed the query\n const queryVector = await embedText(query);\n\n // Score each lesson\n const scored: ScoredLesson[] = [];\n for (const lesson of lessons) {\n const lessonText = `${lesson.trigger} ${lesson.insight}`;\n const hash = contentHash(lesson.trigger, lesson.insight);\n\n // Try cache first\n let lessonVector = getCachedEmbedding(repoRoot, lesson.id, hash);\n\n if (!lessonVector) {\n // Cache miss - compute and store\n lessonVector = await embedText(lessonText);\n setCachedEmbedding(repoRoot, lesson.id, lessonVector, hash);\n }\n\n const score = cosineSimilarity(queryVector, lessonVector);\n scored.push({ lesson, score });\n }\n\n // Sort by score descending and take top N\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, limit);\n}\n","/**\n * Multi-factor lesson ranking system\n *\n * Combines vector similarity with semantic boosts:\n * - Severity: high=1.5, medium=1.0, low=0.8\n * - Recency: 1.2 for lessons ≤30 days old\n * - Confirmation: 1.3 for confirmed lessons\n */\n\nimport type { Lesson } from '../types.js';\n\nimport type { ScoredLesson } from './vector.js';\n\n/** Lesson with final ranked score */\nexport interface RankedLesson extends ScoredLesson {\n finalScore?: number;\n}\n\nconst RECENCY_THRESHOLD_DAYS = 30;\nconst HIGH_SEVERITY_BOOST = 1.5;\nconst MEDIUM_SEVERITY_BOOST = 1.0;\nconst LOW_SEVERITY_BOOST = 0.8;\nconst RECENCY_BOOST = 1.2;\nconst CONFIRMATION_BOOST = 1.3;\n\n/**\n * Calculate severity boost based on lesson severity.\n * Lessons without severity get 1.0 (medium boost).\n */\nexport function severityBoost(lesson: Lesson): number {\n switch (lesson.severity) {\n case 'high':\n return HIGH_SEVERITY_BOOST;\n case 'medium':\n return MEDIUM_SEVERITY_BOOST;\n case 'low':\n return LOW_SEVERITY_BOOST;\n default:\n return MEDIUM_SEVERITY_BOOST;\n }\n}\n\n/**\n * Calculate recency boost based on lesson age.\n * Lessons ≤30 days old get 1.2, older get 1.0.\n */\nexport function recencyBoost(lesson: Lesson): number {\n const created = new Date(lesson.created);\n const now = new Date();\n const ageMs = now.getTime() - created.getTime();\n const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24));\n\n return ageDays <= RECENCY_THRESHOLD_DAYS ? RECENCY_BOOST : 1.0;\n}\n\n/**\n * Calculate confirmation boost.\n * Confirmed lessons get 1.3, unconfirmed get 1.0.\n */\nexport function confirmationBoost(lesson: Lesson): number {\n return lesson.confirmed ? CONFIRMATION_BOOST : 1.0;\n}\n\n/**\n * Calculate combined score for a lesson.\n * score = vectorSimilarity * severity * recency * confirmation\n */\nexport function calculateScore(lesson: Lesson, vectorSimilarity: number): number {\n return (\n vectorSimilarity * severityBoost(lesson) * recencyBoost(lesson) * confirmationBoost(lesson)\n );\n}\n\n/**\n * Rank lessons by combined score.\n * Returns new array sorted by finalScore descending.\n */\nexport function rankLessons(lessons: ScoredLesson[]): RankedLesson[] {\n return lessons\n .map((scored) => ({\n ...scored,\n finalScore: calculateScore(scored.lesson, scored.score),\n }))\n .sort((a, b) => (b.finalScore ?? 0) - (a.finalScore ?? 0));\n}\n","/**\n * Quality filters for lesson capture\n *\n * Filters to ensure lessons are:\n * - Novel (not duplicate)\n * - Specific (not vague)\n * - Actionable (contains action words)\n */\n\nimport { searchKeyword, syncIfNeeded } from '../storage/sqlite.js';\n\n/** Default similarity threshold for duplicate detection */\nconst DEFAULT_SIMILARITY_THRESHOLD = 0.8;\n\n/** Result of novelty check */\nexport interface NoveltyResult {\n novel: boolean;\n reason?: string;\n existingId?: string;\n}\n\n/** Options for novelty check */\nexport interface NoveltyOptions {\n threshold?: number;\n}\n\n/**\n * Check if an insight is novel (not a duplicate of existing lessons).\n * Uses keyword search to find potentially similar lessons.\n */\nexport async function isNovel(\n repoRoot: string,\n insight: string,\n options: NoveltyOptions = {}\n): Promise<NoveltyResult> {\n const threshold = options.threshold ?? DEFAULT_SIMILARITY_THRESHOLD;\n\n // Sync index if JSONL has changed\n await syncIfNeeded(repoRoot);\n\n // Extract key words for search (take first 3 significant words)\n const words = insight\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .split(/\\s+/)\n .filter((w) => w.length > 3)\n .slice(0, 3);\n\n if (words.length === 0) {\n return { novel: true };\n }\n\n // Search for each word and collect results\n const searchQuery = words.join(' OR ');\n const results = await searchKeyword(repoRoot, searchQuery, 10);\n\n if (results.length === 0) {\n return { novel: true };\n }\n\n // Check similarity using simple word overlap (since we may not have embeddings)\n const insightWords = new Set(insight.toLowerCase().split(/\\s+/));\n\n for (const lesson of results) {\n const lessonWords = new Set(lesson.insight.toLowerCase().split(/\\s+/));\n\n // Calculate Jaccard similarity\n const intersection = [...insightWords].filter((w) => lessonWords.has(w)).length;\n const union = new Set([...insightWords, ...lessonWords]).size;\n const similarity = union > 0 ? intersection / union : 0;\n\n if (similarity >= threshold) {\n return {\n novel: false,\n reason: `Found similar existing lesson: \"${lesson.insight.slice(0, 50)}...\"`,\n existingId: lesson.id,\n };\n }\n\n // Also check exact match\n if (lesson.insight.toLowerCase() === insight.toLowerCase()) {\n return {\n novel: false,\n reason: `Exact duplicate found`,\n existingId: lesson.id,\n };\n }\n }\n\n return { novel: true };\n}\n\n/** Minimum word count for a specific insight */\nconst MIN_WORD_COUNT = 4;\n\n/** Vague patterns that indicate non-specific advice */\nconst VAGUE_PATTERNS = [\n /\\bwrite better\\b/i,\n /\\bbe careful\\b/i,\n /\\bremember to\\b/i,\n /\\bmake sure\\b/i,\n /\\btry to\\b/i,\n /\\bdouble check\\b/i,\n];\n\n/** Generic \"always/never\" phrases (short, lacking specificity) */\nconst GENERIC_IMPERATIVE_PATTERN = /^(always|never)\\s+\\w+(\\s+\\w+){0,2}$/i;\n\n/** Result of specificity check */\nexport interface SpecificityResult {\n specific: boolean;\n reason?: string;\n}\n\n/**\n * Check if an insight is specific enough to be useful.\n * Rejects vague, generic advice that doesn't provide actionable guidance.\n */\nexport function isSpecific(insight: string): SpecificityResult {\n // Check minimum length first\n const words = insight.trim().split(/\\s+/).filter((w) => w.length > 0);\n if (words.length < MIN_WORD_COUNT) {\n return { specific: false, reason: 'Insight is too short to be actionable' };\n }\n\n // Check for vague patterns\n for (const pattern of VAGUE_PATTERNS) {\n if (pattern.test(insight)) {\n return { specific: false, reason: 'Insight matches a vague pattern' };\n }\n }\n\n // Check for generic \"Always X\" or \"Never X\" phrases\n if (GENERIC_IMPERATIVE_PATTERN.test(insight)) {\n return { specific: false, reason: 'Insight matches a vague pattern' };\n }\n\n return { specific: true };\n}\n\n/** Action word patterns that indicate actionable guidance */\nconst ACTION_PATTERNS = [\n /\\buse\\s+.+\\s+instead\\s+of\\b/i, // \"use X instead of Y\"\n /\\bprefer\\s+.+\\s+(over|to)\\b/i, // \"prefer X over Y\" or \"prefer X to Y\"\n /\\balways\\s+.+\\s+when\\b/i, // \"always X when Y\"\n /\\bnever\\s+.+\\s+without\\b/i, // \"never X without Y\"\n /\\bavoid\\s+(using\\s+)?\\w+/i, // \"avoid X\" or \"avoid using X\"\n /\\bcheck\\s+.+\\s+before\\b/i, // \"check X before Y\"\n /^(run|use|add|remove|install|update|configure|set|enable|disable)\\s+/i, // Imperative commands at start\n];\n\n/** Result of actionability check */\nexport interface ActionabilityResult {\n actionable: boolean;\n reason?: string;\n}\n\n/**\n * Check if an insight contains actionable guidance.\n * Returns false for pure observations or questions.\n */\nexport function isActionable(insight: string): ActionabilityResult {\n // Check for action patterns\n for (const pattern of ACTION_PATTERNS) {\n if (pattern.test(insight)) {\n return { actionable: true };\n }\n }\n\n return { actionable: false, reason: 'Insight lacks clear action guidance' };\n}\n\n/** Result of combined quality check */\nexport interface ProposeResult {\n shouldPropose: boolean;\n reason?: string;\n}\n\n/**\n * Combined quality check for lesson proposals.\n * Returns true only if insight is novel, specific, AND actionable.\n */\nexport async function shouldPropose(\n repoRoot: string,\n insight: string\n): Promise<ProposeResult> {\n // Check specificity first (fast, no DB)\n const specificResult = isSpecific(insight);\n if (!specificResult.specific) {\n return { shouldPropose: false, reason: specificResult.reason };\n }\n\n // Check actionability (fast, no DB)\n const actionableResult = isActionable(insight);\n if (!actionableResult.actionable) {\n return { shouldPropose: false, reason: actionableResult.reason };\n }\n\n // Check novelty (requires DB lookup)\n const noveltyResult = await isNovel(repoRoot, insight);\n if (!noveltyResult.novel) {\n return { shouldPropose: false, reason: noveltyResult.reason };\n }\n\n return { shouldPropose: true };\n}\n","/**\n * Trigger detection for automatic lesson capture\n *\n * Detects patterns that indicate potential learning opportunities:\n * - User corrections\n * - Self-corrections\n * - Test failures\n */\n\nimport type { Context } from '../types.js';\n\n/** Signal data for correction detection */\nexport interface CorrectionSignal {\n messages: string[];\n context: Context;\n}\n\n/** Detected correction result */\nexport interface DetectedCorrection {\n trigger: string;\n correctionMessage: string;\n context: Context;\n}\n\n/** User correction patterns */\nconst USER_CORRECTION_PATTERNS = [\n /\\bno\\b[,.]?\\s/i, // \"no, ...\" or \"no ...\"\n /\\bwrong\\b/i, // \"wrong\"\n /\\bactually\\b/i, // \"actually...\"\n /\\bnot that\\b/i, // \"not that\"\n /\\bi meant\\b/i, // \"I meant\"\n];\n\n/**\n * Detect user correction signals in conversation.\n *\n * Looks for patterns that indicate the user is correcting Claude's\n * understanding or actions.\n *\n * @param signals - Messages and context to analyze\n * @returns Detected correction or null if none found\n */\nexport function detectUserCorrection(signals: CorrectionSignal): DetectedCorrection | null {\n const { messages, context } = signals;\n\n if (messages.length < 2) {\n return null;\n }\n\n // Check later messages for correction patterns\n for (let i = 1; i < messages.length; i++) {\n const message = messages[i];\n if (!message) continue;\n\n for (const pattern of USER_CORRECTION_PATTERNS) {\n if (pattern.test(message)) {\n return {\n trigger: `User correction during ${context.intent}`,\n correctionMessage: message,\n context,\n };\n }\n }\n }\n\n return null;\n}\n\n/** Edit history entry */\nexport interface EditEntry {\n file: string;\n success: boolean;\n timestamp: number;\n}\n\n/** Edit history for self-correction detection */\nexport interface EditHistory {\n edits: EditEntry[];\n}\n\n/** Detected self-correction */\nexport interface DetectedSelfCorrection {\n file: string;\n trigger: string;\n}\n\n/**\n * Detect self-correction patterns in edit history.\n *\n * Looks for edit→fail→re-edit patterns on the same file,\n * which indicate Claude had to correct its own work.\n *\n * @param history - Edit history to analyze\n * @returns Detected self-correction or null if none found\n */\nexport function detectSelfCorrection(history: EditHistory): DetectedSelfCorrection | null {\n const { edits } = history;\n\n if (edits.length < 3) {\n return null;\n }\n\n // Look for edit→fail→re-edit pattern on same file\n for (let i = 0; i <= edits.length - 3; i++) {\n const first = edits[i];\n const second = edits[i + 1];\n const third = edits[i + 2];\n\n if (!first || !second || !third) continue;\n\n // Pattern: success → fail → success on same file\n if (\n first.file === second.file &&\n second.file === third.file &&\n first.success &&\n !second.success &&\n third.success\n ) {\n return {\n file: first.file,\n trigger: `Self-correction on ${first.file}`,\n };\n }\n }\n\n return null;\n}\n\n/** Test result for failure detection */\nexport interface TestResult {\n passed: boolean;\n output: string;\n testFile: string;\n}\n\n/** Detected test failure */\nexport interface DetectedTestFailure {\n testFile: string;\n errorOutput: string;\n trigger: string;\n}\n\n/**\n * Detect test failure patterns.\n *\n * When tests fail, this creates a potential learning opportunity\n * if the failure is later fixed.\n *\n * @param testResult - Test result to analyze\n * @returns Detected test failure or null if tests passed\n */\nexport function detectTestFailure(testResult: TestResult): DetectedTestFailure | null {\n if (testResult.passed) {\n return null;\n }\n\n // Extract first meaningful error line for trigger\n const lines = testResult.output.split('\\n').filter((line) => line.trim().length > 0);\n const errorLine = lines.find((line) => /error|fail|assert/i.test(line)) ?? lines[0] ?? '';\n\n return {\n testFile: testResult.testFile,\n errorOutput: testResult.output,\n trigger: `Test failure in ${testResult.testFile}: ${errorLine.slice(0, 100)}`,\n };\n}\n","/**\n * Session-start lesson retrieval\n *\n * Loads high-severity lessons at the start of a session.\n * No vector search - just filter by severity and recency.\n */\n\nimport { readLessons } from '../storage/jsonl.js';\nimport type { Lesson, Severity } from '../types.js';\n\n/** Default number of lessons to load at session start */\nconst DEFAULT_LIMIT = 5;\n\n/** A full lesson with severity field present */\ntype FullLesson = Lesson & { type: 'full'; severity: Severity };\n\n/**\n * Type guard to check if a lesson is a full lesson with severity\n */\nfunction isFullLesson(lesson: Lesson): lesson is FullLesson {\n return lesson.type === 'full' && lesson.severity !== undefined;\n}\n\n/**\n * Load high-severity lessons for session start.\n *\n * Returns confirmed, high-severity lessons sorted by recency.\n * These are the most important lessons to surface at the start\n * of a coding session.\n *\n * @param repoRoot - Repository root directory\n * @param limit - Maximum number of lessons to return (default: 5)\n * @returns Array of high-severity lessons, most recent first\n */\nexport async function loadSessionLessons(\n repoRoot: string,\n limit: number = DEFAULT_LIMIT\n): Promise<FullLesson[]> {\n const { lessons: allLessons } = await readLessons(repoRoot);\n\n // Filter for high-severity, confirmed, full lessons\n const highSeverityLessons = allLessons.filter(\n (lesson): lesson is FullLesson =>\n isFullLesson(lesson) && lesson.severity === 'high' && lesson.confirmed\n );\n\n // Sort by recency (most recent first)\n highSeverityLessons.sort((a, b) => {\n const dateA = new Date(a.created).getTime();\n const dateB = new Date(b.created).getTime();\n return dateB - dateA;\n });\n\n // Return top N\n return highSeverityLessons.slice(0, limit);\n}\n","/**\n * Plan-time lesson retrieval\n *\n * Retrieves relevant lessons when planning an implementation.\n * Uses vector search to find semantically similar lessons.\n */\n\nimport { searchVector, type ScoredLesson } from '../search/vector.js';\nimport { rankLessons, type RankedLesson } from '../search/ranking.js';\n\n/** Default number of lessons to retrieve */\nconst DEFAULT_LIMIT = 5;\n\n/** Result of plan-time retrieval */\nexport interface PlanRetrievalResult {\n lessons: RankedLesson[];\n message: string;\n}\n\n/**\n * Retrieve relevant lessons for a plan.\n *\n * Uses vector search to find semantically similar lessons,\n * then applies ranking boosts for severity, recency, and confirmation.\n *\n * Hard-fails if embeddings are unavailable (propagates error from embedText).\n *\n * @param repoRoot - Repository root directory\n * @param planText - The plan text to search against\n * @param limit - Maximum number of lessons to return (default: 5)\n * @returns Ranked lessons and formatted message\n */\nexport async function retrieveForPlan(\n repoRoot: string,\n planText: string,\n limit: number = DEFAULT_LIMIT\n): Promise<PlanRetrievalResult> {\n // Get lessons by vector similarity (will throw if embeddings unavailable)\n const scored = await searchVector(repoRoot, planText, { limit: limit * 2 });\n\n // Apply ranking boosts\n const ranked = rankLessons(scored);\n\n // Take top N after ranking\n const topLessons = ranked.slice(0, limit);\n\n // Format the Lessons Check message\n const message = formatLessonsCheck(topLessons);\n\n return { lessons: topLessons, message };\n}\n\n/**\n * Format a \"Lessons Check\" message for display.\n *\n * This message is intended to be shown at plan-time to remind\n * the developer of relevant lessons before implementation.\n *\n * @param lessons - Ranked lessons to include in the message\n * @returns Formatted message string\n */\nexport function formatLessonsCheck(lessons: ScoredLesson[]): string {\n const header = '📚 Lessons Check\\n' + '─'.repeat(40);\n\n if (lessons.length === 0) {\n return `${header}\\nNo relevant lessons found for this plan.`;\n }\n\n const lessonLines = lessons.map((l, i) => {\n const bullet = `${i + 1}.`;\n const insight = l.lesson.insight;\n return `${bullet} ${insight}`;\n });\n\n return `${header}\\n${lessonLines.join('\\n')}`;\n}\n","/**\n * Learning Agent - Repository-scoped learning system for Claude Code\n *\n * This package helps Claude Code learn from mistakes and avoid repeating them.\n * It captures lessons during coding sessions and retrieves relevant lessons\n * when planning new work.\n *\n * ## Quick Start\n *\n * ```typescript\n * import { appendLesson, retrieveForPlan, loadSessionLessons } from 'learning-agent';\n *\n * // At session start, load high-severity lessons\n * const criticalLessons = await loadSessionLessons(repoRoot);\n *\n * // When planning, retrieve relevant lessons\n * const { lessons, message } = await retrieveForPlan(repoRoot, planText);\n *\n * // When capturing a lesson\n * await appendLesson(repoRoot, lesson);\n * ```\n *\n * ## Hook Integration\n *\n * Add to your `.claude/settings.json`:\n *\n * ```json\n * {\n * \"hooks\": {\n * \"session_start\": \"npx learning-agent load-session\",\n * \"pre_tool\": \"npx learning-agent check-plan\"\n * }\n * }\n * ```\n *\n * ## Resource Management\n *\n * This library manages two heavyweight resources that require cleanup:\n *\n * ### SQLite Database\n * - **Acquired:** Lazily on first database operation (search, rebuild, etc.)\n * - **Memory:** Minimal (~few KB for connection, index cached by OS)\n * - **Cleanup:** Call `closeDb()` before process exit\n *\n * ### Embedding Model\n * - **Acquired:** Lazily on first embedding call (embedText, embedTexts, searchVector)\n * - **Memory:** ~150MB RAM for the EmbeddingGemma model\n * - **Cleanup:** Call `unloadEmbedding()` before process exit\n *\n * ### Recommended Cleanup Pattern\n *\n * ```typescript\n * import { closeDb, unloadEmbedding } from 'learning-agent';\n *\n * // For CLI commands - use try/finally\n * async function main() {\n * try {\n * // ... your code that uses learning-agent\n * } finally {\n * unloadEmbedding();\n * closeDb();\n * }\n * }\n *\n * // For long-running processes - use shutdown handlers\n * process.on('SIGTERM', () => {\n * unloadEmbedding();\n * closeDb();\n * process.exit(0);\n * });\n * process.on('SIGINT', () => {\n * unloadEmbedding();\n * closeDb();\n * process.exit(0);\n * });\n * ```\n *\n * **Note:** Failing to clean up will not corrupt data, but may cause:\n * - Memory leaks in long-running processes\n * - Unclean process exits (warnings in some environments)\n *\n * @see {@link closeDb} for database cleanup\n * @see {@link unloadEmbedding} for embedding model cleanup\n * @module learning-agent\n */\n\nexport const VERSION = '0.1.0';\n\n// Storage API\nexport { appendLesson, readLessons, LESSONS_PATH } from './storage/jsonl.js';\nexport type { ReadLessonsOptions, ReadLessonsResult, ParseError } from './storage/jsonl.js';\nexport { rebuildIndex, searchKeyword, closeDb, DB_PATH } from './storage/sqlite.js';\n\n// Embeddings API\nexport { embedText, embedTexts, getEmbedding, isModelAvailable, unloadEmbedding } from './embeddings/nomic.js';\nexport { MODEL_FILENAME, MODEL_URI, resolveModel } from './embeddings/model.js';\n\n// Search API\nexport { searchVector, cosineSimilarity } from './search/vector.js';\nexport type { ScoredLesson, SearchVectorOptions } from './search/vector.js';\nexport { rankLessons, calculateScore, severityBoost, recencyBoost, confirmationBoost } from './search/ranking.js';\nexport type { RankedLesson } from './search/ranking.js';\n\n// Capture API - Quality filters\nexport { shouldPropose, isNovel, isSpecific, isActionable } from './capture/quality.js';\nexport type { NoveltyResult, NoveltyOptions, SpecificityResult, ActionabilityResult, ProposeResult } from './capture/quality.js';\n\n// Capture API - Triggers\nexport { detectUserCorrection, detectSelfCorrection, detectTestFailure } from './capture/triggers.js';\nexport type {\n CorrectionSignal,\n DetectedCorrection,\n EditHistory,\n EditEntry,\n DetectedSelfCorrection,\n TestResult,\n DetectedTestFailure,\n} from './capture/triggers.js';\n\n// Retrieval API\nexport { loadSessionLessons } from './retrieval/session.js';\nexport { retrieveForPlan, formatLessonsCheck } from './retrieval/plan.js';\nexport type { PlanRetrievalResult } from './retrieval/plan.js';\n\n// Types and schemas\nexport {\n generateId,\n LessonSchema,\n LessonTypeSchema,\n TombstoneSchema,\n} from './types.js';\nexport type {\n Lesson,\n LessonType,\n Tombstone,\n Source,\n Severity,\n Context,\n} from './types.js';\n","/**\n * Download-model command - Download the embedding model for semantic search\n */\n\nimport type { Command } from 'commander';\nimport { statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { formatBytes } from '../../cli-utils.js';\nimport { isModelAvailable, MODEL_FILENAME, resolveModel } from '../../index.js';\n\n/**\n * Register the download-model command with the program.\n */\nexport function registerDownloadModelCommand(program: Command): void {\n program\n .command('download-model')\n .description('Download the embedding model for semantic search')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n const alreadyExisted = isModelAvailable();\n\n if (alreadyExisted) {\n // Model already exists - get path and size\n const modelPath = join(homedir(), '.node-llama-cpp', 'models', MODEL_FILENAME);\n const size = statSync(modelPath).size;\n\n if (options.json) {\n console.log(JSON.stringify({ success: true, path: modelPath, size, alreadyExisted: true }));\n } else {\n console.log('Model already exists.');\n console.log(`Path: ${modelPath}`);\n console.log(`Size: ${formatBytes(size)}`);\n }\n return;\n }\n\n // Download the model\n if (!options.json) {\n console.log('Downloading embedding model...');\n }\n\n const modelPath = await resolveModel({ cli: !options.json });\n const size = statSync(modelPath).size;\n\n if (options.json) {\n console.log(JSON.stringify({ success: true, path: modelPath, size, alreadyExisted: false }));\n } else {\n console.log(`\\nModel downloaded successfully!`);\n console.log(`Path: ${modelPath}`);\n console.log(`Size: ${formatBytes(size)}`);\n }\n });\n}\n","/**\n * Show command - Show details of a specific lesson\n */\n\nimport type { Command } from 'commander';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { LESSONS_PATH, readLessons } from '../../storage/index.js';\nimport type { Lesson } from '../../types.js';\nimport { JSON_INDENT_SPACES, out } from '../shared.js';\n\n/** JSON indent for show command */\nconst SHOW_JSON_INDENT = JSON_INDENT_SPACES;\n\n/**\n * Format a lesson for human-readable output.\n */\nfunction formatLessonHuman(lesson: Lesson): string {\n const lines: string[] = [];\n lines.push(`ID: ${lesson.id}`);\n lines.push(`Type: ${lesson.type}`);\n lines.push(`Trigger: ${lesson.trigger}`);\n lines.push(`Insight: ${lesson.insight}`);\n if (lesson.evidence) {\n lines.push(`Evidence: ${lesson.evidence}`);\n }\n if (lesson.severity) {\n lines.push(`Severity: ${lesson.severity}`);\n }\n lines.push(`Tags: ${lesson.tags.length > 0 ? lesson.tags.join(', ') : '(none)'}`);\n lines.push(`Source: ${lesson.source}`);\n if (lesson.context) {\n lines.push(`Context: ${lesson.context.tool} - ${lesson.context.intent}`);\n }\n lines.push(`Created: ${lesson.created}`);\n lines.push(`Confirmed: ${lesson.confirmed}`);\n if (lesson.supersedes.length > 0) {\n lines.push(`Supersedes: ${lesson.supersedes.join(', ')}`);\n }\n if (lesson.related.length > 0) {\n lines.push(`Related: ${lesson.related.join(', ')}`);\n }\n return lines.join('\\n');\n}\n\n/**\n * Register the show command with the program.\n */\nexport function registerShowCommand(program: Command): void {\n program\n .command('show <id>')\n .description('Show details of a specific lesson')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options: { json?: boolean }) => {\n const repoRoot = getRepoRoot();\n\n const { lessons } = await readLessons(repoRoot);\n const lesson = lessons.find((l) => l.id === id);\n\n if (!lesson) {\n // Check if lesson was deleted (tombstone)\n const filePath = join(repoRoot, LESSONS_PATH);\n let wasDeleted = false;\n try {\n const content = await readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const record = JSON.parse(trimmed) as { id: string; deleted?: boolean };\n if (record.id === id && record.deleted === true) {\n wasDeleted = true;\n break;\n }\n } catch {\n // Skip invalid lines\n }\n }\n } catch {\n // File doesn't exist\n }\n\n if (options.json) {\n console.log(JSON.stringify({ error: wasDeleted ? `Lesson ${id} not found (deleted)` : `Lesson ${id} not found` }));\n } else {\n out.error(wasDeleted ? `Lesson ${id} not found (deleted)` : `Lesson ${id} not found`);\n }\n process.exit(1);\n }\n\n if (options.json) {\n console.log(JSON.stringify(lesson, null, SHOW_JSON_INDENT));\n } else {\n console.log(formatLessonHuman(lesson));\n }\n });\n}\n","/**\n * Update command - Update a lesson's mutable fields\n */\n\nimport type { Command } from 'commander';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { appendLesson, LESSONS_PATH, readLessons, syncIfNeeded } from '../../storage/index.js';\nimport { LessonSchema, SeveritySchema } from '../../types.js';\nimport type { Lesson, Severity } from '../../types.js';\nimport { JSON_INDENT_SPACES, out } from '../shared.js';\n\n/** JSON indent for update command output */\nconst SHOW_JSON_INDENT = JSON_INDENT_SPACES;\n\n/**\n * Register the update command with the program.\n */\nexport function registerUpdateCommand(program: Command): void {\n program\n .command('update <id>')\n .description('Update a lesson')\n .option('--insight <text>', 'Update insight')\n .option('--trigger <text>', 'Update trigger')\n .option('--evidence <text>', 'Update evidence')\n .option('--severity <level>', 'Update severity (low/medium/high)')\n .option('--tags <tags>', 'Update tags (comma-separated)')\n .option('--confirmed <bool>', 'Update confirmed status (true/false)')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options: {\n insight?: string;\n trigger?: string;\n evidence?: string;\n severity?: string;\n tags?: string;\n confirmed?: string;\n json?: boolean;\n }) => {\n const repoRoot = getRepoRoot();\n\n // Check if any update options provided\n const hasUpdates = options.insight !== undefined\n || options.trigger !== undefined\n || options.evidence !== undefined\n || options.severity !== undefined\n || options.tags !== undefined\n || options.confirmed !== undefined;\n\n if (!hasUpdates) {\n if (options.json) {\n console.log(JSON.stringify({ error: 'No fields to update (specify at least one: --insight, --tags, --severity, ...)' }));\n } else {\n out.error('No fields to update (specify at least one: --insight, --tags, --severity, ...)');\n }\n process.exit(1);\n }\n\n // Read current lessons\n const { lessons } = await readLessons(repoRoot);\n const lesson = lessons.find((l) => l.id === id);\n\n if (!lesson) {\n // Check if deleted\n const filePath = join(repoRoot, LESSONS_PATH);\n let wasDeleted = false;\n try {\n const content = await readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const record = JSON.parse(trimmed) as { id: string; deleted?: boolean };\n if (record.id === id && record.deleted === true) {\n wasDeleted = true;\n break;\n }\n } catch {\n // Skip invalid lines\n }\n }\n } catch {\n // File doesn't exist\n }\n\n if (options.json) {\n console.log(JSON.stringify({ error: wasDeleted ? `Lesson ${id} is deleted` : `Lesson ${id} not found` }));\n } else {\n out.error(wasDeleted ? `Lesson ${id} is deleted` : `Lesson ${id} not found`);\n }\n process.exit(1);\n }\n\n // Validate severity if provided\n if (options.severity !== undefined) {\n const result = SeveritySchema.safeParse(options.severity);\n if (!result.success) {\n if (options.json) {\n console.log(JSON.stringify({ error: `Invalid severity '${options.severity}' (must be: high, medium, low)` }));\n } else {\n out.error(`Invalid severity '${options.severity}' (must be: high, medium, low)`);\n }\n process.exit(1);\n }\n }\n\n // Build updated lesson\n const updatedLesson: Lesson = {\n ...lesson,\n ...(options.insight !== undefined && { insight: options.insight }),\n ...(options.trigger !== undefined && { trigger: options.trigger }),\n ...(options.evidence !== undefined && { evidence: options.evidence }),\n ...(options.severity !== undefined && { severity: options.severity as Severity }),\n ...(options.tags !== undefined && {\n tags: [...new Set(\n options.tags\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n )],\n }),\n ...(options.confirmed !== undefined && { confirmed: options.confirmed === 'true' }),\n };\n\n // Validate updated lesson against schema\n const validationResult = LessonSchema.safeParse(updatedLesson);\n if (!validationResult.success) {\n if (options.json) {\n console.log(JSON.stringify({ error: `Schema validation failed: ${validationResult.error.message}` }));\n } else {\n out.error(`Schema validation failed: ${validationResult.error.message}`);\n }\n process.exit(1);\n }\n\n // Append updated lesson (last-write-wins)\n await appendLesson(repoRoot, updatedLesson);\n await syncIfNeeded(repoRoot);\n\n if (options.json) {\n console.log(JSON.stringify(updatedLesson, null, SHOW_JSON_INDENT));\n } else {\n out.success(`Updated lesson ${id}`);\n }\n });\n}\n","/**\n * Delete command - Soft delete lessons by creating tombstone records\n */\n\nimport type { Command } from 'commander';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { appendLesson, LESSONS_PATH, readLessons, syncIfNeeded } from '../../storage/index.js';\nimport type { Lesson } from '../../types.js';\nimport { out } from '../shared.js';\n\n/**\n * Check if a lesson ID has been deleted (has a tombstone).\n */\nasync function wasLessonDeleted(repoRoot: string, id: string): Promise<boolean> {\n const filePath = join(repoRoot, LESSONS_PATH);\n try {\n const content = await readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const record = JSON.parse(trimmed) as { id: string; deleted?: boolean };\n if (record.id === id && record.deleted === true) {\n return true;\n }\n } catch {\n // Skip invalid lines\n }\n }\n } catch {\n // File doesn't exist\n }\n return false;\n}\n\n/**\n * Register the delete command with the program.\n */\nexport function registerDeleteCommand(program: Command): void {\n program\n .command('delete <ids...>')\n .description('Soft delete lessons (creates tombstone)')\n .option('--json', 'Output as JSON')\n .action(async (ids: string[], options: { json?: boolean }) => {\n const repoRoot = getRepoRoot();\n\n const { lessons } = await readLessons(repoRoot);\n const lessonMap = new Map(lessons.map((l) => [l.id, l]));\n\n const deleted: string[] = [];\n const warnings: Array<{ id: string; message: string }> = [];\n\n for (const id of ids) {\n const lesson = lessonMap.get(id);\n\n if (!lesson) {\n // Check if already deleted or never existed\n const wasDeleted = await wasLessonDeleted(repoRoot, id);\n warnings.push({ id, message: wasDeleted ? 'already deleted' : 'not found' });\n continue;\n }\n\n // Create tombstone as full lesson copy with deleted: true and deletedAt\n // This ensures it passes schema validation in readLessons\n const tombstone: Lesson & { deleted: true; deletedAt: string } = {\n ...lesson,\n deleted: true,\n deletedAt: new Date().toISOString(),\n };\n\n // Append tombstone using appendLesson (casts to handle the deleted field)\n await appendLesson(repoRoot, tombstone as unknown as Lesson);\n\n deleted.push(id);\n }\n\n // Sync once at end\n if (deleted.length > 0) {\n await syncIfNeeded(repoRoot);\n }\n\n if (options.json) {\n console.log(JSON.stringify({ deleted, warnings }));\n } else {\n if (deleted.length > 0) {\n out.success(`Deleted ${deleted.length} lesson(s): ${deleted.join(', ')}`);\n }\n for (const warning of warnings) {\n out.warn(`${warning.id}: ${warning.message}`);\n }\n if (deleted.length === 0 && warnings.length > 0) {\n process.exit(1);\n }\n }\n });\n}\n","/**\n * Learn command - Capture a new lesson manually\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { appendLesson } from '../../storage/index.js';\nimport { generateId, SeveritySchema } from '../../types.js';\nimport type { Lesson, Severity } from '../../types.js';\nimport { getGlobalOpts, out } from '../shared.js';\n\n/**\n * Register the learn command with the program.\n */\nexport function registerLearnCommand(program: Command): void {\n program\n .command('learn <insight>')\n .description('Capture a new lesson')\n .option('-t, --trigger <text>', 'What triggered this lesson')\n .option('--tags <tags>', 'Comma-separated tags', '')\n .option('-s, --severity <level>', 'Lesson severity: high, medium, low')\n .option('-y, --yes', 'Skip confirmation')\n .action(async function (this: Command, insight: string, options: { trigger?: string; tags: string; severity?: string; yes?: boolean }) {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(this);\n\n // Validate severity if provided\n let severity: Severity | undefined;\n if (options.severity !== undefined) {\n const result = SeveritySchema.safeParse(options.severity);\n if (!result.success) {\n out.error(`Invalid severity value: \"${options.severity}\". Valid values are: high, medium, low`);\n process.exit(1);\n }\n severity = result.data;\n }\n\n // Data coupling invariant: severity !== undefined => type === 'full'\n const lessonType = severity !== undefined ? 'full' : 'quick';\n\n const lesson: Lesson = {\n id: generateId(insight),\n type: lessonType,\n trigger: options.trigger ?? 'Manual capture',\n insight,\n tags: options.tags ? options.tags.split(',').map((t) => t.trim()) : [],\n source: 'manual',\n context: {\n tool: 'cli',\n intent: 'manual learning',\n },\n created: new Date().toISOString(),\n confirmed: true, // learn command is explicit confirmation\n supersedes: [],\n related: [],\n ...(severity !== undefined && { severity }),\n };\n\n await appendLesson(repoRoot, lesson);\n out.success(`Learned: ${insight}`);\n if (!quiet) {\n console.log(`ID: ${chalk.dim(lesson.id)}`);\n }\n });\n}\n","/**\n * Trigger detection integration\n *\n * Orchestrates detection -> quality filter -> lesson proposal flow.\n * Provides a high-level API for CLI and hooks.\n */\n\nimport * as fs from 'node:fs/promises';\n\nimport type { Source } from '../types.js';\nimport { shouldPropose } from './quality.js';\nimport {\n detectUserCorrection,\n detectSelfCorrection,\n detectTestFailure,\n} from './triggers.js';\nimport type {\n CorrectionSignal,\n EditHistory,\n TestResult,\n} from './triggers.js';\n\n/** Detection input types */\nexport type DetectionType = 'user' | 'self' | 'test';\n\n/** Input for user correction detection */\nexport interface UserDetectionInput {\n type: 'user';\n data: CorrectionSignal;\n}\n\n/** Input for self correction detection */\nexport interface SelfDetectionInput {\n type: 'self';\n data: EditHistory;\n}\n\n/** Input for test failure detection */\nexport interface TestDetectionInput {\n type: 'test';\n data: TestResult;\n}\n\n/** Union type for all detection inputs */\nexport type DetectionInput = UserDetectionInput | SelfDetectionInput | TestDetectionInput;\n\n/** Result of successful detection */\nexport interface DetectionResult {\n trigger: string;\n source: Source;\n proposedInsight: string;\n}\n\n/**\n * Detect triggers and propose lessons.\n *\n * Runs the appropriate detector based on input type, then filters\n * through quality checks. Returns a proposal if detection passes\n * all quality filters.\n *\n * @param repoRoot - Repository root path\n * @param input - Detection input with type and data\n * @returns Detection result with proposed insight, or null\n */\nexport async function detectAndPropose(\n repoRoot: string,\n input: DetectionInput\n): Promise<DetectionResult | null> {\n const detected = runDetector(input);\n if (!detected) {\n return null;\n }\n\n const { trigger, source, proposedInsight } = detected;\n\n // Run quality filters on proposed insight\n const quality = await shouldPropose(repoRoot, proposedInsight);\n if (!quality.shouldPropose) {\n return null;\n }\n\n return { trigger, source, proposedInsight };\n}\n\n/** Internal detection result before quality filtering */\ninterface RawDetection {\n trigger: string;\n source: Source;\n proposedInsight: string;\n}\n\n/**\n * Run the appropriate detector based on input type.\n */\nfunction runDetector(input: DetectionInput): RawDetection | null {\n switch (input.type) {\n case 'user':\n return detectUserCorrectionFlow(input.data);\n case 'self':\n return detectSelfCorrectionFlow(input.data);\n case 'test':\n return detectTestFailureFlow(input.data);\n }\n}\n\n/**\n * Detect user correction and extract insight.\n */\nfunction detectUserCorrectionFlow(data: CorrectionSignal): RawDetection | null {\n const result = detectUserCorrection(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'user_correction',\n proposedInsight: result.correctionMessage,\n };\n}\n\n/**\n * Detect self correction and extract insight.\n */\nfunction detectSelfCorrectionFlow(data: EditHistory): RawDetection | null {\n const result = detectSelfCorrection(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'self_correction',\n // Self-corrections need context to form useful insights\n proposedInsight: `Check ${result.file} for common errors before editing`,\n };\n}\n\n/**\n * Detect test failure and extract insight.\n */\nfunction detectTestFailureFlow(data: TestResult): RawDetection | null {\n const result = detectTestFailure(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'test_failure',\n proposedInsight: result.errorOutput,\n };\n}\n\n/** Valid detection types for validation */\nconst VALID_TYPES = new Set<string>(['user', 'self', 'test']);\n\n/**\n * Parse detection input from a JSON file.\n *\n * @param filePath - Path to JSON input file\n * @returns Parsed detection input\n * @throws Error if file is invalid or type is unknown\n */\nexport async function parseInputFile(filePath: string): Promise<DetectionInput> {\n const content = await fs.readFile(filePath, 'utf-8');\n const data = JSON.parse(content) as { type: string; data: unknown };\n\n if (!VALID_TYPES.has(data.type)) {\n throw new Error(`Invalid detection type: ${data.type}. Must be one of: user, self, test`);\n }\n\n return data as DetectionInput;\n}\n","/**\n * Detect command - Detect learning triggers from input\n */\n\nimport type { Command } from 'commander';\n\nimport { detectAndPropose, parseInputFile } from '../../capture/index.js';\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { appendLesson } from '../../storage/index.js';\nimport { generateId } from '../../types.js';\nimport type { Lesson } from '../../types.js';\nimport { out } from '../shared.js';\n\n/**\n * Register the detect command with the program.\n */\nexport function registerDetectCommand(program: Command): void {\n program\n .command('detect')\n .description('Detect learning triggers from input')\n .requiredOption('--input <file>', 'Path to JSON input file')\n .option('--save', 'Save proposed lesson (requires --yes)')\n .option('-y, --yes', 'Confirm save (required with --save)')\n .option('--json', 'Output result as JSON')\n .action(\n async (options: { input: string; save?: boolean; yes?: boolean; json?: boolean }) => {\n const repoRoot = getRepoRoot();\n\n // --save requires --yes\n if (options.save && !options.yes) {\n if (options.json) {\n console.log(JSON.stringify({ error: '--save requires --yes flag for confirmation' }));\n } else {\n out.error('--save requires --yes flag for confirmation');\n console.log('Use: detect --input <file> --save --yes');\n }\n process.exit(1);\n }\n\n const input = await parseInputFile(options.input);\n const result = await detectAndPropose(repoRoot, input);\n\n if (!result) {\n if (options.json) {\n console.log(JSON.stringify({ detected: false }));\n } else {\n console.log('No learning trigger detected.');\n }\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify({ detected: true, ...result }));\n return;\n }\n\n console.log('Learning trigger detected!');\n console.log(` Trigger: ${result.trigger}`);\n console.log(` Source: ${result.source}`);\n console.log(` Proposed: ${result.proposedInsight}`);\n\n if (options.save && options.yes) {\n const lesson: Lesson = {\n id: generateId(result.proposedInsight),\n type: 'quick',\n trigger: result.trigger,\n insight: result.proposedInsight,\n tags: [],\n source: result.source,\n context: { tool: 'detect', intent: 'auto-capture' },\n created: new Date().toISOString(),\n confirmed: true, // --yes confirms the lesson\n supersedes: [],\n related: [],\n };\n\n await appendLesson(repoRoot, lesson);\n console.log(`\\nSaved as lesson: ${lesson.id}`);\n }\n }\n );\n}\n","/**\n * Capture command - Capture a lesson from trigger/insight or input file\n */\n\nimport type { Command } from 'commander';\n\nimport { detectAndPropose, parseInputFile } from '../../capture/index.js';\nimport type { DetectionResult } from '../../capture/index.js';\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { appendLesson } from '../../storage/index.js';\nimport { generateId } from '../../types.js';\nimport type { Lesson } from '../../types.js';\nimport { getGlobalOpts, out } from '../shared.js';\n\n/** Options for capture command */\ninterface CaptureOptions {\n trigger?: string;\n insight?: string;\n input?: string;\n json?: boolean;\n yes?: boolean;\n}\n\n/**\n * Create a lesson from explicit trigger and insight.\n */\nfunction createLessonFromFlags(trigger: string, insight: string, confirmed: boolean): Lesson {\n return {\n id: generateId(insight),\n type: 'quick',\n trigger,\n insight,\n tags: [],\n source: 'manual',\n context: { tool: 'capture', intent: 'manual capture' },\n created: new Date().toISOString(),\n confirmed,\n supersedes: [],\n related: [],\n };\n}\n\n/**\n * Output lesson in JSON format for capture command.\n */\nfunction outputCaptureJson(lesson: Lesson, saved: boolean): void {\n console.log(JSON.stringify({\n id: lesson.id,\n trigger: lesson.trigger,\n insight: lesson.insight,\n type: lesson.type,\n saved,\n }));\n}\n\n/**\n * Output lesson preview in human-readable format.\n */\nfunction outputCapturePreview(lesson: Lesson): void {\n console.log('Lesson captured:');\n console.log(` ID: ${lesson.id}`);\n console.log(` Trigger: ${lesson.trigger}`);\n console.log(` Insight: ${lesson.insight}`);\n console.log(` Type: ${lesson.type}`);\n console.log(` Tags: ${lesson.tags.length > 0 ? lesson.tags.join(', ') : '(none)'}`);\n console.log('\\nSave this lesson? [y/n]');\n}\n\n/**\n * Create lesson from input file detection result.\n */\nfunction createLessonFromInputFile(result: DetectionResult, confirmed: boolean): Lesson {\n return {\n id: generateId(result.proposedInsight),\n type: 'quick',\n trigger: result.trigger,\n insight: result.proposedInsight,\n tags: [],\n source: result.source,\n context: { tool: 'capture', intent: 'auto-capture' },\n created: new Date().toISOString(),\n confirmed,\n supersedes: [],\n related: [],\n };\n}\n\n/**\n * Register the capture command with the program.\n */\nexport function registerCaptureCommand(program: Command): void {\n program\n .command('capture')\n .description('Capture a lesson from trigger/insight or input file')\n .option('-t, --trigger <text>', 'What triggered this lesson')\n .option('-i, --insight <text>', 'The insight or lesson learned')\n .option('--input <file>', 'Path to JSON input file (alternative to trigger/insight)')\n .option('--json', 'Output result as JSON')\n .option('-y, --yes', 'Skip confirmation and save immediately')\n .action(async function (this: Command, options: CaptureOptions) {\n const repoRoot = getRepoRoot();\n const { verbose } = getGlobalOpts(this);\n let lesson: Lesson | undefined;\n\n // Mode 1: From --input file\n if (options.input) {\n const input = await parseInputFile(options.input);\n const result = await detectAndPropose(repoRoot, input);\n if (!result) {\n options.json\n ? console.log(JSON.stringify({ detected: false, saved: false }))\n : console.log('No learning trigger detected.');\n return;\n }\n lesson = createLessonFromInputFile(result, options.yes ?? false);\n } else if (options.trigger && options.insight) {\n // Mode 2: From explicit flags\n lesson = createLessonFromFlags(options.trigger, options.insight, options.yes ?? false);\n } else {\n // Missing required options\n const msg = 'Provide either --trigger and --insight, or --input file.';\n options.json ? console.log(JSON.stringify({ error: msg, saved: false })) : out.error(msg);\n process.exit(1);\n }\n\n // In non-interactive mode, --yes is required\n if (!options.yes && !process.stdin.isTTY) {\n if (options.json) {\n console.log(JSON.stringify({ error: '--yes required in non-interactive mode', saved: false }));\n } else {\n out.error('--yes required in non-interactive mode');\n console.log('Use: capture --trigger \"...\" --insight \"...\" --yes');\n }\n process.exit(1);\n }\n\n // Output and optionally save\n if (options.json) {\n if (options.yes) await appendLesson(repoRoot, lesson);\n outputCaptureJson(lesson, options.yes ?? false);\n } else if (options.yes) {\n await appendLesson(repoRoot, lesson);\n out.success(`Lesson saved: ${lesson.id}`);\n if (verbose) console.log(` Type: ${lesson.type} | Trigger: ${lesson.trigger}`);\n } else {\n // Interactive mode - show preview (TTY only)\n outputCapturePreview(lesson);\n }\n });\n}\n","/**\n * Init command - Initialize learning-agent in a repository\n */\n\nimport type { Command } from 'commander';\nimport { chmodSync, existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { LESSONS_PATH } from '../../storage/index.js';\nimport {\n addLearningAgentHook,\n getClaudeSettingsPath,\n getGlobalOpts,\n hasClaudeHook,\n HOOK_MARKER,\n out,\n PRE_COMMIT_HOOK_TEMPLATE,\n readClaudeSettings,\n writeClaudeSettings,\n} from '../shared.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Section header to check for idempotency */\nconst LEARNING_AGENT_SECTION_HEADER = '## Learning Agent Integration';\n\n/** Make hook file executable (mode 0o755) */\nconst HOOK_FILE_MODE = 0o755;\n\n/** Block to insert into existing hooks */\nconst LEARNING_AGENT_HOOK_BLOCK = `\n# Learning Agent pre-commit hook (appended)\nnpx lna hooks run pre-commit\n`;\n\n/** Template content for AGENTS.md */\nconst AGENTS_MD_TEMPLATE = `\n## Learning Agent Integration\n\nThis project uses learning-agent for session memory.\n\n### ⚠️ IMPORTANT: Never Edit JSONL Directly\n\n**DO NOT** manually edit \\`.claude/lessons/index.jsonl\\`.\n\nAlways use CLI commands:\n\n\\`\\`\\`bash\nnpx lna learn \"insight\" --severity high # Create lesson\nnpx lna update <id> --insight \"new text\" # Update lesson\nnpx lna delete <id> # Delete lesson\nnpx lna list # List all lessons\n\\`\\`\\`\n\nManual edits will:\n- **Break SQLite sync** - Index becomes stale, search fails\n- **Bypass schema validation** - Invalid data corrupts the database\n- **Cause silent failures** - Lessons won't load at session start\n\n### Retrieval Points\n\n- **Session start**: High-severity lessons loaded automatically\n- **Plan-time**: BEFORE implementing a plan, run check-plan to retrieve relevant lessons\n\n### Plan-Time Retrieval (Explicit Step)\n\n**BEFORE implementing any plan**, run:\n\n\\`\\`\\`bash\nnpx lna check-plan --plan \"your plan description\" --json\n\\`\\`\\`\n\nDisplay results as a **Lessons Check** section after your plan:\n\n\\`\\`\\`\n## Lessons Check\n1. [insight from lesson 1] (relevance: 0.85)\n2. [insight from lesson 2] (relevance: 0.72)\n\\`\\`\\`\n\nConsider each lesson while implementing.\n\n### Proposing Lessons\n\nPropose when: user correction, self-correction, test failure fix, or manual request.\n\n**Quality gate (ALL must pass):**\n\n- Novel (not already stored)\n- Specific (clear guidance)\n- Actionable (obvious what to do)\n\n**Confirmation format:**\n\n\\`\\`\\`\nLearned: [insight]. Save? [y/n]\n\\`\\`\\`\n\n### Session-End Protocol\n\nBefore closing a session, reflect on lessons learned:\n\n1. **Review**: What mistakes or corrections happened?\n2. **Quality gate**: Is it novel, specific, actionable?\n3. **Propose**: \"Learned: [insight]. Save? [y/n]\"\n4. **Capture**: \\`npx lna capture --trigger \"...\" --insight \"...\" --yes\\`\n\n### CLI Commands\n\n\\`\\`\\`bash\nnpx lna load-session --json # Session start\nnpx lna check-plan --plan \"...\" --json # Before implementing\nnpx lna capture --trigger \"...\" --insight \"...\" --yes\n\\`\\`\\`\n\nSee [AGENTS.md](https://github.com/Nathandela/learning_agent/blob/main/AGENTS.md) for full documentation.\n`;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction hasLearningAgentSection(content: string): boolean {\n return content.includes(LEARNING_AGENT_SECTION_HEADER);\n}\n\nasync function createLessonsDirectory(repoRoot: string): Promise<void> {\n const lessonsDir = dirname(join(repoRoot, LESSONS_PATH));\n await mkdir(lessonsDir, { recursive: true });\n}\n\nasync function createIndexFile(repoRoot: string): Promise<void> {\n const indexPath = join(repoRoot, LESSONS_PATH);\n if (!existsSync(indexPath)) {\n await writeFile(indexPath, '', 'utf-8');\n }\n}\n\nasync function updateAgentsMd(repoRoot: string): Promise<boolean> {\n const agentsPath = join(repoRoot, 'AGENTS.md');\n let content = '';\n let existed = false;\n\n if (existsSync(agentsPath)) {\n content = await readFile(agentsPath, 'utf-8');\n existed = true;\n if (hasLearningAgentSection(content)) {\n return false;\n }\n }\n\n const newContent = existed ? content.trimEnd() + '\\n' + AGENTS_MD_TEMPLATE : AGENTS_MD_TEMPLATE.trim() + '\\n';\n await writeFile(agentsPath, newContent, 'utf-8');\n return true;\n}\n\nfunction hasLearningAgentHook(content: string): boolean {\n return content.includes(HOOK_MARKER);\n}\n\nasync function getGitHooksDir(repoRoot: string): Promise<string | null> {\n const gitDir = join(repoRoot, '.git');\n\n if (!existsSync(gitDir)) {\n return null;\n }\n\n const configPath = join(gitDir, 'config');\n if (existsSync(configPath)) {\n const config = await readFile(configPath, 'utf-8');\n const match = /hooksPath\\s*=\\s*(.+)$/m.exec(config);\n if (match?.[1]) {\n const hooksPath = match[1].trim();\n return hooksPath.startsWith('/') ? hooksPath : join(repoRoot, hooksPath);\n }\n }\n\n const defaultHooksDir = join(gitDir, 'hooks');\n return existsSync(defaultHooksDir) ? defaultHooksDir : null;\n}\n\nfunction findFirstTopLevelExitLine(lines: string[]): number {\n let insideFunction = 0;\n let heredocDelimiter: string | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n const trimmed = line.trim();\n\n if (heredocDelimiter !== null) {\n if (trimmed === heredocDelimiter) {\n heredocDelimiter = null;\n }\n continue;\n }\n\n const heredocMatch = /<<-?\\s*['\"]?(\\w+)['\"]?/.exec(line);\n if (heredocMatch?.[1]) {\n heredocDelimiter = heredocMatch[1];\n continue;\n }\n\n for (const char of line) {\n if (char === '{') insideFunction++;\n if (char === '}') insideFunction = Math.max(0, insideFunction - 1);\n }\n\n if (insideFunction > 0) {\n continue;\n }\n\n if (/^\\s*exit\\s+(\\d+|\\$\\w+|\\$\\?)\\s*$/.test(trimmed)) {\n return i;\n }\n }\n\n return -1;\n}\n\nasync function installPreCommitHook(repoRoot: string): Promise<boolean> {\n const gitHooksDir = await getGitHooksDir(repoRoot);\n\n if (!gitHooksDir) {\n return false;\n }\n\n await mkdir(gitHooksDir, { recursive: true });\n\n const hookPath = join(gitHooksDir, 'pre-commit');\n\n if (existsSync(hookPath)) {\n const content = await readFile(hookPath, 'utf-8');\n if (hasLearningAgentHook(content)) {\n return false;\n }\n\n const lines = content.split('\\n');\n const exitLineIndex = findFirstTopLevelExitLine(lines);\n\n let newContent: string;\n if (exitLineIndex === -1) {\n newContent = content.trimEnd() + '\\n' + LEARNING_AGENT_HOOK_BLOCK;\n } else {\n const before = lines.slice(0, exitLineIndex);\n const after = lines.slice(exitLineIndex);\n newContent = before.join('\\n') + LEARNING_AGENT_HOOK_BLOCK + after.join('\\n');\n }\n\n await writeFile(hookPath, newContent, 'utf-8');\n chmodSync(hookPath, HOOK_FILE_MODE);\n return true;\n }\n\n await writeFile(hookPath, PRE_COMMIT_HOOK_TEMPLATE, 'utf-8');\n chmodSync(hookPath, HOOK_FILE_MODE);\n\n return true;\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register the init command with the program.\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command('init')\n .description('Initialize learning-agent in this repository')\n .option('--skip-agents', 'Skip AGENTS.md modification')\n .option('--skip-hooks', 'Skip git hooks installation')\n .option('--skip-claude', 'Skip Claude Code hooks installation')\n .option('--json', 'Output result as JSON')\n .action(async function (this: Command, options: { skipAgents?: boolean; skipHooks?: boolean; skipClaude?: boolean; json?: boolean }) {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(this);\n\n await createLessonsDirectory(repoRoot);\n await createIndexFile(repoRoot);\n const lessonsDir = dirname(join(repoRoot, LESSONS_PATH));\n\n let agentsMdUpdated = false;\n if (!options.skipAgents) {\n agentsMdUpdated = await updateAgentsMd(repoRoot);\n }\n\n let hooksInstalled = false;\n if (!options.skipHooks) {\n hooksInstalled = await installPreCommitHook(repoRoot);\n }\n\n let claudeHooksInstalled = false;\n let claudeHooksError: string | null = null;\n if (!options.skipClaude) {\n try {\n const settingsPath = getClaudeSettingsPath(false);\n const settings = await readClaudeSettings(settingsPath);\n if (!hasClaudeHook(settings)) {\n addLearningAgentHook(settings);\n await writeClaudeSettings(settingsPath, settings);\n claudeHooksInstalled = true;\n }\n } catch (err) {\n claudeHooksError = err instanceof Error ? err.message : 'Unknown error';\n }\n }\n\n if (options.json) {\n console.log(JSON.stringify({\n initialized: true,\n lessonsDir,\n agentsMd: agentsMdUpdated,\n hooks: hooksInstalled,\n claudeHooks: claudeHooksInstalled,\n }));\n } else if (!quiet) {\n out.success('Learning agent initialized');\n console.log(` Lessons directory: ${lessonsDir}`);\n if (agentsMdUpdated) {\n console.log(' AGENTS.md: Updated with Learning Agent section');\n } else if (options.skipAgents) {\n console.log(' AGENTS.md: Skipped (--skip-agents)');\n } else {\n console.log(' AGENTS.md: Already has Learning Agent section');\n }\n if (hooksInstalled) {\n console.log(' Git hooks: pre-commit hook installed');\n } else if (options.skipHooks) {\n console.log(' Git hooks: Skipped (--skip-hooks)');\n } else {\n console.log(' Git hooks: Already installed or not a git repo');\n }\n if (claudeHooksInstalled) {\n console.log(' Claude Code hooks: Installed to .claude/settings.json');\n } else if (options.skipClaude) {\n console.log(' Claude Code hooks: Skipped (--skip-claude)');\n } else if (claudeHooksError) {\n console.log(` Claude Code hooks: Error - ${claudeHooksError}`);\n } else {\n console.log(' Claude Code hooks: Already installed');\n }\n }\n });\n}\n\n// Export template for testing\nexport { AGENTS_MD_TEMPLATE };\n","/**\n * Hooks command - Git hooks management\n */\n\nimport type { Command } from 'commander';\n\nimport { out, PRE_COMMIT_MESSAGE } from '../shared.js';\n\n/**\n * Register the hooks command with the program.\n */\nexport function registerHooksCommand(program: Command): void {\n const hooksCommand = program.command('hooks').description('Git hooks management');\n\n hooksCommand\n .command('run <hook>')\n .description('Run a hook script (called by git hooks)')\n .option('--json', 'Output as JSON')\n .action((hook: string, options: { json?: boolean }) => {\n if (hook === 'pre-commit') {\n if (options.json) {\n console.log(JSON.stringify({ hook: 'pre-commit', message: PRE_COMMIT_MESSAGE }));\n } else {\n console.log(PRE_COMMIT_MESSAGE);\n }\n } else {\n if (options.json) {\n console.log(JSON.stringify({ error: `Unknown hook: ${hook}` }));\n } else {\n out.error(`Unknown hook: ${hook}`);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * Setup command - Setup integrations (Claude Code hooks)\n */\n\nimport type { Command } from 'commander';\nimport { existsSync } from 'node:fs';\n\nimport {\n addLearningAgentHook,\n getClaudeSettingsPath,\n hasClaudeHook,\n out,\n readClaudeSettings,\n removeLearningAgentHook,\n writeClaudeSettings,\n} from '../shared.js';\n\n/**\n * Register the setup command with the program.\n */\nexport function registerSetupCommand(program: Command): void {\n const setupCommand = program.command('setup').description('Setup integrations');\n\n setupCommand\n .command('claude')\n .description('Install Claude Code SessionStart hooks')\n .option('--global', 'Install to global ~/.claude/ instead of project')\n .option('--uninstall', 'Remove learning-agent hooks')\n .option('--dry-run', 'Show what would change without writing')\n .option('--json', 'Output as JSON')\n .action(async (options: { global?: boolean; uninstall?: boolean; dryRun?: boolean; json?: boolean }) => {\n const settingsPath = getClaudeSettingsPath(options.global ?? false);\n const displayPath = options.global ? '~/.claude/settings.json' : '.claude/settings.json';\n\n let settings: Record<string, unknown>;\n try {\n settings = await readClaudeSettings(settingsPath);\n } catch {\n if (options.json) {\n console.log(JSON.stringify({ error: 'Failed to parse settings file' }));\n } else {\n out.error('Failed to parse settings file. Check if JSON is valid.');\n }\n process.exit(1);\n }\n\n const alreadyInstalled = hasClaudeHook(settings);\n\n // Handle uninstall\n if (options.uninstall) {\n if (options.dryRun) {\n if (options.json) {\n console.log(JSON.stringify({ dryRun: true, wouldRemove: alreadyInstalled, location: displayPath }));\n } else {\n if (alreadyInstalled) {\n console.log(`Would remove learning-agent hooks from ${displayPath}`);\n } else {\n console.log('No learning-agent hooks to remove');\n }\n }\n return;\n }\n\n const removed = removeLearningAgentHook(settings);\n if (removed) {\n await writeClaudeSettings(settingsPath, settings);\n if (options.json) {\n console.log(JSON.stringify({ installed: false, location: displayPath, action: 'removed' }));\n } else {\n out.success('Learning agent hooks removed');\n console.log(` Location: ${displayPath}`);\n }\n } else {\n if (options.json) {\n console.log(JSON.stringify({ installed: false, location: displayPath, action: 'unchanged' }));\n } else {\n out.info('No learning agent hooks to remove');\n // Suggest the other scope if no hooks found\n if (options.global) {\n console.log(' Hint: Try without --global to check project settings.');\n } else {\n console.log(' Hint: Try with --global flag to check global settings.');\n }\n }\n }\n return;\n }\n\n // Handle install\n if (options.dryRun) {\n if (options.json) {\n console.log(JSON.stringify({ dryRun: true, wouldInstall: !alreadyInstalled, location: displayPath }));\n } else {\n if (alreadyInstalled) {\n console.log('Learning agent hooks already installed');\n } else {\n console.log(`Would install learning-agent hooks to ${displayPath}`);\n }\n }\n return;\n }\n\n if (alreadyInstalled) {\n if (options.json) {\n console.log(JSON.stringify({\n installed: true,\n location: displayPath,\n hooks: ['SessionStart'],\n action: 'unchanged',\n }));\n } else {\n out.info('Learning agent hooks already installed');\n console.log(` Location: ${displayPath}`);\n }\n return;\n }\n\n // Add hook\n const fileExists = existsSync(settingsPath);\n addLearningAgentHook(settings);\n await writeClaudeSettings(settingsPath, settings);\n\n if (options.json) {\n console.log(JSON.stringify({\n installed: true,\n location: displayPath,\n hooks: ['SessionStart'],\n action: fileExists ? 'updated' : 'created',\n }));\n } else {\n out.success(options.global ? 'Claude Code hooks installed (global)' : 'Claude Code hooks installed (project-level)');\n console.log(` Location: ${displayPath}`);\n console.log(' Hook: SessionStart (startup|resume|compact)');\n console.log('');\n console.log('Lessons will be loaded automatically at session start.');\n if (!options.global) {\n console.log('');\n console.log('Note: Project hooks override global hooks.');\n }\n }\n });\n}\n","/**\n * Load-session command - Load high-severity lessons for session startup\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { loadSessionLessons } from '../../index.js';\nimport type { Lesson } from '../../types.js';\nimport { getGlobalOpts, ISO_DATE_PREFIX_LENGTH } from '../shared.js';\n\n/**\n * Output session lessons in human-readable format.\n */\n/**\n * Format source for display (convert underscores to spaces).\n */\nfunction formatSource(source: string): string {\n return source.replace(/_/g, ' ');\n}\n\n/**\n * Output session lessons in human-readable format.\n */\nfunction outputSessionLessonsHuman(lessons: Lesson[], quiet: boolean): void {\n console.log('## Lessons from Past Sessions\\n');\n\n if (!quiet) {\n console.log('These lessons were captured from previous corrections and should inform your work:\\n');\n }\n\n for (let i = 0; i < lessons.length; i++) {\n const lesson = lessons[i]!;\n const tags = lesson.tags.length > 0 ? ` (${lesson.tags.join(', ')})` : '';\n console.log(`${i + 1}. **${lesson.insight}**${tags}`);\n console.log(` Learned: ${lesson.created.slice(0, ISO_DATE_PREFIX_LENGTH)} via ${formatSource(lesson.source)}`);\n console.log();\n }\n\n if (!quiet) {\n console.log('Consider these lessons when planning and implementing tasks.');\n }\n}\n\n/**\n * Register the load-session command with the program.\n */\nexport function registerLoadSessionCommand(program: Command): void {\n program\n .command('load-session')\n .description('Load high-severity lessons for session context')\n .option('--json', 'Output as JSON')\n .action(async function (this: Command, options: { json?: boolean }) {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(this);\n const lessons = await loadSessionLessons(repoRoot);\n\n if (options.json) {\n console.log(JSON.stringify({ lessons, count: lessons.length }));\n return;\n }\n\n if (lessons.length === 0) {\n console.log('No high-severity lessons found.');\n return;\n }\n\n outputSessionLessonsHuman(lessons, quiet);\n });\n}\n","/**\n * Check-plan command - Check a plan against relevant lessons\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot, parseLimit } from '../../cli-utils.js';\nimport { isModelAvailable, retrieveForPlan } from '../../index.js';\nimport type { Lesson } from '../../types.js';\nimport { DEFAULT_CHECK_PLAN_LIMIT, getGlobalOpts, out, RELEVANCE_DECIMAL_PLACES } from '../shared.js';\n\n/**\n * Read plan text from stdin (non-TTY mode).\n */\nasync function readPlanFromStdin(): Promise<string | undefined> {\n const { stdin } = await import('node:process');\n if (!stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of stdin) {\n chunks.push(chunk as Buffer);\n }\n return Buffer.concat(chunks).toString('utf-8').trim();\n }\n return undefined;\n}\n\n/**\n * Output check-plan results in JSON format.\n */\nfunction outputCheckPlanJson(lessons: Array<{ lesson: Lesson; score: number }>): void {\n const jsonOutput = {\n lessons: lessons.map((l) => ({\n id: l.lesson.id,\n insight: l.lesson.insight,\n relevance: l.score,\n source: l.lesson.source,\n })),\n count: lessons.length,\n };\n console.log(JSON.stringify(jsonOutput));\n}\n\n/**\n * Output check-plan results in human-readable format.\n */\nfunction outputCheckPlanHuman(lessons: Array<{ lesson: Lesson; score: number }>, quiet: boolean): void {\n console.log('## Lessons Check\\n');\n console.log('Relevant to your plan:\\n');\n\n lessons.forEach((item, i) => {\n const num = i + 1;\n console.log(`${num}. ${chalk.bold(`[${item.lesson.id}]`)} ${item.lesson.insight}`);\n console.log(` - Relevance: ${item.score.toFixed(RELEVANCE_DECIMAL_PLACES)}`);\n console.log(` - Source: ${item.lesson.source}`);\n console.log();\n });\n\n if (!quiet) {\n console.log('---');\n console.log('Consider these lessons while implementing.');\n }\n}\n\n/**\n * Register the check-plan command with the program.\n */\nexport function registerCheckPlanCommand(program: Command): void {\n program\n .command('check-plan')\n .description('Check plan against relevant lessons')\n .option('--plan <text>', 'Plan text to check')\n .option('--json', 'Output as JSON')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_CHECK_PLAN_LIMIT)\n .action(async function (this: Command, options: { plan?: string; json?: boolean; limit: string }) {\n const repoRoot = getRepoRoot();\n const limit = parseLimit(options.limit, 'limit');\n const { quiet } = getGlobalOpts(this);\n\n // Get plan text from --plan flag or stdin\n const planText = options.plan ?? (await readPlanFromStdin());\n\n if (!planText) {\n out.error('No plan provided. Use --plan <text> or pipe text to stdin.');\n process.exit(1);\n }\n\n // Check model availability - hard fail if not available\n if (!isModelAvailable()) {\n if (options.json) {\n console.log(JSON.stringify({\n error: 'Embedding model not available',\n action: 'Run: npx lna download-model',\n }));\n } else {\n out.error('Embedding model not available');\n console.log('');\n console.log('Run: npx lna download-model');\n }\n process.exit(1);\n }\n\n try {\n const result = await retrieveForPlan(repoRoot, planText, limit);\n\n if (options.json) {\n outputCheckPlanJson(result.lessons);\n return;\n }\n\n if (result.lessons.length === 0) {\n console.log('No relevant lessons found for this plan.');\n return;\n }\n\n outputCheckPlanHuman(result.lessons, quiet);\n } catch (err) {\n // Don't mask errors - surface them clearly\n const message = err instanceof Error ? err.message : 'Unknown error';\n if (options.json) {\n console.log(JSON.stringify({ error: message }));\n } else {\n out.error(`Failed to check plan: ${message}`);\n }\n process.exit(1);\n }\n });\n}\n","#!/usr/bin/env node\n/**\n * Learning Agent CLI\n *\n * Entry point that registers all commands from the cli module.\n *\n * Commands:\n * init - Initialize learning-agent in a repository\n * learn <insight> - Capture a new lesson\n * search <query> - Search lessons by keyword\n * list - List all lessons\n * detect --input - Detect learning triggers from input\n * capture - Capture lesson from trigger/insight or input file\n * compact - Archive old lessons and remove tombstones\n * load-session - Load high-severity lessons for session context\n * check-plan - Check plan against relevant lessons\n * setup - Setup integrations (Claude Code hooks)\n * hooks - Git hooks management\n * stats - Show statistics\n * show - Show a specific lesson\n * update - Update a lesson\n * delete - Delete a lesson\n * rebuild - Rebuild the SQLite index\n * export - Export lessons to JSON\n * import - Import lessons from JSON\n * download-model - Download the embedding model\n */\n\nimport { Command } from 'commander';\n\nimport {\n registerCaptureCommand,\n registerCheckPlanCommand,\n registerCompactCommand,\n registerDeleteCommand,\n registerDetectCommand,\n registerDownloadModelCommand,\n registerExportCommand,\n registerHooksCommand,\n registerImportCommand,\n registerInitCommand,\n registerLearnCommand,\n registerListCommand,\n registerLoadSessionCommand,\n registerRebuildCommand,\n registerSearchCommand,\n registerSetupCommand,\n registerShowCommand,\n registerStatsCommand,\n registerUpdateCommand,\n} from './cli/index.js';\nimport { VERSION } from './index.js';\n\n// ============================================================================\n// Program Setup\n// ============================================================================\n\nconst program = new Command();\n\nprogram\n .name('learning-agent')\n .description('Learning system for Claude Code session memory')\n .version(VERSION)\n .option('-v, --verbose', 'Verbose output')\n .option('-q, --quiet', 'Minimal output');\n\n// ============================================================================\n// Register Commands\n// ============================================================================\n\n// Core commands\nregisterInitCommand(program);\nregisterLearnCommand(program);\nregisterCaptureCommand(program);\nregisterDetectCommand(program);\n\n// CRUD operations\nregisterListCommand(program);\nregisterSearchCommand(program);\nregisterShowCommand(program);\nregisterUpdateCommand(program);\nregisterDeleteCommand(program);\n\n// Session and plan commands\nregisterLoadSessionCommand(program);\nregisterCheckPlanCommand(program);\n\n// Maintenance commands\nregisterStatsCommand(program);\nregisterRebuildCommand(program);\nregisterCompactCommand(program);\n\n// Data management\nregisterExportCommand(program);\nregisterImportCommand(program);\nregisterDownloadModelCommand(program);\n\n// Integration commands\nregisterSetupCommand(program);\nregisterHooksCommand(program);\n\n// ============================================================================\n// Run\n// ============================================================================\n\nprogram.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli-utils.ts","../src/types.ts","../src/storage/jsonl.ts","../src/storage/sqlite/availability.ts","../src/storage/sqlite/schema.ts","../src/storage/sqlite/connection.ts","../src/storage/sqlite/cache.ts","../src/storage/sqlite/sync.ts","../src/storage/sqlite/search.ts","../src/utils.ts","../src/storage/compact.ts","../src/capture/quality.ts","../src/capture/triggers.ts","../src/capture/integration.ts","../src/commands/shared.ts","../src/commands/capture.ts","../src/commands/management/helpers.ts","../src/commands/management/crud.ts","../src/commands/management/invalidation.ts","../src/commands/management/io.ts","../src/commands/management/maintenance.ts","../src/commands/management/prime.ts","../src/commands/management/index.ts","../src/embeddings/model.ts","../src/embeddings/nomic.ts","../src/search/vector.ts","../src/search/ranking.ts","../src/retrieval/session.ts","../src/retrieval/plan.ts","../src/index.ts","../src/commands/retrieval.ts","../src/commands/setup/templates.ts","../src/commands/setup/claude-helpers.ts","../src/commands/setup/claude.ts","../src/commands/setup/download-model.ts","../src/commands/setup/hooks.ts","../src/commands/setup/init.ts","../src/commands/setup/index.ts","../src/cli.ts"],"names":["require","join","dirname","createHash","mtime","readFile","mkdir","lines","appendFile","program","chalk","statSync","DEFAULT_LIMIT","homedir","existsSync","writeFile","rename","modelPath","size","content"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * CLI utility functions.\n *\n * Pure functions extracted from cli.ts for testability.\n */\n\n/**\n * Format bytes to human-readable string.\n *\n * @param bytes - Number of bytes\n * @returns Formatted string (e.g., \"1.5 KB\", \"2.0 MB\")\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n if (bytes < 1024) return `${bytes} B`;\n const kb = bytes / 1024;\n if (kb < 1024) return `${kb.toFixed(1)} KB`;\n const mb = kb / 1024;\n return `${mb.toFixed(1)} MB`;\n}\n\n/**\n * Parse limit option and validate it's a positive integer.\n *\n * @param value - String value from command option\n * @param name - Option name for error message\n * @returns Parsed integer\n * @throws Error if value is not a valid positive integer\n */\nexport function parseLimit(value: string, name: string): number {\n const parsed = parseInt(value, 10);\n if (Number.isNaN(parsed) || parsed <= 0) {\n throw new Error(`Invalid ${name}: must be a positive integer`);\n }\n return parsed;\n}\n\n/**\n * Get repository root from environment variable or current directory.\n *\n * @returns Repository root path for lesson storage\n */\nexport function getRepoRoot(): string {\n return process.env['LEARNING_AGENT_ROOT'] ?? process.cwd();\n}\n","/**\n * Lesson type definitions using Zod schemas\n */\n\nimport { createHash } from 'node:crypto';\nimport { z } from 'zod';\n\n// Source of lesson capture\nexport const SourceSchema = z.enum([\n 'user_correction',\n 'self_correction',\n 'test_failure',\n 'manual',\n]);\n\n// Context about when lesson was learned\nexport const ContextSchema = z.object({\n tool: z.string(),\n intent: z.string(),\n});\n\n// Code pattern (bad -> good)\nexport const PatternSchema = z.object({\n bad: z.string(),\n good: z.string(),\n});\n\n// Citation for lesson provenance tracking\nexport const CitationSchema = z.object({\n file: z.string().min(1), // Source file path (required, non-empty)\n line: z.number().int().positive().optional(), // Line number (optional, must be positive)\n commit: z.string().optional(), // Git commit hash (optional)\n});\n\n// Severity levels for lessons\nexport const SeveritySchema = z.enum(['high', 'medium', 'low']);\n\n// Compaction levels for age-based validity\nexport const CompactionLevelSchema = z.union([\n z.literal(0), // Active\n z.literal(1), // Flagged (>90 days)\n z.literal(2), // Archived\n]);\n\n// Lesson type - semantic marker for lesson quality tier\nexport const LessonTypeSchema = z.enum(['quick', 'full']);\n\n/**\n * Unified Lesson schema.\n *\n * The `type` field is a semantic marker:\n * - 'quick': Minimal lesson for fast capture\n * - 'full': Important lesson (typically has evidence/severity)\n *\n * All fields except core identity are optional for flexibility.\n * Semantic meaning is preserved through convention, not schema enforcement.\n */\nexport const LessonSchema = z.object({\n // Core identity (required)\n id: z.string(),\n type: LessonTypeSchema,\n trigger: z.string(),\n insight: z.string(),\n\n // Metadata (required)\n tags: z.array(z.string()),\n source: SourceSchema,\n context: ContextSchema,\n created: z.string(), // ISO8601\n confirmed: z.boolean(),\n\n // Relationships (required, can be empty arrays)\n supersedes: z.array(z.string()),\n related: z.array(z.string()),\n\n // Extended fields (optional - typically present for 'full' type)\n evidence: z.string().optional(),\n severity: SeveritySchema.optional(),\n pattern: PatternSchema.optional(),\n\n // Lifecycle fields (optional)\n deleted: z.boolean().optional(),\n retrievalCount: z.number().optional(),\n\n // Provenance tracking (optional)\n citation: CitationSchema.optional(),\n\n // Age-based validity fields (optional)\n compactionLevel: CompactionLevelSchema.optional(), // 0=active, 1=flagged, 2=archived\n compactedAt: z.string().optional(), // ISO8601 when compaction happened\n lastRetrieved: z.string().optional(), // ISO8601 last retrieval time\n\n // Invalidation fields (optional - for marking lessons as wrong)\n invalidatedAt: z.string().optional(), // ISO8601\n invalidationReason: z.string().optional(),\n});\n\n// Tombstone for deletions (append-only delete marker)\nexport const TombstoneSchema = z.object({\n id: z.string(),\n deleted: z.literal(true),\n deletedAt: z.string(), // ISO8601\n});\n\n// Type exports\nexport type Lesson = z.infer<typeof LessonSchema>;\nexport type LessonType = z.infer<typeof LessonTypeSchema>;\nexport type Tombstone = z.infer<typeof TombstoneSchema>;\nexport type Source = z.infer<typeof SourceSchema>;\nexport type Severity = z.infer<typeof SeveritySchema>;\nexport type Context = z.infer<typeof ContextSchema>;\nexport type Pattern = z.infer<typeof PatternSchema>;\nexport type Citation = z.infer<typeof CitationSchema>;\nexport type CompactionLevel = z.infer<typeof CompactionLevelSchema>;\n\n/**\n * Generate deterministic lesson ID from insight text.\n * Format: L + 8 hex characters from SHA-256 hash\n */\nexport function generateId(insight: string): string {\n const hash = createHash('sha256').update(insight).digest('hex');\n return `L${hash.slice(0, 8)}`;\n}\n","/**\n * JSONL storage layer for lessons\n *\n * Append-only storage with last-write-wins deduplication.\n * Source of truth - git trackable.\n */\n\nimport { appendFile, mkdir, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { LessonSchema, type Lesson } from '../types.js';\n\n/** Relative path to lessons file from repo root */\nexport const LESSONS_PATH = '.claude/lessons/index.jsonl';\n\n/** Options for reading lessons */\nexport interface ReadLessonsOptions {\n /** If true, throw on first parse error. Default: false (skip errors) */\n strict?: boolean;\n /** Callback for each parse error in non-strict mode */\n onParseError?: (error: ParseError) => void;\n}\n\n/** Parse error details */\nexport interface ParseError {\n /** 1-based line number */\n line: number;\n /** Error message */\n message: string;\n /** Original error */\n cause: unknown;\n}\n\n/** Result of reading lessons */\nexport interface ReadLessonsResult {\n /** Successfully parsed lessons */\n lessons: Lesson[];\n /** Number of lines skipped due to errors */\n skippedCount: number;\n}\n\n/**\n * Append a lesson to the JSONL file.\n * Creates directory structure if missing.\n */\nexport async function appendLesson(repoRoot: string, lesson: Lesson): Promise<void> {\n const filePath = join(repoRoot, LESSONS_PATH);\n await mkdir(dirname(filePath), { recursive: true });\n\n const line = JSON.stringify(lesson) + '\\n';\n await appendFile(filePath, line, 'utf-8');\n}\n\n/**\n * Parse and validate a single JSON line.\n * @returns Parsed lesson or null if invalid\n */\nfunction parseJsonLine(\n line: string,\n lineNumber: number,\n strict: boolean,\n onParseError?: (error: ParseError) => void\n): Lesson | null {\n // Try to parse JSON\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch (err) {\n const parseError: ParseError = {\n line: lineNumber,\n message: `Invalid JSON: ${(err as Error).message}`,\n cause: err,\n };\n if (strict) {\n throw new Error(`Parse error on line ${lineNumber}: ${parseError.message}`);\n }\n onParseError?.(parseError);\n return null;\n }\n\n // Validate against schema\n const result = LessonSchema.safeParse(parsed);\n if (!result.success) {\n const parseError: ParseError = {\n line: lineNumber,\n message: `Schema validation failed: ${result.error.message}`,\n cause: result.error,\n };\n if (strict) {\n throw new Error(`Parse error on line ${lineNumber}: ${parseError.message}`);\n }\n onParseError?.(parseError);\n return null;\n }\n\n return result.data;\n}\n\n/**\n * Read all non-deleted lessons from the JSONL file.\n * Applies last-write-wins deduplication by ID.\n * Returns result object with lessons and skippedCount.\n *\n * @param repoRoot - Repository root directory\n * @param options - Optional settings for error handling\n * @returns Result with lessons array and count of skipped lines\n */\nexport async function readLessons(\n repoRoot: string,\n options: ReadLessonsOptions = {}\n): Promise<ReadLessonsResult> {\n const { strict = false, onParseError } = options;\n const filePath = join(repoRoot, LESSONS_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return { lessons: [], skippedCount: 0 };\n }\n throw err;\n }\n\n const lessons = new Map<string, Lesson>();\n let skippedCount = 0;\n\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i]!.trim();\n if (!trimmed) continue;\n\n const lesson = parseJsonLine(trimmed, i + 1, strict, onParseError);\n if (!lesson) {\n skippedCount++;\n continue;\n }\n\n if (lesson.deleted) {\n lessons.delete(lesson.id);\n } else {\n lessons.set(lesson.id, lesson);\n }\n }\n\n return { lessons: Array.from(lessons.values()), skippedCount };\n}\n","/**\n * SQLite availability detection and graceful degradation.\n *\n * If better-sqlite3 fails to load (e.g., native binding compilation issues),\n * the module operates in JSONL-only mode. JSONL remains the source of truth;\n * SQLite is just a cache/index.\n */\n\nimport { createRequire } from 'node:module';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\n// Create require function for ESM compatibility\nconst require = createRequire(import.meta.url);\n\n/** SQLite availability state */\nlet sqliteAvailable: boolean | null = null;\nlet sqliteWarningLogged = false;\nlet DatabaseConstructor: (new (path: string) => DatabaseType) | null = null;\n\n/** Test-only flag to simulate SQLite unavailability */\nlet _forceUnavailable = false;\n\n/**\n * Check if SQLite is available and can be loaded.\n * @returns true if SQLite is available, false otherwise\n */\nexport function isSqliteAvailable(): boolean {\n // Test hook: force unavailability for degradation tests\n if (_forceUnavailable) {\n if (!sqliteWarningLogged) {\n console.warn('SQLite unavailable, running in JSONL-only mode');\n sqliteWarningLogged = true;\n }\n return false;\n }\n\n if (sqliteAvailable !== null) {\n return sqliteAvailable;\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const module = require('better-sqlite3');\n const Constructor = module.default || module;\n const testDb = new Constructor(':memory:');\n testDb.close();\n DatabaseConstructor = Constructor;\n sqliteAvailable = true;\n } catch {\n sqliteAvailable = false;\n if (!sqliteWarningLogged) {\n console.warn('SQLite unavailable, running in JSONL-only mode');\n sqliteWarningLogged = true;\n }\n }\n\n return sqliteAvailable;\n}\n\n/**\n * Log degradation warning if not already logged.\n */\nexport function logDegradationWarning(): void {\n if (!sqliteAvailable && !sqliteWarningLogged) {\n console.warn('SQLite unavailable, running in JSONL-only mode');\n sqliteWarningLogged = true;\n }\n}\n\n/**\n * Check if SQLite is available and the module is operating in SQLite mode.\n * @returns true if SQLite loaded successfully, false if degraded to JSONL-only mode\n */\nexport function isSqliteMode(): boolean {\n return isSqliteAvailable();\n}\n\n/**\n * Get the SQLite Database constructor.\n * @returns Database constructor or null if unavailable\n */\nexport function getDatabaseConstructor(): (new (path: string) => DatabaseType) | null {\n if (!isSqliteAvailable()) {\n return null;\n }\n return DatabaseConstructor;\n}\n\n/**\n * Reset SQLite state. Used in tests to reset detection state.\n */\nexport function _resetSqliteState(): void {\n sqliteAvailable = null;\n sqliteWarningLogged = false;\n DatabaseConstructor = null;\n _forceUnavailable = false;\n}\n\n/**\n * Force SQLite to be unavailable. Used in tests to simulate degradation.\n * @internal Test-only API\n */\nexport function _setForceUnavailable(value: boolean): void {\n _forceUnavailable = value;\n if (value) {\n sqliteAvailable = null;\n DatabaseConstructor = null;\n }\n}\n","/**\n * SQLite schema definition for lessons database.\n */\n\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\n/** SQL schema for lessons database with FTS5 full-text search */\nexport const SCHEMA_SQL = `\n CREATE TABLE IF NOT EXISTS lessons (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n trigger TEXT NOT NULL,\n insight TEXT NOT NULL,\n evidence TEXT,\n severity TEXT,\n tags TEXT NOT NULL DEFAULT '',\n source TEXT NOT NULL,\n context TEXT NOT NULL DEFAULT '{}',\n supersedes TEXT NOT NULL DEFAULT '[]',\n related TEXT NOT NULL DEFAULT '[]',\n created TEXT NOT NULL,\n confirmed INTEGER NOT NULL DEFAULT 0,\n deleted INTEGER NOT NULL DEFAULT 0,\n retrieval_count INTEGER NOT NULL DEFAULT 0,\n last_retrieved TEXT,\n embedding BLOB,\n content_hash TEXT,\n invalidated_at TEXT,\n invalidation_reason TEXT,\n citation_file TEXT,\n citation_line INTEGER,\n citation_commit TEXT,\n compaction_level INTEGER DEFAULT 0,\n compacted_at TEXT\n );\n\n CREATE VIRTUAL TABLE IF NOT EXISTS lessons_fts USING fts5(\n id, trigger, insight, tags,\n content='lessons', content_rowid='rowid'\n );\n\n CREATE TRIGGER IF NOT EXISTS lessons_ai AFTER INSERT ON lessons BEGIN\n INSERT INTO lessons_fts(rowid, id, trigger, insight, tags)\n VALUES (new.rowid, new.id, new.trigger, new.insight, new.tags);\n END;\n\n CREATE TRIGGER IF NOT EXISTS lessons_ad AFTER DELETE ON lessons BEGIN\n INSERT INTO lessons_fts(lessons_fts, rowid, id, trigger, insight, tags)\n VALUES ('delete', old.rowid, old.id, old.trigger, old.insight, old.tags);\n END;\n\n CREATE TRIGGER IF NOT EXISTS lessons_au AFTER UPDATE ON lessons BEGIN\n INSERT INTO lessons_fts(lessons_fts, rowid, id, trigger, insight, tags)\n VALUES ('delete', old.rowid, old.id, old.trigger, old.insight, old.tags);\n INSERT INTO lessons_fts(rowid, id, trigger, insight, tags)\n VALUES (new.rowid, new.id, new.trigger, new.insight, new.tags);\n END;\n\n CREATE INDEX IF NOT EXISTS idx_lessons_created ON lessons(created);\n CREATE INDEX IF NOT EXISTS idx_lessons_confirmed ON lessons(confirmed);\n CREATE INDEX IF NOT EXISTS idx_lessons_severity ON lessons(severity);\n\n CREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n`;\n\n/**\n * Create the database schema.\n * @param database - SQLite database instance\n */\nexport function createSchema(database: DatabaseType): void {\n database.exec(SCHEMA_SQL);\n}\n","/**\n * SQLite database connection management.\n */\n\nimport { mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\nimport type { DbOptions } from './types.js';\nimport { getDatabaseConstructor, isSqliteAvailable } from './availability.js';\nimport { createSchema } from './schema.js';\n\n/** Relative path to database file from repo root */\nexport const DB_PATH = '.claude/.cache/lessons.sqlite';\n\n/** Database singleton */\nlet db: DatabaseType | null = null;\nlet dbIsInMemory = false;\n\n/**\n * Open the SQLite database connection.\n * Gracefully degrades: returns null if SQLite unavailable.\n * @param repoRoot - Absolute path to repository root\n * @param options - Database options (e.g., inMemory for testing)\n * @returns Database instance or null if SQLite unavailable\n */\nexport function openDb(repoRoot: string, options: DbOptions = {}): DatabaseType | null {\n if (!isSqliteAvailable()) {\n return null;\n }\n\n const { inMemory = false } = options;\n\n if (db) {\n if (inMemory !== dbIsInMemory) {\n closeDb();\n } else {\n return db;\n }\n }\n\n const Database = getDatabaseConstructor()!;\n\n if (inMemory) {\n db = new Database(':memory:');\n dbIsInMemory = true;\n } else {\n const dbPath = join(repoRoot, DB_PATH);\n const dir = dirname(dbPath);\n mkdirSync(dir, { recursive: true });\n db = new Database(dbPath);\n dbIsInMemory = false;\n db.pragma('journal_mode = WAL');\n }\n\n createSchema(db);\n return db;\n}\n\n/**\n * Close the SQLite database connection.\n */\nexport function closeDb(): void {\n if (db) {\n db.close();\n db = null;\n dbIsInMemory = false;\n }\n}\n\n/**\n * Get the current database instance (for internal use).\n * @returns Current database instance or null\n */\nexport function getDb(): DatabaseType | null {\n return db;\n}\n","/**\n * Embedding cache operations for SQLite storage.\n */\n\nimport { createHash } from 'node:crypto';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\nimport type { CachedEmbeddingData } from './types.js';\nimport { logDegradationWarning } from './availability.js';\nimport { openDb } from './connection.js';\n\n/**\n * Compute content hash for a lesson's trigger and insight.\n * Used to detect content changes for embedding cache invalidation.\n * @param trigger - The lesson trigger text\n * @param insight - The lesson insight text\n * @returns SHA-256 hash of the combined content\n */\nexport function contentHash(trigger: string, insight: string): string {\n return createHash('sha256').update(`${trigger} ${insight}`).digest('hex');\n}\n\n/**\n * Get cached embedding for a lesson.\n * Gracefully degrades: returns null if SQLite unavailable.\n * @param repoRoot - Absolute path to repository root\n * @param lessonId - ID of the lesson\n * @param expectedHash - Optional content hash to validate cache freshness\n * @returns Embedding array or null if not cached/unavailable\n */\nexport function getCachedEmbedding(\n repoRoot: string,\n lessonId: string,\n expectedHash?: string\n): number[] | null {\n const database = openDb(repoRoot);\n if (!database) {\n logDegradationWarning();\n return null;\n }\n\n const row = database\n .prepare('SELECT embedding, content_hash FROM lessons WHERE id = ?')\n .get(lessonId) as { embedding: Buffer | null; content_hash: string | null } | undefined;\n\n if (!row || !row.embedding || !row.content_hash) {\n return null;\n }\n\n if (expectedHash && row.content_hash !== expectedHash) {\n return null;\n }\n\n const float32 = new Float32Array(\n row.embedding.buffer,\n row.embedding.byteOffset,\n row.embedding.byteLength / 4\n );\n return Array.from(float32);\n}\n\n/**\n * Cache embedding for a lesson in SQLite.\n * Gracefully degrades: no-op if SQLite unavailable.\n * @param repoRoot - Absolute path to repository root\n * @param lessonId - ID of the lesson\n * @param embedding - Embedding vector (Float32Array or number array)\n * @param hash - Content hash for cache validation\n */\nexport function setCachedEmbedding(\n repoRoot: string,\n lessonId: string,\n embedding: Float32Array | number[],\n hash: string\n): void {\n const database = openDb(repoRoot);\n if (!database) {\n logDegradationWarning();\n return;\n }\n\n const float32 = embedding instanceof Float32Array ? embedding : new Float32Array(embedding);\n const buffer = Buffer.from(float32.buffer, float32.byteOffset, float32.byteLength);\n\n database\n .prepare('UPDATE lessons SET embedding = ?, content_hash = ? WHERE id = ?')\n .run(buffer, hash, lessonId);\n}\n\n/**\n * Collect all cached embeddings from the database.\n * Used during index rebuild to preserve valid caches.\n * @param database - SQLite database instance\n * @returns Map of lesson ID to cached embedding data\n */\nexport function collectCachedEmbeddings(database: DatabaseType): Map<string, CachedEmbeddingData> {\n const cache = new Map<string, CachedEmbeddingData>();\n const rows = database\n .prepare('SELECT id, embedding, content_hash FROM lessons WHERE embedding IS NOT NULL')\n .all() as Array<{ id: string; embedding: Buffer; content_hash: string | null }>;\n\n for (const row of rows) {\n if (row.embedding && row.content_hash) {\n cache.set(row.id, { embedding: row.embedding, contentHash: row.content_hash });\n }\n }\n return cache;\n}\n","/**\n * SQLite index synchronization with JSONL source of truth.\n */\n\nimport { statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\nimport type { Lesson } from '../../types.js';\nimport { LESSONS_PATH, readLessons } from '../jsonl.js';\n\nimport type { SyncOptions } from './types.js';\nimport { isSqliteAvailable, logDegradationWarning } from './availability.js';\nimport { openDb } from './connection.js';\nimport { collectCachedEmbeddings, contentHash } from './cache.js';\n\n/** SQL for inserting a lesson record */\nconst INSERT_LESSON_SQL = `\n INSERT INTO lessons (id, type, trigger, insight, evidence, severity, tags, source, context, supersedes, related, created, confirmed, deleted, retrieval_count, last_retrieved, embedding, content_hash, invalidated_at, invalidation_reason, citation_file, citation_line, citation_commit, compaction_level, compacted_at)\n VALUES (@id, @type, @trigger, @insight, @evidence, @severity, @tags, @source, @context, @supersedes, @related, @created, @confirmed, @deleted, @retrieval_count, @last_retrieved, @embedding, @content_hash, @invalidated_at, @invalidation_reason, @citation_file, @citation_line, @citation_commit, @compaction_level, @compacted_at)\n`;\n\n/**\n * Get the modification time of the JSONL file.\n * @param repoRoot - Absolute path to repository root\n * @returns Modification time in milliseconds or null if file doesn't exist\n */\nfunction getJsonlMtime(repoRoot: string): number | null {\n const jsonlPath = join(repoRoot, LESSONS_PATH);\n try {\n const stat = statSync(jsonlPath);\n return stat.mtimeMs;\n } catch {\n return null;\n }\n}\n\n/**\n * Get the last sync modification time from metadata.\n * @param database - SQLite database instance\n * @returns Last sync mtime or null if not set\n */\nfunction getLastSyncMtime(database: DatabaseType): number | null {\n const row = database\n .prepare('SELECT value FROM metadata WHERE key = ?')\n .get('last_sync_mtime') as { value: string } | undefined;\n return row ? parseFloat(row.value) : null;\n}\n\n/**\n * Set the last sync modification time in metadata.\n * @param database - SQLite database instance\n * @param mtime - Modification time to store\n */\nfunction setLastSyncMtime(database: DatabaseType, mtime: number): void {\n database\n .prepare('INSERT OR REPLACE INTO metadata (key, value) VALUES (?, ?)')\n .run('last_sync_mtime', mtime.toString());\n}\n\n/**\n * Rebuild the SQLite index from JSONL source of truth.\n * Gracefully degrades: no-op with warning if SQLite unavailable.\n * Preserves cached embeddings when lesson content hasn't changed.\n * @param repoRoot - Absolute path to repository root\n */\nexport async function rebuildIndex(repoRoot: string): Promise<void> {\n const database = openDb(repoRoot);\n if (!database) {\n logDegradationWarning();\n return;\n }\n\n const { lessons } = await readLessons(repoRoot);\n const cachedEmbeddings = collectCachedEmbeddings(database);\n database.exec('DELETE FROM lessons');\n\n if (lessons.length === 0) {\n const mtime = getJsonlMtime(repoRoot);\n if (mtime !== null) {\n setLastSyncMtime(database, mtime);\n }\n return;\n }\n\n const insert = database.prepare(INSERT_LESSON_SQL);\n const insertMany = database.transaction((items: Lesson[]) => {\n for (const lesson of items) {\n const newHash = contentHash(lesson.trigger, lesson.insight);\n const cached = cachedEmbeddings.get(lesson.id);\n const hasValidCache = cached && cached.contentHash === newHash;\n\n insert.run({\n id: lesson.id,\n type: lesson.type,\n trigger: lesson.trigger,\n insight: lesson.insight,\n evidence: lesson.evidence ?? null,\n severity: lesson.severity ?? null,\n tags: lesson.tags.join(','),\n source: lesson.source,\n context: JSON.stringify(lesson.context),\n supersedes: JSON.stringify(lesson.supersedes),\n related: JSON.stringify(lesson.related),\n created: lesson.created,\n confirmed: lesson.confirmed ? 1 : 0,\n deleted: lesson.deleted ? 1 : 0,\n retrieval_count: lesson.retrievalCount ?? 0,\n last_retrieved: lesson.lastRetrieved ?? null,\n embedding: hasValidCache ? cached.embedding : null,\n content_hash: hasValidCache ? cached.contentHash : null,\n invalidated_at: lesson.invalidatedAt ?? null,\n invalidation_reason: lesson.invalidationReason ?? null,\n citation_file: lesson.citation?.file ?? null,\n citation_line: lesson.citation?.line ?? null,\n citation_commit: lesson.citation?.commit ?? null,\n compaction_level: lesson.compactionLevel ?? 0,\n compacted_at: lesson.compactedAt ?? null,\n });\n }\n });\n\n insertMany(lessons);\n\n const mtime = getJsonlMtime(repoRoot);\n if (mtime !== null) {\n setLastSyncMtime(database, mtime);\n }\n}\n\n/**\n * Sync SQLite index if JSONL has changed.\n * Gracefully degrades: returns false immediately if SQLite unavailable.\n * @param repoRoot - Absolute path to repository root\n * @param options - Sync options\n * @returns true if sync was performed, false otherwise\n */\nexport async function syncIfNeeded(\n repoRoot: string,\n options: SyncOptions = {}\n): Promise<boolean> {\n if (!isSqliteAvailable()) {\n logDegradationWarning();\n return false;\n }\n\n const { force = false } = options;\n const jsonlMtime = getJsonlMtime(repoRoot);\n if (jsonlMtime === null && !force) {\n return false;\n }\n\n const database = openDb(repoRoot);\n if (!database) return false;\n\n const lastSyncMtime = getLastSyncMtime(database);\n const needsRebuild = force || lastSyncMtime === null || (jsonlMtime !== null && jsonlMtime > lastSyncMtime);\n\n if (needsRebuild) {\n await rebuildIndex(repoRoot);\n return true;\n }\n\n return false;\n}\n","/**\n * SQLite search operations using FTS5 full-text search.\n */\n\nimport type { Lesson } from '../../types.js';\n\nimport type { LessonRow, RetrievalStat } from './types.js';\nimport { logDegradationWarning } from './availability.js';\nimport { openDb } from './connection.js';\n\n/**\n * Convert a database row to a Lesson object.\n * @param row - Database row\n * @returns Lesson object\n */\nfunction rowToLesson(row: LessonRow): Lesson {\n const lesson: Lesson = {\n id: row.id,\n type: row.type as 'quick' | 'full',\n trigger: row.trigger,\n insight: row.insight,\n tags: row.tags ? row.tags.split(',').filter(Boolean) : [],\n source: row.source as Lesson['source'],\n context: JSON.parse(row.context) as Lesson['context'],\n supersedes: JSON.parse(row.supersedes) as string[],\n related: JSON.parse(row.related) as string[],\n created: row.created,\n confirmed: row.confirmed === 1,\n };\n\n if (row.evidence !== null) lesson.evidence = row.evidence;\n if (row.severity !== null) lesson.severity = row.severity as 'high' | 'medium' | 'low';\n if (row.deleted === 1) lesson.deleted = true;\n if (row.retrieval_count > 0) lesson.retrievalCount = row.retrieval_count;\n if (row.invalidated_at !== null) lesson.invalidatedAt = row.invalidated_at;\n if (row.invalidation_reason !== null) lesson.invalidationReason = row.invalidation_reason;\n if (row.citation_file !== null) {\n lesson.citation = {\n file: row.citation_file,\n ...(row.citation_line !== null && { line: row.citation_line }),\n ...(row.citation_commit !== null && { commit: row.citation_commit }),\n };\n }\n if (row.compaction_level !== null && row.compaction_level !== 0) {\n lesson.compactionLevel = row.compaction_level as 0 | 1 | 2;\n }\n if (row.compacted_at !== null) lesson.compactedAt = row.compacted_at;\n if (row.last_retrieved !== null) lesson.lastRetrieved = row.last_retrieved;\n\n return lesson;\n}\n\n/**\n * Increment retrieval count for lessons.\n * Gracefully degrades: no-op if SQLite unavailable.\n * @param repoRoot - Absolute path to repository root\n * @param lessonIds - IDs of retrieved lessons\n */\nexport function incrementRetrievalCount(repoRoot: string, lessonIds: string[]): void {\n if (lessonIds.length === 0) return;\n\n const database = openDb(repoRoot);\n if (!database) {\n logDegradationWarning();\n return;\n }\n\n const now = new Date().toISOString();\n\n const update = database.prepare(`\n UPDATE lessons\n SET retrieval_count = retrieval_count + 1,\n last_retrieved = ?\n WHERE id = ?\n `);\n\n const updateMany = database.transaction((ids: string[]) => {\n for (const id of ids) {\n update.run(now, id);\n }\n });\n\n updateMany(lessonIds);\n}\n\n/**\n * Search lessons using FTS5 full-text search.\n * Does NOT degrade gracefully: throws error if SQLite unavailable.\n * @param repoRoot - Absolute path to repository root\n * @param query - FTS5 query string\n * @param limit - Maximum number of results\n * @returns Matching lessons\n * @throws Error if SQLite unavailable (FTS5 required)\n */\nexport async function searchKeyword(\n repoRoot: string,\n query: string,\n limit: number\n): Promise<Lesson[]> {\n const database = openDb(repoRoot);\n if (!database) {\n throw new Error(\n 'Keyword search requires SQLite (FTS5 required). ' +\n 'Install native build tools or use vector search instead.'\n );\n }\n\n const countResult = database.prepare('SELECT COUNT(*) as cnt FROM lessons').get() as {\n cnt: number;\n };\n if (countResult.cnt === 0) return [];\n\n const rows = database\n .prepare(\n `\n SELECT l.*\n FROM lessons l\n JOIN lessons_fts fts ON l.rowid = fts.rowid\n WHERE lessons_fts MATCH ?\n AND l.invalidated_at IS NULL\n LIMIT ?\n `\n )\n .all(query, limit) as LessonRow[];\n\n if (rows.length > 0) {\n incrementRetrievalCount(repoRoot, rows.map((r) => r.id));\n }\n\n return rows.map(rowToLesson);\n}\n\n/**\n * Get retrieval statistics for all lessons.\n * Gracefully degrades: returns empty array if SQLite unavailable.\n * @param repoRoot - Absolute path to repository root\n * @returns Array of retrieval statistics\n */\nexport function getRetrievalStats(repoRoot: string): RetrievalStat[] {\n const database = openDb(repoRoot);\n if (!database) {\n logDegradationWarning();\n return [];\n }\n\n const rows = database\n .prepare('SELECT id, retrieval_count, last_retrieved FROM lessons')\n .all() as Array<{ id: string; retrieval_count: number; last_retrieved: string | null }>;\n\n return rows.map((row) => ({\n id: row.id,\n count: row.retrieval_count,\n lastRetrieved: row.last_retrieved,\n }));\n}\n","/**\n * Shared utility functions for the Learning Agent.\n */\n\n/** Milliseconds per day for time calculations */\nexport const MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n/**\n * Calculate the age of a lesson in days from its created date.\n *\n * @param lesson - Object with a created field (ISO8601 string)\n * @returns Age in days (integer, rounded down)\n */\nexport function getLessonAgeDays(lesson: { created: string }): number {\n const created = new Date(lesson.created).getTime();\n const now = Date.now();\n return Math.floor((now - created) / MS_PER_DAY);\n}\n","/**\n * Compaction and auto-archive for lessons\n *\n * Handles:\n * - Archiving old lessons (>90 days with 0 retrievals)\n * - Removing tombstones through JSONL rewrite\n * - Tracking compaction thresholds\n */\n\nimport { appendFile, mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport type { Lesson } from '../types.js';\nimport { getLessonAgeDays } from '../utils.js';\n\nimport { LESSONS_PATH, readLessons } from './jsonl.js';\n\n/** Relative path to archive directory from repo root */\nexport const ARCHIVE_DIR = '.claude/lessons/archive';\n\n/** Number of tombstones that triggers automatic compaction */\nexport const TOMBSTONE_THRESHOLD = 100;\n\n/** Age threshold for archiving (in days) */\nexport const ARCHIVE_AGE_DAYS = 90;\n\n/** Month offset for JavaScript's 0-indexed months */\nconst MONTH_INDEX_OFFSET = 1;\n\n/** Padding length for month in archive filename (e.g., \"01\" not \"1\") */\nconst MONTH_PAD_LENGTH = 2;\n\n/**\n * Result of a compaction operation\n */\nexport interface CompactResult {\n /** Number of lessons moved to archive */\n archived: number;\n /** Number of tombstones removed */\n tombstonesRemoved: number;\n /** Number of lessons remaining in index.jsonl */\n lessonsRemaining: number;\n}\n\n/**\n * Generate archive file path for a given date.\n * Format: .claude/lessons/archive/YYYY-MM.jsonl\n */\nexport function getArchivePath(repoRoot: string, date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + MONTH_INDEX_OFFSET).padStart(MONTH_PAD_LENGTH, '0');\n return join(repoRoot, ARCHIVE_DIR, `${year}-${month}.jsonl`);\n}\n\n/**\n * Parse raw JSONL lines from the lessons file.\n * Returns all lines (including invalid ones) as parsed objects or null.\n */\nasync function parseRawJsonlLines(\n repoRoot: string\n): Promise<Array<{ line: string; parsed: Record<string, unknown> | null }>> {\n const filePath = join(repoRoot, LESSONS_PATH);\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n return [];\n }\n\n const results: Array<{ line: string; parsed: Record<string, unknown> | null }> = [];\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const parsed = JSON.parse(trimmed) as Record<string, unknown>;\n results.push({ line: trimmed, parsed });\n } catch {\n results.push({ line: trimmed, parsed: null });\n }\n }\n return results;\n}\n\n/**\n * Count the number of tombstones (deleted: true records) in the JSONL file.\n */\nexport async function countTombstones(repoRoot: string): Promise<number> {\n const lines = await parseRawJsonlLines(repoRoot);\n let count = 0;\n for (const { parsed } of lines) {\n if (parsed && parsed['deleted'] === true) {\n count++;\n }\n }\n return count;\n}\n\n/**\n * Check if compaction is needed based on tombstone count.\n */\nexport async function needsCompaction(repoRoot: string): Promise<boolean> {\n const count = await countTombstones(repoRoot);\n return count >= TOMBSTONE_THRESHOLD;\n}\n\n/**\n * Rewrite the JSONL file without tombstones.\n * Applies last-write-wins deduplication.\n */\nexport async function rewriteWithoutTombstones(repoRoot: string): Promise<number> {\n const filePath = join(repoRoot, LESSONS_PATH);\n const tempPath = filePath + '.tmp';\n\n // Read deduplicated lessons (already handles last-write-wins)\n const { lessons } = await readLessons(repoRoot);\n\n // Count tombstones before rewrite\n const tombstoneCount = await countTombstones(repoRoot);\n\n // Ensure directory exists\n await mkdir(dirname(filePath), { recursive: true });\n\n // Write clean lessons to temp file\n const lines = lessons.map((lesson) => JSON.stringify(lesson) + '\\n');\n await writeFile(tempPath, lines.join(''), 'utf-8');\n\n // Atomic rename\n await rename(tempPath, filePath);\n\n return tombstoneCount;\n}\n\n/**\n * Determine if a lesson should be archived based on age and retrieval count.\n * Lessons are archived if older than ARCHIVE_AGE_DAYS and never retrieved.\n *\n * @param lesson - The lesson to evaluate\n * @returns true if lesson should be archived\n */\nfunction shouldArchive(lesson: Lesson): boolean {\n const ageDays = getLessonAgeDays(lesson);\n\n // Archive if: older than threshold AND never retrieved\n return ageDays > ARCHIVE_AGE_DAYS && (lesson.retrievalCount === undefined || lesson.retrievalCount === 0);\n}\n\n/**\n * Archive old lessons that haven't been retrieved.\n * Moves lessons >90 days old with 0 retrievals to archive files.\n * Returns the number of lessons archived.\n */\nexport async function archiveOldLessons(repoRoot: string): Promise<number> {\n const { lessons } = await readLessons(repoRoot);\n\n const toArchive: Lesson[] = [];\n const toKeep: Lesson[] = [];\n\n for (const lesson of lessons) {\n if (shouldArchive(lesson)) {\n toArchive.push(lesson);\n } else {\n toKeep.push(lesson);\n }\n }\n\n if (toArchive.length === 0) {\n return 0;\n }\n\n // Group lessons by archive file (YYYY-MM)\n const archiveGroups = new Map<string, Lesson[]>();\n for (const lesson of toArchive) {\n const created = new Date(lesson.created);\n const archivePath = getArchivePath(repoRoot, created);\n const group = archiveGroups.get(archivePath) ?? [];\n group.push(lesson);\n archiveGroups.set(archivePath, group);\n }\n\n // Create archive directory\n const archiveDir = join(repoRoot, ARCHIVE_DIR);\n await mkdir(archiveDir, { recursive: true });\n\n // Append to archive files\n for (const [archivePath, archiveLessons] of archiveGroups) {\n const lines = archiveLessons.map((l) => JSON.stringify(l) + '\\n').join('');\n await appendFile(archivePath, lines, 'utf-8');\n }\n\n // Rewrite main file without archived lessons\n const filePath = join(repoRoot, LESSONS_PATH);\n const tempPath = filePath + '.tmp';\n await mkdir(dirname(filePath), { recursive: true });\n\n const lines = toKeep.map((lesson) => JSON.stringify(lesson) + '\\n');\n await writeFile(tempPath, lines.join(''), 'utf-8');\n await rename(tempPath, filePath);\n\n return toArchive.length;\n}\n\n/**\n * Run full compaction: archive old lessons and remove tombstones.\n */\nexport async function compact(repoRoot: string): Promise<CompactResult> {\n // Count tombstones BEFORE any operations (archiving also rewrites the file)\n const tombstonesBefore = await countTombstones(repoRoot);\n\n // First, archive old lessons\n const archived = await archiveOldLessons(repoRoot);\n\n // Then, remove tombstones (may be fewer now if archiving removed some)\n const tombstonesAfterArchive = await countTombstones(repoRoot);\n await rewriteWithoutTombstones(repoRoot);\n\n // Total tombstones removed = before - after rewrite (which is 0 after rewrite)\n // But we want to report what was actually in the file before compaction\n const tombstonesRemoved = archived > 0 ? tombstonesBefore : tombstonesAfterArchive;\n\n // Get final count\n const { lessons } = await readLessons(repoRoot);\n\n return {\n archived,\n tombstonesRemoved,\n lessonsRemaining: lessons.length,\n };\n}\n","/**\n * Quality filters for lesson capture\n *\n * Filters to ensure lessons are:\n * - Novel (not duplicate)\n * - Specific (not vague)\n * - Actionable (contains action words)\n */\n\nimport { searchKeyword, syncIfNeeded } from '../storage/index.js';\n\n/** Default similarity threshold for duplicate detection */\nconst DEFAULT_SIMILARITY_THRESHOLD = 0.8;\n\n/** Result of novelty check */\nexport interface NoveltyResult {\n novel: boolean;\n reason?: string;\n existingId?: string;\n}\n\n/** Options for novelty check */\nexport interface NoveltyOptions {\n threshold?: number;\n}\n\n/**\n * Check if an insight is novel (not a duplicate of existing lessons).\n * Uses keyword search to find potentially similar lessons.\n */\nexport async function isNovel(\n repoRoot: string,\n insight: string,\n options: NoveltyOptions = {}\n): Promise<NoveltyResult> {\n const threshold = options.threshold ?? DEFAULT_SIMILARITY_THRESHOLD;\n\n // Sync index if JSONL has changed\n await syncIfNeeded(repoRoot);\n\n // Extract key words for search (take first 3 significant words)\n const words = insight\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .split(/\\s+/)\n .filter((w) => w.length > 3)\n .slice(0, 3);\n\n if (words.length === 0) {\n return { novel: true };\n }\n\n // Search for each word and collect results\n const searchQuery = words.join(' OR ');\n const results = await searchKeyword(repoRoot, searchQuery, 10);\n\n if (results.length === 0) {\n return { novel: true };\n }\n\n // Check similarity using simple word overlap (since we may not have embeddings)\n const insightWords = new Set(insight.toLowerCase().split(/\\s+/));\n\n for (const lesson of results) {\n const lessonWords = new Set(lesson.insight.toLowerCase().split(/\\s+/));\n\n // Calculate Jaccard similarity\n const intersection = [...insightWords].filter((w) => lessonWords.has(w)).length;\n const union = new Set([...insightWords, ...lessonWords]).size;\n const similarity = union > 0 ? intersection / union : 0;\n\n if (similarity >= threshold) {\n return {\n novel: false,\n reason: `Found similar existing lesson: \"${lesson.insight.slice(0, 50)}...\"`,\n existingId: lesson.id,\n };\n }\n\n // Also check exact match\n if (lesson.insight.toLowerCase() === insight.toLowerCase()) {\n return {\n novel: false,\n reason: `Exact duplicate found`,\n existingId: lesson.id,\n };\n }\n }\n\n return { novel: true };\n}\n\n/** Minimum word count for a specific insight */\nconst MIN_WORD_COUNT = 4;\n\n/** Vague patterns that indicate non-specific advice */\nconst VAGUE_PATTERNS = [\n /\\bwrite better\\b/i,\n /\\bbe careful\\b/i,\n /\\bremember to\\b/i,\n /\\bmake sure\\b/i,\n /\\btry to\\b/i,\n /\\bdouble check\\b/i,\n];\n\n/** Generic \"always/never\" phrases (short, lacking specificity) */\nconst GENERIC_IMPERATIVE_PATTERN = /^(always|never)\\s+\\w+(\\s+\\w+){0,2}$/i;\n\n/** Result of specificity check */\nexport interface SpecificityResult {\n specific: boolean;\n reason?: string;\n}\n\n/**\n * Check if an insight is specific enough to be useful.\n * Rejects vague, generic advice that doesn't provide actionable guidance.\n */\nexport function isSpecific(insight: string): SpecificityResult {\n // Check minimum length first\n const words = insight.trim().split(/\\s+/).filter((w) => w.length > 0);\n if (words.length < MIN_WORD_COUNT) {\n return { specific: false, reason: 'Insight is too short to be actionable' };\n }\n\n // Check for vague patterns\n for (const pattern of VAGUE_PATTERNS) {\n if (pattern.test(insight)) {\n return { specific: false, reason: 'Insight matches a vague pattern' };\n }\n }\n\n // Check for generic \"Always X\" or \"Never X\" phrases\n if (GENERIC_IMPERATIVE_PATTERN.test(insight)) {\n return { specific: false, reason: 'Insight matches a vague pattern' };\n }\n\n return { specific: true };\n}\n\n/** Action word patterns that indicate actionable guidance */\nconst ACTION_PATTERNS = [\n /\\buse\\s+.+\\s+instead\\s+of\\b/i, // \"use X instead of Y\"\n /\\bprefer\\s+.+\\s+(over|to)\\b/i, // \"prefer X over Y\" or \"prefer X to Y\"\n /\\balways\\s+.+\\s+when\\b/i, // \"always X when Y\"\n /\\bnever\\s+.+\\s+without\\b/i, // \"never X without Y\"\n /\\bavoid\\s+(using\\s+)?\\w+/i, // \"avoid X\" or \"avoid using X\"\n /\\bcheck\\s+.+\\s+before\\b/i, // \"check X before Y\"\n /^(run|use|add|remove|install|update|configure|set|enable|disable)\\s+/i, // Imperative commands at start\n];\n\n/** Result of actionability check */\nexport interface ActionabilityResult {\n actionable: boolean;\n reason?: string;\n}\n\n/**\n * Check if an insight contains actionable guidance.\n * Returns false for pure observations or questions.\n */\nexport function isActionable(insight: string): ActionabilityResult {\n // Check for action patterns\n for (const pattern of ACTION_PATTERNS) {\n if (pattern.test(insight)) {\n return { actionable: true };\n }\n }\n\n return { actionable: false, reason: 'Insight lacks clear action guidance' };\n}\n\n/** Result of combined quality check */\nexport interface ProposeResult {\n shouldPropose: boolean;\n reason?: string;\n}\n\n/**\n * Combined quality check for lesson proposals.\n * Returns true only if insight is novel, specific, AND actionable.\n */\nexport async function shouldPropose(\n repoRoot: string,\n insight: string\n): Promise<ProposeResult> {\n // Check specificity first (fast, no DB)\n const specificResult = isSpecific(insight);\n if (!specificResult.specific) {\n return { shouldPropose: false, reason: specificResult.reason };\n }\n\n // Check actionability (fast, no DB)\n const actionableResult = isActionable(insight);\n if (!actionableResult.actionable) {\n return { shouldPropose: false, reason: actionableResult.reason };\n }\n\n // Check novelty (requires DB lookup)\n const noveltyResult = await isNovel(repoRoot, insight);\n if (!noveltyResult.novel) {\n return { shouldPropose: false, reason: noveltyResult.reason };\n }\n\n return { shouldPropose: true };\n}\n","/**\n * Trigger detection for automatic lesson capture\n *\n * Detects patterns that indicate potential learning opportunities:\n * - User corrections\n * - Self-corrections\n * - Test failures\n */\n\nimport type { Context } from '../types.js';\n\n/** Signal data for correction detection */\nexport interface CorrectionSignal {\n messages: string[];\n context: Context;\n}\n\n/** Detected correction result */\nexport interface DetectedCorrection {\n trigger: string;\n correctionMessage: string;\n context: Context;\n}\n\n/** User correction patterns */\nconst USER_CORRECTION_PATTERNS = [\n /\\bno\\b[,.]?\\s/i, // \"no, ...\" or \"no ...\"\n /\\bwrong\\b/i, // \"wrong\"\n /\\bactually\\b/i, // \"actually...\"\n /\\bnot that\\b/i, // \"not that\"\n /\\bi meant\\b/i, // \"I meant\"\n];\n\n/**\n * Detect user correction signals in conversation.\n *\n * Looks for patterns that indicate the user is correcting Claude's\n * understanding or actions.\n *\n * @param signals - Messages and context to analyze\n * @returns Detected correction or null if none found\n */\nexport function detectUserCorrection(signals: CorrectionSignal): DetectedCorrection | null {\n const { messages, context } = signals;\n\n if (messages.length < 2) {\n return null;\n }\n\n // Check later messages for correction patterns\n for (let i = 1; i < messages.length; i++) {\n const message = messages[i];\n if (!message) continue;\n\n for (const pattern of USER_CORRECTION_PATTERNS) {\n if (pattern.test(message)) {\n return {\n trigger: `User correction during ${context.intent}`,\n correctionMessage: message,\n context,\n };\n }\n }\n }\n\n return null;\n}\n\n/** Edit history entry */\nexport interface EditEntry {\n file: string;\n success: boolean;\n timestamp: number;\n}\n\n/** Edit history for self-correction detection */\nexport interface EditHistory {\n edits: EditEntry[];\n}\n\n/** Detected self-correction */\nexport interface DetectedSelfCorrection {\n file: string;\n trigger: string;\n}\n\n/**\n * Detect self-correction patterns in edit history.\n *\n * Looks for edit→fail→re-edit patterns on the same file,\n * which indicate Claude had to correct its own work.\n *\n * @param history - Edit history to analyze\n * @returns Detected self-correction or null if none found\n */\nexport function detectSelfCorrection(history: EditHistory): DetectedSelfCorrection | null {\n const { edits } = history;\n\n if (edits.length < 3) {\n return null;\n }\n\n // Look for edit→fail→re-edit pattern on same file\n for (let i = 0; i <= edits.length - 3; i++) {\n const first = edits[i];\n const second = edits[i + 1];\n const third = edits[i + 2];\n\n if (!first || !second || !third) continue;\n\n // Pattern: success → fail → success on same file\n if (\n first.file === second.file &&\n second.file === third.file &&\n first.success &&\n !second.success &&\n third.success\n ) {\n return {\n file: first.file,\n trigger: `Self-correction on ${first.file}`,\n };\n }\n }\n\n return null;\n}\n\n/** Test result for failure detection */\nexport interface TestResult {\n passed: boolean;\n output: string;\n testFile: string;\n}\n\n/** Detected test failure */\nexport interface DetectedTestFailure {\n testFile: string;\n errorOutput: string;\n trigger: string;\n}\n\n/**\n * Detect test failure patterns.\n *\n * When tests fail, this creates a potential learning opportunity\n * if the failure is later fixed.\n *\n * @param testResult - Test result to analyze\n * @returns Detected test failure or null if tests passed\n */\nexport function detectTestFailure(testResult: TestResult): DetectedTestFailure | null {\n if (testResult.passed) {\n return null;\n }\n\n // Extract first meaningful error line for trigger\n const lines = testResult.output.split('\\n').filter((line) => line.trim().length > 0);\n const errorLine = lines.find((line) => /error|fail|assert/i.test(line)) ?? lines[0] ?? '';\n\n return {\n testFile: testResult.testFile,\n errorOutput: testResult.output,\n trigger: `Test failure in ${testResult.testFile}: ${errorLine.slice(0, 100)}`,\n };\n}\n","/**\n * Trigger detection integration\n *\n * Orchestrates detection -> quality filter -> lesson proposal flow.\n * Provides a high-level API for CLI and hooks.\n */\n\nimport * as fs from 'node:fs/promises';\n\nimport type { Source } from '../types.js';\nimport { shouldPropose } from './quality.js';\nimport {\n detectUserCorrection,\n detectSelfCorrection,\n detectTestFailure,\n} from './triggers.js';\nimport type {\n CorrectionSignal,\n EditHistory,\n TestResult,\n} from './triggers.js';\n\n/** Detection input types */\nexport type DetectionType = 'user' | 'self' | 'test';\n\n/** Input for user correction detection */\nexport interface UserDetectionInput {\n type: 'user';\n data: CorrectionSignal;\n}\n\n/** Input for self correction detection */\nexport interface SelfDetectionInput {\n type: 'self';\n data: EditHistory;\n}\n\n/** Input for test failure detection */\nexport interface TestDetectionInput {\n type: 'test';\n data: TestResult;\n}\n\n/** Union type for all detection inputs */\nexport type DetectionInput = UserDetectionInput | SelfDetectionInput | TestDetectionInput;\n\n/** Result of successful detection */\nexport interface DetectionResult {\n trigger: string;\n source: Source;\n proposedInsight: string;\n}\n\n/**\n * Detect triggers and propose lessons.\n *\n * Runs the appropriate detector based on input type, then filters\n * through quality checks. Returns a proposal if detection passes\n * all quality filters.\n *\n * @param repoRoot - Repository root path\n * @param input - Detection input with type and data\n * @returns Detection result with proposed insight, or null\n */\nexport async function detectAndPropose(\n repoRoot: string,\n input: DetectionInput\n): Promise<DetectionResult | null> {\n const detected = runDetector(input);\n if (!detected) {\n return null;\n }\n\n const { trigger, source, proposedInsight } = detected;\n\n // Run quality filters on proposed insight\n const quality = await shouldPropose(repoRoot, proposedInsight);\n if (!quality.shouldPropose) {\n return null;\n }\n\n return { trigger, source, proposedInsight };\n}\n\n/** Internal detection result before quality filtering */\ninterface RawDetection {\n trigger: string;\n source: Source;\n proposedInsight: string;\n}\n\n/**\n * Run the appropriate detector based on input type.\n */\nfunction runDetector(input: DetectionInput): RawDetection | null {\n switch (input.type) {\n case 'user':\n return detectUserCorrectionFlow(input.data);\n case 'self':\n return detectSelfCorrectionFlow(input.data);\n case 'test':\n return detectTestFailureFlow(input.data);\n }\n}\n\n/**\n * Detect user correction and extract insight.\n */\nfunction detectUserCorrectionFlow(data: CorrectionSignal): RawDetection | null {\n const result = detectUserCorrection(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'user_correction',\n proposedInsight: result.correctionMessage,\n };\n}\n\n/**\n * Detect self correction and extract insight.\n */\nfunction detectSelfCorrectionFlow(data: EditHistory): RawDetection | null {\n const result = detectSelfCorrection(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'self_correction',\n // Self-corrections need context to form useful insights\n proposedInsight: `Check ${result.file} for common errors before editing`,\n };\n}\n\n/**\n * Detect test failure and extract insight.\n */\nfunction detectTestFailureFlow(data: TestResult): RawDetection | null {\n const result = detectTestFailure(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'test_failure',\n proposedInsight: result.errorOutput,\n };\n}\n\n/** Valid detection types for validation */\nconst VALID_TYPES = new Set<string>(['user', 'self', 'test']);\n\n/**\n * Parse detection input from a JSON file.\n *\n * @param filePath - Path to JSON input file\n * @returns Parsed detection input\n * @throws Error if file is invalid or type is unknown\n */\nexport async function parseInputFile(filePath: string): Promise<DetectionInput> {\n const content = await fs.readFile(filePath, 'utf-8');\n const data = JSON.parse(content) as { type: string; data: unknown };\n\n if (!VALID_TYPES.has(data.type)) {\n throw new Error(`Invalid detection type: ${data.type}. Must be one of: user, self, test`);\n }\n\n return data as DetectionInput;\n}\n","/**\n * Shared types, constants, and utilities for CLI commands.\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\n// Re-export centralized utilities\nexport { getLessonAgeDays, MS_PER_DAY } from '../utils.js';\n\n// ============================================================================\n// Output Formatting Helpers\n// ============================================================================\n\n/** Output helper functions for consistent formatting */\nexport const out = {\n success: (msg: string): void => console.log(chalk.green('[ok]'), msg),\n error: (msg: string): void => console.error(chalk.red('[error]'), msg),\n info: (msg: string): void => console.log(chalk.blue('[info]'), msg),\n warn: (msg: string): void => console.log(chalk.yellow('[warn]'), msg),\n};\n\n/** Global options interface */\nexport interface GlobalOpts {\n verbose: boolean;\n quiet: boolean;\n}\n\n/**\n * Get global options from command.\n */\nexport function getGlobalOpts(cmd: Command): GlobalOpts {\n const opts = cmd.optsWithGlobals() as { verbose?: boolean; quiet?: boolean };\n return {\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n };\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default limit for search results */\nexport const DEFAULT_SEARCH_LIMIT = '10';\n\n/** Default limit for list results */\nexport const DEFAULT_LIST_LIMIT = '20';\n\n/** Default limit for check-plan results */\nexport const DEFAULT_CHECK_PLAN_LIMIT = '5';\n\n/** Threshold for lesson count warning (context pollution prevention) */\nexport const LESSON_COUNT_WARNING_THRESHOLD = 20;\n\n/** Age threshold in days for flagging old lessons */\nexport const AGE_FLAG_THRESHOLD_DAYS = 90;\n\n/** Length of ISO date prefix (YYYY-MM-DD) */\nexport const ISO_DATE_PREFIX_LENGTH = 10;\n\n/** Decimal places for average calculations */\nexport const AVG_DECIMAL_PLACES = 1;\n\n/** Decimal places for relevance scores */\nexport const RELEVANCE_DECIMAL_PLACES = 2;\n\n/** Indentation for JSON pretty-printing */\nexport const JSON_INDENT_SPACES = 2;\n","/**\n * Capture commands: learn, capture, detect\n *\n * Commands for capturing lessons from various sources.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { detectAndPropose, parseInputFile } from '../capture/index.js';\nimport type { DetectionResult } from '../capture/index.js';\nimport { appendLesson } from '../storage/index.js';\nimport { generateId, SeveritySchema } from '../types.js';\nimport type { Lesson, Severity } from '../types.js';\n\nimport { getGlobalOpts, out } from './shared.js';\n\n// ============================================================================\n// Capture Command Helpers\n// ============================================================================\n\n/** Options for capture command */\ninterface CaptureOptions {\n trigger?: string;\n insight?: string;\n input?: string;\n json?: boolean;\n yes?: boolean;\n}\n\n/**\n * Create a lesson from explicit trigger and insight.\n */\nfunction createLessonFromFlags(trigger: string, insight: string, confirmed: boolean): Lesson {\n return {\n id: generateId(insight),\n type: 'quick',\n trigger,\n insight,\n tags: [],\n source: 'manual',\n context: { tool: 'capture', intent: 'manual capture' },\n created: new Date().toISOString(),\n confirmed,\n supersedes: [],\n related: [],\n };\n}\n\n/**\n * Output lesson in JSON format for capture command.\n */\nfunction outputCaptureJson(lesson: Lesson, saved: boolean): void {\n console.log(JSON.stringify({\n id: lesson.id,\n trigger: lesson.trigger,\n insight: lesson.insight,\n type: lesson.type,\n saved,\n }));\n}\n\n/**\n * Output lesson preview in human-readable format.\n */\nfunction outputCapturePreview(lesson: Lesson): void {\n console.log('Lesson captured:');\n console.log(` ID: ${lesson.id}`);\n console.log(` Trigger: ${lesson.trigger}`);\n console.log(` Insight: ${lesson.insight}`);\n console.log(` Type: ${lesson.type}`);\n console.log(` Tags: ${lesson.tags.length > 0 ? lesson.tags.join(', ') : '(none)'}`);\n console.log('\\nSave this lesson? [y/n]');\n}\n\n/**\n * Create lesson from input file detection result.\n */\nfunction createLessonFromInputFile(result: DetectionResult, confirmed: boolean): Lesson {\n return {\n id: generateId(result.proposedInsight),\n type: 'quick',\n trigger: result.trigger,\n insight: result.proposedInsight,\n tags: [],\n source: result.source,\n context: { tool: 'capture', intent: 'auto-capture' },\n created: new Date().toISOString(),\n confirmed,\n supersedes: [],\n related: [],\n };\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register capture commands (learn, capture, detect) on the program.\n */\nexport function registerCaptureCommands(program: Command): void {\n /**\n * Learn command - Quick lesson capture.\n *\n * @example npx lna learn \"Use Polars for large files\"\n * @example npx lna learn \"Use Polars\" --severity high --trigger \"pandas was slow\"\n */\n program\n .command('learn <insight>')\n .description('Capture a new lesson')\n .option('-t, --trigger <text>', 'What triggered this lesson')\n .option('--tags <tags>', 'Comma-separated tags', '')\n .option('-s, --severity <level>', 'Lesson severity: high, medium, low')\n .option('-y, --yes', 'Skip confirmation')\n .option('--citation <file:line>', 'Source file (optionally with :line number)')\n .option('--citation-commit <hash>', 'Git commit hash for citation')\n .action(async function (this: Command, insight: string, options: { trigger?: string; tags: string; severity?: string; yes?: boolean; citation?: string; citationCommit?: string }) {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(this);\n\n // Validate severity if provided\n let severity: Severity | undefined;\n if (options.severity !== undefined) {\n const result = SeveritySchema.safeParse(options.severity);\n if (!result.success) {\n out.error(`Invalid severity value: \"${options.severity}\". Valid values are: high, medium, low`);\n process.exit(1);\n }\n severity = result.data;\n }\n\n // Data coupling invariant: severity !== undefined => type === 'full'\n const lessonType = severity !== undefined ? 'full' : 'quick';\n\n // Parse citation if provided\n let citation: { file: string; line?: number; commit?: string } | undefined;\n if (options.citation) {\n const parts = options.citation.split(':');\n const file = parts[0] ?? '';\n const lineStr = parts[1];\n const line = lineStr ? parseInt(lineStr, 10) : undefined;\n citation = {\n file,\n ...(line && !isNaN(line) && { line }),\n ...(options.citationCommit && { commit: options.citationCommit }),\n };\n }\n\n const lesson: Lesson = {\n id: generateId(insight),\n type: lessonType,\n trigger: options.trigger ?? 'Manual capture',\n insight,\n tags: options.tags ? options.tags.split(',').map((t) => t.trim()) : [],\n source: 'manual',\n context: {\n tool: 'cli',\n intent: 'manual learning',\n },\n created: new Date().toISOString(),\n confirmed: true, // learn command is explicit confirmation\n supersedes: [],\n related: [],\n ...(severity !== undefined && { severity }),\n ...(citation && { citation }),\n };\n\n await appendLesson(repoRoot, lesson);\n\n const chalk = await import('chalk');\n out.success(`Learned: ${insight}`);\n if (!quiet) {\n console.log(`ID: ${chalk.default.dim(lesson.id)}`);\n if (citation) {\n console.log(`Citation: ${chalk.default.dim(citation.file)}${citation.line ? `:${citation.line}` : ''}`);\n }\n }\n });\n\n /**\n * Detect command - Detect learning triggers from input.\n *\n * @example npx lna detect --input conversation.json\n * @example npx lna detect --input session.json --save --yes\n */\n program\n .command('detect')\n .description('Detect learning triggers from input')\n .requiredOption('--input <file>', 'Path to JSON input file')\n .option('--save', 'Save proposed lesson (requires --yes)')\n .option('-y, --yes', 'Confirm save (required with --save)')\n .option('--json', 'Output result as JSON')\n .action(\n async (options: { input: string; save?: boolean; yes?: boolean; json?: boolean }) => {\n const repoRoot = getRepoRoot();\n\n // --save requires --yes\n if (options.save && !options.yes) {\n if (options.json) {\n console.log(JSON.stringify({ error: '--save requires --yes flag for confirmation' }));\n } else {\n out.error('--save requires --yes flag for confirmation');\n console.log('Use: detect --input <file> --save --yes');\n }\n process.exit(1);\n }\n\n const input = await parseInputFile(options.input);\n const result = await detectAndPropose(repoRoot, input);\n\n if (!result) {\n if (options.json) {\n console.log(JSON.stringify({ detected: false }));\n } else {\n console.log('No learning trigger detected.');\n }\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify({ detected: true, ...result }));\n return;\n }\n\n console.log('Learning trigger detected!');\n console.log(` Trigger: ${result.trigger}`);\n console.log(` Source: ${result.source}`);\n console.log(` Proposed: ${result.proposedInsight}`);\n\n if (options.save && options.yes) {\n const lesson: Lesson = {\n id: generateId(result.proposedInsight),\n type: 'quick',\n trigger: result.trigger,\n insight: result.proposedInsight,\n tags: [],\n source: result.source,\n context: { tool: 'detect', intent: 'auto-capture' },\n created: new Date().toISOString(),\n confirmed: true, // --yes confirms the lesson\n supersedes: [],\n related: [],\n };\n\n await appendLesson(repoRoot, lesson);\n console.log(`\\nSaved as lesson: ${lesson.id}`);\n }\n }\n );\n\n /**\n * Capture command - Capture a lesson from trigger/insight or input file.\n *\n * Modes:\n * - Explicit: --trigger \"what happened\" --insight \"what to do\"\n * - From file: --input conversation.json (auto-detect trigger)\n *\n * @example npx lna capture --trigger \"Wrong API\" --insight \"Use v2\" --yes\n * @example npx lna capture --input session.json --json\n */\n program\n .command('capture')\n .description('Capture a lesson from trigger/insight or input file')\n .option('-t, --trigger <text>', 'What triggered this lesson')\n .option('-i, --insight <text>', 'The insight or lesson learned')\n .option('--input <file>', 'Path to JSON input file (alternative to trigger/insight)')\n .option('--json', 'Output result as JSON')\n .option('-y, --yes', 'Skip confirmation and save immediately')\n .action(async function (this: Command, options: CaptureOptions) {\n const repoRoot = getRepoRoot();\n const { verbose } = getGlobalOpts(this);\n let lesson: Lesson | undefined;\n\n // Mode 1: From --input file\n if (options.input) {\n const input = await parseInputFile(options.input);\n const result = await detectAndPropose(repoRoot, input);\n if (!result) {\n options.json\n ? console.log(JSON.stringify({ detected: false, saved: false }))\n : console.log('No learning trigger detected.');\n return;\n }\n lesson = createLessonFromInputFile(result, options.yes ?? false);\n } else if (options.trigger && options.insight) {\n // Mode 2: From explicit flags\n lesson = createLessonFromFlags(options.trigger, options.insight, options.yes ?? false);\n } else {\n // Missing required options\n const msg = 'Provide either --trigger and --insight, or --input file.';\n options.json ? console.log(JSON.stringify({ error: msg, saved: false })) : out.error(msg);\n process.exit(1);\n }\n\n // In non-interactive mode, --yes is required\n if (!options.yes && !process.stdin.isTTY) {\n if (options.json) {\n console.log(JSON.stringify({ error: '--yes required in non-interactive mode', saved: false }));\n } else {\n out.error('--yes required in non-interactive mode');\n console.log('Use: capture --trigger \"...\" --insight \"...\" --yes');\n }\n process.exit(1);\n }\n\n // Output and optionally save\n if (options.json) {\n if (options.yes) await appendLesson(repoRoot, lesson);\n outputCaptureJson(lesson, options.yes ?? false);\n } else if (options.yes) {\n await appendLesson(repoRoot, lesson);\n out.success(`Lesson saved: ${lesson.id}`);\n if (verbose) console.log(` Type: ${lesson.type} | Trigger: ${lesson.trigger}`);\n } else {\n // Interactive mode - show preview (TTY only)\n outputCapturePreview(lesson);\n }\n });\n}\n","/**\n * Helper functions for management commands.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { LESSONS_PATH } from '../../storage/index.js';\nimport type { Lesson } from '../../types.js';\n\n/**\n * Format lesson for human-readable display.\n */\nexport function formatLessonHuman(lesson: Lesson): string {\n const lines: string[] = [];\n\n lines.push(`ID: ${lesson.id}`);\n lines.push(`Type: ${lesson.type}`);\n lines.push(`Trigger: ${lesson.trigger}`);\n lines.push(`Insight: ${lesson.insight}`);\n\n if (lesson.evidence) {\n lines.push(`Evidence: ${lesson.evidence}`);\n }\n\n if (lesson.severity) {\n lines.push(`Severity: ${lesson.severity}`);\n }\n\n lines.push(`Tags: ${lesson.tags.length > 0 ? lesson.tags.join(', ') : '(none)'}`);\n lines.push(`Source: ${lesson.source}`);\n\n if (lesson.context) {\n lines.push(`Context: ${lesson.context.tool} - ${lesson.context.intent}`);\n }\n\n lines.push(`Created: ${lesson.created}`);\n lines.push(`Confirmed: ${lesson.confirmed ? 'yes' : 'no'}`);\n\n if (lesson.supersedes && lesson.supersedes.length > 0) {\n lines.push(`Supersedes: ${lesson.supersedes.join(', ')}`);\n }\n\n if (lesson.related && lesson.related.length > 0) {\n lines.push(`Related: ${lesson.related.join(', ')}`);\n }\n\n if (lesson.pattern) {\n lines.push('Pattern:');\n lines.push(` Bad: ${lesson.pattern.bad}`);\n lines.push(` Good: ${lesson.pattern.good}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Check if a lesson ID has been deleted (has a tombstone).\n */\nexport async function wasLessonDeleted(repoRoot: string, id: string): Promise<boolean> {\n const filePath = join(repoRoot, LESSONS_PATH);\n try {\n const content = await readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const record = JSON.parse(trimmed) as { id: string; deleted?: boolean };\n if (record.id === id && record.deleted === true) {\n return true;\n }\n } catch {\n // Skip invalid lines\n }\n }\n } catch {\n // File doesn't exist\n }\n return false;\n}\n","/**\n * CRUD commands: show, update, delete\n *\n * Commands for reading, updating, and deleting lessons.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { appendLesson, readLessons, syncIfNeeded } from '../../storage/index.js';\nimport { LessonSchema, SeveritySchema } from '../../types.js';\nimport type { Lesson, Severity } from '../../types.js';\n\nimport { out } from '../shared.js';\nimport { formatLessonHuman, wasLessonDeleted } from './helpers.js';\n\n/** JSON indentation for show output */\nconst SHOW_JSON_INDENT = 2;\n\n/**\n * Register CRUD commands on the program.\n */\nexport function registerCrudCommands(program: Command): void {\n /**\n * Show command - Display details of a specific lesson.\n *\n * @example npx lna show L12345678\n * @example npx lna show L12345678 --json\n */\n program\n .command('show <id>')\n .description('Show details of a specific lesson')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options: { json?: boolean }) => {\n const repoRoot = getRepoRoot();\n\n const { lessons } = await readLessons(repoRoot);\n const lesson = lessons.find((l) => l.id === id);\n\n if (!lesson) {\n // Check if lesson was deleted (tombstone)\n const wasDeleted = await wasLessonDeleted(repoRoot, id);\n\n if (options.json) {\n console.log(JSON.stringify({ error: wasDeleted ? `Lesson ${id} not found (deleted)` : `Lesson ${id} not found` }));\n } else {\n out.error(wasDeleted ? `Lesson ${id} not found (deleted)` : `Lesson ${id} not found`);\n }\n process.exit(1);\n }\n\n if (options.json) {\n console.log(JSON.stringify(lesson, null, SHOW_JSON_INDENT));\n } else {\n console.log(formatLessonHuman(lesson));\n }\n });\n\n /**\n * Update command - Update a lesson's mutable fields.\n *\n * @example npx lna update L12345678 --insight \"New insight\"\n * @example npx lna update L12345678 --severity high --tags \"api,auth\"\n */\n program\n .command('update <id>')\n .description('Update a lesson')\n .option('--insight <text>', 'Update insight')\n .option('--trigger <text>', 'Update trigger')\n .option('--evidence <text>', 'Update evidence')\n .option('--severity <level>', 'Update severity (low/medium/high)')\n .option('--tags <tags>', 'Update tags (comma-separated)')\n .option('--confirmed <bool>', 'Update confirmed status (true/false)')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options: {\n insight?: string;\n trigger?: string;\n evidence?: string;\n severity?: string;\n tags?: string;\n confirmed?: string;\n json?: boolean;\n }) => {\n const repoRoot = getRepoRoot();\n\n // Check if any update options provided\n const hasUpdates = options.insight !== undefined\n || options.trigger !== undefined\n || options.evidence !== undefined\n || options.severity !== undefined\n || options.tags !== undefined\n || options.confirmed !== undefined;\n\n if (!hasUpdates) {\n if (options.json) {\n console.log(JSON.stringify({ error: 'No fields to update (specify at least one: --insight, --tags, --severity, ...)' }));\n } else {\n out.error('No fields to update (specify at least one: --insight, --tags, --severity, ...)');\n }\n process.exit(1);\n }\n\n // Read current lessons\n const { lessons } = await readLessons(repoRoot);\n const lesson = lessons.find((l) => l.id === id);\n\n if (!lesson) {\n // Check if deleted\n const wasDeleted = await wasLessonDeleted(repoRoot, id);\n\n if (options.json) {\n console.log(JSON.stringify({ error: wasDeleted ? `Lesson ${id} is deleted` : `Lesson ${id} not found` }));\n } else {\n out.error(wasDeleted ? `Lesson ${id} is deleted` : `Lesson ${id} not found`);\n }\n process.exit(1);\n }\n\n // Validate severity if provided\n if (options.severity !== undefined) {\n const result = SeveritySchema.safeParse(options.severity);\n if (!result.success) {\n if (options.json) {\n console.log(JSON.stringify({ error: `Invalid severity '${options.severity}' (must be: high, medium, low)` }));\n } else {\n out.error(`Invalid severity '${options.severity}' (must be: high, medium, low)`);\n }\n process.exit(1);\n }\n }\n\n // Build updated lesson\n const updatedLesson: Lesson = {\n ...lesson,\n ...(options.insight !== undefined && { insight: options.insight }),\n ...(options.trigger !== undefined && { trigger: options.trigger }),\n ...(options.evidence !== undefined && { evidence: options.evidence }),\n ...(options.severity !== undefined && { severity: options.severity as Severity }),\n ...(options.tags !== undefined && {\n tags: [...new Set(\n options.tags\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n )],\n }),\n ...(options.confirmed !== undefined && { confirmed: options.confirmed === 'true' }),\n };\n\n // Validate updated lesson against schema\n const validationResult = LessonSchema.safeParse(updatedLesson);\n if (!validationResult.success) {\n if (options.json) {\n console.log(JSON.stringify({ error: `Schema validation failed: ${validationResult.error.message}` }));\n } else {\n out.error(`Schema validation failed: ${validationResult.error.message}`);\n }\n process.exit(1);\n }\n\n // Append updated lesson (last-write-wins)\n await appendLesson(repoRoot, updatedLesson);\n await syncIfNeeded(repoRoot);\n\n if (options.json) {\n console.log(JSON.stringify(updatedLesson, null, SHOW_JSON_INDENT));\n } else {\n out.success(`Updated lesson ${id}`);\n }\n });\n\n /**\n * Delete command - Soft delete lessons by creating tombstone records.\n *\n * Creates a full lesson copy with `deleted: true` added so that\n * readLessons properly excludes the deleted lesson.\n *\n * @example npx lna delete L12345678\n * @example npx lna delete L001 L002 L003\n */\n program\n .command('delete <ids...>')\n .description('Soft delete lessons (creates tombstone)')\n .option('--json', 'Output as JSON')\n .action(async (ids: string[], options: { json?: boolean }) => {\n const repoRoot = getRepoRoot();\n\n const { lessons } = await readLessons(repoRoot);\n const lessonMap = new Map(lessons.map((l) => [l.id, l]));\n\n const deleted: string[] = [];\n const warnings: Array<{ id: string; message: string }> = [];\n\n for (const id of ids) {\n const lesson = lessonMap.get(id);\n\n if (!lesson) {\n // Check if already deleted or never existed\n const wasDeleted = await wasLessonDeleted(repoRoot, id);\n warnings.push({ id, message: wasDeleted ? 'already deleted' : 'not found' });\n continue;\n }\n\n // Create tombstone as full lesson copy with deleted: true and deletedAt\n // This ensures it passes schema validation in readLessons\n const tombstone: Lesson & { deleted: true; deletedAt: string } = {\n ...lesson,\n deleted: true,\n deletedAt: new Date().toISOString(),\n };\n\n // Append tombstone using appendLesson (casts to handle the deleted field)\n await appendLesson(repoRoot, tombstone as unknown as Lesson);\n\n deleted.push(id);\n }\n\n // Sync once at end\n if (deleted.length > 0) {\n await syncIfNeeded(repoRoot);\n }\n\n if (options.json) {\n console.log(JSON.stringify({ deleted, warnings }));\n } else {\n if (deleted.length > 0) {\n out.success(`Deleted ${deleted.length} lesson(s): ${deleted.join(', ')}`);\n }\n for (const warning of warnings) {\n out.warn(`${warning.id}: ${warning.message}`);\n }\n if (deleted.length === 0 && warnings.length > 0) {\n process.exit(1);\n }\n }\n });\n}\n","/**\n * Invalidation commands: wrong, validate\n *\n * Commands for managing lesson validity state.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { appendLesson, readLessons } from '../../storage/index.js';\nimport type { Lesson } from '../../types.js';\n\nimport { out } from '../shared.js';\n\n/**\n * Register invalidation commands on the program.\n */\nexport function registerInvalidationCommands(program: Command): void {\n /**\n * Wrong command - Mark a lesson as invalid/wrong.\n *\n * Appends an invalidatedAt timestamp and optional reason to the lesson.\n * Invalidated lessons are excluded from retrieval but remain in storage.\n *\n * @example npx lna wrong L12345678\n * @example npx lna wrong L12345678 --reason \"This advice was incorrect\"\n */\n program\n .command('wrong <id>')\n .description('Mark a lesson as invalid/wrong')\n .option('-r, --reason <text>', 'Reason for invalidation')\n .action(async function (this: Command, id: string, options: { reason?: string }) {\n const repoRoot = getRepoRoot();\n\n // Read all lessons\n const { lessons } = await readLessons(repoRoot);\n\n // Find the lesson\n const lesson = lessons.find((l) => l.id === id);\n if (!lesson) {\n out.error(`Lesson not found: ${id}`);\n process.exit(1);\n }\n\n // Check if already invalidated\n if (lesson.invalidatedAt) {\n out.warn(`Lesson ${id} is already marked as invalid.`);\n return;\n }\n\n // Create updated lesson with invalidation\n const updatedLesson: Lesson = {\n ...lesson,\n invalidatedAt: new Date().toISOString(),\n ...(options.reason !== undefined && { invalidationReason: options.reason }),\n };\n\n // Append the updated lesson (JSONL append-only pattern)\n await appendLesson(repoRoot, updatedLesson);\n out.success(`Lesson ${id} marked as invalid.`);\n if (options.reason) {\n console.log(` Reason: ${options.reason}`);\n }\n });\n\n /**\n * Validate command - Remove invalidation from a lesson.\n *\n * Re-enables a previously invalidated lesson for retrieval.\n *\n * @example npx lna validate L12345678\n */\n program\n .command('validate <id>')\n .description('Re-enable a previously invalidated lesson')\n .action(async function (this: Command, id: string) {\n const repoRoot = getRepoRoot();\n\n // Read all lessons\n const { lessons } = await readLessons(repoRoot);\n\n // Find the lesson\n const lesson = lessons.find((l) => l.id === id);\n if (!lesson) {\n out.error(`Lesson not found: ${id}`);\n process.exit(1);\n }\n\n // Check if not invalidated\n if (!lesson.invalidatedAt) {\n out.info(`Lesson ${id} is not invalidated.`);\n return;\n }\n\n // Create lesson without invalidation fields\n const updatedLesson: Lesson = {\n id: lesson.id,\n type: lesson.type,\n trigger: lesson.trigger,\n insight: lesson.insight,\n tags: lesson.tags,\n source: lesson.source,\n context: lesson.context,\n created: lesson.created,\n confirmed: lesson.confirmed,\n supersedes: lesson.supersedes,\n related: lesson.related,\n // Include optional fields if present (excluding invalidation)\n ...(lesson.evidence !== undefined && { evidence: lesson.evidence }),\n ...(lesson.severity !== undefined && { severity: lesson.severity }),\n ...(lesson.pattern !== undefined && { pattern: lesson.pattern }),\n ...(lesson.deleted !== undefined && { deleted: lesson.deleted }),\n ...(lesson.retrievalCount !== undefined && { retrievalCount: lesson.retrievalCount }),\n ...(lesson.citation !== undefined && { citation: lesson.citation }),\n ...(lesson.compactionLevel !== undefined && { compactionLevel: lesson.compactionLevel }),\n ...(lesson.compactedAt !== undefined && { compactedAt: lesson.compactedAt }),\n ...(lesson.lastRetrieved !== undefined && { lastRetrieved: lesson.lastRetrieved }),\n };\n\n // Append the updated lesson (JSONL append-only pattern)\n await appendLesson(repoRoot, updatedLesson);\n out.success(`Lesson ${id} re-enabled (validated).`);\n });\n}\n","/**\n * I/O commands: export, import\n *\n * Commands for importing and exporting lessons.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { appendLesson, readLessons } from '../../storage/index.js';\nimport { LessonSchema } from '../../types.js';\nimport type { Lesson } from '../../types.js';\n\nimport { JSON_INDENT_SPACES } from '../shared.js';\n\n/**\n * Register I/O commands on the program.\n */\nexport function registerIOCommands(program: Command): void {\n /**\n * Export command - Export lessons as JSON to stdout.\n *\n * @example npx lna export\n * @example npx lna export --since 2024-01-15\n * @example npx lna export --tags typescript,testing\n */\n program\n .command('export')\n .description('Export lessons as JSON to stdout')\n .option('--since <date>', 'Only include lessons created after this date (ISO8601)')\n .option('--tags <tags>', 'Filter by tags (comma-separated, OR logic)')\n .action(async (options: { since?: string; tags?: string }) => {\n const repoRoot = getRepoRoot();\n\n const { lessons } = await readLessons(repoRoot);\n\n let filtered = lessons;\n\n // Filter by date if --since provided\n if (options.since) {\n const sinceDate = new Date(options.since);\n if (Number.isNaN(sinceDate.getTime())) {\n console.error(`Invalid date format: ${options.since}. Use ISO8601 format (e.g., 2024-01-15).`);\n process.exit(1);\n }\n filtered = filtered.filter((lesson) => new Date(lesson.created) >= sinceDate);\n }\n\n // Filter by tags if --tags provided (OR logic)\n if (options.tags) {\n const filterTags = options.tags.split(',').map((t) => t.trim());\n filtered = filtered.filter((lesson) => lesson.tags.some((tag) => filterTags.includes(tag)));\n }\n\n // Output JSON to stdout (portable format for sharing)\n console.log(JSON.stringify(filtered, null, JSON_INDENT_SPACES));\n });\n\n /**\n * Import command - Import lessons from a JSONL file.\n *\n * @example npx lna import lessons.jsonl\n */\n program\n .command('import <file>')\n .description('Import lessons from a JSONL file')\n .action(async (file: string) => {\n const repoRoot = getRepoRoot();\n\n // Read input file\n let content: string;\n try {\n content = await readFile(file, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n console.error(`Error: File not found: ${file}`);\n } else {\n console.error(`Error reading file: ${(err as Error).message}`);\n }\n process.exit(1);\n }\n\n // Get existing lesson IDs\n const { lessons: existingLessons } = await readLessons(repoRoot);\n const existingIds = new Set(existingLessons.map((l) => l.id));\n\n // Parse and validate each line\n const lines = content.split('\\n');\n let imported = 0;\n let skipped = 0;\n let invalid = 0;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // Parse JSON\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n invalid++;\n continue;\n }\n\n // Validate schema\n const result = LessonSchema.safeParse(parsed);\n if (!result.success) {\n invalid++;\n continue;\n }\n\n const lesson: Lesson = result.data;\n\n // Skip if ID already exists\n if (existingIds.has(lesson.id)) {\n skipped++;\n continue;\n }\n\n // Append lesson\n await appendLesson(repoRoot, lesson);\n existingIds.add(lesson.id);\n imported++;\n }\n\n // Format summary\n const lessonWord = imported === 1 ? 'lesson' : 'lessons';\n const parts: string[] = [];\n if (skipped > 0) parts.push(`${skipped} skipped`);\n if (invalid > 0) parts.push(`${invalid} invalid`);\n\n if (parts.length > 0) {\n console.log(`Imported ${imported} ${lessonWord} (${parts.join(', ')})`);\n } else {\n console.log(`Imported ${imported} ${lessonWord}`);\n }\n });\n}\n","/**\n * Maintenance commands: compact, rebuild, stats\n *\n * Commands for database health and maintenance.\n */\n\nimport { statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { formatBytes, getRepoRoot } from '../../cli-utils.js';\nimport {\n compact,\n countTombstones,\n DB_PATH,\n getRetrievalStats,\n LESSONS_PATH,\n needsCompaction,\n readLessons,\n rebuildIndex,\n syncIfNeeded,\n TOMBSTONE_THRESHOLD,\n} from '../../storage/index.js';\n\nimport {\n AGE_FLAG_THRESHOLD_DAYS,\n AVG_DECIMAL_PLACES,\n getLessonAgeDays,\n LESSON_COUNT_WARNING_THRESHOLD,\n out,\n} from '../shared.js';\n\n/**\n * Register maintenance commands on the program.\n */\nexport function registerMaintenanceCommands(program: Command): void {\n /**\n * Compact command - Archive old lessons and remove tombstones.\n *\n * @example npx lna compact\n * @example npx lna compact --force\n * @example npx lna compact --dry-run\n */\n program\n .command('compact')\n .description('Compact lessons: archive old lessons and remove tombstones')\n .option('-f, --force', 'Run compaction even if below threshold')\n .option('--dry-run', 'Show what would be done without making changes')\n .action(async (options: { force?: boolean; dryRun?: boolean }) => {\n const repoRoot = getRepoRoot();\n\n const tombstones = await countTombstones(repoRoot);\n const needs = await needsCompaction(repoRoot);\n\n if (options.dryRun) {\n console.log('Dry run - no changes will be made.\\n');\n console.log(`Tombstones found: ${tombstones}`);\n console.log(`Compaction needed: ${needs ? 'yes' : 'no'}`);\n return;\n }\n\n if (!needs && !options.force) {\n console.log(`Compaction not needed (${tombstones} tombstones, threshold is ${TOMBSTONE_THRESHOLD}).`);\n console.log('Use --force to compact anyway.');\n return;\n }\n\n console.log('Running compaction...');\n const result = await compact(repoRoot);\n\n console.log('\\nCompaction complete:');\n console.log(` Archived: ${result.archived} lesson(s)`);\n console.log(` Tombstones removed: ${result.tombstonesRemoved}`);\n console.log(` Lessons remaining: ${result.lessonsRemaining}`);\n\n // Rebuild SQLite index after compaction\n await rebuildIndex(repoRoot);\n console.log(' Index rebuilt.');\n });\n\n /**\n * Rebuild command - Rebuild SQLite index from JSONL.\n *\n * @example npx lna rebuild\n * @example npx lna rebuild --force\n */\n program\n .command('rebuild')\n .description('Rebuild SQLite index from JSONL')\n .option('-f, --force', 'Force rebuild even if unchanged')\n .action(async (options: { force?: boolean }) => {\n const repoRoot = getRepoRoot();\n if (options.force) {\n console.log('Forcing index rebuild...');\n await rebuildIndex(repoRoot);\n console.log('Index rebuilt.');\n } else {\n const rebuilt = await syncIfNeeded(repoRoot);\n if (rebuilt) {\n console.log('Index rebuilt (JSONL changed).');\n } else {\n console.log('Index is up to date.');\n }\n }\n });\n\n /**\n * Stats command - Show database health and statistics.\n *\n * @example npx lna stats\n */\n program\n .command('stats')\n .description('Show database health and statistics')\n .action(async () => {\n const repoRoot = getRepoRoot();\n\n // Sync index to ensure accurate stats\n await syncIfNeeded(repoRoot);\n\n // Read lessons from JSONL to get accurate counts\n const { lessons } = await readLessons(repoRoot);\n const deletedCount = await countTombstones(repoRoot);\n const totalLessons = lessons.length;\n\n // Get retrieval stats from SQLite\n const retrievalStats = getRetrievalStats(repoRoot);\n const totalRetrievals = retrievalStats.reduce((sum, s) => sum + s.count, 0);\n const avgRetrievals = totalLessons > 0 ? (totalRetrievals / totalLessons).toFixed(AVG_DECIMAL_PLACES) : '0.0';\n\n // Get storage sizes\n const jsonlPath = join(repoRoot, LESSONS_PATH);\n const dbPath = join(repoRoot, DB_PATH);\n\n let dataSize = 0;\n let indexSize = 0;\n\n try {\n dataSize = statSync(jsonlPath).size;\n } catch {\n // File doesn't exist\n }\n\n try {\n indexSize = statSync(dbPath).size;\n } catch {\n // File doesn't exist\n }\n\n const totalSize = dataSize + indexSize;\n\n // Calculate age distribution\n let recentCount = 0; // <30 days\n let mediumCount = 0; // 30-90 days\n let oldCount = 0; // >90 days\n for (const lesson of lessons) {\n const ageDays = getLessonAgeDays(lesson);\n if (ageDays < 30) {\n recentCount++;\n } else if (ageDays <= AGE_FLAG_THRESHOLD_DAYS) {\n mediumCount++;\n } else {\n oldCount++;\n }\n }\n\n // Format output\n const deletedInfo = deletedCount > 0 ? ` (${deletedCount} deleted)` : '';\n console.log(`Lessons: ${totalLessons} total${deletedInfo}`);\n\n // Show warning if lesson count exceeds threshold (context pollution prevention)\n if (totalLessons > LESSON_COUNT_WARNING_THRESHOLD) {\n out.warn(`High lesson count may degrade retrieval quality. Consider running \\`lna compact\\`.`);\n }\n\n // Show age distribution if lessons exist\n if (totalLessons > 0) {\n console.log(`Age: ${recentCount} <30d, ${mediumCount} 30-90d, ${oldCount} >90d`);\n }\n\n console.log(`Retrievals: ${totalRetrievals} total, ${avgRetrievals} avg per lesson`);\n console.log(`Storage: ${formatBytes(totalSize)} (index: ${formatBytes(indexSize)}, data: ${formatBytes(dataSize)})`);\n });\n}\n","/**\n * Prime command - Context recovery for Claude Code.\n */\n\nimport type { Command } from 'commander';\n\n/** Workflow context output for Claude Code after compaction/context loss */\nconst PRIME_WORKFLOW_CONTEXT = `# Learning Agent Workflow\n\n## Core Rules\n- **NEVER** edit .claude/lessons/index.jsonl directly\n- Use CLI commands: \\`lna learn\\`, \\`lna list\\`, \\`lna show\\`\n- Lessons load automatically at session start\n\n## When to Capture Lessons\n- User corrects you (\"no\", \"wrong\", \"actually...\")\n- You self-correct after multiple attempts\n- Test fails then you fix it\n\n## Commands\n- \\`lna learn \"insight\"\\` - Capture a lesson\n- \\`lna list\\` - Show all lessons\n- \\`lna check-plan --plan \"...\"\\` - Get relevant lessons for plan\n- \\`lna stats\\` - Show database health\n\n## Quality Gate (ALL must pass before proposing)\n- Novel (not already stored)\n- Specific (clear guidance)\n- Actionable (obvious what to do)\n`;\n\n/**\n * Register prime command on the program.\n */\nexport function registerPrimeCommand(program: Command): void {\n /**\n * Prime command - Output workflow context for Claude Code.\n *\n * Used after compaction or context loss to remind Claude of the\n * learning-agent workflow, rules, and commands.\n *\n * @example npx lna prime\n */\n program\n .command('prime')\n .description('Output workflow context for Claude Code')\n .action(() => {\n console.log(PRIME_WORKFLOW_CONTEXT);\n });\n}\n","/**\n * Management commands module.\n *\n * Re-exports all management command registration functions\n * and provides a combined registration function.\n */\n\nimport type { Command } from 'commander';\n\nimport { registerCrudCommands } from './crud.js';\nimport { registerInvalidationCommands } from './invalidation.js';\nimport { registerIOCommands } from './io.js';\nimport { registerMaintenanceCommands } from './maintenance.js';\nimport { registerPrimeCommand } from './prime.js';\n\n// Re-export helpers for use by other modules\nexport { formatLessonHuman, wasLessonDeleted } from './helpers.js';\n\n/**\n * Register all management commands on the program.\n */\nexport function registerManagementCommands(program: Command): void {\n registerInvalidationCommands(program);\n registerMaintenanceCommands(program);\n registerIOCommands(program);\n registerPrimeCommand(program);\n registerCrudCommands(program);\n}\n","/**\n * Embedding model resolution using node-llama-cpp's built-in resolver.\n *\n * Uses resolveModelFile for automatic download and caching.\n * Model is stored in ~/.node-llama-cpp/models/ by default.\n */\n\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { resolveModelFile } from 'node-llama-cpp';\n\n/**\n * HuggingFace URI for EmbeddingGemma-300M (Q4_0 quantization).\n *\n * - Size: ~278MB\n * - Dimensions: 768 (default), supports MRL truncation to 512/256/128\n * - Context: 2048 tokens\n */\nexport const MODEL_URI = 'hf:ggml-org/embeddinggemma-300M-qat-q4_0-GGUF/embeddinggemma-300M-qat-Q4_0.gguf';\n\n/**\n * Expected model filename after download.\n * node-llama-cpp uses format: hf_{org}_{filename}\n */\nexport const MODEL_FILENAME = 'hf_ggml-org_embeddinggemma-300M-qat-Q4_0.gguf';\n\n/** Default model directory used by node-llama-cpp */\nconst DEFAULT_MODEL_DIR = join(homedir(), '.node-llama-cpp', 'models');\n\n/**\n * Check if the embedding model is available locally.\n *\n * @returns true if model file exists\n */\nexport function isModelAvailable(): boolean {\n return existsSync(join(DEFAULT_MODEL_DIR, MODEL_FILENAME));\n}\n\n/**\n * Resolve the embedding model path, downloading if necessary.\n *\n * Uses node-llama-cpp's resolveModelFile for automatic download with progress.\n *\n * @param options - Optional configuration\n * @param options.cli - Show download progress in console (default: true)\n * @returns Path to the resolved model file\n *\n * @example\n * ```typescript\n * const modelPath = await resolveModel();\n * const llama = await getLlama();\n * const model = await llama.loadModel({ modelPath });\n * ```\n */\nexport async function resolveModel(options: { cli?: boolean } = {}): Promise<string> {\n const { cli = true } = options;\n return resolveModelFile(MODEL_URI, { cli });\n}\n","/**\n * Text embedding via node-llama-cpp with EmbeddingGemma model\n *\n * **Resource lifecycle:**\n * - Model is loaded lazily on first embedding call (~150MB in memory)\n * - Once loaded, the model remains in memory until `unloadEmbedding()` is called\n * - Loading is slow (~1-3s); keeping loaded improves subsequent call performance\n *\n * **Memory usage:**\n * - Embedding model: ~150MB RAM when loaded\n * - Embeddings themselves: ~3KB per embedding (768 dimensions x 4 bytes)\n *\n * @see {@link unloadEmbedding} for releasing memory\n * @see {@link getEmbedding} for the lazy-loading mechanism\n */\n\nimport { getLlama, LlamaEmbeddingContext } from 'node-llama-cpp';\n\nimport { isModelAvailable, resolveModel } from './model.js';\n\n/** Singleton embedding context */\nlet embeddingContext: LlamaEmbeddingContext | null = null;\n\n/**\n * Get the LlamaEmbeddingContext instance for generating embeddings.\n *\n * **Lazy loading behavior:**\n * - First call loads the embedding model (~150MB) into memory\n * - Loading takes ~1-3 seconds depending on hardware\n * - Subsequent calls return the cached instance immediately\n * - Downloads model automatically if not present\n *\n * **Resource lifecycle:**\n * - Once loaded, model stays in memory until `unloadEmbedding()` is called\n * - For CLI commands: typically load once, use, then unload on exit\n * - For long-running processes: keep loaded for performance\n *\n * @returns The singleton embedding context\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * // Direct usage (prefer embedText for simple cases)\n * const ctx = await getEmbedding();\n * const result = await ctx.getEmbeddingFor('some text');\n *\n * // Ensure cleanup\n * process.on('exit', () => unloadEmbedding());\n * ```\n *\n * @see {@link embedText} for simpler text-to-vector conversion\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function getEmbedding(): Promise<LlamaEmbeddingContext> {\n if (embeddingContext) return embeddingContext;\n\n // Resolve model path (downloads if needed)\n const modelPath = await resolveModel({ cli: true });\n\n // Load llama and model\n const llama = await getLlama();\n const model = await llama.loadModel({ modelPath });\n embeddingContext = await model.createEmbeddingContext();\n\n return embeddingContext;\n}\n\n/**\n * Unload the embedding context to free memory (~150MB).\n *\n * **Resource lifecycle:**\n * - Disposes the underlying LlamaEmbeddingContext\n * - Releases ~150MB of RAM used by the model\n * - After unloading, subsequent embedding calls will reload the model\n *\n * **When to call:**\n * - At the end of CLI commands to ensure clean process exit\n * - In memory-constrained environments after batch processing\n * - Before process exit in graceful shutdown handlers\n * - When switching to a different model (if supported in future)\n *\n * **Best practices:**\n * - For single-operation scripts: call before exit\n * - For daemon/server processes: call in shutdown handler\n * - Not needed between embedding calls in the same process\n *\n * @example\n * ```typescript\n * // CLI command pattern\n * try {\n * const embedding = await embedText('some text');\n * // ... use embedding\n * } finally {\n * unloadEmbedding();\n * closeDb();\n * }\n *\n * // Graceful shutdown pattern\n * process.on('SIGTERM', () => {\n * unloadEmbedding();\n * closeDb();\n * process.exit(0);\n * });\n * ```\n *\n * @see {@link getEmbedding} for loading the model\n * @see {@link closeDb} for database cleanup (often used together)\n */\nexport function unloadEmbedding(): void {\n if (embeddingContext) {\n embeddingContext.dispose();\n embeddingContext = null;\n }\n}\n\n/**\n * Embed a single text string into a vector.\n *\n * **Lazy loading:** First call loads the embedding model (~150MB, ~1-3s).\n * Subsequent calls use the cached model and complete in milliseconds.\n *\n * @param text - The text to embed\n * @returns A 768-dimensional vector (number[])\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * const vector = await embedText('TypeScript error handling');\n * console.log(vector.length); // 768\n *\n * // Remember to clean up when done\n * unloadEmbedding();\n * ```\n *\n * @see {@link embedTexts} for batch embedding\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function embedText(text: string): Promise<number[]> {\n const ctx = await getEmbedding();\n const result = await ctx.getEmbeddingFor(text);\n return Array.from(result.vector);\n}\n\n/**\n * Embed multiple texts into vectors.\n *\n * **Lazy loading:** First call loads the embedding model (~150MB, ~1-3s).\n * Subsequent calls use the cached model.\n *\n * **Performance:** More efficient than calling `embedText` in a loop\n * when processing multiple texts, as model loading happens only once.\n *\n * @param texts - Array of texts to embed\n * @returns Array of 768-dimensional vectors, same order as input\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * const texts = ['first text', 'second text'];\n * const vectors = await embedTexts(texts);\n * console.log(vectors.length); // 2\n * console.log(vectors[0].length); // 768\n *\n * // Remember to clean up when done\n * unloadEmbedding();\n * ```\n *\n * @see {@link embedText} for single text embedding\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function embedTexts(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n\n const ctx = await getEmbedding();\n const results: number[][] = [];\n\n for (const text of texts) {\n const result = await ctx.getEmbeddingFor(text);\n results.push(Array.from(result.vector));\n }\n\n return results;\n}\n\n// Re-export isModelAvailable for test utilities\nexport { isModelAvailable };\n","/**\n * Vector search with cosine similarity\n *\n * Embeds query text and ranks lessons by semantic similarity.\n * Uses SQLite cache to avoid recomputing embeddings.\n */\n\nimport { embedText } from '../embeddings/index.js';\nimport { contentHash, getCachedEmbedding, readLessons, setCachedEmbedding } from '../storage/index.js';\nimport type { Lesson } from '../types.js';\n\n/**\n * Calculate cosine similarity between two vectors.\n * Returns value between -1 (opposite) and 1 (identical).\n */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Vectors must have same length');\n }\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i]! * b[i]!;\n normA += a[i]! * a[i]!;\n normB += b[i]! * b[i]!;\n }\n\n const magnitude = Math.sqrt(normA) * Math.sqrt(normB);\n if (magnitude === 0) return 0;\n\n return dotProduct / magnitude;\n}\n\n/** Lesson with similarity score */\nexport interface ScoredLesson {\n lesson: Lesson;\n score: number;\n}\n\n/** Options for vector search */\nexport interface SearchVectorOptions {\n /** Maximum number of results to return (default: 10) */\n limit?: number;\n}\n\n/** Default number of results to return */\nconst DEFAULT_LIMIT = 10;\n\n/**\n * Search lessons by vector similarity to query text.\n * Returns top N lessons sorted by similarity score (descending).\n * Uses embedding cache to avoid recomputing embeddings.\n */\nexport async function searchVector(\n repoRoot: string,\n query: string,\n options?: SearchVectorOptions\n): Promise<ScoredLesson[]> {\n const limit = options?.limit ?? DEFAULT_LIMIT;\n // Read all lessons\n const { lessons } = await readLessons(repoRoot);\n if (lessons.length === 0) return [];\n\n // Embed the query\n const queryVector = await embedText(query);\n\n // Score each lesson, skipping invalidated ones\n const scored: ScoredLesson[] = [];\n for (const lesson of lessons) {\n // Skip invalidated lessons\n if (lesson.invalidatedAt) continue;\n\n const lessonText = `${lesson.trigger} ${lesson.insight}`;\n const hash = contentHash(lesson.trigger, lesson.insight);\n\n // Try cache first\n let lessonVector = getCachedEmbedding(repoRoot, lesson.id, hash);\n\n if (!lessonVector) {\n // Cache miss - compute and store\n lessonVector = await embedText(lessonText);\n setCachedEmbedding(repoRoot, lesson.id, lessonVector, hash);\n }\n\n const score = cosineSimilarity(queryVector, lessonVector);\n scored.push({ lesson, score });\n }\n\n // Sort by score descending and take top N\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, limit);\n}\n","/**\n * Multi-factor lesson ranking system\n *\n * Combines vector similarity with semantic boosts:\n * - Severity: high=1.5, medium=1.0, low=0.8\n * - Recency: 1.2 for lessons ≤30 days old\n * - Confirmation: 1.3 for confirmed lessons\n */\n\nimport type { Lesson } from '../types.js';\nimport { getLessonAgeDays } from '../utils.js';\n\nimport type { ScoredLesson } from './vector.js';\n\n/** Lesson with final ranked score */\nexport interface RankedLesson extends ScoredLesson {\n finalScore?: number;\n}\n\nconst RECENCY_THRESHOLD_DAYS = 30;\nconst HIGH_SEVERITY_BOOST = 1.5;\nconst MEDIUM_SEVERITY_BOOST = 1.0;\nconst LOW_SEVERITY_BOOST = 0.8;\nconst RECENCY_BOOST = 1.2;\nconst CONFIRMATION_BOOST = 1.3;\n\n/**\n * Calculate severity boost based on lesson severity.\n * Lessons without severity get 1.0 (medium boost).\n */\nexport function severityBoost(lesson: Lesson): number {\n switch (lesson.severity) {\n case 'high':\n return HIGH_SEVERITY_BOOST;\n case 'medium':\n return MEDIUM_SEVERITY_BOOST;\n case 'low':\n return LOW_SEVERITY_BOOST;\n default:\n return MEDIUM_SEVERITY_BOOST;\n }\n}\n\n/**\n * Calculate recency boost based on lesson age.\n * Lessons ≤30 days old get 1.2, older get 1.0.\n */\nexport function recencyBoost(lesson: Lesson): number {\n const ageDays = getLessonAgeDays(lesson);\n return ageDays <= RECENCY_THRESHOLD_DAYS ? RECENCY_BOOST : 1.0;\n}\n\n/**\n * Calculate confirmation boost.\n * Confirmed lessons get 1.3, unconfirmed get 1.0.\n */\nexport function confirmationBoost(lesson: Lesson): number {\n return lesson.confirmed ? CONFIRMATION_BOOST : 1.0;\n}\n\n/**\n * Calculate combined score for a lesson.\n * score = vectorSimilarity * severity * recency * confirmation\n */\nexport function calculateScore(lesson: Lesson, vectorSimilarity: number): number {\n return (\n vectorSimilarity * severityBoost(lesson) * recencyBoost(lesson) * confirmationBoost(lesson)\n );\n}\n\n/**\n * Rank lessons by combined score.\n * Returns new array sorted by finalScore descending.\n */\nexport function rankLessons(lessons: ScoredLesson[]): RankedLesson[] {\n return lessons\n .map((scored) => ({\n ...scored,\n finalScore: calculateScore(scored.lesson, scored.score),\n }))\n .sort((a, b) => (b.finalScore ?? 0) - (a.finalScore ?? 0));\n}\n","/**\n * Session-start lesson retrieval\n *\n * Loads high-severity lessons at the start of a session.\n * No vector search - just filter by severity and recency.\n */\n\nimport { readLessons } from '../storage/index.js';\nimport type { Lesson, Severity } from '../types.js';\n\n/** Default number of lessons to load at session start */\nconst DEFAULT_LIMIT = 5;\n\n/** A full lesson with severity field present */\ntype FullLesson = Lesson & { type: 'full'; severity: Severity };\n\n/**\n * Type guard to check if a lesson is a full lesson with severity\n */\nfunction isFullLesson(lesson: Lesson): lesson is FullLesson {\n return lesson.type === 'full' && lesson.severity !== undefined;\n}\n\n/**\n * Load high-severity lessons for session start.\n *\n * Returns confirmed, high-severity lessons sorted by recency.\n * These are the most important lessons to surface at the start\n * of a coding session.\n *\n * @param repoRoot - Repository root directory\n * @param limit - Maximum number of lessons to return (default: 5)\n * @returns Array of high-severity lessons, most recent first\n */\nexport async function loadSessionLessons(\n repoRoot: string,\n limit: number = DEFAULT_LIMIT\n): Promise<FullLesson[]> {\n const { lessons: allLessons } = await readLessons(repoRoot);\n\n // Filter for high-severity, confirmed, full lessons (excluding invalidated)\n const highSeverityLessons = allLessons.filter(\n (lesson): lesson is FullLesson =>\n isFullLesson(lesson) &&\n lesson.severity === 'high' &&\n lesson.confirmed &&\n !lesson.invalidatedAt\n );\n\n // Sort by recency (most recent first)\n highSeverityLessons.sort((a, b) => {\n const dateA = new Date(a.created).getTime();\n const dateB = new Date(b.created).getTime();\n return dateB - dateA;\n });\n\n // Return top N\n return highSeverityLessons.slice(0, limit);\n}\n","/**\n * Plan-time lesson retrieval\n *\n * Retrieves relevant lessons when planning an implementation.\n * Uses vector search to find semantically similar lessons.\n */\n\nimport { rankLessons, searchVector, type RankedLesson, type ScoredLesson } from '../search/index.js';\n\n/** Default number of lessons to retrieve */\nconst DEFAULT_LIMIT = 5;\n\n/** Result of plan-time retrieval */\nexport interface PlanRetrievalResult {\n lessons: RankedLesson[];\n message: string;\n}\n\n/**\n * Retrieve relevant lessons for a plan.\n *\n * Uses vector search to find semantically similar lessons,\n * then applies ranking boosts for severity, recency, and confirmation.\n *\n * Hard-fails if embeddings are unavailable (propagates error from embedText).\n *\n * @param repoRoot - Repository root directory\n * @param planText - The plan text to search against\n * @param limit - Maximum number of lessons to return (default: 5)\n * @returns Ranked lessons and formatted message\n */\nexport async function retrieveForPlan(\n repoRoot: string,\n planText: string,\n limit: number = DEFAULT_LIMIT\n): Promise<PlanRetrievalResult> {\n // Get lessons by vector similarity (will throw if embeddings unavailable)\n const scored = await searchVector(repoRoot, planText, { limit: limit * 2 });\n\n // Apply ranking boosts\n const ranked = rankLessons(scored);\n\n // Take top N after ranking\n const topLessons = ranked.slice(0, limit);\n\n // Format the Lessons Check message\n const message = formatLessonsCheck(topLessons);\n\n return { lessons: topLessons, message };\n}\n\n/**\n * Format a \"Lessons Check\" message for display.\n *\n * This message is intended to be shown at plan-time to remind\n * the developer of relevant lessons before implementation.\n *\n * @param lessons - Ranked lessons to include in the message\n * @returns Formatted message string\n */\nexport function formatLessonsCheck(lessons: ScoredLesson[]): string {\n const header = 'Lessons Check\\n' + '─'.repeat(40);\n\n if (lessons.length === 0) {\n return `${header}\\nNo relevant lessons found for this plan.`;\n }\n\n const lessonLines = lessons.map((l, i) => {\n const bullet = `${i + 1}.`;\n const insight = l.lesson.insight;\n return `${bullet} ${insight}`;\n });\n\n return `${header}\\n${lessonLines.join('\\n')}`;\n}\n","/**\n * Learning Agent - Repository-scoped learning system for Claude Code\n *\n * This package helps Claude Code learn from mistakes and avoid repeating them.\n * It captures lessons during coding sessions and retrieves relevant lessons\n * when planning new work.\n *\n * ## Quick Start\n *\n * ```typescript\n * import { appendLesson, retrieveForPlan, loadSessionLessons } from 'learning-agent';\n *\n * // At session start, load high-severity lessons\n * const criticalLessons = await loadSessionLessons(repoRoot);\n *\n * // When planning, retrieve relevant lessons\n * const { lessons, message } = await retrieveForPlan(repoRoot, planText);\n *\n * // When capturing a lesson\n * await appendLesson(repoRoot, lesson);\n * ```\n *\n * ## Hook Integration\n *\n * Add to your `.claude/settings.json`:\n *\n * ```json\n * {\n * \"hooks\": {\n * \"session_start\": \"npx learning-agent load-session\",\n * \"pre_tool\": \"npx learning-agent check-plan\"\n * }\n * }\n * ```\n *\n * ## Resource Management\n *\n * This library manages two heavyweight resources that require cleanup:\n *\n * ### SQLite Database\n * - **Acquired:** Lazily on first database operation (search, rebuild, etc.)\n * - **Memory:** Minimal (~few KB for connection, index cached by OS)\n * - **Cleanup:** Call `closeDb()` before process exit\n *\n * ### Embedding Model\n * - **Acquired:** Lazily on first embedding call (embedText, embedTexts, searchVector)\n * - **Memory:** ~150MB RAM for the EmbeddingGemma model\n * - **Cleanup:** Call `unloadEmbedding()` before process exit\n *\n * ### Recommended Cleanup Pattern\n *\n * ```typescript\n * import { closeDb, unloadEmbedding } from 'learning-agent';\n *\n * // For CLI commands - use try/finally\n * async function main() {\n * try {\n * // ... your code that uses learning-agent\n * } finally {\n * unloadEmbedding();\n * closeDb();\n * }\n * }\n *\n * // For long-running processes - use shutdown handlers\n * process.on('SIGTERM', () => {\n * unloadEmbedding();\n * closeDb();\n * process.exit(0);\n * });\n * process.on('SIGINT', () => {\n * unloadEmbedding();\n * closeDb();\n * process.exit(0);\n * });\n * ```\n *\n * **Note:** Failing to clean up will not corrupt data, but may cause:\n * - Memory leaks in long-running processes\n * - Unclean process exits (warnings in some environments)\n *\n * @see {@link closeDb} for database cleanup\n * @see {@link unloadEmbedding} for embedding model cleanup\n * @module learning-agent\n */\n\n/**\n * Package version - must match package.json.\n * Update this when releasing a new version.\n */\nexport const VERSION = '0.2.3';\n\n// Storage API (JSONL source of truth + SQLite index)\nexport {\n appendLesson,\n closeDb,\n DB_PATH,\n LESSONS_PATH,\n readLessons,\n rebuildIndex,\n searchKeyword,\n} from './storage/index.js';\nexport type { ParseError, ReadLessonsOptions, ReadLessonsResult } from './storage/index.js';\n\n// Embeddings API\nexport {\n embedText,\n embedTexts,\n getEmbedding,\n isModelAvailable,\n MODEL_FILENAME,\n MODEL_URI,\n resolveModel,\n unloadEmbedding,\n} from './embeddings/index.js';\n\n// Search API (vector similarity + ranking)\nexport {\n calculateScore,\n confirmationBoost,\n cosineSimilarity,\n rankLessons,\n recencyBoost,\n searchVector,\n severityBoost,\n} from './search/index.js';\nexport type { RankedLesson, ScoredLesson, SearchVectorOptions } from './search/index.js';\n\n// Capture API (quality filters + trigger detection)\nexport {\n detectSelfCorrection,\n detectTestFailure,\n detectUserCorrection,\n isActionable,\n isNovel,\n isSpecific,\n shouldPropose,\n} from './capture/index.js';\nexport type {\n ActionabilityResult,\n CorrectionSignal,\n DetectedCorrection,\n DetectedSelfCorrection,\n DetectedTestFailure,\n EditEntry,\n EditHistory,\n NoveltyOptions,\n NoveltyResult,\n ProposeResult,\n SpecificityResult,\n TestResult,\n} from './capture/index.js';\n\n// Retrieval API (session + plan time)\nexport { formatLessonsCheck, loadSessionLessons, retrieveForPlan } from './retrieval/index.js';\nexport type { PlanRetrievalResult } from './retrieval/index.js';\n\n// Types and schemas\nexport {\n generateId,\n LessonSchema,\n LessonTypeSchema,\n TombstoneSchema,\n} from './types.js';\nexport type {\n Lesson,\n LessonType,\n Tombstone,\n Source,\n Severity,\n Context,\n} from './types.js';\n","/**\n * Retrieval commands: search, list, check-plan, load-session\n *\n * Commands for searching and retrieving lessons.\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot, parseLimit } from '../cli-utils.js';\nimport { isModelAvailable, loadSessionLessons, retrieveForPlan } from '../index.js';\nimport { readLessons, searchKeyword, syncIfNeeded } from '../storage/index.js';\nimport type { Lesson } from '../types.js';\n\nimport {\n AGE_FLAG_THRESHOLD_DAYS,\n DEFAULT_CHECK_PLAN_LIMIT,\n DEFAULT_LIST_LIMIT,\n DEFAULT_SEARCH_LIMIT,\n getGlobalOpts,\n getLessonAgeDays,\n ISO_DATE_PREFIX_LENGTH,\n LESSON_COUNT_WARNING_THRESHOLD,\n out,\n RELEVANCE_DECIMAL_PLACES,\n} from './shared.js';\n\n// ============================================================================\n// Check-Plan Command Helpers\n// ============================================================================\n\n/**\n * Read plan text from stdin (non-TTY mode).\n */\nasync function readPlanFromStdin(): Promise<string | undefined> {\n const { stdin } = await import('node:process');\n if (!stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of stdin) {\n chunks.push(chunk as Buffer);\n }\n return Buffer.concat(chunks).toString('utf-8').trim();\n }\n return undefined;\n}\n\n/**\n * Output check-plan results in JSON format.\n */\nfunction outputCheckPlanJson(lessons: Array<{ lesson: Lesson; score: number }>): void {\n const jsonOutput = {\n lessons: lessons.map((l) => ({\n id: l.lesson.id,\n insight: l.lesson.insight,\n relevance: l.score,\n source: l.lesson.source,\n })),\n count: lessons.length,\n };\n console.log(JSON.stringify(jsonOutput));\n}\n\n/**\n * Output check-plan results in human-readable format.\n */\nfunction outputCheckPlanHuman(lessons: Array<{ lesson: Lesson; score: number }>, quiet: boolean): void {\n console.log('## Lessons Check\\n');\n console.log('Relevant to your plan:\\n');\n\n lessons.forEach((item, i) => {\n const num = i + 1;\n console.log(`${num}. ${chalk.bold(`[${item.lesson.id}]`)} ${item.lesson.insight}`);\n console.log(` - Relevance: ${item.score.toFixed(RELEVANCE_DECIMAL_PLACES)}`);\n console.log(` - Source: ${item.lesson.source}`);\n console.log();\n });\n\n if (!quiet) {\n console.log('---');\n console.log('Consider these lessons while implementing.');\n }\n}\n\n// ============================================================================\n// Load-Session Command Helpers\n// ============================================================================\n\n/**\n * Format source string for human-readable display.\n * Converts snake_case to space-separated words.\n */\nfunction formatSource(source: string): string {\n return source.replace(/_/g, ' ');\n}\n\n/**\n * Output load-session results in human-readable format.\n * Optimized for Claude's context window - no IDs, clear structure.\n */\nfunction outputSessionLessonsHuman(lessons: Lesson[], quiet: boolean): void {\n console.log('## Lessons from Past Sessions\\n');\n console.log('These lessons were captured from previous corrections and should inform your work:\\n');\n\n lessons.forEach((lesson, i) => {\n const num = i + 1;\n const date = lesson.created.slice(0, ISO_DATE_PREFIX_LENGTH);\n const tagsDisplay = lesson.tags.length > 0 ? ` (${lesson.tags.join(', ')})` : '';\n\n console.log(`${num}. **${lesson.insight}**${tagsDisplay}`);\n console.log(` Learned: ${date} via ${formatSource(lesson.source)}`);\n console.log();\n });\n\n if (!quiet) {\n console.log('Consider these lessons when planning and implementing tasks.');\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register retrieval commands (search, list, check-plan, load-session) on the program.\n */\nexport function registerRetrievalCommands(program: Command): void {\n /**\n * Search command - Search lessons by keyword.\n *\n * @example npx lna search \"Polars\"\n * @example npx lna search \"authentication\" --limit 5\n */\n program\n .command('search <query>')\n .description('Search lessons by keyword')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_SEARCH_LIMIT)\n .action(async function (this: Command, query: string, options: { limit: string }) {\n const repoRoot = getRepoRoot();\n const limit = parseLimit(options.limit, 'limit');\n const { verbose, quiet } = getGlobalOpts(this);\n\n // Sync index if JSONL has changed\n await syncIfNeeded(repoRoot);\n\n const results = await searchKeyword(repoRoot, query, limit);\n\n if (results.length === 0) {\n console.log('No lessons match your search. Try a different query or use \"list\" to see all lessons.');\n return;\n }\n\n if (!quiet) {\n out.info(`Found ${results.length} lesson(s):\\n`);\n }\n for (const lesson of results) {\n console.log(`[${chalk.cyan(lesson.id)}] ${lesson.insight}`);\n console.log(` Trigger: ${lesson.trigger}`);\n if (verbose && lesson.context) {\n console.log(` Context: ${lesson.context.tool} - ${lesson.context.intent}`);\n console.log(` Created: ${lesson.created}`);\n }\n if (lesson.tags.length > 0) {\n console.log(` Tags: ${lesson.tags.join(', ')}`);\n }\n console.log();\n }\n });\n\n /**\n * List command - List all lessons.\n *\n * @example npx lna list\n * @example npx lna list --limit 10\n * @example npx lna list --invalidated\n */\n program\n .command('list')\n .description('List all lessons')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_LIST_LIMIT)\n .option('--invalidated', 'Show only invalidated lessons')\n .action(async function (this: Command, options: { limit: string; invalidated?: boolean }) {\n const repoRoot = getRepoRoot();\n const limit = parseLimit(options.limit, 'limit');\n const { verbose, quiet } = getGlobalOpts(this);\n\n const { lessons, skippedCount } = await readLessons(repoRoot);\n\n // Filter for invalidated lessons if flag is set\n const filteredLessons = options.invalidated\n ? lessons.filter((l) => l.invalidatedAt)\n : lessons;\n\n if (filteredLessons.length === 0) {\n if (options.invalidated) {\n console.log('No invalidated lessons found.');\n } else {\n console.log('No lessons found. Get started with: learn \"Your first lesson\"');\n }\n if (skippedCount > 0) {\n out.warn(`${skippedCount} corrupted lesson(s) skipped.`);\n }\n return;\n }\n\n const toShow = filteredLessons.slice(0, limit);\n\n // Show summary unless quiet mode\n if (!quiet) {\n const label = options.invalidated ? 'invalidated lesson(s)' : 'lesson(s)';\n out.info(`Showing ${toShow.length} of ${filteredLessons.length} ${label}:\\n`);\n }\n\n for (const lesson of toShow) {\n const invalidMarker = lesson.invalidatedAt ? chalk.red('[INVALID] ') : '';\n console.log(`[${chalk.cyan(lesson.id)}] ${invalidMarker}${lesson.insight}`);\n if (verbose) {\n console.log(` Type: ${lesson.type} | Source: ${lesson.source}`);\n console.log(` Created: ${lesson.created}`);\n if (lesson.context) {\n console.log(` Context: ${lesson.context.tool} - ${lesson.context.intent}`);\n }\n if (lesson.invalidatedAt) {\n console.log(` Invalidated: ${lesson.invalidatedAt}`);\n if (lesson.invalidationReason) {\n console.log(` Reason: ${lesson.invalidationReason}`);\n }\n }\n } else {\n console.log(` Type: ${lesson.type} | Source: ${lesson.source}`);\n }\n if (lesson.tags.length > 0) {\n console.log(` Tags: ${lesson.tags.join(', ')}`);\n }\n console.log();\n }\n\n if (skippedCount > 0) {\n out.warn(`${skippedCount} corrupted lesson(s) skipped.`);\n }\n });\n\n /**\n * Load-session command - Load high-severity lessons for session startup.\n *\n * Used by Claude Code hooks to inject critical lessons at session start.\n * Returns lessons sorted by severity/recency for immediate context.\n *\n * @example npx lna load-session --json\n */\n program\n .command('load-session')\n .description('Load high-severity lessons for session context')\n .option('--json', 'Output as JSON')\n .action(async function (this: Command, options: { json?: boolean }) {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(this);\n const lessons = await loadSessionLessons(repoRoot);\n\n // Get total lesson count for context pollution warning\n const { lessons: allLessons } = await readLessons(repoRoot);\n const totalCount = allLessons.length;\n\n if (options.json) {\n console.log(JSON.stringify({ lessons, count: lessons.length, totalCount }));\n return;\n }\n\n if (lessons.length === 0) {\n console.log('No high-severity lessons found.');\n return;\n }\n\n outputSessionLessonsHuman(lessons, quiet);\n\n // Show count note if total lessons exceed threshold\n if (totalCount > LESSON_COUNT_WARNING_THRESHOLD) {\n console.log('');\n out.info(`${totalCount} lessons in index. Consider \\`lna compact\\` to reduce context pollution.`);\n }\n\n // Show age warnings for old lessons\n const oldLessons = lessons.filter((l) => getLessonAgeDays(l) > AGE_FLAG_THRESHOLD_DAYS);\n if (oldLessons.length > 0) {\n console.log('');\n out.warn(`${oldLessons.length} lesson(s) are over ${AGE_FLAG_THRESHOLD_DAYS} days old. Review for continued validity.`);\n }\n });\n\n /**\n * Check-plan command - Check a plan against relevant lessons.\n *\n * Used by Claude Code hooks during plan mode to retrieve lessons\n * that are semantically relevant to the proposed implementation.\n *\n * @example echo \"Add authentication\" | npx lna check-plan --json\n * @example npx lna check-plan --plan \"Refactor the API\"\n */\n program\n .command('check-plan')\n .description('Check plan against relevant lessons')\n .option('--plan <text>', 'Plan text to check')\n .option('--json', 'Output as JSON')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_CHECK_PLAN_LIMIT)\n .action(async function (this: Command, options: { plan?: string; json?: boolean; limit: string }) {\n const repoRoot = getRepoRoot();\n const limit = parseLimit(options.limit, 'limit');\n const { quiet } = getGlobalOpts(this);\n\n // Get plan text from --plan flag or stdin\n const planText = options.plan ?? (await readPlanFromStdin());\n\n if (!planText) {\n out.error('No plan provided. Use --plan <text> or pipe text to stdin.');\n process.exit(1);\n }\n\n // Check model availability - hard fail if not available\n if (!isModelAvailable()) {\n if (options.json) {\n console.log(JSON.stringify({\n error: 'Embedding model not available',\n action: 'Run: npx lna download-model',\n }));\n } else {\n out.error('Embedding model not available');\n console.log('');\n console.log('Run: npx lna download-model');\n }\n process.exit(1);\n }\n\n try {\n const result = await retrieveForPlan(repoRoot, planText, limit);\n\n if (options.json) {\n outputCheckPlanJson(result.lessons);\n return;\n }\n\n if (result.lessons.length === 0) {\n console.log('No relevant lessons found for this plan.');\n return;\n }\n\n outputCheckPlanHuman(result.lessons, quiet);\n } catch (err) {\n // Don't mask errors - surface them clearly\n const message = err instanceof Error ? err.message : 'Unknown error';\n if (options.json) {\n console.log(JSON.stringify({ error: message }));\n } else {\n out.error(`Failed to check plan: ${message}`);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * Templates and constants for setup commands.\n */\n\n// ============================================================================\n// Hooks Constants\n// ============================================================================\n\n/** Pre-commit hook reminder message */\nexport const PRE_COMMIT_MESSAGE = `Before committing, have you captured any valuable lessons from this session?\nConsider: corrections, mistakes, or insights worth remembering.\n\nTo capture a lesson:\n npx lna capture --trigger \"what happened\" --insight \"what to do\" --yes`;\n\n/** Pre-commit hook shell script template */\nexport const PRE_COMMIT_HOOK_TEMPLATE = `#!/bin/sh\n# Learning Agent pre-commit hook\n# Reminds Claude to consider capturing lessons before commits\n\nnpx lna hooks run pre-commit\n`;\n\n/** Marker comment to identify our hook */\nexport const HOOK_MARKER = '# Learning Agent pre-commit hook';\n\n/** Block to insert into existing hooks */\nexport const LEARNING_AGENT_HOOK_BLOCK = `\n# Learning Agent pre-commit hook (appended)\nnpx lna hooks run pre-commit\n`;\n\n// ============================================================================\n// Claude Code Hooks Configuration\n// ============================================================================\n\n/** Markers to identify our hook in Claude Code settings (current and legacy) */\nexport const CLAUDE_HOOK_MARKERS = ['lna load-session', 'learning-agent load-session'];\n\n/** Claude Code SessionStart hook configuration */\nexport const CLAUDE_HOOK_CONFIG = {\n matcher: 'startup|resume|compact',\n hooks: [\n {\n type: 'command',\n command: 'npx lna load-session 2>/dev/null || true',\n },\n ],\n};\n\n// ============================================================================\n// Init Command Constants\n// ============================================================================\n\n/** Section header to check for idempotency */\nexport const LEARNING_AGENT_SECTION_HEADER = '## Learning Agent Integration';\n\n// ============================================================================\n// CLAUDE.md Reference Constants (lfy)\n// ============================================================================\n\n/** Start marker for CLAUDE.md reference section */\nexport const CLAUDE_REF_START_MARKER = '<!-- learning-agent:claude-ref:start -->';\n\n/** End marker for CLAUDE.md reference section */\nexport const CLAUDE_REF_END_MARKER = '<!-- learning-agent:claude-ref:end -->';\n\n/** Reference content to add to CLAUDE.md */\nexport const CLAUDE_MD_REFERENCE = `\n${CLAUDE_REF_START_MARKER}\n## Learning Agent\nSee AGENTS.md for lesson capture workflow.\n${CLAUDE_REF_END_MARKER}\n`;\n\n// ============================================================================\n// AGENTS.md Section Markers (e2r)\n// ============================================================================\n\n/** Start marker for AGENTS.md Learning Agent section */\nexport const AGENTS_SECTION_START_MARKER = '<!-- learning-agent:start -->';\n\n/** End marker for AGENTS.md Learning Agent section */\nexport const AGENTS_SECTION_END_MARKER = '<!-- learning-agent:end -->';\n\n/** Template content for AGENTS.md */\nexport const AGENTS_MD_TEMPLATE = `\n${AGENTS_SECTION_START_MARKER}\n## Learning Agent Integration\n\nThis project uses learning-agent for session memory.\n\n### CRITICAL RULES\n\n#### Never Edit JSONL Directly\n\n**WARNING: NEVER edit .claude/lessons/index.jsonl directly.**\n\nThe JSONL file is the source of truth and requires:\n- Proper ID generation\n- Schema validation\n- SQLite index sync\n\nAlways use CLI commands:\n- \\`npx lna learn \"insight\"\\` - Add a lesson\n- \\`npx lna update <id> --insight \"new\"\\` - Modify a lesson\n- \\`npx lna delete <id>\\` - Remove a lesson\n\nManual edits will break validation and corrupt the SQLite sync.\n\n### Retrieval Points\n\n- **Session start**: High-severity lessons loaded automatically\n- **Plan-time**: BEFORE implementing a plan, run check-plan to retrieve relevant lessons\n\n### Plan-Time Retrieval (Explicit Step)\n\n**BEFORE implementing any plan**, run:\n\n\\`\\`\\`bash\nnpx lna check-plan --plan \"your plan description\" --json\n\\`\\`\\`\n\nDisplay results as a **Lessons Check** section after your plan:\n\n\\`\\`\\`\n## Lessons Check\n1. [insight from lesson 1] (relevance: 0.85)\n2. [insight from lesson 2] (relevance: 0.72)\n\\`\\`\\`\n\nConsider each lesson while implementing.\n\n### When to Capture Lessons (Detection Triggers)\n\nWatch for these patterns and propose \\`lna learn\\`:\n\n**User correction**: User says \"no\", \"wrong\", \"actually...\"\n- Action: Propose a lesson capturing the correct approach\n\n**Self-correction**: You fix after multiple attempts (edit -> fail -> re-edit)\n- Action: Propose a lesson about what finally worked\n\n**Test failure fix**: Test fails -> you diagnose -> fix -> passes\n- Action: Propose a lesson about the root cause and solution\n\n### Auto-Invoke Trigger Phrases\n\n**Capture triggers** (propose \\`lna learn\\`):\n- \"that worked\" - User confirms a solution worked\n- \"fixed it\" - Problem was resolved\n- \"my mistake\" - User acknowledges an error\n- \"actually use X\" - User specifies a preference\n\n**Retrieval triggers** (run \\`lna check-plan\\` or \\`lna search\\`):\n- \"similar issue\" - User recalls a past problem\n- \"we had this before\" - Reference to previous experience\n- \"seen this\" - Pattern recognition\n- \"remember when\" - Memory recall request\n\n### Proposing Lessons\n\nPropose when: user correction, self-correction, test failure fix, or manual request.\n\n**Quality gate (ALL must pass):**\n\n- Novel (not already stored)\n- Specific (clear guidance)\n- Actionable (obvious what to do)\n\n**Confirmation format:**\n\n\\`\\`\\`\nLearned: [insight]. Save? [y/n]\n\\`\\`\\`\n\n### Session-End Protocol\n\nBefore closing a session, reflect on lessons learned:\n\n1. **Review**: What mistakes or corrections happened?\n2. **Quality gate**: Is it novel, specific, actionable?\n3. **Propose**: \"Learned: [insight]. Save? [y/n]\"\n4. **Capture**: \\`npx lna capture --trigger \"...\" --insight \"...\" --yes\\`\n\n### CLI Commands\n\n\\`\\`\\`bash\nnpx lna load-session --json # Session start\nnpx lna check-plan --plan \"...\" --json # Before implementing\nnpx lna learn \"insight\" # Capture a lesson\nnpx lna capture --trigger \"...\" --insight \"...\" --yes\n\\`\\`\\`\n\nSee [AGENTS.md](https://github.com/Nathandela/learning_agent/blob/main/AGENTS.md) for full documentation.\n${AGENTS_SECTION_END_MARKER}\n`;\n\n// ============================================================================\n// Slash Commands (8lp, 6nw)\n// ============================================================================\n\n/** Slash command templates for .claude/commands/ */\nexport const SLASH_COMMANDS: Record<string, string> = {\n 'learn.md': `Capture a lesson from this session.\n\nUsage: /learn <insight>\n\nExamples:\n- /learn \"Always use Polars for large CSV files\"\n- /learn \"API requires X-Request-ID header\"\n\n\\`\\`\\`bash\nnpx lna learn \"$ARGUMENTS\"\n\\`\\`\\`\n`,\n 'check-plan.md': `Retrieve relevant lessons for a plan before implementing.\n\nUsage: /check-plan <plan description>\n\n\\`\\`\\`bash\nnpx lna check-plan --plan \"$ARGUMENTS\" --json\n\\`\\`\\`\n`,\n 'list.md': `Show all stored lessons.\n\n\\`\\`\\`bash\nnpx lna list\n\\`\\`\\`\n`,\n 'prime.md': `Load learning-agent workflow context after compaction or context loss.\n\n\\`\\`\\`bash\nnpx lna prime\n\\`\\`\\`\n`,\n 'show.md': `Show details of a specific lesson.\n\nUsage: /show <lesson-id>\n\n\\`\\`\\`bash\nnpx lna show \"$ARGUMENTS\"\n\\`\\`\\`\n`,\n 'wrong.md': `Mark a lesson as incorrect or invalid.\n\nUsage: /wrong <lesson-id>\n\n\\`\\`\\`bash\nnpx lna wrong \"$ARGUMENTS\"\n\\`\\`\\`\n`,\n 'stats.md': `Show learning-agent database statistics and health.\n\n\\`\\`\\`bash\nnpx lna stats\n\\`\\`\\`\n`,\n};\n\n// ============================================================================\n// Plugin Configuration (ctv)\n// ============================================================================\n\n/** Plugin manifest for .claude/plugin.json */\nexport const PLUGIN_MANIFEST = {\n name: 'learning-agent',\n description: 'Session memory for Claude Code - capture and retrieve lessons',\n version: '0.2.2',\n author: {\n name: 'Nathan Delacrétaz',\n url: 'https://github.com/Nathandela',\n },\n repository: 'https://github.com/Nathandela/learning_agent',\n license: 'MIT',\n hooks: {\n SessionStart: [\n {\n matcher: '',\n hooks: [\n { type: 'command', command: 'npx lna prime 2>/dev/null || true' },\n { type: 'command', command: 'npx lna load-session 2>/dev/null || true' },\n ],\n },\n ],\n PreCompact: [\n {\n matcher: '',\n hooks: [{ type: 'command', command: 'npx lna prime 2>/dev/null || true' }],\n },\n ],\n },\n};\n","/**\n * Claude Code settings helpers.\n *\n * Functions for reading, writing, and manipulating Claude Code settings.json.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport {\n AGENTS_SECTION_END_MARKER,\n AGENTS_SECTION_START_MARKER,\n CLAUDE_HOOK_CONFIG,\n CLAUDE_HOOK_MARKERS,\n CLAUDE_REF_END_MARKER,\n CLAUDE_REF_START_MARKER,\n} from './templates.js';\nimport type { ClaudeHooksResult } from './types.js';\n\n/**\n * Get the path to Claude Code settings file.\n *\n * @param global - If true, return global path (~/.claude/settings.json).\n * If false (default), return project-local path (.claude/settings.json).\n */\nexport function getClaudeSettingsPath(global: boolean): string {\n if (global) {\n return join(homedir(), '.claude', 'settings.json');\n }\n const repoRoot = getRepoRoot();\n return join(repoRoot, '.claude', 'settings.json');\n}\n\n/**\n * Read and parse Claude Code settings.\n */\nexport async function readClaudeSettings(settingsPath: string): Promise<Record<string, unknown>> {\n if (!existsSync(settingsPath)) {\n return {};\n }\n const content = await readFile(settingsPath, 'utf-8');\n return JSON.parse(content) as Record<string, unknown>;\n}\n\n/**\n * Check if our hook is already installed.\n * Checks for both current (lna) and legacy (learning-agent) markers.\n */\nexport function hasClaudeHook(settings: Record<string, unknown>): boolean {\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks?.SessionStart) return false;\n\n return hooks.SessionStart.some((entry) => {\n const hookEntry = entry as { hooks?: Array<{ command?: string }> };\n return hookEntry.hooks?.some((h) =>\n CLAUDE_HOOK_MARKERS.some((marker) => h.command?.includes(marker))\n );\n });\n}\n\n/**\n * Add our hook to SessionStart array.\n */\nexport function addLearningAgentHook(settings: Record<string, unknown>): void {\n if (!settings.hooks) {\n settings.hooks = {};\n }\n const hooks = settings.hooks as Record<string, unknown[]>;\n if (!hooks.SessionStart) {\n hooks.SessionStart = [];\n }\n hooks.SessionStart.push(CLAUDE_HOOK_CONFIG);\n}\n\n/**\n * Remove our hook from SessionStart array.\n * Removes both current (lna) and legacy (learning-agent) hooks.\n */\nexport function removeLearningAgentHook(settings: Record<string, unknown>): boolean {\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks?.SessionStart) return false;\n\n const originalLength = hooks.SessionStart.length;\n hooks.SessionStart = hooks.SessionStart.filter((entry) => {\n const hookEntry = entry as { hooks?: Array<{ command?: string }> };\n return !hookEntry.hooks?.some((h) =>\n CLAUDE_HOOK_MARKERS.some((marker) => h.command?.includes(marker))\n );\n });\n\n return hooks.SessionStart.length < originalLength;\n}\n\n/**\n * Write Claude Code settings atomically.\n */\nexport async function writeClaudeSettings(settingsPath: string, settings: Record<string, unknown>): Promise<void> {\n const dir = dirname(settingsPath);\n await mkdir(dir, { recursive: true });\n\n // Write to temp file, then rename (atomic)\n const tempPath = settingsPath + '.tmp';\n await writeFile(tempPath, JSON.stringify(settings, null, 2) + '\\n', 'utf-8');\n await rename(tempPath, settingsPath);\n}\n\n/**\n * Install Claude hooks for init command.\n * Handles errors gracefully - returns error info instead of throwing.\n * @param repoRoot - Repository root path\n * @returns Result indicating success/failure\n */\nexport async function installClaudeHooksForInit(repoRoot: string): Promise<ClaudeHooksResult> {\n const settingsPath = join(repoRoot, '.claude', 'settings.json');\n\n let settings: Record<string, unknown>;\n try {\n settings = await readClaudeSettings(settingsPath);\n } catch {\n return { installed: false, action: 'error', error: 'Failed to parse settings.json' };\n }\n\n if (hasClaudeHook(settings)) {\n return { installed: true, action: 'already_installed' };\n }\n\n try {\n addLearningAgentHook(settings);\n await writeClaudeSettings(settingsPath, settings);\n return { installed: true, action: 'installed' };\n } catch (err) {\n return { installed: false, action: 'error', error: String(err) };\n }\n}\n\n// ============================================================================\n// AGENTS.md and CLAUDE.md Cleanup (e2r)\n// ============================================================================\n\n/**\n * Remove Learning Agent section from AGENTS.md.\n * Uses markers to find and remove the section.\n *\n * @param repoRoot - Repository root path\n * @returns true if section was removed, false if not found\n */\nexport async function removeAgentsSection(repoRoot: string): Promise<boolean> {\n const agentsPath = join(repoRoot, 'AGENTS.md');\n\n if (!existsSync(agentsPath)) {\n return false;\n }\n\n const content = await readFile(agentsPath, 'utf-8');\n const startIdx = content.indexOf(AGENTS_SECTION_START_MARKER);\n const endIdx = content.indexOf(AGENTS_SECTION_END_MARKER);\n\n if (startIdx === -1 || endIdx === -1) {\n return false;\n }\n\n // Remove from start marker to end marker (inclusive)\n const before = content.slice(0, startIdx);\n const after = content.slice(endIdx + AGENTS_SECTION_END_MARKER.length);\n\n // Clean up: remove trailing newlines from before, keep single newline separation\n const newContent = (before.trimEnd() + after).trim();\n\n // Only write if file would not be empty\n if (newContent.length > 0) {\n await writeFile(agentsPath, newContent + '\\n', 'utf-8');\n } else {\n // File would be empty - could optionally delete it\n await writeFile(agentsPath, '', 'utf-8');\n }\n\n return true;\n}\n\n/**\n * Remove Learning Agent reference from CLAUDE.md.\n * Uses markers to find and remove the reference section.\n *\n * @param repoRoot - Repository root path\n * @returns true if reference was removed, false if not found\n */\nexport async function removeClaudeMdReference(repoRoot: string): Promise<boolean> {\n const claudeMdPath = join(repoRoot, '.claude', 'CLAUDE.md');\n\n if (!existsSync(claudeMdPath)) {\n return false;\n }\n\n const content = await readFile(claudeMdPath, 'utf-8');\n const startIdx = content.indexOf(CLAUDE_REF_START_MARKER);\n const endIdx = content.indexOf(CLAUDE_REF_END_MARKER);\n\n if (startIdx === -1 || endIdx === -1) {\n return false;\n }\n\n // Remove from start marker to end marker (inclusive)\n const before = content.slice(0, startIdx);\n const after = content.slice(endIdx + CLAUDE_REF_END_MARKER.length);\n\n // Clean up: remove trailing newlines from before, keep single newline separation\n const newContent = (before.trimEnd() + after).trim();\n\n // Only write if file would not be empty\n if (newContent.length > 0) {\n await writeFile(claudeMdPath, newContent + '\\n', 'utf-8');\n } else {\n await writeFile(claudeMdPath, '', 'utf-8');\n }\n\n return true;\n}\n","/**\n * Setup Claude command - Configure Claude Code SessionStart hooks.\n */\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { out } from '../shared.js';\nimport { getRepoRoot } from '../../cli-utils.js';\nimport {\n addLearningAgentHook,\n getClaudeSettingsPath,\n hasClaudeHook,\n readClaudeSettings,\n removeAgentsSection,\n removeClaudeMdReference,\n removeLearningAgentHook,\n writeClaudeSettings,\n} from './claude-helpers.js';\n\n/** Status check result */\ninterface StatusResult {\n settingsFile: string;\n exists: boolean;\n validJson: boolean;\n hookInstalled: boolean;\n slashCommands: {\n learn: boolean;\n checkPlan: boolean;\n };\n status: 'connected' | 'partial' | 'disconnected';\n}\n\n/**\n * Register the setup claude command on the program.\n */\nexport function registerClaudeCommand(program: Command): void {\n const setupCommand = program.command('setup').description('Setup integrations');\n\n setupCommand\n .command('claude')\n .description('Install Claude Code SessionStart hooks')\n .option('--global', 'Install to global ~/.claude/ instead of project')\n .option('--uninstall', 'Remove learning-agent hooks')\n .option('--status', 'Check status of Claude Code integration')\n .option('--dry-run', 'Show what would change without writing')\n .option('--json', 'Output as JSON')\n .action(async (options: { global?: boolean; uninstall?: boolean; status?: boolean; dryRun?: boolean; json?: boolean }) => {\n const settingsPath = getClaudeSettingsPath(options.global ?? false);\n const displayPath = options.global ? '~/.claude/settings.json' : '.claude/settings.json';\n\n let settings: Record<string, unknown>;\n try {\n settings = await readClaudeSettings(settingsPath);\n } catch {\n if (options.json) {\n console.log(JSON.stringify({ error: 'Failed to parse settings file' }));\n } else {\n out.error('Failed to parse settings file. Check if JSON is valid.');\n }\n process.exit(1);\n }\n\n const alreadyInstalled = hasClaudeHook(settings);\n\n // Handle status check\n if (options.status) {\n const repoRoot = getRepoRoot();\n const learnMdPath = join(repoRoot, '.claude', 'commands', 'learn.md');\n const checkPlanMdPath = join(repoRoot, '.claude', 'commands', 'check-plan.md');\n\n const learnExists = existsSync(learnMdPath);\n const checkPlanExists = existsSync(checkPlanMdPath);\n\n // Determine overall status\n let status: 'connected' | 'partial' | 'disconnected';\n if (alreadyInstalled && learnExists && checkPlanExists) {\n status = 'connected';\n } else if (alreadyInstalled || learnExists || checkPlanExists) {\n status = 'partial';\n } else {\n status = 'disconnected';\n }\n\n const result: StatusResult = {\n settingsFile: displayPath,\n exists: existsSync(settingsPath),\n validJson: true, // We already parsed it above\n hookInstalled: alreadyInstalled,\n slashCommands: {\n learn: learnExists,\n checkPlan: checkPlanExists,\n },\n status,\n };\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log('Claude Code Integration Status');\n console.log('─'.repeat(40));\n console.log('');\n console.log(`Settings file: ${displayPath}`);\n console.log(` ${result.exists ? '[ok]' : '[missing]'} File exists`);\n console.log(` ${result.validJson ? '[ok]' : '[error]'} Valid JSON`);\n console.log(` ${result.hookInstalled ? '[ok]' : '[warn]'} SessionStart hook installed`);\n console.log('');\n console.log('Slash commands:');\n console.log(` ${learnExists ? '[ok]' : '[warn]'} /learn command`);\n console.log(` ${checkPlanExists ? '[ok]' : '[warn]'} /check-plan command`);\n console.log('');\n\n if (status === 'connected') {\n out.success('All checks passed. Integration is connected.');\n } else if (status === 'partial') {\n out.warn('Partial setup detected.');\n console.log('');\n console.log(\"Run 'npx lna init' to complete setup.\");\n } else {\n out.error('Not connected.');\n console.log('');\n console.log(\"Run 'npx lna init' to set up Learning Agent.\");\n }\n }\n return;\n }\n\n // Handle uninstall\n if (options.uninstall) {\n const repoRoot = getRepoRoot();\n\n if (options.dryRun) {\n if (options.json) {\n console.log(JSON.stringify({ dryRun: true, wouldRemove: alreadyInstalled, location: displayPath }));\n } else {\n if (alreadyInstalled) {\n console.log(`Would remove learning-agent hooks from ${displayPath}`);\n } else {\n console.log('No learning-agent hooks to remove');\n }\n }\n return;\n }\n\n const removedHook = removeLearningAgentHook(settings);\n if (removedHook) {\n await writeClaudeSettings(settingsPath, settings);\n }\n\n // Also remove AGENTS.md section and CLAUDE.md reference (e2r)\n const removedAgents = await removeAgentsSection(repoRoot);\n const removedClaudeMd = await removeClaudeMdReference(repoRoot);\n\n const anyRemoved = removedHook || removedAgents || removedClaudeMd;\n\n if (anyRemoved) {\n if (options.json) {\n console.log(JSON.stringify({\n installed: false,\n location: displayPath,\n action: 'removed',\n agentsMdRemoved: removedAgents,\n claudeMdRemoved: removedClaudeMd,\n }));\n } else {\n out.success('Learning agent hooks removed');\n if (removedHook) {\n console.log(` Settings: ${displayPath}`);\n }\n if (removedAgents) {\n console.log(' AGENTS.md: Learning Agent section removed');\n }\n if (removedClaudeMd) {\n console.log(' CLAUDE.md: Learning Agent reference removed');\n }\n }\n } else {\n if (options.json) {\n console.log(JSON.stringify({ installed: false, location: displayPath, action: 'unchanged' }));\n } else {\n out.info('No learning agent hooks to remove');\n // Suggest the other scope if no hooks found\n if (options.global) {\n console.log(' Hint: Try without --global to check project settings.');\n } else {\n console.log(' Hint: Try with --global flag to check global settings.');\n }\n }\n }\n return;\n }\n\n // Handle install\n if (options.dryRun) {\n if (options.json) {\n console.log(JSON.stringify({ dryRun: true, wouldInstall: !alreadyInstalled, location: displayPath }));\n } else {\n if (alreadyInstalled) {\n console.log('Learning agent hooks already installed');\n } else {\n console.log(`Would install learning-agent hooks to ${displayPath}`);\n }\n }\n return;\n }\n\n if (alreadyInstalled) {\n if (options.json) {\n console.log(JSON.stringify({\n installed: true,\n location: displayPath,\n hooks: ['SessionStart'],\n action: 'unchanged',\n }));\n } else {\n out.info('Learning agent hooks already installed');\n console.log(` Location: ${displayPath}`);\n }\n return;\n }\n\n // Add hook\n const fileExists = existsSync(settingsPath);\n addLearningAgentHook(settings);\n await writeClaudeSettings(settingsPath, settings);\n\n if (options.json) {\n console.log(JSON.stringify({\n installed: true,\n location: displayPath,\n hooks: ['SessionStart'],\n action: fileExists ? 'updated' : 'created',\n }));\n } else {\n out.success(options.global ? 'Claude Code hooks installed (global)' : 'Claude Code hooks installed (project-level)');\n console.log(` Location: ${displayPath}`);\n console.log(' Hook: SessionStart (startup|resume|compact)');\n console.log('');\n console.log('Lessons will be loaded automatically at session start.');\n if (!options.global) {\n console.log('');\n console.log('Note: Project hooks override global hooks.');\n }\n }\n });\n}\n","/**\n * Download-model command - Download the embedding model for semantic search.\n */\n\nimport { statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { formatBytes } from '../../cli-utils.js';\nimport { isModelAvailable, MODEL_FILENAME, resolveModel } from '../../index.js';\n\n/**\n * Register the download-model command on the program.\n */\nexport function registerDownloadModelCommand(program: Command): void {\n program\n .command('download-model')\n .description('Download the embedding model for semantic search')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n const alreadyExisted = isModelAvailable();\n\n if (alreadyExisted) {\n // Model already exists - get path and size\n const modelPath = join(homedir(), '.node-llama-cpp', 'models', MODEL_FILENAME);\n const size = statSync(modelPath).size;\n\n if (options.json) {\n console.log(JSON.stringify({ success: true, path: modelPath, size, alreadyExisted: true }));\n } else {\n console.log('Model already exists.');\n console.log(`Path: ${modelPath}`);\n console.log(`Size: ${formatBytes(size)}`);\n }\n return;\n }\n\n // Download the model\n if (!options.json) {\n console.log('Downloading embedding model...');\n }\n\n const modelPath = await resolveModel({ cli: !options.json });\n const size = statSync(modelPath).size;\n\n if (options.json) {\n console.log(JSON.stringify({ success: true, path: modelPath, size, alreadyExisted: false }));\n } else {\n console.log(`\\nModel downloaded successfully!`);\n console.log(`Path: ${modelPath}`);\n console.log(`Size: ${formatBytes(size)}`);\n }\n });\n}\n","/**\n * Hooks command - Git hooks management.\n */\n\nimport { chmodSync, existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { out } from '../shared.js';\nimport {\n HOOK_MARKER,\n LEARNING_AGENT_HOOK_BLOCK,\n PRE_COMMIT_HOOK_TEMPLATE,\n PRE_COMMIT_MESSAGE,\n} from './templates.js';\n\n/** Make hook file executable (mode 0o755) */\nconst HOOK_FILE_MODE = 0o755;\n\n/**\n * Check if a pre-commit hook already exists with our marker.\n */\nfunction hasLearningAgentHook(content: string): boolean {\n return content.includes(HOOK_MARKER);\n}\n\n/**\n * Get the git hooks directory, respecting core.hooksPath if set.\n */\nasync function getGitHooksDir(repoRoot: string): Promise<string | null> {\n const gitDir = join(repoRoot, '.git');\n\n // Check if .git directory exists\n if (!existsSync(gitDir)) {\n return null;\n }\n\n // Check for core.hooksPath in .git/config\n const configPath = join(gitDir, 'config');\n if (existsSync(configPath)) {\n const config = await readFile(configPath, 'utf-8');\n const match = /hooksPath\\s*=\\s*(.+)$/m.exec(config);\n if (match?.[1]) {\n const hooksPath = match[1].trim();\n // Resolve relative paths from repo root\n return hooksPath.startsWith('/') ? hooksPath : join(repoRoot, hooksPath);\n }\n }\n\n // Default to .git/hooks\n const defaultHooksDir = join(gitDir, 'hooks');\n return existsSync(defaultHooksDir) ? defaultHooksDir : null;\n}\n\n/**\n * Find the line index of the first top-level exit statement in a shell script.\n *\n * Top-level means not inside:\n * - Function definitions (between { and })\n * - Heredocs (between <<EOF and EOF)\n *\n * Returns -1 if no top-level exit found.\n */\nexport function findFirstTopLevelExitLine(lines: string[]): number {\n let insideFunction = 0; // Brace nesting depth\n let heredocDelimiter: string | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n const trimmed = line.trim();\n\n // Check for heredoc end\n if (heredocDelimiter !== null) {\n if (trimmed === heredocDelimiter) {\n heredocDelimiter = null;\n }\n continue;\n }\n\n // Check for heredoc start: <<EOF, <<'EOF', <<\"EOF\", <<-EOF\n const heredocMatch = /<<-?\\s*['\"]?(\\w+)['\"]?/.exec(line);\n if (heredocMatch?.[1]) {\n heredocDelimiter = heredocMatch[1];\n continue;\n }\n\n // Track function braces (simple heuristic)\n // Count opening and closing braces\n for (const char of line) {\n if (char === '{') insideFunction++;\n if (char === '}') insideFunction = Math.max(0, insideFunction - 1);\n }\n\n // Skip if inside function\n if (insideFunction > 0) {\n continue;\n }\n\n // Check for top-level exit: exit followed by number, $var, or $?\n // Pattern: start of line, optional whitespace, exit, space, code, end\n if (/^\\s*exit\\s+(\\d+|\\$\\w+|\\$\\?)\\s*$/.test(trimmed)) {\n return i;\n }\n }\n\n return -1;\n}\n\n/**\n * Install pre-commit hook, respecting core.hooksPath and existing hooks.\n *\n * - Respects core.hooksPath when configured\n * - Appends to existing hooks instead of overwriting\n * - Uses marker to ensure idempotency\n */\nexport async function installPreCommitHook(repoRoot: string): Promise<boolean> {\n const gitHooksDir = await getGitHooksDir(repoRoot);\n\n // Skip if not a git repo or no hooks directory\n if (!gitHooksDir) {\n return false;\n }\n\n // Ensure hooks directory exists\n await mkdir(gitHooksDir, { recursive: true });\n\n const hookPath = join(gitHooksDir, 'pre-commit');\n\n // Check if hook already exists\n if (existsSync(hookPath)) {\n const content = await readFile(hookPath, 'utf-8');\n if (hasLearningAgentHook(content)) {\n return false; // Already installed\n }\n\n // Find insertion point: before first top-level exit, or at end\n const lines = content.split('\\n');\n const exitLineIndex = findFirstTopLevelExitLine(lines);\n\n let newContent: string;\n if (exitLineIndex === -1) {\n // No top-level exit found - append to end\n newContent = content.trimEnd() + '\\n' + LEARNING_AGENT_HOOK_BLOCK;\n } else {\n // Insert before the exit line\n const before = lines.slice(0, exitLineIndex);\n const after = lines.slice(exitLineIndex);\n newContent = before.join('\\n') + LEARNING_AGENT_HOOK_BLOCK + after.join('\\n');\n }\n\n await writeFile(hookPath, newContent, 'utf-8');\n chmodSync(hookPath, HOOK_FILE_MODE);\n return true;\n }\n\n // Create new hook file with full template\n await writeFile(hookPath, PRE_COMMIT_HOOK_TEMPLATE, 'utf-8');\n chmodSync(hookPath, HOOK_FILE_MODE);\n\n return true;\n}\n\n/**\n * Register the hooks command on the program.\n */\nexport function registerHooksCommand(program: Command): void {\n const hooksCommand = program.command('hooks').description('Git hooks management');\n\n hooksCommand\n .command('run <hook>')\n .description('Run a hook script (called by git hooks)')\n .option('--json', 'Output as JSON')\n .action((hook: string, options: { json?: boolean }) => {\n if (hook === 'pre-commit') {\n if (options.json) {\n console.log(JSON.stringify({ hook: 'pre-commit', message: PRE_COMMIT_MESSAGE }));\n } else {\n console.log(PRE_COMMIT_MESSAGE);\n }\n } else {\n if (options.json) {\n console.log(JSON.stringify({ error: `Unknown hook: ${hook}` }));\n } else {\n out.error(`Unknown hook: ${hook}`);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * Init command - Initialize learning-agent in a repository.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../../cli-utils.js';\nimport { LESSONS_PATH } from '../../storage/index.js';\nimport { getGlobalOpts, out } from '../shared.js';\nimport { installClaudeHooksForInit } from './claude-helpers.js';\nimport { installPreCommitHook } from './hooks.js';\nimport {\n AGENTS_MD_TEMPLATE,\n CLAUDE_MD_REFERENCE,\n CLAUDE_REF_START_MARKER,\n LEARNING_AGENT_SECTION_HEADER,\n PLUGIN_MANIFEST,\n SLASH_COMMANDS,\n} from './templates.js';\nimport type { ClaudeHooksResult } from './types.js';\n\n/**\n * Check if AGENTS.md already has the Learning Agent section.\n */\nfunction hasLearningAgentSection(content: string): boolean {\n return content.includes(LEARNING_AGENT_SECTION_HEADER);\n}\n\n/**\n * Check if CLAUDE.md already has the Learning Agent reference.\n */\nfunction hasClaudeMdReference(content: string): boolean {\n return content.includes('Learning Agent') || content.includes(CLAUDE_REF_START_MARKER);\n}\n\n/**\n * Ensure CLAUDE.md has a reference to AGENTS.md for Learning Agent workflow.\n * Creates CLAUDE.md if it doesn't exist, appends reference if not present.\n * Uses markers for clean uninstall support.\n */\nasync function ensureClaudeMdReference(repoRoot: string): Promise<boolean> {\n const claudeMdPath = join(repoRoot, '.claude', 'CLAUDE.md');\n\n // Ensure .claude directory exists\n await mkdir(join(repoRoot, '.claude'), { recursive: true });\n\n if (!existsSync(claudeMdPath)) {\n // Create new CLAUDE.md with reference\n const content = `# Project Instructions\n${CLAUDE_MD_REFERENCE}`;\n await writeFile(claudeMdPath, content, 'utf-8');\n return true;\n }\n\n // File exists - check if reference is already present\n const content = await readFile(claudeMdPath, 'utf-8');\n if (hasClaudeMdReference(content)) {\n return false; // Already has reference\n }\n\n // Append reference\n const newContent = content.trimEnd() + '\\n' + CLAUDE_MD_REFERENCE;\n await writeFile(claudeMdPath, newContent, 'utf-8');\n return true;\n}\n\n/**\n * Create the lessons directory structure.\n */\nasync function createLessonsDirectory(repoRoot: string): Promise<void> {\n const lessonsDir = dirname(join(repoRoot, LESSONS_PATH));\n await mkdir(lessonsDir, { recursive: true });\n}\n\n/**\n * Create empty index.jsonl if it doesn't exist.\n */\nasync function createIndexFile(repoRoot: string): Promise<void> {\n const indexPath = join(repoRoot, LESSONS_PATH);\n if (!existsSync(indexPath)) {\n await writeFile(indexPath, '', 'utf-8');\n }\n}\n\n/**\n * Create or update AGENTS.md with Learning Agent section.\n */\nasync function updateAgentsMd(repoRoot: string): Promise<boolean> {\n const agentsPath = join(repoRoot, 'AGENTS.md');\n let content = '';\n let existed = false;\n\n if (existsSync(agentsPath)) {\n content = await readFile(agentsPath, 'utf-8');\n existed = true;\n if (hasLearningAgentSection(content)) {\n return false; // Already has section, no update needed\n }\n }\n\n // Append the template\n const newContent = existed ? content.trimEnd() + '\\n' + AGENTS_MD_TEMPLATE : AGENTS_MD_TEMPLATE.trim() + '\\n';\n await writeFile(agentsPath, newContent, 'utf-8');\n return true;\n}\n\n/**\n * Create plugin.json in .claude/ directory.\n * Idempotent: does not overwrite existing file.\n *\n * @returns true if plugin.json was created\n */\nasync function createPluginManifest(repoRoot: string): Promise<boolean> {\n const pluginPath = join(repoRoot, '.claude', 'plugin.json');\n\n // Ensure .claude directory exists\n await mkdir(join(repoRoot, '.claude'), { recursive: true });\n\n if (existsSync(pluginPath)) {\n return false; // Already exists\n }\n\n await writeFile(pluginPath, JSON.stringify(PLUGIN_MANIFEST, null, 2) + '\\n', 'utf-8');\n return true;\n}\n\n/**\n * Create slash commands in .claude/commands/ directory.\n * Idempotent: does not overwrite existing files.\n *\n * @returns true if any commands were created\n */\nasync function createSlashCommands(repoRoot: string): Promise<boolean> {\n const commandsDir = join(repoRoot, '.claude', 'commands');\n await mkdir(commandsDir, { recursive: true });\n\n let created = false;\n\n for (const [filename, content] of Object.entries(SLASH_COMMANDS)) {\n const filePath = join(commandsDir, filename);\n if (!existsSync(filePath)) {\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\n }\n\n return created;\n}\n\n/**\n * Register the init command on the program.\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command('init')\n .description('Initialize learning-agent in this repository')\n .option('--skip-agents', 'Skip AGENTS.md modification')\n .option('--skip-hooks', 'Skip git hooks installation')\n .option('--skip-claude', 'Skip Claude Code hooks installation')\n .option('--json', 'Output result as JSON')\n .action(async function (this: Command, options: { skipAgents?: boolean; skipHooks?: boolean; skipClaude?: boolean; json?: boolean }) {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(this);\n\n // Create directory structure\n await createLessonsDirectory(repoRoot);\n await createIndexFile(repoRoot);\n const lessonsDir = dirname(join(repoRoot, LESSONS_PATH));\n\n // Update AGENTS.md unless skipped\n let agentsMdUpdated = false;\n if (!options.skipAgents) {\n agentsMdUpdated = await updateAgentsMd(repoRoot);\n }\n\n // Ensure CLAUDE.md has reference to AGENTS.md (lfy)\n if (!options.skipAgents) {\n await ensureClaudeMdReference(repoRoot);\n }\n\n // Create slash commands unless skipped (8lp, 6nw)\n let slashCommandsCreated = false;\n if (!options.skipAgents) {\n slashCommandsCreated = await createSlashCommands(repoRoot);\n }\n\n // Create plugin manifest (ctv)\n if (!options.skipAgents) {\n await createPluginManifest(repoRoot);\n }\n\n // Install git hooks unless skipped\n let hooksInstalled = false;\n if (!options.skipHooks) {\n hooksInstalled = await installPreCommitHook(repoRoot);\n }\n\n // Install Claude hooks unless skipped (f8a)\n let claudeHooksResult: ClaudeHooksResult = { installed: false, action: 'error', error: 'skipped' };\n if (!options.skipClaude) {\n claudeHooksResult = await installClaudeHooksForInit(repoRoot);\n }\n\n // Output\n if (options.json) {\n // claudeHooks: true only if we actually installed (not already_installed)\n const claudeHooksInstalled = claudeHooksResult.action === 'installed';\n console.log(JSON.stringify({\n initialized: true,\n lessonsDir,\n agentsMd: agentsMdUpdated,\n slashCommands: slashCommandsCreated || !options.skipAgents,\n hooks: hooksInstalled,\n claudeHooks: claudeHooksInstalled,\n }));\n } else if (!quiet) {\n out.success('Learning agent initialized');\n console.log(` Lessons directory: ${lessonsDir}`);\n if (agentsMdUpdated) {\n console.log(' AGENTS.md: Updated with Learning Agent section');\n } else if (options.skipAgents) {\n console.log(' AGENTS.md: Skipped (--skip-agents)');\n } else {\n console.log(' AGENTS.md: Already has Learning Agent section');\n }\n if (slashCommandsCreated) {\n console.log(' Slash commands: Created (/learn, /check-plan, /list, /prime)');\n } else if (options.skipAgents) {\n console.log(' Slash commands: Skipped (--skip-agents)');\n } else {\n console.log(' Slash commands: Already exist');\n }\n if (hooksInstalled) {\n console.log(' Git hooks: pre-commit hook installed');\n } else if (options.skipHooks) {\n console.log(' Git hooks: Skipped (--skip-hooks)');\n } else {\n console.log(' Git hooks: Already installed or not a git repo');\n }\n // Claude hooks status\n if (options.skipClaude) {\n console.log(' Claude hooks: Skipped (--skip-claude)');\n } else if (claudeHooksResult.action === 'installed') {\n console.log(' Claude hooks: Installed to .claude/settings.json');\n } else if (claudeHooksResult.action === 'already_installed') {\n console.log(' Claude hooks: Already installed');\n } else if (claudeHooksResult.error) {\n console.log(` Claude hooks: Error - ${claudeHooksResult.error}`);\n }\n }\n });\n}\n","/**\n * Setup commands barrel export.\n *\n * Re-exports the registerSetupCommands function and types.\n */\n\nimport type { Command } from 'commander';\n\nimport { registerClaudeCommand } from './claude.js';\nimport { registerDownloadModelCommand } from './download-model.js';\nimport { registerHooksCommand } from './hooks.js';\nimport { registerInitCommand } from './init.js';\n\n// Re-export types\nexport type { ClaudeHooksResult } from './types.js';\n\n// Re-export templates for tests\nexport { AGENTS_MD_TEMPLATE } from './templates.js';\n\n/**\n * Register all setup commands on the program.\n */\nexport function registerSetupCommands(program: Command): void {\n registerInitCommand(program);\n registerHooksCommand(program);\n registerClaudeCommand(program);\n registerDownloadModelCommand(program);\n}\n","#!/usr/bin/env node\n/**\n * Learning Agent CLI\n *\n * Repository-scoped learning system for Claude Code.\n *\n * Commands:\n * Capture: learn, capture, detect\n * Retrieval: search, list, check-plan, load-session\n * Management: wrong, validate, compact, stats, rebuild, export, import, show, update, delete\n * Setup: init, setup claude, hooks, download-model\n */\n\nimport { Command } from 'commander';\n\nimport {\n registerCaptureCommands,\n registerManagementCommands,\n registerRetrievalCommands,\n registerSetupCommands,\n} from './commands/index.js';\nimport { VERSION } from './index.js';\nimport { closeDb } from './storage/index.js';\n\n// ============================================================================\n// Resource Cleanup\n// ============================================================================\n\n/**\n * Cleanup function to release database resources.\n * Safe to call even if database was never opened.\n *\n * Note: We only close the SQLite database here. The embedding model\n * (node-llama-cpp) handles its own cleanup and calling unloadEmbedding()\n * during signal handlers can cause issues with the native addon.\n */\nfunction cleanup(): void {\n try {\n closeDb();\n } catch {\n // Ignore errors - database may never have been opened\n }\n}\n\n// Register cleanup for interrupt signals only (not 'exit')\n// The 'exit' handler can interfere with normal process shutdown\nprocess.on('SIGINT', () => {\n cleanup();\n process.exit(0);\n});\nprocess.on('SIGTERM', () => {\n cleanup();\n process.exit(0);\n});\n\n// ============================================================================\n// Program Setup\n// ============================================================================\n\nconst program = new Command();\n\n// Add global options\nprogram\n .option('-v, --verbose', 'Show detailed output')\n .option('-q, --quiet', 'Suppress non-essential output');\n\nprogram\n .name('learning-agent')\n .description('Repository-scoped learning system for Claude Code')\n .version(VERSION);\n\n// ============================================================================\n// Register Command Modules\n// ============================================================================\n\nregisterCaptureCommands(program);\nregisterRetrievalCommands(program);\nregisterManagementCommands(program);\nregisterSetupCommands(program);\n\n// ============================================================================\n// Parse and Execute\n// ============================================================================\n\nprogram.parse();\n"]}
|