unforgit 0.1.0 → 0.3.1

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/utils.ts","../src/logger.ts","../src/ide-integration.ts","../src/commands/add.ts","../src/exit-codes.ts","../src/commands/recall.ts","../src/commands/promote.ts","../src/commands/consolidate.ts","../src/commands/deprecate.ts","../src/commands/supersede.ts","../src/commands/delete.ts","../src/commands/web.ts","../src/commands/link.ts","../src/commands/merge.ts","../src/commands/auto-consolidate.ts","../src/commands/unconsolidate.ts","../src/commands/status.ts","../src/commands/push.ts","../src/commands/pull.ts","../src/commands/remote.ts","../src/commands/log.ts","../src/commands/diff.ts","../src/commands/keys.ts","../src/commands/auth.ts","../src/commands/config.ts","../src/commands/embeddings.ts","../src/commands/reset.ts","../src/commands/doctor.ts","../src/commands/completion.ts","../src/commands/curate.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { recallCommand } from \"./commands/recall.js\";\nimport { promoteCommand } from \"./commands/promote.js\";\nimport { consolidateCommand } from \"./commands/consolidate.js\";\nimport { deprecateCommand } from \"./commands/deprecate.js\";\nimport { supersedeCommand } from \"./commands/supersede.js\";\nimport { deleteCommand, restoreCommand } from \"./commands/delete.js\";\nimport { webCommand } from \"./commands/web.js\";\nimport { linkCommand, unlinkCommand, linksCommand } from \"./commands/link.js\";\nimport {\n mergeCommand,\n remergeCommand,\n similarCommand,\n historyCommand,\n} from \"./commands/merge.js\";\nimport { autoConsolidateCommand } from \"./commands/auto-consolidate.js\";\nimport { unconsolidateCommand } from \"./commands/unconsolidate.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { pushCommand } from \"./commands/push.js\";\nimport { pullCommand } from \"./commands/pull.js\";\nimport { remoteCommand } from \"./commands/remote.js\";\nimport { logCommand } from \"./commands/log.js\";\nimport { diffCommand } from \"./commands/diff.js\";\nimport { keysCommand } from \"./commands/keys.js\";\nimport { authCommand } from \"./commands/auth.js\";\nimport { configCommand } from \"./commands/config.js\";\nimport { embeddingsCommand } from \"./commands/embeddings.js\";\nimport { resetCommand } from \"./commands/reset.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { completionCommand } from \"./commands/completion.js\";\nimport { curateCommand } from \"./commands/curate.js\";\nimport { createRequire } from \"node:module\";\nimport { setVerbosity } from \"./logger.js\";\nimport { EXIT_ERROR, EXIT_SIGINT, EXIT_SIGTERM } from \"./exit-codes.js\";\nimport { setJsonMode } from \"./utils.js\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\");\n\nconst cleanupHandlers: Array<() => void> = [];\nexport function registerCleanup(fn: () => void) {\n cleanupHandlers.push(fn);\n}\nexport function unregisterCleanup(fn: () => void) {\n const idx = cleanupHandlers.indexOf(fn);\n if (idx >= 0) cleanupHandlers.splice(idx, 1);\n}\n\nfunction runCleanup() {\n for (const fn of cleanupHandlers) {\n try { fn(); } catch { /* best-effort */ }\n }\n}\n\nprocess.on(\"SIGINT\", () => { runCleanup(); process.exit(EXIT_SIGINT); });\nprocess.on(\"SIGTERM\", () => { runCleanup(); process.exit(EXIT_SIGTERM); });\nprocess.on(\"uncaughtException\", (err) => {\n console.error(`fatal: ${err.message}`);\n runCleanup();\n process.exit(EXIT_ERROR);\n});\nprocess.on(\"unhandledRejection\", (err) => {\n console.error(`fatal: ${err instanceof Error ? err.message : err}`);\n runCleanup();\n process.exit(EXIT_ERROR);\n});\n\nconst program = new Command();\n\nprogram\n .name(\"unforgit\")\n .description(\"Unforgit — repository memory for agents and developers\")\n .version(pkg.version)\n .option(\"--verbose\", \"Enable verbose output\")\n .option(\"--quiet\", \"Suppress non-essential output\")\n .option(\"--json\", \"Output results as JSON (for scripting)\")\n .hook(\"preAction\", () => {\n const opts = program.opts();\n if (opts.quiet) setVerbosity(0);\n else if (opts.verbose) setVerbosity(2);\n if (opts.json) setJsonMode(true);\n });\n\nprogram.addCommand(initCommand);\nprogram.addCommand(addCommand);\nprogram.addCommand(recallCommand);\nprogram.addCommand(promoteCommand);\nprogram.addCommand(consolidateCommand);\nprogram.addCommand(deprecateCommand);\nprogram.addCommand(supersedeCommand);\nprogram.addCommand(webCommand);\nprogram.addCommand(linkCommand);\nprogram.addCommand(unlinkCommand);\nprogram.addCommand(linksCommand);\nprogram.addCommand(mergeCommand);\nprogram.addCommand(remergeCommand);\nprogram.addCommand(similarCommand);\nprogram.addCommand(historyCommand);\nprogram.addCommand(deleteCommand);\nprogram.addCommand(restoreCommand);\nprogram.addCommand(autoConsolidateCommand);\nprogram.addCommand(unconsolidateCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(pushCommand);\nprogram.addCommand(pullCommand);\nprogram.addCommand(remoteCommand);\nprogram.addCommand(logCommand);\nprogram.addCommand(diffCommand);\nprogram.addCommand(keysCommand);\nprogram.addCommand(authCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(embeddingsCommand);\nprogram.addCommand(resetCommand);\nprogram.addCommand(doctorCommand);\nprogram.addCommand(curateCommand);\nprogram.addCommand(completionCommand);\n\nprogram.parseAsync().catch((err) => {\n console.error(`fatal: ${err instanceof Error ? err.message : err}`);\n runCleanup();\n process.exit(EXIT_ERROR);\n});\n","import fs from \"node:fs\";\nimport { Command } from \"commander\";\nimport { logger } from \"../logger.js\";\nimport {\n getDataDir,\n getConfigPath,\n getDbPath,\n defaultConfig,\n saveConfig,\n isInitialized,\n detectGitInfo,\n} from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport {\n detectIdes,\n setupIdes,\n logIdeResults,\n parseIdeOption,\n ALL_IDE_NAMES,\n type IdeName,\n} from \"../ide-integration.js\";\n\nexport const initCommand = new Command(\"init\")\n .description(\"Initialize Unforgit in the current repository\")\n .option(\"--org-id <orgId>\", \"Override auto-detected organization ID\")\n .option(\"--repo-id <repoId>\", \"Override auto-detected repository ID\")\n .option(\"--remote-url <url>\", \"Remote API URL\", \"http://localhost:3737\")\n .option(\n \"--ide <ides>\",\n `IDE integrations to set up: ${ALL_IDE_NAMES.join(\", \")}, all (default: auto-detect)`,\n )\n .option(\"--no-ide\", \"Skip all IDE integrations\")\n .option(\"--no-cursor-rule\", \"Skip IDE integrations (deprecated, use --no-ide)\")\n .action((opts) => {\n const cwd = process.cwd();\n\n if (isInitialized(cwd)) {\n logger.info(\"Unforgit is already initialized in this directory.\");\n return;\n }\n\n const dataDir = getDataDir(cwd);\n fs.mkdirSync(dataDir, { recursive: true });\n\n const git = detectGitInfo(cwd);\n const config = defaultConfig();\n\n config.remote.orgId = opts.orgId ?? git.orgId;\n config.remote.repoId = opts.repoId ?? git.repoId;\n if (opts.remoteUrl) config.remote.url = opts.remoteUrl;\n\n saveConfig(config, cwd);\n\n const store = new LocalStore(getDbPath(cwd));\n store.close();\n\n logger.info(`Initialized Unforgit at ${dataDir}`);\n logger.info(` Config: ${getConfigPath(cwd)}`);\n logger.info(` Local DB: ${getDbPath(cwd)}`);\n\n if (config.remote.orgId || config.remote.repoId) {\n logger.info(` Org: ${config.remote.orgId}`);\n logger.info(` Repo: ${config.remote.repoId}`);\n if (!opts.orgId && !opts.repoId) {\n logger.info(\" (auto-detected from git remote)\");\n }\n } else {\n logger.info(\n \"\\nTip: Set org_id and repo_id in .unforgit/unforgit.yaml or add a git remote.\",\n );\n }\n\n const skipIde = opts.ide === false || opts.cursorRule === false;\n\n if (!skipIde) {\n let ides: IdeName[];\n\n if (opts.ide && typeof opts.ide === \"string\") {\n ides = parseIdeOption(opts.ide);\n } else {\n ides = detectIdes(cwd);\n if (ides.length === 0) {\n ides = [\"cursor\"];\n logger.info(\n \"\\n No IDE detected, defaulting to Cursor. Use --ide to specify.\",\n );\n } else {\n logger.info(\n `\\n Auto-detected IDEs: ${ides.join(\", \")}`,\n );\n }\n }\n\n const results = setupIdes(cwd, ides);\n logIdeResults(results);\n } else {\n logger.info(\"\\n IDE integration: skipped\");\n }\n });\n","import readline from \"node:readline\";\n\nexport function truncate(text: string, maxLength: number): string {\n const singleLine = text.replace(/\\n/g, \" \").trim();\n if (singleLine.length <= maxLength) return singleLine;\n return singleLine.slice(0, maxLength - 3) + \"...\";\n}\n\nexport function maskKey(key: string): string {\n if (key.length <= 10) return \"***\";\n return `${key.slice(0, 6)}...${key.slice(-4)}`;\n}\n\nexport function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (yes/no): `, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === \"yes\");\n });\n });\n}\n\nlet jsonMode = false;\n\nexport function setJsonMode(enabled: boolean): void {\n jsonMode = enabled;\n}\n\nexport function isJsonMode(): boolean {\n return jsonMode;\n}\n\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function paginate<T>(items: T[], page: number, perPage: number): { items: T[]; totalPages: number; currentPage: number; total: number } {\n const total = items.length;\n const totalPages = Math.ceil(total / perPage);\n const currentPage = Math.min(page, totalPages);\n const start = (currentPage - 1) * perPage;\n return {\n items: items.slice(start, start + perPage),\n totalPages,\n currentPage,\n total,\n };\n}\n","import { isJsonMode } from \"./utils.js\";\n\ntype Verbosity = 0 | 1 | 2;\n\nlet level: Verbosity = 1;\n\nexport function setVerbosity(v: Verbosity): void {\n level = v;\n}\n\nexport function getVerbosity(): Verbosity {\n return level;\n}\n\nconst REDACTED = \"[REDACTED]\";\n\nconst secretPatterns: RegExp[] = [\n /\\b([A-Z][A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD))\\s*=\\s*([^\\s]+)/gi,\n /\\b(authorization\\s*:\\s*bearer)\\s+([^\\s]+)/gi,\n /\\b(client_secret)\\s*=\\s*([^\\s&]+)/gi,\n /(postgres(?:ql)?:\\/\\/[^:\\s/@]+:)([^@\\s]+)(@)/gi,\n];\n\nexport function redactSecrets(msg: string): string {\n return msg\n .replace(secretPatterns[0], (_match, prefix) => `${prefix}=${REDACTED}`)\n .replace(secretPatterns[1], (_match, prefix) => `${prefix} ${REDACTED}`)\n .replace(secretPatterns[2], (_match, prefix) => `${prefix}=${REDACTED}`)\n .replace(secretPatterns[3], (_match, prefix, _secret, suffix) => `${prefix}${REDACTED}${suffix}`);\n}\n\nfunction safeMessage(msg: string): string {\n return redactSecrets(msg);\n}\n\nexport const logger = {\n fatal(msg: string): void {\n if (!isJsonMode()) console.error(`fatal: ${safeMessage(msg)}`);\n },\n\n error(msg: string): void {\n if (!isJsonMode()) console.error(`error: ${safeMessage(msg)}`);\n },\n\n warn(msg: string): void {\n if (level >= 1 && !isJsonMode()) console.error(`warning: ${safeMessage(msg)}`);\n },\n\n info(msg: string): void {\n if (level >= 1 && !isJsonMode()) console.log(safeMessage(msg));\n },\n\n debug(msg: string): void {\n if (level >= 2 && !isJsonMode()) console.error(`debug: ${safeMessage(msg)}`);\n },\n\n progress(current: number, total: number, label?: string): void {\n if (level >= 1 && !isJsonMode()) {\n const pct = total > 0 ? Math.round((current / total) * 100) : 0;\n const suffix = label ? ` ${safeMessage(label)}` : \"\";\n process.stdout.write(`\\rProcessing ${current}/${total} (${pct}%)${suffix}`);\n if (current === total) process.stdout.write(\"\\n\");\n }\n },\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { logger } from \"./logger.js\";\n\nexport type IdeName = \"cursor\" | \"claude\" | \"vscode\" | \"windsurf\";\n\nexport const ALL_IDE_NAMES: IdeName[] = [\n \"cursor\",\n \"claude\",\n \"vscode\",\n \"windsurf\",\n];\n\nconst UNFORGIT_MARKER = \"Unforgit Memory Integration\";\n\nconst MEMORY_INSTRUCTIONS = `# Unforgit Memory Integration\n\nYou have access to \\`unforgit_recall\\` and \\`unforgit_add\\` MCP tools for persistent repository memory across sessions.\n\n## 1. Recall at the Start\n\nAt the **beginning of every conversation**, use the \\`unforgit_recall\\` tool with a query based on the user's first message to retrieve relevant context from past sessions.\n\nUse recalled memories to avoid repeating past mistakes, follow known conventions, and apply previous decisions.\n\n## 2. Save During the Conversation\n\nSave memories **as soon as something noteworthy happens** — don't wait until the end.\n\nTrigger a save with the \\`unforgit_add\\` tool immediately after:\n- A bug is found and fixed\n- An architectural or design decision is made\n- A non-obvious gotcha or workaround is discovered\n- A new convention or pattern is established\n- A deployment/setup procedure is figured out\n\n### Memory types\n\n| Type | When | Example |\n|------|------|---------|\n| \\`semantic\\` | Decisions, conventions, architecture facts | \"We use UTC timestamps everywhere\" |\n| \\`procedural\\` | Workflows, how-tos, playbooks | \"To deploy: run make release, then kubectl apply\" |\n| \\`episodic\\` | Bugs found, gotchas, observations | \"Found race condition in queue worker\" |\n\n### Rules\n\n- Keep text concise but self-contained — a future reader should understand it without extra context\n- Use meaningful tags for discoverability (e.g. \\`[\"auth\", \"bug\"]\\`, \\`[\"deploy\", \"playbook\"]\\`)\n- Prefer \\`semantic\\` for stable facts, \\`procedural\\` for how-tos, \\`episodic\\` for transient observations\n- Do NOT save trivial changes, obvious things, or info already in the codebase docs\n- Quality over quantity — only save what's genuinely useful for future sessions\n- **Always write memory text in English**, regardless of the language the user is speaking`;\n\ninterface SetupAction {\n path: string;\n action: \"created\" | \"updated\" | \"exists\";\n}\n\ninterface IdeSetupResult {\n ide: IdeName;\n rules?: SetupAction;\n mcp?: SetupAction;\n}\n\nfunction fileContainsUnforgit(filePath: string): boolean {\n if (!fs.existsSync(filePath)) return false;\n return fs.readFileSync(filePath, \"utf-8\").includes(UNFORGIT_MARKER);\n}\n\nfunction upsertJsonMcp(\n filePath: string,\n serverKey: string,\n mcpEntry: Record<string, unknown>,\n): SetupAction {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n\n if (!fs.existsSync(filePath)) {\n const config = { [serverKey]: { unforgit: mcpEntry } };\n fs.writeFileSync(filePath, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n return { path: filePath, action: \"created\" };\n }\n\n const existing = JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n const servers = existing[serverKey];\n if (servers?.unforgit) {\n return { path: filePath, action: \"exists\" };\n }\n\n existing[serverKey] = existing[serverKey] || {};\n existing[serverKey].unforgit = mcpEntry;\n fs.writeFileSync(\n filePath,\n JSON.stringify(existing, null, 2) + \"\\n\",\n \"utf-8\",\n );\n return { path: filePath, action: \"updated\" };\n}\n\nfunction appendOrCreateMarkdown(\n filePath: string,\n content: string,\n): SetupAction {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n\n if (!fs.existsSync(filePath)) {\n fs.writeFileSync(filePath, content + \"\\n\", \"utf-8\");\n return { path: filePath, action: \"created\" };\n }\n\n if (fileContainsUnforgit(filePath)) {\n return { path: filePath, action: \"exists\" };\n }\n\n const existing = fs.readFileSync(filePath, \"utf-8\");\n const separator = existing.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n fs.writeFileSync(filePath, existing + separator + content + \"\\n\", \"utf-8\");\n return { path: filePath, action: \"updated\" };\n}\n\n// --- Cursor ---\n\nconst CURSOR_RULE_CONTENT = `---\ndescription: Auto-manage repository memory with Unforgit via MCP tools\nalwaysApply: true\n---\n\n${MEMORY_INSTRUCTIONS}\n`;\n\nfunction setupCursor(cwd: string): IdeSetupResult {\n const rulesDir = path.join(cwd, \".cursor\", \"rules\");\n const rulePath = path.join(rulesDir, \"unforgit-memory.mdc\");\n\n let rules: SetupAction;\n if (fileContainsUnforgit(rulePath)) {\n rules = { path: rulePath, action: \"exists\" };\n } else {\n fs.mkdirSync(rulesDir, { recursive: true });\n fs.writeFileSync(rulePath, CURSOR_RULE_CONTENT, \"utf-8\");\n rules = { path: rulePath, action: \"created\" };\n }\n\n const mcpPath = path.join(cwd, \".cursor\", \"mcp.json\");\n const mcp = upsertJsonMcp(mcpPath, \"mcpServers\", {\n command: \"unforgit-mcp\",\n args: [],\n });\n\n return { ide: \"cursor\", rules, mcp };\n}\n\n// --- Claude Code ---\n\nfunction setupClaude(cwd: string): IdeSetupResult {\n const claudeMdPath = path.join(cwd, \"CLAUDE.md\");\n const rules = appendOrCreateMarkdown(claudeMdPath, MEMORY_INSTRUCTIONS);\n\n const mcpPath = path.join(cwd, \".mcp.json\");\n const mcp = upsertJsonMcp(mcpPath, \"mcpServers\", {\n command: \"unforgit-mcp\",\n args: [],\n });\n\n return { ide: \"claude\", rules, mcp };\n}\n\n// --- VS Code (GitHub Copilot) ---\n\nfunction setupVscode(cwd: string): IdeSetupResult {\n const instructionsPath = path.join(\n cwd,\n \".github\",\n \"copilot-instructions.md\",\n );\n const rules = appendOrCreateMarkdown(instructionsPath, MEMORY_INSTRUCTIONS);\n\n const mcpPath = path.join(cwd, \".vscode\", \"mcp.json\");\n const mcp = upsertJsonMcp(mcpPath, \"servers\", {\n type: \"stdio\",\n command: \"unforgit-mcp\",\n });\n\n return { ide: \"vscode\", rules, mcp };\n}\n\n// --- Windsurf ---\n\nconst WINDSURF_RULE_CONTENT = `${MEMORY_INSTRUCTIONS}\n`;\n\nfunction setupWindsurf(cwd: string): IdeSetupResult {\n const rulesPath = path.join(cwd, \".windsurfrules\");\n const rules = appendOrCreateMarkdown(rulesPath, WINDSURF_RULE_CONTENT);\n\n const mcpPath = path.join(cwd, \".windsurf\", \"mcp.json\");\n const mcp = upsertJsonMcp(mcpPath, \"mcpServers\", {\n command: \"unforgit-mcp\",\n args: [],\n });\n\n return { ide: \"windsurf\", rules, mcp };\n}\n\n// --- Detection ---\n\nconst IDE_INDICATORS: Record<IdeName, string[]> = {\n cursor: [\".cursor\"],\n claude: [\"CLAUDE.md\", \".claude\"],\n vscode: [\".vscode\"],\n windsurf: [\".windsurf\", \".windsurfrules\"],\n};\n\nexport function detectIdes(cwd: string): IdeName[] {\n const detected: IdeName[] = [];\n for (const [ide, indicators] of Object.entries(IDE_INDICATORS)) {\n for (const indicator of indicators) {\n if (fs.existsSync(path.join(cwd, indicator))) {\n detected.push(ide as IdeName);\n break;\n }\n }\n }\n return detected;\n}\n\nconst IDE_HANDLERS: Record<IdeName, (cwd: string) => IdeSetupResult> = {\n cursor: setupCursor,\n claude: setupClaude,\n vscode: setupVscode,\n windsurf: setupWindsurf,\n};\n\nconst IDE_LABELS: Record<IdeName, string> = {\n cursor: \"Cursor\",\n claude: \"Claude Code\",\n vscode: \"VS Code (Copilot)\",\n windsurf: \"Windsurf\",\n};\n\nexport function setupIdes(cwd: string, ides: IdeName[]): IdeSetupResult[] {\n const results: IdeSetupResult[] = [];\n for (const ide of ides) {\n const handler = IDE_HANDLERS[ide];\n const result = handler(cwd);\n results.push(result);\n }\n return results;\n}\n\nexport function logIdeResults(results: IdeSetupResult[]): void {\n if (results.length === 0) {\n logger.info(\" IDE integration: skipped\");\n return;\n }\n\n for (const result of results) {\n const label = IDE_LABELS[result.ide];\n logger.info(` ${label}:`);\n if (result.rules) {\n const verb =\n result.rules.action === \"exists\" ? \"already exists\" : result.rules.action;\n logger.info(` Rules: ${verb} → ${result.rules.path}`);\n }\n if (result.mcp) {\n const verb =\n result.mcp.action === \"exists\" ? \"already configured\" : result.mcp.action;\n logger.info(` MCP: ${verb} → ${result.mcp.path}`);\n }\n }\n}\n\nexport function parseIdeOption(value: string): IdeName[] {\n if (value === \"all\") return [...ALL_IDE_NAMES];\n const names = value.split(\",\").map((s) => s.trim().toLowerCase());\n const valid: IdeName[] = [];\n for (const name of names) {\n if (ALL_IDE_NAMES.includes(name as IdeName)) {\n valid.push(name as IdeName);\n } else {\n logger.warn(`Unknown IDE: \"${name}\". Valid options: ${ALL_IDE_NAMES.join(\", \")}`);\n }\n }\n return valid;\n}\n\nexport { CURSOR_RULE_CONTENT };\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { LocalStore } from \"unforgit-db\";\nimport { resolveVisibility } from \"unforgit-core\";\nimport { applyLifecycleDefaults } from \"unforgit-core\";\nimport type { MemoryType } from \"unforgit-shared\";\nimport { getTemplate, applyTemplate, formatTemplateList } from \"unforgit-core\";\nimport { validateMemoryType, parseConfidence, parseTtl } from \"unforgit-config\";\n\nexport const addCommand = new Command(\"add\")\n .description(\"Add a memory (local by default)\")\n .argument(\"<text>\", \"Memory text content\")\n .option(\n \"-t, --type <type>\",\n \"Memory type (episodic|semantic|procedural)\",\n )\n .option(\"--tags <tags>\", \"Comma-separated tags\", \"\")\n .option(\n \"--visibility <visibility>\",\n \"Visibility (private|repo|auto)\",\n )\n .option(\"--source-pr <url>\", \"Source PR URL\")\n .option(\"--source-commit <sha>\", \"Source commit SHA\")\n .option(\"--confidence <n>\", \"Confidence score 0-1\")\n .option(\"--ttl <seconds>\", \"TTL in seconds\")\n .option(\"--template <name>\", \"Use a template (decision, gotcha, playbook, etc.)\")\n .option(\"--list-templates\", \"List available templates\")\n .addHelpText(\"after\", `\nExamples:\n unforgit add \"We use UTC timestamps everywhere\" -t semantic --tags time,convention\n unforgit add \"Found race condition in worker\" -t episodic --tags bug\n unforgit add \"To deploy: run make release\" --template playbook`)\n .action((text, opts) => {\n if (opts.listTemplates) {\n logger.info(formatTemplateList());\n return;\n }\n\n if (!text || !text.trim()) {\n logger.error(\"Memory text cannot be empty.\");\n process.exit(EXIT_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n let userTags: string[] = [...new Set(\n opts.tags\n ? opts.tags.split(\",\").map((t: string) => t.trim()).filter(Boolean) as string[]\n : [] as string[],\n )];\n\n if (opts.type && !validateMemoryType(opts.type)) {\n logger.error(`Invalid memory type \"${opts.type}\". Must be one of: episodic, semantic, procedural`);\n process.exit(EXIT_ERROR);\n }\n\n let memoryType = (opts.type ?? config.defaults.memoryType) as MemoryType;\n let memoryText = text;\n let visibility = opts.visibility ?? config.defaults.visibility;\n\n if (opts.template) {\n const template = getTemplate(opts.template);\n if (!template) {\n logger.error(`Unknown template: ${opts.template}`);\n logger.info(\"\\n\" + formatTemplateList());\n process.exit(EXIT_ERROR);\n }\n\n const applied = applyTemplate(template, text, userTags);\n memoryText = applied.text;\n memoryType = applied.memoryType;\n userTags = applied.tags;\n if (visibility === \"auto\") {\n visibility = applied.visibility;\n }\n\n logger.info(`Using template: ${template.name}`);\n }\n\n const sourceRefs: Record<string, unknown> = {};\n if (opts.sourcePr) sourceRefs.pr_url = opts.sourcePr;\n if (opts.sourceCommit) sourceRefs.commit_sha = opts.sourceCommit;\n\n const input = applyLifecycleDefaults({\n orgId: config.remote.orgId || \"local\",\n repoId: config.remote.repoId || \"local\",\n memoryType,\n text: memoryText,\n tags: userTags,\n sourceRefs: Object.keys(sourceRefs).length > 0 ? sourceRefs : undefined,\n confidence: opts.confidence ? parseConfidence(opts.confidence) : undefined,\n ttlSeconds: opts.ttl ? parseTtl(opts.ttl) : undefined,\n visibility,\n }, config.lifecycle);\n\n const policy = resolveVisibility(input);\n const memory = store.store({\n ...input,\n visibility: policy.visibility,\n });\n\n logger.info(`Memory stored: ${memory.id}`);\n logger.info(` Type: ${memory.memoryType}`);\n logger.info(` Visibility: ${memory.visibility}`);\n logger.info(` Tags: ${memory.tags.join(\", \") || \"(none)\"}`);\n\n if (policy.suggestion === \"promote\") {\n logger.info(\n \"\\n Hint: This memory might be useful for the team. \" +\n `Use 'unforgit promote ${memory.id}' to share it.`,\n );\n }\n } finally {\n store.close();\n }\n });\n","export const EXIT_SUCCESS = 0;\nexport const EXIT_ERROR = 1;\nexport const EXIT_CONFIG_ERROR = 2;\nexport const EXIT_SIGINT = 130;\nexport const EXIT_SIGTERM = 143;\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { mergeAndRank } from \"unforgit-core\";\nimport { resolveLifecycleConfig } from \"unforgit-core\";\nimport type { MemoryType, RecallResult } from \"unforgit-shared\";\nimport { parsePositiveInt } from \"unforgit-config\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { isJsonMode, outputJson, paginate } from \"../utils.js\";\n\nexport const recallCommand = new Command(\"recall\")\n .description(\"Recall memories matching a query\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--types <types>\",\n \"Comma-separated types (episodic,semantic,procedural)\",\n )\n .option(\"--tags <tags>\", \"Comma-separated tags to filter\")\n .option(\"-k, --limit <n>\", \"Max results\", \"10\")\n .option(\"--remote-only\", \"Only query remote\")\n .option(\"--local-only\", \"Only query local\")\n .option(\"--page <n>\", \"Page number for pagination\", \"1\")\n .option(\"--per-page <n>\", \"Items per page\", \"10\")\n .addHelpText(\"after\", `\nExamples:\n unforgit recall \"authentication\" Search all memories\n unforgit recall \"deploy\" --types procedural Filter by type\n unforgit recall \"bug\" --tags auth,api Filter by tags\n unforgit recall \"setup\" --local-only Local search only`)\n .action(async (query, opts) => {\n if (!query || !query.trim()) {\n logger.error(\"Search query cannot be empty.\");\n process.exit(EXIT_ERROR);\n }\n\n const config = loadConfig();\n const usageTrackingLimit = resolveLifecycleConfig(config.lifecycle).usageBoost.topKToRecord;\n const k = parsePositiveInt(opts.limit, \"limit\");\n\n const VALID_TYPES = [\"episodic\", \"semantic\", \"procedural\"];\n const types = opts.types\n ? (opts.types.split(\",\").map((t: string) => t.trim()) as MemoryType[])\n : undefined;\n\n if (types) {\n const invalid = types.filter((t) => !VALID_TYPES.includes(t));\n if (invalid.length > 0) {\n logger.error(\n `Invalid memory type(s): ${invalid.join(\", \")}. Must be one of: ${VALID_TYPES.join(\", \")}`,\n );\n process.exit(EXIT_ERROR);\n }\n }\n const tags = opts.tags\n ? opts.tags.split(\",\").map((t: string) => t.trim())\n : undefined;\n\n let localResults: RecallResult[] = [];\n let remoteResults: RecallResult[] = [];\n\n const recallQuery = {\n orgId: config.remote.orgId || \"local\",\n repoId: config.remote.repoId || \"local\",\n query,\n types,\n tags,\n k,\n };\n\n if (!opts.remoteOnly) {\n let store: LocalStore | undefined;\n try {\n store = new LocalStore(getDbPath());\n localResults = store.recall(recallQuery);\n const idsToRecord = localResults\n .slice(0, usageTrackingLimit)\n .map((result) => result.id);\n if (idsToRecord.length > 0) {\n store.recordUsageBatch(idsToRecord, query);\n }\n } catch {\n if (!opts.localOnly) {\n logger.warn(\"Local store not available\");\n }\n } finally {\n store?.close();\n }\n }\n\n if (!opts.localOnly && config.remote.url) {\n try {\n const client = new RemoteClient(config.remote.url);\n const response = await client.recall(recallQuery);\n remoteResults = response.results.map((r) => ({\n ...r,\n source: \"remote\" as const,\n }));\n } catch {\n if (!opts.remoteOnly) {\n logger.warn(\"Remote API not available\");\n }\n }\n }\n\n const results = mergeAndRank(localResults, remoteResults, k);\n\n const page = parsePositiveInt(opts.page, \"page\");\n const perPage = parsePositiveInt(opts.perPage, \"per-page\");\n const paged = paginate(results, page, perPage);\n\n if (isJsonMode()) {\n outputJson({\n results: paged.items.map((r) => ({\n id: r.id,\n source: r.source,\n type: r.memoryType,\n score: r.score,\n text: r.text,\n tags: r.tags,\n })),\n page: paged.currentPage,\n totalPages: paged.totalPages,\n total: paged.total,\n });\n return;\n }\n\n if (results.length === 0) {\n logger.info(\"No memories found.\");\n return;\n }\n\n logger.info(`Found ${results.length} memories:\\n`);\n for (const r of paged.items) {\n const sourceTag = r.source === \"local\" ? \"[local]\" : \"[remote]\";\n logger.info(\n `${sourceTag} [${r.memoryType}] ${r.id.slice(0, 8)}... (score: ${r.score.toFixed(3)})`,\n );\n logger.info(` ${r.text.slice(0, 120)}${r.text.length > 120 ? \"...\" : \"\"}`);\n if (r.tags.length > 0) logger.info(` Tags: ${r.tags.join(\", \")}`);\n logger.info(\"\");\n }\n\n if (paged.totalPages > 1) {\n logger.info(`Page ${paged.currentPage}/${paged.totalPages} (${paged.total} total)`);\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\n\nexport const promoteCommand = new Command(\"promote\")\n .description(\"Promote a local memory to remote (shared)\")\n .argument(\"<id>\", \"Memory ID to promote\")\n .option(\"--to <scope>\", \"Target scope\", \"repo\")\n .option(\"--source-pr <url>\", \"Source PR URL\")\n .option(\"--source-commit <sha>\", \"Source commit SHA\")\n .addHelpText(\"after\", `\nExamples:\n unforgit promote abc123\n unforgit promote abc123 --source-pr https://github.com/org/repo/pull/42`)\n .action(async (id, opts) => {\n const config = loadConfig();\n\n if (!config.remote.url) {\n logger.error(\"Remote URL not configured. Update unforgit.yaml.\");\n process.exit(EXIT_ERROR);\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const memory = store.getById(id);\n\n if (!memory) {\n logger.error(`Memory ${id} not found locally.`);\n process.exit(EXIT_ERROR);\n }\n\n const sourceRefs = { ...(memory.sourceRefs ?? {}) };\n if (opts.sourcePr) sourceRefs.pr_url = opts.sourcePr;\n if (opts.sourceCommit) sourceRefs.commit_sha = opts.sourceCommit;\n\n const client = new RemoteClient(config.remote.url);\n\n const result = await client.store({\n orgId: config.remote.orgId || memory.orgId,\n repoId: config.remote.repoId || memory.repoId,\n memoryType: memory.memoryType,\n text: memory.text,\n summary: memory.summary,\n tags: memory.tags,\n sourceRefs,\n confidence: memory.confidence,\n visibility: \"repo\",\n });\n\n store.updateVisibility(id, \"repo\");\n\n logger.info(`Promoted memory ${id.slice(0, 8)}... to remote.`);\n logger.info(` Remote ID: ${result.id}`);\n logger.info(` Scope: ${opts.to}`);\n } catch (err) {\n logger.error(\n `Promoting memory: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig } from \"unforgit-config\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { parsePositiveInt } from \"unforgit-config\";\n\nexport const consolidateCommand = new Command(\"consolidate\")\n .description(\"Consolidate episodic memories into semantic/procedural\")\n .option(\"--from-pr <url>\", \"PR URL to consolidate from\")\n .option(\"--from-commit <sha>\", \"Commit SHA to consolidate from\")\n .option(\"--last-n <n>\", \"Consolidate the last N memories\")\n .action(async (opts) => {\n const config = loadConfig();\n\n if (!config.remote.url) {\n logger.error(\"Remote URL not configured. Update unforgit.yaml.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const client = new RemoteClient(config.remote.url);\n\n const body: Record<string, unknown> = {\n orgId: config.remote.orgId,\n repoId: config.remote.repoId,\n };\n\n if (opts.fromPr || opts.fromCommit) {\n body.source = {\n prUrl: opts.fromPr,\n commitSha: opts.fromCommit,\n };\n }\n\n if (opts.lastN) {\n body.lastN = parsePositiveInt(opts.lastN, \"last-n\");\n }\n\n try {\n const result = await client.consolidate(body);\n\n logger.info(\"Consolidation complete:\");\n logger.info(` Created: ${result.created.length} memories`);\n logger.info(` Superseded: ${result.superseded.length} memories`);\n logger.info(` Processed: ${result.processedCount} total`);\n\n if (result.created.length > 0) {\n logger.info(\"\\nNew memories:\");\n for (const id of result.created) {\n logger.info(` - ${id}`);\n }\n }\n } catch (err) {\n logger.error(\n `Consolidating: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\n\nexport const deprecateCommand = new Command(\"deprecate\")\n .description(\"Mark a memory as deprecated\")\n .argument(\"<id>\", \"Memory ID to deprecate\")\n .option(\"--reason <reason>\", \"Reason for deprecation\")\n .option(\"--remote\", \"Deprecate on remote\")\n .addHelpText(\"after\", `\nExamples:\n unforgit deprecate abc123 --reason \"No longer relevant\"\n unforgit deprecate abc123 --remote`)\n .action(async (id, opts) => {\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n await client.deprecate(id, opts.reason);\n logger.info(`Deprecated remote memory ${id.slice(0, 8)}...`);\n if (opts.reason) logger.info(` Reason: ${opts.reason}`);\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const memory = store.getById(id);\n if (!memory) {\n logger.error(`Memory ${id} not found.`);\n process.exit(EXIT_ERROR);\n }\n\n if (memory.status === \"deprecated\") {\n logger.warn(`Memory ${id.slice(0, 8)} is already deprecated.`);\n return;\n }\n\n const ok = store.deprecate(id, opts.reason);\n\n if (!ok) {\n logger.error(`Memory ${id} not found.`);\n process.exit(EXIT_ERROR);\n }\n\n logger.info(`Deprecated local memory ${id.slice(0, 8)}...`);\n if (opts.reason) logger.info(` Reason: ${opts.reason}`);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { confirm } from \"../utils.js\";\n\nexport const supersedeCommand = new Command(\"supersede\")\n .description(\"Mark a memory as superseded by another\")\n .argument(\"<old-id>\", \"Memory ID being superseded\")\n .requiredOption(\"--with <new-id>\", \"ID of the new memory that replaces it\")\n .option(\"--remote\", \"Supersede on remote\")\n .option(\"--force\", \"Skip confirmation\")\n .addHelpText(\"after\", `\nExamples:\n unforgit supersede abc123 --with def456\n unforgit supersede abc123 --with def456 --remote`)\n .action(async (oldId, opts) => {\n if (oldId === opts.with) {\n logger.error(\"A memory cannot supersede itself.\");\n process.exit(EXIT_ERROR);\n }\n\n if (!opts.force) {\n const confirmed = await confirm(\n `Supersede memory ${oldId.slice(0, 8)}... with ${opts.with.slice(0, 8)}...?`,\n );\n if (!confirmed) {\n logger.info(\"Supersede cancelled.\");\n return;\n }\n }\n\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n await client.supersede(oldId, opts.with);\n logger.info(\n `Superseded remote memory ${oldId.slice(0, 8)}... with ${opts.with.slice(0, 8)}...`,\n );\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const ok = store.supersede(oldId, opts.with);\n\n if (!ok) {\n logger.error(`Memory ${oldId} not found.`);\n process.exit(EXIT_ERROR);\n }\n\n logger.info(\n `Superseded local memory ${oldId.slice(0, 8)}... with ${opts.with.slice(0, 8)}...`,\n );\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { confirm } from \"../utils.js\";\n\nexport const deleteCommand = new Command(\"delete\")\n .description(\"Soft delete a memory (can be restored)\")\n .argument(\"<id>\", \"Memory ID to delete\")\n .option(\"--hard\", \"Permanently delete (cannot be restored)\")\n .option(\"--remote\", \"Delete on remote\")\n .option(\"--by <author>\", \"Author of the deletion\")\n .option(\"--force\", \"Skip confirmation for hard delete\")\n .addHelpText(\"after\", `\nExamples:\n unforgit delete abc12345 Soft delete (can be restored)\n unforgit delete abc12345 --hard Permanent delete\n unforgit delete abc12345 --remote Delete on remote server`)\n .action(async (id, opts) => {\n if (opts.hard && !opts.force) {\n const confirmed = await confirm(\n `Permanently delete memory ${id.slice(0, 8)}...? This cannot be undone.`,\n );\n if (!confirmed) {\n logger.info(\"Delete cancelled.\");\n return;\n }\n }\n\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n await client.delete(id, opts.by, opts.hard);\n const action = opts.hard ? \"Hard deleted\" : \"Soft deleted\";\n logger.info(`${action} remote memory ${id.slice(0, 8)}...`);\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n let ok: boolean;\n if (opts.hard) {\n ok = store.hardDelete(id);\n } else {\n ok = store.softDelete({ id, deletedBy: opts.by });\n }\n\n if (!ok) {\n logger.error(`Memory ${id} not found.`);\n process.exit(EXIT_ERROR);\n }\n\n const action = opts.hard ? \"Hard deleted\" : \"Soft deleted\";\n logger.info(`${action} local memory ${id.slice(0, 8)}...`);\n if (!opts.hard) {\n logger.info(\" This memory can be restored with 'unforgit restore'.\");\n }\n } finally {\n store.close();\n }\n });\n\nexport const restoreCommand = new Command(\"restore\")\n .description(\"Restore a soft-deleted memory\")\n .argument(\"<id>\", \"Memory ID to restore\")\n .option(\"--remote\", \"Restore on remote\")\n .action(async (id, opts) => {\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n await client.restore(id);\n logger.info(`Restored remote memory ${id.slice(0, 8)}...`);\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const ok = store.restore(id);\n\n if (!ok) {\n logger.error(`Memory ${id} not found or not deleted.`);\n process.exit(EXIT_ERROR);\n }\n\n logger.info(`Restored local memory ${id.slice(0, 8)}...`);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { isInitialized } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR, EXIT_ERROR } from \"../exit-codes.js\";\n\nexport const webCommand = new Command(\"web\")\n .description(\"Start the Unforgit web dashboard\")\n .option(\"-p, --port <port>\", \"Port to run on\", \"3838\")\n .option(\"--no-open\", \"Don't open browser automatically\")\n .action(async (opts) => {\n const cwd = process.cwd();\n\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized in this directory. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const webDir = findWebDir();\n if (!webDir) {\n logger.error(\"Web dashboard not found. Make sure unforgit is installed correctly.\");\n process.exit(EXIT_ERROR);\n }\n\n const env: Record<string, string> = {\n ...process.env as Record<string, string>,\n UNFORGIT_WORKSPACE: cwd,\n PORT: opts.port,\n };\n\n const dotenvPath = path.join(cwd, \".env\");\n if (fs.existsSync(dotenvPath)) {\n const content = fs.readFileSync(dotenvPath, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const match = line.match(/^\\s*([^#=]+?)\\s*=\\s*(.+?)\\s*$/);\n if (match) {\n env[match[1]] = match[2].replace(/^[\"']|[\"']$/g, \"\");\n }\n }\n }\n\n logger.info(`Starting Unforgit web dashboard on port ${opts.port}...`);\n logger.info(`Workspace: ${cwd}`);\n\n const hasNextBuild = fs.existsSync(path.join(webDir, \".next\"));\n const cmd = hasNextBuild ? \"next\" : \"next\";\n const args = hasNextBuild\n ? [\"start\", \"-p\", opts.port]\n : [\"dev\", \"-p\", opts.port];\n\n const nextBin = path.join(webDir, \"node_modules\", \".bin\", \"next\");\n const finalCmd = fs.existsSync(nextBin) ? nextBin : cmd;\n\n const child = spawn(finalCmd, args, {\n cwd: webDir,\n env,\n stdio: \"inherit\",\n });\n\n if (opts.open !== false) {\n setTimeout(() => {\n const url = `http://localhost:${opts.port}`;\n const openCmd =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"start\"\n : \"xdg-open\";\n spawn(openCmd, [url], { stdio: \"ignore\", detached: true }).unref();\n }, 2000);\n }\n\n child.on(\"error\", (err) => {\n logger.fatal(`Failed to start web dashboard: ${err.message}`);\n process.exit(EXIT_ERROR);\n });\n\n child.on(\"exit\", (code) => {\n process.exit(code ?? 0);\n });\n });\n\nfunction findWebDir(): string | null {\n const candidates = [\n path.resolve(import.meta.dirname, \"../../../web\"),\n path.resolve(import.meta.dirname, \"../../web\"),\n path.join(process.cwd(), \"web\"),\n ];\n\n for (const dir of candidates) {\n if (\n fs.existsSync(dir) &&\n fs.existsSync(path.join(dir, \"package.json\"))\n ) {\n return dir;\n }\n }\n\n return null;\n}\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport type { LinkType } from \"unforgit-shared\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\n\nconst VALID_LINK_TYPES = [\n \"related_to\",\n \"derived_from\",\n \"contradicts\",\n \"depends_on\",\n] as const;\n\nexport const linkCommand = new Command(\"link\")\n .description(\"Create a link between two memories\")\n .argument(\"<source-id>\", \"Source memory ID\")\n .argument(\"<target-id>\", \"Target memory ID\")\n .requiredOption(\n \"--type <link-type>\",\n \"Link type (related_to, derived_from, contradicts, depends_on)\",\n )\n .option(\"--remote\", \"Create link on remote\")\n .addHelpText(\"after\", `\nExamples:\n unforgit link abc123 def456 --type related_to\n unforgit link abc123 def456 --type derived_from --remote`)\n .action(async (sourceId, targetId, opts) => {\n if (!VALID_LINK_TYPES.includes(opts.type)) {\n logger.error(\n `Invalid link type \"${opts.type}\". Must be one of: ${VALID_LINK_TYPES.join(\", \")}`,\n );\n process.exit(EXIT_ERROR);\n }\n\n if (sourceId === targetId) {\n logger.error(\"Cannot link a memory to itself.\");\n process.exit(EXIT_ERROR);\n }\n\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n const result = await client.link(sourceId, targetId, opts.type);\n logger.info(\n `Linked remote: ${sourceId.slice(0, 8)} --[${opts.type}]--> ${targetId.slice(0, 8)} (${result.link.id.slice(0, 8)})`,\n );\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n try {\n const source = store.getById(sourceId);\n if (!source) {\n logger.error(`Source memory ${sourceId} not found.`);\n process.exit(EXIT_ERROR);\n }\n if (source.status === \"deleted\") {\n logger.error(`Source memory ${sourceId.slice(0, 8)} is deleted. Restore it first.`);\n process.exit(EXIT_ERROR);\n }\n\n const target = store.getById(targetId);\n if (!target) {\n logger.error(`Target memory ${targetId} not found.`);\n process.exit(EXIT_ERROR);\n }\n if (target.status === \"deleted\") {\n logger.error(`Target memory ${targetId.slice(0, 8)} is deleted. Restore it first.`);\n process.exit(EXIT_ERROR);\n }\n\n const link = store.link({\n sourceId,\n targetId,\n linkType: opts.type as LinkType,\n });\n logger.info(\n `Linked: ${sourceId.slice(0, 8)} --[${opts.type}]--> ${targetId.slice(0, 8)} (${link.id.slice(0, 8)})`,\n );\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n\nexport const unlinkCommand = new Command(\"unlink\")\n .description(\"Remove a link between two memories\")\n .argument(\"<source-id>\", \"Source memory ID\")\n .argument(\"<target-id>\", \"Target memory ID\")\n .requiredOption(\n \"--type <link-type>\",\n \"Link type (related_to, derived_from, contradicts, depends_on)\",\n )\n .option(\"--remote\", \"Remove link on remote\")\n .action(async (sourceId, targetId, opts) => {\n if (!VALID_LINK_TYPES.includes(opts.type)) {\n logger.error(\n `Invalid link type \"${opts.type}\". Must be one of: ${VALID_LINK_TYPES.join(\", \")}`,\n );\n process.exit(EXIT_ERROR);\n }\n\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n await client.unlink(sourceId, targetId, opts.type);\n logger.info(\n `Unlinked remote: ${sourceId.slice(0, 8)} --[${opts.type}]--> ${targetId.slice(0, 8)}`,\n );\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const ok = store.unlink(sourceId, targetId, opts.type);\n\n if (!ok) {\n logger.error(\"Link not found.\");\n process.exit(EXIT_ERROR);\n }\n\n logger.info(\n `Unlinked: ${sourceId.slice(0, 8)} --[${opts.type}]--> ${targetId.slice(0, 8)}`,\n );\n } finally {\n store.close();\n }\n });\n\nexport const linksCommand = new Command(\"links\")\n .description(\"List all links for a memory\")\n .argument(\"<memory-id>\", \"Memory ID to get links for\")\n .option(\n \"--type <link-type>\",\n \"Filter by link type (related_to, derived_from, contradicts, depends_on)\",\n )\n .option(\"--remote\", \"List links on remote\")\n .action(async (memoryId, opts) => {\n if (opts.type && !VALID_LINK_TYPES.includes(opts.type)) {\n logger.error(\n `Invalid link type \"${opts.type}\". Must be one of: ${VALID_LINK_TYPES.join(\", \")}`,\n );\n process.exit(EXIT_ERROR);\n }\n\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n const result = await client.getLinks(memoryId, opts.type);\n\n if (isJsonMode()) {\n outputJson(result);\n return;\n }\n\n if (result.links.length === 0) {\n logger.info(\"No links found.\");\n return;\n }\n logger.info(`Found ${result.links.length} links:\\n`);\n for (const l of result.links) {\n const direction =\n l.sourceId === memoryId\n ? `--[${l.linkType}]--> ${l.targetId.slice(0, 8)}`\n : `<--[${l.linkType}]-- ${l.sourceId.slice(0, 8)}`;\n logger.info(` ${l.id.slice(0, 8)}: ${direction}`);\n }\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const links = store.getLinks({\n memoryId,\n linkType: opts.type as LinkType | undefined,\n });\n\n if (isJsonMode()) {\n outputJson({\n links: links.map((l) => ({\n id: l.id,\n sourceId: l.sourceId,\n targetId: l.targetId,\n linkType: l.linkType,\n })),\n });\n return;\n }\n\n if (links.length === 0) {\n logger.info(\"No links found.\");\n return;\n }\n\n logger.info(`Found ${links.length} links:\\n`);\n for (const l of links) {\n const direction =\n l.sourceId === memoryId\n ? `--[${l.linkType}]--> ${l.targetId.slice(0, 8)}`\n : `<--[${l.linkType}]-- ${l.sourceId.slice(0, 8)}`;\n logger.info(` ${l.id.slice(0, 8)}: ${direction}`);\n }\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { LocalStore } from \"unforgit-db\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport type { MemoryType } from \"unforgit-shared\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport {\n parseThreshold,\n parsePositiveInt,\n validateMemoryType,\n} from \"unforgit-config\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\n\nconst cwd = process.cwd();\n\nexport const mergeCommand = new Command(\"merge\")\n .description(\n \"Consolidate multiple local memories into one unified memory while preserving history\",\n )\n .argument(\"<ids...>\", \"Memory IDs to consolidate (minimum 2)\")\n .requiredOption(\n \"-t, --text <text>\",\n \"Consolidated text combining insights from source memories\",\n )\n .option(\n \"--type <type>\",\n \"Memory type for consolidated memory (episodic, semantic, procedural)\",\n )\n .option(\"--tags <tags>\", \"Comma-separated tags for the consolidated memory\")\n .option(\n \"--no-supersede\",\n \"Do not mark original memories as superseded\",\n )\n .action(async (ids: string[], opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n if (ids.length < 2) {\n logger.error(\"At least 2 memory IDs are required for merge.\");\n process.exit(EXIT_ERROR);\n }\n\n if (opts.type && !validateMemoryType(opts.type)) {\n logger.error(\"--type must be one of: episodic, semantic, procedural\");\n process.exit(EXIT_ERROR);\n }\n\n const config = loadConfig(cwd);\n const store = new LocalStore(getDbPath(cwd));\n\n try {\n for (const id of ids) {\n const mem = store.getById(id);\n if (!mem) {\n logger.error(`Memory ${id} not found.`);\n process.exit(EXIT_ERROR);\n }\n if (mem.status === \"deleted\") {\n logger.error(`Memory ${id.slice(0, 8)} is deleted. Restore it before merging.`);\n process.exit(EXIT_ERROR);\n }\n if (mem.status === \"superseded\") {\n logger.error(`Memory ${id.slice(0, 8)} is already superseded. Cannot merge superseded memories.`);\n process.exit(EXIT_ERROR);\n }\n }\n\n const result = store.consolidateMemories({\n orgId: config.remote.orgId || \"local\",\n repoId: config.remote.repoId || \"local\",\n sourceIds: ids,\n consolidatedText: opts.text,\n memoryType: opts.type as MemoryType | undefined,\n tags: opts.tags ? opts.tags.split(\",\").map((t: string) => t.trim()) : undefined,\n preserveOriginals: opts.supersede !== false,\n });\n\n logger.info(\"Merge complete!\");\n logger.info(` Consolidated ID: ${result.consolidatedId}`);\n logger.info(` Version: ${result.version}`);\n logger.info(` Sources preserved: ${result.sourcesPreserved}`);\n logger.info(\n ` Source IDs: ${result.sourceIds.map((id) => id.slice(0, 8)).join(\", \")}`,\n );\n logger.info(\"\");\n logger.info(\n \"Original memories are linked via 'derived_from' and marked as 'superseded'.\",\n );\n logger.info(\"Use 'unforgit history <id>' to view the consolidation history.\");\n } catch (err) {\n logger.error(\n `Merging memories: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n\nexport const remergeCommand = new Command(\"remerge\")\n .description(\n \"Update an existing consolidation with new information or additional sources\",\n )\n .argument(\"<consolidation-id>\", \"ID of existing consolidated memory to update\")\n .requiredOption(\"-t, --text <text>\", \"Updated consolidated text\")\n .option(\n \"--add <ids>\",\n \"Comma-separated IDs of additional memories to include\",\n )\n .option(\"--tags <tags>\", \"Comma-separated tags (keeps existing if not provided)\")\n .action(async (consolidationId: string, opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig(cwd);\n const store = new LocalStore(getDbPath(cwd));\n\n try {\n const result = store.reconsolidate({\n orgId: config.remote.orgId || \"local\",\n repoId: config.remote.repoId || \"local\",\n existingConsolidationId: consolidationId,\n additionalSourceIds: opts.add\n ? opts.add.split(\",\").map((t: string) => t.trim())\n : undefined,\n newText: opts.text,\n tags: opts.tags ? opts.tags.split(\",\").map((t: string) => t.trim()) : undefined,\n });\n\n logger.info(\"Remerge complete!\");\n logger.info(` New consolidated ID: ${result.consolidatedId}`);\n logger.info(` New version: ${result.version}`);\n logger.info(` Total sources: ${result.sourcesPreserved}`);\n logger.info(\n ` Previous consolidation: ${consolidationId.slice(0, 8)} (now superseded)`,\n );\n logger.info(\"\");\n logger.info(\"Use 'unforgit history <id>' to view all versions.\");\n } catch (err) {\n logger.error(\n `Remerging: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n\nexport const similarCommand = new Command(\"similar\")\n .description(\"Find memories similar to a given memory (candidates for merging)\")\n .argument(\"<memory-id>\", \"Memory ID to find similar ones for\")\n .option(\n \"-k, --limit <n>\",\n \"Max number of similar memories to return\",\n \"10\",\n )\n .option(\n \"--threshold <score>\",\n \"Minimum similarity score (0-1)\",\n \"0.3\",\n )\n .addHelpText(\"after\", `\nExamples:\n unforgit similar abc123\n unforgit similar abc123 --threshold 0.5 -k 5`)\n .action(async (memoryId: string, opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig(cwd);\n const store = new LocalStore(getDbPath(cwd));\n\n try {\n const similar = store.findSimilar({\n orgId: config.remote.orgId || \"local\",\n repoId: config.remote.repoId || \"local\",\n memoryId,\n threshold: parseThreshold(opts.threshold),\n k: parsePositiveInt(opts.limit, \"limit\"),\n });\n\n if (isJsonMode()) {\n outputJson({\n results: similar.map((m) => ({\n id: m.id,\n type: m.memoryType,\n score: m.score,\n text: m.text,\n tags: m.tags,\n })),\n });\n return;\n }\n\n if (similar.length === 0) {\n logger.info(\"No similar memories found.\");\n return;\n }\n\n logger.info(`Found ${similar.length} similar memories:\\n`);\n\n for (const mem of similar) {\n logger.info(\n `[${mem.memoryType}] ${mem.id.slice(0, 8)} (score: ${mem.score.toFixed(3)})`,\n );\n logger.info(` ${mem.text.slice(0, 100)}${mem.text.length > 100 ? \"...\" : \"\"}`);\n if (mem.tags.length > 0) {\n logger.info(` Tags: ${mem.tags.join(\", \")}`);\n }\n logger.info(\"\");\n }\n\n logger.info(\"Tip: Use 'unforgit merge <id1> <id2> ... -t \\\"merged text\\\"' to consolidate.\");\n } catch (err) {\n logger.error(\n `Finding similar: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n\nexport const historyCommand = new Command(\"history\")\n .description(\"Show consolidation history for a memory\")\n .argument(\"<memory-id>\", \"Memory ID to show history for\")\n .action(async (memoryId: string) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const store = new LocalStore(getDbPath(cwd));\n\n try {\n const memory = store.getById(memoryId);\n if (!memory) {\n logger.error(\"Memory not found.\");\n process.exit(EXIT_ERROR);\n }\n\n logger.info(`Memory: ${memory.id.slice(0, 8)}`);\n logger.info(`Type: ${memory.memoryType}`);\n logger.info(`Status: ${memory.status}`);\n logger.info(`Is Consolidation: ${memory.isConsolidation ? \"Yes\" : \"No\"}`);\n\n if (memory.isConsolidation) {\n logger.info(`Version: ${memory.consolidationVersion ?? 1}`);\n logger.info(`Text: ${memory.text}`);\n\n const sources = store.getConsolidatedSources(memoryId);\n if (sources.length > 0) {\n logger.info(\"\\nSource memories:\");\n for (const src of sources) {\n logger.info(\n ` └─ [${src.memoryType}] ${src.id.slice(0, 8)}: ${src.text.slice(0, 60)}...`,\n );\n }\n }\n\n const history = store.getConsolidationHistory(memoryId);\n const previousVersions = history.filter((h) => h.isConsolidation);\n if (previousVersions.length > 0) {\n logger.info(\"\\nPrevious consolidation versions:\");\n for (const prev of previousVersions) {\n logger.info(\n ` └─ v${prev.consolidationVersion ?? 1} (${prev.id.slice(0, 8)}): ${prev.text.slice(0, 60)}...`,\n );\n }\n }\n } else {\n logger.info(`Text: ${memory.text}`);\n\n const links = store.getLinks({ memoryId, linkType: \"derived_from\" });\n const consolidations = links.filter((l) => l.targetId === memoryId);\n if (consolidations.length > 0) {\n logger.info(\"\\nIncluded in consolidations:\");\n for (const link of consolidations) {\n const consol = store.getById(link.sourceId);\n if (consol) {\n logger.info(\n ` └─ v${consol.consolidationVersion ?? 1} (${consol.id.slice(0, 8)}): ${consol.text.slice(0, 60)}...`,\n );\n }\n }\n }\n }\n } catch (err) {\n logger.error(\n `Fetching history: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { LocalStore } from \"unforgit-db\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport type { MemoryType } from \"unforgit-shared\";\nimport {\n findConsolidationCandidates,\n executeConsolidation,\n formatCandidatePreview,\n} from \"unforgit-core\";\nimport * as readline from \"readline\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport {\n parseThreshold,\n parsePositiveInt,\n validateMemoryType,\n} from \"unforgit-config\";\n\nconst cwd = process.cwd();\n\nfunction createReadlineInterface(): readline.Interface {\n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n}\n\nasync function askConfirmation(\n rl: readline.Interface,\n question: string,\n): Promise<boolean> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n });\n });\n}\n\nexport const autoConsolidateCommand = new Command(\"auto-consolidate\")\n .description(\n \"Automatically find and consolidate similar memories using AI\",\n )\n .option(\n \"--threshold <score>\",\n \"Minimum similarity score (0-1)\",\n \"0.4\",\n )\n .option(\n \"--min-group <n>\",\n \"Minimum group size for consolidation\",\n \"2\",\n )\n .option(\n \"--max-groups <n>\",\n \"Maximum number of groups to process\",\n \"10\",\n )\n .option(\n \"--type <type>\",\n \"Filter by memory type (episodic, semantic, procedural)\",\n )\n .option(\n \"--dry-run\",\n \"Show preview without consolidating\",\n )\n .option(\n \"-y, --yes\",\n \"Skip confirmation prompts\",\n )\n .option(\n \"--model <model>\",\n \"OpenAI model to use\",\n \"gpt-5.4\",\n )\n .option(\n \"--no-preserve\",\n \"Do not preserve original memories (hard delete)\",\n )\n .action(async (opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n if (opts.type && !validateMemoryType(opts.type)) {\n logger.error(\"--type must be one of: episodic, semantic, procedural\");\n process.exit(EXIT_ERROR);\n }\n\n const config = loadConfig(cwd);\n const store = new LocalStore(getDbPath(cwd));\n\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n const threshold = parseThreshold(opts.threshold);\n const minGroupSize = parsePositiveInt(opts.minGroup, \"min-group\");\n const maxGroups = parsePositiveInt(opts.maxGroups, \"max-groups\");\n const types = opts.type ? [opts.type as MemoryType] : undefined;\n\n try {\n logger.info(\"Scanning memories for consolidation candidates...\\n\");\n\n const result = findConsolidationCandidates(store, orgId, repoId, {\n threshold,\n minGroupSize,\n maxGroups,\n types,\n excludeConsolidations: true,\n });\n\n logger.info(`Scanned ${result.totalMemoriesScanned} active memories`);\n logger.info(`Found ${result.totalCandidateGroups} potential groups`);\n logger.info(`Showing top ${result.candidates.length} candidates\\n`);\n\n if (result.candidates.length === 0) {\n logger.info(\"No consolidation candidates found.\");\n logger.info(\n \"Try lowering the threshold (--threshold 0.3) or the minimum group size (--min-group 2).\",\n );\n return;\n }\n\n for (let i = 0; i < result.candidates.length; i++) {\n const candidate = result.candidates[i];\n logger.info(`\\n${\"=\".repeat(60)}`);\n logger.info(`Candidate ${i + 1}/${result.candidates.length}`);\n logger.info(\"=\".repeat(60));\n logger.info(formatCandidatePreview(candidate));\n }\n\n if (opts.dryRun) {\n logger.info(\"\\n[Dry run mode - no changes made]\");\n logger.info(\n \"Remove --dry-run flag to consolidate these memories.\",\n );\n return;\n }\n\n const openaiKey = process.env.OPENAI_API_KEY;\n if (!openaiKey) {\n logger.error(\"OpenAI API key not set.\");\n logger.error(\"Set the OPENAI_API_KEY environment variable.\");\n process.exit(EXIT_ERROR);\n }\n process.env.OPENAI_API_KEY = openaiKey;\n\n const rl = createReadlineInterface();\n let consolidatedCount = 0;\n let skippedCount = 0;\n\n try {\n for (let i = 0; i < result.candidates.length; i++) {\n const candidate = result.candidates[i];\n\n if (!opts.yes) {\n logger.info(`\\n${\"─\".repeat(60)}`);\n logger.info(`Processing candidate ${i + 1}/${result.candidates.length}`);\n logger.info(formatCandidatePreview(candidate));\n\n const shouldConsolidate = await askConfirmation(\n rl,\n \"\\nConsolidate this group? [y/N] \",\n );\n\n if (!shouldConsolidate) {\n logger.info(\"Skipped.\");\n skippedCount++;\n logger.progress(i + 1, result.candidates.length, \"candidates\");\n continue;\n }\n }\n\n logger.info(\"\\nGenerating consolidated text with AI...\");\n\n try {\n const execResult = await executeConsolidation(\n store,\n candidate,\n orgId,\n repoId,\n {\n model: opts.model,\n preserveOriginals: opts.preserve !== false,\n },\n );\n\n logger.info(\"\\nConsolidation complete!\");\n logger.info(` New memory ID: ${execResult.consolidatedId}`);\n logger.info(` Type: ${execResult.memoryType}`);\n logger.info(` Tags: ${execResult.suggestedTags.join(\", \") || \"none\"}`);\n logger.info(` Sources consolidated: ${execResult.sourceIds.length}`);\n logger.info(`\\nGenerated text:`);\n logger.info(` ${execResult.generatedText}`);\n\n consolidatedCount++;\n } catch (err) {\n logger.error(\n `Consolidating: ${err instanceof Error ? err.message : err}`,\n );\n skippedCount++;\n }\n logger.progress(i + 1, result.candidates.length, \"candidates\");\n }\n } finally {\n rl.close();\n }\n\n logger.info(`\\n${\"=\".repeat(60)}`);\n logger.info(\"Summary\");\n logger.info(\"=\".repeat(60));\n logger.info(`Consolidated: ${consolidatedCount} groups`);\n logger.info(`Skipped: ${skippedCount} groups`);\n logger.info(\n `\\nOriginal memories are preserved with status 'superseded'.`,\n );\n logger.info(\"Use 'unforgit history <id>' to view consolidation history.\");\n } catch (err) {\n logger.error(\n `Auto-consolidate: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { getDbPath, isInitialized } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { confirm } from \"../utils.js\";\n\nexport const unconsolidateCommand = new Command(\"unconsolidate\")\n .description(\"Revert a consolidation, restoring original memories to active status\")\n .argument(\"<consolidation-id>\", \"ID of the consolidated memory to revert\")\n .option(\"--dry-run\", \"Show what would be restored without making changes\")\n .option(\"--force\", \"Skip confirmation\")\n .addHelpText(\"after\", `\nExamples:\n unforgit unconsolidate abc123 --dry-run Preview what would be restored\n unforgit unconsolidate abc123 Revert a consolidation`)\n .action(async (consolidationId: string, opts) => {\n const cwd = process.cwd();\n\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const dbPath = getDbPath(cwd);\n const store = new LocalStore(dbPath);\n\n try {\n const memory = store.getById(consolidationId);\n if (!memory) {\n logger.error(`Memory not found: ${consolidationId}`);\n process.exit(EXIT_ERROR);\n }\n\n if (!memory.isConsolidation) {\n logger.error(`Memory ${consolidationId} is not a consolidation.`);\n logger.error(\"Only consolidated memories can be unconsolidated.\");\n process.exit(EXIT_ERROR);\n }\n\n const sourceLinks = store.getLinks({ memoryId: consolidationId, linkType: \"derived_from\" });\n const sourceIds = sourceLinks\n .filter((l) => l.sourceId === consolidationId)\n .map((l) => l.targetId);\n\n logger.info(`Consolidation: ${consolidationId.slice(0, 8)}`);\n logger.info(`Version: ${memory.consolidationVersion ?? 1}`);\n logger.info(`Source memories: ${sourceIds.length}`);\n\n if (sourceIds.length === 0) {\n logger.error(\"No source memories found for this consolidation.\");\n process.exit(EXIT_ERROR);\n }\n\n logger.info(\"Source memories to restore:\");\n for (const sourceId of sourceIds) {\n const source = store.getById(sourceId);\n if (source) {\n const status = source.status === \"superseded\" ? \"will restore\" : `${source.status} (no change)`;\n const preview = source.text.slice(0, 60) + (source.text.length > 60 ? \"...\" : \"\");\n logger.info(` - ${sourceId.slice(0, 8)} [${source.memoryType}] (${status})`);\n logger.info(` ${preview}`);\n }\n }\n logger.info(\"\");\n\n if (opts.dryRun) {\n logger.info(\"[Dry run - no changes made]\");\n logger.info(\"Run without --dry-run to execute the unconsolidation.\");\n return;\n }\n\n if (!opts.force) {\n const confirmed = await confirm(\n `Revert consolidation ${consolidationId.slice(0, 8)}... and restore ${sourceIds.length} source memories?`,\n );\n if (!confirmed) {\n logger.info(\"Unconsolidation cancelled.\");\n return;\n }\n }\n\n const result = store.unconsolidate(consolidationId);\n\n logger.info(\"Unconsolidation complete:\");\n logger.info(` Restored: ${result.restoredIds.length} memories`);\n logger.info(` Links removed: ${result.linksRemoved}`);\n logger.info(` Consolidation deleted: ${result.consolidationDeleted ? \"Yes\" : \"No\"}`);\n\n if (result.restoredIds.length > 0) {\n logger.info(\"\\nRestored memories:\");\n for (const id of result.restoredIds) {\n logger.info(` - ${id.slice(0, 8)}`);\n }\n }\n\n logger.info(\"\\nThe consolidated memory has been soft-deleted and can be restored with 'unforgit restore'.\");\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { LocalStore } from \"unforgit-db\";\nimport { truncate, isJsonMode, outputJson } from \"../utils.js\";\n\nexport const statusCommand = new Command(\"status\")\n .description(\"Show the working tree status (pending sync state)\")\n .option(\"-s, --short\", \"Give the output in short format\")\n .addHelpText(\"after\", `\nExamples:\n unforgit status Show full sync status\n unforgit status -s Short format\n unforgit status --json Machine-readable output`)\n .action((opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository (or any of the parent directories)\");\n logger.fatal(\"Run 'unforgit init' to initialize.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n const remoteUrl = config.remote.url;\n const remoteName = \"origin\";\n\n const pendingPush = store.getPendingPush();\n const conflicts = store.getConflicts();\n const untracked = store.getUntrackedMemories(orgId, repoId);\n const summary = store.getSyncSummary(orgId, repoId);\n\n if (isJsonMode()) {\n outputJson({\n remote: remoteUrl || null,\n pendingPush: pendingPush.length,\n conflicts: conflicts.length,\n untracked: untracked.length,\n synced: summary.synced,\n });\n return;\n }\n\n if (opts.short) {\n printShortStatus(pendingPush, conflicts, untracked);\n } else {\n printLongStatus(remoteName, remoteUrl, pendingPush, conflicts, untracked, summary);\n }\n } finally {\n store.close();\n }\n });\n\nfunction printShortStatus(\n pendingPush: Array<{ memory: { id: string; text: string }; syncState: { syncStatus: string } }>,\n conflicts: Array<{ memory: { id: string; text: string } }>,\n untracked: Array<{ id: string; text: string }>,\n): void {\n for (const { memory } of pendingPush) {\n logger.info(`M ${memory.id.slice(0, 8)} ${truncate(memory.text, 50)}`);\n }\n for (const { memory } of conflicts) {\n logger.info(`C ${memory.id.slice(0, 8)} ${truncate(memory.text, 50)}`);\n }\n for (const memory of untracked) {\n logger.info(`?? ${memory.id.slice(0, 8)} ${truncate(memory.text, 50)}`);\n }\n}\n\nfunction printLongStatus(\n remoteName: string,\n remoteUrl: string,\n pendingPush: Array<{ memory: { id: string; text: string; status: string }; syncState: { syncStatus: string } }>,\n conflicts: Array<{ memory: { id: string; text: string } }>,\n untracked: Array<{ id: string; text: string }>,\n summary: { synced: number; pendingPush: number; pendingPull: number; conflicts: number },\n): void {\n if (remoteUrl) {\n logger.info(`Remote '${remoteName}' at ${remoteUrl}`);\n } else {\n logger.info(\"No remote configured. Use 'unforgit remote add origin <url>' to add one.\");\n }\n logger.info(\"\");\n\n if (pendingPush.length === 0 && conflicts.length === 0 && untracked.length === 0) {\n logger.info(\"Nothing to push, working tree clean\");\n if (summary.synced > 0) {\n logger.info(` ${summary.synced} memories synced with remote`);\n }\n return;\n }\n\n if (pendingPush.length > 0) {\n logger.info(\"Changes to be pushed:\");\n logger.info(' (use \"unforgit push\" to sync with remote)');\n logger.info(\"\");\n for (const { memory } of pendingPush) {\n const action = memory.status === \"active\" ? \"new memory\" : \"modified\";\n logger.info(` ${action}: ${memory.id.slice(0, 8)}... \"${truncate(memory.text, 40)}\"`);\n }\n logger.info(\"\");\n }\n\n if (conflicts.length > 0) {\n logger.info(\"Conflicts:\");\n logger.info(' (use \"unforgit push --force\" to overwrite remote or \"unforgit pull --force\" to accept remote)');\n logger.info(\"\");\n for (const { memory } of conflicts) {\n logger.info(` conflict: ${memory.id.slice(0, 8)}... \"${truncate(memory.text, 40)}\"`);\n }\n logger.info(\"\");\n }\n\n if (untracked.length > 0) {\n logger.info(\"Untracked memories:\");\n logger.info(' (these memories were created before sync tracking was enabled)');\n logger.info(' (use \"unforgit push\" to sync them)');\n logger.info(\"\");\n for (const memory of untracked) {\n logger.info(` ${memory.id.slice(0, 8)}... \"${truncate(memory.text, 40)}\"`);\n }\n logger.info(\"\");\n }\n\n const total = pendingPush.length + conflicts.length + untracked.length;\n logger.info(`${total} change(s) pending`);\n}\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { truncate } from \"../utils.js\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\n\nexport const pushCommand = new Command(\"push\")\n .description(\"Push local memories to remote\")\n .argument(\"[remote]\", \"Remote name to push to\", \"origin\")\n .option(\"-f, --force\", \"Force push, overwriting remote conflicts\")\n .option(\"--dry-run\", \"Show what would be pushed without actually pushing\")\n .option(\"-a, --all\", \"Push all memories including untracked ones\")\n .action(async (remote, opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n if (!config.remote.url) {\n logger.fatal(`No remote '${remote}' configured.`);\n logger.error(\"Use 'unforgit remote add origin <url>' to add a remote.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const client = new RemoteClient(config.remote.url);\n\n const pendingPush = store.getPendingPush();\n const untracked = opts.all ? store.getUntrackedMemories(orgId, repoId) : [];\n \n for (const memory of untracked) {\n store.initSyncStateForMemory(memory.id);\n }\n \n const allToPush = opts.all \n ? [...pendingPush, ...untracked.map(m => ({ memory: m, syncState: store.getSyncState(m.id)! }))]\n : pendingPush;\n\n const supersededToSync = store.getSupersededMemoriesToSync(orgId, repoId);\n const linksToSync = store.getLinksToSync(orgId, repoId);\n\n if (allToPush.length === 0 && supersededToSync.length === 0 && linksToSync.length === 0) {\n logger.info(\"Everything up-to-date\");\n return;\n }\n\n logger.info(`Pushing to ${remote} (${config.remote.url})...`);\n\n if (opts.dryRun) {\n if (allToPush.length > 0) {\n logger.info(\"\\nWould push the following memories:\");\n for (const { memory } of allToPush) {\n logger.info(` ${memory.id.slice(0, 8)}... \"${truncate(memory.text, 50)}\"`);\n }\n }\n if (supersededToSync.length > 0) {\n logger.info(\"\\nWould sync superseded status:\");\n for (const { memory, newId } of supersededToSync) {\n logger.info(` ${memory.id.slice(0, 8)}... -> superseded by ${newId.slice(0, 8)}...`);\n }\n }\n if (linksToSync.length > 0) {\n logger.info(\"\\nWould sync links:\");\n for (const { link } of linksToSync) {\n logger.info(` ${link.sourceId.slice(0, 8)}... -> ${link.targetId.slice(0, 8)}... (${link.linkType})`);\n }\n }\n logger.info(`\\nTotal: ${allToPush.length} memories, ${supersededToSync.length} status updates, ${linksToSync.length} links`);\n return;\n }\n\n let pushed = 0;\n let errors = 0;\n\n for (const { memory, syncState } of allToPush) {\n try {\n const fullMemory = store.getById(memory.id);\n if (!fullMemory) continue;\n\n if (fullMemory.visibility !== \"repo\" && !opts.force) {\n logger.info(` Skipping ${memory.id.slice(0, 8)}... (private memory, use --force to push anyway)`);\n continue;\n }\n\n await client.store({\n id: fullMemory.id,\n orgId: fullMemory.orgId,\n repoId: fullMemory.repoId,\n memoryType: fullMemory.memoryType,\n text: fullMemory.text,\n summary: fullMemory.summary,\n tags: fullMemory.tags,\n sourceRefs: fullMemory.sourceRefs,\n confidence: fullMemory.confidence,\n ttlSeconds: fullMemory.ttlSeconds,\n visibility: \"repo\",\n authorId: fullMemory.authorId,\n authorName: fullMemory.authorName,\n });\n\n store.markAsPushed(memory.id, fullMemory.version);\n pushed++;\n logger.progress(pushed + errors, allToPush.length, \"memories\");\n logger.debug(`pushed ${memory.id.slice(0, 8)}...`);\n } catch (err) {\n errors++;\n const errorMsg = err instanceof Error ? err.message : String(err);\n logger.error(` ${memory.id.slice(0, 8)}... failed: ${errorMsg}`);\n\n if (errorMsg.includes(\"409\") || errorMsg.includes(\"conflict\")) {\n if (opts.force) {\n logger.info(` Forcing overwrite...`);\n } else {\n store.markAsConflict(memory.id, syncState?.remoteVersion ?? 0);\n logger.info(` Marked as conflict. Use --force to overwrite.`);\n }\n }\n }\n }\n\n let supersededSynced = 0;\n\n for (const { memory, newId } of supersededToSync) {\n try {\n await client.supersede(memory.id, newId);\n store.markStatusSynced(memory.id);\n supersededSynced++;\n logger.info(` ${memory.id.slice(0, 8)}... marked as superseded on remote`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (!errorMsg.includes(\"404\")) {\n errors++;\n logger.error(` ${memory.id.slice(0, 8)}... failed to sync superseded status: ${errorMsg}`);\n }\n }\n }\n\n let linksSynced = 0;\n\n for (const { link } of linksToSync) {\n try {\n await client.link(link.sourceId, link.targetId, link.linkType, link.metadata);\n store.markLinkSynced(link.id);\n linksSynced++;\n logger.info(` link ${link.sourceId.slice(0, 8)}... -> ${link.targetId.slice(0, 8)}... (${link.linkType})`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (!errorMsg.includes(\"404\")) {\n errors++;\n logger.error(` link ${link.sourceId.slice(0, 8)}... failed: ${errorMsg}`);\n }\n }\n }\n\n logger.info(\"\");\n if (pushed > 0) {\n logger.info(`${pushed} memory(s) pushed successfully`);\n }\n if (supersededSynced > 0) {\n logger.info(`${supersededSynced} memory(s) marked as superseded on remote`);\n }\n if (linksSynced > 0) {\n logger.info(`${linksSynced} link(s) synced`);\n }\n if (errors > 0) {\n logger.info(`${errors} error(s) during push`);\n }\n } finally {\n store.close();\n }\n });\n\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\n\nexport const pullCommand = new Command(\"pull\")\n .description(\"Pull remote memories to local\")\n .argument(\"[remote]\", \"Remote name to pull from\", \"origin\")\n .option(\"-f, --force\", \"Force pull, overwriting local conflicts\")\n .option(\"--dry-run\", \"Show what would be pulled without actually pulling\")\n .action(async (remote, opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n if (!config.remote.url) {\n logger.fatal(`No remote '${remote}' configured.`);\n logger.fatal(\"Use 'unforgit remote add origin <url>' to add a remote.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const client = new RemoteClient(config.remote.url);\n\n logger.info(`Fetching from ${remote} (${config.remote.url})...`);\n\n const response = await client.recall({\n orgId,\n repoId,\n query: \"*\",\n k: 1000,\n includeDeprecated: true,\n });\n\n const remoteMemories = response.results;\n\n if (remoteMemories.length === 0) {\n logger.info(\"Already up to date (no memories on remote)\");\n return;\n }\n\n if (opts.dryRun) {\n let newCount = 0;\n let updateCount = 0;\n\n for (const remoteMem of remoteMemories) {\n const localMem = store.getById(remoteMem.id);\n if (!localMem) {\n newCount++;\n } else {\n updateCount++;\n }\n }\n\n logger.info(`\\nWould pull:`);\n logger.info(` ${newCount} new memories`);\n logger.info(` ${updateCount} updates`);\n return;\n }\n\n let created = 0;\n let updated = 0;\n let skipped = 0;\n let conflicts = 0;\n\n for (const remoteMem of remoteMemories) {\n const localMem = store.getById(remoteMem.id);\n\n const remoteStatus = remoteMem.status ?? \"active\";\n\n if (!localMem) {\n store.upsertFromRemote({\n id: remoteMem.id,\n orgId,\n repoId,\n scopeType: \"repo\",\n memoryType: remoteMem.memoryType,\n visibility: \"repo\",\n status: remoteStatus,\n text: remoteMem.text,\n summary: remoteMem.summary,\n tags: remoteMem.tags,\n sourceRefs: remoteMem.sourceRefs,\n supersedesId: remoteMem.supersedesId,\n version: 1,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n\n store.setSyncState({\n memoryId: remoteMem.id,\n localVersion: 1,\n remoteVersion: 1,\n lastPulledAt: new Date(),\n syncStatus: \"synced\",\n });\n\n created++;\n const statusNote = remoteStatus !== \"active\" ? ` [${remoteStatus}]` : \"\";\n logger.info(` ${remoteMem.id.slice(0, 8)}... new memory${statusNote}`);\n logger.progress(created + updated + skipped + conflicts, remoteMemories.length, \"memories\");\n } else {\n const syncState = store.getSyncState(remoteMem.id);\n const localVersion = syncState?.localVersion ?? localMem.version;\n const remoteVersion = syncState?.remoteVersion ?? 0;\n\n if (syncState?.syncStatus === \"pending_push\" && !opts.force) {\n conflicts++;\n store.markAsConflict(remoteMem.id, remoteVersion + 1);\n logger.info(` ${remoteMem.id.slice(0, 8)}... conflict (local has unpushed changes)`);\n logger.progress(created + updated + skipped + conflicts, remoteMemories.length, \"memories\");\n continue;\n }\n\n const statusChanged = localMem.status !== remoteStatus;\n const textChanged = localMem.text !== remoteMem.text;\n\n if (!textChanged && !statusChanged) {\n skipped++;\n logger.progress(created + updated + skipped + conflicts, remoteMemories.length, \"memories\");\n continue;\n }\n\n if (opts.force || syncState?.syncStatus !== \"pending_push\") {\n store.upsertFromRemote({\n id: remoteMem.id,\n orgId,\n repoId,\n scopeType: \"repo\",\n memoryType: remoteMem.memoryType,\n visibility: \"repo\",\n status: remoteStatus,\n text: remoteMem.text,\n summary: remoteMem.summary,\n tags: remoteMem.tags,\n sourceRefs: remoteMem.sourceRefs,\n supersedesId: remoteMem.supersedesId,\n version: localVersion + 1,\n createdAt: localMem.createdAt,\n updatedAt: new Date(),\n });\n\n store.markAsPulled(remoteMem.id, localVersion + 1);\n updated++;\n const changeType = statusChanged && !textChanged ? \"status updated\" : \"updated\";\n const statusNote = remoteStatus !== \"active\" ? ` [${remoteStatus}]` : \"\";\n logger.info(` ${remoteMem.id.slice(0, 8)}... ${changeType}${statusNote}`);\n logger.progress(created + updated + skipped + conflicts, remoteMemories.length, \"memories\");\n }\n }\n }\n\n logger.info(\"\");\n logger.info(`Pull complete:`);\n if (created > 0) logger.info(` ${created} new memories`);\n if (updated > 0) logger.info(` ${updated} updates`);\n if (skipped > 0) logger.info(` ${skipped} already up to date`);\n if (conflicts > 0) {\n logger.info(` ${conflicts} conflicts (use --force to overwrite local)`);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n logger.fatal(`Could not fetch from remote: ${errorMsg}`);\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { isInitialized, loadConfig, saveConfig } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR, EXIT_ERROR } from \"../exit-codes.js\";\nimport type { AppConfig, RemoteConfig } from \"unforgit-shared\";\n\nexport const remoteCommand = new Command(\"remote\")\n .description(\"Manage set of tracked remote repositories\")\n .addHelpText(\"after\", `\nExamples:\n unforgit remote List remotes\n unforgit remote add origin <url> Add a remote\n unforgit remote show origin Show remote details`)\n .action(() => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const remotes = getRemotes(config);\n\n if (Object.keys(remotes).length === 0) {\n logger.info(\"No remotes configured.\");\n logger.info(\"Use 'unforgit remote add <name> <url>' to add a remote.\");\n return;\n }\n\n for (const [name, remote] of Object.entries(remotes)) {\n logger.info(`${name}\\t${remote.url}`);\n }\n });\n\nexport const remoteAddCommand = new Command(\"add\")\n .description(\"Add a new remote\")\n .argument(\"<name>\", \"Name for the remote (e.g., origin)\")\n .argument(\"<url>\", \"URL of the remote unforgit server\")\n .option(\"--org <orgId>\", \"Organization ID\")\n .option(\"--repo <repoId>\", \"Repository ID\")\n .action((name, url, opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const remotes = getRemotes(config);\n\n if (remotes[name]) {\n logger.fatal(`remote '${name}' already exists.`);\n logger.error(`Use 'unforgit remote set-url ${name} <newurl>' to change the URL.`);\n process.exit(EXIT_ERROR);\n }\n\n remotes[name] = {\n url,\n orgId: opts.org || config.remote?.orgId || \"\",\n repoId: opts.repo || config.remote?.repoId || \"\",\n };\n\n saveRemotes(config, remotes);\n logger.info(`Remote '${name}' added: ${url}`);\n });\n\nexport const remoteRemoveCommand = new Command(\"remove\")\n .alias(\"rm\")\n .description(\"Remove a remote\")\n .argument(\"<name>\", \"Name of the remote to remove\")\n .action((name) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const remotes = getRemotes(config);\n\n if (!remotes[name]) {\n logger.fatal(`No such remote: '${name}'`);\n process.exit(EXIT_ERROR);\n }\n\n delete remotes[name];\n saveRemotes(config, remotes);\n logger.info(`Remote '${name}' removed.`);\n });\n\nexport const remoteSetUrlCommand = new Command(\"set-url\")\n .description(\"Change the URL for a remote\")\n .argument(\"<name>\", \"Name of the remote\")\n .argument(\"<newurl>\", \"New URL for the remote\")\n .action((name, newurl) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const remotes = getRemotes(config);\n\n if (!remotes[name]) {\n logger.fatal(`No such remote: '${name}'`);\n logger.error(`Use 'unforgit remote add ${name} ${newurl}' to add it.`);\n process.exit(EXIT_ERROR);\n }\n\n remotes[name].url = newurl;\n saveRemotes(config, remotes);\n logger.info(`Remote '${name}' URL changed to: ${newurl}`);\n });\n\nexport const remoteShowCommand = new Command(\"show\")\n .description(\"Show information about a remote\")\n .argument(\"<name>\", \"Name of the remote\")\n .action((name) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const remotes = getRemotes(config);\n\n if (!remotes[name]) {\n logger.fatal(`No such remote: '${name}'`);\n process.exit(EXIT_ERROR);\n }\n\n const remote = remotes[name];\n logger.info(`* remote ${name}`);\n logger.info(` URL: ${remote.url}`);\n logger.info(` Org ID: ${remote.orgId || \"(not set)\"}`);\n logger.info(` Repo ID: ${remote.repoId || \"(not set)\"}`);\n });\n\nremoteCommand.addCommand(remoteAddCommand);\nremoteCommand.addCommand(remoteRemoveCommand);\nremoteCommand.addCommand(remoteSetUrlCommand);\nremoteCommand.addCommand(remoteShowCommand);\n\nfunction getRemotes(config: AppConfig): Record<string, RemoteConfig> {\n if (config.remotes) {\n return { ...config.remotes };\n }\n\n if (config.remote?.url) {\n return {\n origin: {\n url: config.remote.url,\n orgId: config.remote.orgId,\n repoId: config.remote.repoId,\n },\n };\n }\n\n return {};\n}\n\nfunction saveRemotes(config: AppConfig, remotes: Record<string, RemoteConfig>): void {\n config.remotes = remotes;\n\n if (remotes.origin) {\n config.remote = {\n ...config.remote,\n url: remotes.origin.url,\n orgId: remotes.origin.orgId,\n repoId: remotes.origin.repoId,\n };\n }\n\n saveConfig(config);\n}\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { LocalStore } from \"unforgit-db\";\nimport { parsePositiveInt, validateMemoryType } from \"unforgit-config\";\nimport { isJsonMode, outputJson, paginate } from \"../utils.js\";\n\nexport const logCommand = new Command(\"log\")\n .description(\"Show memory history log\")\n .option(\"-n, --max-count <n>\", \"Limit the number of memories shown\", \"20\")\n .option(\"--oneline\", \"Show each memory on a single line\")\n .option(\"--all\", \"Show all memories including deprecated/superseded\")\n .option(\"--type <type>\", \"Filter by memory type (episodic|semantic|procedural)\")\n .option(\"--tags <tags>\", \"Filter by tags (comma-separated)\")\n .option(\"--page <n>\", \"Page number for pagination\", \"1\")\n .option(\"--per-page <n>\", \"Items per page\", \"20\")\n .addHelpText(\"after\", `\nExamples:\n unforgit log Show recent memories\n unforgit log --all Include deprecated/superseded\n unforgit log --type semantic Filter by type\n unforgit log --oneline Compact output\n unforgit log --page 2 Second page of results`)\n .action((opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n const limit = parsePositiveInt(opts.maxCount, \"max-count\");\n\n if (opts.type && !validateMemoryType(opts.type)) {\n logger.error(`Invalid memory type \"${opts.type}\". Must be one of: episodic, semantic, procedural`);\n process.exit(EXIT_ERROR);\n }\n\n const types = opts.type ? [opts.type] : undefined;\n const status = opts.all ? undefined : [\"active\" as const];\n\n const memories = store.list({\n orgId,\n repoId,\n types,\n status,\n limit,\n sortBy: \"createdAt\",\n sortOrder: \"desc\",\n });\n\n let filteredMemories = memories;\n if (opts.tags) {\n const filterTags = opts.tags.split(\",\").map((t: string) => t.trim());\n filteredMemories = memories.filter((m) =>\n m.tags.some((t) => filterTags.includes(t))\n );\n }\n\n const page = parsePositiveInt(opts.page, \"page\");\n const perPage = parsePositiveInt(opts.perPage, \"per-page\");\n const paged = paginate(filteredMemories, page, perPage);\n\n if (isJsonMode()) {\n outputJson({\n memories: paged.items.map((m) => ({\n id: m.id,\n type: m.memoryType,\n status: m.status,\n text: m.text,\n tags: m.tags,\n createdAt: m.createdAt.toISOString(),\n })),\n page: paged.currentPage,\n totalPages: paged.totalPages,\n total: paged.total,\n });\n return;\n }\n\n if (paged.items.length === 0) {\n logger.info(\"No memories found.\");\n return;\n }\n\n if (opts.oneline) {\n for (const mem of paged.items) {\n const text = mem.text.replace(/\\n/g, \" \").slice(0, 60);\n logger.info(`${mem.id.slice(0, 7)} [${mem.memoryType}] ${text}${mem.text.length > 60 ? \"...\" : \"\"}`);\n }\n } else {\n for (const mem of paged.items) {\n const date = mem.createdAt.toISOString().split(\"T\")[0];\n const time = mem.createdAt.toISOString().split(\"T\")[1].slice(0, 5);\n\n logger.info(`memory ${mem.id}`);\n logger.info(`Type: ${mem.memoryType}`);\n logger.info(`Date: ${date} ${time}`);\n logger.info(`Status: ${mem.status}`);\n if (mem.tags.length > 0) {\n logger.info(`Tags: ${mem.tags.join(\", \")}`);\n }\n logger.info(\"\");\n logger.info(` ${mem.text.split(\"\\n\").join(\"\\n \")}`);\n logger.info(\"\");\n }\n }\n\n if (paged.totalPages > 1) {\n logger.info(`Page ${paged.currentPage}/${paged.totalPages} (${paged.total} total)`);\n }\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { truncate, isJsonMode, outputJson } from \"../utils.js\";\n\nexport const diffCommand = new Command(\"diff\")\n .description(\"Show differences between local and remote memories\")\n .argument(\"[memoryId]\", \"Specific memory ID to diff\")\n .option(\"--stat\", \"Show only statistics\")\n .addHelpText(\"after\", `\nExamples:\n unforgit diff Show all differences\n unforgit diff --stat Show difference statistics only\n unforgit diff abc12345 Diff a specific memory`)\n .action(async (memoryId, opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n if (!config.remote.url) {\n logger.fatal(\"No remote configured.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const client = new RemoteClient(config.remote.url);\n\n if (memoryId) {\n await diffSingleMemory(store, client, memoryId, orgId, repoId);\n } else {\n await diffAll(store, client, orgId, repoId, opts.stat);\n }\n } finally {\n store.close();\n }\n });\n\nasync function diffSingleMemory(\n store: LocalStore,\n client: RemoteClient,\n memoryId: string,\n orgId: string,\n repoId: string,\n): Promise<void> {\n const fullId = memoryId.length < 36\n ? findFullId(store, memoryId, orgId, repoId)\n : memoryId;\n\n if (!fullId) {\n logger.error(`memory '${memoryId}' not found`);\n process.exit(EXIT_ERROR);\n }\n\n const localMem = store.getById(fullId);\n\n let remoteMem = null;\n try {\n const response = await client.recall({\n orgId,\n repoId,\n query: fullId,\n k: 1,\n });\n remoteMem = response.results.find((r) => r.id === fullId);\n } catch {\n logger.warn(\"Could not fetch from remote\");\n }\n\n if (!localMem && !remoteMem) {\n logger.error(`memory '${memoryId}' not found locally or remotely`);\n process.exit(EXIT_ERROR);\n }\n\n if (isJsonMode()) {\n outputJson({\n memoryId: fullId,\n local: localMem ? { text: localMem.text, status: localMem.status } : null,\n remote: remoteMem ? { text: remoteMem.text, status: remoteMem.status } : null,\n identical: localMem && remoteMem ? localMem.text === remoteMem.text : false,\n });\n return;\n }\n\n logger.info(`diff ${fullId.slice(0, 8)}...`);\n logger.info(\"---\");\n\n if (!localMem) {\n logger.info(\"(not in local)\");\n logger.info(\"+ \" + remoteMem!.text.split(\"\\n\").join(\"\\n+ \"));\n return;\n }\n\n if (!remoteMem) {\n logger.info(\"(not in remote)\");\n logger.info(\"+ \" + localMem.text.split(\"\\n\").join(\"\\n+ \"));\n return;\n }\n\n if (localMem.text === remoteMem.text) {\n logger.info(\"No differences\");\n return;\n }\n\n const localLines = localMem.text.split(\"\\n\");\n const remoteLines = remoteMem.text.split(\"\\n\");\n\n logger.info(\"--- local\");\n logger.info(\"+++ remote\");\n logger.info(\"\");\n\n for (let i = 0; i < Math.max(localLines.length, remoteLines.length); i++) {\n const localLine = localLines[i];\n const remoteLine = remoteLines[i];\n\n if (localLine === remoteLine) {\n logger.info(` ${localLine ?? \"\"}`);\n } else if (localLine && !remoteLine) {\n logger.info(`- ${localLine}`);\n } else if (!localLine && remoteLine) {\n logger.info(`+ ${remoteLine}`);\n } else {\n logger.info(`- ${localLine}`);\n logger.info(`+ ${remoteLine}`);\n }\n }\n}\n\nasync function diffAll(\n store: LocalStore,\n client: RemoteClient,\n orgId: string,\n repoId: string,\n statOnly: boolean,\n): Promise<void> {\n const pendingPush = store.getPendingPush();\n const conflicts = store.getConflicts();\n\n let remoteOnlyCount = 0;\n try {\n const response = await client.recall({ orgId, repoId, query: \"*\", k: 1000 });\n for (const remoteMem of response.results) {\n const localMem = store.getById(remoteMem.id);\n if (!localMem) {\n remoteOnlyCount++;\n }\n }\n } catch {\n logger.warn(\"Could not fetch remote memories for full diff\");\n }\n\n if (pendingPush.length === 0 && conflicts.length === 0 && remoteOnlyCount === 0) {\n if (isJsonMode()) {\n outputJson({ pendingPush: 0, conflicts: 0, remoteOnly: 0, total: 0 });\n return;\n }\n logger.info(\"No differences\");\n return;\n }\n\n if (isJsonMode()) {\n outputJson({\n pendingPush: pendingPush.length,\n conflicts: conflicts.length,\n remoteOnly: remoteOnlyCount,\n total: pendingPush.length + conflicts.length + remoteOnlyCount,\n });\n return;\n }\n\n if (statOnly) {\n logger.info(`${pendingPush.length} memories to push`);\n logger.info(`${conflicts.length} conflicts`);\n if (remoteOnlyCount > 0) {\n logger.info(`${remoteOnlyCount} remote-only memories (use 'unforgit pull')`);\n }\n return;\n }\n\n if (pendingPush.length > 0) {\n logger.info(\"Changes to push:\");\n logger.info(\"\");\n for (const { memory } of pendingPush) {\n logger.info(` + ${memory.id.slice(0, 8)}... \"${truncate(memory.text, 50)}\"`);\n }\n logger.info(\"\");\n }\n\n if (conflicts.length > 0) {\n logger.info(\"Conflicts:\");\n logger.info(\"\");\n for (const { memory, syncState } of conflicts) {\n logger.info(` ! ${memory.id.slice(0, 8)}... local:v${syncState.localVersion} remote:v${syncState.remoteVersion ?? \"?\"}`);\n logger.info(` \"${truncate(memory.text, 60)}\"`);\n }\n logger.info(\"\");\n }\n\n if (remoteOnlyCount > 0) {\n logger.info(`${remoteOnlyCount} remote-only memories (run 'unforgit pull' to fetch)`);\n logger.info(\"\");\n }\n\n logger.info(`Total: ${pendingPush.length + conflicts.length + remoteOnlyCount} differences`);\n}\n\nfunction findFullId(store: LocalStore, partialId: string, orgId: string, repoId: string): string | null {\n const memories = store.list({ orgId, repoId, limit: 1000 });\n const match = memories.find((m) => m.id.startsWith(partialId));\n return match?.id ?? null;\n}\n","import { Command } from \"commander\";\nimport { loadConfig, isInitialized } from \"unforgit-config\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR, EXIT_ERROR } from \"../exit-codes.js\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\n\nfunction requireRemote(): { url: string; apiKey: string } {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n\n if (!config.remote.url) {\n logger.fatal(\"No remote configured.\");\n logger.error(\"Use 'unforgit remote add origin <url>' to add a remote.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const apiKey = process.env.UNFORGIT_API_KEY;\n if (!apiKey) {\n logger.fatal(\"No API key configured.\");\n logger.error(\"Set the UNFORGIT_API_KEY environment variable.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n return { url: config.remote.url, apiKey };\n}\n\nexport const keysCommand = new Command(\"keys\")\n .description(\"Manage API keys for remote authentication\");\n\nkeysCommand\n .command(\"create\")\n .description(\"Create a new API key\")\n .requiredOption(\"--name <name>\", \"Name for the API key\")\n .requiredOption(\"--org <orgId>\", \"Organization ID for the key\")\n .addHelpText(\"after\", `\nExamples:\n unforgit keys create --name \"CI pipeline\" --org my-org\n unforgit keys list --org my-org`)\n .action(async (opts) => {\n const { url, apiKey } = requireRemote();\n const client = new RemoteClient(url, apiKey);\n\n try {\n const result = await client.createApiKey(opts.name, opts.org);\n\n if (isJsonMode()) {\n outputJson(result);\n return;\n }\n\n logger.info(\"API key created successfully!\");\n logger.info(\"\");\n logger.info(` ID: ${result.id}`);\n logger.info(` Name: ${result.name}`);\n logger.info(` Org: ${result.orgId}`);\n logger.info(` Key: ${result.key}`);\n logger.info(\"\");\n logger.info(\"Store this key securely. It will not be shown again.\");\n logger.info(\"\");\n logger.info(\"To use this key, set it as an environment variable:\");\n logger.info(\"\");\n logger.info(` export UNFORGIT_API_KEY=\"${result.key}\"`);\n } catch (err) {\n logger.fatal(err instanceof Error ? err.message : String(err));\n process.exit(EXIT_ERROR);\n }\n });\n\nkeysCommand\n .command(\"list\")\n .description(\"List all API keys\")\n .option(\"--org <orgId>\", \"Filter by organization ID\")\n .action(async (opts) => {\n const { url, apiKey } = requireRemote();\n const client = new RemoteClient(url, apiKey);\n\n try {\n const result = await client.listApiKeys(opts.org);\n\n if (isJsonMode()) {\n outputJson(result);\n return;\n }\n\n if (result.keys.length === 0) {\n logger.info(\"No API keys found.\");\n return;\n }\n\n logger.info(`Found ${result.keys.length} API key(s):\\n`);\n\n for (const key of result.keys) {\n const status = key.isActive ? \"[active]\" : \"[revoked]\";\n const lastUsed = key.lastUsedAt\n ? `last used ${new Date(key.lastUsedAt).toLocaleDateString()}`\n : \"never used\";\n logger.info(`${status} ${key.id.slice(0, 8)} ${key.name}`);\n logger.info(` org: ${key.orgId} | ${lastUsed}`);\n }\n } catch (err) {\n logger.fatal(err instanceof Error ? err.message : String(err));\n process.exit(EXIT_ERROR);\n }\n });\n\nkeysCommand\n .command(\"revoke\")\n .description(\"Revoke an API key\")\n .argument(\"<id>\", \"API key ID to revoke\")\n .action(async (id) => {\n const { url, apiKey } = requireRemote();\n const client = new RemoteClient(url, apiKey);\n\n try {\n await client.revokeApiKey(id);\n logger.info(`API key ${id.slice(0, 8)}... revoked successfully.`);\n } catch (err) {\n logger.fatal(err instanceof Error ? err.message : String(err));\n process.exit(EXIT_ERROR);\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, isInitialized } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { maskKey } from \"../utils.js\";\n\nexport const authCommand = new Command(\"auth\")\n .description(\"Check authentication status for remote server and APIs\");\n\nauthCommand\n .command(\"status\")\n .description(\"Check authentication status\")\n .action(async () => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n\n logger.info(\"Authentication status:\");\n logger.info(` Remote URL: ${config.remote.url || \"(not configured)\"}`);\n logger.info(` Org ID: ${config.remote.orgId || \"(not configured)\"}`);\n logger.info(` Repo ID: ${config.remote.repoId || \"(not configured)\"}`);\n\n const apiKey = process.env.UNFORGIT_API_KEY;\n\n if (apiKey) {\n logger.info(` API Key: ${maskKey(apiKey)} (from UNFORGIT_API_KEY env var)`);\n\n if (config.remote.url) {\n logger.info(\"\\nTesting connection...\");\n try {\n const res = await fetch(`${config.remote.url}/health`);\n if (res.ok) {\n logger.info(\" [ok] Server reachable\");\n\n const authRes = await fetch(`${config.remote.url}/v1/api-keys`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n if (authRes.ok) {\n logger.info(\" [ok] API key valid\");\n } else if (authRes.status === 401) {\n logger.info(\" [ERR] API key invalid or expired\");\n } else {\n logger.info(` [??] Could not verify API key (HTTP ${authRes.status})`);\n }\n } else {\n logger.info(` [ERR] Server returned HTTP ${res.status}`);\n }\n } catch (err) {\n logger.info(` [ERR] Could not connect: ${err instanceof Error ? err.message : err}`);\n }\n }\n } else {\n logger.info(\" API Key: (not configured)\");\n logger.info(\"\\nSet the UNFORGIT_API_KEY environment variable.\");\n }\n\n const openaiKey = process.env.OPENAI_API_KEY;\n if (openaiKey) {\n logger.info(` OpenAI Key: ${maskKey(openaiKey)} (from OPENAI_API_KEY env var)`);\n } else {\n logger.info(\" OpenAI Key: (not configured)\");\n logger.info(\" Set OPENAI_API_KEY env var for embeddings and auto-consolidation.\");\n }\n });\n","import { Command } from \"commander\";\nimport { isInitialized, loadConfig, saveConfig } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR, EXIT_ERROR } from \"../exit-codes.js\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\nimport type { AppConfig } from \"unforgit-shared\";\n\nexport const configCommand = new Command(\"config\")\n .description(\"Manage unforgit configuration\");\n\nconfigCommand\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List all configuration values\")\n .action(() => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n\n if (isJsonMode()) {\n outputJson(config);\n return;\n }\n\n logger.info(\"Current configuration:\\n\");\n logger.info(`remote.url = ${config.remote.url || \"(not set)\"}`);\n logger.info(`remote.orgId = ${config.remote.orgId || \"(not set)\"}`);\n logger.info(`remote.repoId = ${config.remote.repoId || \"(not set)\"}`);\n logger.info(`defaults.visibility = ${config.defaults.visibility}`);\n logger.info(`defaults.memoryType = ${config.defaults.memoryType}`);\n logger.info(`lifecycle.ttlSecondsByType.episodic = ${config.lifecycle?.ttlSecondsByType?.episodic ?? \"(none)\"}`);\n logger.info(`lifecycle.usageBoost.topKToRecord = ${config.lifecycle?.usageBoost?.topKToRecord ?? \"(not set)\"}`);\n logger.info(`lifecycle.usageBoost.minUsageCount = ${config.lifecycle?.usageBoost?.minUsageCount ?? \"(not set)\"}`);\n logger.info(`lifecycle.usageBoost.maxBoost = ${config.lifecycle?.usageBoost?.maxBoost ?? \"(not set)\"}`);\n logger.info(`lifecycle.usageBoost.halfLifeDays = ${config.lifecycle?.usageBoost?.halfLifeDays ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.staleEpisodicDays = ${config.lifecycle?.maintenance?.staleEpisodicDays ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.consolidationThreshold = ${config.lifecycle?.maintenance?.consolidationThreshold ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.consolidationMinGroupSize = ${config.lifecycle?.maintenance?.consolidationMinGroupSize ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.consolidationMaxGroups = ${config.lifecycle?.maintenance?.consolidationMaxGroups ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.promoteRecallCount = ${config.lifecycle?.maintenance?.promoteRecallCount ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.pinRecallCount = ${config.lifecycle?.maintenance?.pinRecallCount ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.dryRunDefault = ${config.lifecycle?.maintenance?.dryRunDefault ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.autoRunOnStore = ${config.lifecycle?.maintenance?.autoRunOnStore ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.autoRunOnRecall = ${config.lifecycle?.maintenance?.autoRunOnRecall ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.debounceMs = ${config.lifecycle?.maintenance?.debounceMs ?? \"(not set)\"}`);\n });\n\nconfigCommand\n .command(\"get\")\n .description(\"Get a configuration value\")\n .argument(\"<key>\", \"Configuration key (e.g., remote.url, defaults.memoryType)\")\n .action((key) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const value = getConfigValue(config, key);\n\n if (value === undefined) {\n logger.fatal(`key '${key}' not found`);\n process.exit(EXIT_ERROR);\n }\n\n if (isJsonMode()) {\n outputJson({ key, value });\n return;\n }\n\n logger.info(String(value));\n });\n\nconst VALID_CONFIG_KEYS = [\n \"remote.url\",\n \"remote.orgId\",\n \"remote.repoId\",\n \"defaults.visibility\",\n \"defaults.memoryType\",\n \"lifecycle.ttlSecondsByType.episodic\",\n \"lifecycle.ttlSecondsByType.semantic\",\n \"lifecycle.ttlSecondsByType.procedural\",\n \"lifecycle.usageBoost.enabled\",\n \"lifecycle.usageBoost.topKToRecord\",\n \"lifecycle.usageBoost.minUsageCount\",\n \"lifecycle.usageBoost.maxBoost\",\n \"lifecycle.usageBoost.halfLifeDays\",\n \"lifecycle.maintenance.staleEpisodicDays\",\n \"lifecycle.maintenance.consolidationThreshold\",\n \"lifecycle.maintenance.consolidationMinGroupSize\",\n \"lifecycle.maintenance.consolidationMaxGroups\",\n \"lifecycle.maintenance.promoteRecallCount\",\n \"lifecycle.maintenance.pinRecallCount\",\n \"lifecycle.maintenance.dryRunDefault\",\n \"lifecycle.maintenance.autoRunOnStore\",\n \"lifecycle.maintenance.autoRunOnRecall\",\n \"lifecycle.maintenance.debounceMs\",\n \"configVersion\",\n] as const;\n\nconfigCommand\n .command(\"set\")\n .description(\"Set a configuration value\")\n .argument(\"<key>\", \"Configuration key\")\n .argument(\"<value>\", \"Value to set\")\n .addHelpText(\"after\", `\nValid keys: ${VALID_CONFIG_KEYS.join(\", \")}\n\nExamples:\n unforgit config set remote.url http://my-server:3737\n unforgit config set defaults.memoryType semantic`)\n .action((key, value) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n if (!VALID_CONFIG_KEYS.includes(key as (typeof VALID_CONFIG_KEYS)[number])) {\n logger.error(\n `Unknown config key \"${key}\". Valid keys: ${VALID_CONFIG_KEYS.join(\", \")}`,\n );\n process.exit(EXIT_ERROR);\n }\n\n const config = loadConfig();\n setConfigValue(config, key, value);\n saveConfig(config);\n\n logger.info(`${key} = ${value}`);\n });\n\nconfigCommand\n .command(\"unset\")\n .description(\"Remove a configuration value\")\n .argument(\"<key>\", \"Configuration key to remove\")\n .action((key) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n unsetConfigValue(config, key);\n saveConfig(config);\n\n logger.info(`Unset ${key}`);\n });\n\nfunction getConfigValue(config: AppConfig, key: string): unknown {\n const parts = key.split(\".\");\n let current: unknown = config;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\nfunction setConfigValue(config: AppConfig, key: string, value: string): void {\n const parts = key.split(\".\");\n\n if (parts.length === 1) {\n (config as unknown as Record<string, unknown>)[key] = value;\n return;\n }\n\n let current: Record<string, unknown> = config as unknown as Record<string, unknown>;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current) || typeof current[part] !== \"object\") {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n current[parts[parts.length - 1]] = coerceConfigValue(value);\n}\n\nfunction unsetConfigValue(config: AppConfig, key: string): void {\n const parts = key.split(\".\");\n\n if (parts.length === 1) {\n delete (config as unknown as Record<string, unknown>)[key];\n return;\n }\n\n let current: Record<string, unknown> = config as unknown as Record<string, unknown>;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current) || typeof current[part] !== \"object\") {\n return;\n }\n current = current[part] as Record<string, unknown>;\n }\n\n delete current[parts[parts.length - 1]];\n}\n\nfunction coerceConfigValue(value: string): string | number | boolean {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n\n if (/^-?\\d+(?:\\.\\d+)?$/.test(value)) {\n return Number(value);\n }\n\n return value;\n}\n","import { Command } from \"commander\";\nimport { LocalStore } from \"unforgit-db\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { generateEmbedding } from \"unforgit-core\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { parsePositiveInt } from \"unforgit-config\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\n\nconst cwd = process.cwd();\n\nexport const embeddingsCommand = new Command(\"embeddings\")\n .description(\"Manage memory embeddings for semantic search\");\n\nembeddingsCommand\n .command(\"backfill\")\n .description(\"Generate embeddings for memories that don't have them\")\n .option(\"--batch-size <n>\", \"Number of memories to process in parallel\", \"5\")\n .option(\"--delay <ms>\", \"Delay between batches (ms)\", \"500\")\n .option(\"--dry-run\", \"Show what would be done without making changes\")\n .option(\"--model <model>\", \"OpenAI embedding model\", \"text-embedding-3-small\")\n .action(async (opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig(cwd);\n const apiKey = process.env.OPENAI_API_KEY;\n\n if (!apiKey && !opts.dryRun) {\n logger.error(\"OpenAI API key not set.\");\n logger.error(\"Set the OPENAI_API_KEY environment variable.\");\n process.exit(EXIT_ERROR);\n }\n\n const dbPath = getDbPath(cwd);\n const store = new LocalStore(dbPath);\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n try {\n const memories = store.getMemoriesWithoutEmbeddings(orgId, repoId);\n const stats = store.getEmbeddingStats(orgId, repoId);\n\n logger.info(`Embedding stats:`);\n logger.info(` Total memories: ${stats.total}`);\n logger.info(` With embedding: ${stats.withEmbedding}`);\n logger.info(` Without embedding: ${stats.withoutEmbedding}`);\n logger.info(\"\");\n\n if (memories.length === 0) {\n logger.info(\"All memories already have embeddings.\");\n return;\n }\n\n logger.info(`Found ${memories.length} memories without embeddings.`);\n\n if (opts.dryRun) {\n logger.info(\"\\n[Dry run - no changes made]\");\n logger.info(\"Would generate embeddings for:\");\n for (const m of memories.slice(0, 10)) {\n logger.info(` - ${m.id.slice(0, 8)}: ${m.text.slice(0, 50)}...`);\n }\n if (memories.length > 10) {\n logger.info(` ... and ${memories.length - 10} more`);\n }\n return;\n }\n\n const batchSize = parsePositiveInt(opts.batchSize, \"batch-size\");\n const delay = parsePositiveInt(opts.delay, \"delay\");\n let processed = 0;\n let errors = 0;\n\n logger.info(`\\nGenerating embeddings (batch size: ${batchSize}, delay: ${delay}ms)...`);\n\n for (let i = 0; i < memories.length; i += batchSize) {\n const batch = memories.slice(i, i + batchSize);\n\n await Promise.all(\n batch.map(async (memory) => {\n try {\n const result = await generateEmbedding(memory.text, {\n apiKey,\n model: opts.model,\n });\n await store.storeEmbedding(memory.id, result.embedding, result.model);\n processed++;\n logger.progress(processed, memories.length, \"embeddings\");\n } catch (err) {\n errors++;\n logger.error(`${memory.id.slice(0, 8)}: ${err instanceof Error ? err.message : err}`);\n }\n })\n );\n\n if (i + batchSize < memories.length) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n logger.info(`\\nBackfill complete:`);\n logger.info(` Processed: ${processed}`);\n logger.info(` Errors: ${errors}`);\n } finally {\n store.close();\n }\n });\n\nembeddingsCommand\n .command(\"stats\")\n .description(\"Show embedding statistics\")\n .action(async () => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig(cwd);\n const dbPath = getDbPath(cwd);\n const store = new LocalStore(dbPath);\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n try {\n const stats = store.getEmbeddingStats(orgId, repoId);\n const coverage = stats.total > 0\n ? ((stats.withEmbedding / stats.total) * 100).toFixed(1)\n : \"0\";\n\n if (isJsonMode()) {\n outputJson({ ...stats, coverage: parseFloat(coverage) });\n return;\n }\n\n logger.info(\"Embedding Statistics\");\n logger.info(\"====================\");\n logger.info(`Total memories: ${stats.total}`);\n logger.info(`With embedding: ${stats.withEmbedding}`);\n logger.info(`Without embedding: ${stats.withoutEmbedding}`);\n logger.info(`Coverage: ${coverage}%`);\n\n if (stats.withoutEmbedding > 0) {\n logger.info(`\\nRun 'unforgit embeddings backfill' to generate missing embeddings.`);\n }\n } finally {\n store.close();\n }\n });\n\nembeddingsCommand\n .command(\"clear\")\n .description(\"Remove all embeddings (requires regeneration)\")\n .option(\"--yes\", \"Skip confirmation\")\n .action(async (opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n if (!opts.yes) {\n logger.info(\"This will delete all embeddings. They will need to be regenerated.\");\n logger.info(\"Use --yes to confirm.\");\n return;\n }\n\n const dbPath = getDbPath(cwd);\n const store = new LocalStore(dbPath);\n\n try {\n const deleted = store.clearEmbeddings();\n logger.info(`All embeddings cleared (${deleted} removed).`);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { confirm } from \"../utils.js\";\n\nexport const resetCommand = new Command(\"reset\")\n .description(\"Permanently delete all memories and related data\")\n .option(\"--local\", \"Reset local store only\")\n .option(\"--remote\", \"Reset remote store only\")\n .option(\"--force\", \"Skip confirmation prompt\")\n .addHelpText(\"after\", `\nExamples:\n unforgit reset Reset both local and remote\n unforgit reset --local Reset local store only\n unforgit reset --remote Reset remote store only\n unforgit reset --force Skip confirmation`)\n .action(async (opts) => {\n const resetLocal = opts.local || (!opts.local && !opts.remote);\n const resetRemote = opts.remote || (!opts.local && !opts.remote);\n\n const targets = [\n resetLocal ? \"local\" : null,\n resetRemote ? \"remote\" : null,\n ].filter(Boolean);\n\n if (!opts.force) {\n logger.info(\n `WARNING: This will permanently delete ALL memories, links, embeddings, and sync state from: ${targets.join(\" + \")}`,\n );\n logger.info(\"This action CANNOT be undone.\");\n\n const confirmed = await confirm(\"Type 'yes' to confirm\");\n if (!confirmed) {\n logger.info(\"Reset cancelled.\");\n return;\n }\n }\n\n const config = loadConfig();\n\n if (resetLocal) {\n const store = new LocalStore(getDbPath());\n try {\n const result = store.resetAll();\n logger.info(`Local reset complete:`);\n logger.info(` Memories deleted: ${result.memoriesDeleted}`);\n logger.info(` Links deleted: ${result.linksDeleted}`);\n logger.info(` Embeddings deleted: ${result.embeddingsDeleted}`);\n } finally {\n store.close();\n }\n }\n\n if (resetRemote) {\n if (!config.remote?.url) {\n if (opts.remote) {\n logger.error(\"No remote URL configured. Run 'unforgit init' first.\");\n process.exit(EXIT_ERROR);\n }\n logger.info(\"No remote configured, skipping remote reset.\");\n return;\n }\n\n const client = new RemoteClient(config.remote.url);\n const orgId = config.remote.orgId;\n const repoId = config.remote.repoId;\n\n if (!orgId || !repoId) {\n logger.error(\"orgId and repoId must be configured for remote reset.\");\n process.exit(EXIT_ERROR);\n }\n\n try {\n const result = await client.resetAll(orgId, repoId);\n logger.info(`Remote reset complete:`);\n logger.info(` Memories deleted: ${result.memoriesDeleted}`);\n logger.info(` Links deleted: ${result.linksDeleted}`);\n logger.info(` Embeddings deleted: ${result.embeddingsDeleted}`);\n } catch (err) {\n logger.error(err instanceof Error ? err.message : String(err));\n process.exit(EXIT_ERROR);\n }\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized, getConfigPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { maskKey, isJsonMode, outputJson } from \"../utils.js\";\nimport fs from \"node:fs\";\n\ninterface DiagnosticResult {\n check: string;\n status: \"ok\" | \"warn\" | \"error\";\n message: string;\n}\n\nexport const doctorCommand = new Command(\"doctor\")\n .description(\"Check system health and diagnose common issues\")\n .action(async () => {\n const results: DiagnosticResult[] = [];\n\n if (!isInitialized()) {\n results.push({\n check: \"initialization\",\n status: \"error\",\n message: \"Not an unforgit repository. Run 'unforgit init' first.\",\n });\n if (isJsonMode()) {\n outputJson({ results });\n return;\n }\n printResults(results);\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n results.push({ check: \"initialization\", status: \"ok\", message: \"Repository initialized\" });\n\n const configPath = getConfigPath();\n try {\n const config = loadConfig();\n results.push({ check: \"config\", status: \"ok\", message: `Valid config at ${configPath}` });\n\n if (process.platform !== \"win32\") {\n try {\n const stat = fs.statSync(configPath);\n const mode = stat.mode & 0o777;\n if (mode & 0o044) {\n results.push({\n check: \"config-permissions\",\n status: \"warn\",\n message: `Config readable by others (mode ${mode.toString(8)}). Run: chmod 600 ${configPath}`,\n });\n } else {\n results.push({ check: \"config-permissions\", status: \"ok\", message: \"Config file permissions are secure\" });\n }\n } catch {\n results.push({ check: \"config-permissions\", status: \"warn\", message: \"Could not check config file permissions\" });\n }\n }\n\n const store = new LocalStore(getDbPath());\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n store.list({ orgId, repoId, limit: 1 });\n results.push({ check: \"local-db\", status: \"ok\", message: \"SQLite database is accessible\" });\n\n const stats = store.getEmbeddingStats(orgId, repoId);\n if (stats.total === 0) {\n results.push({ check: \"embeddings\", status: \"ok\", message: \"No memories yet\" });\n } else if (stats.withoutEmbedding === 0) {\n results.push({ check: \"embeddings\", status: \"ok\", message: `All ${stats.total} memories have embeddings` });\n } else {\n const pct = ((stats.withEmbedding / stats.total) * 100).toFixed(1);\n results.push({\n check: \"embeddings\",\n status: \"warn\",\n message: `${stats.withoutEmbedding}/${stats.total} memories lack embeddings (${pct}% coverage). Run 'unforgit embeddings backfill'`,\n });\n }\n\n const pendingPush = store.getPendingPush();\n const conflicts = store.getConflicts();\n if (conflicts.length > 0) {\n results.push({\n check: \"sync\",\n status: \"warn\",\n message: `${conflicts.length} sync conflict(s) need resolution`,\n });\n } else if (pendingPush.length > 0) {\n results.push({\n check: \"sync\",\n status: \"ok\",\n message: `${pendingPush.length} memory(s) pending push`,\n });\n } else {\n results.push({ check: \"sync\", status: \"ok\", message: \"Sync state clean\" });\n }\n } finally {\n store.close();\n }\n\n const apiKey = process.env.UNFORGIT_API_KEY;\n if (config.remote.url) {\n if (!apiKey) {\n results.push({\n check: \"auth\",\n status: \"warn\",\n message: \"No API key configured. Set the UNFORGIT_API_KEY environment variable.\",\n });\n } else {\n results.push({\n check: \"auth\",\n status: \"ok\",\n message: `API key configured: ${maskKey(apiKey)}`,\n });\n }\n\n try {\n const res = await fetch(`${config.remote.url}/health`);\n if (res.ok) {\n results.push({ check: \"remote\", status: \"ok\", message: `Server reachable at ${config.remote.url}` });\n\n if (apiKey) {\n const client = new RemoteClient(config.remote.url);\n try {\n await client.listApiKeys();\n results.push({ check: \"remote-auth\", status: \"ok\", message: \"API key is valid\" });\n } catch {\n results.push({ check: \"remote-auth\", status: \"error\", message: \"API key is invalid or expired\" });\n }\n }\n } else {\n results.push({\n check: \"remote\",\n status: \"error\",\n message: `Server returned HTTP ${res.status}`,\n });\n }\n } catch (err) {\n results.push({\n check: \"remote\",\n status: \"error\",\n message: `Cannot connect to ${config.remote.url}: ${err instanceof Error ? err.message : err}`,\n });\n }\n } else {\n results.push({ check: \"remote\", status: \"warn\", message: \"No remote URL configured\" });\n }\n\n const openaiKey = process.env.OPENAI_API_KEY;\n if (openaiKey) {\n results.push({ check: \"openai\", status: \"ok\", message: `OpenAI API key configured: ${maskKey(openaiKey)}` });\n } else {\n results.push({\n check: \"openai\",\n status: \"warn\",\n message: \"No OpenAI API key. Auto-consolidation and embeddings backfill require it.\",\n });\n }\n } catch (err) {\n results.push({\n check: \"config\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n }\n\n if (isJsonMode()) {\n outputJson({ results });\n return;\n }\n\n printResults(results);\n });\n\nfunction printResults(results: DiagnosticResult[]): void {\n const icons = { ok: \"[ok]\", warn: \"[!!]\", error: \"[ERR]\" };\n\n logger.info(\"Unforgit Doctor\\n\");\n\n for (const r of results) {\n const icon = icons[r.status];\n logger.info(` ${icon} ${r.check}: ${r.message}`);\n }\n\n const errors = results.filter((r) => r.status === \"error\").length;\n const warnings = results.filter((r) => r.status === \"warn\").length;\n\n logger.info(\"\");\n if (errors > 0) {\n logger.info(`${errors} error(s), ${warnings} warning(s)`);\n } else if (warnings > 0) {\n logger.info(`No errors, ${warnings} warning(s)`);\n } else {\n logger.info(\"All checks passed!\");\n }\n}\n","import { Command } from \"commander\";\nimport { logger } from \"../logger.js\";\n\nconst BASH_COMPLETION = `\n_unforgit_completions() {\n local cur prev commands\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n commands=\"init add recall promote consolidate deprecate supersede delete restore web link unlink links merge remerge similar history auto-consolidate unconsolidate status push pull remote log diff keys auth config embeddings reset doctor curate completion\"\n\n case \"\\${prev}\" in\n unforgit)\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n return 0\n ;;\n remote)\n COMPREPLY=( $(compgen -W \"add remove set-url show\" -- \"\\${cur}\") )\n return 0\n ;;\n keys)\n COMPREPLY=( $(compgen -W \"create list revoke\" -- \"\\${cur}\") )\n return 0\n ;;\n auth)\n COMPREPLY=( $(compgen -W \"set status remove openai openai-remove\" -- \"\\${cur}\") )\n return 0\n ;;\n config)\n COMPREPLY=( $(compgen -W \"list get set unset\" -- \"\\${cur}\") )\n return 0\n ;;\n embeddings)\n COMPREPLY=( $(compgen -W \"backfill stats clear\" -- \"\\${cur}\") )\n return 0\n ;;\n --type)\n COMPREPLY=( $(compgen -W \"episodic semantic procedural\" -- \"\\${cur}\") )\n return 0\n ;;\n esac\n\n if [[ \"\\${cur}\" == -* ]]; then\n COMPREPLY=( $(compgen -W \"--verbose --quiet --json --help --version\" -- \"\\${cur}\") )\n return 0\n fi\n}\ncomplete -F _unforgit_completions unforgit\n`.trim();\n\nconst ZSH_COMPLETION = `\n#compdef unforgit\n\n_unforgit() {\n local -a commands\n commands=(\n 'init:Initialize Unforgit in the current repository'\n 'add:Add a memory'\n 'recall:Recall memories matching a query'\n 'promote:Promote a local memory to remote'\n 'consolidate:Consolidate episodic memories'\n 'deprecate:Mark a memory as deprecated'\n 'supersede:Mark a memory as superseded'\n 'delete:Soft delete a memory'\n 'restore:Restore a soft-deleted memory'\n 'web:Start the web dashboard'\n 'link:Create a link between memories'\n 'unlink:Remove a link between memories'\n 'links:List links for a memory'\n 'merge:Consolidate multiple local memories'\n 'remerge:Update an existing consolidation'\n 'similar:Find similar memories'\n 'history:Show consolidation history'\n 'auto-consolidate:AI-powered consolidation'\n 'unconsolidate:Revert a consolidation'\n 'status:Show sync status'\n 'push:Push local memories to remote'\n 'pull:Pull remote memories to local'\n 'remote:Manage remotes'\n 'log:Show memory history log'\n 'diff:Show differences between local and remote'\n 'keys:Manage API keys'\n 'auth:Configure authentication'\n 'config:Manage configuration'\n 'embeddings:Manage embeddings'\n 'reset:Delete all memories'\n 'doctor:Check system health'\n 'curate:Preview or run lifecycle maintenance'\n 'completion:Generate shell completions'\n )\n\n _arguments -C \\\\\n '--verbose[Enable verbose output]' \\\\\n '--quiet[Suppress non-essential output]' \\\\\n '--json[Output as JSON]' \\\\\n '--help[Show help]' \\\\\n '--version[Show version]' \\\\\n '1: :->cmd' \\\\\n '*::arg:->args'\n\n case \"$state\" in\n cmd)\n _describe 'command' commands\n ;;\n esac\n}\n\n_unforgit \"$@\"\n`.trim();\n\nconst FISH_COMPLETION = `\ncomplete -c unforgit -f\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'init' -d 'Initialize Unforgit'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'add' -d 'Add a memory'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'recall' -d 'Recall memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'promote' -d 'Promote to remote'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'consolidate' -d 'Consolidate memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'deprecate' -d 'Deprecate a memory'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'supersede' -d 'Supersede a memory'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'delete' -d 'Delete a memory'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'restore' -d 'Restore a memory'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'web' -d 'Start web dashboard'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'link' -d 'Link two memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'unlink' -d 'Unlink memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'links' -d 'List links'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'merge' -d 'Merge memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'remerge' -d 'Update consolidation'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'similar' -d 'Find similar memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'history' -d 'Consolidation history'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'auto-consolidate' -d 'AI consolidation'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'unconsolidate' -d 'Revert consolidation'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'status' -d 'Show sync status'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'push' -d 'Push to remote'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'pull' -d 'Pull from remote'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'remote' -d 'Manage remotes'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'log' -d 'Memory log'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'diff' -d 'Show differences'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'keys' -d 'Manage API keys'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'auth' -d 'Configure auth'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'config' -d 'Manage config'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'embeddings' -d 'Manage embeddings'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'reset' -d 'Delete all memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'doctor' -d 'Check system health'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'curate' -d 'Preview or run lifecycle maintenance'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'completion' -d 'Generate completions'\ncomplete -c unforgit -l verbose -d 'Enable verbose output'\ncomplete -c unforgit -l quiet -d 'Suppress non-essential output'\ncomplete -c unforgit -l json -d 'Output as JSON'\n`.trim();\n\nexport const completionCommand = new Command(\"completion\")\n .description(\"Generate shell completion scripts\")\n .argument(\"<shell>\", \"Shell type (bash, zsh, fish)\")\n .addHelpText(\"after\", `\nExamples:\n unforgit completion bash >> ~/.bashrc\n unforgit completion zsh >> ~/.zshrc\n unforgit completion fish > ~/.config/fish/completions/unforgit.fish`)\n .action((shell: string) => {\n switch (shell.toLowerCase()) {\n case \"bash\":\n console.log(BASH_COMPLETION);\n break;\n case \"zsh\":\n console.log(ZSH_COMPLETION);\n break;\n case \"fish\":\n console.log(FISH_COMPLETION);\n break;\n default:\n logger.error(`Unsupported shell: ${shell}. Use bash, zsh, or fish.`);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { getDbPath, isInitialized, loadConfig } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { runLocalLifecycleMaintenance } from \"unforgit-core\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR, EXIT_ERROR } from \"../exit-codes.js\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\n\nfunction formatCandidatePreview(candidate: {\n reason: string;\n suggestedTags: string[];\n memories: Array<{ id: string; memoryType: string; text: string }>;\n}): string {\n const lines = [\n `Group: ${candidate.reason}`,\n `Tags: ${candidate.suggestedTags.join(\", \") || \"none\"}`,\n \"Memories:\",\n ];\n\n for (const memory of candidate.memories) {\n const text = memory.text.length > 80 ? `${memory.text.slice(0, 80)}...` : memory.text;\n lines.push(` - [${memory.memoryType}] ${memory.id.slice(0, 8)}: ${text}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport const curateCommand = new Command(\"curate\")\n .description(\"Preview or run lifecycle maintenance for repository memories\")\n .option(\"--remote\", \"Run maintenance against the remote server\")\n .option(\"--execute\", \"Apply changes instead of previewing them\")\n .option(\"--model <model>\", \"OpenAI model to use for consolidation\")\n .option(\"--no-preserve\", \"Do not preserve original memories during consolidation\")\n .addHelpText(\"after\", `\nExamples:\n unforgit curate\n unforgit curate --execute\n unforgit curate --remote --execute --model gpt-5.4`)\n .action(async (opts) => {\n if (!isInitialized()) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n const dryRun = opts.execute ? false : undefined;\n\n try {\n const result = opts.remote\n ? await runRemoteCurate(config.remote.url, {\n orgId,\n repoId,\n dryRun,\n model: opts.model,\n preserveOriginals: opts.preserve !== false,\n })\n : await runLocalCurate(getDbPath(), orgId, repoId, {\n dryRun,\n model: opts.model,\n preserveOriginals: opts.preserve !== false,\n lifecycle: config.lifecycle,\n });\n\n if (isJsonMode()) {\n outputJson(result);\n return;\n }\n\n logger.info(result.dryRun ? \"Lifecycle maintenance preview\\n\" : \"Lifecycle maintenance execution\\n\");\n logger.info(`Active memories scanned: ${result.totalActiveMemories}`);\n logger.info(`Expiring episodic memories: ${result.expiredCandidates.length}`);\n logger.info(`Strengthened candidates: ${result.strengthenedCandidates.length}`);\n logger.info(`Consolidation candidates: ${result.consolidationCandidates.length}`);\n\n if (result.expiredCandidates.length > 0) {\n logger.info(\"\\nExpired candidates:\");\n for (const candidate of result.expiredCandidates.slice(0, 10)) {\n logger.info(` ${candidate.id.slice(0, 8)} (${candidate.ttlSeconds}s): ${candidate.textPreview}`);\n }\n }\n\n if (result.strengthenedCandidates.length > 0) {\n logger.info(\"\\nStrengthened candidates:\");\n for (const candidate of result.strengthenedCandidates.slice(0, 10)) {\n logger.info(\n ` ${candidate.id.slice(0, 8)} [${candidate.recommendedAction}] (${candidate.usageCount} recalls): ${candidate.textPreview}`,\n );\n }\n }\n\n if (result.consolidationCandidates.length > 0) {\n logger.info(\"\\nConsolidation candidates:\");\n for (const candidate of result.consolidationCandidates.slice(0, 5)) {\n logger.info(formatCandidatePreview(candidate));\n logger.info(\"\");\n }\n }\n\n if (!result.dryRun && result.executedConsolidations.length > 0) {\n logger.info(\"Executed consolidations:\");\n for (const executed of result.executedConsolidations) {\n logger.info(\n ` ${executed.consolidatedId.slice(0, 8)} from ${executed.sourceIds.length} memories`,\n );\n }\n }\n\n for (const warning of result.warnings) {\n logger.warn(warning);\n }\n\n for (const error of result.errors) {\n logger.error(error);\n }\n\n if (result.dryRun) {\n logger.info(\"\\nDry run complete. Re-run with --execute to apply expiry and consolidation.\");\n }\n } catch (error) {\n logger.error(\n `Curate: ${error instanceof Error ? error.message : error}`,\n );\n process.exit(EXIT_ERROR);\n }\n });\n\nasync function runLocalCurate(\n dbPath: string,\n orgId: string,\n repoId: string,\n options: Parameters<typeof runLocalLifecycleMaintenance>[3],\n) {\n const store = new LocalStore(dbPath);\n try {\n return await runLocalLifecycleMaintenance(store, orgId, repoId, options);\n } finally {\n store.close();\n }\n}\n\nasync function runRemoteCurate(\n remoteUrl: string,\n options: {\n orgId: string;\n repoId: string;\n dryRun?: boolean;\n model?: string;\n preserveOriginals?: boolean;\n },\n) {\n if (!remoteUrl) {\n throw new Error(\"Remote URL not configured. Update unforgit.yaml or omit --remote.\");\n }\n\n const client = new RemoteClient(remoteUrl);\n return client.runLifecycle(options);\n}\n"],"mappings":"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","names":["Command","fs","cwd","cwd","fs","Command","getDbPath","LocalStore","Command","getDbPath","Command","loadConfig","getDbPath","LocalStore","Command","loadConfig","LocalStore","getDbPath","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","LocalStore","getDbPath","RemoteClient","Command","loadConfig","RemoteClient","parsePositiveInt","Command","loadConfig","RemoteClient","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","RemoteClient","LocalStore","getDbPath","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","RemoteClient","LocalStore","getDbPath","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","RemoteClient","LocalStore","getDbPath","Command","path","fs","isInitialized","Command","cwd","isInitialized","path","fs","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","RemoteClient","LocalStore","getDbPath","Command","LocalStore","loadConfig","getDbPath","isInitialized","parsePositiveInt","validateMemoryType","Command","isInitialized","validateMemoryType","loadConfig","LocalStore","getDbPath","parsePositiveInt","Command","LocalStore","loadConfig","getDbPath","isInitialized","readline","parseThreshold","parsePositiveInt","validateMemoryType","cwd","Command","isInitialized","loadConfig","LocalStore","getDbPath","Command","getDbPath","isInitialized","LocalStore","Command","cwd","isInitialized","getDbPath","LocalStore","Command","loadConfig","getDbPath","isInitialized","LocalStore","Command","isInitialized","loadConfig","LocalStore","getDbPath","Command","loadConfig","getDbPath","isInitialized","LocalStore","RemoteClient","Command","isInitialized","loadConfig","LocalStore","getDbPath","RemoteClient","Command","loadConfig","getDbPath","isInitialized","LocalStore","RemoteClient","Command","isInitialized","loadConfig","LocalStore","getDbPath","RemoteClient","Command","isInitialized","loadConfig","saveConfig","Command","isInitialized","loadConfig","saveConfig","Command","loadConfig","getDbPath","isInitialized","LocalStore","parsePositiveInt","validateMemoryType","Command","isInitialized","loadConfig","LocalStore","getDbPath","parsePositiveInt","validateMemoryType","Command","loadConfig","getDbPath","isInitialized","LocalStore","RemoteClient","Command","isInitialized","loadConfig","LocalStore","getDbPath","RemoteClient","Command","loadConfig","isInitialized","RemoteClient","isInitialized","loadConfig","Command","RemoteClient","Command","loadConfig","isInitialized","Command","isInitialized","loadConfig","Command","isInitialized","loadConfig","saveConfig","Command","isInitialized","loadConfig","saveConfig","Command","LocalStore","loadConfig","getDbPath","isInitialized","parsePositiveInt","cwd","Command","isInitialized","loadConfig","getDbPath","LocalStore","parsePositiveInt","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","LocalStore","getDbPath","RemoteClient","Command","loadConfig","getDbPath","isInitialized","getConfigPath","LocalStore","RemoteClient","fs","Command","isInitialized","getConfigPath","loadConfig","LocalStore","getDbPath","RemoteClient","Command","Command","Command","getDbPath","isInitialized","loadConfig","LocalStore","RemoteClient","formatCandidatePreview","Command","isInitialized","loadConfig","getDbPath","LocalStore","RemoteClient","require","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/utils.ts","../src/logger.ts","../src/ide-integration.ts","../src/commands/add.ts","../src/exit-codes.ts","../src/commands/recall.ts","../src/commands/promote.ts","../src/commands/consolidate.ts","../src/commands/deprecate.ts","../src/commands/supersede.ts","../src/commands/delete.ts","../src/commands/web.ts","../src/commands/link.ts","../src/commands/merge.ts","../src/commands/auto-consolidate.ts","../src/commands/unconsolidate.ts","../src/commands/status.ts","../src/commands/push.ts","../src/commands/pull.ts","../src/commands/remote.ts","../src/commands/log.ts","../src/commands/diff.ts","../src/commands/keys.ts","../src/commands/auth.ts","../src/commands/config.ts","../src/commands/embeddings.ts","../src/commands/reset.ts","../src/commands/backups.ts","../src/commands/doctor.ts","../src/commands/completion.ts","../src/commands/curate.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { recallCommand } from \"./commands/recall.js\";\nimport { promoteCommand } from \"./commands/promote.js\";\nimport { consolidateCommand } from \"./commands/consolidate.js\";\nimport { deprecateCommand } from \"./commands/deprecate.js\";\nimport { supersedeCommand } from \"./commands/supersede.js\";\nimport { deleteCommand, restoreCommand } from \"./commands/delete.js\";\nimport { webCommand } from \"./commands/web.js\";\nimport { linkCommand, unlinkCommand, linksCommand } from \"./commands/link.js\";\nimport {\n mergeCommand,\n remergeCommand,\n similarCommand,\n historyCommand,\n} from \"./commands/merge.js\";\nimport { autoConsolidateCommand } from \"./commands/auto-consolidate.js\";\nimport { unconsolidateCommand } from \"./commands/unconsolidate.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { pushCommand } from \"./commands/push.js\";\nimport { pullCommand } from \"./commands/pull.js\";\nimport { remoteCommand } from \"./commands/remote.js\";\nimport { logCommand } from \"./commands/log.js\";\nimport { diffCommand } from \"./commands/diff.js\";\nimport { keysCommand } from \"./commands/keys.js\";\nimport { authCommand } from \"./commands/auth.js\";\nimport { configCommand } from \"./commands/config.js\";\nimport { embeddingsCommand } from \"./commands/embeddings.js\";\nimport { resetCommand } from \"./commands/reset.js\";\nimport { backupsCommand } from \"./commands/backups.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { completionCommand } from \"./commands/completion.js\";\nimport { curateCommand } from \"./commands/curate.js\";\nimport { createRequire } from \"node:module\";\nimport { setVerbosity } from \"./logger.js\";\nimport { EXIT_ERROR, EXIT_SIGINT, EXIT_SIGTERM } from \"./exit-codes.js\";\nimport { setJsonMode } from \"./utils.js\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\");\n\nconst cleanupHandlers: Array<() => void> = [];\nexport function registerCleanup(fn: () => void) {\n cleanupHandlers.push(fn);\n}\nexport function unregisterCleanup(fn: () => void) {\n const idx = cleanupHandlers.indexOf(fn);\n if (idx >= 0) cleanupHandlers.splice(idx, 1);\n}\n\nfunction runCleanup() {\n for (const fn of cleanupHandlers) {\n try { fn(); } catch { /* best-effort */ }\n }\n}\n\nprocess.on(\"SIGINT\", () => { runCleanup(); process.exit(EXIT_SIGINT); });\nprocess.on(\"SIGTERM\", () => { runCleanup(); process.exit(EXIT_SIGTERM); });\nprocess.on(\"uncaughtException\", (err) => {\n console.error(`fatal: ${err.message}`);\n runCleanup();\n process.exit(EXIT_ERROR);\n});\nprocess.on(\"unhandledRejection\", (err) => {\n console.error(`fatal: ${err instanceof Error ? err.message : err}`);\n runCleanup();\n process.exit(EXIT_ERROR);\n});\n\nconst program = new Command();\n\nprogram\n .name(\"unforgit\")\n .description(\"Unforgit — repository memory for agents and developers\")\n .version(pkg.version)\n .option(\"--verbose\", \"Enable verbose output\")\n .option(\"--quiet\", \"Suppress non-essential output\")\n .option(\"--json\", \"Output results as JSON (for scripting)\")\n .hook(\"preAction\", () => {\n const opts = program.opts();\n if (opts.quiet) setVerbosity(0);\n else if (opts.verbose) setVerbosity(2);\n if (opts.json) setJsonMode(true);\n });\n\nprogram.addCommand(initCommand);\nprogram.addCommand(addCommand);\nprogram.addCommand(recallCommand);\nprogram.addCommand(promoteCommand);\nprogram.addCommand(consolidateCommand);\nprogram.addCommand(deprecateCommand);\nprogram.addCommand(supersedeCommand);\nprogram.addCommand(webCommand);\nprogram.addCommand(linkCommand);\nprogram.addCommand(unlinkCommand);\nprogram.addCommand(linksCommand);\nprogram.addCommand(mergeCommand);\nprogram.addCommand(remergeCommand);\nprogram.addCommand(similarCommand);\nprogram.addCommand(historyCommand);\nprogram.addCommand(deleteCommand);\nprogram.addCommand(restoreCommand);\nprogram.addCommand(autoConsolidateCommand);\nprogram.addCommand(unconsolidateCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(pushCommand);\nprogram.addCommand(pullCommand);\nprogram.addCommand(remoteCommand);\nprogram.addCommand(logCommand);\nprogram.addCommand(diffCommand);\nprogram.addCommand(keysCommand);\nprogram.addCommand(authCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(embeddingsCommand);\nprogram.addCommand(resetCommand);\nprogram.addCommand(backupsCommand);\nprogram.addCommand(doctorCommand);\nprogram.addCommand(curateCommand);\nprogram.addCommand(completionCommand);\n\nprogram.parseAsync().catch((err) => {\n console.error(`fatal: ${err instanceof Error ? err.message : err}`);\n runCleanup();\n process.exit(EXIT_ERROR);\n});\n","import fs from \"node:fs\";\nimport { Command } from \"commander\";\nimport { logger } from \"../logger.js\";\nimport {\n getDataDir,\n getConfigPath,\n getDbPath,\n defaultConfig,\n saveConfig,\n isInitialized,\n detectGitInfo,\n} from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport {\n detectIdes,\n setupIdes,\n logIdeResults,\n parseIdeOption,\n ALL_IDE_NAMES,\n type IdeName,\n} from \"../ide-integration.js\";\n\nexport const initCommand = new Command(\"init\")\n .description(\"Initialize Unforgit in the current repository\")\n .option(\"--org-id <orgId>\", \"Override auto-detected organization ID\")\n .option(\"--repo-id <repoId>\", \"Override auto-detected repository ID\")\n .option(\"--remote-url <url>\", \"Remote API URL\", \"http://localhost:3737\")\n .option(\n \"--ide <ides>\",\n `IDE integrations to set up: ${ALL_IDE_NAMES.join(\", \")}, all (default: auto-detect)`,\n )\n .option(\"--no-ide\", \"Skip all IDE integrations\")\n .option(\"--no-cursor-rule\", \"Skip IDE integrations (deprecated, use --no-ide)\")\n .action((opts) => {\n const cwd = process.cwd();\n\n if (isInitialized(cwd)) {\n logger.info(\"Unforgit is already initialized in this directory.\");\n return;\n }\n\n const dataDir = getDataDir(cwd);\n fs.mkdirSync(dataDir, { recursive: true });\n\n const git = detectGitInfo(cwd);\n const config = defaultConfig();\n\n config.remote.orgId = opts.orgId ?? git.orgId;\n config.remote.repoId = opts.repoId ?? git.repoId;\n if (opts.remoteUrl) config.remote.url = opts.remoteUrl;\n\n saveConfig(config, cwd);\n\n const store = new LocalStore(getDbPath(cwd));\n store.close();\n\n logger.info(`Initialized Unforgit at ${dataDir}`);\n logger.info(` Config: ${getConfigPath(cwd)}`);\n logger.info(` Local DB: ${getDbPath(cwd)}`);\n\n if (config.remote.orgId || config.remote.repoId) {\n logger.info(` Org: ${config.remote.orgId}`);\n logger.info(` Repo: ${config.remote.repoId}`);\n if (!opts.orgId && !opts.repoId) {\n logger.info(\" (auto-detected from git remote)\");\n }\n } else {\n logger.info(\n \"\\nTip: Set org_id and repo_id in .unforgit/unforgit.yaml or add a git remote.\",\n );\n }\n\n const skipIde = opts.ide === false || opts.cursorRule === false;\n\n if (!skipIde) {\n let ides: IdeName[];\n\n if (opts.ide && typeof opts.ide === \"string\") {\n ides = parseIdeOption(opts.ide);\n } else {\n ides = detectIdes(cwd);\n if (ides.length === 0) {\n ides = [\"cursor\"];\n logger.info(\n \"\\n No IDE detected, defaulting to Cursor. Use --ide to specify.\",\n );\n } else {\n logger.info(\n `\\n Auto-detected IDEs: ${ides.join(\", \")}`,\n );\n }\n }\n\n const results = setupIdes(cwd, ides);\n logIdeResults(results);\n } else {\n logger.info(\"\\n IDE integration: skipped\");\n }\n });\n","import readline from \"node:readline\";\n\nexport function truncate(text: string, maxLength: number): string {\n const singleLine = text.replace(/\\n/g, \" \").trim();\n if (singleLine.length <= maxLength) return singleLine;\n return singleLine.slice(0, maxLength - 3) + \"...\";\n}\n\nexport function maskKey(key: string): string {\n if (key.length <= 10) return \"***\";\n return `${key.slice(0, 6)}...${key.slice(-4)}`;\n}\n\nexport function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (yes/no): `, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === \"yes\");\n });\n });\n}\n\nlet jsonMode = false;\n\nexport function setJsonMode(enabled: boolean): void {\n jsonMode = enabled;\n}\n\nexport function isJsonMode(): boolean {\n return jsonMode;\n}\n\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function paginate<T>(items: T[], page: number, perPage: number): { items: T[]; totalPages: number; currentPage: number; total: number } {\n const total = items.length;\n const totalPages = Math.ceil(total / perPage);\n const currentPage = Math.min(page, totalPages);\n const start = (currentPage - 1) * perPage;\n return {\n items: items.slice(start, start + perPage),\n totalPages,\n currentPage,\n total,\n };\n}\n","import { isJsonMode } from \"./utils.js\";\n\ntype Verbosity = 0 | 1 | 2;\n\nlet level: Verbosity = 1;\n\nexport function setVerbosity(v: Verbosity): void {\n level = v;\n}\n\nexport function getVerbosity(): Verbosity {\n return level;\n}\n\nconst REDACTED = \"[REDACTED]\";\n\nconst secretPatterns: RegExp[] = [\n /\\b([A-Z][A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD))\\s*=\\s*([^\\s]+)/gi,\n /\\b(authorization\\s*:\\s*bearer)\\s+([^\\s]+)/gi,\n /\\b(client_secret)\\s*=\\s*([^\\s&]+)/gi,\n /(postgres(?:ql)?:\\/\\/[^:\\s/@]+:)([^@\\s]+)(@)/gi,\n];\n\nexport function redactSecrets(msg: string): string {\n return msg\n .replace(secretPatterns[0], (_match, prefix) => `${prefix}=${REDACTED}`)\n .replace(secretPatterns[1], (_match, prefix) => `${prefix} ${REDACTED}`)\n .replace(secretPatterns[2], (_match, prefix) => `${prefix}=${REDACTED}`)\n .replace(secretPatterns[3], (_match, prefix, _secret, suffix) => `${prefix}${REDACTED}${suffix}`);\n}\n\nfunction safeMessage(msg: string): string {\n return redactSecrets(msg);\n}\n\nexport const logger = {\n fatal(msg: string): void {\n if (!isJsonMode()) console.error(`fatal: ${safeMessage(msg)}`);\n },\n\n error(msg: string): void {\n if (!isJsonMode()) console.error(`error: ${safeMessage(msg)}`);\n },\n\n warn(msg: string): void {\n if (level >= 1 && !isJsonMode()) console.error(`warning: ${safeMessage(msg)}`);\n },\n\n info(msg: string): void {\n if (level >= 1 && !isJsonMode()) console.log(safeMessage(msg));\n },\n\n debug(msg: string): void {\n if (level >= 2 && !isJsonMode()) console.error(`debug: ${safeMessage(msg)}`);\n },\n\n progress(current: number, total: number, label?: string): void {\n if (level >= 1 && !isJsonMode()) {\n const pct = total > 0 ? Math.round((current / total) * 100) : 0;\n const suffix = label ? ` ${safeMessage(label)}` : \"\";\n process.stdout.write(`\\rProcessing ${current}/${total} (${pct}%)${suffix}`);\n if (current === total) process.stdout.write(\"\\n\");\n }\n },\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { logger } from \"./logger.js\";\n\nexport type IdeName = \"cursor\" | \"claude\" | \"vscode\" | \"windsurf\";\n\nexport const ALL_IDE_NAMES: IdeName[] = [\n \"cursor\",\n \"claude\",\n \"vscode\",\n \"windsurf\",\n];\n\nconst UNFORGIT_MARKER = \"Unforgit Memory Integration\";\n\nconst MEMORY_INSTRUCTIONS = `# Unforgit Memory Integration\n\nYou have access to \\`unforgit_recall\\` and \\`unforgit_add\\` MCP tools for persistent repository memory across sessions.\n\n## 1. Recall at the Start\n\nAt the **beginning of every conversation**, use the \\`unforgit_recall\\` tool with a query based on the user's first message to retrieve relevant context from past sessions.\n\nUse recalled memories to avoid repeating past mistakes, follow known conventions, and apply previous decisions.\n\n## 2. Save During the Conversation\n\nSave memories **as soon as something noteworthy happens** — don't wait until the end.\n\nTrigger a save with the \\`unforgit_add\\` tool immediately after:\n- A bug is found and fixed\n- An architectural or design decision is made\n- A non-obvious gotcha or workaround is discovered\n- A new convention or pattern is established\n- A deployment/setup procedure is figured out\n\n### Memory types\n\n| Type | When | Example |\n|------|------|---------|\n| \\`semantic\\` | Decisions, conventions, architecture facts | \"We use UTC timestamps everywhere\" |\n| \\`procedural\\` | Workflows, how-tos, playbooks | \"To deploy: run make release, then kubectl apply\" |\n| \\`episodic\\` | Bugs found, gotchas, observations | \"Found race condition in queue worker\" |\n\n### Rules\n\n- Keep text concise but self-contained — a future reader should understand it without extra context\n- Use meaningful tags for discoverability (e.g. \\`[\"auth\", \"bug\"]\\`, \\`[\"deploy\", \"playbook\"]\\`)\n- Prefer \\`semantic\\` for stable facts, \\`procedural\\` for how-tos, \\`episodic\\` for transient observations\n- Do NOT save trivial changes, obvious things, or info already in the codebase docs\n- Quality over quantity — only save what's genuinely useful for future sessions\n- **Always write memory text in English**, regardless of the language the user is speaking`;\n\ninterface SetupAction {\n path: string;\n action: \"created\" | \"updated\" | \"exists\";\n}\n\ninterface IdeSetupResult {\n ide: IdeName;\n rules?: SetupAction;\n mcp?: SetupAction;\n}\n\nfunction upsertJsonMcp(\n filePath: string,\n serverKey: string,\n mcpEntry: Record<string, unknown>,\n): SetupAction {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n\n const fd = fs.openSync(filePath, \"a+\");\n try {\n const raw = fs.readFileSync(fd, \"utf-8\");\n if (raw.trim().length === 0) {\n const config = { [serverKey]: { unforgit: mcpEntry } };\n fs.writeSync(fd, JSON.stringify(config, null, 2) + \"\\n\", 0, \"utf-8\");\n return { path: filePath, action: \"created\" };\n }\n\n const existing = JSON.parse(raw);\n const servers = existing[serverKey];\n if (servers?.unforgit) {\n return { path: filePath, action: \"exists\" };\n }\n\n existing[serverKey] = existing[serverKey] || {};\n existing[serverKey].unforgit = mcpEntry;\n fs.ftruncateSync(fd, 0);\n fs.writeSync(fd, JSON.stringify(existing, null, 2) + \"\\n\", 0, \"utf-8\");\n return { path: filePath, action: \"updated\" };\n } finally {\n fs.closeSync(fd);\n }\n}\n\nfunction appendOrCreateMarkdown(\n filePath: string,\n content: string,\n): SetupAction {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n\n const fd = fs.openSync(filePath, \"a+\");\n try {\n const existing = fs.readFileSync(fd, \"utf-8\");\n if (existing.length === 0) {\n fs.writeSync(fd, content + \"\\n\", 0, \"utf-8\");\n return { path: filePath, action: \"created\" };\n }\n\n if (existing.includes(UNFORGIT_MARKER)) {\n return { path: filePath, action: \"exists\" };\n }\n\n const separator = existing.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n fs.writeSync(fd, separator + content + \"\\n\", undefined, \"utf-8\");\n return { path: filePath, action: \"updated\" };\n } finally {\n fs.closeSync(fd);\n }\n}\n\nfunction replaceMarkdownIfMissingMarker(\n filePath: string,\n content: string,\n): SetupAction {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n\n const fd = fs.openSync(filePath, \"a+\");\n try {\n const existing = fs.readFileSync(fd, \"utf-8\");\n if (existing.includes(UNFORGIT_MARKER)) {\n return { path: filePath, action: \"exists\" };\n }\n\n fs.ftruncateSync(fd, 0);\n fs.writeSync(fd, content, 0, \"utf-8\");\n return { path: filePath, action: existing.length === 0 ? \"created\" : \"updated\" };\n } finally {\n fs.closeSync(fd);\n }\n}\n\n// --- Cursor ---\n\nconst CURSOR_RULE_CONTENT = `---\ndescription: Auto-manage repository memory with Unforgit via MCP tools\nalwaysApply: true\n---\n\n${MEMORY_INSTRUCTIONS}\n`;\n\nfunction setupCursor(cwd: string): IdeSetupResult {\n const rulesDir = path.join(cwd, \".cursor\", \"rules\");\n const rulePath = path.join(rulesDir, \"unforgit-memory.mdc\");\n const rules = replaceMarkdownIfMissingMarker(rulePath, CURSOR_RULE_CONTENT);\n\n const mcpPath = path.join(cwd, \".cursor\", \"mcp.json\");\n const mcp = upsertJsonMcp(mcpPath, \"mcpServers\", {\n command: \"unforgit-mcp\",\n args: [],\n });\n\n return { ide: \"cursor\", rules, mcp };\n}\n\n// --- Claude Code ---\n\nfunction setupClaude(cwd: string): IdeSetupResult {\n const claudeMdPath = path.join(cwd, \"CLAUDE.md\");\n const rules = appendOrCreateMarkdown(claudeMdPath, MEMORY_INSTRUCTIONS);\n\n const mcpPath = path.join(cwd, \".mcp.json\");\n const mcp = upsertJsonMcp(mcpPath, \"mcpServers\", {\n command: \"unforgit-mcp\",\n args: [],\n });\n\n return { ide: \"claude\", rules, mcp };\n}\n\n// --- VS Code (GitHub Copilot) ---\n\nfunction setupVscode(cwd: string): IdeSetupResult {\n const instructionsPath = path.join(\n cwd,\n \".github\",\n \"copilot-instructions.md\",\n );\n const rules = appendOrCreateMarkdown(instructionsPath, MEMORY_INSTRUCTIONS);\n\n const mcpPath = path.join(cwd, \".vscode\", \"mcp.json\");\n const mcp = upsertJsonMcp(mcpPath, \"servers\", {\n type: \"stdio\",\n command: \"unforgit-mcp\",\n });\n\n return { ide: \"vscode\", rules, mcp };\n}\n\n// --- Windsurf ---\n\nconst WINDSURF_RULE_CONTENT = `${MEMORY_INSTRUCTIONS}\n`;\n\nfunction setupWindsurf(cwd: string): IdeSetupResult {\n const rulesPath = path.join(cwd, \".windsurfrules\");\n const rules = appendOrCreateMarkdown(rulesPath, WINDSURF_RULE_CONTENT);\n\n const mcpPath = path.join(cwd, \".windsurf\", \"mcp.json\");\n const mcp = upsertJsonMcp(mcpPath, \"mcpServers\", {\n command: \"unforgit-mcp\",\n args: [],\n });\n\n return { ide: \"windsurf\", rules, mcp };\n}\n\n// --- Detection ---\n\nconst IDE_INDICATORS: Record<IdeName, string[]> = {\n cursor: [\".cursor\"],\n claude: [\"CLAUDE.md\", \".claude\"],\n vscode: [\".vscode\"],\n windsurf: [\".windsurf\", \".windsurfrules\"],\n};\n\nexport function detectIdes(cwd: string): IdeName[] {\n const detected: IdeName[] = [];\n for (const [ide, indicators] of Object.entries(IDE_INDICATORS)) {\n for (const indicator of indicators) {\n if (fs.existsSync(path.join(cwd, indicator))) {\n detected.push(ide as IdeName);\n break;\n }\n }\n }\n return detected;\n}\n\nconst IDE_HANDLERS: Record<IdeName, (cwd: string) => IdeSetupResult> = {\n cursor: setupCursor,\n claude: setupClaude,\n vscode: setupVscode,\n windsurf: setupWindsurf,\n};\n\nconst IDE_LABELS: Record<IdeName, string> = {\n cursor: \"Cursor\",\n claude: \"Claude Code\",\n vscode: \"VS Code (Copilot)\",\n windsurf: \"Windsurf\",\n};\n\nexport function setupIdes(cwd: string, ides: IdeName[]): IdeSetupResult[] {\n const results: IdeSetupResult[] = [];\n for (const ide of ides) {\n const handler = IDE_HANDLERS[ide];\n const result = handler(cwd);\n results.push(result);\n }\n return results;\n}\n\nexport function logIdeResults(results: IdeSetupResult[]): void {\n if (results.length === 0) {\n logger.info(\" IDE integration: skipped\");\n return;\n }\n\n for (const result of results) {\n const label = IDE_LABELS[result.ide];\n logger.info(` ${label}:`);\n if (result.rules) {\n const verb =\n result.rules.action === \"exists\" ? \"already exists\" : result.rules.action;\n logger.info(` Rules: ${verb} → ${result.rules.path}`);\n }\n if (result.mcp) {\n const verb =\n result.mcp.action === \"exists\" ? \"already configured\" : result.mcp.action;\n logger.info(` MCP: ${verb} → ${result.mcp.path}`);\n }\n }\n}\n\nexport function parseIdeOption(value: string): IdeName[] {\n if (value === \"all\") return [...ALL_IDE_NAMES];\n const names = value.split(\",\").map((s) => s.trim().toLowerCase());\n const valid: IdeName[] = [];\n for (const name of names) {\n if (ALL_IDE_NAMES.includes(name as IdeName)) {\n valid.push(name as IdeName);\n } else {\n logger.warn(`Unknown IDE: \"${name}\". Valid options: ${ALL_IDE_NAMES.join(\", \")}`);\n }\n }\n return valid;\n}\n\nexport { CURSOR_RULE_CONTENT };\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { LocalStore } from \"unforgit-db\";\nimport { resolveVisibility } from \"unforgit-core\";\nimport { applyLifecycleDefaults } from \"unforgit-core\";\nimport type { MemoryType } from \"unforgit-shared\";\nimport { getTemplate, applyTemplate, formatTemplateList } from \"unforgit-core\";\nimport { validateMemoryType, parseConfidence, parseTtl } from \"unforgit-config\";\n\nexport const addCommand = new Command(\"add\")\n .description(\"Add a memory (local by default)\")\n .argument(\"<text>\", \"Memory text content\")\n .option(\n \"-t, --type <type>\",\n \"Memory type (episodic|semantic|procedural)\",\n )\n .option(\"--tags <tags>\", \"Comma-separated tags\", \"\")\n .option(\n \"--visibility <visibility>\",\n \"Visibility (private|repo|auto)\",\n )\n .option(\"--source-pr <url>\", \"Source PR URL\")\n .option(\"--source-commit <sha>\", \"Source commit SHA\")\n .option(\"--confidence <n>\", \"Confidence score 0-1\")\n .option(\"--ttl <seconds>\", \"TTL in seconds\")\n .option(\"--template <name>\", \"Use a template (decision, gotcha, playbook, etc.)\")\n .option(\"--list-templates\", \"List available templates\")\n .addHelpText(\"after\", `\nExamples:\n unforgit add \"We use UTC timestamps everywhere\" -t semantic --tags time,convention\n unforgit add \"Found race condition in worker\" -t episodic --tags bug\n unforgit add \"To deploy: run make release\" --template playbook`)\n .action((text, opts) => {\n if (opts.listTemplates) {\n logger.info(formatTemplateList());\n return;\n }\n\n if (!text || !text.trim()) {\n logger.error(\"Memory text cannot be empty.\");\n process.exit(EXIT_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n let userTags: string[] = [...new Set(\n opts.tags\n ? opts.tags.split(\",\").map((t: string) => t.trim()).filter(Boolean) as string[]\n : [] as string[],\n )];\n\n if (opts.type && !validateMemoryType(opts.type)) {\n logger.error(`Invalid memory type \"${opts.type}\". Must be one of: episodic, semantic, procedural`);\n process.exit(EXIT_ERROR);\n }\n\n let memoryType = (opts.type ?? config.defaults.memoryType) as MemoryType;\n let memoryText = text;\n let visibility = opts.visibility ?? config.defaults.visibility;\n\n if (opts.template) {\n const template = getTemplate(opts.template);\n if (!template) {\n logger.error(`Unknown template: ${opts.template}`);\n logger.info(\"\\n\" + formatTemplateList());\n process.exit(EXIT_ERROR);\n }\n\n const applied = applyTemplate(template, text, userTags);\n memoryText = applied.text;\n memoryType = applied.memoryType;\n userTags = applied.tags;\n if (visibility === \"auto\") {\n visibility = applied.visibility;\n }\n\n logger.info(`Using template: ${template.name}`);\n }\n\n const sourceRefs: Record<string, unknown> = {};\n if (opts.sourcePr) sourceRefs.pr_url = opts.sourcePr;\n if (opts.sourceCommit) sourceRefs.commit_sha = opts.sourceCommit;\n\n const input = applyLifecycleDefaults({\n orgId: config.remote.orgId || \"local\",\n repoId: config.remote.repoId || \"local\",\n memoryType,\n text: memoryText,\n tags: userTags,\n sourceRefs: Object.keys(sourceRefs).length > 0 ? sourceRefs : undefined,\n confidence: opts.confidence ? parseConfidence(opts.confidence) : undefined,\n ttlSeconds: opts.ttl ? parseTtl(opts.ttl) : undefined,\n visibility,\n }, config.lifecycle);\n\n const policy = resolveVisibility(input);\n const memory = store.store({\n ...input,\n visibility: policy.visibility,\n });\n\n logger.info(`Memory stored: ${memory.id}`);\n logger.info(` Type: ${memory.memoryType}`);\n logger.info(` Visibility: ${memory.visibility}`);\n logger.info(` Tags: ${memory.tags.join(\", \") || \"(none)\"}`);\n\n if (policy.suggestion === \"promote\") {\n logger.info(\n \"\\n Hint: This memory might be useful for the team. \" +\n `Use 'unforgit promote ${memory.id}' to share it.`,\n );\n }\n } finally {\n store.close();\n }\n });\n","export const EXIT_SUCCESS = 0;\nexport const EXIT_ERROR = 1;\nexport const EXIT_CONFIG_ERROR = 2;\nexport const EXIT_SIGINT = 130;\nexport const EXIT_SIGTERM = 143;\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { mergeAndRank } from \"unforgit-core\";\nimport { resolveLifecycleConfig } from \"unforgit-core\";\nimport type { MemoryType, RecallResult } from \"unforgit-shared\";\nimport { parsePositiveInt } from \"unforgit-config\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { isJsonMode, outputJson, paginate } from \"../utils.js\";\n\nexport const recallCommand = new Command(\"recall\")\n .description(\"Recall memories matching a query\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--types <types>\",\n \"Comma-separated types (episodic,semantic,procedural)\",\n )\n .option(\"--tags <tags>\", \"Comma-separated tags to filter\")\n .option(\"-k, --limit <n>\", \"Max results\", \"10\")\n .option(\"--remote-only\", \"Only query remote\")\n .option(\"--local-only\", \"Only query local\")\n .option(\"--page <n>\", \"Page number for pagination\", \"1\")\n .option(\"--per-page <n>\", \"Items per page\", \"10\")\n .addHelpText(\"after\", `\nExamples:\n unforgit recall \"authentication\" Search all memories\n unforgit recall \"deploy\" --types procedural Filter by type\n unforgit recall \"bug\" --tags auth,api Filter by tags\n unforgit recall \"setup\" --local-only Local search only`)\n .action(async (query, opts) => {\n if (!query || !query.trim()) {\n logger.error(\"Search query cannot be empty.\");\n process.exit(EXIT_ERROR);\n }\n\n const config = loadConfig();\n const usageTrackingLimit = resolveLifecycleConfig(config.lifecycle).usageBoost.topKToRecord;\n const k = parsePositiveInt(opts.limit, \"limit\");\n\n const VALID_TYPES = [\"episodic\", \"semantic\", \"procedural\"];\n const types = opts.types\n ? (opts.types.split(\",\").map((t: string) => t.trim()) as MemoryType[])\n : undefined;\n\n if (types) {\n const invalid = types.filter((t) => !VALID_TYPES.includes(t));\n if (invalid.length > 0) {\n logger.error(\n `Invalid memory type(s): ${invalid.join(\", \")}. Must be one of: ${VALID_TYPES.join(\", \")}`,\n );\n process.exit(EXIT_ERROR);\n }\n }\n const tags = opts.tags\n ? opts.tags.split(\",\").map((t: string) => t.trim())\n : undefined;\n\n let localResults: RecallResult[] = [];\n let remoteResults: RecallResult[] = [];\n\n const recallQuery = {\n orgId: config.remote.orgId || \"local\",\n repoId: config.remote.repoId || \"local\",\n query,\n types,\n tags,\n k,\n };\n\n if (!opts.remoteOnly) {\n let store: LocalStore | undefined;\n try {\n store = new LocalStore(getDbPath());\n localResults = store.recall(recallQuery);\n const idsToRecord = localResults\n .slice(0, usageTrackingLimit)\n .map((result) => result.id);\n if (idsToRecord.length > 0) {\n store.recordUsageBatch(idsToRecord, query);\n }\n } catch {\n if (!opts.localOnly) {\n logger.warn(\"Local store not available\");\n }\n } finally {\n store?.close();\n }\n }\n\n if (!opts.localOnly && config.remote.url) {\n try {\n const client = new RemoteClient(config.remote.url);\n const response = await client.recall(recallQuery);\n remoteResults = response.results.map((r) => ({\n ...r,\n source: \"remote\" as const,\n }));\n } catch {\n if (!opts.remoteOnly) {\n logger.warn(\"Remote API not available\");\n }\n }\n }\n\n const results = mergeAndRank(localResults, remoteResults, k);\n\n const page = parsePositiveInt(opts.page, \"page\");\n const perPage = parsePositiveInt(opts.perPage, \"per-page\");\n const paged = paginate(results, page, perPage);\n\n if (isJsonMode()) {\n outputJson({\n results: paged.items.map((r) => ({\n id: r.id,\n source: r.source,\n type: r.memoryType,\n score: r.score,\n text: r.text,\n tags: r.tags,\n })),\n page: paged.currentPage,\n totalPages: paged.totalPages,\n total: paged.total,\n });\n return;\n }\n\n if (results.length === 0) {\n logger.info(\"No memories found.\");\n return;\n }\n\n logger.info(`Found ${results.length} memories:\\n`);\n for (const r of paged.items) {\n const sourceTag = r.source === \"local\" ? \"[local]\" : \"[remote]\";\n logger.info(\n `${sourceTag} [${r.memoryType}] ${r.id.slice(0, 8)}... (score: ${r.score.toFixed(3)})`,\n );\n logger.info(` ${r.text.slice(0, 120)}${r.text.length > 120 ? \"...\" : \"\"}`);\n if (r.tags.length > 0) logger.info(` Tags: ${r.tags.join(\", \")}`);\n logger.info(\"\");\n }\n\n if (paged.totalPages > 1) {\n logger.info(`Page ${paged.currentPage}/${paged.totalPages} (${paged.total} total)`);\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\n\nexport const promoteCommand = new Command(\"promote\")\n .description(\"Promote a local memory to remote (shared)\")\n .argument(\"<id>\", \"Memory ID to promote\")\n .option(\"--to <scope>\", \"Target scope\", \"repo\")\n .option(\"--source-pr <url>\", \"Source PR URL\")\n .option(\"--source-commit <sha>\", \"Source commit SHA\")\n .addHelpText(\"after\", `\nExamples:\n unforgit promote abc123\n unforgit promote abc123 --source-pr https://github.com/org/repo/pull/42`)\n .action(async (id, opts) => {\n const config = loadConfig();\n\n if (!config.remote.url) {\n logger.error(\"Remote URL not configured. Update unforgit.yaml.\");\n process.exit(EXIT_ERROR);\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const memory = store.getById(id);\n\n if (!memory) {\n logger.error(`Memory ${id} not found locally.`);\n process.exit(EXIT_ERROR);\n }\n\n const sourceRefs = { ...(memory.sourceRefs ?? {}) };\n if (opts.sourcePr) sourceRefs.pr_url = opts.sourcePr;\n if (opts.sourceCommit) sourceRefs.commit_sha = opts.sourceCommit;\n\n const client = new RemoteClient(config.remote.url);\n\n const result = await client.store({\n orgId: config.remote.orgId || memory.orgId,\n repoId: config.remote.repoId || memory.repoId,\n memoryType: memory.memoryType,\n text: memory.text,\n summary: memory.summary,\n tags: memory.tags,\n sourceRefs,\n confidence: memory.confidence,\n visibility: \"repo\",\n });\n\n store.updateVisibility(id, \"repo\");\n\n logger.info(`Promoted memory ${id.slice(0, 8)}... to remote.`);\n logger.info(` Remote ID: ${result.id}`);\n logger.info(` Scope: ${opts.to}`);\n } catch (err) {\n logger.error(\n `Promoting memory: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig } from \"unforgit-config\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { parsePositiveInt } from \"unforgit-config\";\n\nexport const consolidateCommand = new Command(\"consolidate\")\n .description(\"Consolidate episodic memories into semantic/procedural\")\n .option(\"--from-pr <url>\", \"PR URL to consolidate from\")\n .option(\"--from-commit <sha>\", \"Commit SHA to consolidate from\")\n .option(\"--last-n <n>\", \"Consolidate the last N memories\")\n .action(async (opts) => {\n const config = loadConfig();\n\n if (!config.remote.url) {\n logger.error(\"Remote URL not configured. Update unforgit.yaml.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const client = new RemoteClient(config.remote.url);\n\n const body: Record<string, unknown> = {\n orgId: config.remote.orgId,\n repoId: config.remote.repoId,\n };\n\n if (opts.fromPr || opts.fromCommit) {\n body.source = {\n prUrl: opts.fromPr,\n commitSha: opts.fromCommit,\n };\n }\n\n if (opts.lastN) {\n body.lastN = parsePositiveInt(opts.lastN, \"last-n\");\n }\n\n try {\n const result = await client.consolidate(body);\n\n logger.info(\"Consolidation complete:\");\n logger.info(` Created: ${result.created.length} memories`);\n logger.info(` Superseded: ${result.superseded.length} memories`);\n logger.info(` Processed: ${result.processedCount} total`);\n\n if (result.created.length > 0) {\n logger.info(\"\\nNew memories:\");\n for (const id of result.created) {\n logger.info(` - ${id}`);\n }\n }\n } catch (err) {\n logger.error(\n `Consolidating: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\n\nexport const deprecateCommand = new Command(\"deprecate\")\n .description(\"Mark a memory as deprecated\")\n .argument(\"<id>\", \"Memory ID to deprecate\")\n .option(\"--reason <reason>\", \"Reason for deprecation\")\n .option(\"--remote\", \"Deprecate on remote\")\n .addHelpText(\"after\", `\nExamples:\n unforgit deprecate abc123 --reason \"No longer relevant\"\n unforgit deprecate abc123 --remote`)\n .action(async (id, opts) => {\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n await client.deprecate(id, opts.reason);\n logger.info(`Deprecated remote memory ${id.slice(0, 8)}...`);\n if (opts.reason) logger.info(` Reason: ${opts.reason}`);\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const memory = store.getById(id);\n if (!memory) {\n logger.error(`Memory ${id} not found.`);\n process.exit(EXIT_ERROR);\n }\n\n if (memory.status === \"deprecated\") {\n logger.warn(`Memory ${id.slice(0, 8)} is already deprecated.`);\n return;\n }\n\n const ok = store.deprecate(id, opts.reason);\n\n if (!ok) {\n logger.error(`Memory ${id} not found.`);\n process.exit(EXIT_ERROR);\n }\n\n logger.info(`Deprecated local memory ${id.slice(0, 8)}...`);\n if (opts.reason) logger.info(` Reason: ${opts.reason}`);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { confirm } from \"../utils.js\";\n\nexport const supersedeCommand = new Command(\"supersede\")\n .description(\"Mark a memory as superseded by another\")\n .argument(\"<old-id>\", \"Memory ID being superseded\")\n .requiredOption(\"--with <new-id>\", \"ID of the new memory that replaces it\")\n .option(\"--remote\", \"Supersede on remote\")\n .option(\"--force\", \"Skip confirmation\")\n .addHelpText(\"after\", `\nExamples:\n unforgit supersede abc123 --with def456\n unforgit supersede abc123 --with def456 --remote`)\n .action(async (oldId, opts) => {\n if (oldId === opts.with) {\n logger.error(\"A memory cannot supersede itself.\");\n process.exit(EXIT_ERROR);\n }\n\n if (!opts.force) {\n const confirmed = await confirm(\n `Supersede memory ${oldId.slice(0, 8)}... with ${opts.with.slice(0, 8)}...?`,\n );\n if (!confirmed) {\n logger.info(\"Supersede cancelled.\");\n return;\n }\n }\n\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n await client.supersede(oldId, opts.with);\n logger.info(\n `Superseded remote memory ${oldId.slice(0, 8)}... with ${opts.with.slice(0, 8)}...`,\n );\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const ok = store.supersede(oldId, opts.with);\n\n if (!ok) {\n logger.error(`Memory ${oldId} not found.`);\n process.exit(EXIT_ERROR);\n }\n\n logger.info(\n `Superseded local memory ${oldId.slice(0, 8)}... with ${opts.with.slice(0, 8)}...`,\n );\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { confirm } from \"../utils.js\";\n\nexport const deleteCommand = new Command(\"delete\")\n .description(\"Soft delete a memory (can be restored)\")\n .argument(\"<id>\", \"Memory ID to delete\")\n .option(\"--hard\", \"Permanently delete (cannot be restored)\")\n .option(\"--remote\", \"Delete on remote\")\n .option(\"--by <author>\", \"Author of the deletion\")\n .option(\"--force\", \"Skip confirmation for hard delete\")\n .addHelpText(\"after\", `\nExamples:\n unforgit delete abc12345 Soft delete (can be restored)\n unforgit delete abc12345 --hard Permanent delete\n unforgit delete abc12345 --remote Delete on remote server`)\n .action(async (id, opts) => {\n if (opts.hard && !opts.force) {\n const confirmed = await confirm(\n `Permanently delete memory ${id.slice(0, 8)}...? This cannot be undone.`,\n );\n if (!confirmed) {\n logger.info(\"Delete cancelled.\");\n return;\n }\n }\n\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n await client.delete(id, opts.by, opts.hard);\n const action = opts.hard ? \"Hard deleted\" : \"Soft deleted\";\n logger.info(`${action} remote memory ${id.slice(0, 8)}...`);\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n let ok: boolean;\n if (opts.hard) {\n ok = store.hardDelete(id);\n } else {\n ok = store.softDelete({ id, deletedBy: opts.by });\n }\n\n if (!ok) {\n logger.error(`Memory ${id} not found.`);\n process.exit(EXIT_ERROR);\n }\n\n const action = opts.hard ? \"Hard deleted\" : \"Soft deleted\";\n logger.info(`${action} local memory ${id.slice(0, 8)}...`);\n if (!opts.hard) {\n logger.info(\" This memory can be restored with 'unforgit restore'.\");\n }\n } finally {\n store.close();\n }\n });\n\nexport const restoreCommand = new Command(\"restore\")\n .description(\"Restore a soft-deleted memory\")\n .argument(\"<id>\", \"Memory ID to restore\")\n .option(\"--remote\", \"Restore on remote\")\n .action(async (id, opts) => {\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n await client.restore(id);\n logger.info(`Restored remote memory ${id.slice(0, 8)}...`);\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const ok = store.restore(id);\n\n if (!ok) {\n logger.error(`Memory ${id} not found or not deleted.`);\n process.exit(EXIT_ERROR);\n }\n\n logger.info(`Restored local memory ${id.slice(0, 8)}...`);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { isInitialized } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR, EXIT_ERROR } from \"../exit-codes.js\";\n\nexport const webCommand = new Command(\"web\")\n .description(\"Start the Unforgit web dashboard\")\n .option(\"-p, --port <port>\", \"Port to run on\", \"3838\")\n .option(\"--no-open\", \"Don't open browser automatically\")\n .action(async (opts) => {\n const cwd = process.cwd();\n\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized in this directory. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const webDir = findWebDir();\n if (!webDir) {\n logger.error(\"Web dashboard not found. Make sure unforgit is installed correctly.\");\n process.exit(EXIT_ERROR);\n }\n\n const env: Record<string, string> = {\n ...process.env as Record<string, string>,\n UNFORGIT_WORKSPACE: cwd,\n PORT: opts.port,\n };\n\n const dotenvPath = path.join(cwd, \".env\");\n if (fs.existsSync(dotenvPath)) {\n const content = fs.readFileSync(dotenvPath, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const match = line.match(/^\\s*([^#=]+?)\\s*=\\s*(.+?)\\s*$/);\n if (match) {\n env[match[1]] = match[2].replace(/^[\"']|[\"']$/g, \"\");\n }\n }\n }\n\n logger.info(`Starting Unforgit web dashboard on port ${opts.port}...`);\n logger.info(`Workspace: ${cwd}`);\n\n const hasNextBuild = fs.existsSync(path.join(webDir, \".next\"));\n const cmd = hasNextBuild ? \"next\" : \"next\";\n const args = hasNextBuild\n ? [\"start\", \"-p\", opts.port]\n : [\"dev\", \"-p\", opts.port];\n\n const nextBin = path.join(webDir, \"node_modules\", \".bin\", \"next\");\n const finalCmd = fs.existsSync(nextBin) ? nextBin : cmd;\n\n const child = spawn(finalCmd, args, {\n cwd: webDir,\n env,\n stdio: \"inherit\",\n });\n\n if (opts.open !== false) {\n setTimeout(() => {\n const url = `http://localhost:${opts.port}`;\n const openCmd =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"start\"\n : \"xdg-open\";\n spawn(openCmd, [url], { stdio: \"ignore\", detached: true }).unref();\n }, 2000);\n }\n\n child.on(\"error\", (err) => {\n logger.fatal(`Failed to start web dashboard: ${err.message}`);\n process.exit(EXIT_ERROR);\n });\n\n child.on(\"exit\", (code) => {\n process.exit(code ?? 0);\n });\n });\n\nfunction findWebDir(): string | null {\n const candidates = [\n path.resolve(import.meta.dirname, \"../../../web\"),\n path.resolve(import.meta.dirname, \"../../web\"),\n path.join(process.cwd(), \"web\"),\n ];\n\n for (const dir of candidates) {\n if (\n fs.existsSync(dir) &&\n fs.existsSync(path.join(dir, \"package.json\"))\n ) {\n return dir;\n }\n }\n\n return null;\n}\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport type { LinkType } from \"unforgit-shared\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\n\nconst VALID_LINK_TYPES = [\n \"related_to\",\n \"derived_from\",\n \"contradicts\",\n \"depends_on\",\n] as const;\n\nexport const linkCommand = new Command(\"link\")\n .description(\"Create a link between two memories\")\n .argument(\"<source-id>\", \"Source memory ID\")\n .argument(\"<target-id>\", \"Target memory ID\")\n .requiredOption(\n \"--type <link-type>\",\n \"Link type (related_to, derived_from, contradicts, depends_on)\",\n )\n .option(\"--remote\", \"Create link on remote\")\n .addHelpText(\"after\", `\nExamples:\n unforgit link abc123 def456 --type related_to\n unforgit link abc123 def456 --type derived_from --remote`)\n .action(async (sourceId, targetId, opts) => {\n if (!VALID_LINK_TYPES.includes(opts.type)) {\n logger.error(\n `Invalid link type \"${opts.type}\". Must be one of: ${VALID_LINK_TYPES.join(\", \")}`,\n );\n process.exit(EXIT_ERROR);\n }\n\n if (sourceId === targetId) {\n logger.error(\"Cannot link a memory to itself.\");\n process.exit(EXIT_ERROR);\n }\n\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n const result = await client.link(sourceId, targetId, opts.type);\n logger.info(\n `Linked remote: ${sourceId.slice(0, 8)} --[${opts.type}]--> ${targetId.slice(0, 8)} (${result.link.id.slice(0, 8)})`,\n );\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n try {\n const source = store.getById(sourceId);\n if (!source) {\n logger.error(`Source memory ${sourceId} not found.`);\n process.exit(EXIT_ERROR);\n }\n if (source.status === \"deleted\") {\n logger.error(`Source memory ${sourceId.slice(0, 8)} is deleted. Restore it first.`);\n process.exit(EXIT_ERROR);\n }\n\n const target = store.getById(targetId);\n if (!target) {\n logger.error(`Target memory ${targetId} not found.`);\n process.exit(EXIT_ERROR);\n }\n if (target.status === \"deleted\") {\n logger.error(`Target memory ${targetId.slice(0, 8)} is deleted. Restore it first.`);\n process.exit(EXIT_ERROR);\n }\n\n const link = store.link({\n sourceId,\n targetId,\n linkType: opts.type as LinkType,\n });\n logger.info(\n `Linked: ${sourceId.slice(0, 8)} --[${opts.type}]--> ${targetId.slice(0, 8)} (${link.id.slice(0, 8)})`,\n );\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n\nexport const unlinkCommand = new Command(\"unlink\")\n .description(\"Remove a link between two memories\")\n .argument(\"<source-id>\", \"Source memory ID\")\n .argument(\"<target-id>\", \"Target memory ID\")\n .requiredOption(\n \"--type <link-type>\",\n \"Link type (related_to, derived_from, contradicts, depends_on)\",\n )\n .option(\"--remote\", \"Remove link on remote\")\n .action(async (sourceId, targetId, opts) => {\n if (!VALID_LINK_TYPES.includes(opts.type)) {\n logger.error(\n `Invalid link type \"${opts.type}\". Must be one of: ${VALID_LINK_TYPES.join(\", \")}`,\n );\n process.exit(EXIT_ERROR);\n }\n\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n await client.unlink(sourceId, targetId, opts.type);\n logger.info(\n `Unlinked remote: ${sourceId.slice(0, 8)} --[${opts.type}]--> ${targetId.slice(0, 8)}`,\n );\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const ok = store.unlink(sourceId, targetId, opts.type);\n\n if (!ok) {\n logger.error(\"Link not found.\");\n process.exit(EXIT_ERROR);\n }\n\n logger.info(\n `Unlinked: ${sourceId.slice(0, 8)} --[${opts.type}]--> ${targetId.slice(0, 8)}`,\n );\n } finally {\n store.close();\n }\n });\n\nexport const linksCommand = new Command(\"links\")\n .description(\"List all links for a memory\")\n .argument(\"<memory-id>\", \"Memory ID to get links for\")\n .option(\n \"--type <link-type>\",\n \"Filter by link type (related_to, derived_from, contradicts, depends_on)\",\n )\n .option(\"--remote\", \"List links on remote\")\n .action(async (memoryId, opts) => {\n if (opts.type && !VALID_LINK_TYPES.includes(opts.type)) {\n logger.error(\n `Invalid link type \"${opts.type}\". Must be one of: ${VALID_LINK_TYPES.join(\", \")}`,\n );\n process.exit(EXIT_ERROR);\n }\n\n if (opts.remote) {\n const config = loadConfig();\n const client = new RemoteClient(config.remote.url);\n\n try {\n const result = await client.getLinks(memoryId, opts.type);\n\n if (isJsonMode()) {\n outputJson(result);\n return;\n }\n\n if (result.links.length === 0) {\n logger.info(\"No links found.\");\n return;\n }\n logger.info(`Found ${result.links.length} links:\\n`);\n for (const l of result.links) {\n const direction =\n l.sourceId === memoryId\n ? `--[${l.linkType}]--> ${l.targetId.slice(0, 8)}`\n : `<--[${l.linkType}]-- ${l.sourceId.slice(0, 8)}`;\n logger.info(` ${l.id.slice(0, 8)}: ${direction}`);\n }\n } catch (err) {\n logger.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(EXIT_ERROR);\n }\n return;\n }\n\n const store = new LocalStore(getDbPath());\n\n try {\n const links = store.getLinks({\n memoryId,\n linkType: opts.type as LinkType | undefined,\n });\n\n if (isJsonMode()) {\n outputJson({\n links: links.map((l) => ({\n id: l.id,\n sourceId: l.sourceId,\n targetId: l.targetId,\n linkType: l.linkType,\n })),\n });\n return;\n }\n\n if (links.length === 0) {\n logger.info(\"No links found.\");\n return;\n }\n\n logger.info(`Found ${links.length} links:\\n`);\n for (const l of links) {\n const direction =\n l.sourceId === memoryId\n ? `--[${l.linkType}]--> ${l.targetId.slice(0, 8)}`\n : `<--[${l.linkType}]-- ${l.sourceId.slice(0, 8)}`;\n logger.info(` ${l.id.slice(0, 8)}: ${direction}`);\n }\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { LocalStore } from \"unforgit-db\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport type { MemoryType } from \"unforgit-shared\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport {\n parseThreshold,\n parsePositiveInt,\n validateMemoryType,\n} from \"unforgit-config\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\n\nconst cwd = process.cwd();\n\nexport const mergeCommand = new Command(\"merge\")\n .description(\n \"Consolidate multiple local memories into one unified memory while preserving history\",\n )\n .argument(\"<ids...>\", \"Memory IDs to consolidate (minimum 2)\")\n .requiredOption(\n \"-t, --text <text>\",\n \"Consolidated text combining insights from source memories\",\n )\n .option(\n \"--type <type>\",\n \"Memory type for consolidated memory (episodic, semantic, procedural)\",\n )\n .option(\"--tags <tags>\", \"Comma-separated tags for the consolidated memory\")\n .option(\n \"--no-supersede\",\n \"Do not mark original memories as superseded\",\n )\n .action(async (ids: string[], opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n if (ids.length < 2) {\n logger.error(\"At least 2 memory IDs are required for merge.\");\n process.exit(EXIT_ERROR);\n }\n\n if (opts.type && !validateMemoryType(opts.type)) {\n logger.error(\"--type must be one of: episodic, semantic, procedural\");\n process.exit(EXIT_ERROR);\n }\n\n const config = loadConfig(cwd);\n const store = new LocalStore(getDbPath(cwd));\n\n try {\n for (const id of ids) {\n const mem = store.getById(id);\n if (!mem) {\n logger.error(`Memory ${id} not found.`);\n process.exit(EXIT_ERROR);\n }\n if (mem.status === \"deleted\") {\n logger.error(`Memory ${id.slice(0, 8)} is deleted. Restore it before merging.`);\n process.exit(EXIT_ERROR);\n }\n if (mem.status === \"superseded\") {\n logger.error(`Memory ${id.slice(0, 8)} is already superseded. Cannot merge superseded memories.`);\n process.exit(EXIT_ERROR);\n }\n }\n\n const result = store.consolidateMemories({\n orgId: config.remote.orgId || \"local\",\n repoId: config.remote.repoId || \"local\",\n sourceIds: ids,\n consolidatedText: opts.text,\n memoryType: opts.type as MemoryType | undefined,\n tags: opts.tags ? opts.tags.split(\",\").map((t: string) => t.trim()) : undefined,\n preserveOriginals: opts.supersede !== false,\n });\n\n logger.info(\"Merge complete!\");\n logger.info(` Consolidated ID: ${result.consolidatedId}`);\n logger.info(` Version: ${result.version}`);\n logger.info(` Sources preserved: ${result.sourcesPreserved}`);\n logger.info(\n ` Source IDs: ${result.sourceIds.map((id) => id.slice(0, 8)).join(\", \")}`,\n );\n logger.info(\"\");\n logger.info(\n \"Original memories are linked via 'derived_from' and marked as 'superseded'.\",\n );\n logger.info(\"Use 'unforgit history <id>' to view the consolidation history.\");\n } catch (err) {\n logger.error(\n `Merging memories: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n\nexport const remergeCommand = new Command(\"remerge\")\n .description(\n \"Update an existing consolidation with new information or additional sources\",\n )\n .argument(\"<consolidation-id>\", \"ID of existing consolidated memory to update\")\n .requiredOption(\"-t, --text <text>\", \"Updated consolidated text\")\n .option(\n \"--add <ids>\",\n \"Comma-separated IDs of additional memories to include\",\n )\n .option(\"--tags <tags>\", \"Comma-separated tags (keeps existing if not provided)\")\n .action(async (consolidationId: string, opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig(cwd);\n const store = new LocalStore(getDbPath(cwd));\n\n try {\n const result = store.reconsolidate({\n orgId: config.remote.orgId || \"local\",\n repoId: config.remote.repoId || \"local\",\n existingConsolidationId: consolidationId,\n additionalSourceIds: opts.add\n ? opts.add.split(\",\").map((t: string) => t.trim())\n : undefined,\n newText: opts.text,\n tags: opts.tags ? opts.tags.split(\",\").map((t: string) => t.trim()) : undefined,\n });\n\n logger.info(\"Remerge complete!\");\n logger.info(` New consolidated ID: ${result.consolidatedId}`);\n logger.info(` New version: ${result.version}`);\n logger.info(` Total sources: ${result.sourcesPreserved}`);\n logger.info(\n ` Previous consolidation: ${consolidationId.slice(0, 8)} (now superseded)`,\n );\n logger.info(\"\");\n logger.info(\"Use 'unforgit history <id>' to view all versions.\");\n } catch (err) {\n logger.error(\n `Remerging: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n\nexport const similarCommand = new Command(\"similar\")\n .description(\"Find memories similar to a given memory (candidates for merging)\")\n .argument(\"<memory-id>\", \"Memory ID to find similar ones for\")\n .option(\n \"-k, --limit <n>\",\n \"Max number of similar memories to return\",\n \"10\",\n )\n .option(\n \"--threshold <score>\",\n \"Minimum similarity score (0-1)\",\n \"0.3\",\n )\n .addHelpText(\"after\", `\nExamples:\n unforgit similar abc123\n unforgit similar abc123 --threshold 0.5 -k 5`)\n .action(async (memoryId: string, opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig(cwd);\n const store = new LocalStore(getDbPath(cwd));\n\n try {\n const similar = store.findSimilar({\n orgId: config.remote.orgId || \"local\",\n repoId: config.remote.repoId || \"local\",\n memoryId,\n threshold: parseThreshold(opts.threshold),\n k: parsePositiveInt(opts.limit, \"limit\"),\n });\n\n if (isJsonMode()) {\n outputJson({\n results: similar.map((m) => ({\n id: m.id,\n type: m.memoryType,\n score: m.score,\n text: m.text,\n tags: m.tags,\n })),\n });\n return;\n }\n\n if (similar.length === 0) {\n logger.info(\"No similar memories found.\");\n return;\n }\n\n logger.info(`Found ${similar.length} similar memories:\\n`);\n\n for (const mem of similar) {\n logger.info(\n `[${mem.memoryType}] ${mem.id.slice(0, 8)} (score: ${mem.score.toFixed(3)})`,\n );\n logger.info(` ${mem.text.slice(0, 100)}${mem.text.length > 100 ? \"...\" : \"\"}`);\n if (mem.tags.length > 0) {\n logger.info(` Tags: ${mem.tags.join(\", \")}`);\n }\n logger.info(\"\");\n }\n\n logger.info(\"Tip: Use 'unforgit merge <id1> <id2> ... -t \\\"merged text\\\"' to consolidate.\");\n } catch (err) {\n logger.error(\n `Finding similar: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n\nexport const historyCommand = new Command(\"history\")\n .description(\"Show consolidation history for a memory\")\n .argument(\"<memory-id>\", \"Memory ID to show history for\")\n .action(async (memoryId: string) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const store = new LocalStore(getDbPath(cwd));\n\n try {\n const memory = store.getById(memoryId);\n if (!memory) {\n logger.error(\"Memory not found.\");\n process.exit(EXIT_ERROR);\n }\n\n logger.info(`Memory: ${memory.id.slice(0, 8)}`);\n logger.info(`Type: ${memory.memoryType}`);\n logger.info(`Status: ${memory.status}`);\n logger.info(`Is Consolidation: ${memory.isConsolidation ? \"Yes\" : \"No\"}`);\n\n if (memory.isConsolidation) {\n logger.info(`Version: ${memory.consolidationVersion ?? 1}`);\n logger.info(`Text: ${memory.text}`);\n\n const sources = store.getConsolidatedSources(memoryId);\n if (sources.length > 0) {\n logger.info(\"\\nSource memories:\");\n for (const src of sources) {\n logger.info(\n ` └─ [${src.memoryType}] ${src.id.slice(0, 8)}: ${src.text.slice(0, 60)}...`,\n );\n }\n }\n\n const history = store.getConsolidationHistory(memoryId);\n const previousVersions = history.filter((h) => h.isConsolidation);\n if (previousVersions.length > 0) {\n logger.info(\"\\nPrevious consolidation versions:\");\n for (const prev of previousVersions) {\n logger.info(\n ` └─ v${prev.consolidationVersion ?? 1} (${prev.id.slice(0, 8)}): ${prev.text.slice(0, 60)}...`,\n );\n }\n }\n } else {\n logger.info(`Text: ${memory.text}`);\n\n const links = store.getLinks({ memoryId, linkType: \"derived_from\" });\n const consolidations = links.filter((l) => l.targetId === memoryId);\n if (consolidations.length > 0) {\n logger.info(\"\\nIncluded in consolidations:\");\n for (const link of consolidations) {\n const consol = store.getById(link.sourceId);\n if (consol) {\n logger.info(\n ` └─ v${consol.consolidationVersion ?? 1} (${consol.id.slice(0, 8)}): ${consol.text.slice(0, 60)}...`,\n );\n }\n }\n }\n }\n } catch (err) {\n logger.error(\n `Fetching history: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { LocalStore } from \"unforgit-db\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport type { MemoryType } from \"unforgit-shared\";\nimport {\n findConsolidationCandidates,\n executeConsolidation,\n formatCandidatePreview,\n} from \"unforgit-core\";\nimport * as readline from \"readline\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport {\n parseThreshold,\n parsePositiveInt,\n validateMemoryType,\n} from \"unforgit-config\";\n\nconst cwd = process.cwd();\n\nfunction createReadlineInterface(): readline.Interface {\n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n}\n\nasync function askConfirmation(\n rl: readline.Interface,\n question: string,\n): Promise<boolean> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n });\n });\n}\n\nexport const autoConsolidateCommand = new Command(\"auto-consolidate\")\n .description(\n \"Automatically find and consolidate similar memories using AI\",\n )\n .option(\n \"--threshold <score>\",\n \"Minimum similarity score (0-1)\",\n \"0.4\",\n )\n .option(\n \"--min-group <n>\",\n \"Minimum group size for consolidation\",\n \"2\",\n )\n .option(\n \"--max-groups <n>\",\n \"Maximum number of groups to process\",\n \"10\",\n )\n .option(\n \"--type <type>\",\n \"Filter by memory type (episodic, semantic, procedural)\",\n )\n .option(\n \"--dry-run\",\n \"Show preview without consolidating\",\n )\n .option(\n \"-y, --yes\",\n \"Skip confirmation prompts\",\n )\n .option(\n \"--model <model>\",\n \"OpenAI model to use\",\n \"gpt-5.4\",\n )\n .option(\n \"--no-preserve\",\n \"Do not preserve original memories (hard delete)\",\n )\n .action(async (opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n if (opts.type && !validateMemoryType(opts.type)) {\n logger.error(\"--type must be one of: episodic, semantic, procedural\");\n process.exit(EXIT_ERROR);\n }\n\n const config = loadConfig(cwd);\n const store = new LocalStore(getDbPath(cwd));\n\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n const threshold = parseThreshold(opts.threshold);\n const minGroupSize = parsePositiveInt(opts.minGroup, \"min-group\");\n const maxGroups = parsePositiveInt(opts.maxGroups, \"max-groups\");\n const types = opts.type ? [opts.type as MemoryType] : undefined;\n\n try {\n logger.info(\"Scanning memories for consolidation candidates...\\n\");\n\n const result = findConsolidationCandidates(store, orgId, repoId, {\n threshold,\n minGroupSize,\n maxGroups,\n types,\n excludeConsolidations: true,\n });\n\n logger.info(`Scanned ${result.totalMemoriesScanned} active memories`);\n logger.info(`Found ${result.totalCandidateGroups} potential groups`);\n logger.info(`Showing top ${result.candidates.length} candidates\\n`);\n\n if (result.candidates.length === 0) {\n logger.info(\"No consolidation candidates found.\");\n logger.info(\n \"Try lowering the threshold (--threshold 0.3) or the minimum group size (--min-group 2).\",\n );\n return;\n }\n\n for (let i = 0; i < result.candidates.length; i++) {\n const candidate = result.candidates[i];\n logger.info(`\\n${\"=\".repeat(60)}`);\n logger.info(`Candidate ${i + 1}/${result.candidates.length}`);\n logger.info(\"=\".repeat(60));\n logger.info(formatCandidatePreview(candidate));\n }\n\n if (opts.dryRun) {\n logger.info(\"\\n[Dry run mode - no changes made]\");\n logger.info(\n \"Remove --dry-run flag to consolidate these memories.\",\n );\n return;\n }\n\n const openaiKey = process.env.OPENAI_API_KEY;\n if (!openaiKey) {\n logger.error(\"OpenAI API key not set.\");\n logger.error(\"Set the OPENAI_API_KEY environment variable.\");\n process.exit(EXIT_ERROR);\n }\n process.env.OPENAI_API_KEY = openaiKey;\n\n const rl = createReadlineInterface();\n let consolidatedCount = 0;\n let skippedCount = 0;\n\n try {\n for (let i = 0; i < result.candidates.length; i++) {\n const candidate = result.candidates[i];\n\n if (!opts.yes) {\n logger.info(`\\n${\"─\".repeat(60)}`);\n logger.info(`Processing candidate ${i + 1}/${result.candidates.length}`);\n logger.info(formatCandidatePreview(candidate));\n\n const shouldConsolidate = await askConfirmation(\n rl,\n \"\\nConsolidate this group? [y/N] \",\n );\n\n if (!shouldConsolidate) {\n logger.info(\"Skipped.\");\n skippedCount++;\n logger.progress(i + 1, result.candidates.length, \"candidates\");\n continue;\n }\n }\n\n logger.info(\"\\nGenerating consolidated text with AI...\");\n\n try {\n const execResult = await executeConsolidation(\n store,\n candidate,\n orgId,\n repoId,\n {\n model: opts.model,\n preserveOriginals: opts.preserve !== false,\n },\n );\n\n logger.info(\"\\nConsolidation complete!\");\n logger.info(` New memory ID: ${execResult.consolidatedId}`);\n logger.info(` Type: ${execResult.memoryType}`);\n logger.info(` Tags: ${execResult.suggestedTags.join(\", \") || \"none\"}`);\n logger.info(` Sources consolidated: ${execResult.sourceIds.length}`);\n logger.info(`\\nGenerated text:`);\n logger.info(` ${execResult.generatedText}`);\n\n consolidatedCount++;\n } catch (err) {\n logger.error(\n `Consolidating: ${err instanceof Error ? err.message : err}`,\n );\n skippedCount++;\n }\n logger.progress(i + 1, result.candidates.length, \"candidates\");\n }\n } finally {\n rl.close();\n }\n\n logger.info(`\\n${\"=\".repeat(60)}`);\n logger.info(\"Summary\");\n logger.info(\"=\".repeat(60));\n logger.info(`Consolidated: ${consolidatedCount} groups`);\n logger.info(`Skipped: ${skippedCount} groups`);\n logger.info(\n `\\nOriginal memories are preserved with status 'superseded'.`,\n );\n logger.info(\"Use 'unforgit history <id>' to view consolidation history.\");\n } catch (err) {\n logger.error(\n `Auto-consolidate: ${err instanceof Error ? err.message : err}`,\n );\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { getDbPath, isInitialized } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { confirm } from \"../utils.js\";\n\nexport const unconsolidateCommand = new Command(\"unconsolidate\")\n .description(\"Revert a consolidation, restoring original memories to active status\")\n .argument(\"<consolidation-id>\", \"ID of the consolidated memory to revert\")\n .option(\"--dry-run\", \"Show what would be restored without making changes\")\n .option(\"--force\", \"Skip confirmation\")\n .addHelpText(\"after\", `\nExamples:\n unforgit unconsolidate abc123 --dry-run Preview what would be restored\n unforgit unconsolidate abc123 Revert a consolidation`)\n .action(async (consolidationId: string, opts) => {\n const cwd = process.cwd();\n\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const dbPath = getDbPath(cwd);\n const store = new LocalStore(dbPath);\n\n try {\n const memory = store.getById(consolidationId);\n if (!memory) {\n logger.error(`Memory not found: ${consolidationId}`);\n process.exit(EXIT_ERROR);\n }\n\n if (!memory.isConsolidation) {\n logger.error(`Memory ${consolidationId} is not a consolidation.`);\n logger.error(\"Only consolidated memories can be unconsolidated.\");\n process.exit(EXIT_ERROR);\n }\n\n const sourceLinks = store.getLinks({ memoryId: consolidationId, linkType: \"derived_from\" });\n const sourceIds = sourceLinks\n .filter((l) => l.sourceId === consolidationId)\n .map((l) => l.targetId);\n\n logger.info(`Consolidation: ${consolidationId.slice(0, 8)}`);\n logger.info(`Version: ${memory.consolidationVersion ?? 1}`);\n logger.info(`Source memories: ${sourceIds.length}`);\n\n if (sourceIds.length === 0) {\n logger.error(\"No source memories found for this consolidation.\");\n process.exit(EXIT_ERROR);\n }\n\n logger.info(\"Source memories to restore:\");\n for (const sourceId of sourceIds) {\n const source = store.getById(sourceId);\n if (source) {\n const status = source.status === \"superseded\" ? \"will restore\" : `${source.status} (no change)`;\n const preview = source.text.slice(0, 60) + (source.text.length > 60 ? \"...\" : \"\");\n logger.info(` - ${sourceId.slice(0, 8)} [${source.memoryType}] (${status})`);\n logger.info(` ${preview}`);\n }\n }\n logger.info(\"\");\n\n if (opts.dryRun) {\n logger.info(\"[Dry run - no changes made]\");\n logger.info(\"Run without --dry-run to execute the unconsolidation.\");\n return;\n }\n\n if (!opts.force) {\n const confirmed = await confirm(\n `Revert consolidation ${consolidationId.slice(0, 8)}... and restore ${sourceIds.length} source memories?`,\n );\n if (!confirmed) {\n logger.info(\"Unconsolidation cancelled.\");\n return;\n }\n }\n\n const result = store.unconsolidate(consolidationId);\n\n logger.info(\"Unconsolidation complete:\");\n logger.info(` Restored: ${result.restoredIds.length} memories`);\n logger.info(` Links removed: ${result.linksRemoved}`);\n logger.info(` Consolidation deleted: ${result.consolidationDeleted ? \"Yes\" : \"No\"}`);\n\n if (result.restoredIds.length > 0) {\n logger.info(\"\\nRestored memories:\");\n for (const id of result.restoredIds) {\n logger.info(` - ${id.slice(0, 8)}`);\n }\n }\n\n logger.info(\"\\nThe consolidated memory has been soft-deleted and can be restored with 'unforgit restore'.\");\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { LocalStore } from \"unforgit-db\";\nimport { truncate, isJsonMode, outputJson } from \"../utils.js\";\n\nexport const statusCommand = new Command(\"status\")\n .description(\"Show the working tree status (pending sync state)\")\n .option(\"-s, --short\", \"Give the output in short format\")\n .addHelpText(\"after\", `\nExamples:\n unforgit status Show full sync status\n unforgit status -s Short format\n unforgit status --json Machine-readable output`)\n .action((opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository (or any of the parent directories)\");\n logger.fatal(\"Run 'unforgit init' to initialize.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n const remoteUrl = config.remote.url;\n const remoteName = \"origin\";\n\n const pendingPush = store.getPendingPush();\n const conflicts = store.getConflicts();\n const untracked = store.getUntrackedMemories(orgId, repoId);\n const summary = store.getSyncSummary(orgId, repoId);\n\n if (isJsonMode()) {\n outputJson({\n remote: remoteUrl || null,\n pendingPush: pendingPush.length,\n conflicts: conflicts.length,\n untracked: untracked.length,\n synced: summary.synced,\n });\n return;\n }\n\n if (opts.short) {\n printShortStatus(pendingPush, conflicts, untracked);\n } else {\n printLongStatus(remoteName, remoteUrl, pendingPush, conflicts, untracked, summary);\n }\n } finally {\n store.close();\n }\n });\n\nfunction printShortStatus(\n pendingPush: Array<{ memory: { id: string; text: string }; syncState: { syncStatus: string } }>,\n conflicts: Array<{ memory: { id: string; text: string } }>,\n untracked: Array<{ id: string; text: string }>,\n): void {\n for (const { memory } of pendingPush) {\n logger.info(`M ${memory.id.slice(0, 8)} ${truncate(memory.text, 50)}`);\n }\n for (const { memory } of conflicts) {\n logger.info(`C ${memory.id.slice(0, 8)} ${truncate(memory.text, 50)}`);\n }\n for (const memory of untracked) {\n logger.info(`?? ${memory.id.slice(0, 8)} ${truncate(memory.text, 50)}`);\n }\n}\n\nfunction printLongStatus(\n remoteName: string,\n remoteUrl: string,\n pendingPush: Array<{ memory: { id: string; text: string; status: string }; syncState: { syncStatus: string } }>,\n conflicts: Array<{ memory: { id: string; text: string } }>,\n untracked: Array<{ id: string; text: string }>,\n summary: { synced: number; pendingPush: number; pendingPull: number; conflicts: number },\n): void {\n if (remoteUrl) {\n logger.info(`Remote '${remoteName}' at ${remoteUrl}`);\n } else {\n logger.info(\"No remote configured. Use 'unforgit remote add origin <url>' to add one.\");\n }\n logger.info(\"\");\n\n if (pendingPush.length === 0 && conflicts.length === 0 && untracked.length === 0) {\n logger.info(\"Nothing to push, working tree clean\");\n if (summary.synced > 0) {\n logger.info(` ${summary.synced} memories synced with remote`);\n }\n return;\n }\n\n if (pendingPush.length > 0) {\n logger.info(\"Changes to be pushed:\");\n logger.info(' (use \"unforgit push\" to sync with remote)');\n logger.info(\"\");\n for (const { memory } of pendingPush) {\n const action = memory.status === \"active\" ? \"new memory\" : \"modified\";\n logger.info(` ${action}: ${memory.id.slice(0, 8)}... \"${truncate(memory.text, 40)}\"`);\n }\n logger.info(\"\");\n }\n\n if (conflicts.length > 0) {\n logger.info(\"Conflicts:\");\n logger.info(' (use \"unforgit push --force\" to overwrite remote or \"unforgit pull --force\" to accept remote)');\n logger.info(\"\");\n for (const { memory } of conflicts) {\n logger.info(` conflict: ${memory.id.slice(0, 8)}... \"${truncate(memory.text, 40)}\"`);\n }\n logger.info(\"\");\n }\n\n if (untracked.length > 0) {\n logger.info(\"Untracked memories:\");\n logger.info(' (these memories were created before sync tracking was enabled)');\n logger.info(' (use \"unforgit push\" to sync them)');\n logger.info(\"\");\n for (const memory of untracked) {\n logger.info(` ${memory.id.slice(0, 8)}... \"${truncate(memory.text, 40)}\"`);\n }\n logger.info(\"\");\n }\n\n const total = pendingPush.length + conflicts.length + untracked.length;\n logger.info(`${total} change(s) pending`);\n}\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { truncate } from \"../utils.js\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\n\nexport const pushCommand = new Command(\"push\")\n .description(\"Push local memories to remote\")\n .argument(\"[remote]\", \"Remote name to push to\", \"origin\")\n .option(\"-f, --force\", \"Force push, overwriting remote conflicts\")\n .option(\"--dry-run\", \"Show what would be pushed without actually pushing\")\n .option(\"-a, --all\", \"Push all memories including untracked ones\")\n .action(async (remote, opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n if (!config.remote.url) {\n logger.fatal(`No remote '${remote}' configured.`);\n logger.error(\"Use 'unforgit remote add origin <url>' to add a remote.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const client = new RemoteClient(config.remote.url);\n\n const pendingPush = store.getPendingPush();\n const untracked = opts.all ? store.getUntrackedMemories(orgId, repoId) : [];\n \n for (const memory of untracked) {\n store.initSyncStateForMemory(memory.id);\n }\n \n const allToPush = opts.all \n ? [...pendingPush, ...untracked.map(m => ({ memory: m, syncState: store.getSyncState(m.id)! }))]\n : pendingPush;\n\n const supersededToSync = store.getSupersededMemoriesToSync(orgId, repoId);\n const linksToSync = store.getLinksToSync(orgId, repoId);\n\n if (allToPush.length === 0 && supersededToSync.length === 0 && linksToSync.length === 0) {\n logger.info(\"Everything up-to-date\");\n return;\n }\n\n logger.info(`Pushing to ${remote} (${config.remote.url})...`);\n\n if (opts.dryRun) {\n if (allToPush.length > 0) {\n logger.info(\"\\nWould push the following memories:\");\n for (const { memory } of allToPush) {\n logger.info(` ${memory.id.slice(0, 8)}... \"${truncate(memory.text, 50)}\"`);\n }\n }\n if (supersededToSync.length > 0) {\n logger.info(\"\\nWould sync superseded status:\");\n for (const { memory, newId } of supersededToSync) {\n logger.info(` ${memory.id.slice(0, 8)}... -> superseded by ${newId.slice(0, 8)}...`);\n }\n }\n if (linksToSync.length > 0) {\n logger.info(\"\\nWould sync links:\");\n for (const { link } of linksToSync) {\n logger.info(` ${link.sourceId.slice(0, 8)}... -> ${link.targetId.slice(0, 8)}... (${link.linkType})`);\n }\n }\n logger.info(`\\nTotal: ${allToPush.length} memories, ${supersededToSync.length} status updates, ${linksToSync.length} links`);\n return;\n }\n\n let pushed = 0;\n let errors = 0;\n\n for (const { memory, syncState } of allToPush) {\n try {\n const fullMemory = store.getById(memory.id);\n if (!fullMemory) continue;\n\n if (fullMemory.visibility !== \"repo\" && !opts.force) {\n logger.info(` Skipping ${memory.id.slice(0, 8)}... (private memory, use --force to push anyway)`);\n continue;\n }\n\n await client.store({\n id: fullMemory.id,\n orgId: fullMemory.orgId,\n repoId: fullMemory.repoId,\n memoryType: fullMemory.memoryType,\n text: fullMemory.text,\n summary: fullMemory.summary,\n tags: fullMemory.tags,\n sourceRefs: fullMemory.sourceRefs,\n confidence: fullMemory.confidence,\n ttlSeconds: fullMemory.ttlSeconds,\n visibility: \"repo\",\n authorId: fullMemory.authorId,\n authorName: fullMemory.authorName,\n });\n\n store.markAsPushed(memory.id, fullMemory.version);\n pushed++;\n logger.progress(pushed + errors, allToPush.length, \"memories\");\n logger.debug(`pushed ${memory.id.slice(0, 8)}...`);\n } catch (err) {\n errors++;\n const errorMsg = err instanceof Error ? err.message : String(err);\n logger.error(` ${memory.id.slice(0, 8)}... failed: ${errorMsg}`);\n\n if (errorMsg.includes(\"409\") || errorMsg.includes(\"conflict\")) {\n if (opts.force) {\n logger.info(` Forcing overwrite...`);\n } else {\n store.markAsConflict(memory.id, syncState?.remoteVersion ?? 0);\n logger.info(` Marked as conflict. Use --force to overwrite.`);\n }\n }\n }\n }\n\n let supersededSynced = 0;\n\n for (const { memory, newId } of supersededToSync) {\n try {\n await client.supersede(memory.id, newId);\n store.markStatusSynced(memory.id);\n supersededSynced++;\n logger.info(` ${memory.id.slice(0, 8)}... marked as superseded on remote`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (!errorMsg.includes(\"404\")) {\n errors++;\n logger.error(` ${memory.id.slice(0, 8)}... failed to sync superseded status: ${errorMsg}`);\n }\n }\n }\n\n let linksSynced = 0;\n\n for (const { link } of linksToSync) {\n try {\n await client.link(link.sourceId, link.targetId, link.linkType, link.metadata);\n store.markLinkSynced(link.id);\n linksSynced++;\n logger.info(` link ${link.sourceId.slice(0, 8)}... -> ${link.targetId.slice(0, 8)}... (${link.linkType})`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (!errorMsg.includes(\"404\")) {\n errors++;\n logger.error(` link ${link.sourceId.slice(0, 8)}... failed: ${errorMsg}`);\n }\n }\n }\n\n logger.info(\"\");\n if (pushed > 0) {\n logger.info(`${pushed} memory(s) pushed successfully`);\n }\n if (supersededSynced > 0) {\n logger.info(`${supersededSynced} memory(s) marked as superseded on remote`);\n }\n if (linksSynced > 0) {\n logger.info(`${linksSynced} link(s) synced`);\n }\n if (errors > 0) {\n logger.info(`${errors} error(s) during push`);\n }\n } finally {\n store.close();\n }\n });\n\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\n\nexport const pullCommand = new Command(\"pull\")\n .description(\"Pull remote memories to local\")\n .argument(\"[remote]\", \"Remote name to pull from\", \"origin\")\n .option(\"-f, --force\", \"Force pull, overwriting local conflicts\")\n .option(\"--dry-run\", \"Show what would be pulled without actually pulling\")\n .action(async (remote, opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n if (!config.remote.url) {\n logger.fatal(`No remote '${remote}' configured.`);\n logger.fatal(\"Use 'unforgit remote add origin <url>' to add a remote.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const client = new RemoteClient(config.remote.url);\n\n logger.info(`Fetching from ${remote} (${config.remote.url})...`);\n\n const response = await client.recall({\n orgId,\n repoId,\n query: \"*\",\n k: 1000,\n includeDeprecated: true,\n });\n\n const remoteMemories = response.results;\n\n if (remoteMemories.length === 0) {\n logger.info(\"Already up to date (no memories on remote)\");\n return;\n }\n\n if (opts.dryRun) {\n let newCount = 0;\n let updateCount = 0;\n\n for (const remoteMem of remoteMemories) {\n const localMem = store.getById(remoteMem.id);\n if (!localMem) {\n newCount++;\n } else {\n updateCount++;\n }\n }\n\n logger.info(`\\nWould pull:`);\n logger.info(` ${newCount} new memories`);\n logger.info(` ${updateCount} updates`);\n return;\n }\n\n let created = 0;\n let updated = 0;\n let skipped = 0;\n let conflicts = 0;\n\n for (const remoteMem of remoteMemories) {\n const localMem = store.getById(remoteMem.id);\n\n const remoteStatus = remoteMem.status ?? \"active\";\n\n if (!localMem) {\n store.upsertFromRemote({\n id: remoteMem.id,\n orgId,\n repoId,\n scopeType: \"repo\",\n memoryType: remoteMem.memoryType,\n visibility: \"repo\",\n status: remoteStatus,\n text: remoteMem.text,\n summary: remoteMem.summary,\n tags: remoteMem.tags,\n sourceRefs: remoteMem.sourceRefs,\n supersedesId: remoteMem.supersedesId,\n version: 1,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n\n store.setSyncState({\n memoryId: remoteMem.id,\n localVersion: 1,\n remoteVersion: 1,\n lastPulledAt: new Date(),\n syncStatus: \"synced\",\n });\n\n created++;\n const statusNote = remoteStatus !== \"active\" ? ` [${remoteStatus}]` : \"\";\n logger.info(` ${remoteMem.id.slice(0, 8)}... new memory${statusNote}`);\n logger.progress(created + updated + skipped + conflicts, remoteMemories.length, \"memories\");\n } else {\n const syncState = store.getSyncState(remoteMem.id);\n const localVersion = syncState?.localVersion ?? localMem.version;\n const remoteVersion = syncState?.remoteVersion ?? 0;\n\n if (syncState?.syncStatus === \"pending_push\" && !opts.force) {\n conflicts++;\n store.markAsConflict(remoteMem.id, remoteVersion + 1);\n logger.info(` ${remoteMem.id.slice(0, 8)}... conflict (local has unpushed changes)`);\n logger.progress(created + updated + skipped + conflicts, remoteMemories.length, \"memories\");\n continue;\n }\n\n const statusChanged = localMem.status !== remoteStatus;\n const textChanged = localMem.text !== remoteMem.text;\n\n if (!textChanged && !statusChanged) {\n skipped++;\n logger.progress(created + updated + skipped + conflicts, remoteMemories.length, \"memories\");\n continue;\n }\n\n if (opts.force || syncState?.syncStatus !== \"pending_push\") {\n store.upsertFromRemote({\n id: remoteMem.id,\n orgId,\n repoId,\n scopeType: \"repo\",\n memoryType: remoteMem.memoryType,\n visibility: \"repo\",\n status: remoteStatus,\n text: remoteMem.text,\n summary: remoteMem.summary,\n tags: remoteMem.tags,\n sourceRefs: remoteMem.sourceRefs,\n supersedesId: remoteMem.supersedesId,\n version: localVersion + 1,\n createdAt: localMem.createdAt,\n updatedAt: new Date(),\n });\n\n store.markAsPulled(remoteMem.id, localVersion + 1);\n updated++;\n const changeType = statusChanged && !textChanged ? \"status updated\" : \"updated\";\n const statusNote = remoteStatus !== \"active\" ? ` [${remoteStatus}]` : \"\";\n logger.info(` ${remoteMem.id.slice(0, 8)}... ${changeType}${statusNote}`);\n logger.progress(created + updated + skipped + conflicts, remoteMemories.length, \"memories\");\n }\n }\n }\n\n logger.info(\"\");\n logger.info(`Pull complete:`);\n if (created > 0) logger.info(` ${created} new memories`);\n if (updated > 0) logger.info(` ${updated} updates`);\n if (skipped > 0) logger.info(` ${skipped} already up to date`);\n if (conflicts > 0) {\n logger.info(` ${conflicts} conflicts (use --force to overwrite local)`);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n logger.fatal(`Could not fetch from remote: ${errorMsg}`);\n process.exit(EXIT_ERROR);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { isInitialized, loadConfig, saveConfig } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR, EXIT_ERROR } from \"../exit-codes.js\";\nimport type { AppConfig, RemoteConfig } from \"unforgit-shared\";\n\nexport const remoteCommand = new Command(\"remote\")\n .description(\"Manage set of tracked remote repositories\")\n .addHelpText(\"after\", `\nExamples:\n unforgit remote List remotes\n unforgit remote add origin <url> Add a remote\n unforgit remote show origin Show remote details`)\n .action(() => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const remotes = getRemotes(config);\n\n if (Object.keys(remotes).length === 0) {\n logger.info(\"No remotes configured.\");\n logger.info(\"Use 'unforgit remote add <name> <url>' to add a remote.\");\n return;\n }\n\n for (const [name, remote] of Object.entries(remotes)) {\n logger.info(`${name}\\t${remote.url}`);\n }\n });\n\nexport const remoteAddCommand = new Command(\"add\")\n .description(\"Add a new remote\")\n .argument(\"<name>\", \"Name for the remote (e.g., origin)\")\n .argument(\"<url>\", \"URL of the remote unforgit server\")\n .option(\"--org <orgId>\", \"Organization ID\")\n .option(\"--repo <repoId>\", \"Repository ID\")\n .action((name, url, opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const remotes = getRemotes(config);\n\n if (remotes[name]) {\n logger.fatal(`remote '${name}' already exists.`);\n logger.error(`Use 'unforgit remote set-url ${name} <newurl>' to change the URL.`);\n process.exit(EXIT_ERROR);\n }\n\n remotes[name] = {\n url,\n orgId: opts.org || config.remote?.orgId || \"\",\n repoId: opts.repo || config.remote?.repoId || \"\",\n };\n\n saveRemotes(config, remotes);\n logger.info(`Remote '${name}' added: ${url}`);\n });\n\nexport const remoteRemoveCommand = new Command(\"remove\")\n .alias(\"rm\")\n .description(\"Remove a remote\")\n .argument(\"<name>\", \"Name of the remote to remove\")\n .action((name) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const remotes = getRemotes(config);\n\n if (!remotes[name]) {\n logger.fatal(`No such remote: '${name}'`);\n process.exit(EXIT_ERROR);\n }\n\n delete remotes[name];\n saveRemotes(config, remotes);\n logger.info(`Remote '${name}' removed.`);\n });\n\nexport const remoteSetUrlCommand = new Command(\"set-url\")\n .description(\"Change the URL for a remote\")\n .argument(\"<name>\", \"Name of the remote\")\n .argument(\"<newurl>\", \"New URL for the remote\")\n .action((name, newurl) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const remotes = getRemotes(config);\n\n if (!remotes[name]) {\n logger.fatal(`No such remote: '${name}'`);\n logger.error(`Use 'unforgit remote add ${name} ${newurl}' to add it.`);\n process.exit(EXIT_ERROR);\n }\n\n remotes[name].url = newurl;\n saveRemotes(config, remotes);\n logger.info(`Remote '${name}' URL changed to: ${newurl}`);\n });\n\nexport const remoteShowCommand = new Command(\"show\")\n .description(\"Show information about a remote\")\n .argument(\"<name>\", \"Name of the remote\")\n .action((name) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const remotes = getRemotes(config);\n\n if (!remotes[name]) {\n logger.fatal(`No such remote: '${name}'`);\n process.exit(EXIT_ERROR);\n }\n\n const remote = remotes[name];\n logger.info(`* remote ${name}`);\n logger.info(` URL: ${remote.url}`);\n logger.info(` Org ID: ${remote.orgId || \"(not set)\"}`);\n logger.info(` Repo ID: ${remote.repoId || \"(not set)\"}`);\n });\n\nremoteCommand.addCommand(remoteAddCommand);\nremoteCommand.addCommand(remoteRemoveCommand);\nremoteCommand.addCommand(remoteSetUrlCommand);\nremoteCommand.addCommand(remoteShowCommand);\n\nfunction getRemotes(config: AppConfig): Record<string, RemoteConfig> {\n if (config.remotes) {\n return { ...config.remotes };\n }\n\n if (config.remote?.url) {\n return {\n origin: {\n url: config.remote.url,\n orgId: config.remote.orgId,\n repoId: config.remote.repoId,\n },\n };\n }\n\n return {};\n}\n\nfunction saveRemotes(config: AppConfig, remotes: Record<string, RemoteConfig>): void {\n config.remotes = remotes;\n\n if (remotes.origin) {\n config.remote = {\n ...config.remote,\n url: remotes.origin.url,\n orgId: remotes.origin.orgId,\n repoId: remotes.origin.repoId,\n };\n }\n\n saveConfig(config);\n}\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { LocalStore } from \"unforgit-db\";\nimport { parsePositiveInt, validateMemoryType } from \"unforgit-config\";\nimport { isJsonMode, outputJson, paginate } from \"../utils.js\";\n\nexport const logCommand = new Command(\"log\")\n .description(\"Show memory history log\")\n .option(\"-n, --max-count <n>\", \"Limit the number of memories shown\", \"20\")\n .option(\"--oneline\", \"Show each memory on a single line\")\n .option(\"--all\", \"Show all memories including deprecated/superseded\")\n .option(\"--type <type>\", \"Filter by memory type (episodic|semantic|procedural)\")\n .option(\"--tags <tags>\", \"Filter by tags (comma-separated)\")\n .option(\"--page <n>\", \"Page number for pagination\", \"1\")\n .option(\"--per-page <n>\", \"Items per page\", \"20\")\n .addHelpText(\"after\", `\nExamples:\n unforgit log Show recent memories\n unforgit log --all Include deprecated/superseded\n unforgit log --type semantic Filter by type\n unforgit log --oneline Compact output\n unforgit log --page 2 Second page of results`)\n .action((opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n const limit = parsePositiveInt(opts.maxCount, \"max-count\");\n\n if (opts.type && !validateMemoryType(opts.type)) {\n logger.error(`Invalid memory type \"${opts.type}\". Must be one of: episodic, semantic, procedural`);\n process.exit(EXIT_ERROR);\n }\n\n const types = opts.type ? [opts.type] : undefined;\n const status = opts.all ? undefined : [\"active\" as const];\n\n const memories = store.list({\n orgId,\n repoId,\n types,\n status,\n limit,\n sortBy: \"createdAt\",\n sortOrder: \"desc\",\n });\n\n let filteredMemories = memories;\n if (opts.tags) {\n const filterTags = opts.tags.split(\",\").map((t: string) => t.trim());\n filteredMemories = memories.filter((m) =>\n m.tags.some((t) => filterTags.includes(t))\n );\n }\n\n const page = parsePositiveInt(opts.page, \"page\");\n const perPage = parsePositiveInt(opts.perPage, \"per-page\");\n const paged = paginate(filteredMemories, page, perPage);\n\n if (isJsonMode()) {\n outputJson({\n memories: paged.items.map((m) => ({\n id: m.id,\n type: m.memoryType,\n status: m.status,\n text: m.text,\n tags: m.tags,\n createdAt: m.createdAt.toISOString(),\n })),\n page: paged.currentPage,\n totalPages: paged.totalPages,\n total: paged.total,\n });\n return;\n }\n\n if (paged.items.length === 0) {\n logger.info(\"No memories found.\");\n return;\n }\n\n if (opts.oneline) {\n for (const mem of paged.items) {\n const text = mem.text.replace(/\\n/g, \" \").slice(0, 60);\n logger.info(`${mem.id.slice(0, 7)} [${mem.memoryType}] ${text}${mem.text.length > 60 ? \"...\" : \"\"}`);\n }\n } else {\n for (const mem of paged.items) {\n const date = mem.createdAt.toISOString().split(\"T\")[0];\n const time = mem.createdAt.toISOString().split(\"T\")[1].slice(0, 5);\n\n logger.info(`memory ${mem.id}`);\n logger.info(`Type: ${mem.memoryType}`);\n logger.info(`Date: ${date} ${time}`);\n logger.info(`Status: ${mem.status}`);\n if (mem.tags.length > 0) {\n logger.info(`Tags: ${mem.tags.join(\", \")}`);\n }\n logger.info(\"\");\n logger.info(` ${mem.text.split(\"\\n\").join(\"\\n \")}`);\n logger.info(\"\");\n }\n }\n\n if (paged.totalPages > 1) {\n logger.info(`Page ${paged.currentPage}/${paged.totalPages} (${paged.total} total)`);\n }\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { truncate, isJsonMode, outputJson } from \"../utils.js\";\n\nexport const diffCommand = new Command(\"diff\")\n .description(\"Show differences between local and remote memories\")\n .argument(\"[memoryId]\", \"Specific memory ID to diff\")\n .option(\"--stat\", \"Show only statistics\")\n .addHelpText(\"after\", `\nExamples:\n unforgit diff Show all differences\n unforgit diff --stat Show difference statistics only\n unforgit diff abc12345 Diff a specific memory`)\n .action(async (memoryId, opts) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const store = new LocalStore(getDbPath());\n\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n if (!config.remote.url) {\n logger.fatal(\"No remote configured.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const client = new RemoteClient(config.remote.url);\n\n if (memoryId) {\n await diffSingleMemory(store, client, memoryId, orgId, repoId);\n } else {\n await diffAll(store, client, orgId, repoId, opts.stat);\n }\n } finally {\n store.close();\n }\n });\n\nasync function diffSingleMemory(\n store: LocalStore,\n client: RemoteClient,\n memoryId: string,\n orgId: string,\n repoId: string,\n): Promise<void> {\n const fullId = memoryId.length < 36\n ? findFullId(store, memoryId, orgId, repoId)\n : memoryId;\n\n if (!fullId) {\n logger.error(`memory '${memoryId}' not found`);\n process.exit(EXIT_ERROR);\n }\n\n const localMem = store.getById(fullId);\n\n let remoteMem = null;\n try {\n const response = await client.recall({\n orgId,\n repoId,\n query: fullId,\n k: 1,\n });\n remoteMem = response.results.find((r) => r.id === fullId);\n } catch {\n logger.warn(\"Could not fetch from remote\");\n }\n\n if (!localMem && !remoteMem) {\n logger.error(`memory '${memoryId}' not found locally or remotely`);\n process.exit(EXIT_ERROR);\n }\n\n if (isJsonMode()) {\n outputJson({\n memoryId: fullId,\n local: localMem ? { text: localMem.text, status: localMem.status } : null,\n remote: remoteMem ? { text: remoteMem.text, status: remoteMem.status } : null,\n identical: localMem && remoteMem ? localMem.text === remoteMem.text : false,\n });\n return;\n }\n\n logger.info(`diff ${fullId.slice(0, 8)}...`);\n logger.info(\"---\");\n\n if (!localMem) {\n logger.info(\"(not in local)\");\n logger.info(\"+ \" + remoteMem!.text.split(\"\\n\").join(\"\\n+ \"));\n return;\n }\n\n if (!remoteMem) {\n logger.info(\"(not in remote)\");\n logger.info(\"+ \" + localMem.text.split(\"\\n\").join(\"\\n+ \"));\n return;\n }\n\n if (localMem.text === remoteMem.text) {\n logger.info(\"No differences\");\n return;\n }\n\n const localLines = localMem.text.split(\"\\n\");\n const remoteLines = remoteMem.text.split(\"\\n\");\n\n logger.info(\"--- local\");\n logger.info(\"+++ remote\");\n logger.info(\"\");\n\n for (let i = 0; i < Math.max(localLines.length, remoteLines.length); i++) {\n const localLine = localLines[i];\n const remoteLine = remoteLines[i];\n\n if (localLine === remoteLine) {\n logger.info(` ${localLine ?? \"\"}`);\n } else if (localLine && !remoteLine) {\n logger.info(`- ${localLine}`);\n } else if (!localLine && remoteLine) {\n logger.info(`+ ${remoteLine}`);\n } else {\n logger.info(`- ${localLine}`);\n logger.info(`+ ${remoteLine}`);\n }\n }\n}\n\nasync function diffAll(\n store: LocalStore,\n client: RemoteClient,\n orgId: string,\n repoId: string,\n statOnly: boolean,\n): Promise<void> {\n const pendingPush = store.getPendingPush();\n const conflicts = store.getConflicts();\n\n let remoteOnlyCount = 0;\n try {\n const response = await client.recall({ orgId, repoId, query: \"*\", k: 1000 });\n for (const remoteMem of response.results) {\n const localMem = store.getById(remoteMem.id);\n if (!localMem) {\n remoteOnlyCount++;\n }\n }\n } catch {\n logger.warn(\"Could not fetch remote memories for full diff\");\n }\n\n if (pendingPush.length === 0 && conflicts.length === 0 && remoteOnlyCount === 0) {\n if (isJsonMode()) {\n outputJson({ pendingPush: 0, conflicts: 0, remoteOnly: 0, total: 0 });\n return;\n }\n logger.info(\"No differences\");\n return;\n }\n\n if (isJsonMode()) {\n outputJson({\n pendingPush: pendingPush.length,\n conflicts: conflicts.length,\n remoteOnly: remoteOnlyCount,\n total: pendingPush.length + conflicts.length + remoteOnlyCount,\n });\n return;\n }\n\n if (statOnly) {\n logger.info(`${pendingPush.length} memories to push`);\n logger.info(`${conflicts.length} conflicts`);\n if (remoteOnlyCount > 0) {\n logger.info(`${remoteOnlyCount} remote-only memories (use 'unforgit pull')`);\n }\n return;\n }\n\n if (pendingPush.length > 0) {\n logger.info(\"Changes to push:\");\n logger.info(\"\");\n for (const { memory } of pendingPush) {\n logger.info(` + ${memory.id.slice(0, 8)}... \"${truncate(memory.text, 50)}\"`);\n }\n logger.info(\"\");\n }\n\n if (conflicts.length > 0) {\n logger.info(\"Conflicts:\");\n logger.info(\"\");\n for (const { memory, syncState } of conflicts) {\n logger.info(` ! ${memory.id.slice(0, 8)}... local:v${syncState.localVersion} remote:v${syncState.remoteVersion ?? \"?\"}`);\n logger.info(` \"${truncate(memory.text, 60)}\"`);\n }\n logger.info(\"\");\n }\n\n if (remoteOnlyCount > 0) {\n logger.info(`${remoteOnlyCount} remote-only memories (run 'unforgit pull' to fetch)`);\n logger.info(\"\");\n }\n\n logger.info(`Total: ${pendingPush.length + conflicts.length + remoteOnlyCount} differences`);\n}\n\nfunction findFullId(store: LocalStore, partialId: string, orgId: string, repoId: string): string | null {\n const memories = store.list({ orgId, repoId, limit: 1000 });\n const match = memories.find((m) => m.id.startsWith(partialId));\n return match?.id ?? null;\n}\n","import { Command } from \"commander\";\nimport { loadConfig, isInitialized } from \"unforgit-config\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR, EXIT_ERROR } from \"../exit-codes.js\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\n\nfunction requireRemote(): { url: string; apiKey: string } {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n\n if (!config.remote.url) {\n logger.fatal(\"No remote configured.\");\n logger.error(\"Use 'unforgit remote add origin <url>' to add a remote.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const apiKey = process.env.UNFORGIT_API_KEY;\n if (!apiKey) {\n logger.fatal(\"No API key configured.\");\n logger.error(\"Set the UNFORGIT_API_KEY environment variable.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n return { url: config.remote.url, apiKey };\n}\n\nexport const keysCommand = new Command(\"keys\")\n .description(\"Manage API keys for remote authentication\");\n\nkeysCommand\n .command(\"create\")\n .description(\"Create a new API key\")\n .requiredOption(\"--name <name>\", \"Name for the API key\")\n .requiredOption(\"--org <orgId>\", \"Organization ID for the key\")\n .addHelpText(\"after\", `\nExamples:\n unforgit keys create --name \"CI pipeline\" --org my-org\n unforgit keys list --org my-org`)\n .action(async (opts) => {\n const { url, apiKey } = requireRemote();\n const client = new RemoteClient(url, apiKey);\n\n try {\n const result = await client.createApiKey(opts.name, opts.org);\n\n if (isJsonMode()) {\n outputJson(result);\n return;\n }\n\n logger.info(\"API key created successfully!\");\n logger.info(\"\");\n logger.info(` ID: ${result.id}`);\n logger.info(` Name: ${result.name}`);\n logger.info(` Org: ${result.orgId}`);\n logger.info(` Key: ${result.key}`);\n logger.info(\"\");\n logger.info(\"Store this key securely. It will not be shown again.\");\n logger.info(\"\");\n logger.info(\"To use this key, set it as an environment variable:\");\n logger.info(\"\");\n logger.info(` export UNFORGIT_API_KEY=\"${result.key}\"`);\n } catch (err) {\n logger.fatal(err instanceof Error ? err.message : String(err));\n process.exit(EXIT_ERROR);\n }\n });\n\nkeysCommand\n .command(\"list\")\n .description(\"List all API keys\")\n .option(\"--org <orgId>\", \"Filter by organization ID\")\n .action(async (opts) => {\n const { url, apiKey } = requireRemote();\n const client = new RemoteClient(url, apiKey);\n\n try {\n const result = await client.listApiKeys(opts.org);\n\n if (isJsonMode()) {\n outputJson(result);\n return;\n }\n\n if (result.keys.length === 0) {\n logger.info(\"No API keys found.\");\n return;\n }\n\n logger.info(`Found ${result.keys.length} API key(s):\\n`);\n\n for (const key of result.keys) {\n const status = key.isActive ? \"[active]\" : \"[revoked]\";\n const lastUsed = key.lastUsedAt\n ? `last used ${new Date(key.lastUsedAt).toLocaleDateString()}`\n : \"never used\";\n logger.info(`${status} ${key.id.slice(0, 8)} ${key.name}`);\n logger.info(` org: ${key.orgId} | ${lastUsed}`);\n }\n } catch (err) {\n logger.fatal(err instanceof Error ? err.message : String(err));\n process.exit(EXIT_ERROR);\n }\n });\n\nkeysCommand\n .command(\"revoke\")\n .description(\"Revoke an API key\")\n .argument(\"<id>\", \"API key ID to revoke\")\n .action(async (id) => {\n const { url, apiKey } = requireRemote();\n const client = new RemoteClient(url, apiKey);\n\n try {\n await client.revokeApiKey(id);\n logger.info(`API key ${id.slice(0, 8)}... revoked successfully.`);\n } catch (err) {\n logger.fatal(err instanceof Error ? err.message : String(err));\n process.exit(EXIT_ERROR);\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, isInitialized } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { maskKey } from \"../utils.js\";\n\nexport const authCommand = new Command(\"auth\")\n .description(\"Check authentication status for remote server and APIs\");\n\nauthCommand\n .command(\"status\")\n .description(\"Check authentication status\")\n .action(async () => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n\n logger.info(\"Authentication status:\");\n logger.info(` Remote URL: ${config.remote.url || \"(not configured)\"}`);\n logger.info(` Org ID: ${config.remote.orgId || \"(not configured)\"}`);\n logger.info(` Repo ID: ${config.remote.repoId || \"(not configured)\"}`);\n\n const apiKey = process.env.UNFORGIT_API_KEY;\n\n if (apiKey) {\n logger.info(` API Key: ${maskKey(apiKey)} (from UNFORGIT_API_KEY env var)`);\n\n if (config.remote.url) {\n logger.info(\"\\nTesting connection...\");\n try {\n const res = await fetch(`${config.remote.url}/health`);\n if (res.ok) {\n logger.info(\" [ok] Server reachable\");\n\n const authRes = await fetch(`${config.remote.url}/v1/api-keys`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n if (authRes.ok) {\n logger.info(\" [ok] API key valid\");\n } else if (authRes.status === 401) {\n logger.info(\" [ERR] API key invalid or expired\");\n } else {\n logger.info(` [??] Could not verify API key (HTTP ${authRes.status})`);\n }\n } else {\n logger.info(` [ERR] Server returned HTTP ${res.status}`);\n }\n } catch (err) {\n logger.info(` [ERR] Could not connect: ${err instanceof Error ? err.message : err}`);\n }\n }\n } else {\n logger.info(\" API Key: (not configured)\");\n logger.info(\"\\nSet the UNFORGIT_API_KEY environment variable.\");\n }\n\n const openaiKey = process.env.OPENAI_API_KEY;\n if (openaiKey) {\n logger.info(` OpenAI Key: ${maskKey(openaiKey)} (from OPENAI_API_KEY env var)`);\n } else {\n logger.info(\" OpenAI Key: (not configured)\");\n logger.info(\" Set OPENAI_API_KEY env var for embeddings and auto-consolidation.\");\n }\n });\n","import { Command } from \"commander\";\nimport { isInitialized, loadConfig, saveConfig } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR, EXIT_ERROR } from \"../exit-codes.js\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\nimport type { AppConfig } from \"unforgit-shared\";\n\nexport const configCommand = new Command(\"config\")\n .description(\"Manage unforgit configuration\");\n\nconfigCommand\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List all configuration values\")\n .action(() => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n\n if (isJsonMode()) {\n outputJson(config);\n return;\n }\n\n logger.info(\"Current configuration:\\n\");\n logger.info(`remote.url = ${config.remote.url || \"(not set)\"}`);\n logger.info(`remote.orgId = ${config.remote.orgId || \"(not set)\"}`);\n logger.info(`remote.repoId = ${config.remote.repoId || \"(not set)\"}`);\n logger.info(`defaults.visibility = ${config.defaults.visibility}`);\n logger.info(`defaults.memoryType = ${config.defaults.memoryType}`);\n logger.info(`lifecycle.ttlSecondsByType.episodic = ${config.lifecycle?.ttlSecondsByType?.episodic ?? \"(none)\"}`);\n logger.info(`lifecycle.usageBoost.topKToRecord = ${config.lifecycle?.usageBoost?.topKToRecord ?? \"(not set)\"}`);\n logger.info(`lifecycle.usageBoost.minUsageCount = ${config.lifecycle?.usageBoost?.minUsageCount ?? \"(not set)\"}`);\n logger.info(`lifecycle.usageBoost.maxBoost = ${config.lifecycle?.usageBoost?.maxBoost ?? \"(not set)\"}`);\n logger.info(`lifecycle.usageBoost.halfLifeDays = ${config.lifecycle?.usageBoost?.halfLifeDays ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.staleEpisodicDays = ${config.lifecycle?.maintenance?.staleEpisodicDays ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.consolidationThreshold = ${config.lifecycle?.maintenance?.consolidationThreshold ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.consolidationMinGroupSize = ${config.lifecycle?.maintenance?.consolidationMinGroupSize ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.consolidationMaxGroups = ${config.lifecycle?.maintenance?.consolidationMaxGroups ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.promoteRecallCount = ${config.lifecycle?.maintenance?.promoteRecallCount ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.pinRecallCount = ${config.lifecycle?.maintenance?.pinRecallCount ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.dryRunDefault = ${config.lifecycle?.maintenance?.dryRunDefault ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.autoRunOnStore = ${config.lifecycle?.maintenance?.autoRunOnStore ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.autoRunOnRecall = ${config.lifecycle?.maintenance?.autoRunOnRecall ?? \"(not set)\"}`);\n logger.info(`lifecycle.maintenance.debounceMs = ${config.lifecycle?.maintenance?.debounceMs ?? \"(not set)\"}`);\n });\n\nconfigCommand\n .command(\"get\")\n .description(\"Get a configuration value\")\n .argument(\"<key>\", \"Configuration key (e.g., remote.url, defaults.memoryType)\")\n .action((key) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const value = getConfigValue(config, key);\n\n if (value === undefined) {\n logger.fatal(`key '${key}' not found`);\n process.exit(EXIT_ERROR);\n }\n\n if (isJsonMode()) {\n outputJson({ key, value });\n return;\n }\n\n logger.info(String(value));\n });\n\nconst VALID_CONFIG_KEYS = [\n \"remote.url\",\n \"remote.orgId\",\n \"remote.repoId\",\n \"defaults.visibility\",\n \"defaults.memoryType\",\n \"lifecycle.ttlSecondsByType.episodic\",\n \"lifecycle.ttlSecondsByType.semantic\",\n \"lifecycle.ttlSecondsByType.procedural\",\n \"lifecycle.usageBoost.enabled\",\n \"lifecycle.usageBoost.topKToRecord\",\n \"lifecycle.usageBoost.minUsageCount\",\n \"lifecycle.usageBoost.maxBoost\",\n \"lifecycle.usageBoost.halfLifeDays\",\n \"lifecycle.maintenance.staleEpisodicDays\",\n \"lifecycle.maintenance.consolidationThreshold\",\n \"lifecycle.maintenance.consolidationMinGroupSize\",\n \"lifecycle.maintenance.consolidationMaxGroups\",\n \"lifecycle.maintenance.promoteRecallCount\",\n \"lifecycle.maintenance.pinRecallCount\",\n \"lifecycle.maintenance.dryRunDefault\",\n \"lifecycle.maintenance.autoRunOnStore\",\n \"lifecycle.maintenance.autoRunOnRecall\",\n \"lifecycle.maintenance.debounceMs\",\n \"configVersion\",\n] as const;\n\nconfigCommand\n .command(\"set\")\n .description(\"Set a configuration value\")\n .argument(\"<key>\", \"Configuration key\")\n .argument(\"<value>\", \"Value to set\")\n .addHelpText(\"after\", `\nValid keys: ${VALID_CONFIG_KEYS.join(\", \")}\n\nExamples:\n unforgit config set remote.url http://my-server:3737\n unforgit config set defaults.memoryType semantic`)\n .action((key, value) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n if (!VALID_CONFIG_KEYS.includes(key as (typeof VALID_CONFIG_KEYS)[number])) {\n logger.error(\n `Unknown config key \"${key}\". Valid keys: ${VALID_CONFIG_KEYS.join(\", \")}`,\n );\n process.exit(EXIT_ERROR);\n }\n\n const config = loadConfig();\n setConfigValue(config, key, value);\n saveConfig(config);\n\n logger.info(`${key} = ${value}`);\n });\n\nconfigCommand\n .command(\"unset\")\n .description(\"Remove a configuration value\")\n .argument(\"<key>\", \"Configuration key to remove\")\n .action((key) => {\n if (!isInitialized()) {\n logger.fatal(\"not an unforgit repository\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n unsetConfigValue(config, key);\n saveConfig(config);\n\n logger.info(`Unset ${key}`);\n });\n\nfunction getConfigValue(config: AppConfig, key: string): unknown {\n const parts = key.split(\".\");\n let current: unknown = config;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\nfunction setConfigValue(config: AppConfig, key: string, value: string): void {\n const parts = key.split(\".\");\n\n if (parts.length === 1) {\n (config as unknown as Record<string, unknown>)[key] = value;\n return;\n }\n\n let current: Record<string, unknown> = config as unknown as Record<string, unknown>;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current) || typeof current[part] !== \"object\") {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n current[parts[parts.length - 1]] = coerceConfigValue(value);\n}\n\nfunction unsetConfigValue(config: AppConfig, key: string): void {\n const parts = key.split(\".\");\n\n if (parts.length === 1) {\n delete (config as unknown as Record<string, unknown>)[key];\n return;\n }\n\n let current: Record<string, unknown> = config as unknown as Record<string, unknown>;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current) || typeof current[part] !== \"object\") {\n return;\n }\n current = current[part] as Record<string, unknown>;\n }\n\n delete current[parts[parts.length - 1]];\n}\n\nfunction coerceConfigValue(value: string): string | number | boolean {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n\n if (/^-?\\d+(?:\\.\\d+)?$/.test(value)) {\n return Number(value);\n }\n\n return value;\n}\n","import { Command } from \"commander\";\nimport { LocalStore } from \"unforgit-db\";\nimport { loadConfig, getDbPath, isInitialized } from \"unforgit-config\";\nimport { generateEmbedding } from \"unforgit-core\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR, EXIT_CONFIG_ERROR } from \"../exit-codes.js\";\nimport { parsePositiveInt } from \"unforgit-config\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\n\nconst cwd = process.cwd();\n\nexport const embeddingsCommand = new Command(\"embeddings\")\n .description(\"Manage memory embeddings for semantic search\");\n\nembeddingsCommand\n .command(\"backfill\")\n .description(\"Generate embeddings for memories that don't have them\")\n .option(\"--batch-size <n>\", \"Number of memories to process in parallel\", \"5\")\n .option(\"--delay <ms>\", \"Delay between batches (ms)\", \"500\")\n .option(\"--dry-run\", \"Show what would be done without making changes\")\n .option(\"--model <model>\", \"OpenAI embedding model\", \"text-embedding-3-small\")\n .action(async (opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig(cwd);\n const apiKey = process.env.OPENAI_API_KEY;\n\n if (!apiKey && !opts.dryRun) {\n logger.error(\"OpenAI API key not set.\");\n logger.error(\"Set the OPENAI_API_KEY environment variable.\");\n process.exit(EXIT_ERROR);\n }\n\n const dbPath = getDbPath(cwd);\n const store = new LocalStore(dbPath);\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n try {\n const memories = store.getMemoriesWithoutEmbeddings(orgId, repoId);\n const stats = store.getEmbeddingStats(orgId, repoId);\n\n logger.info(`Embedding stats:`);\n logger.info(` Total memories: ${stats.total}`);\n logger.info(` With embedding: ${stats.withEmbedding}`);\n logger.info(` Without embedding: ${stats.withoutEmbedding}`);\n logger.info(\"\");\n\n if (memories.length === 0) {\n logger.info(\"All memories already have embeddings.\");\n return;\n }\n\n logger.info(`Found ${memories.length} memories without embeddings.`);\n\n if (opts.dryRun) {\n logger.info(\"\\n[Dry run - no changes made]\");\n logger.info(\"Would generate embeddings for:\");\n for (const m of memories.slice(0, 10)) {\n logger.info(` - ${m.id.slice(0, 8)}: ${m.text.slice(0, 50)}...`);\n }\n if (memories.length > 10) {\n logger.info(` ... and ${memories.length - 10} more`);\n }\n return;\n }\n\n const batchSize = parsePositiveInt(opts.batchSize, \"batch-size\");\n const delay = parsePositiveInt(opts.delay, \"delay\");\n let processed = 0;\n let errors = 0;\n\n logger.info(`\\nGenerating embeddings (batch size: ${batchSize}, delay: ${delay}ms)...`);\n\n for (let i = 0; i < memories.length; i += batchSize) {\n const batch = memories.slice(i, i + batchSize);\n\n await Promise.all(\n batch.map(async (memory) => {\n try {\n const result = await generateEmbedding(memory.text, {\n apiKey,\n model: opts.model,\n });\n await store.storeEmbedding(memory.id, result.embedding, result.model);\n processed++;\n logger.progress(processed, memories.length, \"embeddings\");\n } catch (err) {\n errors++;\n logger.error(`${memory.id.slice(0, 8)}: ${err instanceof Error ? err.message : err}`);\n }\n })\n );\n\n if (i + batchSize < memories.length) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n logger.info(`\\nBackfill complete:`);\n logger.info(` Processed: ${processed}`);\n logger.info(` Errors: ${errors}`);\n } finally {\n store.close();\n }\n });\n\nembeddingsCommand\n .command(\"stats\")\n .description(\"Show embedding statistics\")\n .action(async () => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig(cwd);\n const dbPath = getDbPath(cwd);\n const store = new LocalStore(dbPath);\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n try {\n const stats = store.getEmbeddingStats(orgId, repoId);\n const coverage = stats.total > 0\n ? ((stats.withEmbedding / stats.total) * 100).toFixed(1)\n : \"0\";\n\n if (isJsonMode()) {\n outputJson({ ...stats, coverage: parseFloat(coverage) });\n return;\n }\n\n logger.info(\"Embedding Statistics\");\n logger.info(\"====================\");\n logger.info(`Total memories: ${stats.total}`);\n logger.info(`With embedding: ${stats.withEmbedding}`);\n logger.info(`Without embedding: ${stats.withoutEmbedding}`);\n logger.info(`Coverage: ${coverage}%`);\n\n if (stats.withoutEmbedding > 0) {\n logger.info(`\\nRun 'unforgit embeddings backfill' to generate missing embeddings.`);\n }\n } finally {\n store.close();\n }\n });\n\nembeddingsCommand\n .command(\"clear\")\n .description(\"Remove all embeddings (requires regeneration)\")\n .option(\"--yes\", \"Skip confirmation\")\n .action(async (opts) => {\n if (!isInitialized(cwd)) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n if (!opts.yes) {\n logger.info(\"This will delete all embeddings. They will need to be regenerated.\");\n logger.info(\"Use --yes to confirm.\");\n return;\n }\n\n const dbPath = getDbPath(cwd);\n const store = new LocalStore(dbPath);\n\n try {\n const deleted = store.clearEmbeddings();\n logger.info(`All embeddings cleared (${deleted} removed).`);\n } finally {\n store.close();\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\nimport { confirm } from \"../utils.js\";\nimport { createLocalResetBackup } from \"./backups.js\";\n\nexport { createLocalResetBackup } from \"./backups.js\";\n\nexport const resetCommand = new Command(\"reset\")\n .description(\"Permanently delete all memories and related data\")\n .option(\"--local\", \"Reset local store only\")\n .option(\"--remote\", \"Reset remote store only\")\n .option(\"--force\", \"Skip confirmation prompt\")\n .option(\"--no-backup\", \"Skip automatic local database backup before local reset\")\n .addHelpText(\"after\", `\nExamples:\n unforgit reset Reset both local and remote\n unforgit reset --local Reset local store only\n unforgit reset --remote Reset remote store only\n unforgit reset --force Skip confirmation\n unforgit reset --no-backup Skip local backup before reset`)\n .action(async (opts) => {\n const resetLocal = opts.local || (!opts.local && !opts.remote);\n const resetRemote = opts.remote || (!opts.local && !opts.remote);\n\n const targets = [\n resetLocal ? \"local\" : null,\n resetRemote ? \"remote\" : null,\n ].filter(Boolean);\n\n if (!opts.force) {\n logger.info(\n `WARNING: This will permanently delete ALL memories, links, embeddings, and sync state from: ${targets.join(\" + \")}`,\n );\n logger.info(\"This action CANNOT be undone.\");\n\n const confirmed = await confirm(\"Type 'yes' to confirm\");\n if (!confirmed) {\n logger.info(\"Reset cancelled.\");\n return;\n }\n }\n\n const config = loadConfig();\n\n if (resetLocal) {\n const dbPath = getDbPath();\n if (opts.backup !== false) {\n try {\n const backup = createLocalResetBackup(dbPath);\n if (backup) {\n logger.info(`Created local reset backup: ${backup.dir}`);\n }\n } catch (err) {\n logger.error(\n `Failed to create local reset backup: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(EXIT_ERROR);\n }\n }\n\n const store = new LocalStore(dbPath);\n try {\n const result = store.resetAll();\n logger.info(`Local reset complete:`);\n logger.info(` Memories deleted: ${result.memoriesDeleted}`);\n logger.info(` Links deleted: ${result.linksDeleted}`);\n logger.info(` Embeddings deleted: ${result.embeddingsDeleted}`);\n } finally {\n store.close();\n }\n }\n\n if (resetRemote) {\n if (!config.remote?.url) {\n if (opts.remote) {\n logger.error(\"No remote URL configured. Run 'unforgit init' first.\");\n process.exit(EXIT_ERROR);\n }\n logger.info(\"No remote configured, skipping remote reset.\");\n return;\n }\n\n const client = new RemoteClient(config.remote.url);\n const orgId = config.remote.orgId;\n const repoId = config.remote.repoId;\n\n if (!orgId || !repoId) {\n logger.error(\"orgId and repoId must be configured for remote reset.\");\n process.exit(EXIT_ERROR);\n }\n\n try {\n const result = await client.resetAll(orgId, repoId);\n logger.info(`Remote reset complete:`);\n logger.info(` Memories deleted: ${result.memoriesDeleted}`);\n logger.info(` Links deleted: ${result.linksDeleted}`);\n logger.info(` Embeddings deleted: ${result.embeddingsDeleted}`);\n } catch (err) {\n logger.error(err instanceof Error ? err.message : String(err));\n process.exit(EXIT_ERROR);\n }\n }\n });\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { getDbPath } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { confirm } from \"../utils.js\";\nimport { EXIT_ERROR } from \"../exit-codes.js\";\n\nexport type LocalResetBackup = {\n name: string;\n dir: string;\n files: string[];\n sizeBytes: number;\n createdAt: string;\n};\n\nexport type LocalResetRestore = {\n restoredFrom: LocalResetBackup;\n safetyBackup: LocalResetBackup | null;\n};\n\nfunction formatBackupTimestamp(date: Date): string {\n return date\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(\"T\", \"-\")\n .replace(/\\.\\d{3}Z$/, \"\");\n}\n\nfunction backupRootForDb(dbPath: string): string {\n return path.join(path.dirname(dbPath), \"backups\");\n}\n\nfunction describeBackup(dir: string): LocalResetBackup {\n const files = fs\n .readdirSync(dir)\n .filter((file) => file === \"local.db\" || file === \"local.db-wal\" || file === \"local.db-shm\")\n .sort();\n const sizeBytes = files.reduce((total, file) => total + fs.statSync(path.join(dir, file)).size, 0);\n const stat = fs.statSync(dir);\n return {\n name: path.basename(dir),\n dir,\n files,\n sizeBytes,\n createdAt: stat.mtime.toISOString(),\n };\n}\n\nfunction resolveBackupDir(backupRoot: string, backupName: string): string {\n if (backupName !== path.basename(backupName)) {\n throw new Error(\"Invalid backup name\");\n }\n const resolvedRoot = path.resolve(backupRoot);\n const resolvedBackup = path.resolve(resolvedRoot, backupName);\n if (!resolvedBackup.startsWith(`${resolvedRoot}${path.sep}`)) {\n throw new Error(\"Invalid backup name\");\n }\n return resolvedBackup;\n}\n\nexport function createLocalResetBackup(\n dbPath: string,\n now: Date = new Date(),\n): LocalResetBackup | null {\n if (!fs.existsSync(dbPath)) {\n return null;\n }\n\n const backupRoot = backupRootForDb(dbPath);\n const baseName = `reset-${formatBackupTimestamp(now)}`;\n let backupDir = path.join(backupRoot, baseName);\n let suffix = 1;\n while (fs.existsSync(backupDir)) {\n backupDir = path.join(backupRoot, `${baseName}-${suffix++}`);\n }\n\n fs.mkdirSync(backupDir, { recursive: true, mode: 0o700 });\n\n for (const source of [dbPath, `${dbPath}-wal`, `${dbPath}-shm`]) {\n if (!fs.existsSync(source)) continue;\n fs.copyFileSync(source, path.join(backupDir, path.basename(source)));\n }\n\n return describeBackup(backupDir);\n}\n\nexport function listLocalResetBackups(dbPath: string): LocalResetBackup[] {\n const backupRoot = backupRootForDb(dbPath);\n if (!fs.existsSync(backupRoot)) {\n return [];\n }\n\n return fs\n .readdirSync(backupRoot, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && entry.name.startsWith(\"reset-\"))\n .map((entry) => describeBackup(path.join(backupRoot, entry.name)))\n .filter((backup) => backup.files.includes(\"local.db\"))\n .sort((a, b) => b.name.localeCompare(a.name));\n}\n\nexport function restoreLocalResetBackup(\n dbPath: string,\n backupName: string,\n now: Date = new Date(),\n): LocalResetRestore {\n const backupRoot = backupRootForDb(dbPath);\n const backupDir = resolveBackupDir(backupRoot, backupName);\n if (!fs.existsSync(backupDir) || !fs.statSync(backupDir).isDirectory()) {\n throw new Error(`Backup not found: ${backupName}`);\n }\n\n const restoredFrom = describeBackup(backupDir);\n if (!restoredFrom.files.includes(\"local.db\")) {\n throw new Error(`Backup is missing local.db: ${backupName}`);\n }\n\n const safetyBackup = createLocalResetBackup(dbPath, now);\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n\n for (const target of [dbPath, `${dbPath}-wal`, `${dbPath}-shm`]) {\n if (fs.existsSync(target)) {\n fs.rmSync(target, { force: true });\n }\n }\n\n for (const file of restoredFrom.files) {\n fs.copyFileSync(path.join(backupDir, file), path.join(path.dirname(dbPath), file));\n }\n\n return { restoredFrom, safetyBackup };\n}\n\nexport const backupsCommand = new Command(\"backups\")\n .description(\"List and restore local reset backups\");\n\nbackupsCommand\n .command(\"list\")\n .description(\"List local backups created before destructive resets/restores\")\n .action(() => {\n const backups = listLocalResetBackups(getDbPath());\n if (backups.length === 0) {\n logger.info(\"No local reset backups found.\");\n return;\n }\n\n for (const backup of backups) {\n logger.info(`${backup.name}\\t${backup.sizeBytes} bytes\\t${backup.dir}`);\n }\n });\n\nbackupsCommand\n .command(\"restore\")\n .argument(\"<name>\", \"Backup directory name, for example reset-20260610-123456\")\n .description(\"Restore a local reset backup into the active local database\")\n .option(\"--force\", \"Skip confirmation prompt\")\n .action(async (name: string, opts: { force?: boolean }) => {\n if (!opts.force) {\n const ok = await confirm(\n \"This will replace the active local database after creating a safety backup. Continue?\",\n );\n if (!ok) {\n logger.info(\"Aborted.\");\n return;\n }\n }\n\n try {\n const result = restoreLocalResetBackup(getDbPath(), name);\n logger.info(`Restored local database from ${result.restoredFrom.name}`);\n if (result.safetyBackup) {\n logger.info(`Previous local database safety backup: ${result.safetyBackup.dir}`);\n }\n } catch (err) {\n logger.error(err instanceof Error ? err.message : String(err));\n process.exit(EXIT_ERROR);\n }\n });\n","import { Command } from \"commander\";\nimport { loadConfig, getDbPath, isInitialized, getConfigPath } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR, EXIT_ERROR } from \"../exit-codes.js\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\nimport fs from \"node:fs\";\nimport YAML from \"yaml\";\n\ninterface DiagnosticResult {\n check: string;\n status: \"ok\" | \"warn\" | \"error\";\n message: string;\n fix?: string;\n}\n\ninterface DoctorSummary {\n ok: number;\n warnings: number;\n errors: number;\n}\n\nexport const doctorCommand = new Command(\"doctor\")\n .description(\"Check system health and diagnose common issues\")\n .action(async () => {\n const results: DiagnosticResult[] = [];\n\n if (!isInitialized()) {\n results.push({\n check: \"initialization\",\n status: \"error\",\n message: \"Not an unforgit repository. Run 'unforgit init' first.\",\n fix: \"Run 'unforgit init' in the repository root.\",\n });\n if (isJsonMode()) {\n outputJson(buildPayload(results));\n process.exit(EXIT_CONFIG_ERROR);\n }\n printResults(results);\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n results.push({ check: \"initialization\", status: \"ok\", message: \"Repository initialized\" });\n\n const configPath = getConfigPath();\n try {\n const config = loadConfig();\n results.push({ check: \"config\", status: \"ok\", message: `Valid config at ${configPath}` });\n\n const deprecatedConfigKeys = findDeprecatedConfigKeys(configPath);\n if (deprecatedConfigKeys.length > 0) {\n results.push({\n check: \"config-deprecated-secrets\",\n status: \"warn\",\n message: `Deprecated secret-bearing config key(s): ${deprecatedConfigKeys.join(\", \")}`,\n fix: \"Move secrets to environment variables and remove them from unforgit.yaml.\",\n });\n } else {\n results.push({ check: \"config-deprecated-secrets\", status: \"ok\", message: \"No deprecated secret keys in config\" });\n }\n\n if (process.platform !== \"win32\") {\n try {\n const stat = fs.statSync(configPath);\n const mode = stat.mode & 0o777;\n if (mode & 0o044) {\n results.push({\n check: \"config-permissions\",\n status: \"warn\",\n message: `Config readable by others (mode ${mode.toString(8)}). Run: chmod 600 ${configPath}`,\n fix: `Run 'chmod 600 ${configPath}'.`,\n });\n } else {\n results.push({ check: \"config-permissions\", status: \"ok\", message: \"Config file permissions are secure\" });\n }\n } catch {\n results.push({ check: \"config-permissions\", status: \"warn\", message: \"Could not check config file permissions\" });\n }\n }\n\n const store = new LocalStore(getDbPath());\n try {\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n\n store.list({ orgId, repoId, limit: 1 });\n results.push({ check: \"local-db\", status: \"ok\", message: \"SQLite database is accessible\" });\n\n const memoryStats = store.stats(orgId, repoId);\n results.push({\n check: \"memory-stats\",\n status: \"ok\",\n message: `${memoryStats.total} memories (${memoryStats.byType.episodic} episodic, ${memoryStats.byType.semantic} semantic, ${memoryStats.byType.procedural} procedural)`,\n });\n\n const stats = store.getEmbeddingStats(orgId, repoId);\n if (stats.total === 0) {\n results.push({ check: \"embeddings\", status: \"ok\", message: \"No memories yet\" });\n } else if (stats.withoutEmbedding === 0) {\n results.push({ check: \"embeddings\", status: \"ok\", message: `All ${stats.total} memories have embeddings` });\n } else {\n const pct = ((stats.withEmbedding / stats.total) * 100).toFixed(1);\n results.push({\n check: \"embeddings\",\n status: \"warn\",\n message: `${stats.withoutEmbedding}/${stats.total} memories lack embeddings (${pct}% coverage). Run 'unforgit embeddings backfill'`,\n fix: \"Run 'unforgit embeddings backfill'.\",\n });\n }\n\n const pendingPush = store.getPendingPush();\n const conflicts = store.getConflicts();\n const unsyncedTombstones = store.getUnsyncedTombstones(orgId, repoId);\n if (unsyncedTombstones.length > 0) {\n results.push({\n check: \"tombstones\",\n status: \"warn\",\n message: `${unsyncedTombstones.length} deleted memory tombstone(s) pending sync`,\n fix: \"Run 'unforgit push' to sync deletions.\",\n });\n } else {\n results.push({ check: \"tombstones\", status: \"ok\", message: \"No deleted memory tombstones pending sync\" });\n }\n\n if (conflicts.length > 0) {\n results.push({\n check: \"sync\",\n status: \"warn\",\n message: `${conflicts.length} sync conflict(s) need resolution`,\n fix: \"Resolve conflicts with 'unforgit pull --force' or 'unforgit push --force' after reviewing the desired source of truth.\",\n });\n } else if (pendingPush.length > 0) {\n results.push({\n check: \"sync\",\n status: \"ok\",\n message: `${pendingPush.length} memory(s) pending push`,\n });\n } else {\n results.push({ check: \"sync\", status: \"ok\", message: \"Sync state clean\" });\n }\n } finally {\n store.close();\n }\n\n const apiKey = process.env.UNFORGIT_API_KEY;\n if (config.remote.url) {\n if (!apiKey) {\n results.push({\n check: \"auth\",\n status: \"warn\",\n message: \"No API key configured. Set the UNFORGIT_API_KEY environment variable.\",\n fix: \"Set UNFORGIT_API_KEY in your shell or secret manager before remote sync.\",\n });\n } else {\n results.push({\n check: \"auth\",\n status: \"ok\",\n message: \"API key configured ([REDACTED])\",\n });\n }\n\n try {\n const res = await fetch(`${config.remote.url}/health`);\n if (res.ok) {\n results.push({ check: \"remote\", status: \"ok\", message: `Server reachable at ${config.remote.url}` });\n\n if (apiKey) {\n const client = new RemoteClient(config.remote.url);\n try {\n await client.listApiKeys();\n results.push({ check: \"remote-auth\", status: \"ok\", message: \"API key is valid\" });\n } catch {\n results.push({\n check: \"remote-auth\",\n status: \"error\",\n message: \"API key is invalid or expired\",\n fix: \"Create a new API key with 'unforgit keys create' or update UNFORGIT_API_KEY.\",\n });\n }\n }\n } else {\n results.push({\n check: \"remote\",\n status: \"error\",\n message: `Server returned HTTP ${res.status}`,\n fix: \"Check the Unforgit API server health endpoint and remote.url in unforgit.yaml.\",\n });\n }\n } catch (err) {\n results.push({\n check: \"remote\",\n status: \"error\",\n message: `Cannot connect to ${config.remote.url}: ${err instanceof Error ? err.message : err}`,\n fix: \"Start the Unforgit API server or update remote.url in unforgit.yaml.\",\n });\n }\n } else {\n results.push({\n check: \"remote\",\n status: \"warn\",\n message: \"No remote URL configured\",\n fix: \"Run 'unforgit remote add origin <url>' if this repo should sync remotely.\",\n });\n }\n\n const openaiKey = process.env.OPENAI_API_KEY;\n if (openaiKey) {\n results.push({ check: \"openai\", status: \"ok\", message: \"OpenAI API key configured ([REDACTED])\" });\n } else {\n results.push({\n check: \"openai\",\n status: \"warn\",\n message: \"No OpenAI API key. Auto-consolidation and embeddings backfill require it.\",\n fix: \"Set OPENAI_API_KEY before running embedding backfill or AI consolidation.\",\n });\n }\n } catch (err) {\n results.push({\n check: \"config\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n fix: `Fix ${configPath} or re-run 'unforgit init'.`,\n });\n }\n\n if (isJsonMode()) {\n outputJson(buildPayload(results));\n exitForResults(results);\n return;\n }\n\n printResults(results);\n exitForResults(results);\n });\n\nfunction summarize(results: DiagnosticResult[]): DoctorSummary {\n return {\n ok: results.filter((r) => r.status === \"ok\").length,\n warnings: results.filter((r) => r.status === \"warn\").length,\n errors: results.filter((r) => r.status === \"error\").length,\n };\n}\n\nfunction buildPayload(results: DiagnosticResult[]): { summary: DoctorSummary; results: DiagnosticResult[] } {\n return { summary: summarize(results), results };\n}\n\nfunction exitForResults(results: DiagnosticResult[]): void {\n if (results.some((r) => r.status === \"error\")) {\n process.exit(EXIT_ERROR);\n }\n}\n\nfunction findDeprecatedConfigKeys(configPath: string): string[] {\n try {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n const parsed = (YAML.parse(raw) ?? {}) as Record<string, unknown>;\n const deprecated: string[] = [];\n if ((parsed.remote as Record<string, unknown> | undefined)?.apiKey) {\n deprecated.push(\"remote.apiKey\");\n }\n if (parsed.openaiApiKey) {\n deprecated.push(\"openaiApiKey\");\n }\n return deprecated;\n } catch {\n return [];\n }\n}\n\nfunction printResults(results: DiagnosticResult[]): void {\n const icons = { ok: \"[ok]\", warn: \"[!!]\", error: \"[ERR]\" };\n\n logger.info(\"Unforgit Doctor\\n\");\n\n for (const r of results) {\n const icon = icons[r.status];\n logger.info(` ${icon} ${r.check}: ${r.message}`);\n if (r.fix) {\n logger.info(` fix: ${r.fix}`);\n }\n }\n\n const { errors, warnings } = summarize(results);\n\n logger.info(\"\");\n if (errors > 0) {\n logger.info(`${errors} error(s), ${warnings} warning(s)`);\n } else if (warnings > 0) {\n logger.info(`No errors, ${warnings} warning(s)`);\n } else {\n logger.info(\"All checks passed!\");\n }\n}\n","import { Command } from \"commander\";\nimport { logger } from \"../logger.js\";\n\nconst BASH_COMPLETION = `\n_unforgit_completions() {\n local cur prev commands\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n commands=\"init add recall promote consolidate deprecate supersede delete restore web link unlink links merge remerge similar history auto-consolidate unconsolidate status push pull remote log diff keys auth config embeddings reset doctor curate completion\"\n\n case \"\\${prev}\" in\n unforgit)\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n return 0\n ;;\n remote)\n COMPREPLY=( $(compgen -W \"add remove set-url show\" -- \"\\${cur}\") )\n return 0\n ;;\n keys)\n COMPREPLY=( $(compgen -W \"create list revoke\" -- \"\\${cur}\") )\n return 0\n ;;\n auth)\n COMPREPLY=( $(compgen -W \"set status remove openai openai-remove\" -- \"\\${cur}\") )\n return 0\n ;;\n config)\n COMPREPLY=( $(compgen -W \"list get set unset\" -- \"\\${cur}\") )\n return 0\n ;;\n embeddings)\n COMPREPLY=( $(compgen -W \"backfill stats clear\" -- \"\\${cur}\") )\n return 0\n ;;\n --type)\n COMPREPLY=( $(compgen -W \"episodic semantic procedural\" -- \"\\${cur}\") )\n return 0\n ;;\n esac\n\n if [[ \"\\${cur}\" == -* ]]; then\n COMPREPLY=( $(compgen -W \"--verbose --quiet --json --help --version\" -- \"\\${cur}\") )\n return 0\n fi\n}\ncomplete -F _unforgit_completions unforgit\n`.trim();\n\nconst ZSH_COMPLETION = `\n#compdef unforgit\n\n_unforgit() {\n local -a commands\n commands=(\n 'init:Initialize Unforgit in the current repository'\n 'add:Add a memory'\n 'recall:Recall memories matching a query'\n 'promote:Promote a local memory to remote'\n 'consolidate:Consolidate episodic memories'\n 'deprecate:Mark a memory as deprecated'\n 'supersede:Mark a memory as superseded'\n 'delete:Soft delete a memory'\n 'restore:Restore a soft-deleted memory'\n 'web:Start the web dashboard'\n 'link:Create a link between memories'\n 'unlink:Remove a link between memories'\n 'links:List links for a memory'\n 'merge:Consolidate multiple local memories'\n 'remerge:Update an existing consolidation'\n 'similar:Find similar memories'\n 'history:Show consolidation history'\n 'auto-consolidate:AI-powered consolidation'\n 'unconsolidate:Revert a consolidation'\n 'status:Show sync status'\n 'push:Push local memories to remote'\n 'pull:Pull remote memories to local'\n 'remote:Manage remotes'\n 'log:Show memory history log'\n 'diff:Show differences between local and remote'\n 'keys:Manage API keys'\n 'auth:Configure authentication'\n 'config:Manage configuration'\n 'embeddings:Manage embeddings'\n 'reset:Delete all memories'\n 'doctor:Check system health'\n 'curate:Preview or run lifecycle maintenance'\n 'completion:Generate shell completions'\n )\n\n _arguments -C \\\\\n '--verbose[Enable verbose output]' \\\\\n '--quiet[Suppress non-essential output]' \\\\\n '--json[Output as JSON]' \\\\\n '--help[Show help]' \\\\\n '--version[Show version]' \\\\\n '1: :->cmd' \\\\\n '*::arg:->args'\n\n case \"$state\" in\n cmd)\n _describe 'command' commands\n ;;\n esac\n}\n\n_unforgit \"$@\"\n`.trim();\n\nconst FISH_COMPLETION = `\ncomplete -c unforgit -f\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'init' -d 'Initialize Unforgit'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'add' -d 'Add a memory'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'recall' -d 'Recall memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'promote' -d 'Promote to remote'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'consolidate' -d 'Consolidate memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'deprecate' -d 'Deprecate a memory'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'supersede' -d 'Supersede a memory'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'delete' -d 'Delete a memory'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'restore' -d 'Restore a memory'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'web' -d 'Start web dashboard'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'link' -d 'Link two memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'unlink' -d 'Unlink memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'links' -d 'List links'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'merge' -d 'Merge memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'remerge' -d 'Update consolidation'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'similar' -d 'Find similar memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'history' -d 'Consolidation history'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'auto-consolidate' -d 'AI consolidation'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'unconsolidate' -d 'Revert consolidation'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'status' -d 'Show sync status'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'push' -d 'Push to remote'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'pull' -d 'Pull from remote'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'remote' -d 'Manage remotes'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'log' -d 'Memory log'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'diff' -d 'Show differences'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'keys' -d 'Manage API keys'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'auth' -d 'Configure auth'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'config' -d 'Manage config'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'embeddings' -d 'Manage embeddings'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'reset' -d 'Delete all memories'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'doctor' -d 'Check system health'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'curate' -d 'Preview or run lifecycle maintenance'\ncomplete -c unforgit -n '__fish_use_subcommand' -a 'completion' -d 'Generate completions'\ncomplete -c unforgit -l verbose -d 'Enable verbose output'\ncomplete -c unforgit -l quiet -d 'Suppress non-essential output'\ncomplete -c unforgit -l json -d 'Output as JSON'\n`.trim();\n\nexport const completionCommand = new Command(\"completion\")\n .description(\"Generate shell completion scripts\")\n .argument(\"<shell>\", \"Shell type (bash, zsh, fish)\")\n .addHelpText(\"after\", `\nExamples:\n unforgit completion bash >> ~/.bashrc\n unforgit completion zsh >> ~/.zshrc\n unforgit completion fish > ~/.config/fish/completions/unforgit.fish`)\n .action((shell: string) => {\n switch (shell.toLowerCase()) {\n case \"bash\":\n console.log(BASH_COMPLETION);\n break;\n case \"zsh\":\n console.log(ZSH_COMPLETION);\n break;\n case \"fish\":\n console.log(FISH_COMPLETION);\n break;\n default:\n logger.error(`Unsupported shell: ${shell}. Use bash, zsh, or fish.`);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { getDbPath, isInitialized, loadConfig } from \"unforgit-config\";\nimport { LocalStore } from \"unforgit-db\";\nimport { RemoteClient } from \"unforgit-config\";\nimport { runLocalLifecycleMaintenance } from \"unforgit-core\";\nimport { logger } from \"../logger.js\";\nimport { EXIT_CONFIG_ERROR, EXIT_ERROR } from \"../exit-codes.js\";\nimport { isJsonMode, outputJson } from \"../utils.js\";\n\nfunction formatCandidatePreview(candidate: {\n reason: string;\n suggestedTags: string[];\n memories: Array<{ id: string; memoryType: string; text: string }>;\n}): string {\n const lines = [\n `Group: ${candidate.reason}`,\n `Tags: ${candidate.suggestedTags.join(\", \") || \"none\"}`,\n \"Memories:\",\n ];\n\n for (const memory of candidate.memories) {\n const text = memory.text.length > 80 ? `${memory.text.slice(0, 80)}...` : memory.text;\n lines.push(` - [${memory.memoryType}] ${memory.id.slice(0, 8)}: ${text}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport const curateCommand = new Command(\"curate\")\n .description(\"Preview or run lifecycle maintenance for repository memories\")\n .option(\"--remote\", \"Run maintenance against the remote server\")\n .option(\"--execute\", \"Apply changes instead of previewing them\")\n .option(\"--model <model>\", \"OpenAI model to use for consolidation\")\n .option(\"--no-preserve\", \"Do not preserve original memories during consolidation\")\n .addHelpText(\"after\", `\nExamples:\n unforgit curate\n unforgit curate --execute\n unforgit curate --remote --execute --model gpt-5.4`)\n .action(async (opts) => {\n if (!isInitialized()) {\n logger.error(\"Unforgit not initialized. Run 'unforgit init' first.\");\n process.exit(EXIT_CONFIG_ERROR);\n }\n\n const config = loadConfig();\n const orgId = config.remote.orgId || \"local\";\n const repoId = config.remote.repoId || \"local\";\n const dryRun = opts.execute ? false : undefined;\n\n try {\n const result = opts.remote\n ? await runRemoteCurate(config.remote.url, {\n orgId,\n repoId,\n dryRun,\n model: opts.model,\n preserveOriginals: opts.preserve !== false,\n })\n : await runLocalCurate(getDbPath(), orgId, repoId, {\n dryRun,\n model: opts.model,\n preserveOriginals: opts.preserve !== false,\n lifecycle: config.lifecycle,\n });\n\n if (isJsonMode()) {\n outputJson(result);\n return;\n }\n\n logger.info(result.dryRun ? \"Lifecycle maintenance preview\\n\" : \"Lifecycle maintenance execution\\n\");\n logger.info(`Active memories scanned: ${result.totalActiveMemories}`);\n logger.info(`Expiring episodic memories: ${result.expiredCandidates.length}`);\n logger.info(`Strengthened candidates: ${result.strengthenedCandidates.length}`);\n logger.info(`Consolidation candidates: ${result.consolidationCandidates.length}`);\n\n if (result.expiredCandidates.length > 0) {\n logger.info(\"\\nExpired candidates:\");\n for (const candidate of result.expiredCandidates.slice(0, 10)) {\n logger.info(` ${candidate.id.slice(0, 8)} (${candidate.ttlSeconds}s): ${candidate.textPreview}`);\n }\n }\n\n if (result.strengthenedCandidates.length > 0) {\n logger.info(\"\\nStrengthened candidates:\");\n for (const candidate of result.strengthenedCandidates.slice(0, 10)) {\n logger.info(\n ` ${candidate.id.slice(0, 8)} [${candidate.recommendedAction}] (${candidate.usageCount} recalls): ${candidate.textPreview}`,\n );\n }\n }\n\n if (result.consolidationCandidates.length > 0) {\n logger.info(\"\\nConsolidation candidates:\");\n for (const candidate of result.consolidationCandidates.slice(0, 5)) {\n logger.info(formatCandidatePreview(candidate));\n logger.info(\"\");\n }\n }\n\n if (!result.dryRun && result.executedConsolidations.length > 0) {\n logger.info(\"Executed consolidations:\");\n for (const executed of result.executedConsolidations) {\n logger.info(\n ` ${executed.consolidatedId.slice(0, 8)} from ${executed.sourceIds.length} memories`,\n );\n }\n }\n\n for (const warning of result.warnings) {\n logger.warn(warning);\n }\n\n for (const error of result.errors) {\n logger.error(error);\n }\n\n if (result.dryRun) {\n logger.info(\"\\nDry run complete. Re-run with --execute to apply expiry and consolidation.\");\n }\n } catch (error) {\n logger.error(\n `Curate: ${error instanceof Error ? error.message : error}`,\n );\n process.exit(EXIT_ERROR);\n }\n });\n\nasync function runLocalCurate(\n dbPath: string,\n orgId: string,\n repoId: string,\n options: Parameters<typeof runLocalLifecycleMaintenance>[3],\n) {\n const store = new LocalStore(dbPath);\n try {\n return await runLocalLifecycleMaintenance(store, orgId, repoId, options);\n } finally {\n store.close();\n }\n}\n\nasync function runRemoteCurate(\n remoteUrl: string,\n options: {\n orgId: string;\n repoId: string;\n dryRun?: boolean;\n model?: string;\n preserveOriginals?: boolean;\n },\n) {\n if (!remoteUrl) {\n throw new Error(\"Remote URL not configured. Update unforgit.yaml or omit --remote.\");\n }\n\n const client = new RemoteClient(remoteUrl);\n return client.runLifecycle(options);\n}\n"],"mappings":"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","names":["Command","fs","cwd","cwd","fs","Command","getDbPath","LocalStore","Command","getDbPath","Command","loadConfig","getDbPath","LocalStore","Command","loadConfig","LocalStore","getDbPath","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","LocalStore","getDbPath","RemoteClient","Command","loadConfig","RemoteClient","parsePositiveInt","Command","loadConfig","RemoteClient","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","RemoteClient","LocalStore","getDbPath","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","RemoteClient","LocalStore","getDbPath","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","RemoteClient","LocalStore","getDbPath","Command","path","fs","isInitialized","Command","cwd","isInitialized","path","fs","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","RemoteClient","LocalStore","getDbPath","Command","LocalStore","loadConfig","getDbPath","isInitialized","parsePositiveInt","validateMemoryType","Command","isInitialized","validateMemoryType","loadConfig","LocalStore","getDbPath","parsePositiveInt","Command","LocalStore","loadConfig","getDbPath","isInitialized","readline","parseThreshold","parsePositiveInt","validateMemoryType","cwd","Command","isInitialized","loadConfig","LocalStore","getDbPath","Command","getDbPath","isInitialized","LocalStore","Command","cwd","isInitialized","getDbPath","LocalStore","Command","loadConfig","getDbPath","isInitialized","LocalStore","Command","isInitialized","loadConfig","LocalStore","getDbPath","Command","loadConfig","getDbPath","isInitialized","LocalStore","RemoteClient","Command","isInitialized","loadConfig","LocalStore","getDbPath","RemoteClient","Command","loadConfig","getDbPath","isInitialized","LocalStore","RemoteClient","Command","isInitialized","loadConfig","LocalStore","getDbPath","RemoteClient","Command","isInitialized","loadConfig","saveConfig","Command","isInitialized","loadConfig","saveConfig","Command","loadConfig","getDbPath","isInitialized","LocalStore","parsePositiveInt","validateMemoryType","Command","isInitialized","loadConfig","LocalStore","getDbPath","parsePositiveInt","validateMemoryType","Command","loadConfig","getDbPath","isInitialized","LocalStore","RemoteClient","Command","isInitialized","loadConfig","LocalStore","getDbPath","RemoteClient","Command","loadConfig","isInitialized","RemoteClient","isInitialized","loadConfig","Command","RemoteClient","Command","loadConfig","isInitialized","Command","isInitialized","loadConfig","Command","isInitialized","loadConfig","saveConfig","Command","isInitialized","loadConfig","saveConfig","Command","LocalStore","loadConfig","getDbPath","isInitialized","parsePositiveInt","cwd","Command","isInitialized","loadConfig","getDbPath","LocalStore","parsePositiveInt","Command","loadConfig","getDbPath","LocalStore","RemoteClient","fs","path","Command","getDbPath","path","fs","Command","getDbPath","Command","loadConfig","getDbPath","LocalStore","RemoteClient","Command","loadConfig","getDbPath","isInitialized","getConfigPath","LocalStore","RemoteClient","fs","Command","isInitialized","getConfigPath","loadConfig","LocalStore","getDbPath","RemoteClient","Command","Command","Command","getDbPath","isInitialized","loadConfig","LocalStore","RemoteClient","formatCandidatePreview","Command","isInitialized","loadConfig","getDbPath","LocalStore","RemoteClient","require","Command"]}