@hiveai/cli 0.5.0 → 0.7.0
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/Dashboard-Y2AIWFZK.js +0 -0
- package/dist/index.js +1862 -333
- package/dist/index.js.map +1 -1
- package/package.json +13 -13
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/briefing.ts","../src/utils/ui.ts","../src/commands/tui.ts","../src/commands/embeddings.ts","../src/commands/index-code.ts","../src/commands/init.ts","../src/commands/install-hooks.ts","../src/commands/mcp.ts","../src/commands/sync.ts","../src/commands/memory-add.ts","../src/commands/memory-list.ts","../src/utils/fs.ts","../src/commands/memory-promote.ts","../src/commands/memory-approve.ts","../src/commands/memory-update.ts","../src/commands/memory-auto-promote.ts","../src/commands/memory-edit.ts","../src/commands/memory-for-files.ts","../src/commands/memory-hot.ts","../src/commands/memory-tried.ts","../src/commands/memory-pending.ts","../src/commands/memory-query.ts","../src/commands/memory-reject.ts","../src/commands/memory-rm.ts","../src/commands/memory-show.ts","../src/commands/memory-stats.ts","../src/commands/memory-verify.ts","../src/commands/memory-import.ts","../src/commands/memory-import-changelog.ts","../src/commands/memory-digest.ts","../src/commands/session-end.ts","../src/commands/snapshot.ts","../src/commands/hub.ts","../src/commands/stats.ts","../src/commands/bench.ts","../src/commands/memory-suggest.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { registerBriefing } from \"./commands/briefing.js\";\nimport { registerTui } from \"./commands/tui.js\";\nimport { registerEmbeddings } from \"./commands/embeddings.js\";\nimport { registerIndexCode } from \"./commands/index-code.js\";\nimport { registerInit } from \"./commands/init.js\";\nimport { registerInstallHooks } from \"./commands/install-hooks.js\";\nimport { registerMcp } from \"./commands/mcp.js\";\nimport { registerSync } from \"./commands/sync.js\";\nimport { registerMemoryAdd } from \"./commands/memory-add.js\";\nimport { registerMemoryList } from \"./commands/memory-list.js\";\nimport { registerMemoryPromote } from \"./commands/memory-promote.js\";\nimport { registerMemoryApprove } from \"./commands/memory-approve.js\";\nimport { registerMemoryUpdate } from \"./commands/memory-update.js\";\nimport { registerMemoryAutoPromote } from \"./commands/memory-auto-promote.js\";\nimport { registerMemoryEdit } from \"./commands/memory-edit.js\";\nimport { registerMemoryForFiles } from \"./commands/memory-for-files.js\";\nimport { registerMemoryHot } from \"./commands/memory-hot.js\";\nimport { registerMemoryTried } from \"./commands/memory-tried.js\";\nimport { registerMemoryPending } from \"./commands/memory-pending.js\";\nimport { registerMemoryQuery } from \"./commands/memory-query.js\";\nimport { registerMemoryReject } from \"./commands/memory-reject.js\";\nimport { registerMemoryRm } from \"./commands/memory-rm.js\";\nimport { registerMemoryShow } from \"./commands/memory-show.js\";\nimport { registerMemoryStats } from \"./commands/memory-stats.js\";\nimport { registerMemoryVerify } from \"./commands/memory-verify.js\";\nimport { registerMemoryImport } from \"./commands/memory-import.js\";\nimport { registerMemoryImportChangelog } from \"./commands/memory-import-changelog.js\";\nimport { registerMemoryDigest } from \"./commands/memory-digest.js\";\nimport { registerSessionEnd } from \"./commands/session-end.js\";\nimport { registerSnapshot } from \"./commands/snapshot.js\";\nimport { registerHub } from \"./commands/hub.js\";\nimport { registerStats } from \"./commands/stats.js\";\nimport { registerBench } from \"./commands/bench.js\";\nimport { registerMemorySuggest } from \"./commands/memory-suggest.js\";\n\nconst program = new Command();\n\ndeclare const __HAIVE_VERSION__: string;\n\nprogram\n .name(\"haive\")\n .description(\"hAIve — team-first persistent memory layer for AI coding agents\")\n .version(__HAIVE_VERSION__);\n\nregisterInit(program);\nregisterMcp(program);\nregisterBriefing(program);\nregisterTui(program);\nregisterEmbeddings(program);\nregisterSync(program);\nregisterInstallHooks(program);\nregisterIndexCode(program);\n\nconst memory = program.command(\"memory\").description(\"Manage memory entries\");\nregisterMemoryAdd(memory);\nregisterMemoryList(memory);\nregisterMemoryQuery(memory);\nregisterMemoryPromote(memory);\nregisterMemoryVerify(memory);\nregisterMemoryStats(memory);\nregisterMemoryReject(memory);\nregisterMemoryAutoPromote(memory);\nregisterMemoryForFiles(memory);\nregisterMemoryShow(memory);\nregisterMemoryEdit(memory);\nregisterMemoryRm(memory);\nregisterMemoryPending(memory);\nregisterMemoryApprove(memory);\nregisterMemoryUpdate(memory);\nregisterMemoryHot(memory);\nregisterMemoryTried(memory);\nregisterMemoryImport(memory);\nregisterMemoryImportChangelog(memory);\nregisterMemoryDigest(memory);\nregisterMemorySuggest(memory);\n\nconst session = program.command(\"session\").description(\"Manage session lifecycle\");\nregisterSessionEnd(session);\n\nregisterSnapshot(program);\nregisterHub(program);\nregisterStats(program);\nregisterBench(program);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n if (isZodError(err)) {\n for (const issue of err.issues) {\n const field = issue.path.length > 0 ? `${String(issue.path.join(\".\"))}: ` : \"\";\n console.error(`\\x1b[31m✗\\x1b[0m ${field}${issue.message}`);\n }\n } else {\n console.error(err instanceof Error ? err.message : err);\n }\n process.exit(1);\n});\n\nfunction isZodError(\n err: unknown,\n): err is { issues: Array<{ path: unknown[]; message: string }> } {\n return (\n err !== null &&\n typeof err === \"object\" &&\n \"issues\" in err &&\n Array.isArray((err as Record<string, unknown>).issues)\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadCodeMap,\n loadMemoriesFromDir,\n memoryMatchesAnchorPaths,\n queryCodeMap,\n resolveHaivePaths,\n tokenizeQuery,\n trackReads,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface BriefingOptions {\n task?: string;\n files?: string;\n symbols?: string;\n maxMemories?: string;\n scope?: string;\n includeDraft?: boolean;\n includeStale?: boolean;\n dir?: string;\n}\n\nexport function registerBriefing(program: Command): void {\n program\n .command(\"briefing\")\n .description(\n \"Print the full project briefing: last session recap + project context + relevant memories.\\n\" +\n \" Equivalent to calling get_briefing via MCP. Run before starting any task.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive briefing\\n\" +\n \" haive briefing --task \\\"add Stripe payment\\\" --files src/payments/PaymentService.ts\\n\" +\n \" haive briefing --symbols PaymentService,TenantFilter # look up where symbols live\\n\",\n )\n .option(\"--task <text>\", \"what you are about to do — filters memories by relevance\")\n .option(\"--files <csv>\", \"comma-separated file paths being worked on (surfaces anchored memories)\")\n .option(\"--symbols <csv>\", \"symbol names to look up in the code-map (e.g. PaymentService,TenantFilter) — requires haive index code\")\n .option(\"--max-memories <n>\", \"cap on memories surfaced\", \"10\")\n .option(\n \"--scope <scope>\",\n \"personal | team | shared | all (default: all — includes team + shared cross-repo memories)\",\n \"all\",\n )\n .option(\"--include-draft\", \"include draft memories (excluded by default)\")\n .option(\"--include-stale\", \"include stale memories (excluded by default — may be outdated)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: BriefingOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.memoriesDir)) {\n // No memories yet — just print project context and exit\n if (existsSync(paths.projectContext)) {\n console.log(`${ui.bold(\"=== Project Context ===\")}\\n`);\n console.log((await readFile(paths.projectContext, \"utf8\")).trim());\n } else {\n ui.warn(\"No project-context.md found. Run `haive init` and the `bootstrap_project` MCP prompt to set it up.\");\n }\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const filePaths = parseCsv(opts.files);\n const tokens = opts.task ? tokenizeQuery(opts.task) : null;\n const maxMemories = Math.max(1, Number(opts.maxMemories ?? 10));\n const scopeFilter = opts.scope ?? \"all\";\n\n // ── 1. Session recap — always shown first so agents start with fresh context ──\n const recaps = all\n .filter(({ memory: mem }) => mem.frontmatter.type === \"session_recap\")\n .sort((a, b) =>\n new Date(b.memory.frontmatter.created_at).getTime() -\n new Date(a.memory.frontmatter.created_at).getTime(),\n );\n if (recaps.length > 0) {\n const recap = recaps[0]!;\n const fm = recap.memory.frontmatter;\n const rev = fm.revision_count ? ` · revision #${fm.revision_count}` : \"\";\n console.log(`${ui.bold(\"=== Last Session Recap ===\")}\\n`);\n console.log(ui.dim(`${fm.id} (${fm.scope}${rev})`));\n console.log(recap.memory.body.trim());\n console.log();\n }\n\n // ── 2. Project context ─────────────────────────────────────────────────────\n if (existsSync(paths.projectContext)) {\n const ctx = await readFile(paths.projectContext, \"utf8\");\n const isTemplate = ctx.includes(\"TODO — high-level overview\") || ctx.includes(\"Generated by `haive init`\");\n if (isTemplate) {\n ui.warn(\n \"project-context.md still contains the default template — get_briefing will return little value.\",\n );\n ui.warn(\n \"Fix: in your AI client, invoke the MCP prompt bootstrap_project to auto-fill it from your codebase.\",\n );\n console.log();\n } else {\n console.log(`${ui.bold(\"=== Project Context ===\")}\\n`);\n console.log(ctx.trim());\n console.log();\n }\n } else {\n ui.warn(\n \"No project-context.md found. Run `haive init` then invoke the bootstrap_project MCP prompt.\",\n );\n }\n\n // Filter: exclude noise, drafts, stale, and session_recap (shown above) by default\n const candidates = all.filter(({ memory: mem }) => {\n const fm = mem.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") return false;\n if (!opts.includeDraft && fm.status === \"draft\") return false;\n if (!opts.includeStale && fm.status === \"stale\") return false;\n if (scopeFilter !== \"all\" && fm.scope !== scopeFilter && !(scopeFilter === \"team\" && fm.scope === \"shared\")) return false;\n if (fm.type === \"session_recap\") return false; // shown separately above\n return true;\n });\n\n // Score by relevance (AND on task tokens; OR fallback if AND produces no task hits)\n const andTaskHits = tokens\n ? new Set(candidates.filter(({ memory: mem }) => literalMatchesAllTokens(mem, tokens)).map(({ memory: mem }) => mem.frontmatter.id))\n : null;\n const useOrFallback = andTaskHits !== null && andTaskHits.size === 0 && (tokens?.length ?? 0) > 1;\n\n const scored = candidates.map(({ memory: mem, filePath }) => {\n const fm = mem.frontmatter;\n let score = 0;\n if (fm.status === \"validated\") score += 3;\n else if (fm.status === \"proposed\") score += 1;\n if (filePaths.length > 0 && memoryMatchesAnchorPaths(mem, filePaths)) score += 4;\n if (tokens) {\n if (andTaskHits?.has(fm.id)) score += 3;\n else if (useOrFallback && literalMatchesAnyToken(mem, tokens)) score += 1;\n }\n return { memory: mem, filePath, score };\n });\n\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, maxMemories);\n\n if (top.length === 0) {\n ui.info(\"No relevant memories found.\");\n const draftCount = all.filter(\n (m) =>\n m.memory.frontmatter.status === \"draft\" &&\n (scopeFilter === \"all\" || m.memory.frontmatter.scope === scopeFilter),\n ).length;\n if (draftCount > 0) {\n ui.info(`(${draftCount} draft memories excluded — use --include-draft to show)`);\n }\n return;\n }\n\n console.log(`${ui.bold(\"=== Relevant Memories ===\")}\\n`);\n for (const { memory: mem } of top) {\n const fm = mem.frontmatter;\n const badge = ui.statusBadge(fm.status);\n const draftMarker = fm.status === \"draft\" ? ui.yellow(\" [DRAFT]\") : \"\";\n const unverifiedMarker = fm.status === \"proposed\" ? ui.yellow(\" [UNVERIFIED]\") : \"\";\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(fm.scope + \"/\" + fm.type)} ${badge}${draftMarker}${unverifiedMarker}`,\n );\n console.log(mem.body.trim());\n console.log();\n }\n console.log(ui.dim(`${top.length} memor${top.length === 1 ? \"y\" : \"ies\"} surfaced`));\n\n // Track reads so usage stats, decay, and hot-memory detection work via CLI too\n const ids = top.map(({ memory: mem }) => mem.frontmatter.id);\n if (ids.length > 0) {\n await trackReads(paths, ids).catch(() => { /* non-fatal */ });\n }\n\n // ── Code-map symbol lookup ──────────────────────────────────────────\n const requestedSymbols = (opts.symbols ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n if (requestedSymbols.length > 0) {\n const codeMap = await loadCodeMap(paths);\n if (!codeMap) {\n ui.warn(\"No code-map found. Run `haive index code` first to enable symbol lookup.\");\n } else {\n console.log(`\\n${ui.bold(\"=== Symbol Locations ===\")}\\n`);\n for (const sym of requestedSymbols) {\n const { files } = queryCodeMap(codeMap, { symbol: sym });\n if (files.length === 0) {\n console.log(`${ui.dim(sym)} (not found in code-map)`);\n } else {\n for (const f of files) {\n const exports = f.entry.exports.filter((e) =>\n e.name.toLowerCase().includes(sym.toLowerCase()),\n );\n for (const e of exports) {\n const desc = e.description ? ` — ${e.description}` : \"\";\n console.log(`${ui.bold(e.name)} ${ui.dim(f.path + \":\" + e.line)} [${e.kind}]${desc}`);\n }\n }\n }\n }\n console.log();\n }\n }\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n","import pc from \"picocolors\";\n\nexport const ui = {\n info: (msg: string) => console.log(pc.cyan(\"ℹ\"), msg),\n success: (msg: string) => console.log(pc.green(\"✓\"), msg),\n warn: (msg: string) => console.log(pc.yellow(\"⚠\"), msg),\n error: (msg: string) => console.error(pc.red(\"✗\"), msg),\n dim: (msg: string) => pc.dim(msg),\n bold: (msg: string) => pc.bold(msg),\n green: (msg: string) => pc.green(msg),\n yellow: (msg: string) => pc.yellow(msg),\n red: (msg: string) => pc.red(msg),\n statusBadge: (status: string): string => {\n switch (status) {\n case \"validated\": return pc.green(status);\n case \"proposed\": return pc.yellow(status);\n case \"stale\": return pc.yellow(status);\n case \"rejected\": return pc.red(status);\n case \"deprecated\": return pc.dim(status);\n default: return pc.dim(status); // draft\n }\n },\n};\n","import { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\n\nexport function registerTui(program: Command): void {\n program\n .command(\"tui\")\n .description(\n \"Interactive terminal dashboard for browsing and managing memories.\\n\\n\" +\n \" Screens (switch with 1 / 2 / 3):\\n\" +\n \" 1 — Memories: list + preview, filter by status (Tab), actions (a/r/p/d)\\n\" +\n \" 2 — Health: stale, pending review, anchorless memories\\n\" +\n \" 3 — Stats: most-read, decaying, total counts\\n\\n\" +\n \" Key bindings:\\n\" +\n \" ↑ ↓ navigate list\\n\" +\n \" Tab cycle status filter (all → proposed → validated → stale)\\n\" +\n \" a approve selected memory\\n\" +\n \" r reject selected memory\\n\" +\n \" p promote personal → team (proposed)\\n\" +\n \" d delete selected memory\\n\" +\n \" q / Esc exit\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: { dir?: string }) => {\n if (!process.stdout.isTTY) {\n console.error(\"haive tui requires an interactive terminal (TTY).\");\n process.exitCode = 1;\n return;\n }\n const root = findProjectRoot(opts.dir);\n const { render } = await import(\"ink\");\n const { createElement } = await import(\"react\");\n const { Dashboard } = await import(\"../tui/Dashboard.js\");\n const { waitUntilExit } = render(createElement(Dashboard, { root }));\n await waitUntilExit();\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { findProjectRoot, resolveHaivePaths } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface EmbeddingsOptions {\n dir?: string;\n}\n\ninterface EmbeddingsQueryOptions extends EmbeddingsOptions {\n limit?: string;\n minScore?: string;\n}\n\nexport function registerEmbeddings(program: Command): void {\n const embeddings = program\n .command(\"embeddings\")\n .description(\"Manage local embeddings index for semantic search\");\n\n embeddings\n .command(\"index\")\n .description(\"Generate or refresh the embeddings index for all memories\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: EmbeddingsOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n const { Embedder, rebuildIndex } = await loadEmbeddings();\n ui.info(\"Loading embedding model (first run downloads ~110MB)…\");\n const embedder = await Embedder.create();\n ui.info(`Model ready: ${embedder.model} (dim=${embedder.dimension}). Indexing memories…`);\n const { report } = await rebuildIndex(paths, embedder);\n ui.success(\n `Indexed ${report.total} memories — added=${report.added} updated=${report.updated} unchanged=${report.unchanged} removed=${report.removed}`,\n );\n });\n\n embeddings\n .command(\"query <text>\")\n .description(\"Run a semantic search against the local embeddings index\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--limit <n>\", \"max results\", \"10\")\n .option(\"--min-score <n>\", \"minimum cosine similarity (0-1)\", \"0\")\n .action(async (text: string, opts: EmbeddingsQueryOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const { semanticSearch } = await loadEmbeddings();\n const result = await semanticSearch(paths, text, {\n limit: Number(opts.limit ?? 10),\n minScore: Number(opts.minScore ?? 0),\n });\n if (!result) {\n ui.error(\"No embeddings index found. Run `haive embeddings index` first.\");\n process.exitCode = 1;\n return;\n }\n if (result.hits.length === 0) {\n ui.info(\"No semantic matches above the threshold.\");\n return;\n }\n for (const hit of result.hits) {\n const score = hit.score.toFixed(3);\n console.log(`${ui.bold(score)} ${hit.id}`);\n console.log(` ${ui.dim(path.relative(root, hit.file_path))}`);\n }\n });\n\n embeddings\n .command(\"status\")\n .description(\"Show the embeddings index status\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: EmbeddingsOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const { indexStat } = await loadEmbeddings();\n const stat = await indexStat(paths);\n if (!stat.exists) {\n ui.warn(\"No embeddings index. Run `haive embeddings index` to create one.\");\n return;\n }\n console.log(`${ui.bold(\"entries:\")} ${stat.count}`);\n console.log(`${ui.bold(\"model:\")} ${stat.model}`);\n console.log(`${ui.bold(\"updated_at:\")} ${stat.updatedAt}`);\n console.log(`${ui.bold(\"size:\")} ${(stat.sizeBytes / 1024).toFixed(1)} KB`);\n });\n}\n\nasync function loadEmbeddings() {\n try {\n return await import(\"@hiveai/embeddings\");\n } catch {\n ui.error(\n \"Could not load @hiveai/embeddings. Run: npm install -g @hiveai/embeddings (or `pnpm build` in the monorepo)\",\n );\n process.exit(1);\n }\n}\n","import path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildCodeMap,\n codeMapPath,\n findProjectRoot,\n resolveHaivePaths,\n saveCodeMap,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface IndexCodeOptions {\n dir?: string;\n exclude?: string;\n}\n\nexport function registerIndexCode(program: Command): void {\n const idx = program\n .command(\"index\")\n .description(\n \"Build local indexes that let AIs look up symbols instead of grepping.\\n\\n\" +\n \" Run once after init, then haive sync refreshes it automatically when source changes.\",\n );\n idx.action(() => idx.help());\n idx\n .command(\"code\")\n .description(\n \"Scan source files and write .ai/code-map.json (file → exports + 1-line description).\\n\\n\" +\n \" Supported languages: TypeScript, JavaScript, Java, Python, Go, Rust, C#, PHP.\\n\" +\n \" The map is used by:\\n\" +\n \" • get_briefing (symbol_locations) — look up where a class/function lives\\n\" +\n \" • code_map MCP tool — browse exports without grepping\\n\" +\n \" • haive briefing --symbols — look up symbols from the CLI\\n\\n\" +\n \" Run automatically by haive init (autopilot mode) and haive sync (if source changed).\\n\\n\" +\n \" Example:\\n\" +\n \" haive index code\\n\" +\n \" haive index code --exclude generated,proto\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\n \"--exclude <csv>\",\n \"extra directory names to skip (comma-separated)\",\n \"\",\n )\n .action(async (opts: IndexCodeOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const extraExcludes = (opts.exclude ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n ui.info(`Indexing source files in ${root}…`);\n const map = await buildCodeMap(root, {\n excludeDirs: [\n \"node_modules\",\n \"dist\",\n \"build\",\n \"out\",\n \".git\",\n \".next\",\n \".turbo\",\n \".vitest-cache\",\n \"coverage\",\n ...extraExcludes,\n ],\n });\n\n await saveCodeMap(paths, map);\n const fileCount = Object.keys(map.files).length;\n const exportCount = Object.values(map.files).reduce((s, f) => s + f.exports.length, 0);\n ui.success(\n `Indexed ${fileCount} file(s) with ${exportCount} export(s) → ${path.relative(root, codeMapPath(paths))}`,\n );\n });\n\n idx\n .command(\"code-search\")\n .description(\n \"Build the semantic-search embeddings index for code (powers the code_search MCP tool).\\n\\n\" +\n \" Reads .ai/code-map.json (run `haive index code` first) and embeds each exported\\n\" +\n \" symbol's metadata (filename + name + kind + description).\\n\\n\" +\n \" Re-runs are incremental: unchanged entries keep their cached vectors, only the\\n\" +\n \" diff is re-embedded. First run downloads the bge-small-en-v1.5 model (~110MB).\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: IndexCodeOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n ui.error(\n \"@hiveai/embeddings is not installed. Install it (`pnpm add @hiveai/embeddings`) \" +\n \"or run `haive embeddings install`.\",\n );\n process.exit(1);\n }\n\n ui.info(\"Loading embedder (first run downloads ~110MB)…\");\n const embedder = await mod.Embedder.create();\n ui.info(`Embedding code-map symbols…`);\n try {\n const { report } = await mod.rebuildCodeIndex(paths, embedder);\n ui.success(\n `Code-search index ready: ${report.total} symbols ` +\n `(+${report.added} new, ~${report.updated} updated, =${report.unchanged} cached, -${report.removed} removed)`,\n );\n } catch (err) {\n ui.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { Command } from \"commander\";\nimport {\n AUTOPILOT_DEFAULTS,\n buildCodeMap,\n findProjectRoot,\n resolveHaivePaths,\n saveCodeMap,\n saveConfig,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nconst PROJECT_CONTEXT_TEMPLATE = `# Project context\n\n> Generated by \\`haive init\\`. Edit this file (or let your AI agent fill it via the upcoming MCP \\`bootstrap_project\\` tool).\n\n## Architecture\nTODO — high-level overview of the codebase.\n\n## Key modules\nTODO — list main modules and their purpose.\n\n## Conventions\nTODO — coding conventions, naming, patterns the team follows.\n\n## Glossary\nTODO — domain terms and what they mean here.\n\n## Gotchas\nTODO — known traps, surprising behavior, things newcomers stub their toes on.\n`;\n\nconst BRIDGE_BODY = `<!-- hAIve bridge file — do not edit by hand. -->\n<!-- This file points your AI tool at the shared hAIve project context. -->\n\nSee \\`.ai/project-context.md\\` for the full project context.\nMemories live under \\`.ai/memories/\\` (personal/team/module).\n\n## hAIve — mandatory rules for AI agents\n\n### Session rules\n- **Before** marking a task as done (\"Done\", \"Finished\", \"C'est fait\"), call the MCP prompt \\`post_task\\`.\n- **Immediately** when an approach fails (wrong API, wrong pattern, wrong assumption), call \\`mem_tried\\` — do not wait until the end of the session.\n- When starting a new task, call \\`get_briefing\\` with the task description to load relevant memories and avoid repeating past mistakes.\n\n### Safety rules — NEVER violate these\n- If \\`get_briefing\\` returns an \\`action_required\\` list, **stop and show each item to the developer** before doing anything. Use the exact \\`developer_message\\` provided. Wait for explicit confirmation.\n- **Never modify code autonomously** because of a breaking change detected in another project (dependency version bump, API contract change, removed field). Always ask first.\n- When in doubt about a cross-repo change: ask, don't act.\n`;\n\nconst CI_WORKFLOW = `name: haive-sync\n\non:\n push:\n branches: [main, master]\n pull_request:\n branches: [main, master]\n\njobs:\n # On push to main/master: sync anchors + auto-promote + commit changes\n sync-on-merge:\n if: github.event_name == 'push'\n runs-on: ubuntu-latest\n permissions:\n contents: write\n steps:\n - uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: install haive\n run: npm install -g @hiveai/cli\n\n - name: refresh memory anchors + auto-promote\n run: haive sync --since HEAD~1 || true\n\n - name: commit updated memories (if any)\n run: |\n git config user.name \"github-actions[bot]\"\n git config user.email \"github-actions[bot]@users.noreply.github.com\"\n git add .ai/\n git diff --cached --quiet || git commit -m \"chore: haive sync [skip ci]\"\n git push\n\n # On pull request: warn if PR touches files that would invalidate memories\n pr-stale-check:\n if: github.event_name == 'pull_request'\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n steps:\n - uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: install haive\n run: npm install -g @hiveai/cli\n\n - name: verify memory anchors touched by this PR\n id: verify\n run: |\n haive memory verify 2>&1 | tee /tmp/haive-verify.txt || true\n STALE=$(grep -c 'stale' /tmp/haive-verify.txt || echo 0)\n echo \"stale_count=$STALE\" >> \"$GITHUB_OUTPUT\"\n\n - name: comment on PR if stale memories detected\n if: steps.verify.outputs.stale_count != '0'\n uses: actions/github-script@v7\n with:\n script: |\n const fs = require('fs');\n const report = fs.readFileSync('/tmp/haive-verify.txt', 'utf8').trim();\n await github.rest.issues.createComment({\n owner: context.repo.owner,\n repo: context.repo.repo,\n issue_number: context.issue.number,\n body: \\`### haive — Stale memories detected\\\\n\\\\nSome memories anchored to code modified in this PR may be outdated:\\\\n\\\\n\\\\\\`\\\\\\`\\\\\\`\\\\n\\${report}\\\\n\\\\\\`\\\\\\`\\\\\\`\\\\n\\\\nRun \\\\\\`haive memory verify --update\\\\\\` locally to refresh them before merging.\\`\n });\n\n # ── hAIve PR Memory Check ─────────────────────────────────────────────────\n # Posts a comment on every PR surfacing memories relevant to the changed files.\n # Reviewers and AI agents see gotchas, conventions, and action_required items\n # before they start coding.\n pr-memory-check:\n if: github.event_name == 'pull_request'\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n contents: read\n steps:\n - uses: actions/checkout@v4\n\n - uses: Doucs91/hAIve/packages/github-action@main\n with:\n github-token: \\${{ secrets.GITHUB_TOKEN }}\n # post-if-empty: 'true' # uncomment to always post (even when no memories found)\n # max-memories: '5' # limit memories per file in the comment\n\n # On push to main: push shared memories to the hub (if hubPath is configured)\n # Uncomment and configure hubPath in .ai/haive.config.json to enable.\n # hub-push:\n # if: github.event_name == 'push'\n # needs: sync-on-merge\n # runs-on: ubuntu-latest\n # permissions:\n # contents: write\n # steps:\n # - uses: actions/checkout@v4\n # with:\n # fetch-depth: 0\n # - uses: actions/setup-node@v4\n # with:\n # node-version: '20'\n # - name: install haive\n # run: npm install -g @hiveai/cli\n # - name: push shared memories to hub\n # run: haive hub push --commit\n # # Requires hubPath in .ai/haive.config.json pointing to a cloned hub repo.\n`;\n\nexport function registerInit(program: Command): void {\n program\n .command(\"init\")\n .description(\n \"Initialize a hAIve project — autopilot mode ON by default (zero human intervention).\\n\" +\n \" Add --manual if you want to control memory approval and session recaps yourself.\",\n )\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .option(\"--no-bridges\", \"do not generate CLAUDE.md / .cursorrules / copilot-instructions.md\")\n .option(\"--with-ci\", \"write a GitHub Actions workflow (.github/workflows/haive-sync.yml) — included automatically in autopilot mode\")\n .option(\n \"--manual\",\n \"opt out of autopilot: memories require manual approval, no auto-session recap, no auto-context\",\n )\n .action(async (opts: { dir: string; bridges: boolean; withCi?: boolean; manual?: boolean }) => {\n const root = path.resolve(opts.dir);\n const paths = resolveHaivePaths(root);\n const autopilot = opts.manual !== true; // autopilot is ON by default\n\n if (existsSync(paths.haiveDir)) {\n ui.warn(`.ai/ already exists at ${paths.haiveDir} — leaving existing files in place.`);\n }\n\n await mkdir(paths.personalDir, { recursive: true });\n await mkdir(paths.teamDir, { recursive: true });\n await mkdir(paths.moduleDir, { recursive: true });\n await mkdir(paths.modulesContextDir, { recursive: true });\n\n if (!existsSync(paths.projectContext)) {\n await writeFile(paths.projectContext, PROJECT_CONTEXT_TEMPLATE, \"utf8\");\n ui.success(`Created ${path.relative(root, paths.projectContext)}`);\n }\n\n // Write config (autopilot or default)\n const configExists = existsSync(\n path.join(paths.haiveDir, \"haive.config.json\"),\n );\n if (!configExists) {\n await saveConfig(paths, autopilot ? AUTOPILOT_DEFAULTS : { autopilot: false });\n ui.success(\n `Created .ai/haive.config.json (mode: ${autopilot ? \"autopilot\" : \"standard\"})`,\n );\n }\n\n if (opts.bridges) {\n await writeBridge(root, \"CLAUDE.md\");\n await writeBridge(root, \".cursorrules\");\n await writeBridge(root, path.join(\".github\", \"copilot-instructions.md\"));\n }\n\n // autopilot: CI + git hooks + code-map included automatically\n const wantCi = opts.withCi || autopilot;\n if (wantCi) {\n const ciPath = path.join(root, \".github\", \"workflows\", \"haive-sync.yml\");\n if (existsSync(ciPath)) {\n ui.info(\"CI workflow already exists — skipped\");\n } else {\n await mkdir(path.dirname(ciPath), { recursive: true });\n await writeFile(ciPath, CI_WORKFLOW, \"utf8\");\n ui.success(`Created ${path.relative(root, ciPath)}`);\n }\n }\n\n if (autopilot) {\n // Install git hooks\n const haiveBin = process.argv[1]!;\n const hookResult = spawnSync(\n process.execPath,\n [haiveBin, \"install-hooks\", \"--dir\", root],\n { encoding: \"utf8\" },\n );\n if (hookResult.status === 0) {\n ui.success(\"Git hooks installed (auto-sync after pull/merge)\");\n } else {\n ui.warn(\"Git hooks not installed (not a git repo or no .git/ found) — run `haive install-hooks` manually\");\n }\n\n // Build initial code-map\n try {\n ui.info(\"Building code-map…\");\n const map = await buildCodeMap(root);\n await saveCodeMap(paths, map);\n ui.success(`Code-map built (${Object.keys(map.files).length} files)`);\n } catch {\n ui.warn(\"Code-map build failed — run `haive index code` manually\");\n }\n }\n\n ui.success(`hAIve initialized at ${root}${autopilot ? \" (autopilot mode)\" : \"\"}`);\n console.log();\n\n if (autopilot) {\n console.log(ui.bold(\"Autopilot mode is ON — hAIve runs itself:\"));\n console.log(ui.dim(\" ✓ Memories go directly to validated (no approval needed)\"));\n console.log(ui.dim(\" ✓ Proposed memories auto-approve after 72h without rejection\"));\n console.log(ui.dim(\" ✓ Session recap saved automatically when the AI session closes\"));\n console.log(ui.dim(\" ✓ Code-map refreshes automatically after every pull\"));\n console.log(ui.dim(\" ✓ Git hooks installed (auto-sync after pull/merge)\"));\n console.log(ui.dim(\" ✓ CI workflow created (pr-stale-check + sync-on-merge)\"));\n console.log();\n console.log(ui.bold(\"One remaining step:\"));\n console.log(\" In your AI client, invoke the MCP prompt: \" + ui.bold(\"bootstrap_project\"));\n console.log(ui.dim(\" This fills .ai/project-context.md — only needed once.\"));\n } else {\n console.log(ui.bold(\"Next steps:\"));\n console.log(ui.dim(\" 1. Fill project context — let your AI agent do it:\"));\n console.log(\" \" + ui.bold(\"In your AI client (Claude, Cursor…), invoke the MCP prompt: bootstrap_project\"));\n console.log(ui.dim(\" This analyzes your codebase and writes .ai/project-context.md automatically.\"));\n console.log();\n console.log(ui.dim(\" 2. Point your AI client at the MCP server:\"));\n console.log(` haive-mcp --root ${root}`);\n console.log();\n console.log(ui.dim(\" 3. Start every AI session with:\"));\n console.log(\" \" + ui.bold(\"get_briefing({ task: '…what you are about to do…' })\"));\n console.log();\n console.log(ui.dim(\" Tip: run `haive init` (without --manual) for zero-friction autopilot mode.\"));\n }\n });\n}\n\nasync function writeBridge(root: string, relPath: string): Promise<void> {\n const target = path.join(root, relPath);\n if (existsSync(target)) {\n ui.info(`Bridge ${relPath} already exists — skipped`);\n return;\n }\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, BRIDGE_BODY, \"utf8\");\n ui.success(`Created bridge ${relPath}`);\n}\n\n","import { mkdir, writeFile, chmod, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface InstallHooksOptions {\n dir?: string;\n force?: boolean;\n}\n\nconst HOOK_MARKER = \"# hAIve auto-generated\";\n\nconst HOOK_BODY = `#!/bin/sh\n${HOOK_MARKER} — keep this block to allow upgrades. Hand-edit anything outside it.\n\n# After a merge or pull, refresh memory anchors and auto-promote eligible\n# memories so that everyone on this branch sees consistent confidence levels.\nif command -v haive >/dev/null 2>&1; then\n haive sync --quiet --since ORIG_HEAD || true\nelif [ -x ./node_modules/.bin/haive ]; then\n ./node_modules/.bin/haive sync --quiet --since ORIG_HEAD || true\nfi\n`;\n\nconst HOOKS = [\"post-merge\", \"post-rewrite\"] as const;\n\nexport function registerInstallHooks(program: Command): void {\n program\n .command(\"install-hooks\")\n .description(\n \"Install git hooks so haive sync runs automatically after every pull or merge.\\n\\n\" +\n \" Installs a post-merge hook at .git/hooks/post-merge that runs:\\n\" +\n \" haive sync --quiet --since ORIG_HEAD --embed\\n\\n\" +\n \" This ensures memory anchors are always verified and the embeddings index\\n\" +\n \" is kept fresh without requiring any manual steps.\\n\\n\" +\n \" Installed automatically by haive init (autopilot mode).\\n\" +\n \" Use --force to overwrite an existing post-merge hook.\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--force\", \"overwrite existing hooks\")\n .action(async (opts: InstallHooksOptions) => {\n const root = findProjectRoot(opts.dir);\n const gitDir = path.join(root, \".git\");\n if (!existsSync(gitDir)) {\n ui.error(`No .git directory at ${root}.`);\n process.exitCode = 1;\n return;\n }\n const hooksDir = path.join(gitDir, \"hooks\");\n await mkdir(hooksDir, { recursive: true });\n\n let installed = 0;\n let skipped = 0;\n for (const name of HOOKS) {\n const file = path.join(hooksDir, name);\n if (existsSync(file) && !opts.force) {\n const existing = await readFile(file, \"utf8\");\n if (!existing.includes(HOOK_MARKER)) {\n ui.warn(`${name} already exists and was not written by hAIve. Re-run with --force to overwrite.`);\n skipped++;\n continue;\n }\n }\n await writeFile(file, HOOK_BODY, \"utf8\");\n await chmod(file, 0o755);\n installed++;\n }\n ui.success(`Installed ${installed} hook(s) in .git/hooks/${skipped ? `, skipped ${skipped}` : \"\"}`);\n ui.info(\"Test with: git pull (or any merge), then check .ai/memories for status updates.\");\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nconst require = createRequire(import.meta.url);\n\ninterface McpOptions {\n dir?: string;\n}\n\nexport function registerMcp(program: Command): void {\n program\n .command(\"mcp\")\n .description(\n \"Start the hAIve MCP server (stdio transport) for direct testing.\\n\\n\" +\n \" In normal use, your AI client (Claude Code, Cursor, VS Code) starts the server\\n\" +\n \" automatically via the haive-mcp binary listed in your MCP config file.\\n\\n\" +\n \" This command is useful for debugging or for clients that require manual startup.\\n\\n\" +\n \" Client config examples (point at haive-mcp binary, not this command):\\n\" +\n \" Claude Code: ~/.claude.json → mcpServers.haive.command = \\\"haive-mcp\\\"\\n\" +\n \" Cursor: ~/.cursor/mcp.json → mcpServers.haive.command = \\\"haive-mcp\\\"\\n\" +\n \" VS Code: code --add-mcp '{\\\"name\\\":\\\"haive\\\",\\\"command\\\":\\\"haive-mcp\\\",...}'\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root (defaults to nearest .ai/ or .git/)\")\n .action((opts: McpOptions) => {\n const root = findProjectRoot(opts.dir);\n const bin = locateMcpBin();\n if (!bin) {\n ui.error(\n \"@hiveai/mcp binary not found. Install @hiveai/mcp or run `pnpm build` in the monorepo.\",\n );\n process.exit(1);\n }\n const child = spawn(\"node\", [bin, \"--root\", root], {\n stdio: [\"inherit\", \"inherit\", \"inherit\"],\n env: process.env,\n });\n child.on(\"exit\", (code) => process.exit(code ?? 0));\n });\n}\n\nfunction locateMcpBin(): string | null {\n // 1. Resolve the @hiveai/mcp package and use its bin entry.\n try {\n const pkgPath = require.resolve(\"@hiveai/mcp/package.json\");\n const pkgDir = path.dirname(pkgPath);\n const candidate = path.join(pkgDir, \"dist\", \"index.js\");\n if (existsSync(candidate)) return candidate;\n } catch {\n // not installed — fall through\n }\n\n // 2. Fallback: look for sibling package in monorepo dev mode.\n const here = path.dirname(fileURLToPath(import.meta.url));\n const sibling = path.resolve(here, \"..\", \"..\", \"..\", \"mcp\", \"dist\", \"index.js\");\n if (existsSync(sibling)) return sibling;\n\n return null;\n}\n","import { spawnSync } from \"node:child_process\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n DEFAULT_AUTO_PROMOTE_RULE,\n buildFrontmatter,\n findProjectRoot,\n getUsage,\n isAutoPromoteEligible,\n isDecaying,\n loadCodeMap,\n loadConfig,\n loadMemoriesFromDir,\n loadUsageIndex,\n pullCrossRepoSources,\n resolveHaivePaths,\n resolveManifestFiles,\n serializeMemory,\n trackDependencies,\n verifyAnchor,\n watchContracts,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nconst BRIDGE_START = \"<!-- haive:memories-start -->\";\nconst BRIDGE_END = \"<!-- haive:memories-end -->\";\n\ninterface SyncOptions {\n dir?: string;\n quiet?: boolean;\n since?: string;\n verify?: boolean;\n promote?: boolean;\n injectBridge?: boolean;\n bridgeFile?: string;\n bridgeMaxMemories?: string;\n embed?: boolean;\n noCrossRepo?: boolean;\n noDeps?: boolean;\n noContracts?: boolean;\n}\n\nexport function registerSync(program: Command): void {\n program\n .command(\"sync\")\n .description(\n \"Refresh memory state after a git pull or merge.\\n\" +\n \" What it does:\\n\" +\n \" 1. Verifies anchor paths — marks stale if files/symbols moved or deleted\\n\" +\n \" 2. Re-validates previously stale memories that are now fresh\\n\" +\n \" 3. Auto-promotes proposed memories (by usage count or time delay in autopilot)\\n\" +\n \" 4. Auto-refreshes code-map if source files changed\\n\" +\n \" 5. Reports decay warnings for memories unused >90 days\\n\\n\" +\n \" Install git hooks to run sync automatically: haive install-hooks\\n\\n\" +\n \" Examples:\\n\" +\n \" haive sync\\n\" +\n \" haive sync --since main # also report memories changed since main\\n\" +\n \" haive sync --embed # also rebuild embeddings index\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--quiet\", \"minimal output (suitable for git hooks)\")\n .option(\n \"--since <ref>\",\n \"git ref/commit to compare against; report memories added/modified/removed since\",\n )\n .option(\"--no-verify\", \"skip the anchor verification step\")\n .option(\"--no-promote\", \"skip the auto-promotion step\")\n .option(\n \"--inject-bridge\",\n \"inject top validated memories into CLAUDE.md (or --bridge-file) between <!-- haive:memories-start/end --> markers\",\n )\n .option(\"--bridge-file <path>\", \"bridge file to inject into (default: CLAUDE.md)\")\n .option(\"--bridge-max-memories <n>\", \"max memories to inject into bridge file\", \"5\")\n .option(\"--embed\", \"rebuild embeddings index after sync (requires @haive/embeddings)\")\n .option(\"--no-cross-repo\", \"skip cross-repo memory pull even if crossRepoSources is configured\")\n .option(\"--no-deps\", \"skip dependency version tracking\")\n .option(\"--no-contracts\", \"skip contract file diff checking\")\n .action(async (opts: SyncOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n if (!opts.quiet) ui.warn(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const log = (msg: string): void => {\n if (!opts.quiet) console.log(msg);\n };\n\n const config = await loadConfig(paths);\n const autoApproveDelayHours = config.autoApproveDelayHours ?? null;\n const autoPromoteMinReads = config.autoPromoteMinReads ?? DEFAULT_AUTO_PROMOTE_RULE.minReads;\n\n let staleMarked = 0;\n let revalidated = 0;\n let promoted = 0;\n let autoApproved = 0;\n\n if (opts.verify !== false) {\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n for (const { memory, filePath } of memories) {\n // session_recap records historical context — staleness doesn't apply.\n // If one was incorrectly stale-marked by a prior sync, auto-revalidate it now.\n if (memory.frontmatter.type === \"session_recap\") {\n if (memory.frontmatter.status === \"stale\") {\n await writeFile(\n filePath,\n serializeMemory({\n frontmatter: {\n ...memory.frontmatter,\n status: \"validated\",\n stale_reason: null,\n verified_at: new Date().toISOString(),\n },\n body: memory.body,\n }),\n \"utf8\",\n );\n revalidated++;\n }\n continue;\n }\n const isAnchored =\n memory.frontmatter.anchor.paths.length > 0 ||\n memory.frontmatter.anchor.symbols.length > 0;\n if (!isAnchored) continue;\n\n const result = await verifyAnchor(memory, { projectRoot: root });\n const verifiedAt = new Date().toISOString();\n\n if (result.stale) {\n if (memory.frontmatter.status !== \"stale\") {\n await writeFile(\n filePath,\n serializeMemory({\n frontmatter: {\n ...memory.frontmatter,\n status: \"stale\",\n verified_at: verifiedAt,\n stale_reason: result.reason,\n },\n body: memory.body,\n }),\n \"utf8\",\n );\n staleMarked++;\n }\n } else if (memory.frontmatter.status === \"stale\") {\n await writeFile(\n filePath,\n serializeMemory({\n frontmatter: {\n ...memory.frontmatter,\n status: \"validated\",\n verified_at: verifiedAt,\n stale_reason: null,\n },\n body: memory.body,\n }),\n \"utf8\",\n );\n revalidated++;\n }\n }\n }\n\n if (opts.promote !== false) {\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const nowMs = Date.now();\n for (const { memory, filePath } of memories) {\n const fm = memory.frontmatter;\n if (fm.type === \"session_recap\") continue;\n\n // Usage-based auto-promotion (existing logic, threshold from config)\n if (\n isAutoPromoteEligible(fm, getUsage(usage, fm.id), {\n minReads: autoPromoteMinReads,\n maxRejections: DEFAULT_AUTO_PROMOTE_RULE.maxRejections,\n })\n ) {\n await writeFile(\n filePath,\n serializeMemory({ frontmatter: { ...fm, status: \"validated\" }, body: memory.body }),\n \"utf8\",\n );\n promoted++;\n continue;\n }\n\n // Time-based auto-approve: proposed memories older than N hours → validated\n if (\n autoApproveDelayHours !== null &&\n fm.status === \"proposed\" &&\n fm.scope === \"team\"\n ) {\n const ageHours =\n (nowMs - new Date(fm.created_at).getTime()) / (1000 * 60 * 60);\n if (ageHours >= autoApproveDelayHours) {\n await writeFile(\n filePath,\n serializeMemory({\n frontmatter: {\n ...fm,\n status: \"validated\",\n verified_at: new Date().toISOString(),\n },\n body: memory.body,\n }),\n \"utf8\",\n );\n autoApproved++;\n }\n }\n }\n }\n\n const sinceReport = opts.since ? collectSinceChanges(root, opts.since) : null;\n\n const draftMemories = (await loadMemoriesFromDir(paths.memoriesDir)).filter(\n (m) => m.memory.frontmatter.status === \"draft\",\n );\n const draftCount = draftMemories.length;\n\n const autoApprovedNote = autoApproved > 0 ? ` · ${autoApproved} auto-approved` : \"\";\n log(\n `${ui.dim(\"sync:\")} ${staleMarked} stale · ${revalidated} revalidated · ${promoted} promoted${autoApprovedNote}${sinceReport ? ` · ${sinceReport.added.length}+/${sinceReport.modified.length}~/${sinceReport.removed.length}- since ${opts.since}` : \"\"}`,\n );\n if (!opts.quiet && draftCount > 0) {\n log(\n ui.dim(\n `ℹ ${draftCount} memor${draftCount === 1 ? \"y\" : \"ies\"} in draft — run \\`haive memory approve <id>\\` to activate or \\`haive memory list --status draft\\` to review`,\n ),\n );\n }\n\n if (opts.injectBridge) {\n const bridgeFile = opts.bridgeFile\n ? path.resolve(opts.bridgeFile)\n : path.join(root, \"CLAUDE.md\");\n const maxInject = Math.max(1, Number(opts.bridgeMaxMemories ?? 5));\n await injectBridge(bridgeFile, paths.memoriesDir, maxInject, root, opts.quiet);\n }\n\n if (sinceReport && !opts.quiet) {\n if (sinceReport.added.length > 0) {\n log(ui.bold(\"\\nNew memories:\"));\n for (const f of sinceReport.added) log(` + ${f}`);\n }\n if (sinceReport.modified.length > 0) {\n log(ui.bold(\"\\nModified:\"));\n for (const f of sinceReport.modified) log(` ~ ${f}`);\n }\n if (sinceReport.removed.length > 0) {\n log(ui.bold(\"\\nRemoved:\"));\n for (const f of sinceReport.removed) log(` - ${f}`);\n }\n }\n\n // Decay report: memories not read in >90 days\n if (!opts.quiet) {\n const allForDecay = await loadMemoriesFromDir(paths.memoriesDir);\n const usageForDecay = await loadUsageIndex(paths);\n const decaying = allForDecay.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\" || fm.status === \"stale\") return false;\n const u = getUsage(usageForDecay, fm.id);\n return isDecaying(u, fm.created_at);\n });\n if (decaying.length > 0) {\n log(ui.yellow(`\\n⚠ ${decaying.length} memor${decaying.length === 1 ? \"y\" : \"ies\"} not read in >90 days (consider reviewing or deprecating):`));\n for (const { memory } of decaying) {\n log(ui.dim(` ${memory.frontmatter.id}`));\n }\n }\n }\n\n // ── Cross-repo pull ────────────────────────────────────────────────────────\n if (opts.noCrossRepo !== true && (config.crossRepoSources ?? []).length > 0) {\n try {\n const crossReports = await pullCrossRepoSources(paths, config, root);\n for (const r of crossReports) {\n const total = r.imported.length + r.updated.length;\n if (total > 0 || r.errors.length > 0) {\n log(\n ui.dim(\n `cross-repo [${r.source}]: ${r.imported.length} imported · ${r.updated.length} updated · ${r.skipped.length} unchanged` +\n (r.errors.length > 0 ? ` · ⚠ ${r.errors.length} error(s)` : \"\"),\n ),\n );\n for (const e of r.errors) ui.warn(` cross-repo error: ${e}`);\n }\n }\n } catch (err) {\n ui.warn(`cross-repo pull failed: ${String(err)}`);\n }\n }\n\n // ── Dependency tracker ─────────────────────────────────────────────────────\n if (opts.noDeps !== true) {\n try {\n const manifestFiles = resolveManifestFiles(root, config.dependencyFiles);\n if (manifestFiles.length > 0) {\n const depResults = await trackDependencies(root, paths.haiveDir, manifestFiles);\n for (const result of depResults) {\n const majorBumps = result.changes.filter((c) => c.isMajorBump);\n const minorChanges = result.changes.filter((c) => !c.isMajorBump);\n if (result.changes.length > 0) {\n log(\n ui.yellow(\n `⚠ dependency changes in ${result.file}: ${majorBumps.length} major bump(s) · ${minorChanges.length} minor change(s)`,\n ),\n );\n for (const c of majorBumps) {\n log(ui.yellow(` MAJOR: ${c.name} ${c.from} → ${c.to}`));\n }\n for (const c of minorChanges) {\n log(ui.dim(` minor: ${c.name} ${c.from} → ${c.to}`));\n }\n // Create a gotcha memory for major bumps\n if (majorBumps.length > 0) {\n const slugParts = result.file.replace(/[^a-z0-9]/gi, \"-\").toLowerCase();\n const slug = `dep-major-bump-${slugParts}-${Date.now().toString(36)}`;\n const depList = majorBumps\n .map((c) => `- 🔴 **${c.name}** : \\`${c.from}\\` → \\`${c.to}\\``)\n .join(\"\\n\");\n const body =\n `## ⚠️ Action requise — confirmation humaine obligatoire\\n\\n` +\n `Des dépendances dans \\`${result.file}\\` ont changé de version majeure.\\n` +\n `Une version majeure peut contenir des **breaking changes** qui impactent ce projet.\\n\\n` +\n `${depList}\\n\\n` +\n `---\\n\\n` +\n `**🚫 Ne modifie aucun code de façon autonome.**\\n\\n` +\n `Informe le développeur avec ce message :\\n\\n` +\n `> *« J'ai détecté que ${majorBumps.map((c) => `\\`${c.name}\\``).join(\", \")} ` +\n `a changé de version majeure (${majorBumps.map((c) => `${c.from} → ${c.to}`).join(\", \")}). ` +\n `Cela peut introduire des incompatibilités dans ce projet. ` +\n `Veux-tu que j'analyse l'impact et que je propose des mises à jour ? »*\\n\\n` +\n `Attends une **confirmation explicite** avant d'agir.\\n\\n` +\n `**Prochaines étapes (si confirmé) :**\\n` +\n `- Consulter le CHANGELOG : \\`haive memory import-changelog --from node_modules/<pkg>/CHANGELOG.md\\`\\n` +\n `- Vérifier les mémoires ancrées : \\`haive memory verify\\``;\n const fm = buildFrontmatter({\n type: \"gotcha\",\n slug,\n scope: \"team\",\n status: \"validated\",\n tags: [\"dependency\", \"breaking-change\", \"auto-generated\", \"requires-human-approval\"],\n paths: [result.file],\n topic: `dep-bump-${slugParts}`,\n });\n const teamDir = path.join(paths.memoriesDir, \"team\");\n await mkdir(teamDir, { recursive: true });\n await writeFile(\n path.join(teamDir, `${fm.id}.md`),\n serializeMemory({ frontmatter: { ...fm, requires_human_approval: true }, body }),\n \"utf8\",\n );\n log(ui.yellow(` → memory created: ${fm.id}`));\n }\n }\n }\n }\n } catch (err) {\n ui.warn(`dependency tracker failed: ${String(err)}`);\n }\n }\n\n // ── Contract watcher ───────────────────────────────────────────────────────\n if (opts.noContracts !== true && (config.contractFiles ?? []).length > 0) {\n try {\n const diffs = await watchContracts(root, paths.haiveDir, config.contractFiles!);\n for (const diff of diffs) {\n const breaking = diff.changes.filter((c) => c.severity === \"breaking\");\n const additive = diff.changes.filter((c) => c.severity === \"additive\");\n log(\n ui.yellow(\n `⚠ contract changed [${diff.contract}]: ${breaking.length} breaking · ${additive.length} additive`,\n ),\n );\n for (const c of diff.changes) {\n const icon = c.severity === \"breaking\" ? \"🔴\" : c.severity === \"additive\" ? \"🟢\" : \"🟡\";\n log(` ${icon} ${c.description}`);\n }\n // Create a gotcha memory for breaking contract changes\n if (breaking.length > 0) {\n const slug = `contract-breaking-${diff.contract.replace(/[^a-z0-9]/gi, \"-\").toLowerCase()}-${Date.now().toString(36)}`;\n const breakingList = breaking.map((c) => `- 🔴 **${c.kind}** : ${c.description}`).join(\"\\n\");\n const addList = additive.length > 0\n ? `\\n\\n### Changements non-breaking (additifs)\\n` +\n additive.map((c) => `- 🟢 ${c.description}`).join(\"\\n\")\n : \"\";\n const body =\n `## ⚠️ Action requise — confirmation humaine obligatoire\\n\\n` +\n `Le contrat **\\`${diff.contract}\\`** (\\`${diff.file}\\`) a été modifié.\\n` +\n `Des **breaking changes** ont été détectés — ce projet consomme peut-être ce contrat.\\n\\n` +\n `${breakingList}${addList}\\n\\n` +\n `---\\n\\n` +\n `**🚫 Ne modifie aucun code de façon autonome.**\\n\\n` +\n `Informe le développeur avec ce message :\\n\\n` +\n `> *« J'ai détecté que le contrat \\`${diff.contract}\\` a changé : ` +\n `${breaking.length} breaking change(s) détecté(s). ` +\n `Ce projet dépend peut-être de ce contrat. ` +\n `Veux-tu que j'analyse l'impact et que je propose des mises à jour ? »*\\n\\n` +\n `Attends une **confirmation explicite** avant d'agir.\\n\\n` +\n `**Prochaines étapes (si confirmé) :**\\n` +\n `- Rechercher les usages : \\`haive memory for-files <fichiers concernés>\\`\\n` +\n `- Vérifier les mémoires liées : \\`haive memory query ${diff.contract}\\``;\n const fm = buildFrontmatter({\n type: \"gotcha\",\n slug,\n scope: \"team\",\n status: \"validated\",\n tags: [\"api-contract\", \"breaking-change\", diff.contract, \"auto-generated\", \"requires-human-approval\"],\n paths: [diff.file],\n topic: `contract-breaking-${diff.contract}`,\n });\n const teamDir = path.join(paths.memoriesDir, \"team\");\n await mkdir(teamDir, { recursive: true });\n await writeFile(\n path.join(teamDir, `${fm.id}.md`),\n serializeMemory({ frontmatter: { ...fm, requires_human_approval: true }, body }),\n \"utf8\",\n );\n log(ui.yellow(` → memory created: ${fm.id}`));\n }\n }\n } catch (err) {\n ui.warn(`contract watcher failed: ${String(err)}`);\n }\n }\n\n // ── Auto-refresh code-map if source files changed since it was generated ──\n const existingMap = await loadCodeMap(paths);\n if (existingMap) {\n const mapAge = new Date(existingMap.generated_at).getTime();\n // Check if any tracked source files are newer than the map\n const gitResult = spawnSync(\n \"git\",\n [\n \"diff\",\n \"--name-only\",\n \"--diff-filter=ACMR\",\n `@{${new Date(mapAge).toISOString()}}..HEAD`,\n \"--\",\n \"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\",\n \"*.java\", \"*.kt\",\n \"*.py\",\n \"*.go\",\n \"*.rs\",\n \"*.cs\",\n \"*.php\",\n ],\n { cwd: root, encoding: \"utf8\" },\n );\n const changedSourceFiles = (gitResult.stdout ?? \"\").trim();\n if (changedSourceFiles.length > 0) {\n // Lazily import the indexer to avoid circular deps\n try {\n const { buildCodeMap, saveCodeMap } = await import(\"@hiveai/core\");\n log(ui.dim(\"code-map: source files changed — refreshing index…\"));\n const newMap = await buildCodeMap(root);\n await saveCodeMap(paths, newMap);\n log(ui.dim(`code-map: refreshed (${Object.keys(newMap.files).length} files)`));\n } catch {\n // Non-fatal — code-map refresh is best-effort\n }\n }\n }\n\n // --embed: rebuild embeddings index after sync\n if (opts.embed) {\n try {\n const emb = await import(\"@hiveai/embeddings\");\n log(ui.dim(\"embed: rebuilding index…\"));\n const report = await emb.rebuildIndex(paths);\n log(ui.dim(`embed: index rebuilt (${report.added} added, ${report.updated} updated, ${report.removed} removed)`));\n } catch {\n ui.warn(\"--embed: @hiveai/embeddings not available or index build failed. Run `haive embeddings index` manually.\");\n }\n }\n });\n}\n\nasync function injectBridge(\n bridgeFile: string,\n memoriesDir: string,\n maxMemories: number,\n root: string,\n quiet?: boolean,\n): Promise<void> {\n if (!existsSync(memoriesDir)) return;\n\n const all = await loadMemoriesFromDir(memoriesDir);\n const top = all\n .filter(({ memory }) => {\n const s = memory.frontmatter.status;\n if (memory.frontmatter.type === \"session_recap\") return false;\n return s === \"validated\" || s === \"proposed\";\n })\n .sort((a, b) => {\n const score = (m: typeof a) => {\n const s = m.memory.frontmatter.status;\n return (s === \"validated\" ? 2 : 1);\n };\n return score(b) - score(a);\n })\n .slice(0, maxMemories);\n\n const block = top\n .map((m) => {\n const fm = m.memory.frontmatter;\n const unverified = fm.status === \"proposed\" ? \" [UNVERIFIED]\" : \"\";\n return `### ${fm.id} (${fm.scope}/${fm.type})${unverified}\\n${m.memory.body.trim()}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n const injected =\n `${BRIDGE_START}\\n` +\n `<!-- AUTO-GENERATED by haive sync --inject-bridge — do not edit between these markers -->\\n\\n` +\n block +\n `\\n\\n${BRIDGE_END}`;\n\n const fileExists = existsSync(bridgeFile);\n let existing = fileExists ? await readFile(bridgeFile, \"utf8\") : \"\";\n // Normalize line endings to avoid \\r\\n accumulation\n existing = existing.replace(/\\r\\n/g, \"\\n\");\n\n const startIdx = existing.indexOf(BRIDGE_START);\n const endIdx = existing.indexOf(BRIDGE_END);\n\n // Detect partial markers — safer to abort than silently corrupt the file\n if (startIdx !== -1 && endIdx === -1) {\n ui.warn(`${path.relative(root, bridgeFile)}: found ${BRIDGE_START} without ${BRIDGE_END}. Fix the file manually before running --inject-bridge.`);\n return;\n }\n if (startIdx === -1 && endIdx !== -1) {\n ui.warn(`${path.relative(root, bridgeFile)}: found ${BRIDGE_END} without ${BRIDGE_START}. Fix the file manually before running --inject-bridge.`);\n return;\n }\n\n let updated: string;\n if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {\n updated = existing.slice(0, startIdx) + injected + existing.slice(endIdx + BRIDGE_END.length);\n } else {\n if (!fileExists && !quiet) {\n ui.info(`Creating ${path.relative(root, bridgeFile)} with haive memory block.`);\n }\n updated = existing + (existing.endsWith(\"\\n\") ? \"\" : \"\\n\") + \"\\n\" + injected + \"\\n\";\n }\n\n await writeFile(bridgeFile, updated, \"utf8\");\n if (!quiet) {\n console.log(\n ui.dim(`bridge: injected ${top.length} memor${top.length === 1 ? \"y\" : \"ies\"} into ${path.relative(root, bridgeFile)}`),\n );\n }\n}\n\ninterface SinceReport {\n added: string[];\n modified: string[];\n removed: string[];\n}\n\nfunction collectSinceChanges(root: string, ref: string): SinceReport | null {\n const result = spawnSync(\n \"git\",\n [\"-C\", root, \"diff\", \"--name-status\", \"--diff-filter=AMD\", `${ref}...HEAD`, \"--\", \".ai/memories\"],\n { encoding: \"utf8\" },\n );\n if (result.status !== 0) return null;\n\n const report: SinceReport = { added: [], modified: [], removed: [] };\n for (const line of result.stdout.split(\"\\n\")) {\n const [status, ...rest] = line.split(\"\\t\");\n const file = rest.join(\"\\t\").trim();\n if (!file) continue;\n if (status === \"A\") report.added.push(file);\n else if (status === \"M\") report.modified.push(file);\n else if (status === \"D\") report.removed.push(file);\n }\n return report;\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n inferModulesFromPaths,\n loadMemoriesFromDir,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n type MemoryFrontmatter,\n type MemoryScope,\n type MemoryType,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface AddOptions {\n type: MemoryType;\n slug: string;\n title?: string;\n scope?: MemoryScope;\n module?: string;\n tags?: string;\n domain?: string;\n author?: string;\n paths?: string;\n symbols?: string;\n commit?: string;\n body?: string;\n bodyFile?: string;\n topic?: string;\n dir?: string;\n}\n\nexport function registerMemoryAdd(memory: Command): void {\n memory\n .command(\"add\")\n .description(\n \"Save a piece of knowledge as a persistent memory.\\n\\n\" +\n \" Memory types:\\n\" +\n \" convention — how things are done here (naming, patterns, tooling)\\n\" +\n \" decision — a choice made and WHY (tradeoffs, constraints)\\n\" +\n \" gotcha — non-obvious behavior that surprises newcomers\\n\" +\n \" architecture — structural overview of a system or module\\n\" +\n \" glossary — domain terms and their meaning in this codebase\\n\" +\n \" attempt — failed approach (prefer 'haive memory tried' for better structure)\\n\\n\" +\n \" Tips:\\n\" +\n \" • --paths anchors the memory to source files for staleness detection\\n\" +\n \" • --topic enables upsert: future adds with the same topic update the existing memory\\n\" +\n \" • In autopilot mode, memories go directly to validated with team scope by default\\n\\n\" +\n \" Examples:\\n\" +\n \" haive memory add --type gotcha --slug jpa-open-in-view --scope team \\\\\\\\\\n\" +\n \" --paths src/main/resources/application.properties \\\\\\\\\\n\" +\n \" --body \\\"spring.jpa.open-in-view=false is intentional — do not re-enable.\\\"\\n\" +\n \" haive memory add --type convention --slug flyway-no-modify --topic flyway \\\\\\\\\\n\" +\n \" --scope team --body \\\"Never modify existing migrations. Create V{n+1}__desc.sql.\\\"\\n\",\n )\n .requiredOption(\"--type <type>\", \"convention | decision | gotcha | architecture | glossary | attempt\")\n .requiredOption(\"--slug <slug>\", \"short kebab-case identifier used in the file name\")\n .option(\"--title <text>\", \"memory title — becomes the first heading of the body\")\n .option(\"--scope <scope>\", \"personal | team | module (default: personal, or team in autopilot)\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"--tags <csv>\", \"comma-separated tags for easier retrieval\")\n .option(\"--domain <domain>\", \"domain (e.g. transactions)\")\n .option(\"--author <author>\", \"author email or handle\")\n .option(\"--paths <csv>\", \"anchor to source files — used for staleness detection by haive sync\")\n .option(\"--symbols <csv>\", \"anchor to specific symbols (class/function names)\")\n .option(\"--commit <sha>\", \"anchor to a specific commit SHA\")\n .option(\"--body <text>\", \"memory body content (Markdown) — overrides --title default body\")\n .option(\"--body-file <path>\", \"read memory body from a Markdown file — for long content\")\n .option(\"--no-auto-tag\", \"disable automatic tag suggestions inferred from anchor paths\")\n .option(\"--topic <key>\", \"stable key for upsert: if a memory with this topic+scope already exists, update it in-place (revision_count++)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: AddOptions & { autoTag?: boolean }) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const userTags = parseCsv(opts.tags);\n const anchorPaths = parseCsv(opts.paths);\n const autoTagsEnabled = opts.autoTag !== false;\n const inferredTags = autoTagsEnabled ? inferModulesFromPaths(anchorPaths) : [];\n const mergedTags = Array.from(new Set([...userTags, ...inferredTags]));\n\n // ── Anchor path validation ────────────────────────────────────────\n if (anchorPaths.length > 0) {\n const missing = anchorPaths.filter((p) => !existsSync(path.resolve(root, p)));\n if (missing.length > 0) {\n ui.warn(`Anchor path${missing.length > 1 ? \"s\" : \"\"} not found in project:`);\n for (const p of missing) ui.warn(` ✗ ${p}`);\n ui.warn(\n \"Memories anchored to non-existent paths will be immediately marked stale by \\`haive sync\\`.\\n\" +\n \" Verify the paths are relative to the project root and the files/directories exist.\",\n );\n }\n }\n\n const title = opts.title ?? opts.slug;\n let body: string;\n if (opts.bodyFile !== undefined) {\n if (!existsSync(opts.bodyFile)) {\n ui.error(`--body-file not found: ${opts.bodyFile}`);\n process.exitCode = 1;\n return;\n }\n const fileContent = await readFile(opts.bodyFile, \"utf8\");\n body = opts.title ? `# ${opts.title}\\n\\n${fileContent.trim()}\\n` : fileContent;\n } else if (opts.body !== undefined) {\n body = opts.title ? `# ${opts.title}\\n\\n${opts.body}` : opts.body;\n } else {\n body = `# ${title}\\n\\nTODO — write the memory body.\\n`;\n }\n\n // ── Dedup by content hash ─────────────────────────────────────────\n const scope = opts.scope ?? \"personal\";\n if (existsSync(paths.memoriesDir)) {\n const incomingHash = createHash(\"sha256\").update(body.trim()).digest(\"hex\").slice(0, 12);\n const allForHash = await loadMemoriesFromDir(paths.memoriesDir);\n const hashDup = allForHash.find(({ memory }) =>\n createHash(\"sha256\").update(memory.body.trim()).digest(\"hex\").slice(0, 12) === incomingHash &&\n memory.frontmatter.scope === scope,\n );\n if (hashDup) {\n ui.error(`Duplicate content detected — identical body already saved as \"${hashDup.memory.frontmatter.id}\".`);\n ui.error(\"Use \\`haive memory update\\` to modify it, or change the body to add new information.\");\n process.exitCode = 1;\n return;\n }\n }\n\n // ── Topic upsert ─────────────────────────────────────────────────\n if (opts.topic && existsSync(paths.memoriesDir)) {\n const existing = await loadMemoriesFromDir(paths.memoriesDir);\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === opts.topic &&\n memory.frontmatter.scope === scope &&\n (!opts.module || memory.frontmatter.module === opts.module),\n );\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const revisionCount = (fm.revision_count ?? 0) + 1;\n const newFrontmatter: MemoryFrontmatter = {\n ...fm,\n revision_count: revisionCount,\n tags: mergedTags.length ? mergedTags : fm.tags,\n anchor: {\n commit: opts.commit ?? fm.anchor.commit,\n paths: anchorPaths.length ? anchorPaths : fm.anchor.paths,\n symbols: parseCsv(opts.symbols).length ? parseCsv(opts.symbols) : fm.anchor.symbols,\n },\n };\n await writeFile(topicMatch.filePath, serializeMemory({ frontmatter: newFrontmatter, body }), \"utf8\");\n ui.success(`Updated (topic upsert) ${path.relative(root, topicMatch.filePath)}`);\n ui.info(`id=${fm.id} revision=${revisionCount}`);\n return;\n }\n }\n\n const frontmatter = buildFrontmatter({\n type: opts.type,\n slug: opts.slug,\n scope,\n module: opts.module,\n tags: mergedTags,\n domain: opts.domain,\n author: opts.author,\n paths: anchorPaths,\n symbols: parseCsv(opts.symbols),\n commit: opts.commit,\n topic: opts.topic,\n });\n\n const file = memoryFilePath(paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n ui.error(`Memory already exists at ${file}`);\n process.exitCode = 1;\n return;\n }\n\n // Dedup check: warn if a similar slug already exists\n if (existsSync(paths.memoriesDir)) {\n const existing = await loadMemoriesFromDir(paths.memoriesDir);\n const slugTokens = opts.slug.toLowerCase().split(/[-_\\s]+/).filter(Boolean);\n const similar = existing.filter(({ memory }) => {\n const id = memory.frontmatter.id.toLowerCase();\n return (\n slugTokens.length >= 2 &&\n slugTokens.filter((t) => id.includes(t)).length >= Math.ceil(slugTokens.length * 0.6)\n );\n });\n if (similar.length > 0) {\n ui.warn(`Possible duplicate — similar memories exist: ${similar.map((m) => m.memory.frontmatter.id).join(\", \")}`);\n ui.warn(\"Consider updating one of these with \\`haive memory update\\` instead.\");\n }\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n ui.success(`Created ${path.relative(root, file)}`);\n ui.info(`id=${frontmatter.id} scope=${frontmatter.scope} status=${frontmatter.status}`);\n if (inferredTags.length > 0) {\n ui.info(`auto-tagged: ${inferredTags.join(\", \")} (use --no-auto-tag to disable)`);\n }\n\n // Anchorless warning: without paths the memory cannot be verified for staleness\n if (anchorPaths.length === 0) {\n ui.warn(\n `This memory has no anchor paths — staleness cannot be detected automatically.` +\n `\\n Add file anchors: haive memory update ${frontmatter.id} --paths <file1,file2>`,\n );\n }\n\n // Workflow hint\n if (scope === \"personal\") {\n console.log(\n ui.dim(\n `→ next: haive memory approve ${frontmatter.id} (activate)` +\n ` | haive memory promote ${frontmatter.id} (share with team)`,\n ),\n );\n } else {\n console.log(\n ui.dim(`→ next: haive memory approve ${frontmatter.id} (mark as validated)`),\n );\n }\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { findProjectRoot, resolveHaivePaths, type MemoryScope, type MemoryType } from \"@hiveai/core\";\nimport { loadMemoriesFromDir, type LoadedMemory } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ListOptions {\n scope?: MemoryScope;\n type?: MemoryType;\n tag?: string;\n module?: string;\n status?: string;\n showRejected?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryList(memory: Command): void {\n memory\n .command(\"list\")\n .description(\"List memories with optional filters\")\n .option(\"--scope <scope>\", \"personal | team | module\")\n .option(\"--type <type>\", \"filter by type\")\n .option(\"--tag <tag>\", \"filter by tag\")\n .option(\"--module <name>\", \"filter by module name\")\n .option(\"--status <csv>\", \"filter by status (draft,proposed,validated,stale,rejected,deprecated)\")\n .option(\"--show-rejected\", \"include rejected memories (hidden by default)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: ListOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No memories directory at ${paths.memoriesDir}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const statusFilter = opts.status ? opts.status.split(\",\").map((s) => s.trim()) : null;\n const filtered = all.filter((m) => {\n if (!matchesFilters(m, opts)) return false;\n const status = m.memory.frontmatter.status;\n if (!opts.showRejected && !statusFilter && status === \"rejected\") return false;\n if (statusFilter && !statusFilter.includes(status)) return false;\n return true;\n });\n\n // Count hidden rejected (not covered by an explicit status filter)\n const hiddenRejectedCount =\n !opts.showRejected && !statusFilter\n ? all.filter(\n (m) => matchesFilters(m, opts) && m.memory.frontmatter.status === \"rejected\",\n ).length\n : 0;\n\n if (filtered.length === 0) {\n ui.info(\"No memories match the filters.\");\n if (hiddenRejectedCount > 0) {\n ui.info(`(${hiddenRejectedCount} rejected hidden — use --show-rejected to include)`);\n }\n return;\n }\n\n for (const { memory: mem, filePath } of filtered) {\n const fm = mem.frontmatter;\n const tagStr = fm.tags.length ? ui.dim(` [${fm.tags.join(\", \")}]`) : \"\";\n const moduleStr = fm.module ? ui.dim(` (${fm.module})`) : \"\";\n const statusBadge = ui.statusBadge(fm.status);\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(fm.scope)}/${ui.dim(fm.type)} ${statusBadge}${moduleStr}${tagStr}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n console.log(ui.dim(`\\n${filtered.length} memor${filtered.length === 1 ? \"y\" : \"ies\"}`));\n\n // Always show rejected hint when memories are hidden\n if (hiddenRejectedCount > 0) {\n console.log(\n ui.dim(`(${hiddenRejectedCount} rejected hidden — use --show-rejected to include)`),\n );\n }\n\n // Draft hint: scope-aware\n const draftItems = filtered.filter((m) => m.memory.frontmatter.status === \"draft\");\n if (draftItems.length > 0) {\n const hasPersonalDrafts = draftItems.some(\n (m) => m.memory.frontmatter.scope === \"personal\",\n );\n const hasTeamDrafts = draftItems.some(\n (m) => m.memory.frontmatter.scope !== \"personal\",\n );\n let hint = `ℹ ${draftItems.length} in draft — use \\`haive memory approve <id>\\` to activate`;\n if (hasPersonalDrafts && !hasTeamDrafts) {\n hint += \" or `haive memory promote <id>` to share with team\";\n }\n console.log(ui.dim(hint));\n }\n });\n}\n\nfunction matchesFilters(loaded: LoadedMemory, opts: ListOptions): boolean {\n const fm = loaded.memory.frontmatter;\n if (opts.scope && fm.scope !== opts.scope) return false;\n if (opts.type && fm.type !== opts.type) return false;\n if (opts.tag && !fm.tags.includes(opts.tag)) return false;\n if (opts.module && fm.module !== opts.module) return false;\n return true;\n}\n","export {\n loadMemoriesFromDir,\n loadMemory,\n listMarkdownFilesRecursive,\n type LoadedMemory,\n} from \"@hiveai/core\";\n","import { mkdir, unlink, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface PromoteOptions {\n dir?: string;\n}\n\nexport function registerMemoryPromote(memory: Command): void {\n memory\n .command(\"promote <id>\")\n .description(\"Promote a personal memory to team scope (status -> proposed)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: PromoteOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No memories directory at ${paths.memoriesDir}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n // Check team/module scope first to give a helpful error\n const teamAndModule = await loadMemoriesFromDir(paths.memoriesDir);\n const alreadyShared = teamAndModule.find(\n (m) =>\n m.memory.frontmatter.id === id &&\n (m.memory.frontmatter.scope === \"team\" || m.memory.frontmatter.scope === \"module\"),\n );\n if (alreadyShared) {\n const fm = alreadyShared.memory.frontmatter;\n ui.warn(\n `\"${id}\" is already in ${fm.scope} scope (status=${fm.status}).`,\n );\n if (fm.status !== \"validated\") {\n ui.info(`→ run \\`haive memory approve ${id}\\` to validate it`);\n }\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.personalDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No personal memory with id \"${id}\". (Promotion only applies to personal scope.)`);\n process.exitCode = 1;\n return;\n }\n\n const updated = {\n frontmatter: {\n ...found.memory.frontmatter,\n scope: \"team\" as const,\n status: \"proposed\" as const,\n },\n body: found.memory.body,\n };\n\n const newPath = memoryFilePath(paths, \"team\", updated.frontmatter.id);\n await mkdir(path.dirname(newPath), { recursive: true });\n await writeFile(newPath, serializeMemory(updated), \"utf8\");\n await unlink(found.filePath);\n\n ui.success(`Promoted ${id} to team scope (status=proposed)`);\n ui.info(`Now at ${path.relative(root, newPath)}`);\n console.log(ui.dim(`→ next: haive memory approve ${id} (validate for team use)`));\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ApproveOptions {\n all?: boolean;\n pending?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryApprove(memory: Command): void {\n memory\n .command(\"approve [id]\")\n .description(\"Mark a memory as 'validated'. Use --all to bulk-approve all proposed/draft memories.\")\n .option(\"--all\", \"approve all proposed and draft memories at once\")\n .option(\"--pending\", \"approve all memories with status 'proposed'\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string | undefined, opts: ApproveOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n\n // Bulk mode\n if (opts.all || opts.pending) {\n const candidates = all.filter((m) => {\n const s = m.memory.frontmatter.status;\n if (opts.all) return s === \"proposed\" || s === \"draft\";\n return s === \"proposed\";\n });\n if (candidates.length === 0) {\n ui.info(opts.all ? \"No draft or proposed memories to approve.\" : \"No proposed memories to approve.\");\n return;\n }\n let count = 0;\n for (const found of candidates) {\n const next = {\n frontmatter: { ...found.memory.frontmatter, status: \"validated\" as const },\n body: found.memory.body,\n };\n await writeFile(found.filePath, serializeMemory(next), \"utf8\");\n count++;\n }\n ui.success(`Approved ${count} memor${count === 1 ? \"y\" : \"ies\"} (status=validated)`);\n return;\n }\n\n // Single mode\n if (!id) {\n ui.error(\"Provide a memory id or use --all / --pending for bulk approval.\");\n process.exitCode = 1;\n return;\n }\n\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n const current = found.memory.frontmatter.status;\n if (current === \"validated\") {\n ui.info(`${id} is already validated.`);\n return;\n }\n if (current !== \"proposed\" && current !== \"draft\") {\n ui.warn(`Memory has status \"${current}\"; approve still sets it to validated.`);\n }\n\n const next = {\n frontmatter: { ...found.memory.frontmatter, status: \"validated\" as const },\n body: found.memory.body,\n };\n await writeFile(found.filePath, serializeMemory(next), \"utf8\");\n ui.success(`Approved ${id} (status=validated)`);\n ui.info(path.relative(root, found.filePath));\n });\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface UpdateOptions {\n title?: string;\n body?: string;\n tags?: string;\n paths?: string;\n symbols?: string;\n commit?: string;\n domain?: string;\n author?: string;\n dir?: string;\n}\n\nexport function registerMemoryUpdate(memory: Command): void {\n memory\n .command(\"update <id>\")\n .description(\"Update body, tags, or anchor of an existing memory (preserves id and usage history)\")\n .option(\"--title <text>\", \"new title — replaces the first heading of the body\")\n .option(\"--body <text>\", \"new Markdown body — replaces the existing body\")\n .option(\"--tags <csv>\", \"new tags, comma-separated — fully replaces existing tags\")\n .option(\"--paths <csv>\", \"new anchor paths, comma-separated\")\n .option(\"--symbols <csv>\", \"new anchor symbols, comma-separated\")\n .option(\"--commit <sha>\", \"new anchor commit SHA\")\n .option(\"--domain <domain>\", \"new domain label\")\n .option(\"--author <author>\", \"new author handle or email\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: UpdateOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === id);\n if (!loaded) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n const updated: string[] = [];\n const { frontmatter, body } = loaded.memory;\n\n const newAnchor = { ...frontmatter.anchor };\n if (opts.paths !== undefined) {\n newAnchor.paths = parseCsv(opts.paths);\n updated.push(\"anchor.paths\");\n }\n if (opts.symbols !== undefined) {\n newAnchor.symbols = parseCsv(opts.symbols);\n updated.push(\"anchor.symbols\");\n }\n if (opts.commit !== undefined) {\n newAnchor.commit = opts.commit;\n updated.push(\"anchor.commit\");\n }\n\n const newFrontmatter = {\n ...frontmatter,\n anchor: newAnchor,\n ...(opts.tags !== undefined ? { tags: parseCsv(opts.tags) } : {}),\n ...(opts.domain !== undefined ? { domain: opts.domain } : {}),\n ...(opts.author !== undefined ? { author: opts.author } : {}),\n };\n if (opts.tags !== undefined) updated.push(\"tags\");\n if (opts.domain !== undefined) updated.push(\"domain\");\n if (opts.author !== undefined) updated.push(\"author\");\n\n let newBody = opts.body !== undefined ? opts.body : body;\n if (opts.title !== undefined) {\n newBody = replaceFirstHeading(newBody, opts.title);\n updated.push(\"title\");\n }\n if (opts.body !== undefined) updated.push(\"body\");\n\n if (updated.length === 0) {\n ui.warn(\"Nothing to update — provide at least one option.\");\n return;\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: newBody }),\n \"utf8\",\n );\n\n ui.success(`Updated ${path.relative(root, loaded.filePath)}`);\n ui.info(`fields: ${updated.join(\", \")}`);\n });\n}\n\nfunction replaceFirstHeading(body: string, title: string): string {\n const headingRe = /^#\\s+.+$/m;\n const replacement = `# ${title}`;\n if (headingRe.test(body)) {\n return body.replace(headingRe, replacement);\n }\n return `${replacement}\\n\\n${body}`;\n}\n\nfunction parseCsv(value: string): string[] {\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n DEFAULT_AUTO_PROMOTE_RULE,\n findProjectRoot,\n getUsage,\n isAutoPromoteEligible,\n loadUsageIndex,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface AutoPromoteOptions {\n minReads?: string;\n maxRejections?: string;\n apply?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryAutoPromote(memory: Command): void {\n memory\n .command(\"auto-promote\")\n .description(\"Promote eligible 'proposed' memories to 'validated' based on usage\")\n .option(\"--min-reads <n>\", \"minimum read_count to qualify\", String(DEFAULT_AUTO_PROMOTE_RULE.minReads))\n .option(\n \"--max-rejections <n>\",\n \"memories with more rejections than this are skipped\",\n String(DEFAULT_AUTO_PROMOTE_RULE.maxRejections),\n )\n .option(\"--apply\", \"actually write status=validated to disk (default: dry-run)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: AutoPromoteOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const rule = {\n minReads: Number(opts.minReads ?? DEFAULT_AUTO_PROMOTE_RULE.minReads),\n maxRejections: Number(opts.maxRejections ?? DEFAULT_AUTO_PROMOTE_RULE.maxRejections),\n };\n\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const eligible = memories.filter(({ memory }) =>\n isAutoPromoteEligible(memory.frontmatter, getUsage(usage, memory.frontmatter.id), rule),\n );\n\n if (eligible.length === 0) {\n ui.info(\n `No memories eligible (minReads=${rule.minReads}, maxRejections=${rule.maxRejections}).`,\n );\n return;\n }\n\n let written = 0;\n for (const { memory: mem, filePath } of eligible) {\n const u = getUsage(usage, mem.frontmatter.id);\n console.log(\n `${ui.bold(opts.apply ? \"PROMOTE\" : \"would promote\")} ${mem.frontmatter.id} ${ui.dim(`reads=${u.read_count} rejections=${u.rejected_count}`)}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n if (opts.apply) {\n const next = {\n frontmatter: { ...mem.frontmatter, status: \"validated\" as const },\n body: mem.body,\n };\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n written++;\n }\n }\n\n const summary = `${eligible.length} eligible`;\n ui.info(opts.apply ? `${summary} · ${written} promoted` : `${summary} · dry-run (use --apply)`);\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n parseMemory,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface EditOptions {\n editor?: string;\n dir?: string;\n}\n\nexport function registerMemoryEdit(memory: Command): void {\n memory\n .command(\"edit <id>\")\n .description(\"Open a memory in $EDITOR and re-validate when you save\")\n .option(\"-e, --editor <cmd>\", \"editor command (defaults to $EDITOR or 'vi')\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: EditOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n const editor = opts.editor ?? process.env.EDITOR ?? process.env.VISUAL ?? \"vi\";\n ui.info(`Opening ${path.relative(root, found.filePath)} with ${editor}…`);\n const code = await runEditor(editor, found.filePath);\n if (code !== 0) {\n ui.warn(`Editor exited with status ${code}.`);\n }\n\n try {\n const fresh = await readFile(found.filePath, \"utf8\");\n parseMemory(fresh);\n ui.success(\"Memory still parses cleanly.\");\n } catch (err) {\n ui.error(\n `Memory no longer parses: ${err instanceof Error ? err.message : String(err)}`,\n );\n ui.warn(\"File left as-is on disk; fix it and re-run a parse-aware command to confirm.\");\n process.exitCode = 1;\n }\n });\n}\n\nfunction runEditor(editor: string, file: string): Promise<number> {\n return new Promise((resolve) => {\n const child = spawn(editor, [file], { stdio: \"inherit\" });\n child.on(\"exit\", (code) => resolve(code ?? 0));\n child.on(\"error\", () => resolve(127));\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n inferModulesFromPaths,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ForFilesOptions {\n dir?: string;\n}\n\nexport function registerMemoryForFiles(memory: Command): void {\n memory\n .command(\"for-files <files...>\")\n .description(\"Show memories relevant to the given files (anchor overlap, module, domain)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (files: string[], opts: ForFilesOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const inferred = inferModulesFromPaths(files);\n\n const byAnchor: typeof all = [];\n const byModule: typeof all = [];\n const byDomain: typeof all = [];\n const seen = new Set<string>();\n\n for (const loaded of all) {\n // session_recap surfaces in briefing last_session — not in for-files\n if (loaded.memory.frontmatter.type === \"session_recap\") continue;\n if (memoryMatchesAnchorPaths(loaded.memory, files)) {\n byAnchor.push(loaded);\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n const pathSegments = extractPathSegments(files);\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n if (loaded.memory.frontmatter.type === \"session_recap\") continue;\n const fm = loaded.memory.frontmatter;\n const moduleHit =\n (fm.module && inferred.includes(fm.module)) ||\n fm.tags.some((t) => {\n const tl = t.toLowerCase();\n return pathSegments.has(tl) || pathSegments.has(tl.replace(/[-_]/g, \"\"));\n });\n if (moduleHit) {\n byModule.push(loaded);\n seen.add(fm.id);\n }\n }\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n if (loaded.memory.frontmatter.type === \"session_recap\") continue;\n const domain = loaded.memory.frontmatter.domain;\n if (domain && inferred.includes(domain)) {\n byDomain.push(loaded);\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n console.log(ui.dim(`inferred modules: ${inferred.length ? inferred.join(\", \") : \"(none)\"}`));\n printGroup(root, \"anchor overlap\", byAnchor, usage);\n printGroup(root, \"module match\", byModule, usage);\n printGroup(root, \"domain match\", byDomain, usage);\n\n const total = byAnchor.length + byModule.length + byDomain.length;\n ui.info(\n `${total} relevant memor${total === 1 ? \"y\" : \"ies\"} (${byAnchor.length} anchor · ${byModule.length} module · ${byDomain.length} domain)`,\n );\n });\n}\n\nfunction extractPathSegments(files: string[]): Set<string> {\n const GENERIC = new Set([\n \"src\", \"main\", \"java\", \"kotlin\", \"python\", \"go\", \"lib\", \"libs\",\n \"com\", \"org\", \"net\", \"io\", \"app\", \"apps\", \"pkg\", \"internal\",\n \"test\", \"tests\", \"spec\", \"specs\", \"impl\", \"domain\", \"shared\",\n \"resources\", \"static\", \"assets\", \"config\", \"configs\",\n ]);\n const out = new Set<string>();\n for (const file of files) {\n const parts = file.replace(/\\\\/g, \"/\").split(\"/\");\n for (const part of parts) {\n const seg = part.toLowerCase().replace(/\\.[^.]+$/, \"\");\n if (seg.length >= 3 && !GENERIC.has(seg) && /^[a-z]/.test(seg)) {\n out.add(seg);\n for (const sub of seg.split(/[-_]/).filter((s) => s.length >= 3)) {\n out.add(sub);\n }\n }\n }\n }\n return out;\n}\n\nfunction printGroup(\n root: string,\n label: string,\n loaded: Array<Awaited<ReturnType<typeof loadMemoriesFromDir>>[number]>,\n usage: Awaited<ReturnType<typeof loadUsageIndex>>,\n): void {\n if (loaded.length === 0) return;\n console.log(ui.bold(`\\n— ${label} —`));\n for (const { memory: mem, filePath } of loaded) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const conf = deriveConfidence(fm, u);\n console.log(`${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(conf)}`);\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface HotOptions {\n threshold?: string;\n status?: \"draft\" | \"proposed\";\n dir?: string;\n}\n\nexport function registerMemoryHot(memory: Command): void {\n memory\n .command(\"hot\")\n .description(\"List memories actively used but not yet validated (good promotion candidates)\")\n .option(\"--threshold <n>\", \"minimum read_count to qualify\", \"3\")\n .option(\"--status <status>\", \"limit to one status (default: draft + proposed)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: HotOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n const threshold = Math.max(1, Number(opts.threshold ?? 3));\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const candidates = all\n .filter(({ memory: mem }) => {\n const fm = mem.frontmatter;\n if (opts.status && fm.status !== opts.status) return false;\n if (opts.status === undefined && fm.status !== \"draft\" && fm.status !== \"proposed\") {\n return false;\n }\n return getUsage(usage, fm.id).read_count >= threshold;\n })\n .sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n if (candidates.length === 0) {\n ui.info(`No hot memories (threshold=${threshold}).`);\n return;\n }\n\n for (const { memory: mem, filePath } of candidates) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(fm.status)} ${ui.dim(`reads=${u.read_count} rejections=${u.rejected_count}`)}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n ui.info(\n `${candidates.length} hot — promote drafts with \\`haive memory promote <id>\\`, then \\`haive memory auto-promote --apply\\`.`,\n );\n });\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n type MemoryScope,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface TriedOptions {\n what: string;\n whyFailed: string;\n instead?: string;\n scope?: MemoryScope;\n module?: string;\n tags?: string;\n paths?: string;\n author?: string;\n dir?: string;\n}\n\nexport function registerMemoryTried(memory: Command): void {\n memory\n .command(\"tried\")\n .description(\n \"Record a FAILED approach — prevents repeated mistakes in future sessions.\\n\\n\" +\n \" This is the most valuable type of negative knowledge. It surfaces FIRST in\\n\" +\n \" get_briefing so agents can't miss it. Auto-validated (no approval cycle).\\n\\n\" +\n \" Use this immediately when you try something and it fails.\\n\\n\" +\n \" Example:\\n\" +\n \" haive memory tried \\\\\\\\\\n\" +\n \" --what \\\"importing X with ESM dynamic import\\\" \\\\\\\\\\n\" +\n \" --why-failed \\\"tsup bundles it as CJS, dynamic import fails at runtime\\\" \\\\\\\\\\n\" +\n \" --instead \\\"use static import in the entry file\\\" \\\\\\\\\\n\" +\n \" --paths packages/cli/src/index.ts\\n\",\n )\n .requiredOption(\"--what <text>\", \"what approach was tried (short, descriptive title)\")\n .requiredOption(\"--why-failed <text>\", \"why it failed or should NOT be used (include the exact error if possible)\")\n .option(\"--instead <text>\", \"the correct approach to use instead\")\n .option(\"--scope <scope>\", \"personal | team | module (default: personal)\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"--tags <csv>\", \"comma-separated tags\")\n .option(\"--paths <csv>\", \"anchor paths, comma-separated\")\n .option(\"--author <author>\", \"author email or handle\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: TriedOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const slug = opts.what\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .trim()\n .split(/\\s+/)\n .slice(0, 5)\n .join(\"-\");\n\n const baseFm = buildFrontmatter({\n type: \"attempt\",\n slug,\n scope: opts.scope,\n module: opts.module,\n tags: parseCsv(opts.tags),\n paths: parseCsv(opts.paths),\n author: opts.author,\n });\n // attempt memories are immediately validated — no review cycle needed\n const frontmatter = { ...baseFm, status: \"validated\" as const };\n\n const lines: string[] = [`# ${opts.what}`, \"\"];\n lines.push(`**Why it failed / do NOT use:** ${opts.whyFailed}`);\n if (opts.instead) {\n lines.push(\"\", `**Instead, use:** ${opts.instead}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n\n const file = memoryFilePath(paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n ui.error(`Memory already exists at ${file}`);\n process.exitCode = 1;\n return;\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n ui.success(`Recorded: ${path.relative(root, file)}`);\n ui.info(`id=${frontmatter.id} type=attempt status=validated (auto-approved)`);\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface PendingOptions {\n scope?: \"personal\" | \"team\" | \"module\";\n dir?: string;\n}\n\nexport function registerMemoryPending(memory: Command): void {\n memory\n .command(\"pending\")\n .description(\"List 'proposed' memories awaiting review (sorted by reads desc)\")\n .option(\"--scope <scope>\", \"filter by scope (personal | team | module)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: PendingOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const proposed = all.filter(({ memory: mem }) => {\n if (mem.frontmatter.status !== \"proposed\") return false;\n if (opts.scope && mem.frontmatter.scope !== opts.scope) return false;\n return true;\n });\n\n if (proposed.length === 0) {\n ui.info(\"No memories awaiting review.\");\n return;\n }\n\n proposed.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n const now = Date.now();\n for (const { memory: mem, filePath } of proposed) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const ageDays = Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000);\n const ageStr = ageDays === 0 ? \"today\" : `${ageDays}d`;\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.dim(`age=${ageStr} reads=${u.read_count} rejections=${u.rejected_count}`)}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n ui.info(`${proposed.length} pending`);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n extractSnippet,\n findProjectRoot,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n pickSnippetNeedle,\n resolveHaivePaths,\n tokenizeQuery,\n trackReads,\n type MemoryScope,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface QueryOptions {\n dir?: string;\n limit?: string;\n scope?: MemoryScope;\n status?: string;\n showRejected?: boolean;\n}\n\nexport function registerMemoryQuery(memory: Command): void {\n memory\n .command(\"query <text>\")\n .description(\"Search memories by id, tag, or substring (AND, OR fallback)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--limit <n>\", \"max results\", \"20\")\n .option(\"--scope <scope>\", \"personal | team | module\")\n .option(\"--status <csv>\", \"filter by status (draft,proposed,validated,stale,rejected)\")\n .option(\"--show-rejected\", \"include rejected memories (hidden by default)\")\n .action(async (text: string, opts: QueryOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No memories directory at ${paths.memoriesDir}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const tokens = tokenizeQuery(text);\n if (tokens.length === 0) {\n ui.warn(\"Empty query — use \\`haive memory list\\` to list all memories.\");\n return;\n }\n const statusFilter = opts.status ? opts.status.split(\",\").map((s) => s.trim()) : null;\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n\n const passesFilters = (mem: (typeof all)[number][\"memory\"]) => {\n const fm = mem.frontmatter;\n if (opts.scope && fm.scope !== opts.scope) return false;\n if (!opts.showRejected && !statusFilter && fm.status === \"rejected\") return false;\n if (statusFilter && !statusFilter.includes(fm.status)) return false;\n // session_recap surfaces in briefing as last_session, not in regular search\n if (fm.type === \"session_recap\") return false;\n return true;\n };\n\n const eligible = all.filter(({ memory: mem }) => passesFilters(mem));\n let matches = eligible.filter(({ memory: mem }) => literalMatchesAllTokens(mem, tokens));\n let fallback = false;\n if (matches.length === 0 && tokens.length > 1) {\n matches = eligible.filter(({ memory: mem }) => literalMatchesAnyToken(mem, tokens));\n fallback = true;\n }\n\n const limit = Math.max(1, Number(opts.limit ?? 20));\n const top = matches.slice(0, limit);\n\n if (top.length === 0) {\n ui.info(`No matches for \"${text}\".`);\n return;\n }\n if (fallback) {\n ui.info(`No exact match — showing partial results (OR fallback):`);\n }\n\n const snippetNeedle = pickSnippetNeedle(text);\n for (const { memory: mem, filePath } of top) {\n const fm = mem.frontmatter;\n const statusBadge = ui.statusBadge(fm.status);\n console.log(`${ui.bold(fm.id)} ${ui.dim(fm.scope)} ${statusBadge}`);\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n const snippet = extractSnippet(mem.body, snippetNeedle);\n if (snippet) console.log(` ${snippet}`);\n }\n console.log(\n ui.dim(`\\n${top.length} of ${matches.length} match${matches.length === 1 ? \"\" : \"es\"}`),\n );\n\n // Track reads for usage stats / decay / hot detection\n const ids = top.map(({ memory: mem }) => mem.frontmatter.id);\n if (ids.length > 0) {\n await trackReads(paths, ids).catch(() => { /* non-fatal */ });\n }\n });\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadUsageIndex,\n recordRejection,\n resolveHaivePaths,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface RejectOptions {\n reason?: string;\n dir?: string;\n}\n\nexport function registerMemoryReject(memory: Command): void {\n memory\n .command(\"reject <id>\")\n .description(\"Record a rejection (blocks auto-promotion and lowers confidence)\")\n .option(\"-r, --reason <reason>\", \"why this memory is being rejected\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: RejectOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === id);\n if (!loaded) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: {\n ...loaded.memory.frontmatter,\n status: \"rejected\",\n stale_reason: opts.reason ?? loaded.memory.frontmatter.stale_reason ?? null,\n },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(paths);\n recordRejection(idx, id, opts.reason ?? null);\n await saveUsageIndex(paths, idx);\n const u = idx.by_id[id]!;\n ui.success(\n `Rejected ${id} (status=rejected, ${u.rejected_count} rejection${u.rejected_count === 1 ? \"\" : \"s\"})`,\n );\n if (opts.reason) ui.info(`reason: ${opts.reason}`);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadUsageIndex,\n resolveHaivePaths,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface RmOptions {\n yes?: boolean;\n keepUsage?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryRm(memory: Command): void {\n memory\n .command(\"rm <id>\")\n .description(\"Delete a memory file (and its usage entry by default)\")\n .option(\"-y, --yes\", \"skip the confirmation prompt\")\n .option(\"--keep-usage\", \"do not remove the usage.json entry\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: RmOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n const rel = path.relative(root, found.filePath);\n if (!opts.yes) {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = (await rl.question(`Delete ${rel}? [y/N] `)).trim().toLowerCase();\n rl.close();\n if (answer !== \"y\" && answer !== \"yes\") {\n ui.info(\"Aborted.\");\n return;\n }\n }\n\n await unlink(found.filePath);\n ui.success(`Deleted ${rel}`);\n\n if (!opts.keepUsage) {\n const idx = await loadUsageIndex(paths);\n if (idx.by_id[id]) {\n delete idx.by_id[id];\n await saveUsageIndex(paths, idx);\n ui.info(\"Removed usage entry\");\n }\n }\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ShowOptions {\n raw?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryShow(memory: Command): void {\n memory\n .command(\"show <id>\")\n .description(\"Print a memory's frontmatter, body, and confidence/usage\")\n .option(\"--raw\", \"print the raw file contents instead of a summary\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: ShowOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n if (opts.raw) {\n console.log(await readFile(found.filePath, \"utf8\"));\n return;\n }\n\n const fm = found.memory.frontmatter;\n const usage = await loadUsageIndex(paths);\n const u = getUsage(usage, fm.id);\n const conf = deriveConfidence(fm, u);\n\n console.log(ui.bold(fm.id));\n console.log(`${ui.dim(\"scope:\")} ${fm.scope}${fm.module ? ` / ${fm.module}` : \"\"}`);\n console.log(`${ui.dim(\"type:\")} ${fm.type}`);\n console.log(`${ui.dim(\"status:\")} ${fm.status} ${ui.dim(\"→ confidence:\")} ${ui.bold(conf)}`);\n console.log(`${ui.dim(\"tags:\")} ${fm.tags.length ? fm.tags.join(\", \") : \"(none)\"}`);\n console.log(`${ui.dim(\"created:\")} ${fm.created_at}`);\n if (fm.verified_at) console.log(`${ui.dim(\"verified:\")} ${fm.verified_at}`);\n if (fm.stale_reason) console.log(`${ui.dim(\"stale:\")} ${fm.stale_reason}`);\n console.log(`${ui.dim(\"reads:\")} ${u.read_count} ${ui.dim(\"rejections:\")} ${u.rejected_count}`);\n console.log(`${ui.dim(\"file:\")} ${path.relative(root, found.filePath)}`);\n if (fm.anchor.paths.length || fm.anchor.symbols.length) {\n console.log(ui.dim(\"anchor:\"));\n if (fm.anchor.commit) console.log(` ${ui.dim(\"commit:\")} ${fm.anchor.commit}`);\n if (fm.anchor.paths.length)\n console.log(` ${ui.dim(\"paths:\")} ${fm.anchor.paths.join(\", \")}`);\n if (fm.anchor.symbols.length)\n console.log(` ${ui.dim(\"symbols:\")} ${fm.anchor.symbols.join(\", \")}`);\n }\n console.log();\n console.log(found.memory.body);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface StatsOptions {\n id?: string;\n dir?: string;\n}\n\nexport function registerMemoryStats(memory: Command): void {\n memory\n .command(\"stats\")\n .description(\"Show usage stats and confidence levels per memory\")\n .option(\"--id <id>\", \"show stats for a single memory id\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: StatsOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const target = opts.id\n ? all.filter((m) => m.memory.frontmatter.id === opts.id)\n : all;\n\n if (target.length === 0) {\n ui.info(opts.id ? `No memory with id \"${opts.id}\".` : \"No memories.\");\n return;\n }\n\n // Sort by read_count desc to surface the popular ones.\n target.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n for (const { memory: mem, filePath } of target) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const conf = deriveConfidence(fm, u);\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(conf)}`,\n );\n console.log(\n ` ${ui.dim(\"status:\")} ${fm.status} ${ui.dim(\"reads:\")} ${u.read_count} ${ui.dim(\"rejections:\")} ${u.rejected_count}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n });\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n resolveHaivePaths,\n serializeMemory,\n verifyAnchor,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface VerifyOptions {\n id?: string;\n all?: boolean;\n update?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryVerify(memory: Command): void {\n memory\n .command(\"verify\")\n .description(\n \"Check that memory anchor paths still exist in the current codebase.\\n\\n\" +\n \" A memory is 'stale' when its anchored file or symbol was moved, deleted, or renamed.\\n\" +\n \" Stale memories are shown with a warning in get_briefing and should be updated or deleted.\\n\\n\" +\n \" haive sync runs this automatically. Use this command for on-demand checks or in CI.\\n\\n\" +\n \" CI recommendation: add 'haive memory verify' to your haive-sync.yml PR check job\\n\" +\n \" to catch stale memories before they reach main.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive memory verify # check all, report only\\n\" +\n \" haive memory verify --update # mark stale/fresh on disk\\n\" +\n \" haive memory verify --id 2026-04-28-gotcha-x # check one memory\\n\",\n )\n .option(\"--id <id>\", \"verify a single memory by id\")\n .option(\"--all\", \"verify every memory (default if --id is omitted)\")\n .option(\"--update\", \"write status=stale or status=validated back to disk\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: VerifyOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const targets = opts.id\n ? all.filter((m) => m.memory.frontmatter.id === opts.id)\n : all;\n\n if (opts.id && targets.length === 0) {\n ui.error(`No memory with id \"${opts.id}\".`);\n process.exitCode = 1;\n return;\n }\n\n let staleCount = 0;\n let freshCount = 0;\n const anchorlessIds: string[] = [];\n let updated = 0;\n\n for (const { memory: mem, filePath } of targets) {\n const result = await verifyAnchor(mem, { projectRoot: root });\n const isAnchored =\n mem.frontmatter.anchor.paths.length > 0 ||\n mem.frontmatter.anchor.symbols.length > 0;\n\n if (!isAnchored) {\n anchorlessIds.push(mem.frontmatter.id);\n continue;\n }\n\n const rel = path.relative(root, filePath);\n if (result.stale) {\n staleCount++;\n console.log(`${ui.bold(\"STALE\")} ${mem.frontmatter.id}`);\n console.log(` ${ui.dim(rel)}`);\n console.log(` ${result.reason}`);\n if (result.possibleRenames.length > 0) {\n console.log(` ${ui.yellow(\"Possible renames:\")} ${result.possibleRenames.join(\", \")}`);\n }\n } else {\n freshCount++;\n console.log(`${ui.dim(\"fresh\")} ${mem.frontmatter.id}`);\n }\n\n if (opts.update) {\n const next = applyVerification(mem, result);\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n updated++;\n }\n }\n\n const summary = [\n `${freshCount} fresh`,\n `${staleCount} stale`,\n `${anchorlessIds.length} anchorless (skipped)`,\n ];\n if (opts.update) summary.push(`${updated} updated on disk`);\n ui.info(summary.join(\" · \"));\n if (anchorlessIds.length > 0) {\n console.log(\n ui.dim(\n `Anchorless memories (no paths/symbols — staleness cannot be detected):\\n` +\n anchorlessIds.map((id) => ` ${id}`).join(\"\\n\") +\n `\\nTip: use \\`haive memory update <id> --paths <files>\\` to add anchors.`,\n ),\n );\n }\n });\n}\n\nfunction applyVerification(\n mem: Parameters<typeof serializeMemory>[0],\n result: { stale: boolean; reason: string | null },\n): Parameters<typeof serializeMemory>[0] {\n const verifiedAt = new Date().toISOString();\n if (result.stale) {\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: \"stale\",\n verified_at: verifiedAt,\n stale_reason: result.reason,\n },\n body: mem.body,\n };\n }\n // Reset stale_reason when re-validating; keep validated/proposed status as is,\n // promote draft→validated when verification passes.\n const nextStatus =\n mem.frontmatter.status === \"stale\" || mem.frontmatter.status === \"draft\"\n ? \"validated\"\n : mem.frontmatter.status;\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: nextStatus,\n verified_at: verifiedAt,\n stale_reason: null,\n },\n body: mem.body,\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ImportOptions {\n from: string;\n scope?: \"personal\" | \"team\";\n dir?: string;\n}\n\nexport function registerMemoryImport(memory: Command): void {\n memory\n .command(\"import\")\n .description(\n \"Parse a Markdown file and suggest memories via the import_docs MCP prompt (prints a ready-to-use prompt invocation)\",\n )\n .requiredOption(\"--from <file>\", \"Markdown/text file to import from\")\n .option(\"--scope <scope>\", \"personal | team (default: team)\", \"team\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: ImportOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n if (!existsSync(opts.from)) {\n ui.error(`File not found: ${opts.from}`);\n process.exitCode = 1;\n return;\n }\n\n const content = await readFile(opts.from, \"utf8\");\n const scope = opts.scope ?? \"team\";\n\n ui.info(`Preparing import from: ${opts.from} (scope=${scope})`);\n ui.info(`Content length: ${content.length} chars`);\n console.log();\n console.log(ui.bold(\"To import via MCP, invoke the `import_docs` prompt with:\"));\n console.log();\n console.log(\n ui.dim(\n JSON.stringify(\n {\n content: content.slice(0, 200) + (content.length > 200 ? \"…\" : \"\"),\n source: opts.from,\n scope,\n },\n null,\n 2,\n ),\n ),\n );\n console.log();\n ui.info(\n \"Or use your AI client to call: import_docs({ content: <file contents>, source: \\\"\" +\n opts.from +\n \"\\\", scope: \\\"\" +\n scope +\n \"\\\" })\",\n );\n });\n}\n","/**\n * haive memory import --from-changelog CHANGELOG.md [--package <name>]\n *\n * Parses a CHANGELOG.md file (Keep-a-Changelog format or common variants),\n * extracts breaking changes and notable gotchas from recent versions,\n * and saves them as hAIve memories.\n *\n * Supports:\n * - Keep a Changelog (https://keepachangelog.com)\n * - Angular commit-based CHANGELOG format\n * - Plain Markdown changelogs with ## headers\n */\nimport { existsSync } from \"node:fs\";\nimport { readFile, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ImportChangelogOptions {\n fromChangelog: string;\n package?: string;\n scope?: string;\n versions?: string; // e.g. \"2.0.0,2.1.0\" or \"latest\"\n dir?: string;\n}\n\ninterface ChangelogEntry {\n version: string;\n breaking: string[];\n deprecated: string[];\n removed: string[];\n fixed: string[];\n added: string[];\n}\n\n// ── Parser ─────────────────────────────────────────────────────────────────\n\nfunction parseChangelog(content: string): ChangelogEntry[] {\n const entries: ChangelogEntry[] = [];\n const versionRe = /^#{1,3}\\s+(?:\\[?)([0-9]+\\.[0-9]+[.0-9]*)/m;\n const sections = content.split(/^#{1,3}\\s+/m).slice(1);\n\n for (const section of sections) {\n const versionMatch = section.match(/^(?:\\[?)([0-9]+\\.[0-9]+[.0-9]*)/);\n if (!versionMatch) continue;\n const version = versionMatch[1];\n\n const entry: ChangelogEntry = {\n version,\n breaking: [],\n deprecated: [],\n removed: [],\n fixed: [],\n added: [],\n };\n\n // Extract sub-sections\n const subSections = section.split(/^#{2,4}\\s+/m);\n for (const sub of subSections) {\n const firstLine = sub.split(\"\\n\")[0].toLowerCase().trim();\n const items = sub\n .split(\"\\n\")\n .slice(1)\n .filter((l) => l.trim().startsWith(\"-\") || l.trim().startsWith(\"*\"))\n .map((l) => l.replace(/^[\\s\\-*]+/, \"\").trim())\n .filter(Boolean);\n\n if (/breaking/.test(firstLine)) {\n entry.breaking.push(...items);\n } else if (/deprecated/.test(firstLine)) {\n entry.deprecated.push(...items);\n } else if (/removed/.test(firstLine)) {\n entry.removed.push(...items);\n } else if (/fixed|bug/.test(firstLine)) {\n entry.fixed.push(...items);\n } else if (/added|new|feat/.test(firstLine)) {\n entry.added.push(...items);\n }\n\n // Also scan for BREAKING CHANGE: prefixes in all items (Angular format)\n for (const sub2 of subSections) {\n for (const line of sub2.split(\"\\n\")) {\n const breakingMatch = line.match(/BREAKING CHANGE[S]?:\\s*(.+)/i);\n if (breakingMatch && !entry.breaking.includes(breakingMatch[1].trim())) {\n entry.breaking.push(breakingMatch[1].trim());\n }\n }\n }\n }\n\n // If no sub-sections matched, do a raw scan for breaking change indicators\n if (entry.breaking.length === 0) {\n for (const line of section.split(\"\\n\")) {\n if (/breaking|⚠|deprecated|removed/.test(line.toLowerCase())) {\n const item = line.replace(/^[\\s\\-*#]+/, \"\").trim();\n if (item) entry.breaking.push(item);\n }\n }\n }\n\n const hasContent =\n entry.breaking.length > 0 ||\n entry.deprecated.length > 0 ||\n entry.removed.length > 0;\n\n if (hasContent) entries.push(entry);\n }\n\n void versionRe; // used implicitly in section splitting\n return entries;\n}\n\n// ── CLI command ─────────────────────────────────────────────────────────────\n\nexport function registerMemoryImportChangelog(memory: Command): void {\n memory\n .command(\"import-changelog\")\n .description(\n \"Import breaking changes from a CHANGELOG.md as hAIve memories.\\n\\n\" +\n \" Parses Keep-a-Changelog and Angular commit format changelogs,\\n\" +\n \" extracts breaking changes, deprecations, and removals,\\n\" +\n \" and saves each version's changes as a gotcha memory.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive memory import-changelog --from node_modules/@company/sdk/CHANGELOG.md --package @company/sdk\\n\" +\n \" haive memory import-changelog --from CHANGELOG.md\\n\" +\n \" haive memory import-changelog --from CHANGELOG.md --versions 2.0.0,2.1.0\\n\",\n )\n .requiredOption(\"--from <file>\", \"path to the CHANGELOG.md file\")\n .option(\"--package <name>\", \"name of the package (used in memory title and tags)\")\n .option(\"--scope <scope>\", \"memory scope: team | personal (default: team)\", \"team\")\n .option(\n \"--versions <csv>\",\n \"only import specific versions (comma-separated), or 'latest' for the most recent breaking version\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: ImportChangelogOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n const changelogPath = path.resolve(root, opts.fromChangelog);\n if (!existsSync(changelogPath)) {\n ui.error(`CHANGELOG not found: ${changelogPath}`);\n process.exitCode = 1;\n return;\n }\n\n const content = await readFile(changelogPath, \"utf8\");\n let entries = parseChangelog(content);\n\n if (entries.length === 0) {\n ui.warn(\"No breaking changes, deprecations, or removals found in the CHANGELOG.\");\n return;\n }\n\n // Filter by versions if specified\n if (opts.versions) {\n if (opts.versions === \"latest\") {\n entries = [entries[0]];\n } else {\n const requested = opts.versions.split(\",\").map((v) => v.trim());\n entries = entries.filter((e) => requested.includes(e.version));\n }\n }\n\n const pkgName = opts.package ?? path.basename(path.dirname(changelogPath));\n const scope = (opts.scope ?? \"team\") as \"team\" | \"personal\";\n const teamDir = path.join(paths.memoriesDir, scope);\n await mkdir(teamDir, { recursive: true });\n\n let saved = 0;\n for (const entry of entries) {\n const lines: string[] = [];\n lines.push(`## ${pkgName} v${entry.version} — Breaking Changes & Deprecations\\n`);\n\n if (entry.breaking.length > 0) {\n lines.push(\"### 🔴 Breaking Changes\\n\");\n for (const item of entry.breaking) lines.push(`- ${item}`);\n lines.push(\"\");\n }\n if (entry.deprecated.length > 0) {\n lines.push(\"### 🟡 Deprecated\\n\");\n for (const item of entry.deprecated) lines.push(`- ${item}`);\n lines.push(\"\");\n }\n if (entry.removed.length > 0) {\n lines.push(\"### ⚫ Removed\\n\");\n for (const item of entry.removed) lines.push(`- ${item}`);\n lines.push(\"\");\n }\n\n lines.push(\n `**Source:** \\`${path.relative(root, changelogPath)}\\` \\n` +\n `**Action:** Update all usages of ${pkgName} if they rely on any of the above.`,\n );\n\n const slug = `changelog-${pkgName.replace(/[^a-z0-9]/gi, \"-\").toLowerCase()}-v${entry.version.replace(/\\./g, \"-\")}`;\n const fm = buildFrontmatter({\n type: \"gotcha\",\n slug,\n scope,\n status: \"validated\",\n tags: [\n \"changelog\",\n \"breaking-change\",\n pkgName.replace(/[^a-z0-9]/gi, \"-\").toLowerCase(),\n `v${entry.version}`,\n ],\n paths: [path.relative(root, changelogPath)],\n topic: `changelog-${pkgName}-${entry.version}`,\n });\n\n await writeFile(\n path.join(teamDir, `${fm.id}.md`),\n serializeMemory({ frontmatter: fm, body: lines.join(\"\\n\") }),\n \"utf8\",\n );\n console.log(ui.green(` ✓ ${fm.id}`));\n saved++;\n }\n\n console.log(\n `\\n${ui.bold(`Imported ${saved} changelog entr${saved === 1 ? \"y\" : \"ies\"} from ${pkgName}`)}`,\n );\n if (saved > 0) {\n console.log(\n ui.dim(` Memories saved to .ai/memories/${scope}/`),\n );\n console.log(\n ui.dim(` Run \\`haive briefing --task \"update ${pkgName}\"\\` to see them in context.`),\n );\n }\n });\n}\n","/**\n * haive memory digest — generate a Markdown report of memories added/updated\n * within the last N days for bulk review.\n *\n * Usage:\n * haive memory digest # last 7 days, team scope\n * haive memory digest --days 14 # last 14 days\n * haive memory digest --scope all # all scopes\n * haive memory digest --out digest.md # write to file instead of stdout\n */\nimport { existsSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface DigestOptions {\n days?: string;\n scope?: string;\n out?: string;\n dir?: string;\n}\n\nconst CONFIDENCE_EMOJI: Record<string, string> = {\n unverified: \"⬜\",\n low: \"🟡\",\n trusted: \"🟢\",\n authoritative: \"⭐\",\n stale: \"🔴\",\n};\n\nexport function registerMemoryDigest(program: Command): void {\n program\n .command(\"digest\")\n .description(\n \"Generate a Markdown review digest of recently added or updated memories.\\n\\n\" +\n \" Groups memories by type, shows confidence, status, read count, and anchor info.\\n\" +\n \" Each memory has action checkboxes (approve / reject / keep as-is) for peer review.\\n\\n\" +\n \" Use this to do a bulk weekly review of team memories, or share with teammates\\n\" +\n \" as a pull-request attachment so humans can validate what the AI captured.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive memory digest # last 7 days, team scope\\n\" +\n \" haive memory digest --days 30 --scope all # last 30 days, all scopes\\n\" +\n \" haive memory digest --out review.md # write to file\\n\",\n )\n .option(\"--days <n>\", \"look-back window in days (default: 7)\", \"7\")\n .option(\"--scope <scope>\", \"personal | team | module | all (default: team)\", \"team\")\n .option(\"--out <file>\", \"write digest to a file instead of stdout\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: DigestOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.memoriesDir)) {\n ui.error(\"No .ai/memories found. Run `haive init` first.\");\n process.exitCode = 1;\n return;\n }\n\n const days = Math.max(1, Number(opts.days ?? 7));\n const scopeFilter = opts.scope ?? \"team\";\n const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000);\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n\n const recent = all.filter(({ memory: mem }) => {\n const fm = mem.frontmatter;\n if (fm.type === \"session_recap\") return false;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") return false;\n if (scopeFilter !== \"all\" && fm.scope !== scopeFilter) return false;\n return new Date(fm.created_at) >= cutoff;\n });\n\n const now = new Date().toISOString().slice(0, 10);\n const lines: string[] = [\n `# hAIve Memory Digest — ${now}`,\n ``,\n `> **Period:** last ${days} day${days > 1 ? \"s\" : \"\"} | **Scope:** ${scopeFilter} | **Total:** ${recent.length} memor${recent.length === 1 ? \"y\" : \"ies\"}`,\n ``,\n `---`,\n ``,\n ];\n\n if (recent.length === 0) {\n lines.push(`_No new memories in the last ${days} days._`);\n } else {\n // Group by type\n const byType = new Map<string, typeof recent>();\n for (const m of recent) {\n const t = m.memory.frontmatter.type;\n if (!byType.has(t)) byType.set(t, []);\n byType.get(t)!.push(m);\n }\n\n for (const [type, mems] of byType) {\n lines.push(`## ${type.charAt(0).toUpperCase() + type.slice(1)} (${mems.length})`);\n lines.push(``);\n\n for (const { memory: mem } of mems) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const confidence = deriveConfidence(fm, u);\n const emoji = CONFIDENCE_EMOJI[confidence] ?? \"⬜\";\n const anchor = fm.anchor.paths.length > 0\n ? `\\`${fm.anchor.paths[0]}\\`` + (fm.anchor.paths.length > 1 ? ` +${fm.anchor.paths.length - 1}` : \"\")\n : \"_no anchor_\";\n\n lines.push(`### ${emoji} \\`${fm.id}\\``);\n lines.push(``);\n lines.push(`| Field | Value |`);\n lines.push(`|---|---|`);\n lines.push(`| **Status** | \\`${fm.status}\\` |`);\n lines.push(`| **Confidence** | ${confidence} |`);\n lines.push(`| **Scope** | ${fm.scope}${fm.module ? `/${fm.module}` : \"\"} |`);\n lines.push(`| **Tags** | ${fm.tags.length > 0 ? fm.tags.map((t) => `\\`${t}\\``).join(\", \") : \"_none_\"} |`);\n lines.push(`| **Anchor** | ${anchor} |`);\n lines.push(`| **Reads** | ${u.read_count} |`);\n lines.push(`| **Created** | ${fm.created_at.slice(0, 10)} |`);\n lines.push(``);\n // First 6 lines of body\n const bodyPreview = mem.body.split(\"\\n\").slice(0, 6).join(\"\\n\").trim();\n lines.push(bodyPreview);\n lines.push(``);\n lines.push(`**Action:** [ ] approve [ ] reject [ ] keep as-is`);\n lines.push(``);\n lines.push(`---`);\n lines.push(``);\n }\n }\n }\n\n lines.push(``);\n lines.push(\n `> _To take action: \\`haive memory approve <id>\\`, \\`haive memory reject <id>\\`, or open \\`haive tui\\` for interactive review._`,\n );\n\n const digest = lines.join(\"\\n\");\n\n if (opts.out) {\n const outPath = path.resolve(process.cwd(), opts.out);\n await writeFile(outPath, digest, \"utf8\");\n ui.success(`Digest written to ${opts.out} (${recent.length} memor${recent.length === 1 ? \"y\" : \"ies\"})`);\n } else {\n console.log(digest);\n }\n });\n}\n","/**\n * haive session end — save a structured end-of-session recap.\n *\n * Uses topic-upsert: one recap per scope is kept and updated in-place.\n * get_briefing automatically surfaces the latest recap at the next session start.\n */\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n loadMemoriesFromDir,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n type MemoryFrontmatter,\n type MemoryScope,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface SessionEndOptions {\n goal: string;\n accomplished: string;\n discoveries?: string;\n files?: string;\n next?: string;\n scope?: MemoryScope;\n module?: string;\n dir?: string;\n}\n\nfunction buildRecapBody(opts: SessionEndOptions): string {\n const lines: string[] = [];\n lines.push(`## Goal\\n${opts.goal}`);\n lines.push(`\\n## Accomplished\\n${opts.accomplished}`);\n if (opts.discoveries?.trim()) {\n lines.push(`\\n## Discoveries & surprises\\n${opts.discoveries}`);\n }\n const filesTouched = parseCsv(opts.files);\n if (filesTouched.length > 0) {\n lines.push(`\\n## Files touched\\n${filesTouched.map((f) => `- \\`${f}\\``).join(\"\\n\")}`);\n }\n if (opts.next?.trim()) {\n lines.push(`\\n## Next steps\\n${opts.next}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction recapTopic(scope: string, module?: string): string {\n return module ? `session-recap-${scope}-${module}` : `session-recap-${scope}`;\n}\n\nexport function registerSessionEnd(session: Command): void {\n session\n .command(\"end\")\n .description(\n \"Save an end-of-session recap so the NEXT session starts with fresh context.\\n\\n\" +\n \" One recap per scope is kept and updated in-place (topic-upsert). The next\\n\" +\n \" session's get_briefing (or haive briefing) shows it at the very top.\\n\\n\" +\n \" In autopilot mode, a minimal recap saves automatically on MCP server exit.\\n\" +\n \" Calling this manually produces a richer, more actionable recap.\\n\\n\" +\n \" Example:\\n\" +\n \" haive session end \\\\\\\\\\n\" +\n \" --goal \\\"Add Stripe webhook handler\\\" \\\\\\\\\\n\" +\n \" --accomplished \\\"Implemented webhook endpoint, added idempotency key\\\" \\\\\\\\\\n\" +\n \" --discoveries \\\"Missing .env.example entry for STRIPE_WEBHOOK_SECRET\\\" \\\\\\\\\\n\" +\n \" --files src/payments/WebhookController.ts,src/payments/WebhookService.ts \\\\\\\\\\n\" +\n \" --next \\\"Add integration tests for webhook signature validation\\\"\\n\",\n )\n .requiredOption(\"--goal <text>\", \"what you were trying to accomplish (1–2 sentences)\")\n .requiredOption(\"--accomplished <text>\", \"what was actually done (bullet list recommended)\")\n .option(\"--discoveries <text>\", \"bugs, surprises, or inconsistencies found during this session\")\n .option(\"--files <csv>\", \"key files touched, comma-separated (used as anchor for staleness detection)\")\n .option(\"--next <text>\", \"what should happen next (for the next session or a teammate)\")\n .option(\"--scope <scope>\", \"personal | team | module (default: personal)\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: SessionEndOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const scope = opts.scope ?? \"personal\";\n const body = buildRecapBody(opts);\n const topic = recapTopic(scope, opts.module);\n const filesTouched = parseCsv(opts.files);\n\n // Warn about paths that don't exist in project\n const missingPaths = filesTouched.filter((p) => !existsSync(path.resolve(root, p)));\n if (missingPaths.length > 0) {\n ui.warn(`Anchor path${missingPaths.length > 1 ? \"s\" : \"\"} not found in project (will be stale):`);\n for (const p of missingPaths) ui.warn(` ✗ ${p}`);\n }\n\n // ── Topic upsert ────────────────────────────────────────────────\n if (existsSync(paths.memoriesDir)) {\n const existing = await loadMemoriesFromDir(paths.memoriesDir);\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === topic &&\n memory.frontmatter.scope === scope &&\n (!opts.module || memory.frontmatter.module === opts.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const revisionCount = (fm.revision_count ?? 0) + 1;\n const newFrontmatter: MemoryFrontmatter = {\n ...fm,\n revision_count: revisionCount,\n anchor: {\n ...fm.anchor,\n paths: filesTouched.length ? filesTouched : fm.anchor.paths,\n },\n };\n await writeFile(topicMatch.filePath, serializeMemory({ frontmatter: newFrontmatter, body }), \"utf8\");\n ui.success(`Session recap updated (revision #${revisionCount})`);\n ui.info(`id=${fm.id} file=${path.relative(root, topicMatch.filePath)}`);\n return;\n }\n }\n\n // ── Create first recap ──────────────────────────────────────────\n const frontmatter = buildFrontmatter({\n type: \"session_recap\",\n slug: \"recap\",\n scope,\n module: opts.module,\n tags: [\"session\", \"recap\"],\n paths: filesTouched,\n topic,\n status: \"validated\",\n });\n\n const file = memoryFilePath(paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n ui.success(`Session recap created`);\n ui.info(`id=${frontmatter.id} scope=${scope} file=${path.relative(root, file)}`);\n ui.info(\"Next session: call \\`get_briefing\\` — the recap will be surfaced automatically.\");\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n","/**\n * haive snapshot — take or compare an API contract snapshot.\n *\n * haive snapshot --contract openapi.yaml --name payment-api\n * haive snapshot --contract schema.graphql --format graphql\n * haive snapshot --diff --name payment-api\n * haive snapshot --list\n */\nimport { existsSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n diffContract,\n findProjectRoot,\n loadConfig,\n resolveHaivePaths,\n snapshotContract,\n} from \"@hiveai/core\";\nimport type { ContractFile } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface SnapshotOptions {\n contract?: string;\n name?: string;\n format?: string;\n diff?: boolean;\n list?: boolean;\n dir?: string;\n}\n\nexport function registerSnapshot(program: Command): void {\n program\n .command(\"snapshot\")\n .description(\n \"Take or compare an API contract snapshot to detect breaking changes.\\n\\n\" +\n \" A snapshot captures the structure of a contract file (endpoints, types, fields).\\n\" +\n \" Running 'haive sync' automatically checks all configured contracts.\\n\" +\n \" This command lets you snapshot or diff a single contract on demand.\\n\\n\" +\n \" Supported formats: openapi, graphql, proto, typescript, json-schema\\n\\n\" +\n \" Examples:\\n\" +\n \" haive snapshot --contract docs/openapi.yaml --name payment-api\\n\" +\n \" haive snapshot --diff --name payment-api\\n\" +\n \" haive snapshot --list\\n\\n\" +\n \" To monitor contracts automatically on haive sync, add them to haive.config.json:\\n\" +\n \" { \\\"contractFiles\\\": [{ \\\"name\\\": \\\"payment-api\\\", \\\"path\\\": \\\"docs/openapi.yaml\\\", \\\"format\\\": \\\"openapi\\\" }] }\\n\",\n )\n .option(\"--contract <file>\", \"path to the contract file to snapshot (relative to project root)\")\n .option(\"--name <name>\", \"name for this contract (used in the lock file and memories)\")\n .option(\n \"--format <format>\",\n \"contract format: openapi | graphql | proto | typescript | json-schema (auto-detected if omitted)\",\n )\n .option(\"--diff\", \"compare the contract against its stored snapshot\")\n .option(\"--list\", \"list all stored contract snapshots\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: SnapshotOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.haiveDir)) {\n ui.error(\"No .ai/ found. Run `haive init` first.\");\n process.exitCode = 1;\n return;\n }\n\n // haive snapshot --list\n if (opts.list) {\n const contractsDir = path.join(paths.haiveDir, \"contracts\");\n if (!existsSync(contractsDir)) {\n console.log(ui.dim(\"No contract snapshots found.\"));\n return;\n }\n const files = (await readdir(contractsDir)).filter(\n (f) => f.endsWith(\".lock\") && !f.startsWith(\"deps-\"),\n );\n if (files.length === 0) {\n console.log(ui.dim(\"No contract snapshots found.\"));\n return;\n }\n console.log(ui.bold(`Contract snapshots (${files.length}):`));\n for (const f of files) {\n const name = f.replace(\".lock\", \"\");\n console.log(` ${name}`);\n }\n return;\n }\n\n // haive snapshot --diff --name <name>\n if (opts.diff) {\n if (!opts.name) {\n // Try all configured contracts\n const config = await loadConfig(paths);\n const contracts = config.contractFiles ?? [];\n if (contracts.length === 0) {\n ui.error(\"--diff requires --name, or configure contractFiles in haive.config.json\");\n process.exitCode = 1;\n return;\n }\n for (const contract of contracts) {\n await runDiff(root, paths.haiveDir, contract);\n }\n return;\n }\n\n // Diff a named contract (need to know path — check config)\n const config = await loadConfig(paths);\n const configured = (config.contractFiles ?? []).find((c) => c.name === opts.name);\n if (!configured && !opts.contract) {\n ui.error(\n `Contract \"${opts.name}\" not found in haive.config.json and --contract not provided.`,\n );\n process.exitCode = 1;\n return;\n }\n const contract: ContractFile = configured ?? {\n name: opts.name!,\n path: opts.contract!,\n format: detectFormat(opts.contract ?? \"\") ?? \"openapi\",\n };\n await runDiff(root, paths.haiveDir, contract);\n return;\n }\n\n // haive snapshot --contract <file> [--name <name>] [--format <format>]\n if (!opts.contract) {\n ui.error(\"Provide --contract <file> or use --diff / --list.\");\n process.exitCode = 1;\n return;\n }\n\n const contractPath = opts.contract;\n const name = opts.name ?? path.basename(contractPath, path.extname(contractPath));\n const format =\n (opts.format as ContractFile[\"format\"]) ?? detectFormat(contractPath) ?? \"openapi\";\n\n const contract: ContractFile = { name, path: contractPath, format };\n try {\n const snapshot = await snapshotContract(root, paths.haiveDir, contract);\n console.log(ui.green(`✓ snapshot saved: ${name}`));\n if (snapshot.endpoints) {\n console.log(ui.dim(` ${snapshot.endpoints.length} endpoint(s) captured`));\n }\n if (snapshot.types) {\n console.log(ui.dim(` ${snapshot.types.length} type(s) captured`));\n }\n console.log(ui.dim(` lock: .ai/contracts/${name}.lock`));\n console.log(ui.dim(\" Next haive sync will detect changes automatically.\"));\n console.log(\n ui.dim(\n ` Tip: add to haive.config.json → contractFiles to monitor automatically:\\n` +\n ` { \"name\": \"${name}\", \"path\": \"${contractPath}\", \"format\": \"${format}\" }`,\n ),\n );\n } catch (err) {\n ui.error(String(err));\n process.exitCode = 1;\n }\n });\n}\n\nasync function runDiff(\n root: string,\n haiveDir: string,\n contract: ContractFile,\n): Promise<void> {\n try {\n const result = await diffContract(root, haiveDir, contract);\n if (result.unchanged) {\n console.log(ui.green(`✓ ${contract.name}: no changes detected`));\n return;\n }\n const breaking = result.changes.filter((c) => c.severity === \"breaking\");\n const additive = result.changes.filter((c) => c.severity === \"additive\");\n const unknown = result.changes.filter((c) => c.severity === \"unknown\");\n\n console.log(\n ui.bold(`Contract diff: ${contract.name}`) +\n ` — ${breaking.length} breaking · ${additive.length} additive · ${unknown.length} unknown`,\n );\n for (const c of result.changes) {\n const icon = c.severity === \"breaking\" ? \"🔴\" : c.severity === \"additive\" ? \"🟢\" : \"🟡\";\n console.log(` ${icon} ${c.description}`);\n }\n if (breaking.length > 0) {\n console.log(\n ui.yellow(\n \"\\n ⚠ Breaking changes detected — run `haive sync` to create a gotcha memory for your team.\",\n ),\n );\n }\n } catch (err) {\n ui.error(`diff failed for ${contract.name}: ${String(err)}`);\n }\n}\n\nfunction detectFormat(filePath: string): ContractFile[\"format\"] | null {\n const ext = path.extname(filePath).toLowerCase();\n const base = path.basename(filePath).toLowerCase();\n if (ext === \".yaml\" || ext === \".yml\" || ext === \".json\") {\n if (base.includes(\"openapi\") || base.includes(\"swagger\")) return \"openapi\";\n if (base.includes(\"schema\") || base.includes(\"graphql\")) return \"graphql\";\n return \"openapi\"; // default for YAML/JSON\n }\n if (ext === \".graphql\" || ext === \".gql\") return \"graphql\";\n if (ext === \".proto\") return \"proto\";\n if (ext === \".d.ts\" || ext === \".ts\") return \"typescript\";\n return null;\n}\n","/**\n * haive hub — shared team-knowledge hub operations.\n *\n * haive hub pull — import shared memories from the hub into this project\n * haive hub push — export this project's shared memories to the hub\n * haive hub status — show hub sync status (last pull/push, counts)\n * haive hub init <path> — initialize a new hub repo at <path>\n *\n * The hub is a plain git repo with a .ai/ directory.\n * Set hubPath in haive.config.json (relative or absolute path to the hub).\n *\n * Hub memory layout:\n * .ai/memories/shared/<source-project-name>/\n * - memories tagged with the source project name\n * - committed to the hub repo\n *\n * Multiple projects point at the same hub. Each project:\n * - push: writes its `shared`-scoped memories to hub/.ai/memories/shared/<project-name>/\n * - pull: reads from all other projects' shared directories in the hub\n */\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile, copyFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadConfig,\n loadMemoriesFromDir,\n resolveHaivePaths,\n saveConfig,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface HubOptions {\n dir?: string;\n commit?: boolean;\n message?: string;\n}\n\nexport function registerHub(program: Command): void {\n const hub = program\n .command(\"hub\")\n .description(\n \"Manage a shared team-knowledge hub — a central repo that multiple projects contribute to and pull from.\\n\\n\" +\n \" The hub is a plain git repo with a .ai/ directory. Each project pushes its\\n\" +\n \" `shared`-scoped memories to the hub and pulls from all other projects.\\n\\n\" +\n \" Setup:\\n\" +\n \" 1. haive hub init /path/to/team-hub\\n\" +\n \" 2. Add hubPath to .ai/haive.config.json: { \\\"hubPath\\\": \\\"../team-hub\\\" }\\n\" +\n \" 3. haive hub push — publish your shared memories\\n\" +\n \" 4. haive hub pull — import other projects' shared memories\\n\\n\" +\n \" Or configure in haive.config.json and haive sync handles it automatically.\\n\",\n );\n hub.action(() => hub.help());\n\n // haive hub init <path>\n hub\n .command(\"init <hubPath>\")\n .description(\n \"Initialize a new team-knowledge hub repo at <hubPath>.\\n\\n\" +\n \" Creates a git repo with a .ai/ directory structure ready for shared memories.\\n\\n\" +\n \" Example:\\n\" +\n \" haive hub init ../team-hub\\n\" +\n \" haive hub init /srv/git/team-knowledge\\n\",\n )\n .action(async (hubPath: string) => {\n const absPath = path.resolve(hubPath);\n await mkdir(absPath, { recursive: true });\n\n const gitCheck = spawnSync(\"git\", [\"rev-parse\", \"--git-dir\"], { cwd: absPath });\n if (gitCheck.status !== 0) {\n const init = spawnSync(\"git\", [\"init\"], { cwd: absPath, encoding: \"utf8\" });\n if (init.status !== 0) {\n ui.error(`git init failed: ${init.stderr}`);\n process.exitCode = 1;\n return;\n }\n }\n\n const sharedDir = path.join(absPath, \".ai\", \"memories\", \"shared\");\n await mkdir(sharedDir, { recursive: true });\n await writeFile(\n path.join(absPath, \".ai\", \"README.md\"),\n `# hAIve Team Knowledge Hub\\n\\n` +\n `This repo is a shared knowledge hub for hAIve.\\n\\n` +\n `Each project contributes its \\`shared\\`-scoped memories here.\\n` +\n `Other projects pull from it via \\`haive hub pull\\`.\\n\\n` +\n `## Structure\\n\\n` +\n \"`\" + \"`.ai/memories/shared/<project-name>/`\\n\\n\" +\n `## Usage\\n\\n` +\n \"```bash\\n\" +\n \"haive hub push # publish from a project\\n\" +\n \"haive hub pull # import into a project\\n\" +\n \"```\\n\",\n \"utf8\",\n );\n await writeFile(\n path.join(absPath, \".gitignore\"),\n \".ai/.cache/\\n.ai/memories/personal/\\n\",\n \"utf8\",\n );\n\n spawnSync(\"git\", [\"add\", \".\"], { cwd: absPath });\n spawnSync(\"git\", [\"commit\", \"-m\", \"chore: initialize hAIve team-knowledge hub\"], {\n cwd: absPath,\n encoding: \"utf8\",\n });\n\n console.log(ui.green(`✓ Hub initialized at ${absPath}`));\n console.log(\n ui.dim(\n `\\nNext steps:\\n` +\n ` 1. Add hubPath to your project's .ai/haive.config.json:\\n` +\n ` { \"hubPath\": \"${path.relative(process.cwd(), absPath)}\" }\\n` +\n ` 2. Run \\`haive hub push\\` to publish your shared memories\\n` +\n ` 3. Share ${absPath} with teammates (git remote, NFS, etc.)\\n`,\n ),\n );\n });\n\n // haive hub push\n hub\n .command(\"push\")\n .description(\n \"Push this project's shared-scoped memories to the hub.\\n\\n\" +\n \" Copies all memories with scope=shared to hub/.ai/memories/shared/<project-name>/.\\n\" +\n \" Optionally commits to the hub repo.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive hub push\\n\" +\n \" haive hub push --commit\\n\" +\n \" haive hub push --commit --message \\\"feat: add payment API contract memories\\\"\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--commit\", \"auto-commit to the hub repo after pushing\")\n .option(\"--message <msg>\", \"commit message for the hub (used with --commit)\")\n .action(async (opts: HubOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const config = await loadConfig(paths);\n\n if (!config.hubPath) {\n ui.error(\n \"hubPath not configured in .ai/haive.config.json.\\n\" +\n \" Add: { \\\"hubPath\\\": \\\"../team-hub\\\" }\\n\" +\n \" Or run: haive hub init <path> first.\",\n );\n process.exitCode = 1;\n return;\n }\n\n const hubRoot = path.resolve(root, config.hubPath);\n if (!existsSync(hubRoot)) {\n ui.error(`Hub not found at ${hubRoot}. Run \\`haive hub init ${config.hubPath}\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n // Project name = directory name\n const projectName = path.basename(root);\n const destDir = path.join(hubRoot, \".ai\", \"memories\", \"shared\", projectName);\n await mkdir(destDir, { recursive: true });\n\n // Load shared-scoped memories\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const shared = all.filter(\n ({ memory }) =>\n memory.frontmatter.scope === \"shared\" &&\n memory.frontmatter.status !== \"rejected\" &&\n memory.frontmatter.status !== \"deprecated\" &&\n // Don't push imported memories (avoid echo loops)\n !memory.frontmatter.tags.some((t) => t.startsWith(\"cross-repo:\")),\n );\n\n if (shared.length === 0) {\n ui.warn(\n \"No shared-scoped memories found. Create memories with scope=shared to push to the hub.\\n\" +\n \" Example: haive memory add --type architecture --slug my-api --scope shared --body \\\"...\\\"\\n\" +\n \" Or with MCP: mem_save({ scope: 'shared', ... })\",\n );\n return;\n }\n\n let pushed = 0;\n for (const { memory } of shared) {\n const fm = memory.frontmatter;\n const fileName = `${fm.id}.md`;\n const destPath = path.join(destDir, fileName);\n await writeFile(destPath, serializeMemory(memory), \"utf8\");\n pushed++;\n }\n\n console.log(ui.green(`✓ Pushed ${pushed} shared memor${pushed === 1 ? \"y\" : \"ies\"} to hub`));\n console.log(ui.dim(` Location: ${destDir}`));\n\n if (opts.commit) {\n const message =\n opts.message ?? `haive: sync shared memories from ${projectName} (${pushed} memories)`;\n spawnSync(\"git\", [\"add\", path.join(\".ai\", \"memories\", \"shared\", projectName)], {\n cwd: hubRoot,\n });\n const commit = spawnSync(\"git\", [\"commit\", \"-m\", message], {\n cwd: hubRoot,\n encoding: \"utf8\",\n });\n if (commit.status === 0) {\n console.log(ui.green(`✓ Committed to hub: \"${message}\"`));\n } else if (commit.stdout?.includes(\"nothing to commit\")) {\n console.log(ui.dim(\" Hub already up to date — nothing to commit.\"));\n } else {\n ui.warn(`git commit in hub failed: ${commit.stderr}`);\n }\n } else {\n console.log(\n ui.dim(\n \" Tip: use --commit to auto-commit to the hub repo, or commit manually.\",\n ),\n );\n }\n });\n\n // haive hub pull\n hub\n .command(\"pull\")\n .description(\n \"Pull shared memories from the hub into this project.\\n\\n\" +\n \" Imports all memories from hub/.ai/memories/shared/ EXCEPT this project's own.\\n\" +\n \" Imported memories land in .ai/memories/shared/<source-project-name>/.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive hub pull\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: { dir?: string }) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const config = await loadConfig(paths);\n\n if (!config.hubPath) {\n ui.error(\n \"hubPath not configured in .ai/haive.config.json.\\n\" +\n \" Add: { \\\"hubPath\\\": \\\"../team-hub\\\" }\\n\" +\n \" Or run: haive hub init <path> first.\",\n );\n process.exitCode = 1;\n return;\n }\n\n const hubRoot = path.resolve(root, config.hubPath);\n const hubSharedDir = path.join(hubRoot, \".ai\", \"memories\", \"shared\");\n\n if (!existsSync(hubSharedDir)) {\n ui.warn(\"Hub has no shared memories yet. Run `haive hub push` from other projects first.\");\n return;\n }\n\n const projectName = path.basename(root);\n const { readdir } = await import(\"node:fs/promises\");\n const projectDirs = (await readdir(hubSharedDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory() && d.name !== projectName)\n .map((d) => d.name);\n\n if (projectDirs.length === 0) {\n console.log(ui.dim(\"No other projects have pushed to the hub yet.\"));\n return;\n }\n\n let totalImported = 0;\n let totalUpdated = 0;\n\n for (const sourceName of projectDirs) {\n const sourceDir = path.join(hubSharedDir, sourceName);\n const destDir = path.join(paths.memoriesDir, \"shared\", sourceName);\n await mkdir(destDir, { recursive: true });\n\n const sourceFiles = (await readdir(sourceDir)).filter((f) => f.endsWith(\".md\"));\n const { loadMemoriesFromDir: loadDir } = await import(\"@hiveai/core\");\n const existingInDest = await loadDir(destDir);\n const existingIds = new Set(existingInDest.map(({ memory }) => memory.frontmatter.id));\n\n for (const file of sourceFiles) {\n const srcPath = path.join(sourceDir, file);\n const destPath = path.join(destDir, file);\n\n // Tag with hub provenance\n const fileContent = await readFile(srcPath, \"utf8\");\n const alreadyTagged = fileContent.includes(`cross-repo:${sourceName}`);\n\n if (!alreadyTagged) {\n // Add provenance tag by copying as-is (the original already has cross-repo tags from push)\n await copyFile(srcPath, destPath);\n } else {\n await copyFile(srcPath, destPath);\n }\n\n const memId = file.replace(\".md\", \"\");\n if (existingIds.has(memId)) {\n totalUpdated++;\n } else {\n totalImported++;\n }\n }\n\n console.log(\n ui.dim(` [${sourceName}]: ${sourceFiles.length} memor${sourceFiles.length === 1 ? \"y\" : \"ies\"} synced`),\n );\n }\n\n console.log(\n ui.green(`✓ Hub pull complete: ${totalImported} new · ${totalUpdated} updated`),\n );\n });\n\n // haive hub status\n hub\n .command(\"status\")\n .description(\"Show hub sync status.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: { dir?: string }) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const config = await loadConfig(paths);\n\n console.log(ui.bold(\"Hub status\"));\n console.log(\n ` hubPath: ${config.hubPath ? ui.green(config.hubPath) : ui.dim(\"not configured\")}`,\n );\n\n const sharedDir = path.join(paths.memoriesDir, \"shared\");\n if (existsSync(sharedDir)) {\n const { readdir } = await import(\"node:fs/promises\");\n const sources = (await readdir(sharedDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name);\n console.log(`\\n Imported from ${sources.length} source(s):`);\n for (const src of sources) {\n const files = (await readdir(path.join(sharedDir, src))).filter((f) => f.endsWith(\".md\"));\n console.log(` ${src}: ${files.length} memor${files.length === 1 ? \"y\" : \"ies\"}`);\n }\n } else {\n console.log(ui.dim(\" No imported shared memories yet.\"));\n }\n\n // Count outgoing shared memories\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const outgoing = all.filter(\n ({ memory }) =>\n memory.frontmatter.scope === \"shared\" &&\n !memory.frontmatter.tags.some((t) => t.startsWith(\"cross-repo:\")),\n );\n console.log(`\\n This project's shared memories (ready to push): ${outgoing.length}`);\n if (outgoing.length > 0) {\n console.log(ui.dim(\" Run `haive hub push` to publish them to the hub.\"));\n }\n\n void readFile; void writeFile; void saveConfig; // imported for side effects\n });\n}\n","import { Command } from \"commander\";\nimport {\n aggregateUsage,\n findProjectRoot,\n parseSince,\n readUsageEvents,\n resolveHaivePaths,\n usageLogSize,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface StatsOptions {\n since?: string;\n json?: boolean;\n dir?: string;\n}\n\nexport function registerStats(program: Command): void {\n program\n .command(\"stats\")\n .description(\"Show MCP tool-usage stats over a window (e.g. --since 7d).\")\n .option(\"--since <window>\", \"ISO date or relative (e.g. '7d', '24h', '30m')\", \"30d\")\n .option(\"--json\", \"emit JSON instead of human-readable output\", false)\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: StatsOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n const size = await usageLogSize(paths);\n if (!size.exists) {\n if (opts.json) {\n console.log(JSON.stringify({ error: \"no_usage_log\" }));\n return;\n }\n ui.warn(\n `No usage log found at ${root}. ` +\n `Stats are populated as the MCP server logs each tool call. ` +\n `Run a session first, then re-check.`,\n );\n return;\n }\n\n const events = await readUsageEvents(paths);\n const since = parseSince(opts.since);\n const aggregate = aggregateUsage(events, since ?? undefined);\n\n if (opts.json) {\n console.log(JSON.stringify(aggregate, null, 2));\n return;\n }\n\n const window = opts.since ?? \"all time\";\n console.log(ui.bold(`hAIve usage stats (${window})`));\n console.log(\n ` ${ui.dim(\"total calls:\")} ${aggregate.total} ` +\n `${ui.dim(\"unique tools:\")} ${aggregate.by_tool.length} ` +\n `${ui.dim(\"log lines:\")} ${size.lines}`,\n );\n if (aggregate.window_start) {\n console.log(\n ` ${ui.dim(\"window:\")} ${aggregate.window_start.slice(0, 19)} → ${aggregate.window_end?.slice(0, 19)}`,\n );\n }\n if (aggregate.by_tool.length === 0) {\n ui.info(`No events in window. Try a wider --since (current: ${window}).`);\n return;\n }\n console.log();\n console.log(ui.bold(\"Top tools:\"));\n const maxCount = aggregate.by_tool[0]?.count ?? 1;\n for (const t of aggregate.by_tool.slice(0, 20)) {\n const bar = \"█\".repeat(Math.max(1, Math.round((t.count / maxCount) * 30)));\n const pct = ((t.count / aggregate.total) * 100).toFixed(1);\n console.log(\n ` ${t.tool.padEnd(28)} ${ui.green(bar)} ${ui.bold(String(t.count))} ` +\n `${ui.dim(`(${pct}%, last ${t.last_used.slice(0, 19)})`)}`,\n );\n }\n });\n}\n","import { performance } from \"node:perf_hooks\";\nimport { Command } from \"commander\";\nimport {\n estimateTokens,\n findProjectRoot,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport {\n antiPatternsCheck,\n codeMapTool,\n codeSearch,\n getBriefing,\n getRecap,\n memRelevantTo,\n} from \"@hiveai/mcp\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface BenchOptions {\n task?: string;\n json?: boolean;\n dir?: string;\n}\n\ninterface ScenarioResult {\n name: string;\n ok: boolean;\n latency_ms: number;\n payload_tokens: number;\n notes: string[];\n}\n\nexport function registerBench(program: Command): void {\n program\n .command(\"bench\")\n .description(\"Self-test the local hAIve setup: runs core MCP tools against this project and reports latency + payload size.\")\n .option(\"-t, --task <task>\", \"task description for ranking-aware tools\", \"audit dependencies for security risks\")\n .option(\"--json\", \"emit JSON instead of a table\", false)\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: BenchOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const ctx = { paths };\n const task = opts.task ?? \"audit dependencies for security risks\";\n\n const scenarios: Array<() => Promise<ScenarioResult>> = [\n async () => {\n const t0 = performance.now();\n const out = await getBriefing(\n {\n task,\n files: [],\n max_tokens: 4000,\n max_memories: 8,\n include_project_context: true,\n include_module_contexts: true,\n semantic: true,\n include_stale: false,\n track: false,\n format: \"compact\",\n symbols: [],\n min_semantic_score: 0,\n },\n ctx,\n );\n return summarize(\"get_briefing(compact)\", t0, out, [\n out.low_value ? \"low_value (cold-start)\" : `${out.memories.length} memories`,\n `search=${out.search_mode}`,\n ]);\n },\n async () => {\n const t0 = performance.now();\n const out = await codeMapTool({ paths: [], max_files: 40, max_tokens: 2000 }, ctx);\n return summarize(\"code_map(budget=2k)\", t0, out, [\n out.available ? `${out.files.length}/${out.total_files} files` : \"unavailable\",\n out.budget_clipped ? \"clipped\" : \"fits\",\n ]);\n },\n async () => {\n const t0 = performance.now();\n const out = await getRecap({ scope: \"any\" }, ctx);\n return summarize(\"get_recap\", t0, out, [\n out.recap ? `${out.recap.id.slice(0, 30)}…` : \"no recap\",\n ]);\n },\n async () => {\n const t0 = performance.now();\n const out = await memRelevantTo(\n { task, files: [], limit: 8, min_semantic_score: 0.25, format: \"compact\" },\n ctx,\n );\n return summarize(\"mem_relevant_to\", t0, out, [\n `${out.memories.length} memories`,\n `search=${out.search_mode}`,\n ]);\n },\n async () => {\n const t0 = performance.now();\n const out = await codeSearch({ query: task, k: 5, min_score: 0.2 }, ctx);\n return summarize(\"code_search\", t0, out, [\n out.available ? `${out.hits.length} hits` : \"needs index (haive index code-search)\",\n ]);\n },\n async () => {\n const t0 = performance.now();\n const out = await antiPatternsCheck({ diff: task, paths: [], limit: 5, semantic: true }, ctx);\n return summarize(\"anti_patterns_check\", t0, out, [\n `${out.warnings.length}/${out.scanned} warn`,\n ]);\n },\n ];\n\n const results: ScenarioResult[] = [];\n for (const run of scenarios) {\n try {\n results.push(await run());\n } catch (err) {\n results.push({\n name: \"(error)\",\n ok: false,\n latency_ms: 0,\n payload_tokens: 0,\n notes: [err instanceof Error ? err.message : String(err)],\n });\n }\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ root, task, scenarios: results }, null, 2));\n return;\n }\n\n console.log(ui.bold(`hAIve bench — ${root}`));\n console.log(ui.dim(`task: ${task}`));\n console.log();\n console.log(\n `${\"scenario\".padEnd(28)} ${\"latency\".padStart(8)} ${\"tokens\".padStart(7)} notes`,\n );\n console.log(\"─\".repeat(88));\n for (const r of results) {\n const status = r.ok ? ui.green(\"✓\") : ui.red(\"✗\");\n console.log(\n `${status} ${r.name.padEnd(26)} ${`${r.latency_ms.toFixed(0)} ms`.padStart(8)} ${String(r.payload_tokens).padStart(7)} ${r.notes.join(\"; \")}`,\n );\n }\n\n const totalTokens = results.reduce((s, r) => s + r.payload_tokens, 0);\n const totalMs = results.reduce((s, r) => s + r.latency_ms, 0);\n console.log(\"─\".repeat(88));\n console.log(\n `${ui.dim(\"totals:\")} ${`${totalMs.toFixed(0)} ms`.padStart(8)} ${String(totalTokens).padStart(7)}`,\n );\n });\n}\n\nfunction summarize(\n name: string,\n t0: number,\n payload: unknown,\n notes: string[],\n): ScenarioResult {\n return {\n name,\n ok: true,\n latency_ms: performance.now() - t0,\n payload_tokens: estimateTokens(JSON.stringify(payload)),\n notes,\n };\n}\n","import { Command } from \"commander\";\nimport {\n aggregateUsage,\n findProjectRoot,\n parseSince,\n readUsageEvents,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface SuggestOptions {\n since?: string;\n min?: string;\n json?: boolean;\n dir?: string;\n}\n\nconst SEARCH_TOOLS = new Set([\n \"mem_search\",\n \"code_search\",\n \"mem_relevant_to\",\n \"get_briefing\",\n]);\n\ninterface QuerySuggestion {\n query: string;\n count: number;\n tools: string[];\n last_used: string;\n reason: string;\n}\n\nexport function registerMemorySuggest(memory: Command): void {\n memory\n .command(\"suggest\")\n .description(\"Suggest memories to create based on recurring search queries in the usage log.\")\n .option(\"--since <window>\", \"ISO date or relative (e.g. '7d', '24h')\", \"30d\")\n .option(\"--min <count>\", \"minimum repeat count to surface a query\", \"2\")\n .option(\"--json\", \"emit JSON instead of human-readable output\", false)\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: SuggestOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const events = await readUsageEvents(paths);\n if (events.length === 0) {\n if (opts.json) {\n console.log(JSON.stringify({ suggestions: [] }));\n return;\n }\n ui.warn(\"No usage log entries yet. Suggestions appear after the MCP server records some calls.\");\n return;\n }\n\n const since = parseSince(opts.since);\n const minCount = Math.max(1, parseInt(opts.min ?? \"2\", 10));\n const cutoff = since ? since.getTime() : 0;\n\n const queries = new Map<string, { count: number; tools: Set<string>; last: string }>();\n for (const e of events) {\n if (cutoff && Date.parse(e.at) < cutoff) continue;\n if (!SEARCH_TOOLS.has(e.tool)) continue;\n const key = (e.summary ?? \"\").toLowerCase().trim();\n if (!key) continue;\n const prior = queries.get(key);\n if (prior) {\n prior.count++;\n prior.tools.add(e.tool);\n if (e.at > prior.last) prior.last = e.at;\n } else {\n queries.set(key, { count: 1, tools: new Set([e.tool]), last: e.at });\n }\n }\n\n const suggestions: QuerySuggestion[] = [...queries.entries()]\n .filter(([, v]) => v.count >= minCount)\n .map(([query, v]) => ({\n query,\n count: v.count,\n tools: [...v.tools].sort(),\n last_used: v.last,\n reason: chooseReason(v.tools, v.count),\n }))\n .sort((a, b) => b.count - a.count);\n\n if (opts.json) {\n console.log(JSON.stringify({ window: opts.since, suggestions }, null, 2));\n return;\n }\n\n const totals = aggregateUsage(events, since ?? undefined);\n console.log(ui.bold(`hAIve memory suggestions (${opts.since ?? \"all time\"})`));\n console.log(\n ui.dim(`scanned ${totals.total} events, ${suggestions.length} repeated queries (≥${minCount})`),\n );\n console.log();\n if (suggestions.length === 0) {\n ui.info(\"No recurring searches yet — nothing to suggest.\");\n return;\n }\n for (const s of suggestions.slice(0, 30)) {\n console.log(\n ` ${ui.bold(`×${s.count}`)} ${ui.dim(`[${s.tools.join(\",\")}]`)} ${truncate(s.query, 70)}`,\n );\n console.log(` ${ui.dim(\"→\")} ${s.reason}`);\n }\n });\n}\n\nfunction chooseReason(tools: Set<string>, count: number): string {\n if (tools.has(\"code_search\")) {\n return `${count} agents searched the code for this — consider mem_save (architecture/decision) capturing where it lives.`;\n }\n if (tools.has(\"mem_search\") || tools.has(\"mem_relevant_to\")) {\n return `${count} agents asked but the memory layer had no clear answer — consider mem_save (convention/decision/gotcha).`;\n }\n return `${count} agents asked the briefing for this — consider promoting the answer to a team memory.`;\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 1) + \"…\";\n}\n"],"mappings":"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","names":["Command","program","findProjectRoot","program","existsSync","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","path","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","path","existsSync","path","buildCodeMap","resolveHaivePaths","saveCodeMap","program","path","resolveHaivePaths","existsSync","buildCodeMap","saveCodeMap","mkdir","writeFile","readFile","existsSync","path","findProjectRoot","program","findProjectRoot","path","existsSync","mkdir","readFile","writeFile","existsSync","path","findProjectRoot","require","program","findProjectRoot","path","existsSync","spawnSync","readFile","writeFile","mkdir","existsSync","path","findProjectRoot","loadCodeMap","loadMemoriesFromDir","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memory","writeFile","path","mkdir","loadCodeMap","spawnSync","buildCodeMap","saveCodeMap","readFile","mkdir","readFile","writeFile","existsSync","path","buildFrontmatter","findProjectRoot","loadMemoriesFromDir","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","parseCsv","path","readFile","loadMemoriesFromDir","writeFile","serializeMemory","buildFrontmatter","mkdir","existsSync","path","findProjectRoot","resolveHaivePaths","loadMemoriesFromDir","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","mkdir","writeFile","existsSync","path","findProjectRoot","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memoryFilePath","mkdir","path","writeFile","serializeMemory","existsSync","writeFile","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","found","next","writeFile","serializeMemory","path","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","parseCsv","writeFile","serializeMemory","path","writeFile","existsSync","path","DEFAULT_AUTO_PROMOTE_RULE","findProjectRoot","getUsage","isAutoPromoteEligible","loadUsageIndex","resolveHaivePaths","serializeMemory","memory","DEFAULT_AUTO_PROMOTE_RULE","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","isAutoPromoteEligible","getUsage","path","writeFile","serializeMemory","spawn","existsSync","readFile","path","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","readFile","spawn","existsSync","path","findProjectRoot","getUsage","inferModulesFromPaths","loadUsageIndex","memoryMatchesAnchorPaths","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","inferModulesFromPaths","memoryMatchesAnchorPaths","getUsage","path","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","mkdir","writeFile","existsSync","path","buildFrontmatter","findProjectRoot","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","buildFrontmatter","parseCsv","memoryFilePath","mkdir","path","writeFile","serializeMemory","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","existsSync","path","findProjectRoot","literalMatchesAllTokens","literalMatchesAnyToken","resolveHaivePaths","tokenizeQuery","trackReads","memory","findProjectRoot","resolveHaivePaths","existsSync","tokenizeQuery","loadMemoriesFromDir","literalMatchesAllTokens","literalMatchesAnyToken","path","trackReads","writeFile","existsSync","findProjectRoot","loadUsageIndex","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","writeFile","serializeMemory","loadUsageIndex","existsSync","unlink","path","findProjectRoot","loadUsageIndex","resolveHaivePaths","saveUsageIndex","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","unlink","loadUsageIndex","saveUsageIndex","existsSync","readFile","path","deriveConfidence","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","readFile","loadUsageIndex","getUsage","deriveConfidence","path","existsSync","path","deriveConfidence","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","deriveConfidence","path","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","verifyAnchor","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","verifyAnchor","path","writeFile","serializeMemory","readFile","existsSync","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","readFile","existsSync","readFile","mkdir","writeFile","path","buildFrontmatter","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","path","existsSync","readFile","mkdir","buildFrontmatter","writeFile","serializeMemory","existsSync","writeFile","path","deriveConfidence","findProjectRoot","getUsage","loadMemoriesFromDir","loadUsageIndex","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","deriveConfidence","path","writeFile","writeFile","mkdir","existsSync","path","buildFrontmatter","findProjectRoot","loadMemoriesFromDir","memoryFilePath","resolveHaivePaths","serializeMemory","parseCsv","session","findProjectRoot","resolveHaivePaths","existsSync","path","loadMemoriesFromDir","memory","writeFile","serializeMemory","buildFrontmatter","memoryFilePath","mkdir","existsSync","path","findProjectRoot","loadConfig","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","path","name","config","loadConfig","contract","existsSync","mkdir","readFile","writeFile","path","spawnSync","findProjectRoot","loadConfig","loadMemoriesFromDir","resolveHaivePaths","saveConfig","serializeMemory","program","path","mkdir","spawnSync","writeFile","findProjectRoot","resolveHaivePaths","loadConfig","existsSync","loadMemoriesFromDir","memory","serializeMemory","readdir","readFile","saveConfig","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","aggregateUsage","findProjectRoot","parseSince","readUsageEvents","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","readUsageEvents","parseSince","aggregateUsage","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/briefing.ts","../src/utils/ui.ts","../src/commands/tui.ts","../src/commands/embeddings.ts","../src/commands/index-code.ts","../src/commands/init.ts","../src/commands/init-bootstrap.ts","../src/commands/init-mcp-setup.ts","../src/commands/init-stack-packs.ts","../src/commands/install-hooks.ts","../src/commands/mcp.ts","../src/commands/sync.ts","../src/commands/memory-add.ts","../src/commands/memory-list.ts","../src/utils/fs.ts","../src/commands/memory-promote.ts","../src/commands/memory-approve.ts","../src/commands/memory-update.ts","../src/commands/memory-auto-promote.ts","../src/commands/memory-edit.ts","../src/commands/memory-for-files.ts","../src/commands/memory-hot.ts","../src/commands/memory-tried.ts","../src/commands/memory-pending.ts","../src/commands/memory-query.ts","../src/commands/memory-reject.ts","../src/commands/memory-rm.ts","../src/commands/memory-show.ts","../src/commands/memory-stats.ts","../src/commands/memory-verify.ts","../src/commands/memory-import.ts","../src/commands/memory-import-changelog.ts","../src/commands/memory-digest.ts","../src/commands/session-end.ts","../src/commands/snapshot.ts","../src/commands/hub.ts","../src/commands/stats.ts","../src/commands/bench.ts","../src/commands/memory-suggest.ts","../src/commands/memory-archive.ts","../src/commands/doctor.ts","../src/commands/playback.ts","../src/commands/precommit.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { registerBriefing } from \"./commands/briefing.js\";\nimport { registerTui } from \"./commands/tui.js\";\nimport { registerEmbeddings } from \"./commands/embeddings.js\";\nimport { registerIndexCode } from \"./commands/index-code.js\";\nimport { registerInit } from \"./commands/init.js\";\nimport { registerInstallHooks } from \"./commands/install-hooks.js\";\nimport { registerMcp } from \"./commands/mcp.js\";\nimport { registerSync } from \"./commands/sync.js\";\nimport { registerMemoryAdd } from \"./commands/memory-add.js\";\nimport { registerMemoryList } from \"./commands/memory-list.js\";\nimport { registerMemoryPromote } from \"./commands/memory-promote.js\";\nimport { registerMemoryApprove } from \"./commands/memory-approve.js\";\nimport { registerMemoryUpdate } from \"./commands/memory-update.js\";\nimport { registerMemoryAutoPromote } from \"./commands/memory-auto-promote.js\";\nimport { registerMemoryEdit } from \"./commands/memory-edit.js\";\nimport { registerMemoryForFiles } from \"./commands/memory-for-files.js\";\nimport { registerMemoryHot } from \"./commands/memory-hot.js\";\nimport { registerMemoryTried } from \"./commands/memory-tried.js\";\nimport { registerMemoryPending } from \"./commands/memory-pending.js\";\nimport { registerMemoryQuery } from \"./commands/memory-query.js\";\nimport { registerMemoryReject } from \"./commands/memory-reject.js\";\nimport { registerMemoryRm } from \"./commands/memory-rm.js\";\nimport { registerMemoryShow } from \"./commands/memory-show.js\";\nimport { registerMemoryStats } from \"./commands/memory-stats.js\";\nimport { registerMemoryVerify } from \"./commands/memory-verify.js\";\nimport { registerMemoryImport } from \"./commands/memory-import.js\";\nimport { registerMemoryImportChangelog } from \"./commands/memory-import-changelog.js\";\nimport { registerMemoryDigest } from \"./commands/memory-digest.js\";\nimport { registerSessionEnd } from \"./commands/session-end.js\";\nimport { registerSnapshot } from \"./commands/snapshot.js\";\nimport { registerHub } from \"./commands/hub.js\";\nimport { registerStats } from \"./commands/stats.js\";\nimport { registerBench } from \"./commands/bench.js\";\nimport { registerMemorySuggest } from \"./commands/memory-suggest.js\";\nimport { registerMemoryArchive } from \"./commands/memory-archive.js\";\nimport { registerDoctor } from \"./commands/doctor.js\";\nimport { registerPlayback } from \"./commands/playback.js\";\nimport { registerPrecommit } from \"./commands/precommit.js\";\n\nconst program = new Command();\n\ndeclare const __HAIVE_VERSION__: string;\n\nprogram\n .name(\"haive\")\n .description(\"hAIve — team-first persistent memory layer for AI coding agents\")\n .version(__HAIVE_VERSION__);\n\nregisterInit(program);\nregisterMcp(program);\nregisterBriefing(program);\nregisterTui(program);\nregisterEmbeddings(program);\nregisterSync(program);\nregisterInstallHooks(program);\nregisterIndexCode(program);\n\nconst memory = program.command(\"memory\").description(\"Manage memory entries\");\nregisterMemoryAdd(memory);\nregisterMemoryList(memory);\nregisterMemoryQuery(memory);\nregisterMemoryPromote(memory);\nregisterMemoryVerify(memory);\nregisterMemoryStats(memory);\nregisterMemoryReject(memory);\nregisterMemoryAutoPromote(memory);\nregisterMemoryForFiles(memory);\nregisterMemoryShow(memory);\nregisterMemoryEdit(memory);\nregisterMemoryRm(memory);\nregisterMemoryPending(memory);\nregisterMemoryApprove(memory);\nregisterMemoryUpdate(memory);\nregisterMemoryHot(memory);\nregisterMemoryTried(memory);\nregisterMemoryImport(memory);\nregisterMemoryImportChangelog(memory);\nregisterMemoryDigest(memory);\nregisterMemorySuggest(memory);\nregisterMemoryArchive(memory);\n\nconst session = program.command(\"session\").description(\"Manage session lifecycle\");\nregisterSessionEnd(session);\n\nregisterSnapshot(program);\nregisterHub(program);\nregisterStats(program);\nregisterBench(program);\nregisterDoctor(program);\nregisterPlayback(program);\nregisterPrecommit(program);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n if (isZodError(err)) {\n for (const issue of err.issues) {\n const field = issue.path.length > 0 ? `${String(issue.path.join(\".\"))}: ` : \"\";\n console.error(`\\x1b[31m✗\\x1b[0m ${field}${issue.message}`);\n }\n } else {\n console.error(err instanceof Error ? err.message : err);\n }\n process.exit(1);\n});\n\nfunction isZodError(\n err: unknown,\n): err is { issues: Array<{ path: unknown[]; message: string }> } {\n return (\n err !== null &&\n typeof err === \"object\" &&\n \"issues\" in err &&\n Array.isArray((err as Record<string, unknown>).issues)\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadCodeMap,\n loadMemoriesFromDir,\n memoryMatchesAnchorPaths,\n queryCodeMap,\n resolveHaivePaths,\n tokenizeQuery,\n trackReads,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface BriefingOptions {\n task?: string;\n files?: string;\n symbols?: string;\n maxMemories?: string;\n scope?: string;\n includeDraft?: boolean;\n includeStale?: boolean;\n dir?: string;\n include?: string[];\n}\n\nexport function registerBriefing(program: Command): void {\n program\n .command(\"briefing\")\n .description(\n \"Print the full project briefing: last session recap + project context + relevant memories.\\n\" +\n \" Equivalent to calling get_briefing via MCP. Run before starting any task.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive briefing\\n\" +\n \" haive briefing --task \\\"add Stripe payment\\\" --files src/payments/PaymentService.ts\\n\" +\n \" haive briefing --symbols PaymentService,TenantFilter # look up where symbols live\\n\",\n )\n .option(\"--task <text>\", \"what you are about to do — filters memories by relevance\")\n .option(\"--files <csv>\", \"comma-separated file paths being worked on (surfaces anchored memories)\")\n .option(\"--symbols <csv>\", \"symbol names to look up in the code-map (e.g. PaymentService,TenantFilter) — requires haive index code\")\n .option(\"--max-memories <n>\", \"cap on memories surfaced\", \"10\")\n .option(\n \"--scope <scope>\",\n \"personal | team | shared | all (default: all — includes team + shared cross-repo memories)\",\n \"all\",\n )\n .option(\"--include-draft\", \"include draft memories (excluded by default)\")\n .option(\"--include-stale\", \"include stale memories (excluded by default — may be outdated)\")\n .option(\n \"--include <path>\",\n \"merge memories from another haive-initialized project (repeatable). \" +\n \"Useful for teams with multiple coordinated repos (e.g. backend + frontend).\",\n collectInclude,\n [] as string[],\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: BriefingOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.memoriesDir)) {\n // No memories yet — just print project context and exit\n if (existsSync(paths.projectContext)) {\n console.log(`${ui.bold(\"=== Project Context ===\")}\\n`);\n console.log((await readFile(paths.projectContext, \"utf8\")).trim());\n } else {\n ui.warn(\"No project-context.md found. Run `haive init` and the `bootstrap_project` MCP prompt to set it up.\");\n }\n return;\n }\n\n type LoadedWithOrigin = Awaited<ReturnType<typeof loadMemoriesFromDir>>[number] & { origin?: string };\n const ownMemories: LoadedWithOrigin[] = await loadMemoriesFromDir(paths.memoriesDir);\n\n // Multi-project aggregation: merge memories from --include <path> projects.\n const externalRoots: string[] = [];\n if (opts.include && opts.include.length > 0) {\n for (const includePath of opts.include) {\n try {\n const otherRoot = findProjectRoot(includePath);\n if (otherRoot === root) continue; // skip self\n const otherPaths = resolveHaivePaths(otherRoot);\n if (!existsSync(otherPaths.memoriesDir)) {\n ui.warn(`--include ${includePath}: no .ai/memories at ${otherRoot} — skipping`);\n continue;\n }\n const otherMemories = await loadMemoriesFromDir(otherPaths.memoriesDir);\n const tag = path.basename(otherRoot);\n for (const m of otherMemories) {\n ownMemories.push({ ...m, origin: tag });\n }\n externalRoots.push(`${tag} (${otherMemories.length})`);\n } catch (err) {\n ui.warn(`--include ${includePath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n if (externalRoots.length > 0) {\n ui.info(`merged from: ${externalRoots.join(\", \")}`);\n console.log();\n }\n }\n\n const all = ownMemories;\n const filePaths = parseCsv(opts.files);\n const tokens = opts.task ? tokenizeQuery(opts.task) : null;\n const maxMemories = Math.max(1, Number(opts.maxMemories ?? 10));\n const scopeFilter = opts.scope ?? \"all\";\n\n // ── 1. Session recap — always shown first so agents start with fresh context ──\n const recaps = all\n .filter(({ memory: mem }) => mem.frontmatter.type === \"session_recap\")\n .sort((a, b) =>\n new Date(b.memory.frontmatter.created_at).getTime() -\n new Date(a.memory.frontmatter.created_at).getTime(),\n );\n if (recaps.length > 0) {\n const recap = recaps[0]!;\n const fm = recap.memory.frontmatter;\n const rev = fm.revision_count ? ` · revision #${fm.revision_count}` : \"\";\n console.log(`${ui.bold(\"=== Last Session Recap ===\")}\\n`);\n console.log(ui.dim(`${fm.id} (${fm.scope}${rev})`));\n console.log(recap.memory.body.trim());\n console.log();\n }\n\n // ── 2. Project context ─────────────────────────────────────────────────────\n if (existsSync(paths.projectContext)) {\n const ctx = await readFile(paths.projectContext, \"utf8\");\n const isTemplate = ctx.includes(\"TODO — high-level overview\") || ctx.includes(\"Generated by `haive init`\");\n if (isTemplate) {\n ui.warn(\n \"project-context.md still contains the default template — get_briefing will return little value.\",\n );\n ui.warn(\n \"Fix: in your AI client, invoke the MCP prompt bootstrap_project to auto-fill it from your codebase.\",\n );\n console.log();\n } else {\n console.log(`${ui.bold(\"=== Project Context ===\")}\\n`);\n console.log(ctx.trim());\n console.log();\n }\n } else {\n ui.warn(\n \"No project-context.md found. Run `haive init` then invoke the bootstrap_project MCP prompt.\",\n );\n }\n\n // Filter: exclude noise, drafts, stale, and session_recap (shown above) by default\n const candidates = all.filter(({ memory: mem }) => {\n const fm = mem.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") return false;\n if (!opts.includeDraft && fm.status === \"draft\") return false;\n if (!opts.includeStale && fm.status === \"stale\") return false;\n if (scopeFilter !== \"all\" && fm.scope !== scopeFilter && !(scopeFilter === \"team\" && fm.scope === \"shared\")) return false;\n if (fm.type === \"session_recap\") return false; // shown separately above\n return true;\n });\n\n // Score by relevance (AND on task tokens; OR fallback if AND produces no task hits)\n const andTaskHits = tokens\n ? new Set(candidates.filter(({ memory: mem }) => literalMatchesAllTokens(mem, tokens)).map(({ memory: mem }) => mem.frontmatter.id))\n : null;\n const useOrFallback = andTaskHits !== null && andTaskHits.size === 0 && (tokens?.length ?? 0) > 1;\n\n const scored = candidates.map(({ memory: mem, filePath }) => {\n const fm = mem.frontmatter;\n let score = 0;\n if (fm.status === \"validated\") score += 3;\n else if (fm.status === \"proposed\") score += 1;\n if (filePaths.length > 0 && memoryMatchesAnchorPaths(mem, filePaths)) score += 4;\n if (tokens) {\n if (andTaskHits?.has(fm.id)) score += 3;\n else if (useOrFallback && literalMatchesAnyToken(mem, tokens)) score += 1;\n }\n return { memory: mem, filePath, score };\n });\n\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, maxMemories);\n\n if (top.length === 0) {\n ui.info(\"No relevant memories found.\");\n const draftCount = all.filter(\n (m) =>\n m.memory.frontmatter.status === \"draft\" &&\n (scopeFilter === \"all\" || m.memory.frontmatter.scope === scopeFilter),\n ).length;\n if (draftCount > 0) {\n ui.info(`(${draftCount} draft memories excluded — use --include-draft to show)`);\n }\n return;\n }\n\n console.log(`${ui.bold(\"=== Relevant Memories ===\")}\\n`);\n for (const item of top) {\n const fm = item.memory.frontmatter;\n const badge = ui.statusBadge(fm.status);\n const draftMarker = fm.status === \"draft\" ? ui.yellow(\" [DRAFT]\") : \"\";\n const unverifiedMarker = fm.status === \"proposed\" ? ui.yellow(\" [UNVERIFIED]\") : \"\";\n const originMarker = (item as LoadedWithOrigin).origin\n ? ` ${ui.yellow(\"[from \" + (item as LoadedWithOrigin).origin + \"]\")}`\n : \"\";\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(fm.scope + \"/\" + fm.type)} ${badge}${draftMarker}${unverifiedMarker}${originMarker}`,\n );\n console.log(item.memory.body.trim());\n console.log();\n }\n console.log(ui.dim(`${top.length} memor${top.length === 1 ? \"y\" : \"ies\"} surfaced`));\n\n // Track reads so usage stats, decay, and hot-memory detection work via CLI too\n const ids = top.map(({ memory: mem }) => mem.frontmatter.id);\n if (ids.length > 0) {\n await trackReads(paths, ids).catch(() => { /* non-fatal */ });\n }\n\n // ── Code-map symbol lookup ──────────────────────────────────────────\n const requestedSymbols = (opts.symbols ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n if (requestedSymbols.length > 0) {\n const codeMap = await loadCodeMap(paths);\n if (!codeMap) {\n ui.warn(\"No code-map found. Run `haive index code` first to enable symbol lookup.\");\n } else {\n console.log(`\\n${ui.bold(\"=== Symbol Locations ===\")}\\n`);\n for (const sym of requestedSymbols) {\n const { files } = queryCodeMap(codeMap, { symbol: sym });\n if (files.length === 0) {\n console.log(`${ui.dim(sym)} (not found in code-map)`);\n } else {\n for (const f of files) {\n const exports = f.entry.exports.filter((e) =>\n e.name.toLowerCase().includes(sym.toLowerCase()),\n );\n for (const e of exports) {\n const desc = e.description ? ` — ${e.description}` : \"\";\n console.log(`${ui.bold(e.name)} ${ui.dim(f.path + \":\" + e.line)} [${e.kind}]${desc}`);\n }\n }\n }\n }\n console.log();\n }\n }\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\nfunction collectInclude(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n","import pc from \"picocolors\";\n\nexport const ui = {\n info: (msg: string) => console.log(pc.cyan(\"ℹ\"), msg),\n success: (msg: string) => console.log(pc.green(\"✓\"), msg),\n warn: (msg: string) => console.log(pc.yellow(\"⚠\"), msg),\n error: (msg: string) => console.error(pc.red(\"✗\"), msg),\n dim: (msg: string) => pc.dim(msg),\n bold: (msg: string) => pc.bold(msg),\n green: (msg: string) => pc.green(msg),\n yellow: (msg: string) => pc.yellow(msg),\n red: (msg: string) => pc.red(msg),\n statusBadge: (status: string): string => {\n switch (status) {\n case \"validated\": return pc.green(status);\n case \"proposed\": return pc.yellow(status);\n case \"stale\": return pc.yellow(status);\n case \"rejected\": return pc.red(status);\n case \"deprecated\": return pc.dim(status);\n default: return pc.dim(status); // draft\n }\n },\n};\n","import { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\n\nexport function registerTui(program: Command): void {\n program\n .command(\"tui\")\n .description(\n \"Interactive terminal dashboard for browsing and managing memories.\\n\\n\" +\n \" Screens (switch with 1 / 2 / 3):\\n\" +\n \" 1 — Memories: list + preview, filter by status (Tab), actions (a/r/p/d)\\n\" +\n \" 2 — Health: stale, pending review, anchorless memories\\n\" +\n \" 3 — Stats: most-read, decaying, total counts\\n\\n\" +\n \" Key bindings:\\n\" +\n \" ↑ ↓ navigate list\\n\" +\n \" Tab cycle status filter (all → proposed → validated → stale)\\n\" +\n \" a approve selected memory\\n\" +\n \" r reject selected memory\\n\" +\n \" p promote personal → team (proposed)\\n\" +\n \" d delete selected memory\\n\" +\n \" q / Esc exit\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: { dir?: string }) => {\n if (!process.stdout.isTTY) {\n console.error(\"haive tui requires an interactive terminal (TTY).\");\n process.exitCode = 1;\n return;\n }\n const root = findProjectRoot(opts.dir);\n const { render } = await import(\"ink\");\n const { createElement } = await import(\"react\");\n const { Dashboard } = await import(\"../tui/Dashboard.js\");\n const { waitUntilExit } = render(createElement(Dashboard, { root }));\n await waitUntilExit();\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { findProjectRoot, resolveHaivePaths } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface EmbeddingsOptions {\n dir?: string;\n}\n\ninterface EmbeddingsQueryOptions extends EmbeddingsOptions {\n limit?: string;\n minScore?: string;\n}\n\nexport function registerEmbeddings(program: Command): void {\n const embeddings = program\n .command(\"embeddings\")\n .description(\"Manage local embeddings index for semantic search\");\n\n embeddings\n .command(\"index\")\n .description(\"Generate or refresh the embeddings index for all memories\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: EmbeddingsOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n const { Embedder, rebuildIndex } = await loadEmbeddings();\n ui.info(\"Loading embedding model (first run downloads ~110MB)…\");\n const embedder = await Embedder.create();\n ui.info(`Model ready: ${embedder.model} (dim=${embedder.dimension}). Indexing memories…`);\n const { report } = await rebuildIndex(paths, embedder);\n ui.success(\n `Indexed ${report.total} memories — added=${report.added} updated=${report.updated} unchanged=${report.unchanged} removed=${report.removed}`,\n );\n });\n\n embeddings\n .command(\"query <text>\")\n .description(\"Run a semantic search against the local embeddings index\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--limit <n>\", \"max results\", \"10\")\n .option(\"--min-score <n>\", \"minimum cosine similarity (0-1)\", \"0\")\n .action(async (text: string, opts: EmbeddingsQueryOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const { semanticSearch } = await loadEmbeddings();\n const result = await semanticSearch(paths, text, {\n limit: Number(opts.limit ?? 10),\n minScore: Number(opts.minScore ?? 0),\n });\n if (!result) {\n ui.error(\"No embeddings index found. Run `haive embeddings index` first.\");\n process.exitCode = 1;\n return;\n }\n if (result.hits.length === 0) {\n ui.info(\"No semantic matches above the threshold.\");\n return;\n }\n for (const hit of result.hits) {\n const score = hit.score.toFixed(3);\n console.log(`${ui.bold(score)} ${hit.id}`);\n console.log(` ${ui.dim(path.relative(root, hit.file_path))}`);\n }\n });\n\n embeddings\n .command(\"status\")\n .description(\"Show the embeddings index status\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: EmbeddingsOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const { indexStat } = await loadEmbeddings();\n const stat = await indexStat(paths);\n if (!stat.exists) {\n ui.warn(\"No embeddings index. Run `haive embeddings index` to create one.\");\n return;\n }\n console.log(`${ui.bold(\"entries:\")} ${stat.count}`);\n console.log(`${ui.bold(\"model:\")} ${stat.model}`);\n console.log(`${ui.bold(\"updated_at:\")} ${stat.updatedAt}`);\n console.log(`${ui.bold(\"size:\")} ${(stat.sizeBytes / 1024).toFixed(1)} KB`);\n });\n}\n\nasync function loadEmbeddings() {\n try {\n return await import(\"@hiveai/embeddings\");\n } catch {\n ui.error(\n \"Could not load @hiveai/embeddings. Run: npm install -g @hiveai/embeddings (or `pnpm build` in the monorepo)\",\n );\n process.exit(1);\n }\n}\n","import path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildCodeMap,\n codeMapPath,\n findProjectRoot,\n resolveHaivePaths,\n saveCodeMap,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface IndexCodeOptions {\n dir?: string;\n exclude?: string;\n}\n\nexport function registerIndexCode(program: Command): void {\n const idx = program\n .command(\"index\")\n .description(\n \"Build local indexes that let AIs look up symbols instead of grepping.\\n\\n\" +\n \" Run once after init, then haive sync refreshes it automatically when source changes.\",\n );\n idx.action(() => idx.help());\n idx\n .command(\"code\")\n .description(\n \"Scan source files and write .ai/code-map.json (file → exports + 1-line description).\\n\\n\" +\n \" Supported languages: TypeScript, JavaScript, Java, Python, Go, Rust, C#, PHP.\\n\" +\n \" The map is used by:\\n\" +\n \" • get_briefing (symbol_locations) — look up where a class/function lives\\n\" +\n \" • code_map MCP tool — browse exports without grepping\\n\" +\n \" • haive briefing --symbols — look up symbols from the CLI\\n\\n\" +\n \" Run automatically by haive init (autopilot mode) and haive sync (if source changed).\\n\\n\" +\n \" Example:\\n\" +\n \" haive index code\\n\" +\n \" haive index code --exclude generated,proto\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\n \"--exclude <csv>\",\n \"extra directory names to skip (comma-separated)\",\n \"\",\n )\n .action(async (opts: IndexCodeOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const extraExcludes = (opts.exclude ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n ui.info(`Indexing source files in ${root}…`);\n const map = await buildCodeMap(root, {\n excludeDirs: [\n \"node_modules\",\n \"dist\",\n \"build\",\n \"out\",\n \".git\",\n \".next\",\n \".turbo\",\n \".vitest-cache\",\n \"coverage\",\n ...extraExcludes,\n ],\n });\n\n await saveCodeMap(paths, map);\n const fileCount = Object.keys(map.files).length;\n const exportCount = Object.values(map.files).reduce((s, f) => s + f.exports.length, 0);\n ui.success(\n `Indexed ${fileCount} file(s) with ${exportCount} export(s) → ${path.relative(root, codeMapPath(paths))}`,\n );\n });\n\n idx\n .command(\"code-search\")\n .description(\n \"Build the semantic-search embeddings index for code (powers the code_search MCP tool).\\n\\n\" +\n \" Reads .ai/code-map.json (run `haive index code` first) and embeds each exported\\n\" +\n \" symbol's metadata (filename + name + kind + description).\\n\\n\" +\n \" Re-runs are incremental: unchanged entries keep their cached vectors, only the\\n\" +\n \" diff is re-embedded. First run downloads the bge-small-en-v1.5 model (~110MB).\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: IndexCodeOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n ui.error(\n \"@hiveai/embeddings is not installed. Install it (`pnpm add @hiveai/embeddings`) \" +\n \"or run `haive embeddings install`.\",\n );\n process.exit(1);\n }\n\n ui.info(\"Loading embedder (first run downloads ~110MB)…\");\n const embedder = await mod.Embedder.create();\n ui.info(`Embedding code-map symbols…`);\n try {\n const { report } = await mod.rebuildCodeIndex(paths, embedder);\n ui.success(\n `Code-search index ready: ${report.total} symbols ` +\n `(+${report.added} new, ~${report.updated} updated, =${report.unchanged} cached, -${report.removed} removed)`,\n );\n } catch (err) {\n ui.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { Command } from \"commander\";\nimport {\n AUTOPILOT_DEFAULTS,\n buildCodeMap,\n findProjectRoot,\n resolveHaivePaths,\n saveCodeMap,\n saveConfig,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\nimport { generateBootstrapContext } from \"./init-bootstrap.js\";\nimport { autoConfigureMcpClients } from \"./init-mcp-setup.js\";\nimport {\n autoDetectStacks,\n isValidStack,\n seedStackPack,\n SUPPORTED_STACKS,\n} from \"./init-stack-packs.js\";\n\nconst PROJECT_CONTEXT_TEMPLATE = `# Project context\n\n> Generated by \\`haive init\\`. Run \\`haive init --bootstrap\\` to auto-fill from your codebase,\n> or invoke the MCP prompt \\`bootstrap_project\\` in your AI client for a richer AI-generated version.\n\n## Architecture\nTODO — high-level overview of the codebase.\n\n## Key modules\nTODO — list main modules and their purpose.\n\n## Conventions\nTODO — coding conventions, naming, patterns the team follows.\n\n## Glossary\nTODO — domain terms and what they mean here.\n\n## Gotchas\nTODO — known traps, surprising behavior, things newcomers stub their toes on.\n`;\n\nconst BRIDGE_BODY = `<!-- hAIve bridge file — do not edit by hand. -->\n<!-- This file points your AI tool at the shared hAIve project context. -->\n\nSee \\`.ai/project-context.md\\` for the full project context.\nMemories live under \\`.ai/memories/\\` (personal/team/module).\n\n## hAIve — mandatory rules for AI agents\n\n### Session rules\n- **Before** marking a task as done (\"Done\", \"Finished\", \"C'est fait\"), call the MCP prompt \\`post_task\\`.\n- **Immediately** when an approach fails (wrong API, wrong pattern, wrong assumption), call \\`mem_tried\\` — do not wait until the end of the session.\n- When starting a new task, call \\`get_briefing\\` with the task description to load relevant memories and avoid repeating past mistakes.\n\n### Safety rules — NEVER violate these\n- If \\`get_briefing\\` returns an \\`action_required\\` list, **stop and show each item to the developer** before doing anything. Use the exact \\`developer_message\\` provided. Wait for explicit confirmation.\n- **Never modify code autonomously** because of a breaking change detected in another project (dependency version bump, API contract change, removed field). Always ask first.\n- When in doubt about a cross-repo change: ask, don't act.\n`;\n\nconst CI_WORKFLOW = `name: haive-sync\n\non:\n push:\n branches: [main, master]\n pull_request:\n branches: [main, master]\n\njobs:\n # On push to main/master: sync anchors + auto-promote + commit changes\n sync-on-merge:\n if: github.event_name == 'push'\n runs-on: ubuntu-latest\n permissions:\n contents: write\n steps:\n - uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: install haive\n run: npm install -g @hiveai/cli\n\n - name: refresh memory anchors + auto-promote\n run: haive sync --since HEAD~1 || true\n\n - name: commit updated memories (if any)\n run: |\n git config user.name \"github-actions[bot]\"\n git config user.email \"github-actions[bot]@users.noreply.github.com\"\n git add .ai/\n git diff --cached --quiet || git commit -m \"chore: haive sync [skip ci]\"\n git push\n\n # On pull request: warn if PR touches files that would invalidate memories\n pr-stale-check:\n if: github.event_name == 'pull_request'\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n steps:\n - uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: install haive\n run: npm install -g @hiveai/cli\n\n - name: verify memory anchors touched by this PR\n id: verify\n run: |\n haive memory verify 2>&1 | tee /tmp/haive-verify.txt || true\n STALE=$(grep -c 'stale' /tmp/haive-verify.txt || echo 0)\n echo \"stale_count=$STALE\" >> \"$GITHUB_OUTPUT\"\n\n - name: comment on PR if stale memories detected\n if: steps.verify.outputs.stale_count != '0'\n uses: actions/github-script@v7\n with:\n script: |\n const fs = require('fs');\n const report = fs.readFileSync('/tmp/haive-verify.txt', 'utf8').trim();\n await github.rest.issues.createComment({\n owner: context.repo.owner,\n repo: context.repo.repo,\n issue_number: context.issue.number,\n body: \\`### haive — Stale memories detected\\\\n\\\\nSome memories anchored to code modified in this PR may be outdated:\\\\n\\\\n\\\\\\`\\\\\\`\\\\\\`\\\\n\\${report}\\\\n\\\\\\`\\\\\\`\\\\\\`\\\\n\\\\nRun \\\\\\`haive memory verify --update\\\\\\` locally to refresh them before merging.\\`\n });\n\n # ── hAIve PR Memory Check ─────────────────────────────────────────────────\n # Posts a comment on every PR surfacing memories relevant to the changed files.\n # Reviewers and AI agents see gotchas, conventions, and action_required items\n # before they start coding.\n pr-memory-check:\n if: github.event_name == 'pull_request'\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n contents: read\n steps:\n - uses: actions/checkout@v4\n\n - uses: Doucs91/hAIve/packages/github-action@main\n with:\n github-token: \\${{ secrets.GITHUB_TOKEN }}\n # post-if-empty: 'true' # uncomment to always post (even when no memories found)\n # max-memories: '5' # limit memories per file in the comment\n\n # On push to main: push shared memories to the hub (if hubPath is configured)\n # Uncomment and configure hubPath in .ai/haive.config.json to enable.\n # hub-push:\n # if: github.event_name == 'push'\n # needs: sync-on-merge\n # runs-on: ubuntu-latest\n # permissions:\n # contents: write\n # steps:\n # - uses: actions/checkout@v4\n # with:\n # fetch-depth: 0\n # - uses: actions/setup-node@v4\n # with:\n # node-version: '20'\n # - name: install haive\n # run: npm install -g @hiveai/cli\n # - name: push shared memories to hub\n # run: haive hub push --commit\n # # Requires hubPath in .ai/haive.config.json pointing to a cloned hub repo.\n`;\n\nexport function registerInit(program: Command): void {\n program\n .command(\"init\")\n .description(\n \"Initialize a hAIve project — autopilot mode ON by default (zero human intervention).\\n\" +\n \" Add --manual if you want to control memory approval and session recaps yourself.\",\n )\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .option(\"--no-bridges\", \"do not generate CLAUDE.md / .cursorrules / copilot-instructions.md\")\n .option(\"--with-ci\", \"write a GitHub Actions workflow (.github/workflows/haive-sync.yml) — included automatically in autopilot mode\")\n .option(\n \"--manual\",\n \"opt out of autopilot: memories require manual approval, no auto-session recap, no auto-context\",\n )\n .option(\n \"--bootstrap\",\n \"auto-generate .ai/project-context.md from package.json, README, and directory structure (no AI needed)\",\n )\n .option(\n \"--stack <stacks>\",\n `pre-seed validated memory packs for the given stacks (comma-separated).\\n` +\n ` Supported: ${SUPPORTED_STACKS.join(\", \")}.\\n` +\n ` Use 'auto' to detect from package.json automatically.`,\n )\n .option(\n \"--no-mcp-setup\",\n \"skip auto-configuring haive-mcp in Cursor / VS Code / Claude Code\",\n )\n .action(async (opts: {\n dir: string;\n bridges: boolean;\n withCi?: boolean;\n manual?: boolean;\n bootstrap?: boolean;\n stack?: string;\n mcpSetup: boolean;\n }) => {\n const root = path.resolve(opts.dir);\n const paths = resolveHaivePaths(root);\n const autopilot = opts.manual !== true; // autopilot is ON by default\n\n if (existsSync(paths.haiveDir)) {\n ui.warn(`.ai/ already exists at ${paths.haiveDir} — leaving existing files in place.`);\n }\n\n await mkdir(paths.personalDir, { recursive: true });\n await mkdir(paths.teamDir, { recursive: true });\n await mkdir(paths.moduleDir, { recursive: true });\n await mkdir(paths.modulesContextDir, { recursive: true });\n\n // ── project-context.md ───────────────────────────────────────────────\n if (!existsSync(paths.projectContext)) {\n if (opts.bootstrap) {\n ui.info(\"Bootstrapping project context from local files…\");\n try {\n const context = await generateBootstrapContext(root);\n await writeFile(paths.projectContext, context, \"utf8\");\n ui.success(\"Created .ai/project-context.md (auto-bootstrapped from local files)\");\n } catch (err) {\n ui.warn(`Bootstrap failed (${String(err)}) — writing default template instead`);\n await writeFile(paths.projectContext, PROJECT_CONTEXT_TEMPLATE, \"utf8\");\n }\n } else {\n await writeFile(paths.projectContext, PROJECT_CONTEXT_TEMPLATE, \"utf8\");\n ui.success(`Created ${path.relative(root, paths.projectContext)}`);\n }\n }\n\n // Write config (autopilot or default)\n const configExists = existsSync(\n path.join(paths.haiveDir, \"haive.config.json\"),\n );\n if (!configExists) {\n await saveConfig(paths, autopilot ? AUTOPILOT_DEFAULTS : { autopilot: false });\n ui.success(\n `Created .ai/haive.config.json (mode: ${autopilot ? \"autopilot\" : \"standard\"})`,\n );\n }\n\n if (opts.bridges) {\n await writeBridge(root, \"CLAUDE.md\");\n await writeBridge(root, \".cursorrules\");\n await writeBridge(root, path.join(\".github\", \"copilot-instructions.md\"));\n }\n\n // ── Stack memory packs ───────────────────────────────────────────────\n const stacksToSeed = await resolveStacksToSeed(root, opts.stack);\n if (stacksToSeed.length > 0) {\n let totalSeeded = 0;\n for (const stack of stacksToSeed) {\n const count = await seedStackPack(paths, stack);\n if (count > 0) {\n ui.success(`Seeded ${count} memories for stack: ${stack}`);\n totalSeeded += count;\n } else {\n ui.info(`Stack pack '${stack}': all memories already exist — skipped`);\n }\n }\n if (totalSeeded > 0) {\n ui.success(\n `${totalSeeded} validated team memories pre-seeded — haive is useful from J+0`,\n );\n }\n }\n\n // autopilot: CI + git hooks + code-map included automatically\n const wantCi = opts.withCi || autopilot;\n if (wantCi) {\n const ciPath = path.join(root, \".github\", \"workflows\", \"haive-sync.yml\");\n if (existsSync(ciPath)) {\n ui.info(\"CI workflow already exists — skipped\");\n } else {\n await mkdir(path.dirname(ciPath), { recursive: true });\n await writeFile(ciPath, CI_WORKFLOW, \"utf8\");\n ui.success(`Created ${path.relative(root, ciPath)}`);\n }\n }\n\n if (autopilot) {\n // Install git hooks (post-merge + post-rewrite + pre-push reminder)\n const haiveBin = process.argv[1]!;\n const hookResult = spawnSync(\n process.execPath,\n [haiveBin, \"install-hooks\", \"--dir\", root],\n { encoding: \"utf8\" },\n );\n if (hookResult.status === 0) {\n ui.success(\"Git hooks installed (auto-sync after pull/merge)\");\n } else {\n ui.warn(\"Git hooks not installed (not a git repo or no .git/ found) — run `haive install-hooks` manually\");\n }\n\n // Build initial code-map\n try {\n ui.info(\"Building code-map…\");\n const map = await buildCodeMap(root);\n await saveCodeMap(paths, map);\n ui.success(`Code-map built (${Object.keys(map.files).length} files)`);\n } catch {\n ui.warn(\"Code-map build failed — run `haive index code` manually\");\n }\n }\n\n // ── Auto-configure MCP in AI clients ────────────────────────────────\n if (opts.mcpSetup !== false) {\n const mcpResults = await autoConfigureMcpClients();\n const configured = mcpResults.filter((r) => r.status === \"configured\");\n const alreadyOk = mcpResults.filter((r) => r.status === \"already_configured\");\n\n for (const r of configured) {\n ui.success(`haive-mcp configured in ${r.client} (${r.path})`);\n }\n for (const r of alreadyOk) {\n ui.info(`haive-mcp already configured in ${r.client} — skipped`);\n }\n if (configured.length === 0 && alreadyOk.length === 0) {\n ui.warn(\n \"No supported AI client detected (Cursor, VS Code, Claude Code, Windsurf).\\n\" +\n \" Configure manually: add haive-mcp to your client's MCP config.\\n\" +\n \" See: https://github.com/Doucs91/hAIve#mcp-setup\",\n );\n }\n if (configured.length > 0) {\n ui.info(\n ui.dim(\" → Restart your AI client for MCP changes to take effect.\"),\n );\n }\n }\n\n ui.success(`hAIve initialized at ${root}${autopilot ? \" (autopilot mode)\" : \"\"}`);\n console.log();\n\n if (autopilot) {\n console.log(ui.bold(\"Autopilot mode is ON — hAIve runs itself:\"));\n console.log(ui.dim(\" ✓ Memories go directly to validated (no approval needed)\"));\n console.log(ui.dim(\" ✓ Proposed memories auto-approve after 72h without rejection\"));\n console.log(ui.dim(\" ✓ Session recap saved automatically when the AI session closes\"));\n console.log(ui.dim(\" ✓ Code-map refreshes automatically after every pull\"));\n console.log(ui.dim(\" ✓ Git hooks installed (auto-sync after pull/merge)\"));\n console.log(ui.dim(\" ✓ CI workflow created (pr-stale-check + sync-on-merge)\"));\n if (stacksToSeed.length > 0) {\n console.log(ui.dim(` ✓ Stack memory packs pre-seeded (${stacksToSeed.join(\", \")})`));\n }\n console.log();\n\n if (!opts.bootstrap) {\n console.log(ui.bold(\"One remaining step (optional but recommended):\"));\n console.log(\" \" + ui.bold(\"haive init --bootstrap\") + ui.dim(\" ← fill project-context.md without AI\"));\n console.log(\" \" + ui.dim(\"Or in your AI client: invoke the MCP prompt \") + ui.bold(\"bootstrap_project\"));\n } else {\n console.log(ui.bold(\"Project context bootstrapped from local files.\"));\n console.log(ui.dim(\" Review .ai/project-context.md and fill in the TODO sections.\"));\n console.log(ui.dim(\" Or invoke the MCP prompt `bootstrap_project` for a richer AI-generated version.\"));\n }\n console.log();\n console.log(ui.dim(\" Seed more memories instantly:\"));\n console.log(ui.dim(\" haive memory import-changelog — from CHANGELOG.md\"));\n console.log(ui.dim(\" haive memory import README.md — from README / docs\"));\n } else {\n console.log(ui.bold(\"Next steps:\"));\n if (!opts.bootstrap) {\n console.log(ui.dim(\" 1. Fill project context (pick one):\"));\n console.log(\" \" + ui.bold(\"haive init --bootstrap\") + ui.dim(\" ← instant, no AI needed\"));\n console.log(\" or invoke the MCP prompt \" + ui.bold(\"bootstrap_project\") + ui.dim(\" in your AI client\"));\n } else {\n console.log(ui.dim(\" 1. Review .ai/project-context.md and fill in the TODO sections.\"));\n }\n console.log();\n console.log(ui.dim(\" 2. Start every AI session with:\"));\n console.log(\" \" + ui.bold(\"get_briefing({ task: '…what you are about to do…' })\"));\n console.log();\n console.log(ui.dim(\" Tip: run `haive init` (without --manual) for zero-friction autopilot mode.\"));\n }\n });\n}\n\nasync function resolveStacksToSeed(\n root: string,\n stackOpt: string | undefined,\n): Promise<ReturnType<typeof autoDetectStacks>> {\n if (!stackOpt) return [];\n if (stackOpt === \"auto\") {\n // Auto-detect from package.json\n const pkgPath = path.join(root, \"package.json\");\n if (!existsSync(pkgPath)) return [];\n try {\n const pkg = JSON.parse(await readFile(pkgPath, \"utf8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const allDeps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n return autoDetectStacks(allDeps);\n } catch {\n return [];\n }\n }\n // Comma-separated stack names\n return stackOpt\n .split(\",\")\n .map((s) => s.trim().toLowerCase())\n .filter(isValidStack);\n}\n\nasync function writeBridge(root: string, relPath: string): Promise<void> {\n const target = path.join(root, relPath);\n if (existsSync(target)) {\n ui.info(`Bridge ${relPath} already exists — skipped`);\n return;\n }\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, BRIDGE_BODY, \"utf8\");\n ui.success(`Created bridge ${relPath}`);\n}\n\n","/**\n * Bootstrap: auto-generate .ai/project-context.md from local filesystem signals.\n *\n * Reads: package.json, README.md, directory structure (top 2 levels).\n * No AI call, no network — pure static analysis.\n */\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n\nconst IGNORE_DIRS = new Set([\n \"node_modules\", \"dist\", \"build\", \".next\", \".nuxt\", \".svelte-kit\",\n \".git\", \"coverage\", \".turbo\", \"out\", \".cache\", \"tmp\", \"temp\",\n \"__pycache__\", \".venv\", \"venv\", \"target\", \".gradle\",\n]);\n\nconst FRAMEWORK_SIGNALS: Record<string, string[]> = {\n \"NestJS\": [\"@nestjs/core\", \"@nestjs/common\"],\n \"Next.js\": [\"next\"],\n \"Remix\": [\"@remix-run/react\", \"@remix-run/node\"],\n \"React\": [\"react\", \"react-dom\"],\n \"Vue\": [\"vue\"],\n \"Svelte\": [\"svelte\"],\n \"SvelteKit\": [\"@sveltejs/kit\"],\n \"Astro\": [\"astro\"],\n \"Express\": [\"express\"],\n \"Fastify\": [\"fastify\"],\n \"Hono\": [\"hono\"],\n \"tRPC\": [\"@trpc/server\"],\n \"Prisma\": [\"@prisma/client\"],\n \"Drizzle\": [\"drizzle-orm\"],\n \"Vite\": [\"vite\"],\n \"Vitest\": [\"vitest\"],\n \"Jest\": [\"jest\"],\n};\n\nconst KEY_DEPS = [\n \"@nestjs/jwt\", \"@nestjs/passport\", \"passport-jwt\",\n \"jsonwebtoken\", \"bcrypt\", \"bcryptjs\",\n \"stripe\", \"axios\", \"socket.io\", \"ws\",\n \"redis\", \"ioredis\", \"pg\", \"mysql2\", \"mongodb\", \"mongoose\",\n \"zod\", \"yup\", \"class-validator\",\n \"tailwindcss\", \"shadcn\", \"@radix-ui\",\n \"@vercel/ai\", \"ai\", \"openai\", \"@anthropic-ai/sdk\",\n \"typescript\",\n];\n\ninterface PackageJson {\n name?: string;\n description?: string;\n version?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nfunction detectFrameworks(allDeps: Record<string, string>): string[] {\n const found: string[] = [];\n for (const [fw, signals] of Object.entries(FRAMEWORK_SIGNALS)) {\n if (signals.some((s) => allDeps[s] !== undefined)) found.push(fw);\n }\n return found;\n}\n\nfunction detectKeyDeps(allDeps: Record<string, string>): string[] {\n return KEY_DEPS.filter((d) => allDeps[d] !== undefined);\n}\n\nfunction detectLanguage(root: string): string {\n if (existsSync(path.join(root, \"tsconfig.json\"))) return \"TypeScript\";\n if (existsSync(path.join(root, \"pyproject.toml\")) || existsSync(path.join(root, \"setup.py\"))) return \"Python\";\n if (existsSync(path.join(root, \"go.mod\"))) return \"Go\";\n if (existsSync(path.join(root, \"pom.xml\")) || existsSync(path.join(root, \"build.gradle\"))) return \"Java/Kotlin\";\n if (existsSync(path.join(root, \"Cargo.toml\"))) return \"Rust\";\n if (existsSync(path.join(root, \"package.json\"))) return \"JavaScript\";\n return \"Unknown\";\n}\n\nfunction detectProjectType(frameworks: string[], scripts: Record<string, string>): string {\n if (frameworks.includes(\"NestJS\")) return \"Backend API (NestJS)\";\n if (frameworks.includes(\"Next.js\")) return \"Full-stack web app (Next.js)\";\n if (frameworks.includes(\"Remix\")) return \"Full-stack web app (Remix)\";\n if (frameworks.includes(\"Express\") || frameworks.includes(\"Fastify\") || frameworks.includes(\"Hono\")) return \"Backend API\";\n if (frameworks.includes(\"React\") || frameworks.includes(\"Vue\") || frameworks.includes(\"Svelte\")) return \"Frontend SPA\";\n if (scripts[\"build\"] && !scripts[\"dev\"]) return \"CLI tool / library\";\n if (existsSync(\"pom.xml\")) return \"Java backend\";\n return \"Application\";\n}\n\nasync function scanDirs(root: string, maxDepth = 2): Promise<string[]> {\n const results: string[] = [];\n async function walk(dir: string, depth: number): Promise<void> {\n if (depth > maxDepth) return;\n let entries: Awaited<ReturnType<typeof readdir>>;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (IGNORE_DIRS.has(entry.name) || entry.name.startsWith(\".\")) continue;\n const rel = path.relative(root, path.join(dir, entry.name));\n results.push(rel);\n await walk(path.join(dir, entry.name), depth + 1);\n }\n }\n await walk(root, 0);\n return results;\n}\n\nfunction inferModuleDescriptions(dirs: string[]): string[] {\n const known: Record<string, string> = {\n \"src\": \"main source directory\",\n \"app\": \"application entrypoint / routes (Next.js App Router or similar)\",\n \"pages\": \"file-based routing pages\",\n \"components\": \"reusable UI components\",\n \"lib\": \"shared utilities and helpers\",\n \"utils\": \"utility functions\",\n \"hooks\": \"React hooks\",\n \"services\": \"business logic services\",\n \"controllers\": \"HTTP controllers / route handlers\",\n \"modules\": \"feature modules\",\n \"middleware\": \"HTTP or business middleware\",\n \"guards\": \"auth / access guards\",\n \"prisma\": \"Prisma schema and migrations\",\n \"migrations\": \"database migrations\",\n \"config\": \"configuration files\",\n \"types\": \"TypeScript type definitions\",\n \"schemas\": \"validation schemas (Zod / class-validator)\",\n \"test\": \"tests\",\n \"tests\": \"tests\",\n \"__tests__\": \"tests\",\n \"e2e\": \"end-to-end tests\",\n \"public\": \"static public assets\",\n \"assets\": \"static assets\",\n \"styles\": \"global CSS / style files\",\n \"scripts\": \"build or utility scripts\",\n \"docs\": \"documentation\",\n \"docker\": \"Docker configuration\",\n \"infra\": \"infrastructure / IaC\",\n \"packages\": \"monorepo sub-packages\",\n \"functions\": \"serverless / edge functions\",\n \"api\": \"API routes or client\",\n \"store\": \"state management (Redux / Zustand / Pinia)\",\n \"context\": \"React contexts\",\n \"server\": \"server-side code\",\n \"client\": \"client-side code\",\n \"features\": \"feature-based modules\",\n \"routes\": \"route definitions\",\n \"workers\": \"background workers / queues\",\n };\n const top = dirs.filter((d) => !d.includes(\"/\")).slice(0, 12);\n return top.map((d) => {\n const desc = known[d.toLowerCase()] ?? \"module\";\n return `- \\`${d}/\\` — ${desc}`;\n });\n}\n\nfunction readmeExcerpt(readme: string): string {\n const lines = readme.split(\"\\n\");\n // Skip the first h1, grab description paragraph\n let inContent = false;\n const kept: string[] = [];\n for (const line of lines) {\n if (!inContent && line.trim().startsWith(\"#\")) { inContent = true; continue; }\n if (!inContent) continue;\n if (kept.length >= 6) break;\n if (line.trim()) kept.push(line.trim());\n }\n return kept.join(\" \").slice(0, 400);\n}\n\nexport async function generateBootstrapContext(root: string): Promise<string> {\n // 1. package.json\n let pkg: PackageJson = {};\n const pkgPath = path.join(root, \"package.json\");\n if (existsSync(pkgPath)) {\n try { pkg = JSON.parse(await readFile(pkgPath, \"utf8\")) as PackageJson; } catch { /* ignore */ }\n }\n\n const allDeps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n const frameworks = detectFrameworks(allDeps);\n const keyDeps = detectKeyDeps(allDeps);\n const language = detectLanguage(root);\n const projectType = detectProjectType(frameworks, pkg.scripts ?? {});\n const projectName = pkg.name ?? path.basename(root);\n const projectDesc = pkg.description ?? \"\";\n\n // 2. README excerpt\n let readmeSummary = \"\";\n for (const name of [\"README.md\", \"readme.md\", \"README\"]) {\n const p = path.join(root, name);\n if (existsSync(p)) {\n try {\n const content = await readFile(p, \"utf8\");\n readmeSummary = readmeExcerpt(content);\n break;\n } catch { /* ignore */ }\n }\n }\n\n // 3. Directory structure\n const dirs = await scanDirs(root, 2);\n const moduleLines = inferModuleDescriptions(dirs);\n\n // 4. Scripts analysis\n const scripts = pkg.scripts ?? {};\n const scriptLines = Object.entries(scripts)\n .filter(([k]) => [\"build\", \"dev\", \"start\", \"test\", \"lint\", \"deploy\"].includes(k))\n .map(([k, v]) => `- \\`${k}\\`: ${v}`)\n .slice(0, 6);\n\n // 5. Tech stack summary\n const stackParts: string[] = [language];\n if (frameworks.length) stackParts.push(...frameworks);\n const techStack = stackParts.join(\", \");\n\n // 6. Key dependencies (notable ones)\n const notableDeps = Object.keys(allDeps)\n .filter((d) => !d.startsWith(\"@types/\") && ![\"typescript\", \"eslint\", \"prettier\", \"jest\"].includes(d))\n .filter((d) => ![\"react\", \"react-dom\", \"next\", \"vue\", \"express\"].includes(d)) // already in frameworks\n .slice(0, 10)\n .map((d) => `\\`${d}\\``);\n\n const lines: string[] = [\n `# Project context — ${projectName}`,\n \"\",\n `> Auto-generated by \\`haive init --bootstrap\\`. Review and refine — especially the Architecture and Gotchas sections.`,\n \"\",\n `## Overview`,\n `**Type:** ${projectType}`,\n `**Tech stack:** ${techStack}`,\n ...(projectDesc ? [`**Description:** ${projectDesc}`] : []),\n ...(readmeSummary ? [`**From README:** ${readmeSummary}`] : []),\n \"\",\n `## Architecture`,\n `TODO — fill in the high-level architecture (inferred structure below, verify manually):`,\n \"\",\n ...(moduleLines.length ? moduleLines : [\"TODO — no clear structure detected.\"]),\n \"\",\n `## Key modules`,\n `TODO — describe the purpose of the main modules. The directory scan found:`,\n ...dirs.filter((d) => !d.includes(\"/\")).slice(0, 8).map((d) => `- \\`${d}/\\``),\n \"\",\n `## Conventions`,\n `TODO — fill in coding conventions (naming, patterns, file layout).`,\n \"\",\n ...(scriptLines.length ? [\n `**Available scripts:**`,\n ...scriptLines,\n \"\",\n ] : []),\n ...(keyDeps.length ? [\n `**Key dependencies in use:** ${keyDeps.map((d) => `\\`${d}\\``).join(\", \")}`,\n \"\",\n ] : []),\n ...(notableDeps.length ? [\n `**Other notable packages:** ${notableDeps.join(\", \")}`,\n \"\",\n ] : []),\n `## Glossary`,\n `TODO — domain terms and what they mean here.`,\n \"\",\n `## Gotchas`,\n `TODO — known traps, surprising behavior, things newcomers stub their toes on.`,\n `(Run \\`haive memory import-changelog\\` or \\`haive memory import README.md\\` to seed these automatically.)`,\n \"\",\n ];\n\n return lines.join(\"\\n\");\n}\n","/**\n * Auto-configure haive-mcp in supported AI clients.\n *\n * Clients supported:\n * - Cursor (~/.cursor/mcp.json)\n * - VS Code (~/.config/Code/User/mcp.json or ~/Library/Application Support/Code/User/mcp.json)\n * - Claude Code (~/.claude.json mcpServers field)\n * - Windsurf (~/.codeium/windsurf/mcp_config.json)\n */\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nconst HOME = os.homedir();\nconst HAIVE_MCP_ENTRY = {\n command: \"haive-mcp\",\n args: [] as string[],\n};\n\n// ── Cursor ────────────────────────────────────────────────────────────────────\n\nfunction cursorMcpPath(): string {\n return path.join(HOME, \".cursor\", \"mcp.json\");\n}\n\nasync function configureCursor(): Promise<ConfigureResult> {\n const mcpPath = cursorMcpPath();\n const cursorDir = path.join(HOME, \".cursor\");\n if (!existsSync(cursorDir)) return { client: \"Cursor\", status: \"not_installed\" };\n\n let config: { mcpServers?: Record<string, unknown> } = {};\n if (existsSync(mcpPath)) {\n try { config = JSON.parse(await readFile(mcpPath, \"utf8\")); } catch { /* ignore malformed */ }\n }\n config.mcpServers ??= {};\n if (config.mcpServers[\"haive\"]) return { client: \"Cursor\", status: \"already_configured\" };\n\n config.mcpServers[\"haive\"] = HAIVE_MCP_ENTRY;\n await mkdir(cursorDir, { recursive: true });\n await writeFile(mcpPath, JSON.stringify(config, null, 2), \"utf8\");\n return { client: \"Cursor\", status: \"configured\", path: mcpPath };\n}\n\n// ── VS Code ───────────────────────────────────────────────────────────────────\n\nfunction vscodeMcpPath(): string | null {\n const candidates = [\n path.join(HOME, \".config\", \"Code\", \"User\", \"mcp.json\"), // Linux\n path.join(HOME, \"Library\", \"Application Support\", \"Code\", \"User\", \"mcp.json\"), // macOS\n path.join(HOME, \"AppData\", \"Roaming\", \"Code\", \"User\", \"mcp.json\"), // Windows\n path.join(HOME, \".config\", \"Code - Insiders\", \"User\", \"mcp.json\"),\n ];\n // Return the first one whose *parent directory* exists\n for (const c of candidates) {\n if (existsSync(path.dirname(c))) return c;\n }\n return null;\n}\n\nasync function configureVSCode(): Promise<ConfigureResult> {\n const mcpPath = vscodeMcpPath();\n if (!mcpPath) return { client: \"VS Code\", status: \"not_installed\" };\n\n let config: { servers?: Record<string, unknown> } = {};\n if (existsSync(mcpPath)) {\n try { config = JSON.parse(await readFile(mcpPath, \"utf8\")); } catch { /* ignore */ }\n }\n config.servers ??= {};\n if (config.servers[\"haive\"]) return { client: \"VS Code\", status: \"already_configured\" };\n\n config.servers[\"haive\"] = { ...HAIVE_MCP_ENTRY, type: \"stdio\" };\n await mkdir(path.dirname(mcpPath), { recursive: true });\n await writeFile(mcpPath, JSON.stringify(config, null, 2), \"utf8\");\n return { client: \"VS Code\", status: \"configured\", path: mcpPath };\n}\n\n// ── Claude Code ───────────────────────────────────────────────────────────────\n\nfunction claudeConfigPath(): string | null {\n const p = path.join(HOME, \".claude.json\");\n if (existsSync(p)) return p;\n // Some versions put it here\n const p2 = path.join(HOME, \".config\", \"claude\", \"claude.json\");\n if (existsSync(path.dirname(p2))) return p2;\n return null;\n}\n\nasync function configureClaude(): Promise<ConfigureResult> {\n // Claude Code stores MCP servers in ~/.claude.json under mcpServers key\n const cfgPath = claudeConfigPath() ?? path.join(HOME, \".claude.json\");\n if (!existsSync(cfgPath) && !existsSync(path.join(HOME, \".claude\"))) {\n return { client: \"Claude Code\", status: \"not_installed\" };\n }\n\n let config: { mcpServers?: Record<string, unknown> } = {};\n if (existsSync(cfgPath)) {\n try { config = JSON.parse(await readFile(cfgPath, \"utf8\")); } catch { /* ignore */ }\n }\n config.mcpServers ??= {};\n if (config.mcpServers[\"haive\"]) return { client: \"Claude Code\", status: \"already_configured\" };\n\n config.mcpServers[\"haive\"] = { ...HAIVE_MCP_ENTRY, type: \"stdio\" };\n await writeFile(cfgPath, JSON.stringify(config, null, 2), \"utf8\");\n return { client: \"Claude Code\", status: \"configured\", path: cfgPath };\n}\n\n// ── Windsurf ─────────────────────────────────────────────────────────────────\n\nfunction windsurfMcpPath(): string | null {\n const candidates = [\n path.join(HOME, \".codeium\", \"windsurf\", \"mcp_config.json\"),\n path.join(HOME, \".windsurf\", \"mcp.json\"),\n ];\n for (const c of candidates) {\n if (existsSync(path.dirname(c))) return c;\n }\n return null;\n}\n\nasync function configureWindsurf(): Promise<ConfigureResult> {\n const mcpPath = windsurfMcpPath();\n if (!mcpPath) return { client: \"Windsurf\", status: \"not_installed\" };\n\n let config: { mcpServers?: Record<string, unknown> } = {};\n if (existsSync(mcpPath)) {\n try { config = JSON.parse(await readFile(mcpPath, \"utf8\")); } catch { /* ignore */ }\n }\n config.mcpServers ??= {};\n if (config.mcpServers[\"haive\"]) return { client: \"Windsurf\", status: \"already_configured\" };\n\n config.mcpServers[\"haive\"] = HAIVE_MCP_ENTRY;\n await mkdir(path.dirname(mcpPath), { recursive: true });\n await writeFile(mcpPath, JSON.stringify(config, null, 2), \"utf8\");\n return { client: \"Windsurf\", status: \"configured\", path: mcpPath };\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface ConfigureResult {\n client: string;\n status: \"configured\" | \"already_configured\" | \"not_installed\" | \"error\";\n path?: string;\n error?: string;\n}\n\nexport async function autoConfigureMcpClients(): Promise<ConfigureResult[]> {\n const results: ConfigureResult[] = [];\n const configurators = [configureCursor, configureVSCode, configureClaude, configureWindsurf];\n for (const fn of configurators) {\n try {\n results.push(await fn());\n } catch (err) {\n const name = fn.name.replace(\"configure\", \"\");\n results.push({ client: name, status: \"error\", error: String(err) });\n }\n }\n return results;\n}\n","/**\n * Stack memory packs — pre-seeded validated memories for common stacks.\n *\n * Each pack contains 4-8 high-value gotchas/conventions that every team\n * using that stack rediscovers. Pre-seeding them means haive is useful\n * from J+0, not J+30.\n */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n serializeMemory,\n type HaivePaths,\n} from \"@hiveai/core\";\n\ninterface PackMemory {\n slug: string;\n type: \"gotcha\" | \"convention\" | \"decision\" | \"architecture\";\n tags: string[];\n body: string;\n}\n\ntype StackName = \"nestjs\" | \"nextjs\" | \"remix\" | \"react\" | \"express\" | \"fastify\" | \"prisma\" | \"drizzle\";\n\nconst PACKS: Record<StackName, PackMemory[]> = {\n nestjs: [\n {\n slug: \"jwtmodule-requires-secret\",\n type: \"gotcha\",\n tags: [\"auth\", \"jwt\", \"nestjs\"],\n body: `JwtModule must be registered with an explicit secret — there is no default.\n\n\\`\\`\\`ts\nJwtModule.register({ secret: process.env.JWT_SECRET, signOptions: { expiresIn: '7d' } })\n\\`\\`\\`\n\nWithout a secret, tokens are signed with an empty string and any client can forge them.\nAlways load the secret from env and validate it is defined at startup.`,\n },\n {\n slug: \"global-validation-pipe\",\n type: \"convention\",\n tags: [\"validation\", \"nestjs\", \"security\"],\n body: `Register ValidationPipe globally in main.ts, not per-controller.\n\n\\`\\`\\`ts\napp.useGlobalPipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true }));\n\\`\\`\\`\n\n- \\`whitelist: true\\` strips unknown properties silently\n- \\`forbidNonWhitelisted: true\\` throws 400 on unknown fields (safer)\n- Without this, NestJS passes unvalidated payloads to handlers.`,\n },\n {\n slug: \"nestjs-no-direct-orm-in-controller\",\n type: \"convention\",\n tags: [\"architecture\", \"nestjs\"],\n body: `Controllers must never import Prisma/TypeORM directly — that belongs in Services.\n\nController → Service → Repository (or direct ORM) is the required layering.\nDirect ORM usage in controllers makes testing impossible and couples transport to persistence.`,\n },\n {\n slug: \"nestjs-exception-filter-for-prisma\",\n type: \"gotcha\",\n tags: [\"error-handling\", \"nestjs\", \"prisma\"],\n body: `Prisma errors bubble up as unhandled 500s without a custom exception filter.\n\nCreate an \\`AllExceptionsFilter\\` or a specific \\`PrismaClientExceptionFilter\\` that maps:\n- P2002 (unique constraint) → 409 Conflict\n- P2025 (record not found) → 404 Not Found\n- P2003 (foreign key) → 422 Unprocessable\n\nWithout this, clients receive raw Prisma error messages which may leak schema info.`,\n },\n ],\n\n nextjs: [\n {\n slug: \"server-components-no-client-hooks\",\n type: \"gotcha\",\n tags: [\"nextjs\", \"react\", \"server-components\"],\n body: `Server Components cannot use useState, useEffect, or any browser APIs.\n\nAdd \\`\"use client\"\\` at the top of any component that needs hooks or event handlers.\nThe boundary propagates down — children of a client component don't need the directive.\n\nCommon mistake: importing a client-only library (e.g. framer-motion) in a server component\ncauses a cryptic runtime error. Check for browser globals (window, document, localStorage).`,\n },\n {\n slug: \"nextjs-env-client-exposure\",\n type: \"gotcha\",\n tags: [\"security\", \"nextjs\", \"env\"],\n body: `Only environment variables prefixed with NEXT_PUBLIC_ are exposed to the browser.\n\nNever put secrets in NEXT_PUBLIC_* variables — they are bundled into the client JS.\nVariables without the prefix are server-only and safe for API keys, database URLs, etc.`,\n },\n {\n slug: \"nextjs-fetch-cache-defaults\",\n type: \"gotcha\",\n tags: [\"nextjs\", \"caching\", \"fetch\"],\n body: `In Next.js App Router, \\`fetch()\\` is cached indefinitely by default in Server Components.\n\nAdd \\`{ cache: 'no-store' }\\` for dynamic data, or \\`{ next: { revalidate: 60 } }\\` for ISR.\nForgetting this means stale data is returned after a deploy until the cache expires.`,\n },\n {\n slug: \"nextjs-metadata-api\",\n type: \"convention\",\n tags: [\"nextjs\", \"seo\"],\n body: `Use the Metadata API (export const metadata / generateMetadata) instead of <Head>.\n\n\\`<Head>\\` from next/head still works in pages/ but is not supported in the App Router.\nUse \\`generateMetadata\\` for dynamic titles/descriptions based on route params.`,\n },\n ],\n\n remix: [\n {\n slug: \"remix-loader-vs-action\",\n type: \"convention\",\n tags: [\"remix\", \"architecture\"],\n body: `loader = GET data for rendering. action = handle form submissions / mutations.\n\n- \\`loader\\` runs on every GET request (server-side, returns data for the component)\n- \\`action\\` runs on POST/PUT/DELETE (mutations — redirect after success)\n- Never fetch inside the component itself for route data — use the loader instead.`,\n },\n {\n slug: \"remix-error-boundaries\",\n type: \"gotcha\",\n tags: [\"remix\", \"error-handling\"],\n body: `Each route should export an ErrorBoundary to catch loader/action errors gracefully.\n\nWithout it, errors bubble to the root boundary and replace the entire page.\nExport \\`export function ErrorBoundary() { ... }\\` to scope errors to the route.`,\n },\n ],\n\n react: [\n {\n slug: \"useeffect-cleanup\",\n type: \"gotcha\",\n tags: [\"react\", \"memory-leak\"],\n body: `useEffect subscriptions, timers, and async operations need cleanup to avoid memory leaks.\n\n\\`\\`\\`ts\nuseEffect(() => {\n const controller = new AbortController();\n fetchData({ signal: controller.signal });\n return () => controller.abort(); // cleanup\n}, [dep]);\n\\`\\`\\`\n\nMissing cleanup causes: state updates on unmounted components, duplicate subscriptions,\nand event listeners that accumulate across re-renders.`,\n },\n {\n slug: \"react-key-prop-in-lists\",\n type: \"gotcha\",\n tags: [\"react\", \"performance\"],\n body: `Keys must be stable, unique IDs — never use array index as key.\n\nUsing index as key causes React to re-render wrong items on reorder/filter,\ncorrupts form state, and triggers avoidable DOM mutations.\nUse item.id or a stable hash — never Math.random().`,\n },\n {\n slug: \"react-avoid-use-effect-for-derived-state\",\n type: \"convention\",\n tags: [\"react\", \"state\"],\n body: `Don't use useEffect to sync state from props — compute it during render instead.\n\n\\`\\`\\`ts\n// ❌ Bad\nconst [fullName, setFullName] = useState('');\nuseEffect(() => { setFullName(first + ' ' + last); }, [first, last]);\n\n// ✅ Good\nconst fullName = first + ' ' + last; // derived during render\n\\`\\`\\``,\n },\n ],\n\n express: [\n {\n slug: \"express-missing-validation\",\n type: \"gotcha\",\n tags: [\"security\", \"express\", \"validation\"],\n body: `Express does not validate request bodies by default — always validate with zod, joi, or express-validator.\n\nWithout validation:\n- req.body fields are \\`any\\` and may be missing, wrong type, or injected\n- Downstream code crashes or processes malicious data\nAdd a validation middleware for every route that accepts user input.`,\n },\n {\n slug: \"express-async-error-propagation\",\n type: \"gotcha\",\n tags: [\"express\", \"error-handling\"],\n body: `Async route handlers don't propagate errors to error middleware without explicit next(err).\n\n\\`\\`\\`ts\n// ❌ Unhandled — Express never sees the rejection\napp.get('/', async (req, res) => { throw new Error('oops'); });\n\n// ✅ Correct\napp.get('/', async (req, res, next) => {\n try { await doWork(); }\n catch (err) { next(err); }\n});\n\\`\\`\\`\nOr use express-async-errors / wrap helper.`,\n },\n ],\n\n fastify: [\n {\n slug: \"fastify-schema-validation-required\",\n type: \"convention\",\n tags: [\"fastify\", \"validation\", \"security\"],\n body: `Always define a JSON schema on routes — Fastify validates and coerces automatically.\n\n\\`\\`\\`ts\nfastify.post('/users', {\n schema: { body: { type: 'object', required: ['email'], properties: { email: { type: 'string', format: 'email' } } } }\n}, handler)\n\\`\\`\\`\nRoutes without schema accept any body and bypass Fastify's fast-json-stringify serialization.`,\n },\n ],\n\n prisma: [\n {\n slug: \"prisma-no-disconnect-in-lambda\",\n type: \"gotcha\",\n tags: [\"prisma\", \"serverless\"],\n body: `Do NOT call prisma.$disconnect() inside Lambda/Edge function handlers.\n\nCalling $disconnect() after each request wastes the warm connection pool.\nCreate one PrismaClient per process (module-level singleton), not per request.\nDisconnecting is only needed when the process is shutting down.`,\n },\n {\n slug: \"prisma-migrations-never-modify\",\n type: \"convention\",\n tags: [\"prisma\", \"database\", \"migrations\"],\n body: `Never modify an existing migration file — create a new one instead.\n\nPrisma tracks migration history by file hash. Editing a deployed migration\ncauses \\`migrate deploy\\` to fail with a checksum mismatch in production.\nAlways use \\`npx prisma migrate dev --name <description>\\` to create incremental migrations.`,\n },\n ],\n\n drizzle: [\n {\n slug: \"drizzle-always-await-queries\",\n type: \"gotcha\",\n tags: [\"drizzle\", \"async\"],\n body: `Drizzle queries are thenable but not auto-executed — always await them.\n\n\\`\\`\\`ts\n// ❌ Silently returns a query builder, never executes\nconst rows = db.select().from(users).where(eq(users.id, id));\n\n// ✅ Correct\nconst rows = await db.select().from(users).where(eq(users.id, id));\n\\`\\`\\``,\n },\n {\n slug: \"drizzle-schema-must-match-db\",\n type: \"gotcha\",\n tags: [\"drizzle\", \"migrations\"],\n body: `Drizzle does NOT auto-sync the schema to the database — you must run migrations explicitly.\n\nAfter changing schema.ts:\n1. \\`npx drizzle-kit generate\\` — creates migration SQL\n2. \\`npx drizzle-kit migrate\\` (or push in dev) — applies it\n\nWithout this, queries silently operate on stale column definitions and may return wrong data.`,\n },\n ],\n};\n\nexport const SUPPORTED_STACKS = Object.keys(PACKS) as StackName[];\n\nexport function isValidStack(name: string): name is StackName {\n return name in PACKS;\n}\n\n/** Auto-detect which stacks are present from a package.json dep map. */\nexport function autoDetectStacks(deps: Record<string, string>): StackName[] {\n const detected: StackName[] = [];\n const stackDetectors: [StackName, string[]][] = [\n [\"nestjs\", [\"@nestjs/core\"]],\n [\"nextjs\", [\"next\"]],\n [\"remix\", [\"@remix-run/react\", \"@remix-run/node\"]],\n [\"react\", [\"react\"]],\n [\"express\", [\"express\"]],\n [\"fastify\", [\"fastify\"]],\n [\"prisma\", [\"@prisma/client\", \"prisma\"]],\n [\"drizzle\", [\"drizzle-orm\"]],\n ];\n for (const [stack, signals] of stackDetectors) {\n if (signals.some((s) => s in deps)) detected.push(stack);\n }\n // Avoid react when next/remix already detected (deduplicate)\n if (detected.includes(\"nextjs\") || detected.includes(\"remix\")) {\n return detected.filter((s) => s !== \"react\");\n }\n return detected;\n}\n\n/** Seed memory pack files on disk. Returns count of memories written. */\nexport async function seedStackPack(\n haivePaths: HaivePaths,\n stack: StackName,\n): Promise<number> {\n const memories = PACKS[stack];\n if (!memories) return 0;\n\n await mkdir(haivePaths.teamDir, { recursive: true });\n\n let count = 0;\n for (const mem of memories) {\n const fm = buildFrontmatter({\n type: mem.type,\n slug: `${stack}-${mem.slug}`,\n scope: \"team\",\n status: \"validated\",\n tags: mem.tags,\n });\n const filePath = memoryFilePath(haivePaths, \"team\", fm.id);\n if (existsSync(filePath)) continue; // never overwrite existing\n const content = serializeMemory({ frontmatter: fm, body: mem.body });\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, content, \"utf8\");\n count++;\n }\n return count;\n}\n","import { mkdir, writeFile, chmod, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface InstallHooksOptions {\n dir?: string;\n force?: boolean;\n}\n\nconst HOOK_MARKER = \"# hAIve auto-generated\";\n\nconst POST_MERGE_BODY = `#!/bin/sh\n${HOOK_MARKER} — keep this block to allow upgrades. Hand-edit anything outside it.\n\n# After a merge or pull, refresh memory anchors and auto-promote eligible\n# memories so that everyone on this branch sees consistent confidence levels.\nif command -v haive >/dev/null 2>&1; then\n haive sync --quiet --since ORIG_HEAD || true\nelif [ -x ./node_modules/.bin/haive ]; then\n ./node_modules/.bin/haive sync --quiet --since ORIG_HEAD || true\nfi\n`;\n\nconst PRE_PUSH_BODY = `#!/bin/sh\n${HOOK_MARKER} — keep this block to allow upgrades. Hand-edit anything outside it.\n\n# Before pushing, run haive precommit to surface known anti-patterns and stale memories.\n# Exit 0 always — this is advisory only (set HAIVE_BLOCK=1 to make it blocking).\nHAIVE_BLOCK=\\${HAIVE_BLOCK:-0}\n\n_haive() {\n if command -v haive >/dev/null 2>&1; then haive \"$@\"\n elif [ -x ./node_modules/.bin/haive ]; then ./node_modules/.bin/haive \"$@\"\n else return 0\n fi\n}\n\n# Run pre-commit check on diff between local and remote\nLOCAL_BRANCH=\\$(git rev-parse --abbrev-ref HEAD)\nREMOTE_SHA=\\$(git rev-parse --verify \"@{u}\" 2>/dev/null || echo \"\")\nif [ -n \"\\$REMOTE_SHA\" ]; then\n DIFF=\\$(git diff \"\\$REMOTE_SHA\"..HEAD 2>/dev/null || \"\")\n if [ -n \"\\$DIFF\" ]; then\n _haive precommit --quiet 2>/dev/null || true\n fi\nfi\n\n# Remind agent to save session recap if env var is set\nif [ \"\\$HAIVE_SESSION_REMINDER\" = \"1\" ]; then\n echo \"haive: session active — remember to call mem_session_end before closing.\" >&2\nfi\n\nexit 0\n`;\n\nconst HOOKS: { name: string; body: string }[] = [\n { name: \"post-merge\", body: POST_MERGE_BODY },\n { name: \"post-rewrite\", body: POST_MERGE_BODY },\n { name: \"pre-push\", body: PRE_PUSH_BODY },\n];\n\nexport function registerInstallHooks(program: Command): void {\n program\n .command(\"install-hooks\")\n .description(\n \"Install git hooks so haive sync runs automatically after every pull or merge.\\n\\n\" +\n \" Installs:\\n\" +\n \" post-merge / post-rewrite — runs haive sync after every pull/merge\\n\" +\n \" pre-push — runs haive precommit before every push (advisory)\\n\\n\" +\n \" Installed automatically by haive init (autopilot mode).\\n\" +\n \" Use --force to overwrite existing hooks.\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--force\", \"overwrite existing hooks\")\n .action(async (opts: InstallHooksOptions) => {\n const root = findProjectRoot(opts.dir);\n const gitDir = path.join(root, \".git\");\n if (!existsSync(gitDir)) {\n ui.error(`No .git directory at ${root}.`);\n process.exitCode = 1;\n return;\n }\n const hooksDir = path.join(gitDir, \"hooks\");\n await mkdir(hooksDir, { recursive: true });\n\n let installed = 0;\n let skipped = 0;\n for (const { name, body } of HOOKS) {\n const file = path.join(hooksDir, name);\n if (existsSync(file) && !opts.force) {\n const existing = await readFile(file, \"utf8\");\n if (!existing.includes(HOOK_MARKER)) {\n ui.warn(`${name} already exists and was not written by hAIve. Re-run with --force to overwrite.`);\n skipped++;\n continue;\n }\n }\n await writeFile(file, body, \"utf8\");\n await chmod(file, 0o755);\n installed++;\n }\n ui.success(`Installed ${installed} hook(s) in .git/hooks/${skipped ? `, skipped ${skipped}` : \"\"}`);\n ui.info(\"post-merge: haive sync runs after every pull/merge.\");\n ui.info(\"pre-push: haive precommit runs before every push (advisory, never blocks).\");\n ui.info(\" Set HAIVE_BLOCK=1 in your shell to make pre-push blocking.\");\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nconst require = createRequire(import.meta.url);\n\ninterface McpOptions {\n dir?: string;\n}\n\nexport function registerMcp(program: Command): void {\n program\n .command(\"mcp\")\n .description(\n \"Start the hAIve MCP server (stdio transport) for direct testing.\\n\\n\" +\n \" In normal use, your AI client (Claude Code, Cursor, VS Code) starts the server\\n\" +\n \" automatically via the haive-mcp binary listed in your MCP config file.\\n\\n\" +\n \" This command is useful for debugging or for clients that require manual startup.\\n\\n\" +\n \" Client config examples (point at haive-mcp binary, not this command):\\n\" +\n \" Claude Code: ~/.claude.json → mcpServers.haive.command = \\\"haive-mcp\\\"\\n\" +\n \" Cursor: ~/.cursor/mcp.json → mcpServers.haive.command = \\\"haive-mcp\\\"\\n\" +\n \" VS Code: code --add-mcp '{\\\"name\\\":\\\"haive\\\",\\\"command\\\":\\\"haive-mcp\\\",...}'\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root (defaults to nearest .ai/ or .git/)\")\n .action((opts: McpOptions) => {\n const root = findProjectRoot(opts.dir);\n const bin = locateMcpBin();\n if (!bin) {\n ui.error(\n \"@hiveai/mcp binary not found. Install @hiveai/mcp or run `pnpm build` in the monorepo.\",\n );\n process.exit(1);\n }\n const child = spawn(\"node\", [bin, \"--root\", root], {\n stdio: [\"inherit\", \"inherit\", \"inherit\"],\n env: process.env,\n });\n child.on(\"exit\", (code) => process.exit(code ?? 0));\n });\n}\n\nfunction locateMcpBin(): string | null {\n // 1. Resolve the @hiveai/mcp package and use its bin entry.\n try {\n const pkgPath = require.resolve(\"@hiveai/mcp/package.json\");\n const pkgDir = path.dirname(pkgPath);\n const candidate = path.join(pkgDir, \"dist\", \"index.js\");\n if (existsSync(candidate)) return candidate;\n } catch {\n // not installed — fall through\n }\n\n // 2. Fallback: look for sibling package in monorepo dev mode.\n const here = path.dirname(fileURLToPath(import.meta.url));\n const sibling = path.resolve(here, \"..\", \"..\", \"..\", \"mcp\", \"dist\", \"index.js\");\n if (existsSync(sibling)) return sibling;\n\n return null;\n}\n","import { spawnSync } from \"node:child_process\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n DEFAULT_AUTO_PROMOTE_RULE,\n buildFrontmatter,\n findProjectRoot,\n getUsage,\n isAutoPromoteEligible,\n isDecaying,\n loadCodeMap,\n loadConfig,\n loadMemoriesFromDir,\n loadUsageIndex,\n pullCrossRepoSources,\n resolveHaivePaths,\n resolveManifestFiles,\n serializeMemory,\n trackDependencies,\n verifyAnchor,\n watchContracts,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nconst BRIDGE_START = \"<!-- haive:memories-start -->\";\nconst BRIDGE_END = \"<!-- haive:memories-end -->\";\n\ninterface SyncOptions {\n dir?: string;\n quiet?: boolean;\n since?: string;\n verify?: boolean;\n promote?: boolean;\n injectBridge?: boolean;\n bridgeFile?: string;\n bridgeMaxMemories?: string;\n embed?: boolean;\n noCrossRepo?: boolean;\n noDeps?: boolean;\n noContracts?: boolean;\n}\n\nexport function registerSync(program: Command): void {\n program\n .command(\"sync\")\n .description(\n \"Refresh memory state after a git pull or merge.\\n\" +\n \" What it does:\\n\" +\n \" 1. Verifies anchor paths — marks stale if files/symbols moved or deleted\\n\" +\n \" 2. Re-validates previously stale memories that are now fresh\\n\" +\n \" 3. Auto-promotes proposed memories (by usage count or time delay in autopilot)\\n\" +\n \" 4. Auto-refreshes code-map if source files changed\\n\" +\n \" 5. Reports decay warnings for memories unused >90 days\\n\\n\" +\n \" Install git hooks to run sync automatically: haive install-hooks\\n\\n\" +\n \" Examples:\\n\" +\n \" haive sync\\n\" +\n \" haive sync --since main # also report memories changed since main\\n\" +\n \" haive sync --embed # also rebuild embeddings index\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--quiet\", \"minimal output (suitable for git hooks)\")\n .option(\n \"--since <ref>\",\n \"git ref/commit to compare against; report memories added/modified/removed since\",\n )\n .option(\"--no-verify\", \"skip the anchor verification step\")\n .option(\"--no-promote\", \"skip the auto-promotion step\")\n .option(\n \"--inject-bridge\",\n \"inject top validated memories into CLAUDE.md (or --bridge-file) between <!-- haive:memories-start/end --> markers\",\n )\n .option(\"--bridge-file <path>\", \"bridge file to inject into (default: CLAUDE.md)\")\n .option(\"--bridge-max-memories <n>\", \"max memories to inject into bridge file\", \"5\")\n .option(\"--embed\", \"rebuild embeddings index after sync (requires @haive/embeddings)\")\n .option(\"--no-cross-repo\", \"skip cross-repo memory pull even if crossRepoSources is configured\")\n .option(\"--no-deps\", \"skip dependency version tracking\")\n .option(\"--no-contracts\", \"skip contract file diff checking\")\n .action(async (opts: SyncOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n if (!opts.quiet) ui.warn(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const log = (msg: string): void => {\n if (!opts.quiet) console.log(msg);\n };\n\n const config = await loadConfig(paths);\n const autoApproveDelayHours = config.autoApproveDelayHours ?? null;\n const autoPromoteMinReads = config.autoPromoteMinReads ?? DEFAULT_AUTO_PROMOTE_RULE.minReads;\n\n let staleMarked = 0;\n let revalidated = 0;\n let promoted = 0;\n let autoApproved = 0;\n\n if (opts.verify !== false) {\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n for (const { memory, filePath } of memories) {\n // session_recap records historical context — staleness doesn't apply.\n // If one was incorrectly stale-marked by a prior sync, auto-revalidate it now.\n if (memory.frontmatter.type === \"session_recap\") {\n if (memory.frontmatter.status === \"stale\") {\n await writeFile(\n filePath,\n serializeMemory({\n frontmatter: {\n ...memory.frontmatter,\n status: \"validated\",\n stale_reason: null,\n verified_at: new Date().toISOString(),\n },\n body: memory.body,\n }),\n \"utf8\",\n );\n revalidated++;\n }\n continue;\n }\n const isAnchored =\n memory.frontmatter.anchor.paths.length > 0 ||\n memory.frontmatter.anchor.symbols.length > 0;\n if (!isAnchored) continue;\n\n const result = await verifyAnchor(memory, { projectRoot: root });\n const verifiedAt = new Date().toISOString();\n\n if (result.stale) {\n if (memory.frontmatter.status !== \"stale\") {\n await writeFile(\n filePath,\n serializeMemory({\n frontmatter: {\n ...memory.frontmatter,\n status: \"stale\",\n verified_at: verifiedAt,\n stale_reason: result.reason,\n },\n body: memory.body,\n }),\n \"utf8\",\n );\n staleMarked++;\n }\n } else if (memory.frontmatter.status === \"stale\") {\n await writeFile(\n filePath,\n serializeMemory({\n frontmatter: {\n ...memory.frontmatter,\n status: \"validated\",\n verified_at: verifiedAt,\n stale_reason: null,\n },\n body: memory.body,\n }),\n \"utf8\",\n );\n revalidated++;\n }\n }\n }\n\n if (opts.promote !== false) {\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const nowMs = Date.now();\n for (const { memory, filePath } of memories) {\n const fm = memory.frontmatter;\n if (fm.type === \"session_recap\") continue;\n\n // Usage-based auto-promotion (existing logic, threshold from config)\n if (\n isAutoPromoteEligible(fm, getUsage(usage, fm.id), {\n minReads: autoPromoteMinReads,\n maxRejections: DEFAULT_AUTO_PROMOTE_RULE.maxRejections,\n })\n ) {\n await writeFile(\n filePath,\n serializeMemory({ frontmatter: { ...fm, status: \"validated\" }, body: memory.body }),\n \"utf8\",\n );\n promoted++;\n continue;\n }\n\n // Time-based auto-approve: proposed memories older than N hours → validated\n if (\n autoApproveDelayHours !== null &&\n fm.status === \"proposed\" &&\n fm.scope === \"team\"\n ) {\n const ageHours =\n (nowMs - new Date(fm.created_at).getTime()) / (1000 * 60 * 60);\n if (ageHours >= autoApproveDelayHours) {\n await writeFile(\n filePath,\n serializeMemory({\n frontmatter: {\n ...fm,\n status: \"validated\",\n verified_at: new Date().toISOString(),\n },\n body: memory.body,\n }),\n \"utf8\",\n );\n autoApproved++;\n }\n }\n }\n }\n\n const sinceReport = opts.since ? collectSinceChanges(root, opts.since) : null;\n\n const draftMemories = (await loadMemoriesFromDir(paths.memoriesDir)).filter(\n (m) => m.memory.frontmatter.status === \"draft\",\n );\n const draftCount = draftMemories.length;\n\n const autoApprovedNote = autoApproved > 0 ? ` · ${autoApproved} auto-approved` : \"\";\n log(\n `${ui.dim(\"sync:\")} ${staleMarked} stale · ${revalidated} revalidated · ${promoted} promoted${autoApprovedNote}${sinceReport ? ` · ${sinceReport.added.length}+/${sinceReport.modified.length}~/${sinceReport.removed.length}- since ${opts.since}` : \"\"}`,\n );\n if (!opts.quiet && draftCount > 0) {\n log(\n ui.dim(\n `ℹ ${draftCount} memor${draftCount === 1 ? \"y\" : \"ies\"} in draft — run \\`haive memory approve <id>\\` to activate or \\`haive memory list --status draft\\` to review`,\n ),\n );\n }\n\n if (opts.injectBridge) {\n const bridgeFile = opts.bridgeFile\n ? path.resolve(opts.bridgeFile)\n : path.join(root, \"CLAUDE.md\");\n const maxInject = Math.max(1, Number(opts.bridgeMaxMemories ?? 5));\n await injectBridge(bridgeFile, paths.memoriesDir, maxInject, root, opts.quiet);\n }\n\n if (sinceReport && !opts.quiet) {\n if (sinceReport.added.length > 0) {\n log(ui.bold(\"\\nNew memories:\"));\n for (const f of sinceReport.added) log(` + ${f}`);\n }\n if (sinceReport.modified.length > 0) {\n log(ui.bold(\"\\nModified:\"));\n for (const f of sinceReport.modified) log(` ~ ${f}`);\n }\n if (sinceReport.removed.length > 0) {\n log(ui.bold(\"\\nRemoved:\"));\n for (const f of sinceReport.removed) log(` - ${f}`);\n }\n }\n\n // Decay report: memories not read in >90 days\n if (!opts.quiet) {\n const allForDecay = await loadMemoriesFromDir(paths.memoriesDir);\n const usageForDecay = await loadUsageIndex(paths);\n const decaying = allForDecay.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\" || fm.status === \"stale\") return false;\n const u = getUsage(usageForDecay, fm.id);\n return isDecaying(u, fm.created_at);\n });\n if (decaying.length > 0) {\n log(ui.yellow(`\\n⚠ ${decaying.length} memor${decaying.length === 1 ? \"y\" : \"ies\"} not read in >90 days (consider reviewing or deprecating):`));\n for (const { memory } of decaying) {\n log(ui.dim(` ${memory.frontmatter.id}`));\n }\n }\n }\n\n // ── Cross-repo pull ────────────────────────────────────────────────────────\n if (opts.noCrossRepo !== true && (config.crossRepoSources ?? []).length > 0) {\n try {\n const crossReports = await pullCrossRepoSources(paths, config, root);\n for (const r of crossReports) {\n const total = r.imported.length + r.updated.length;\n if (total > 0 || r.errors.length > 0) {\n log(\n ui.dim(\n `cross-repo [${r.source}]: ${r.imported.length} imported · ${r.updated.length} updated · ${r.skipped.length} unchanged` +\n (r.errors.length > 0 ? ` · ⚠ ${r.errors.length} error(s)` : \"\"),\n ),\n );\n for (const e of r.errors) ui.warn(` cross-repo error: ${e}`);\n }\n }\n } catch (err) {\n ui.warn(`cross-repo pull failed: ${String(err)}`);\n }\n }\n\n // ── Dependency tracker ─────────────────────────────────────────────────────\n if (opts.noDeps !== true) {\n try {\n const manifestFiles = resolveManifestFiles(root, config.dependencyFiles);\n if (manifestFiles.length > 0) {\n const depResults = await trackDependencies(root, paths.haiveDir, manifestFiles);\n for (const result of depResults) {\n const majorBumps = result.changes.filter((c) => c.isMajorBump);\n const minorChanges = result.changes.filter((c) => !c.isMajorBump);\n if (result.changes.length > 0) {\n log(\n ui.yellow(\n `⚠ dependency changes in ${result.file}: ${majorBumps.length} major bump(s) · ${minorChanges.length} minor change(s)`,\n ),\n );\n for (const c of majorBumps) {\n log(ui.yellow(` MAJOR: ${c.name} ${c.from} → ${c.to}`));\n }\n for (const c of minorChanges) {\n log(ui.dim(` minor: ${c.name} ${c.from} → ${c.to}`));\n }\n // Create a gotcha memory for major bumps\n if (majorBumps.length > 0) {\n const slugParts = result.file.replace(/[^a-z0-9]/gi, \"-\").toLowerCase();\n const slug = `dep-major-bump-${slugParts}-${Date.now().toString(36)}`;\n const depList = majorBumps\n .map((c) => `- 🔴 **${c.name}** : \\`${c.from}\\` → \\`${c.to}\\``)\n .join(\"\\n\");\n const body =\n `## ⚠️ Action requise — confirmation humaine obligatoire\\n\\n` +\n `Des dépendances dans \\`${result.file}\\` ont changé de version majeure.\\n` +\n `Une version majeure peut contenir des **breaking changes** qui impactent ce projet.\\n\\n` +\n `${depList}\\n\\n` +\n `---\\n\\n` +\n `**🚫 Ne modifie aucun code de façon autonome.**\\n\\n` +\n `Informe le développeur avec ce message :\\n\\n` +\n `> *« J'ai détecté que ${majorBumps.map((c) => `\\`${c.name}\\``).join(\", \")} ` +\n `a changé de version majeure (${majorBumps.map((c) => `${c.from} → ${c.to}`).join(\", \")}). ` +\n `Cela peut introduire des incompatibilités dans ce projet. ` +\n `Veux-tu que j'analyse l'impact et que je propose des mises à jour ? »*\\n\\n` +\n `Attends une **confirmation explicite** avant d'agir.\\n\\n` +\n `**Prochaines étapes (si confirmé) :**\\n` +\n `- Consulter le CHANGELOG : \\`haive memory import-changelog --from node_modules/<pkg>/CHANGELOG.md\\`\\n` +\n `- Vérifier les mémoires ancrées : \\`haive memory verify\\``;\n const fm = buildFrontmatter({\n type: \"gotcha\",\n slug,\n scope: \"team\",\n status: \"validated\",\n tags: [\"dependency\", \"breaking-change\", \"auto-generated\", \"requires-human-approval\"],\n paths: [result.file],\n topic: `dep-bump-${slugParts}`,\n });\n const teamDir = path.join(paths.memoriesDir, \"team\");\n await mkdir(teamDir, { recursive: true });\n await writeFile(\n path.join(teamDir, `${fm.id}.md`),\n serializeMemory({ frontmatter: { ...fm, requires_human_approval: true }, body }),\n \"utf8\",\n );\n log(ui.yellow(` → memory created: ${fm.id}`));\n }\n }\n }\n }\n } catch (err) {\n ui.warn(`dependency tracker failed: ${String(err)}`);\n }\n }\n\n // ── Contract watcher ───────────────────────────────────────────────────────\n if (opts.noContracts !== true && (config.contractFiles ?? []).length > 0) {\n try {\n const diffs = await watchContracts(root, paths.haiveDir, config.contractFiles!);\n for (const diff of diffs) {\n const breaking = diff.changes.filter((c) => c.severity === \"breaking\");\n const additive = diff.changes.filter((c) => c.severity === \"additive\");\n log(\n ui.yellow(\n `⚠ contract changed [${diff.contract}]: ${breaking.length} breaking · ${additive.length} additive`,\n ),\n );\n for (const c of diff.changes) {\n const icon = c.severity === \"breaking\" ? \"🔴\" : c.severity === \"additive\" ? \"🟢\" : \"🟡\";\n log(` ${icon} ${c.description}`);\n }\n // Create a gotcha memory for breaking contract changes\n if (breaking.length > 0) {\n const slug = `contract-breaking-${diff.contract.replace(/[^a-z0-9]/gi, \"-\").toLowerCase()}-${Date.now().toString(36)}`;\n const breakingList = breaking.map((c) => `- 🔴 **${c.kind}** : ${c.description}`).join(\"\\n\");\n const addList = additive.length > 0\n ? `\\n\\n### Changements non-breaking (additifs)\\n` +\n additive.map((c) => `- 🟢 ${c.description}`).join(\"\\n\")\n : \"\";\n const body =\n `## ⚠️ Action requise — confirmation humaine obligatoire\\n\\n` +\n `Le contrat **\\`${diff.contract}\\`** (\\`${diff.file}\\`) a été modifié.\\n` +\n `Des **breaking changes** ont été détectés — ce projet consomme peut-être ce contrat.\\n\\n` +\n `${breakingList}${addList}\\n\\n` +\n `---\\n\\n` +\n `**🚫 Ne modifie aucun code de façon autonome.**\\n\\n` +\n `Informe le développeur avec ce message :\\n\\n` +\n `> *« J'ai détecté que le contrat \\`${diff.contract}\\` a changé : ` +\n `${breaking.length} breaking change(s) détecté(s). ` +\n `Ce projet dépend peut-être de ce contrat. ` +\n `Veux-tu que j'analyse l'impact et que je propose des mises à jour ? »*\\n\\n` +\n `Attends une **confirmation explicite** avant d'agir.\\n\\n` +\n `**Prochaines étapes (si confirmé) :**\\n` +\n `- Rechercher les usages : \\`haive memory for-files <fichiers concernés>\\`\\n` +\n `- Vérifier les mémoires liées : \\`haive memory query ${diff.contract}\\``;\n const fm = buildFrontmatter({\n type: \"gotcha\",\n slug,\n scope: \"team\",\n status: \"validated\",\n tags: [\"api-contract\", \"breaking-change\", diff.contract, \"auto-generated\", \"requires-human-approval\"],\n paths: [diff.file],\n topic: `contract-breaking-${diff.contract}`,\n });\n const teamDir = path.join(paths.memoriesDir, \"team\");\n await mkdir(teamDir, { recursive: true });\n await writeFile(\n path.join(teamDir, `${fm.id}.md`),\n serializeMemory({ frontmatter: { ...fm, requires_human_approval: true }, body }),\n \"utf8\",\n );\n log(ui.yellow(` → memory created: ${fm.id}`));\n }\n }\n } catch (err) {\n ui.warn(`contract watcher failed: ${String(err)}`);\n }\n }\n\n // ── Auto-refresh code-map if source files changed since it was generated ──\n const existingMap = await loadCodeMap(paths);\n if (existingMap) {\n const mapAge = new Date(existingMap.generated_at).getTime();\n // Check if any tracked source files are newer than the map\n const gitResult = spawnSync(\n \"git\",\n [\n \"diff\",\n \"--name-only\",\n \"--diff-filter=ACMR\",\n `@{${new Date(mapAge).toISOString()}}..HEAD`,\n \"--\",\n \"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\",\n \"*.java\", \"*.kt\",\n \"*.py\",\n \"*.go\",\n \"*.rs\",\n \"*.cs\",\n \"*.php\",\n ],\n { cwd: root, encoding: \"utf8\" },\n );\n const changedSourceFiles = (gitResult.stdout ?? \"\").trim();\n if (changedSourceFiles.length > 0) {\n // Lazily import the indexer to avoid circular deps\n try {\n const { buildCodeMap, saveCodeMap } = await import(\"@hiveai/core\");\n log(ui.dim(\"code-map: source files changed — refreshing index…\"));\n const newMap = await buildCodeMap(root);\n await saveCodeMap(paths, newMap);\n log(ui.dim(`code-map: refreshed (${Object.keys(newMap.files).length} files)`));\n } catch {\n // Non-fatal — code-map refresh is best-effort\n }\n }\n }\n\n // --embed: rebuild embeddings index after sync\n if (opts.embed) {\n try {\n const emb = await import(\"@hiveai/embeddings\");\n log(ui.dim(\"embed: rebuilding index…\"));\n const report = await emb.rebuildIndex(paths);\n log(ui.dim(`embed: index rebuilt (${report.added} added, ${report.updated} updated, ${report.removed} removed)`));\n } catch {\n ui.warn(\"--embed: @hiveai/embeddings not available or index build failed. Run `haive embeddings index` manually.\");\n }\n }\n });\n}\n\nasync function injectBridge(\n bridgeFile: string,\n memoriesDir: string,\n maxMemories: number,\n root: string,\n quiet?: boolean,\n): Promise<void> {\n if (!existsSync(memoriesDir)) return;\n\n const all = await loadMemoriesFromDir(memoriesDir);\n const top = all\n .filter(({ memory }) => {\n const s = memory.frontmatter.status;\n if (memory.frontmatter.type === \"session_recap\") return false;\n return s === \"validated\" || s === \"proposed\";\n })\n .sort((a, b) => {\n const score = (m: typeof a) => {\n const s = m.memory.frontmatter.status;\n return (s === \"validated\" ? 2 : 1);\n };\n return score(b) - score(a);\n })\n .slice(0, maxMemories);\n\n const block = top\n .map((m) => {\n const fm = m.memory.frontmatter;\n const unverified = fm.status === \"proposed\" ? \" [UNVERIFIED]\" : \"\";\n return `### ${fm.id} (${fm.scope}/${fm.type})${unverified}\\n${m.memory.body.trim()}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n const injected =\n `${BRIDGE_START}\\n` +\n `<!-- AUTO-GENERATED by haive sync --inject-bridge — do not edit between these markers -->\\n\\n` +\n block +\n `\\n\\n${BRIDGE_END}`;\n\n const fileExists = existsSync(bridgeFile);\n let existing = fileExists ? await readFile(bridgeFile, \"utf8\") : \"\";\n // Normalize line endings to avoid \\r\\n accumulation\n existing = existing.replace(/\\r\\n/g, \"\\n\");\n\n const startIdx = existing.indexOf(BRIDGE_START);\n const endIdx = existing.indexOf(BRIDGE_END);\n\n // Detect partial markers — safer to abort than silently corrupt the file\n if (startIdx !== -1 && endIdx === -1) {\n ui.warn(`${path.relative(root, bridgeFile)}: found ${BRIDGE_START} without ${BRIDGE_END}. Fix the file manually before running --inject-bridge.`);\n return;\n }\n if (startIdx === -1 && endIdx !== -1) {\n ui.warn(`${path.relative(root, bridgeFile)}: found ${BRIDGE_END} without ${BRIDGE_START}. Fix the file manually before running --inject-bridge.`);\n return;\n }\n\n let updated: string;\n if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {\n updated = existing.slice(0, startIdx) + injected + existing.slice(endIdx + BRIDGE_END.length);\n } else {\n if (!fileExists && !quiet) {\n ui.info(`Creating ${path.relative(root, bridgeFile)} with haive memory block.`);\n }\n updated = existing + (existing.endsWith(\"\\n\") ? \"\" : \"\\n\") + \"\\n\" + injected + \"\\n\";\n }\n\n await writeFile(bridgeFile, updated, \"utf8\");\n if (!quiet) {\n console.log(\n ui.dim(`bridge: injected ${top.length} memor${top.length === 1 ? \"y\" : \"ies\"} into ${path.relative(root, bridgeFile)}`),\n );\n }\n}\n\ninterface SinceReport {\n added: string[];\n modified: string[];\n removed: string[];\n}\n\nfunction collectSinceChanges(root: string, ref: string): SinceReport | null {\n const result = spawnSync(\n \"git\",\n [\"-C\", root, \"diff\", \"--name-status\", \"--diff-filter=AMD\", `${ref}...HEAD`, \"--\", \".ai/memories\"],\n { encoding: \"utf8\" },\n );\n if (result.status !== 0) return null;\n\n const report: SinceReport = { added: [], modified: [], removed: [] };\n for (const line of result.stdout.split(\"\\n\")) {\n const [status, ...rest] = line.split(\"\\t\");\n const file = rest.join(\"\\t\").trim();\n if (!file) continue;\n if (status === \"A\") report.added.push(file);\n else if (status === \"M\") report.modified.push(file);\n else if (status === \"D\") report.removed.push(file);\n }\n return report;\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n inferModulesFromPaths,\n loadMemoriesFromDir,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n type MemoryFrontmatter,\n type MemoryScope,\n type MemoryType,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface AddOptions {\n type: MemoryType;\n slug: string;\n title?: string;\n scope?: MemoryScope;\n module?: string;\n tags?: string;\n domain?: string;\n author?: string;\n paths?: string;\n symbols?: string;\n commit?: string;\n body?: string;\n bodyFile?: string;\n topic?: string;\n dir?: string;\n}\n\nexport function registerMemoryAdd(memory: Command): void {\n memory\n .command(\"add\")\n .description(\n \"Save a piece of knowledge as a persistent memory.\\n\\n\" +\n \" Memory types:\\n\" +\n \" convention — how things are done here (naming, patterns, tooling)\\n\" +\n \" decision — a choice made and WHY (tradeoffs, constraints)\\n\" +\n \" gotcha — non-obvious behavior that surprises newcomers\\n\" +\n \" architecture — structural overview of a system or module\\n\" +\n \" glossary — domain terms and their meaning in this codebase\\n\" +\n \" attempt — failed approach (prefer 'haive memory tried' for better structure)\\n\\n\" +\n \" Tips:\\n\" +\n \" • --paths anchors the memory to source files for staleness detection\\n\" +\n \" • --topic enables upsert: future adds with the same topic update the existing memory\\n\" +\n \" • In autopilot mode, memories go directly to validated with team scope by default\\n\\n\" +\n \" Examples:\\n\" +\n \" haive memory add --type gotcha --slug jpa-open-in-view --scope team \\\\\\\\\\n\" +\n \" --paths src/main/resources/application.properties \\\\\\\\\\n\" +\n \" --body \\\"spring.jpa.open-in-view=false is intentional — do not re-enable.\\\"\\n\" +\n \" haive memory add --type convention --slug flyway-no-modify --topic flyway \\\\\\\\\\n\" +\n \" --scope team --body \\\"Never modify existing migrations. Create V{n+1}__desc.sql.\\\"\\n\",\n )\n .requiredOption(\"--type <type>\", \"convention | decision | gotcha | architecture | glossary | attempt\")\n .requiredOption(\"--slug <slug>\", \"short kebab-case identifier used in the file name\")\n .option(\"--title <text>\", \"memory title — becomes the first heading of the body\")\n .option(\"--scope <scope>\", \"personal | team | module (default: personal, or team in autopilot)\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"--tags <csv>\", \"comma-separated tags for easier retrieval\")\n .option(\"--domain <domain>\", \"domain (e.g. transactions)\")\n .option(\"--author <author>\", \"author email or handle\")\n .option(\"--paths <csv>\", \"anchor to source files — used for staleness detection by haive sync\")\n .option(\"--symbols <csv>\", \"anchor to specific symbols (class/function names)\")\n .option(\"--commit <sha>\", \"anchor to a specific commit SHA\")\n .option(\"--body <text>\", \"memory body content (Markdown) — overrides --title default body\")\n .option(\"--body-file <path>\", \"read memory body from a Markdown file — for long content\")\n .option(\"--no-auto-tag\", \"disable automatic tag suggestions inferred from anchor paths\")\n .option(\"--topic <key>\", \"stable key for upsert: if a memory with this topic+scope already exists, update it in-place (revision_count++)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: AddOptions & { autoTag?: boolean }) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const userTags = parseCsv(opts.tags);\n const anchorPaths = parseCsv(opts.paths);\n const autoTagsEnabled = opts.autoTag !== false;\n const inferredTags = autoTagsEnabled ? inferModulesFromPaths(anchorPaths) : [];\n const mergedTags = Array.from(new Set([...userTags, ...inferredTags]));\n\n // ── Anchor path validation ────────────────────────────────────────\n if (anchorPaths.length > 0) {\n const missing = anchorPaths.filter((p) => !existsSync(path.resolve(root, p)));\n if (missing.length > 0) {\n ui.warn(`Anchor path${missing.length > 1 ? \"s\" : \"\"} not found in project:`);\n for (const p of missing) ui.warn(` ✗ ${p}`);\n ui.warn(\n \"Memories anchored to non-existent paths will be immediately marked stale by \\`haive sync\\`.\\n\" +\n \" Verify the paths are relative to the project root and the files/directories exist.\",\n );\n }\n }\n\n const title = opts.title ?? opts.slug;\n let body: string;\n if (opts.bodyFile !== undefined) {\n if (!existsSync(opts.bodyFile)) {\n ui.error(`--body-file not found: ${opts.bodyFile}`);\n process.exitCode = 1;\n return;\n }\n const fileContent = await readFile(opts.bodyFile, \"utf8\");\n body = opts.title ? `# ${opts.title}\\n\\n${fileContent.trim()}\\n` : fileContent;\n } else if (opts.body !== undefined) {\n body = opts.title ? `# ${opts.title}\\n\\n${opts.body}` : opts.body;\n } else {\n body = `# ${title}\\n\\nTODO — write the memory body.\\n`;\n }\n\n // ── Dedup by content hash ─────────────────────────────────────────\n const scope = opts.scope ?? \"personal\";\n if (existsSync(paths.memoriesDir)) {\n const incomingHash = createHash(\"sha256\").update(body.trim()).digest(\"hex\").slice(0, 12);\n const allForHash = await loadMemoriesFromDir(paths.memoriesDir);\n const hashDup = allForHash.find(({ memory }) =>\n createHash(\"sha256\").update(memory.body.trim()).digest(\"hex\").slice(0, 12) === incomingHash &&\n memory.frontmatter.scope === scope,\n );\n if (hashDup) {\n ui.error(`Duplicate content detected — identical body already saved as \"${hashDup.memory.frontmatter.id}\".`);\n ui.error(\"Use \\`haive memory update\\` to modify it, or change the body to add new information.\");\n process.exitCode = 1;\n return;\n }\n }\n\n // ── Topic upsert ─────────────────────────────────────────────────\n if (opts.topic && existsSync(paths.memoriesDir)) {\n const existing = await loadMemoriesFromDir(paths.memoriesDir);\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === opts.topic &&\n memory.frontmatter.scope === scope &&\n (!opts.module || memory.frontmatter.module === opts.module),\n );\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const revisionCount = (fm.revision_count ?? 0) + 1;\n const newFrontmatter: MemoryFrontmatter = {\n ...fm,\n revision_count: revisionCount,\n tags: mergedTags.length ? mergedTags : fm.tags,\n anchor: {\n commit: opts.commit ?? fm.anchor.commit,\n paths: anchorPaths.length ? anchorPaths : fm.anchor.paths,\n symbols: parseCsv(opts.symbols).length ? parseCsv(opts.symbols) : fm.anchor.symbols,\n },\n };\n await writeFile(topicMatch.filePath, serializeMemory({ frontmatter: newFrontmatter, body }), \"utf8\");\n ui.success(`Updated (topic upsert) ${path.relative(root, topicMatch.filePath)}`);\n ui.info(`id=${fm.id} revision=${revisionCount}`);\n return;\n }\n }\n\n const frontmatter = buildFrontmatter({\n type: opts.type,\n slug: opts.slug,\n scope,\n module: opts.module,\n tags: mergedTags,\n domain: opts.domain,\n author: opts.author,\n paths: anchorPaths,\n symbols: parseCsv(opts.symbols),\n commit: opts.commit,\n topic: opts.topic,\n });\n\n const file = memoryFilePath(paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n ui.error(`Memory already exists at ${file}`);\n process.exitCode = 1;\n return;\n }\n\n // Dedup check: warn if a similar slug already exists\n if (existsSync(paths.memoriesDir)) {\n const existing = await loadMemoriesFromDir(paths.memoriesDir);\n const slugTokens = opts.slug.toLowerCase().split(/[-_\\s]+/).filter(Boolean);\n const similar = existing.filter(({ memory }) => {\n const id = memory.frontmatter.id.toLowerCase();\n return (\n slugTokens.length >= 2 &&\n slugTokens.filter((t) => id.includes(t)).length >= Math.ceil(slugTokens.length * 0.6)\n );\n });\n if (similar.length > 0) {\n ui.warn(`Possible duplicate — similar memories exist: ${similar.map((m) => m.memory.frontmatter.id).join(\", \")}`);\n ui.warn(\"Consider updating one of these with \\`haive memory update\\` instead.\");\n }\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n ui.success(`Created ${path.relative(root, file)}`);\n ui.info(`id=${frontmatter.id} scope=${frontmatter.scope} status=${frontmatter.status}`);\n if (inferredTags.length > 0) {\n ui.info(`auto-tagged: ${inferredTags.join(\", \")} (use --no-auto-tag to disable)`);\n }\n\n // Anchorless warning: without paths the memory cannot be verified for staleness\n if (anchorPaths.length === 0) {\n ui.warn(\n `This memory has no anchor paths — staleness cannot be detected automatically.` +\n `\\n Add file anchors: haive memory update ${frontmatter.id} --paths <file1,file2>`,\n );\n }\n\n // Workflow hint\n if (scope === \"personal\") {\n console.log(\n ui.dim(\n `→ next: haive memory approve ${frontmatter.id} (activate)` +\n ` | haive memory promote ${frontmatter.id} (share with team)`,\n ),\n );\n } else {\n console.log(\n ui.dim(`→ next: haive memory approve ${frontmatter.id} (mark as validated)`),\n );\n }\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { findProjectRoot, resolveHaivePaths, type MemoryScope, type MemoryType } from \"@hiveai/core\";\nimport { loadMemoriesFromDir, type LoadedMemory } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ListOptions {\n scope?: MemoryScope;\n type?: MemoryType;\n tag?: string;\n module?: string;\n status?: string;\n showRejected?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryList(memory: Command): void {\n memory\n .command(\"list\")\n .description(\"List memories with optional filters\")\n .option(\"--scope <scope>\", \"personal | team | module\")\n .option(\"--type <type>\", \"filter by type\")\n .option(\"--tag <tag>\", \"filter by tag\")\n .option(\"--module <name>\", \"filter by module name\")\n .option(\"--status <csv>\", \"filter by status (draft,proposed,validated,stale,rejected,deprecated)\")\n .option(\"--show-rejected\", \"include rejected memories (hidden by default)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: ListOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No memories directory at ${paths.memoriesDir}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const statusFilter = opts.status ? opts.status.split(\",\").map((s) => s.trim()) : null;\n const filtered = all.filter((m) => {\n if (!matchesFilters(m, opts)) return false;\n const status = m.memory.frontmatter.status;\n if (!opts.showRejected && !statusFilter && status === \"rejected\") return false;\n if (statusFilter && !statusFilter.includes(status)) return false;\n return true;\n });\n\n // Count hidden rejected (not covered by an explicit status filter)\n const hiddenRejectedCount =\n !opts.showRejected && !statusFilter\n ? all.filter(\n (m) => matchesFilters(m, opts) && m.memory.frontmatter.status === \"rejected\",\n ).length\n : 0;\n\n if (filtered.length === 0) {\n ui.info(\"No memories match the filters.\");\n if (hiddenRejectedCount > 0) {\n ui.info(`(${hiddenRejectedCount} rejected hidden — use --show-rejected to include)`);\n }\n return;\n }\n\n for (const { memory: mem, filePath } of filtered) {\n const fm = mem.frontmatter;\n const tagStr = fm.tags.length ? ui.dim(` [${fm.tags.join(\", \")}]`) : \"\";\n const moduleStr = fm.module ? ui.dim(` (${fm.module})`) : \"\";\n const statusBadge = ui.statusBadge(fm.status);\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(fm.scope)}/${ui.dim(fm.type)} ${statusBadge}${moduleStr}${tagStr}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n console.log(ui.dim(`\\n${filtered.length} memor${filtered.length === 1 ? \"y\" : \"ies\"}`));\n\n // Always show rejected hint when memories are hidden\n if (hiddenRejectedCount > 0) {\n console.log(\n ui.dim(`(${hiddenRejectedCount} rejected hidden — use --show-rejected to include)`),\n );\n }\n\n // Draft hint: scope-aware\n const draftItems = filtered.filter((m) => m.memory.frontmatter.status === \"draft\");\n if (draftItems.length > 0) {\n const hasPersonalDrafts = draftItems.some(\n (m) => m.memory.frontmatter.scope === \"personal\",\n );\n const hasTeamDrafts = draftItems.some(\n (m) => m.memory.frontmatter.scope !== \"personal\",\n );\n let hint = `ℹ ${draftItems.length} in draft — use \\`haive memory approve <id>\\` to activate`;\n if (hasPersonalDrafts && !hasTeamDrafts) {\n hint += \" or `haive memory promote <id>` to share with team\";\n }\n console.log(ui.dim(hint));\n }\n });\n}\n\nfunction matchesFilters(loaded: LoadedMemory, opts: ListOptions): boolean {\n const fm = loaded.memory.frontmatter;\n if (opts.scope && fm.scope !== opts.scope) return false;\n if (opts.type && fm.type !== opts.type) return false;\n if (opts.tag && !fm.tags.includes(opts.tag)) return false;\n if (opts.module && fm.module !== opts.module) return false;\n return true;\n}\n","export {\n loadMemoriesFromDir,\n loadMemory,\n listMarkdownFilesRecursive,\n type LoadedMemory,\n} from \"@hiveai/core\";\n","import { mkdir, unlink, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface PromoteOptions {\n dir?: string;\n}\n\nexport function registerMemoryPromote(memory: Command): void {\n memory\n .command(\"promote <id>\")\n .description(\"Promote a personal memory to team scope (status -> proposed)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: PromoteOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No memories directory at ${paths.memoriesDir}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n // Check team/module scope first to give a helpful error\n const teamAndModule = await loadMemoriesFromDir(paths.memoriesDir);\n const alreadyShared = teamAndModule.find(\n (m) =>\n m.memory.frontmatter.id === id &&\n (m.memory.frontmatter.scope === \"team\" || m.memory.frontmatter.scope === \"module\"),\n );\n if (alreadyShared) {\n const fm = alreadyShared.memory.frontmatter;\n ui.warn(\n `\"${id}\" is already in ${fm.scope} scope (status=${fm.status}).`,\n );\n if (fm.status !== \"validated\") {\n ui.info(`→ run \\`haive memory approve ${id}\\` to validate it`);\n }\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.personalDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No personal memory with id \"${id}\". (Promotion only applies to personal scope.)`);\n process.exitCode = 1;\n return;\n }\n\n const updated = {\n frontmatter: {\n ...found.memory.frontmatter,\n scope: \"team\" as const,\n status: \"proposed\" as const,\n },\n body: found.memory.body,\n };\n\n const newPath = memoryFilePath(paths, \"team\", updated.frontmatter.id);\n await mkdir(path.dirname(newPath), { recursive: true });\n await writeFile(newPath, serializeMemory(updated), \"utf8\");\n await unlink(found.filePath);\n\n ui.success(`Promoted ${id} to team scope (status=proposed)`);\n ui.info(`Now at ${path.relative(root, newPath)}`);\n console.log(ui.dim(`→ next: haive memory approve ${id} (validate for team use)`));\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ApproveOptions {\n all?: boolean;\n pending?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryApprove(memory: Command): void {\n memory\n .command(\"approve [id]\")\n .description(\"Mark a memory as 'validated'. Use --all to bulk-approve all proposed/draft memories.\")\n .option(\"--all\", \"approve all proposed and draft memories at once\")\n .option(\"--pending\", \"approve all memories with status 'proposed'\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string | undefined, opts: ApproveOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n\n // Bulk mode\n if (opts.all || opts.pending) {\n const candidates = all.filter((m) => {\n const s = m.memory.frontmatter.status;\n if (opts.all) return s === \"proposed\" || s === \"draft\";\n return s === \"proposed\";\n });\n if (candidates.length === 0) {\n ui.info(opts.all ? \"No draft or proposed memories to approve.\" : \"No proposed memories to approve.\");\n return;\n }\n let count = 0;\n for (const found of candidates) {\n const next = {\n frontmatter: { ...found.memory.frontmatter, status: \"validated\" as const },\n body: found.memory.body,\n };\n await writeFile(found.filePath, serializeMemory(next), \"utf8\");\n count++;\n }\n ui.success(`Approved ${count} memor${count === 1 ? \"y\" : \"ies\"} (status=validated)`);\n return;\n }\n\n // Single mode\n if (!id) {\n ui.error(\"Provide a memory id or use --all / --pending for bulk approval.\");\n process.exitCode = 1;\n return;\n }\n\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n const current = found.memory.frontmatter.status;\n if (current === \"validated\") {\n ui.info(`${id} is already validated.`);\n return;\n }\n if (current !== \"proposed\" && current !== \"draft\") {\n ui.warn(`Memory has status \"${current}\"; approve still sets it to validated.`);\n }\n\n const next = {\n frontmatter: { ...found.memory.frontmatter, status: \"validated\" as const },\n body: found.memory.body,\n };\n await writeFile(found.filePath, serializeMemory(next), \"utf8\");\n ui.success(`Approved ${id} (status=validated)`);\n ui.info(path.relative(root, found.filePath));\n });\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface UpdateOptions {\n title?: string;\n body?: string;\n tags?: string;\n paths?: string;\n symbols?: string;\n commit?: string;\n domain?: string;\n author?: string;\n dir?: string;\n}\n\nexport function registerMemoryUpdate(memory: Command): void {\n memory\n .command(\"update <id>\")\n .description(\"Update body, tags, or anchor of an existing memory (preserves id and usage history)\")\n .option(\"--title <text>\", \"new title — replaces the first heading of the body\")\n .option(\"--body <text>\", \"new Markdown body — replaces the existing body\")\n .option(\"--tags <csv>\", \"new tags, comma-separated — fully replaces existing tags\")\n .option(\"--paths <csv>\", \"new anchor paths, comma-separated\")\n .option(\"--symbols <csv>\", \"new anchor symbols, comma-separated\")\n .option(\"--commit <sha>\", \"new anchor commit SHA\")\n .option(\"--domain <domain>\", \"new domain label\")\n .option(\"--author <author>\", \"new author handle or email\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: UpdateOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === id);\n if (!loaded) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n const updated: string[] = [];\n const { frontmatter, body } = loaded.memory;\n\n const newAnchor = { ...frontmatter.anchor };\n if (opts.paths !== undefined) {\n newAnchor.paths = parseCsv(opts.paths);\n updated.push(\"anchor.paths\");\n }\n if (opts.symbols !== undefined) {\n newAnchor.symbols = parseCsv(opts.symbols);\n updated.push(\"anchor.symbols\");\n }\n if (opts.commit !== undefined) {\n newAnchor.commit = opts.commit;\n updated.push(\"anchor.commit\");\n }\n\n const newFrontmatter = {\n ...frontmatter,\n anchor: newAnchor,\n ...(opts.tags !== undefined ? { tags: parseCsv(opts.tags) } : {}),\n ...(opts.domain !== undefined ? { domain: opts.domain } : {}),\n ...(opts.author !== undefined ? { author: opts.author } : {}),\n };\n if (opts.tags !== undefined) updated.push(\"tags\");\n if (opts.domain !== undefined) updated.push(\"domain\");\n if (opts.author !== undefined) updated.push(\"author\");\n\n let newBody = opts.body !== undefined ? opts.body : body;\n if (opts.title !== undefined) {\n newBody = replaceFirstHeading(newBody, opts.title);\n updated.push(\"title\");\n }\n if (opts.body !== undefined) updated.push(\"body\");\n\n if (updated.length === 0) {\n ui.warn(\"Nothing to update — provide at least one option.\");\n return;\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: newBody }),\n \"utf8\",\n );\n\n ui.success(`Updated ${path.relative(root, loaded.filePath)}`);\n ui.info(`fields: ${updated.join(\", \")}`);\n });\n}\n\nfunction replaceFirstHeading(body: string, title: string): string {\n const headingRe = /^#\\s+.+$/m;\n const replacement = `# ${title}`;\n if (headingRe.test(body)) {\n return body.replace(headingRe, replacement);\n }\n return `${replacement}\\n\\n${body}`;\n}\n\nfunction parseCsv(value: string): string[] {\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n DEFAULT_AUTO_PROMOTE_RULE,\n findProjectRoot,\n getUsage,\n isAutoPromoteEligible,\n loadUsageIndex,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface AutoPromoteOptions {\n minReads?: string;\n maxRejections?: string;\n apply?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryAutoPromote(memory: Command): void {\n memory\n .command(\"auto-promote\")\n .description(\"Promote eligible 'proposed' memories to 'validated' based on usage\")\n .option(\"--min-reads <n>\", \"minimum read_count to qualify\", String(DEFAULT_AUTO_PROMOTE_RULE.minReads))\n .option(\n \"--max-rejections <n>\",\n \"memories with more rejections than this are skipped\",\n String(DEFAULT_AUTO_PROMOTE_RULE.maxRejections),\n )\n .option(\"--apply\", \"actually write status=validated to disk (default: dry-run)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: AutoPromoteOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const rule = {\n minReads: Number(opts.minReads ?? DEFAULT_AUTO_PROMOTE_RULE.minReads),\n maxRejections: Number(opts.maxRejections ?? DEFAULT_AUTO_PROMOTE_RULE.maxRejections),\n };\n\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const eligible = memories.filter(({ memory }) =>\n isAutoPromoteEligible(memory.frontmatter, getUsage(usage, memory.frontmatter.id), rule),\n );\n\n if (eligible.length === 0) {\n ui.info(\n `No memories eligible (minReads=${rule.minReads}, maxRejections=${rule.maxRejections}).`,\n );\n return;\n }\n\n let written = 0;\n for (const { memory: mem, filePath } of eligible) {\n const u = getUsage(usage, mem.frontmatter.id);\n console.log(\n `${ui.bold(opts.apply ? \"PROMOTE\" : \"would promote\")} ${mem.frontmatter.id} ${ui.dim(`reads=${u.read_count} rejections=${u.rejected_count}`)}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n if (opts.apply) {\n const next = {\n frontmatter: { ...mem.frontmatter, status: \"validated\" as const },\n body: mem.body,\n };\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n written++;\n }\n }\n\n const summary = `${eligible.length} eligible`;\n ui.info(opts.apply ? `${summary} · ${written} promoted` : `${summary} · dry-run (use --apply)`);\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n parseMemory,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface EditOptions {\n editor?: string;\n dir?: string;\n}\n\nexport function registerMemoryEdit(memory: Command): void {\n memory\n .command(\"edit <id>\")\n .description(\"Open a memory in $EDITOR and re-validate when you save\")\n .option(\"-e, --editor <cmd>\", \"editor command (defaults to $EDITOR or 'vi')\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: EditOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n const editor = opts.editor ?? process.env.EDITOR ?? process.env.VISUAL ?? \"vi\";\n ui.info(`Opening ${path.relative(root, found.filePath)} with ${editor}…`);\n const code = await runEditor(editor, found.filePath);\n if (code !== 0) {\n ui.warn(`Editor exited with status ${code}.`);\n }\n\n try {\n const fresh = await readFile(found.filePath, \"utf8\");\n parseMemory(fresh);\n ui.success(\"Memory still parses cleanly.\");\n } catch (err) {\n ui.error(\n `Memory no longer parses: ${err instanceof Error ? err.message : String(err)}`,\n );\n ui.warn(\"File left as-is on disk; fix it and re-run a parse-aware command to confirm.\");\n process.exitCode = 1;\n }\n });\n}\n\nfunction runEditor(editor: string, file: string): Promise<number> {\n return new Promise((resolve) => {\n const child = spawn(editor, [file], { stdio: \"inherit\" });\n child.on(\"exit\", (code) => resolve(code ?? 0));\n child.on(\"error\", () => resolve(127));\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n inferModulesFromPaths,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ForFilesOptions {\n dir?: string;\n}\n\nexport function registerMemoryForFiles(memory: Command): void {\n memory\n .command(\"for-files <files...>\")\n .description(\"Show memories relevant to the given files (anchor overlap, module, domain)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (files: string[], opts: ForFilesOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const inferred = inferModulesFromPaths(files);\n\n const byAnchor: typeof all = [];\n const byModule: typeof all = [];\n const byDomain: typeof all = [];\n const seen = new Set<string>();\n\n for (const loaded of all) {\n // session_recap surfaces in briefing last_session — not in for-files\n if (loaded.memory.frontmatter.type === \"session_recap\") continue;\n if (memoryMatchesAnchorPaths(loaded.memory, files)) {\n byAnchor.push(loaded);\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n const pathSegments = extractPathSegments(files);\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n if (loaded.memory.frontmatter.type === \"session_recap\") continue;\n const fm = loaded.memory.frontmatter;\n const moduleHit =\n (fm.module && inferred.includes(fm.module)) ||\n fm.tags.some((t) => {\n const tl = t.toLowerCase();\n return pathSegments.has(tl) || pathSegments.has(tl.replace(/[-_]/g, \"\"));\n });\n if (moduleHit) {\n byModule.push(loaded);\n seen.add(fm.id);\n }\n }\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n if (loaded.memory.frontmatter.type === \"session_recap\") continue;\n const domain = loaded.memory.frontmatter.domain;\n if (domain && inferred.includes(domain)) {\n byDomain.push(loaded);\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n console.log(ui.dim(`inferred modules: ${inferred.length ? inferred.join(\", \") : \"(none)\"}`));\n printGroup(root, \"anchor overlap\", byAnchor, usage);\n printGroup(root, \"module match\", byModule, usage);\n printGroup(root, \"domain match\", byDomain, usage);\n\n const total = byAnchor.length + byModule.length + byDomain.length;\n ui.info(\n `${total} relevant memor${total === 1 ? \"y\" : \"ies\"} (${byAnchor.length} anchor · ${byModule.length} module · ${byDomain.length} domain)`,\n );\n });\n}\n\nfunction extractPathSegments(files: string[]): Set<string> {\n const GENERIC = new Set([\n \"src\", \"main\", \"java\", \"kotlin\", \"python\", \"go\", \"lib\", \"libs\",\n \"com\", \"org\", \"net\", \"io\", \"app\", \"apps\", \"pkg\", \"internal\",\n \"test\", \"tests\", \"spec\", \"specs\", \"impl\", \"domain\", \"shared\",\n \"resources\", \"static\", \"assets\", \"config\", \"configs\",\n ]);\n const out = new Set<string>();\n for (const file of files) {\n const parts = file.replace(/\\\\/g, \"/\").split(\"/\");\n for (const part of parts) {\n const seg = part.toLowerCase().replace(/\\.[^.]+$/, \"\");\n if (seg.length >= 3 && !GENERIC.has(seg) && /^[a-z]/.test(seg)) {\n out.add(seg);\n for (const sub of seg.split(/[-_]/).filter((s) => s.length >= 3)) {\n out.add(sub);\n }\n }\n }\n }\n return out;\n}\n\nfunction printGroup(\n root: string,\n label: string,\n loaded: Array<Awaited<ReturnType<typeof loadMemoriesFromDir>>[number]>,\n usage: Awaited<ReturnType<typeof loadUsageIndex>>,\n): void {\n if (loaded.length === 0) return;\n console.log(ui.bold(`\\n— ${label} —`));\n for (const { memory: mem, filePath } of loaded) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const conf = deriveConfidence(fm, u);\n console.log(`${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(conf)}`);\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface HotOptions {\n threshold?: string;\n status?: \"draft\" | \"proposed\";\n dir?: string;\n}\n\nexport function registerMemoryHot(memory: Command): void {\n memory\n .command(\"hot\")\n .description(\"List memories actively used but not yet validated (good promotion candidates)\")\n .option(\"--threshold <n>\", \"minimum read_count to qualify\", \"3\")\n .option(\"--status <status>\", \"limit to one status (default: draft + proposed)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: HotOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n const threshold = Math.max(1, Number(opts.threshold ?? 3));\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const candidates = all\n .filter(({ memory: mem }) => {\n const fm = mem.frontmatter;\n if (opts.status && fm.status !== opts.status) return false;\n if (opts.status === undefined && fm.status !== \"draft\" && fm.status !== \"proposed\") {\n return false;\n }\n return getUsage(usage, fm.id).read_count >= threshold;\n })\n .sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n if (candidates.length === 0) {\n ui.info(`No hot memories (threshold=${threshold}).`);\n return;\n }\n\n for (const { memory: mem, filePath } of candidates) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(fm.status)} ${ui.dim(`reads=${u.read_count} rejections=${u.rejected_count}`)}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n ui.info(\n `${candidates.length} hot — promote drafts with \\`haive memory promote <id>\\`, then \\`haive memory auto-promote --apply\\`.`,\n );\n });\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n type MemoryScope,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface TriedOptions {\n what: string;\n whyFailed: string;\n instead?: string;\n scope?: MemoryScope;\n module?: string;\n tags?: string;\n paths?: string;\n author?: string;\n dir?: string;\n}\n\nexport function registerMemoryTried(memory: Command): void {\n memory\n .command(\"tried\")\n .description(\n \"Record a FAILED approach — prevents repeated mistakes in future sessions.\\n\\n\" +\n \" This is the most valuable type of negative knowledge. It surfaces FIRST in\\n\" +\n \" get_briefing so agents can't miss it. Auto-validated (no approval cycle).\\n\\n\" +\n \" Use this immediately when you try something and it fails.\\n\\n\" +\n \" Example:\\n\" +\n \" haive memory tried \\\\\\\\\\n\" +\n \" --what \\\"importing X with ESM dynamic import\\\" \\\\\\\\\\n\" +\n \" --why-failed \\\"tsup bundles it as CJS, dynamic import fails at runtime\\\" \\\\\\\\\\n\" +\n \" --instead \\\"use static import in the entry file\\\" \\\\\\\\\\n\" +\n \" --paths packages/cli/src/index.ts\\n\",\n )\n .requiredOption(\"--what <text>\", \"what approach was tried (short, descriptive title)\")\n .requiredOption(\"--why-failed <text>\", \"why it failed or should NOT be used (include the exact error if possible)\")\n .option(\"--instead <text>\", \"the correct approach to use instead\")\n .option(\"--scope <scope>\", \"personal | team | module (default: personal)\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"--tags <csv>\", \"comma-separated tags\")\n .option(\"--paths <csv>\", \"anchor paths, comma-separated\")\n .option(\"--author <author>\", \"author email or handle\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: TriedOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const slug = opts.what\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .trim()\n .split(/\\s+/)\n .slice(0, 5)\n .join(\"-\");\n\n const baseFm = buildFrontmatter({\n type: \"attempt\",\n slug,\n scope: opts.scope,\n module: opts.module,\n tags: parseCsv(opts.tags),\n paths: parseCsv(opts.paths),\n author: opts.author,\n });\n // attempt memories are immediately validated — no review cycle needed\n const frontmatter = { ...baseFm, status: \"validated\" as const };\n\n const lines: string[] = [`# ${opts.what}`, \"\"];\n lines.push(`**Why it failed / do NOT use:** ${opts.whyFailed}`);\n if (opts.instead) {\n lines.push(\"\", `**Instead, use:** ${opts.instead}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n\n const file = memoryFilePath(paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n ui.error(`Memory already exists at ${file}`);\n process.exitCode = 1;\n return;\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n ui.success(`Recorded: ${path.relative(root, file)}`);\n ui.info(`id=${frontmatter.id} type=attempt status=validated (auto-approved)`);\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface PendingOptions {\n scope?: \"personal\" | \"team\" | \"module\";\n dir?: string;\n}\n\nexport function registerMemoryPending(memory: Command): void {\n memory\n .command(\"pending\")\n .description(\"List 'proposed' memories awaiting review (sorted by reads desc)\")\n .option(\"--scope <scope>\", \"filter by scope (personal | team | module)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: PendingOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const proposed = all.filter(({ memory: mem }) => {\n if (mem.frontmatter.status !== \"proposed\") return false;\n if (opts.scope && mem.frontmatter.scope !== opts.scope) return false;\n return true;\n });\n\n if (proposed.length === 0) {\n ui.info(\"No memories awaiting review.\");\n return;\n }\n\n proposed.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n const now = Date.now();\n for (const { memory: mem, filePath } of proposed) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const ageDays = Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000);\n const ageStr = ageDays === 0 ? \"today\" : `${ageDays}d`;\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.dim(`age=${ageStr} reads=${u.read_count} rejections=${u.rejected_count}`)}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n ui.info(`${proposed.length} pending`);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n extractSnippet,\n findProjectRoot,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n pickSnippetNeedle,\n resolveHaivePaths,\n tokenizeQuery,\n trackReads,\n type MemoryScope,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface QueryOptions {\n dir?: string;\n limit?: string;\n scope?: MemoryScope;\n status?: string;\n showRejected?: boolean;\n}\n\nexport function registerMemoryQuery(memory: Command): void {\n memory\n .command(\"query <text>\")\n .description(\"Search memories by id, tag, or substring (AND, OR fallback)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--limit <n>\", \"max results\", \"20\")\n .option(\"--scope <scope>\", \"personal | team | module\")\n .option(\"--status <csv>\", \"filter by status (draft,proposed,validated,stale,rejected)\")\n .option(\"--show-rejected\", \"include rejected memories (hidden by default)\")\n .action(async (text: string, opts: QueryOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No memories directory at ${paths.memoriesDir}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const tokens = tokenizeQuery(text);\n if (tokens.length === 0) {\n ui.warn(\"Empty query — use \\`haive memory list\\` to list all memories.\");\n return;\n }\n const statusFilter = opts.status ? opts.status.split(\",\").map((s) => s.trim()) : null;\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n\n const passesFilters = (mem: (typeof all)[number][\"memory\"]) => {\n const fm = mem.frontmatter;\n if (opts.scope && fm.scope !== opts.scope) return false;\n if (!opts.showRejected && !statusFilter && fm.status === \"rejected\") return false;\n if (statusFilter && !statusFilter.includes(fm.status)) return false;\n // session_recap surfaces in briefing as last_session, not in regular search\n if (fm.type === \"session_recap\") return false;\n return true;\n };\n\n const eligible = all.filter(({ memory: mem }) => passesFilters(mem));\n let matches = eligible.filter(({ memory: mem }) => literalMatchesAllTokens(mem, tokens));\n let fallback = false;\n if (matches.length === 0 && tokens.length > 1) {\n matches = eligible.filter(({ memory: mem }) => literalMatchesAnyToken(mem, tokens));\n fallback = true;\n }\n\n const limit = Math.max(1, Number(opts.limit ?? 20));\n const top = matches.slice(0, limit);\n\n if (top.length === 0) {\n ui.info(`No matches for \"${text}\".`);\n return;\n }\n if (fallback) {\n ui.info(`No exact match — showing partial results (OR fallback):`);\n }\n\n const snippetNeedle = pickSnippetNeedle(text);\n for (const { memory: mem, filePath } of top) {\n const fm = mem.frontmatter;\n const statusBadge = ui.statusBadge(fm.status);\n console.log(`${ui.bold(fm.id)} ${ui.dim(fm.scope)} ${statusBadge}`);\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n const snippet = extractSnippet(mem.body, snippetNeedle);\n if (snippet) console.log(` ${snippet}`);\n }\n console.log(\n ui.dim(`\\n${top.length} of ${matches.length} match${matches.length === 1 ? \"\" : \"es\"}`),\n );\n\n // Track reads for usage stats / decay / hot detection\n const ids = top.map(({ memory: mem }) => mem.frontmatter.id);\n if (ids.length > 0) {\n await trackReads(paths, ids).catch(() => { /* non-fatal */ });\n }\n });\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadUsageIndex,\n recordRejection,\n resolveHaivePaths,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface RejectOptions {\n reason?: string;\n dir?: string;\n}\n\nexport function registerMemoryReject(memory: Command): void {\n memory\n .command(\"reject <id>\")\n .description(\"Record a rejection (blocks auto-promotion and lowers confidence)\")\n .option(\"-r, --reason <reason>\", \"why this memory is being rejected\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: RejectOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === id);\n if (!loaded) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: {\n ...loaded.memory.frontmatter,\n status: \"rejected\",\n stale_reason: opts.reason ?? loaded.memory.frontmatter.stale_reason ?? null,\n },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(paths);\n recordRejection(idx, id, opts.reason ?? null);\n await saveUsageIndex(paths, idx);\n const u = idx.by_id[id]!;\n ui.success(\n `Rejected ${id} (status=rejected, ${u.rejected_count} rejection${u.rejected_count === 1 ? \"\" : \"s\"})`,\n );\n if (opts.reason) ui.info(`reason: ${opts.reason}`);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadUsageIndex,\n resolveHaivePaths,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface RmOptions {\n yes?: boolean;\n keepUsage?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryRm(memory: Command): void {\n memory\n .command(\"rm <id>\")\n .description(\"Delete a memory file (and its usage entry by default)\")\n .option(\"-y, --yes\", \"skip the confirmation prompt\")\n .option(\"--keep-usage\", \"do not remove the usage.json entry\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: RmOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n const rel = path.relative(root, found.filePath);\n if (!opts.yes) {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = (await rl.question(`Delete ${rel}? [y/N] `)).trim().toLowerCase();\n rl.close();\n if (answer !== \"y\" && answer !== \"yes\") {\n ui.info(\"Aborted.\");\n return;\n }\n }\n\n await unlink(found.filePath);\n ui.success(`Deleted ${rel}`);\n\n if (!opts.keepUsage) {\n const idx = await loadUsageIndex(paths);\n if (idx.by_id[id]) {\n delete idx.by_id[id];\n await saveUsageIndex(paths, idx);\n ui.info(\"Removed usage entry\");\n }\n }\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ShowOptions {\n raw?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryShow(memory: Command): void {\n memory\n .command(\"show <id>\")\n .description(\"Print a memory's frontmatter, body, and confidence/usage\")\n .option(\"--raw\", \"print the raw file contents instead of a summary\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: ShowOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n if (opts.raw) {\n console.log(await readFile(found.filePath, \"utf8\"));\n return;\n }\n\n const fm = found.memory.frontmatter;\n const usage = await loadUsageIndex(paths);\n const u = getUsage(usage, fm.id);\n const conf = deriveConfidence(fm, u);\n\n console.log(ui.bold(fm.id));\n console.log(`${ui.dim(\"scope:\")} ${fm.scope}${fm.module ? ` / ${fm.module}` : \"\"}`);\n console.log(`${ui.dim(\"type:\")} ${fm.type}`);\n console.log(`${ui.dim(\"status:\")} ${fm.status} ${ui.dim(\"→ confidence:\")} ${ui.bold(conf)}`);\n console.log(`${ui.dim(\"tags:\")} ${fm.tags.length ? fm.tags.join(\", \") : \"(none)\"}`);\n console.log(`${ui.dim(\"created:\")} ${fm.created_at}`);\n if (fm.verified_at) console.log(`${ui.dim(\"verified:\")} ${fm.verified_at}`);\n if (fm.stale_reason) console.log(`${ui.dim(\"stale:\")} ${fm.stale_reason}`);\n console.log(`${ui.dim(\"reads:\")} ${u.read_count} ${ui.dim(\"rejections:\")} ${u.rejected_count}`);\n console.log(`${ui.dim(\"file:\")} ${path.relative(root, found.filePath)}`);\n if (fm.anchor.paths.length || fm.anchor.symbols.length) {\n console.log(ui.dim(\"anchor:\"));\n if (fm.anchor.commit) console.log(` ${ui.dim(\"commit:\")} ${fm.anchor.commit}`);\n if (fm.anchor.paths.length)\n console.log(` ${ui.dim(\"paths:\")} ${fm.anchor.paths.join(\", \")}`);\n if (fm.anchor.symbols.length)\n console.log(` ${ui.dim(\"symbols:\")} ${fm.anchor.symbols.join(\", \")}`);\n }\n console.log();\n console.log(found.memory.body);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface StatsOptions {\n id?: string;\n dir?: string;\n}\n\nexport function registerMemoryStats(memory: Command): void {\n memory\n .command(\"stats\")\n .description(\"Show usage stats and confidence levels per memory\")\n .option(\"--id <id>\", \"show stats for a single memory id\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: StatsOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const target = opts.id\n ? all.filter((m) => m.memory.frontmatter.id === opts.id)\n : all;\n\n if (target.length === 0) {\n ui.info(opts.id ? `No memory with id \"${opts.id}\".` : \"No memories.\");\n return;\n }\n\n // Sort by read_count desc to surface the popular ones.\n target.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n for (const { memory: mem, filePath } of target) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const conf = deriveConfidence(fm, u);\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(conf)}`,\n );\n console.log(\n ` ${ui.dim(\"status:\")} ${fm.status} ${ui.dim(\"reads:\")} ${u.read_count} ${ui.dim(\"rejections:\")} ${u.rejected_count}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n });\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n resolveHaivePaths,\n serializeMemory,\n verifyAnchor,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface VerifyOptions {\n id?: string;\n all?: boolean;\n update?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryVerify(memory: Command): void {\n memory\n .command(\"verify\")\n .description(\n \"Check that memory anchor paths still exist in the current codebase.\\n\\n\" +\n \" A memory is 'stale' when its anchored file or symbol was moved, deleted, or renamed.\\n\" +\n \" Stale memories are shown with a warning in get_briefing and should be updated or deleted.\\n\\n\" +\n \" haive sync runs this automatically. Use this command for on-demand checks or in CI.\\n\\n\" +\n \" CI recommendation: add 'haive memory verify' to your haive-sync.yml PR check job\\n\" +\n \" to catch stale memories before they reach main.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive memory verify # check all, report only\\n\" +\n \" haive memory verify --update # mark stale/fresh on disk\\n\" +\n \" haive memory verify --id 2026-04-28-gotcha-x # check one memory\\n\",\n )\n .option(\"--id <id>\", \"verify a single memory by id\")\n .option(\"--all\", \"verify every memory (default if --id is omitted)\")\n .option(\"--update\", \"write status=stale or status=validated back to disk\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: VerifyOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const targets = opts.id\n ? all.filter((m) => m.memory.frontmatter.id === opts.id)\n : all;\n\n if (opts.id && targets.length === 0) {\n ui.error(`No memory with id \"${opts.id}\".`);\n process.exitCode = 1;\n return;\n }\n\n let staleCount = 0;\n let freshCount = 0;\n const anchorlessIds: string[] = [];\n let updated = 0;\n\n for (const { memory: mem, filePath } of targets) {\n const result = await verifyAnchor(mem, { projectRoot: root });\n const isAnchored =\n mem.frontmatter.anchor.paths.length > 0 ||\n mem.frontmatter.anchor.symbols.length > 0;\n\n if (!isAnchored) {\n anchorlessIds.push(mem.frontmatter.id);\n continue;\n }\n\n const rel = path.relative(root, filePath);\n if (result.stale) {\n staleCount++;\n console.log(`${ui.bold(\"STALE\")} ${mem.frontmatter.id}`);\n console.log(` ${ui.dim(rel)}`);\n console.log(` ${result.reason}`);\n if (result.possibleRenames.length > 0) {\n console.log(` ${ui.yellow(\"Possible renames:\")} ${result.possibleRenames.join(\", \")}`);\n }\n } else {\n freshCount++;\n console.log(`${ui.dim(\"fresh\")} ${mem.frontmatter.id}`);\n }\n\n if (opts.update) {\n const next = applyVerification(mem, result);\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n updated++;\n }\n }\n\n const summary = [\n `${freshCount} fresh`,\n `${staleCount} stale`,\n `${anchorlessIds.length} anchorless (skipped)`,\n ];\n if (opts.update) summary.push(`${updated} updated on disk`);\n ui.info(summary.join(\" · \"));\n if (anchorlessIds.length > 0) {\n console.log(\n ui.dim(\n `Anchorless memories (no paths/symbols — staleness cannot be detected):\\n` +\n anchorlessIds.map((id) => ` ${id}`).join(\"\\n\") +\n `\\nTip: use \\`haive memory update <id> --paths <files>\\` to add anchors.`,\n ),\n );\n }\n });\n}\n\nfunction applyVerification(\n mem: Parameters<typeof serializeMemory>[0],\n result: { stale: boolean; reason: string | null },\n): Parameters<typeof serializeMemory>[0] {\n const verifiedAt = new Date().toISOString();\n if (result.stale) {\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: \"stale\",\n verified_at: verifiedAt,\n stale_reason: result.reason,\n },\n body: mem.body,\n };\n }\n // Reset stale_reason when re-validating; keep validated/proposed status as is,\n // promote draft→validated when verification passes.\n const nextStatus =\n mem.frontmatter.status === \"stale\" || mem.frontmatter.status === \"draft\"\n ? \"validated\"\n : mem.frontmatter.status;\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: nextStatus,\n verified_at: verifiedAt,\n stale_reason: null,\n },\n body: mem.body,\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ImportOptions {\n from: string;\n scope?: \"personal\" | \"team\";\n dir?: string;\n}\n\nexport function registerMemoryImport(memory: Command): void {\n memory\n .command(\"import\")\n .description(\n \"Parse a Markdown file and suggest memories via the import_docs MCP prompt (prints a ready-to-use prompt invocation)\",\n )\n .requiredOption(\"--from <file>\", \"Markdown/text file to import from\")\n .option(\"--scope <scope>\", \"personal | team (default: team)\", \"team\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: ImportOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n if (!existsSync(opts.from)) {\n ui.error(`File not found: ${opts.from}`);\n process.exitCode = 1;\n return;\n }\n\n const content = await readFile(opts.from, \"utf8\");\n const scope = opts.scope ?? \"team\";\n\n ui.info(`Preparing import from: ${opts.from} (scope=${scope})`);\n ui.info(`Content length: ${content.length} chars`);\n console.log();\n console.log(ui.bold(\"To import via MCP, invoke the `import_docs` prompt with:\"));\n console.log();\n console.log(\n ui.dim(\n JSON.stringify(\n {\n content: content.slice(0, 200) + (content.length > 200 ? \"…\" : \"\"),\n source: opts.from,\n scope,\n },\n null,\n 2,\n ),\n ),\n );\n console.log();\n ui.info(\n \"Or use your AI client to call: import_docs({ content: <file contents>, source: \\\"\" +\n opts.from +\n \"\\\", scope: \\\"\" +\n scope +\n \"\\\" })\",\n );\n });\n}\n","/**\n * haive memory import --from-changelog CHANGELOG.md [--package <name>]\n *\n * Parses a CHANGELOG.md file (Keep-a-Changelog format or common variants),\n * extracts breaking changes and notable gotchas from recent versions,\n * and saves them as hAIve memories.\n *\n * Supports:\n * - Keep a Changelog (https://keepachangelog.com)\n * - Angular commit-based CHANGELOG format\n * - Plain Markdown changelogs with ## headers\n */\nimport { existsSync } from \"node:fs\";\nimport { readFile, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ImportChangelogOptions {\n fromChangelog: string;\n package?: string;\n scope?: string;\n versions?: string; // e.g. \"2.0.0,2.1.0\" or \"latest\"\n dir?: string;\n}\n\ninterface ChangelogEntry {\n version: string;\n breaking: string[];\n deprecated: string[];\n removed: string[];\n fixed: string[];\n added: string[];\n}\n\n// ── Parser ─────────────────────────────────────────────────────────────────\n\nfunction parseChangelog(content: string): ChangelogEntry[] {\n const entries: ChangelogEntry[] = [];\n const versionRe = /^#{1,3}\\s+(?:\\[?)([0-9]+\\.[0-9]+[.0-9]*)/m;\n const sections = content.split(/^#{1,3}\\s+/m).slice(1);\n\n for (const section of sections) {\n const versionMatch = section.match(/^(?:\\[?)([0-9]+\\.[0-9]+[.0-9]*)/);\n if (!versionMatch) continue;\n const version = versionMatch[1];\n\n const entry: ChangelogEntry = {\n version,\n breaking: [],\n deprecated: [],\n removed: [],\n fixed: [],\n added: [],\n };\n\n // Extract sub-sections\n const subSections = section.split(/^#{2,4}\\s+/m);\n for (const sub of subSections) {\n const firstLine = sub.split(\"\\n\")[0].toLowerCase().trim();\n const items = sub\n .split(\"\\n\")\n .slice(1)\n .filter((l) => l.trim().startsWith(\"-\") || l.trim().startsWith(\"*\"))\n .map((l) => l.replace(/^[\\s\\-*]+/, \"\").trim())\n .filter(Boolean);\n\n if (/breaking/.test(firstLine)) {\n entry.breaking.push(...items);\n } else if (/deprecated/.test(firstLine)) {\n entry.deprecated.push(...items);\n } else if (/removed/.test(firstLine)) {\n entry.removed.push(...items);\n } else if (/fixed|bug/.test(firstLine)) {\n entry.fixed.push(...items);\n } else if (/added|new|feat/.test(firstLine)) {\n entry.added.push(...items);\n }\n\n // Also scan for BREAKING CHANGE: prefixes in all items (Angular format)\n for (const sub2 of subSections) {\n for (const line of sub2.split(\"\\n\")) {\n const breakingMatch = line.match(/BREAKING CHANGE[S]?:\\s*(.+)/i);\n if (breakingMatch && !entry.breaking.includes(breakingMatch[1].trim())) {\n entry.breaking.push(breakingMatch[1].trim());\n }\n }\n }\n }\n\n // If no sub-sections matched, do a raw scan for breaking change indicators\n if (entry.breaking.length === 0) {\n for (const line of section.split(\"\\n\")) {\n if (/breaking|⚠|deprecated|removed/.test(line.toLowerCase())) {\n const item = line.replace(/^[\\s\\-*#]+/, \"\").trim();\n if (item) entry.breaking.push(item);\n }\n }\n }\n\n const hasContent =\n entry.breaking.length > 0 ||\n entry.deprecated.length > 0 ||\n entry.removed.length > 0;\n\n if (hasContent) entries.push(entry);\n }\n\n void versionRe; // used implicitly in section splitting\n return entries;\n}\n\n// ── CLI command ─────────────────────────────────────────────────────────────\n\nexport function registerMemoryImportChangelog(memory: Command): void {\n memory\n .command(\"import-changelog\")\n .description(\n \"Import breaking changes from a CHANGELOG.md as hAIve memories.\\n\\n\" +\n \" Parses Keep-a-Changelog and Angular commit format changelogs,\\n\" +\n \" extracts breaking changes, deprecations, and removals,\\n\" +\n \" and saves each version's changes as a gotcha memory.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive memory import-changelog --from node_modules/@company/sdk/CHANGELOG.md --package @company/sdk\\n\" +\n \" haive memory import-changelog --from CHANGELOG.md\\n\" +\n \" haive memory import-changelog --from CHANGELOG.md --versions 2.0.0,2.1.0\\n\",\n )\n .requiredOption(\"--from <file>\", \"path to the CHANGELOG.md file\")\n .option(\"--package <name>\", \"name of the package (used in memory title and tags)\")\n .option(\"--scope <scope>\", \"memory scope: team | personal (default: team)\", \"team\")\n .option(\n \"--versions <csv>\",\n \"only import specific versions (comma-separated), or 'latest' for the most recent breaking version\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: ImportChangelogOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n const changelogPath = path.resolve(root, opts.fromChangelog);\n if (!existsSync(changelogPath)) {\n ui.error(`CHANGELOG not found: ${changelogPath}`);\n process.exitCode = 1;\n return;\n }\n\n const content = await readFile(changelogPath, \"utf8\");\n let entries = parseChangelog(content);\n\n if (entries.length === 0) {\n ui.warn(\"No breaking changes, deprecations, or removals found in the CHANGELOG.\");\n return;\n }\n\n // Filter by versions if specified\n if (opts.versions) {\n if (opts.versions === \"latest\") {\n entries = [entries[0]];\n } else {\n const requested = opts.versions.split(\",\").map((v) => v.trim());\n entries = entries.filter((e) => requested.includes(e.version));\n }\n }\n\n const pkgName = opts.package ?? path.basename(path.dirname(changelogPath));\n const scope = (opts.scope ?? \"team\") as \"team\" | \"personal\";\n const teamDir = path.join(paths.memoriesDir, scope);\n await mkdir(teamDir, { recursive: true });\n\n let saved = 0;\n for (const entry of entries) {\n const lines: string[] = [];\n lines.push(`## ${pkgName} v${entry.version} — Breaking Changes & Deprecations\\n`);\n\n if (entry.breaking.length > 0) {\n lines.push(\"### 🔴 Breaking Changes\\n\");\n for (const item of entry.breaking) lines.push(`- ${item}`);\n lines.push(\"\");\n }\n if (entry.deprecated.length > 0) {\n lines.push(\"### 🟡 Deprecated\\n\");\n for (const item of entry.deprecated) lines.push(`- ${item}`);\n lines.push(\"\");\n }\n if (entry.removed.length > 0) {\n lines.push(\"### ⚫ Removed\\n\");\n for (const item of entry.removed) lines.push(`- ${item}`);\n lines.push(\"\");\n }\n\n lines.push(\n `**Source:** \\`${path.relative(root, changelogPath)}\\` \\n` +\n `**Action:** Update all usages of ${pkgName} if they rely on any of the above.`,\n );\n\n const slug = `changelog-${pkgName.replace(/[^a-z0-9]/gi, \"-\").toLowerCase()}-v${entry.version.replace(/\\./g, \"-\")}`;\n const fm = buildFrontmatter({\n type: \"gotcha\",\n slug,\n scope,\n status: \"validated\",\n tags: [\n \"changelog\",\n \"breaking-change\",\n pkgName.replace(/[^a-z0-9]/gi, \"-\").toLowerCase(),\n `v${entry.version}`,\n ],\n paths: [path.relative(root, changelogPath)],\n topic: `changelog-${pkgName}-${entry.version}`,\n });\n\n await writeFile(\n path.join(teamDir, `${fm.id}.md`),\n serializeMemory({ frontmatter: fm, body: lines.join(\"\\n\") }),\n \"utf8\",\n );\n console.log(ui.green(` ✓ ${fm.id}`));\n saved++;\n }\n\n console.log(\n `\\n${ui.bold(`Imported ${saved} changelog entr${saved === 1 ? \"y\" : \"ies\"} from ${pkgName}`)}`,\n );\n if (saved > 0) {\n console.log(\n ui.dim(` Memories saved to .ai/memories/${scope}/`),\n );\n console.log(\n ui.dim(` Run \\`haive briefing --task \"update ${pkgName}\"\\` to see them in context.`),\n );\n }\n });\n}\n","/**\n * haive memory digest — generate a Markdown report of memories added/updated\n * within the last N days for bulk review.\n *\n * Usage:\n * haive memory digest # last 7 days, team scope\n * haive memory digest --days 14 # last 14 days\n * haive memory digest --scope all # all scopes\n * haive memory digest --out digest.md # write to file instead of stdout\n */\nimport { existsSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface DigestOptions {\n days?: string;\n scope?: string;\n out?: string;\n dir?: string;\n}\n\nconst CONFIDENCE_EMOJI: Record<string, string> = {\n unverified: \"⬜\",\n low: \"🟡\",\n trusted: \"🟢\",\n authoritative: \"⭐\",\n stale: \"🔴\",\n};\n\nexport function registerMemoryDigest(program: Command): void {\n program\n .command(\"digest\")\n .description(\n \"Generate a Markdown review digest of recently added or updated memories.\\n\\n\" +\n \" Groups memories by type, shows confidence, status, read count, and anchor info.\\n\" +\n \" Each memory has action checkboxes (approve / reject / keep as-is) for peer review.\\n\\n\" +\n \" Use this to do a bulk weekly review of team memories, or share with teammates\\n\" +\n \" as a pull-request attachment so humans can validate what the AI captured.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive memory digest # last 7 days, team scope\\n\" +\n \" haive memory digest --days 30 --scope all # last 30 days, all scopes\\n\" +\n \" haive memory digest --out review.md # write to file\\n\",\n )\n .option(\"--days <n>\", \"look-back window in days (default: 7)\", \"7\")\n .option(\"--scope <scope>\", \"personal | team | module | all (default: team)\", \"team\")\n .option(\"--out <file>\", \"write digest to a file instead of stdout\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: DigestOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.memoriesDir)) {\n ui.error(\"No .ai/memories found. Run `haive init` first.\");\n process.exitCode = 1;\n return;\n }\n\n const days = Math.max(1, Number(opts.days ?? 7));\n const scopeFilter = opts.scope ?? \"team\";\n const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000);\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n\n const recent = all.filter(({ memory: mem }) => {\n const fm = mem.frontmatter;\n if (fm.type === \"session_recap\") return false;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") return false;\n if (scopeFilter !== \"all\" && fm.scope !== scopeFilter) return false;\n return new Date(fm.created_at) >= cutoff;\n });\n\n const now = new Date().toISOString().slice(0, 10);\n const lines: string[] = [\n `# hAIve Memory Digest — ${now}`,\n ``,\n `> **Period:** last ${days} day${days > 1 ? \"s\" : \"\"} | **Scope:** ${scopeFilter} | **Total:** ${recent.length} memor${recent.length === 1 ? \"y\" : \"ies\"}`,\n ``,\n `---`,\n ``,\n ];\n\n if (recent.length === 0) {\n lines.push(`_No new memories in the last ${days} days._`);\n } else {\n // Group by type\n const byType = new Map<string, typeof recent>();\n for (const m of recent) {\n const t = m.memory.frontmatter.type;\n if (!byType.has(t)) byType.set(t, []);\n byType.get(t)!.push(m);\n }\n\n for (const [type, mems] of byType) {\n lines.push(`## ${type.charAt(0).toUpperCase() + type.slice(1)} (${mems.length})`);\n lines.push(``);\n\n for (const { memory: mem } of mems) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const confidence = deriveConfidence(fm, u);\n const emoji = CONFIDENCE_EMOJI[confidence] ?? \"⬜\";\n const anchor = fm.anchor.paths.length > 0\n ? `\\`${fm.anchor.paths[0]}\\`` + (fm.anchor.paths.length > 1 ? ` +${fm.anchor.paths.length - 1}` : \"\")\n : \"_no anchor_\";\n\n lines.push(`### ${emoji} \\`${fm.id}\\``);\n lines.push(``);\n lines.push(`| Field | Value |`);\n lines.push(`|---|---|`);\n lines.push(`| **Status** | \\`${fm.status}\\` |`);\n lines.push(`| **Confidence** | ${confidence} |`);\n lines.push(`| **Scope** | ${fm.scope}${fm.module ? `/${fm.module}` : \"\"} |`);\n lines.push(`| **Tags** | ${fm.tags.length > 0 ? fm.tags.map((t) => `\\`${t}\\``).join(\", \") : \"_none_\"} |`);\n lines.push(`| **Anchor** | ${anchor} |`);\n lines.push(`| **Reads** | ${u.read_count} |`);\n lines.push(`| **Created** | ${fm.created_at.slice(0, 10)} |`);\n lines.push(``);\n // First 6 lines of body\n const bodyPreview = mem.body.split(\"\\n\").slice(0, 6).join(\"\\n\").trim();\n lines.push(bodyPreview);\n lines.push(``);\n lines.push(`**Action:** [ ] approve [ ] reject [ ] keep as-is`);\n lines.push(``);\n lines.push(`---`);\n lines.push(``);\n }\n }\n }\n\n lines.push(``);\n lines.push(\n `> _To take action: \\`haive memory approve <id>\\`, \\`haive memory reject <id>\\`, or open \\`haive tui\\` for interactive review._`,\n );\n\n const digest = lines.join(\"\\n\");\n\n if (opts.out) {\n const outPath = path.resolve(process.cwd(), opts.out);\n await writeFile(outPath, digest, \"utf8\");\n ui.success(`Digest written to ${opts.out} (${recent.length} memor${recent.length === 1 ? \"y\" : \"ies\"})`);\n } else {\n console.log(digest);\n }\n });\n}\n","/**\n * haive session end — save a structured end-of-session recap.\n *\n * Uses topic-upsert: one recap per scope is kept and updated in-place.\n * get_briefing automatically surfaces the latest recap at the next session start.\n */\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n loadMemoriesFromDir,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n type MemoryFrontmatter,\n type MemoryScope,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface SessionEndOptions {\n goal: string;\n accomplished: string;\n discoveries?: string;\n files?: string;\n next?: string;\n scope?: MemoryScope;\n module?: string;\n dir?: string;\n}\n\nfunction buildRecapBody(opts: SessionEndOptions): string {\n const lines: string[] = [];\n lines.push(`## Goal\\n${opts.goal}`);\n lines.push(`\\n## Accomplished\\n${opts.accomplished}`);\n if (opts.discoveries?.trim()) {\n lines.push(`\\n## Discoveries & surprises\\n${opts.discoveries}`);\n }\n const filesTouched = parseCsv(opts.files);\n if (filesTouched.length > 0) {\n lines.push(`\\n## Files touched\\n${filesTouched.map((f) => `- \\`${f}\\``).join(\"\\n\")}`);\n }\n if (opts.next?.trim()) {\n lines.push(`\\n## Next steps\\n${opts.next}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction recapTopic(scope: string, module?: string): string {\n return module ? `session-recap-${scope}-${module}` : `session-recap-${scope}`;\n}\n\nexport function registerSessionEnd(session: Command): void {\n session\n .command(\"end\")\n .description(\n \"Save an end-of-session recap so the NEXT session starts with fresh context.\\n\\n\" +\n \" One recap per scope is kept and updated in-place (topic-upsert). The next\\n\" +\n \" session's get_briefing (or haive briefing) shows it at the very top.\\n\\n\" +\n \" In autopilot mode, a minimal recap saves automatically on MCP server exit.\\n\" +\n \" Calling this manually produces a richer, more actionable recap.\\n\\n\" +\n \" Example:\\n\" +\n \" haive session end \\\\\\\\\\n\" +\n \" --goal \\\"Add Stripe webhook handler\\\" \\\\\\\\\\n\" +\n \" --accomplished \\\"Implemented webhook endpoint, added idempotency key\\\" \\\\\\\\\\n\" +\n \" --discoveries \\\"Missing .env.example entry for STRIPE_WEBHOOK_SECRET\\\" \\\\\\\\\\n\" +\n \" --files src/payments/WebhookController.ts,src/payments/WebhookService.ts \\\\\\\\\\n\" +\n \" --next \\\"Add integration tests for webhook signature validation\\\"\\n\",\n )\n .requiredOption(\"--goal <text>\", \"what you were trying to accomplish (1–2 sentences)\")\n .requiredOption(\"--accomplished <text>\", \"what was actually done (bullet list recommended)\")\n .option(\"--discoveries <text>\", \"bugs, surprises, or inconsistencies found during this session\")\n .option(\"--files <csv>\", \"key files touched, comma-separated (used as anchor for staleness detection)\")\n .option(\"--next <text>\", \"what should happen next (for the next session or a teammate)\")\n .option(\"--scope <scope>\", \"personal | team | module (default: personal)\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: SessionEndOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const scope = opts.scope ?? \"personal\";\n const body = buildRecapBody(opts);\n const topic = recapTopic(scope, opts.module);\n const filesTouched = parseCsv(opts.files);\n\n // Warn about paths that don't exist in project\n const missingPaths = filesTouched.filter((p) => !existsSync(path.resolve(root, p)));\n if (missingPaths.length > 0) {\n ui.warn(`Anchor path${missingPaths.length > 1 ? \"s\" : \"\"} not found in project (will be stale):`);\n for (const p of missingPaths) ui.warn(` ✗ ${p}`);\n }\n\n // ── Topic upsert ────────────────────────────────────────────────\n if (existsSync(paths.memoriesDir)) {\n const existing = await loadMemoriesFromDir(paths.memoriesDir);\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === topic &&\n memory.frontmatter.scope === scope &&\n (!opts.module || memory.frontmatter.module === opts.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const revisionCount = (fm.revision_count ?? 0) + 1;\n const newFrontmatter: MemoryFrontmatter = {\n ...fm,\n revision_count: revisionCount,\n anchor: {\n ...fm.anchor,\n paths: filesTouched.length ? filesTouched : fm.anchor.paths,\n },\n };\n await writeFile(topicMatch.filePath, serializeMemory({ frontmatter: newFrontmatter, body }), \"utf8\");\n ui.success(`Session recap updated (revision #${revisionCount})`);\n ui.info(`id=${fm.id} file=${path.relative(root, topicMatch.filePath)}`);\n return;\n }\n }\n\n // ── Create first recap ──────────────────────────────────────────\n const frontmatter = buildFrontmatter({\n type: \"session_recap\",\n slug: \"recap\",\n scope,\n module: opts.module,\n tags: [\"session\", \"recap\"],\n paths: filesTouched,\n topic,\n status: \"validated\",\n });\n\n const file = memoryFilePath(paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n ui.success(`Session recap created`);\n ui.info(`id=${frontmatter.id} scope=${scope} file=${path.relative(root, file)}`);\n ui.info(\"Next session: call \\`get_briefing\\` — the recap will be surfaced automatically.\");\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n","/**\n * haive snapshot — take or compare an API contract snapshot.\n *\n * haive snapshot --contract openapi.yaml --name payment-api\n * haive snapshot --contract schema.graphql --format graphql\n * haive snapshot --diff --name payment-api\n * haive snapshot --list\n */\nimport { existsSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n diffContract,\n findProjectRoot,\n loadConfig,\n resolveHaivePaths,\n snapshotContract,\n} from \"@hiveai/core\";\nimport type { ContractFile } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface SnapshotOptions {\n contract?: string;\n name?: string;\n format?: string;\n diff?: boolean;\n list?: boolean;\n dir?: string;\n}\n\nexport function registerSnapshot(program: Command): void {\n program\n .command(\"snapshot\")\n .description(\n \"Take or compare an API contract snapshot to detect breaking changes.\\n\\n\" +\n \" A snapshot captures the structure of a contract file (endpoints, types, fields).\\n\" +\n \" Running 'haive sync' automatically checks all configured contracts.\\n\" +\n \" This command lets you snapshot or diff a single contract on demand.\\n\\n\" +\n \" Supported formats: openapi, graphql, proto, typescript, json-schema\\n\\n\" +\n \" Examples:\\n\" +\n \" haive snapshot --contract docs/openapi.yaml --name payment-api\\n\" +\n \" haive snapshot --diff --name payment-api\\n\" +\n \" haive snapshot --list\\n\\n\" +\n \" To monitor contracts automatically on haive sync, add them to haive.config.json:\\n\" +\n \" { \\\"contractFiles\\\": [{ \\\"name\\\": \\\"payment-api\\\", \\\"path\\\": \\\"docs/openapi.yaml\\\", \\\"format\\\": \\\"openapi\\\" }] }\\n\",\n )\n .option(\"--contract <file>\", \"path to the contract file to snapshot (relative to project root)\")\n .option(\"--name <name>\", \"name for this contract (used in the lock file and memories)\")\n .option(\n \"--format <format>\",\n \"contract format: openapi | graphql | proto | typescript | json-schema (auto-detected if omitted)\",\n )\n .option(\"--diff\", \"compare the contract against its stored snapshot\")\n .option(\"--list\", \"list all stored contract snapshots\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: SnapshotOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.haiveDir)) {\n ui.error(\"No .ai/ found. Run `haive init` first.\");\n process.exitCode = 1;\n return;\n }\n\n // haive snapshot --list\n if (opts.list) {\n const contractsDir = path.join(paths.haiveDir, \"contracts\");\n if (!existsSync(contractsDir)) {\n console.log(ui.dim(\"No contract snapshots found.\"));\n return;\n }\n const files = (await readdir(contractsDir)).filter(\n (f) => f.endsWith(\".lock\") && !f.startsWith(\"deps-\"),\n );\n if (files.length === 0) {\n console.log(ui.dim(\"No contract snapshots found.\"));\n return;\n }\n console.log(ui.bold(`Contract snapshots (${files.length}):`));\n for (const f of files) {\n const name = f.replace(\".lock\", \"\");\n console.log(` ${name}`);\n }\n return;\n }\n\n // haive snapshot --diff --name <name>\n if (opts.diff) {\n if (!opts.name) {\n // Try all configured contracts\n const config = await loadConfig(paths);\n const contracts = config.contractFiles ?? [];\n if (contracts.length === 0) {\n ui.error(\"--diff requires --name, or configure contractFiles in haive.config.json\");\n process.exitCode = 1;\n return;\n }\n for (const contract of contracts) {\n await runDiff(root, paths.haiveDir, contract);\n }\n return;\n }\n\n // Diff a named contract (need to know path — check config)\n const config = await loadConfig(paths);\n const configured = (config.contractFiles ?? []).find((c) => c.name === opts.name);\n if (!configured && !opts.contract) {\n ui.error(\n `Contract \"${opts.name}\" not found in haive.config.json and --contract not provided.`,\n );\n process.exitCode = 1;\n return;\n }\n const contract: ContractFile = configured ?? {\n name: opts.name!,\n path: opts.contract!,\n format: detectFormat(opts.contract ?? \"\") ?? \"openapi\",\n };\n await runDiff(root, paths.haiveDir, contract);\n return;\n }\n\n // haive snapshot --contract <file> [--name <name>] [--format <format>]\n if (!opts.contract) {\n ui.error(\"Provide --contract <file> or use --diff / --list.\");\n process.exitCode = 1;\n return;\n }\n\n const contractPath = opts.contract;\n const name = opts.name ?? path.basename(contractPath, path.extname(contractPath));\n const format =\n (opts.format as ContractFile[\"format\"]) ?? detectFormat(contractPath) ?? \"openapi\";\n\n const contract: ContractFile = { name, path: contractPath, format };\n try {\n const snapshot = await snapshotContract(root, paths.haiveDir, contract);\n console.log(ui.green(`✓ snapshot saved: ${name}`));\n if (snapshot.endpoints) {\n console.log(ui.dim(` ${snapshot.endpoints.length} endpoint(s) captured`));\n }\n if (snapshot.types) {\n console.log(ui.dim(` ${snapshot.types.length} type(s) captured`));\n }\n console.log(ui.dim(` lock: .ai/contracts/${name}.lock`));\n console.log(ui.dim(\" Next haive sync will detect changes automatically.\"));\n console.log(\n ui.dim(\n ` Tip: add to haive.config.json → contractFiles to monitor automatically:\\n` +\n ` { \"name\": \"${name}\", \"path\": \"${contractPath}\", \"format\": \"${format}\" }`,\n ),\n );\n } catch (err) {\n ui.error(String(err));\n process.exitCode = 1;\n }\n });\n}\n\nasync function runDiff(\n root: string,\n haiveDir: string,\n contract: ContractFile,\n): Promise<void> {\n try {\n const result = await diffContract(root, haiveDir, contract);\n if (result.unchanged) {\n console.log(ui.green(`✓ ${contract.name}: no changes detected`));\n return;\n }\n const breaking = result.changes.filter((c) => c.severity === \"breaking\");\n const additive = result.changes.filter((c) => c.severity === \"additive\");\n const unknown = result.changes.filter((c) => c.severity === \"unknown\");\n\n console.log(\n ui.bold(`Contract diff: ${contract.name}`) +\n ` — ${breaking.length} breaking · ${additive.length} additive · ${unknown.length} unknown`,\n );\n for (const c of result.changes) {\n const icon = c.severity === \"breaking\" ? \"🔴\" : c.severity === \"additive\" ? \"🟢\" : \"🟡\";\n console.log(` ${icon} ${c.description}`);\n }\n if (breaking.length > 0) {\n console.log(\n ui.yellow(\n \"\\n ⚠ Breaking changes detected — run `haive sync` to create a gotcha memory for your team.\",\n ),\n );\n }\n } catch (err) {\n ui.error(`diff failed for ${contract.name}: ${String(err)}`);\n }\n}\n\nfunction detectFormat(filePath: string): ContractFile[\"format\"] | null {\n const ext = path.extname(filePath).toLowerCase();\n const base = path.basename(filePath).toLowerCase();\n if (ext === \".yaml\" || ext === \".yml\" || ext === \".json\") {\n if (base.includes(\"openapi\") || base.includes(\"swagger\")) return \"openapi\";\n if (base.includes(\"schema\") || base.includes(\"graphql\")) return \"graphql\";\n return \"openapi\"; // default for YAML/JSON\n }\n if (ext === \".graphql\" || ext === \".gql\") return \"graphql\";\n if (ext === \".proto\") return \"proto\";\n if (ext === \".d.ts\" || ext === \".ts\") return \"typescript\";\n return null;\n}\n","/**\n * haive hub — shared team-knowledge hub operations.\n *\n * haive hub pull — import shared memories from the hub into this project\n * haive hub push — export this project's shared memories to the hub\n * haive hub status — show hub sync status (last pull/push, counts)\n * haive hub init <path> — initialize a new hub repo at <path>\n *\n * The hub is a plain git repo with a .ai/ directory.\n * Set hubPath in haive.config.json (relative or absolute path to the hub).\n *\n * Hub memory layout:\n * .ai/memories/shared/<source-project-name>/\n * - memories tagged with the source project name\n * - committed to the hub repo\n *\n * Multiple projects point at the same hub. Each project:\n * - push: writes its `shared`-scoped memories to hub/.ai/memories/shared/<project-name>/\n * - pull: reads from all other projects' shared directories in the hub\n */\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile, copyFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadConfig,\n loadMemoriesFromDir,\n resolveHaivePaths,\n saveConfig,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface HubOptions {\n dir?: string;\n commit?: boolean;\n message?: string;\n}\n\nexport function registerHub(program: Command): void {\n const hub = program\n .command(\"hub\")\n .description(\n \"Manage a shared team-knowledge hub — a central repo that multiple projects contribute to and pull from.\\n\\n\" +\n \" The hub is a plain git repo with a .ai/ directory. Each project pushes its\\n\" +\n \" `shared`-scoped memories to the hub and pulls from all other projects.\\n\\n\" +\n \" Setup:\\n\" +\n \" 1. haive hub init /path/to/team-hub\\n\" +\n \" 2. Add hubPath to .ai/haive.config.json: { \\\"hubPath\\\": \\\"../team-hub\\\" }\\n\" +\n \" 3. haive hub push — publish your shared memories\\n\" +\n \" 4. haive hub pull — import other projects' shared memories\\n\\n\" +\n \" Or configure in haive.config.json and haive sync handles it automatically.\\n\",\n );\n hub.action(() => hub.help());\n\n // haive hub init <path>\n hub\n .command(\"init <hubPath>\")\n .description(\n \"Initialize a new team-knowledge hub repo at <hubPath>.\\n\\n\" +\n \" Creates a git repo with a .ai/ directory structure ready for shared memories.\\n\\n\" +\n \" Example:\\n\" +\n \" haive hub init ../team-hub\\n\" +\n \" haive hub init /srv/git/team-knowledge\\n\",\n )\n .action(async (hubPath: string) => {\n const absPath = path.resolve(hubPath);\n await mkdir(absPath, { recursive: true });\n\n const gitCheck = spawnSync(\"git\", [\"rev-parse\", \"--git-dir\"], { cwd: absPath });\n if (gitCheck.status !== 0) {\n const init = spawnSync(\"git\", [\"init\"], { cwd: absPath, encoding: \"utf8\" });\n if (init.status !== 0) {\n ui.error(`git init failed: ${init.stderr}`);\n process.exitCode = 1;\n return;\n }\n }\n\n const sharedDir = path.join(absPath, \".ai\", \"memories\", \"shared\");\n await mkdir(sharedDir, { recursive: true });\n await writeFile(\n path.join(absPath, \".ai\", \"README.md\"),\n `# hAIve Team Knowledge Hub\\n\\n` +\n `This repo is a shared knowledge hub for hAIve.\\n\\n` +\n `Each project contributes its \\`shared\\`-scoped memories here.\\n` +\n `Other projects pull from it via \\`haive hub pull\\`.\\n\\n` +\n `## Structure\\n\\n` +\n \"`\" + \"`.ai/memories/shared/<project-name>/`\\n\\n\" +\n `## Usage\\n\\n` +\n \"```bash\\n\" +\n \"haive hub push # publish from a project\\n\" +\n \"haive hub pull # import into a project\\n\" +\n \"```\\n\",\n \"utf8\",\n );\n await writeFile(\n path.join(absPath, \".gitignore\"),\n \".ai/.cache/\\n.ai/memories/personal/\\n\",\n \"utf8\",\n );\n\n spawnSync(\"git\", [\"add\", \".\"], { cwd: absPath });\n spawnSync(\"git\", [\"commit\", \"-m\", \"chore: initialize hAIve team-knowledge hub\"], {\n cwd: absPath,\n encoding: \"utf8\",\n });\n\n console.log(ui.green(`✓ Hub initialized at ${absPath}`));\n console.log(\n ui.dim(\n `\\nNext steps:\\n` +\n ` 1. Add hubPath to your project's .ai/haive.config.json:\\n` +\n ` { \"hubPath\": \"${path.relative(process.cwd(), absPath)}\" }\\n` +\n ` 2. Run \\`haive hub push\\` to publish your shared memories\\n` +\n ` 3. Share ${absPath} with teammates (git remote, NFS, etc.)\\n`,\n ),\n );\n });\n\n // haive hub push\n hub\n .command(\"push\")\n .description(\n \"Push this project's shared-scoped memories to the hub.\\n\\n\" +\n \" Copies all memories with scope=shared to hub/.ai/memories/shared/<project-name>/.\\n\" +\n \" Optionally commits to the hub repo.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive hub push\\n\" +\n \" haive hub push --commit\\n\" +\n \" haive hub push --commit --message \\\"feat: add payment API contract memories\\\"\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--commit\", \"auto-commit to the hub repo after pushing\")\n .option(\"--message <msg>\", \"commit message for the hub (used with --commit)\")\n .action(async (opts: HubOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const config = await loadConfig(paths);\n\n if (!config.hubPath) {\n ui.error(\n \"hubPath not configured in .ai/haive.config.json.\\n\" +\n \" Add: { \\\"hubPath\\\": \\\"../team-hub\\\" }\\n\" +\n \" Or run: haive hub init <path> first.\",\n );\n process.exitCode = 1;\n return;\n }\n\n const hubRoot = path.resolve(root, config.hubPath);\n if (!existsSync(hubRoot)) {\n ui.error(`Hub not found at ${hubRoot}. Run \\`haive hub init ${config.hubPath}\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n // Project name = directory name\n const projectName = path.basename(root);\n const destDir = path.join(hubRoot, \".ai\", \"memories\", \"shared\", projectName);\n await mkdir(destDir, { recursive: true });\n\n // Load shared-scoped memories\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const shared = all.filter(\n ({ memory }) =>\n memory.frontmatter.scope === \"shared\" &&\n memory.frontmatter.status !== \"rejected\" &&\n memory.frontmatter.status !== \"deprecated\" &&\n // Don't push imported memories (avoid echo loops)\n !memory.frontmatter.tags.some((t) => t.startsWith(\"cross-repo:\")),\n );\n\n if (shared.length === 0) {\n ui.warn(\n \"No shared-scoped memories found. Create memories with scope=shared to push to the hub.\\n\" +\n \" Example: haive memory add --type architecture --slug my-api --scope shared --body \\\"...\\\"\\n\" +\n \" Or with MCP: mem_save({ scope: 'shared', ... })\",\n );\n return;\n }\n\n let pushed = 0;\n for (const { memory } of shared) {\n const fm = memory.frontmatter;\n const fileName = `${fm.id}.md`;\n const destPath = path.join(destDir, fileName);\n await writeFile(destPath, serializeMemory(memory), \"utf8\");\n pushed++;\n }\n\n console.log(ui.green(`✓ Pushed ${pushed} shared memor${pushed === 1 ? \"y\" : \"ies\"} to hub`));\n console.log(ui.dim(` Location: ${destDir}`));\n\n if (opts.commit) {\n const message =\n opts.message ?? `haive: sync shared memories from ${projectName} (${pushed} memories)`;\n spawnSync(\"git\", [\"add\", path.join(\".ai\", \"memories\", \"shared\", projectName)], {\n cwd: hubRoot,\n });\n const commit = spawnSync(\"git\", [\"commit\", \"-m\", message], {\n cwd: hubRoot,\n encoding: \"utf8\",\n });\n if (commit.status === 0) {\n console.log(ui.green(`✓ Committed to hub: \"${message}\"`));\n } else if (commit.stdout?.includes(\"nothing to commit\")) {\n console.log(ui.dim(\" Hub already up to date — nothing to commit.\"));\n } else {\n ui.warn(`git commit in hub failed: ${commit.stderr}`);\n }\n } else {\n console.log(\n ui.dim(\n \" Tip: use --commit to auto-commit to the hub repo, or commit manually.\",\n ),\n );\n }\n });\n\n // haive hub pull\n hub\n .command(\"pull\")\n .description(\n \"Pull shared memories from the hub into this project.\\n\\n\" +\n \" Imports all memories from hub/.ai/memories/shared/ EXCEPT this project's own.\\n\" +\n \" Imported memories land in .ai/memories/shared/<source-project-name>/.\\n\\n\" +\n \" Examples:\\n\" +\n \" haive hub pull\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: { dir?: string }) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const config = await loadConfig(paths);\n\n if (!config.hubPath) {\n ui.error(\n \"hubPath not configured in .ai/haive.config.json.\\n\" +\n \" Add: { \\\"hubPath\\\": \\\"../team-hub\\\" }\\n\" +\n \" Or run: haive hub init <path> first.\",\n );\n process.exitCode = 1;\n return;\n }\n\n const hubRoot = path.resolve(root, config.hubPath);\n const hubSharedDir = path.join(hubRoot, \".ai\", \"memories\", \"shared\");\n\n if (!existsSync(hubSharedDir)) {\n ui.warn(\"Hub has no shared memories yet. Run `haive hub push` from other projects first.\");\n return;\n }\n\n const projectName = path.basename(root);\n const { readdir } = await import(\"node:fs/promises\");\n const projectDirs = (await readdir(hubSharedDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory() && d.name !== projectName)\n .map((d) => d.name);\n\n if (projectDirs.length === 0) {\n console.log(ui.dim(\"No other projects have pushed to the hub yet.\"));\n return;\n }\n\n let totalImported = 0;\n let totalUpdated = 0;\n\n for (const sourceName of projectDirs) {\n const sourceDir = path.join(hubSharedDir, sourceName);\n const destDir = path.join(paths.memoriesDir, \"shared\", sourceName);\n await mkdir(destDir, { recursive: true });\n\n const sourceFiles = (await readdir(sourceDir)).filter((f) => f.endsWith(\".md\"));\n const { loadMemoriesFromDir: loadDir } = await import(\"@hiveai/core\");\n const existingInDest = await loadDir(destDir);\n const existingIds = new Set(existingInDest.map(({ memory }) => memory.frontmatter.id));\n\n for (const file of sourceFiles) {\n const srcPath = path.join(sourceDir, file);\n const destPath = path.join(destDir, file);\n\n // Tag with hub provenance\n const fileContent = await readFile(srcPath, \"utf8\");\n const alreadyTagged = fileContent.includes(`cross-repo:${sourceName}`);\n\n if (!alreadyTagged) {\n // Add provenance tag by copying as-is (the original already has cross-repo tags from push)\n await copyFile(srcPath, destPath);\n } else {\n await copyFile(srcPath, destPath);\n }\n\n const memId = file.replace(\".md\", \"\");\n if (existingIds.has(memId)) {\n totalUpdated++;\n } else {\n totalImported++;\n }\n }\n\n console.log(\n ui.dim(` [${sourceName}]: ${sourceFiles.length} memor${sourceFiles.length === 1 ? \"y\" : \"ies\"} synced`),\n );\n }\n\n console.log(\n ui.green(`✓ Hub pull complete: ${totalImported} new · ${totalUpdated} updated`),\n );\n });\n\n // haive hub status\n hub\n .command(\"status\")\n .description(\"Show hub sync status.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: { dir?: string }) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const config = await loadConfig(paths);\n\n console.log(ui.bold(\"Hub status\"));\n console.log(\n ` hubPath: ${config.hubPath ? ui.green(config.hubPath) : ui.dim(\"not configured\")}`,\n );\n\n const sharedDir = path.join(paths.memoriesDir, \"shared\");\n if (existsSync(sharedDir)) {\n const { readdir } = await import(\"node:fs/promises\");\n const sources = (await readdir(sharedDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name);\n console.log(`\\n Imported from ${sources.length} source(s):`);\n for (const src of sources) {\n const files = (await readdir(path.join(sharedDir, src))).filter((f) => f.endsWith(\".md\"));\n console.log(` ${src}: ${files.length} memor${files.length === 1 ? \"y\" : \"ies\"}`);\n }\n } else {\n console.log(ui.dim(\" No imported shared memories yet.\"));\n }\n\n // Count outgoing shared memories\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const outgoing = all.filter(\n ({ memory }) =>\n memory.frontmatter.scope === \"shared\" &&\n !memory.frontmatter.tags.some((t) => t.startsWith(\"cross-repo:\")),\n );\n console.log(`\\n This project's shared memories (ready to push): ${outgoing.length}`);\n if (outgoing.length > 0) {\n console.log(ui.dim(\" Run `haive hub push` to publish them to the hub.\"));\n }\n\n void readFile; void writeFile; void saveConfig; // imported for side effects\n });\n}\n","import { Command } from \"commander\";\nimport {\n aggregateUsage,\n findProjectRoot,\n parseSince,\n readUsageEvents,\n resolveHaivePaths,\n usageLogSize,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface StatsOptions {\n since?: string;\n json?: boolean;\n dir?: string;\n}\n\nexport function registerStats(program: Command): void {\n program\n .command(\"stats\")\n .description(\"Show MCP tool-usage stats over a window (e.g. --since 7d).\")\n .option(\"--since <window>\", \"ISO date or relative (e.g. '7d', '24h', '30m')\", \"30d\")\n .option(\"--json\", \"emit JSON instead of human-readable output\", false)\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: StatsOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n const size = await usageLogSize(paths);\n if (!size.exists) {\n if (opts.json) {\n console.log(JSON.stringify({ error: \"no_usage_log\" }));\n return;\n }\n ui.warn(\n `No usage log found at ${root}. ` +\n `Stats are populated as the MCP server logs each tool call. ` +\n `Run a session first, then re-check.`,\n );\n return;\n }\n\n const events = await readUsageEvents(paths);\n const since = parseSince(opts.since);\n const aggregate = aggregateUsage(events, since ?? undefined);\n\n if (opts.json) {\n console.log(JSON.stringify(aggregate, null, 2));\n return;\n }\n\n const window = opts.since ?? \"all time\";\n console.log(ui.bold(`hAIve usage stats (${window})`));\n console.log(\n ` ${ui.dim(\"total calls:\")} ${aggregate.total} ` +\n `${ui.dim(\"unique tools:\")} ${aggregate.by_tool.length} ` +\n `${ui.dim(\"log lines:\")} ${size.lines}`,\n );\n if (aggregate.window_start) {\n console.log(\n ` ${ui.dim(\"window:\")} ${aggregate.window_start.slice(0, 19)} → ${aggregate.window_end?.slice(0, 19)}`,\n );\n }\n if (aggregate.by_tool.length === 0) {\n ui.info(`No events in window. Try a wider --since (current: ${window}).`);\n return;\n }\n console.log();\n console.log(ui.bold(\"Top tools:\"));\n const maxCount = aggregate.by_tool[0]?.count ?? 1;\n for (const t of aggregate.by_tool.slice(0, 20)) {\n const bar = \"█\".repeat(Math.max(1, Math.round((t.count / maxCount) * 30)));\n const pct = ((t.count / aggregate.total) * 100).toFixed(1);\n console.log(\n ` ${t.tool.padEnd(28)} ${ui.green(bar)} ${ui.bold(String(t.count))} ` +\n `${ui.dim(`(${pct}%, last ${t.last_used.slice(0, 19)})`)}`,\n );\n }\n });\n}\n","import { performance } from \"node:perf_hooks\";\nimport { Command } from \"commander\";\nimport {\n estimateTokens,\n findProjectRoot,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport {\n antiPatternsCheck,\n codeMapTool,\n codeSearch,\n getBriefing,\n getRecap,\n memRelevantTo,\n} from \"@hiveai/mcp\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface BenchOptions {\n task?: string;\n json?: boolean;\n dir?: string;\n}\n\ninterface ScenarioResult {\n name: string;\n ok: boolean;\n latency_ms: number;\n payload_tokens: number;\n notes: string[];\n}\n\nexport function registerBench(program: Command): void {\n program\n .command(\"bench\")\n .description(\"Self-test the local hAIve setup: runs core MCP tools against this project and reports latency + payload size.\")\n .option(\"-t, --task <task>\", \"task description for ranking-aware tools\", \"audit dependencies for security risks\")\n .option(\"--json\", \"emit JSON instead of a table\", false)\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: BenchOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const ctx = { paths };\n const task = opts.task ?? \"audit dependencies for security risks\";\n\n const scenarios: Array<() => Promise<ScenarioResult>> = [\n async () => {\n const t0 = performance.now();\n const out = await getBriefing(\n {\n task,\n files: [],\n max_tokens: 4000,\n max_memories: 8,\n include_project_context: true,\n include_module_contexts: true,\n semantic: true,\n include_stale: false,\n track: false,\n format: \"compact\",\n symbols: [],\n min_semantic_score: 0,\n },\n ctx,\n );\n return summarize(\"get_briefing(compact)\", t0, out, [\n out.low_value ? \"low_value (cold-start)\" : `${out.memories.length} memories`,\n `search=${out.search_mode}`,\n ]);\n },\n async () => {\n const t0 = performance.now();\n const out = await codeMapTool({ paths: [], max_files: 40, max_tokens: 2000 }, ctx);\n return summarize(\"code_map(budget=2k)\", t0, out, [\n out.available ? `${out.files.length}/${out.total_files} files` : \"unavailable\",\n out.budget_clipped ? \"clipped\" : \"fits\",\n ]);\n },\n async () => {\n const t0 = performance.now();\n const out = await getRecap({ scope: \"any\" }, ctx);\n return summarize(\"get_recap\", t0, out, [\n out.recap ? `${out.recap.id.slice(0, 30)}…` : \"no recap\",\n ]);\n },\n async () => {\n const t0 = performance.now();\n const out = await memRelevantTo(\n { task, files: [], limit: 8, min_semantic_score: 0.25, format: \"compact\" },\n ctx,\n );\n return summarize(\"mem_relevant_to\", t0, out, [\n `${out.memories.length} memories`,\n `search=${out.search_mode}`,\n ]);\n },\n async () => {\n const t0 = performance.now();\n const out = await codeSearch({ query: task, k: 5, min_score: 0.2 }, ctx);\n return summarize(\"code_search\", t0, out, [\n out.available ? `${out.hits.length} hits` : \"needs index (haive index code-search)\",\n ]);\n },\n async () => {\n const t0 = performance.now();\n const out = await antiPatternsCheck({ diff: task, paths: [], limit: 5, semantic: true }, ctx);\n return summarize(\"anti_patterns_check\", t0, out, [\n `${out.warnings.length}/${out.scanned} warn`,\n ]);\n },\n ];\n\n const results: ScenarioResult[] = [];\n for (const run of scenarios) {\n try {\n results.push(await run());\n } catch (err) {\n results.push({\n name: \"(error)\",\n ok: false,\n latency_ms: 0,\n payload_tokens: 0,\n notes: [err instanceof Error ? err.message : String(err)],\n });\n }\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ root, task, scenarios: results }, null, 2));\n return;\n }\n\n console.log(ui.bold(`hAIve bench — ${root}`));\n console.log(ui.dim(`task: ${task}`));\n console.log();\n console.log(\n `${\"scenario\".padEnd(28)} ${\"latency\".padStart(8)} ${\"tokens\".padStart(7)} notes`,\n );\n console.log(\"─\".repeat(88));\n for (const r of results) {\n const status = r.ok ? ui.green(\"✓\") : ui.red(\"✗\");\n console.log(\n `${status} ${r.name.padEnd(26)} ${`${r.latency_ms.toFixed(0)} ms`.padStart(8)} ${String(r.payload_tokens).padStart(7)} ${r.notes.join(\"; \")}`,\n );\n }\n\n const totalTokens = results.reduce((s, r) => s + r.payload_tokens, 0);\n const totalMs = results.reduce((s, r) => s + r.latency_ms, 0);\n console.log(\"─\".repeat(88));\n console.log(\n `${ui.dim(\"totals:\")} ${`${totalMs.toFixed(0)} ms`.padStart(8)} ${String(totalTokens).padStart(7)}`,\n );\n });\n}\n\nfunction summarize(\n name: string,\n t0: number,\n payload: unknown,\n notes: string[],\n): ScenarioResult {\n return {\n name,\n ok: true,\n latency_ms: performance.now() - t0,\n payload_tokens: estimateTokens(JSON.stringify(payload)),\n notes,\n };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n aggregateUsage,\n buildFrontmatter,\n findProjectRoot,\n loadMemoriesFromDir,\n memoryFilePath,\n parseSince,\n readUsageEvents,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface SuggestOptions {\n since?: string;\n min?: string;\n json?: boolean;\n dir?: string;\n autoSave?: boolean;\n topN?: string;\n scope?: \"personal\" | \"team\";\n}\n\nconst SEARCH_TOOLS = new Set([\n \"mem_search\",\n \"code_search\",\n \"mem_relevant_to\",\n \"get_briefing\",\n]);\n\ninterface QuerySuggestion {\n query: string;\n count: number;\n tools: string[];\n last_used: string;\n reason: string;\n inferred_type: \"architecture\" | \"convention\" | \"decision\" | \"gotcha\";\n}\n\nexport function registerMemorySuggest(memory: Command): void {\n memory\n .command(\"suggest\")\n .description(\n \"Suggest memories to create based on recurring search queries in the usage log.\\n\\n\" +\n \" Use --auto-save to draft the top-N suggestions as draft memories. They land\\n\" +\n \" in personal scope by default with status=draft, ready for you to edit and promote.\",\n )\n .option(\"--since <window>\", \"ISO date or relative (e.g. '7d', '24h')\", \"30d\")\n .option(\"--min <count>\", \"minimum repeat count to surface a query\", \"2\")\n .option(\"--top-n <n>\", \"with --auto-save, draft this many top suggestions\", \"3\")\n .option(\"--scope <scope>\", \"with --auto-save, scope of drafted memories (personal | team)\", \"personal\")\n .option(\"--auto-save\", \"draft top-N suggestions as draft memories on disk\", false)\n .option(\"--json\", \"emit JSON instead of human-readable output\", false)\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: SuggestOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const events = await readUsageEvents(paths);\n if (events.length === 0) {\n if (opts.json) {\n console.log(JSON.stringify({ suggestions: [] }));\n return;\n }\n ui.warn(\"No usage log entries yet. Suggestions appear after the MCP server records some calls.\");\n return;\n }\n\n const since = parseSince(opts.since);\n const minCount = Math.max(1, parseInt(opts.min ?? \"2\", 10));\n const cutoff = since ? since.getTime() : 0;\n\n const queries = new Map<string, { count: number; tools: Set<string>; last: string }>();\n for (const e of events) {\n if (cutoff && Date.parse(e.at) < cutoff) continue;\n if (!SEARCH_TOOLS.has(e.tool)) continue;\n const key = (e.summary ?? \"\").toLowerCase().trim();\n if (!key) continue;\n const prior = queries.get(key);\n if (prior) {\n prior.count++;\n prior.tools.add(e.tool);\n if (e.at > prior.last) prior.last = e.at;\n } else {\n queries.set(key, { count: 1, tools: new Set([e.tool]), last: e.at });\n }\n }\n\n const suggestions: QuerySuggestion[] = [...queries.entries()]\n .filter(([, v]) => v.count >= minCount)\n .map(([query, v]) => ({\n query,\n count: v.count,\n tools: [...v.tools].sort(),\n last_used: v.last,\n reason: chooseReason(v.tools, v.count),\n inferred_type: inferType(v.tools, query),\n }))\n .sort((a, b) => b.count - a.count);\n\n // ── Auto-save flow ────────────────────────────────────────────────────\n if (opts.autoSave) {\n const topN = Math.max(1, parseInt(opts.topN ?? \"3\", 10));\n const scope: \"personal\" | \"team\" = opts.scope === \"team\" ? \"team\" : \"personal\";\n const top = suggestions.slice(0, topN);\n if (top.length === 0) {\n ui.warn(`No suggestions met --min=${minCount} — nothing to draft.`);\n return;\n }\n const created: Array<{ id: string; file: string; query: string }> = [];\n const skipped: Array<{ query: string; reason: string }> = [];\n const existing = existsSync(paths.memoriesDir)\n ? await loadMemoriesFromDir(paths.memoriesDir)\n : [];\n\n for (const s of top) {\n const slug = slugify(s.query);\n if (!slug) {\n skipped.push({ query: s.query, reason: \"could not derive a slug\" });\n continue;\n }\n // Avoid overwriting an existing memory with similar slug.\n const dup = existing.find(({ memory }) => memory.frontmatter.id.endsWith(`-${slug}`));\n if (dup) {\n skipped.push({ query: s.query, reason: `similar memory already exists (${dup.memory.frontmatter.id})` });\n continue;\n }\n const fm = buildFrontmatter({\n type: s.inferred_type,\n slug,\n scope,\n tags: [\"auto-suggested\", ...s.tools],\n paths: [],\n symbols: [],\n });\n // Drafts wait for human review.\n fm.status = \"draft\";\n const body = renderTemplate(s);\n const file = memoryFilePath(paths, fm.scope, fm.id, fm.module);\n await mkdir(path.dirname(file), { recursive: true });\n if (existsSync(file)) {\n skipped.push({ query: s.query, reason: `file already exists at ${path.relative(root, file)}` });\n continue;\n }\n await writeFile(file, serializeMemory({ frontmatter: fm, body }), \"utf8\");\n created.push({ id: fm.id, file: path.relative(root, file), query: s.query });\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ created, skipped }, null, 2));\n return;\n }\n for (const c of created) {\n ui.success(`Drafted ${c.id} → ${c.file}`);\n console.log(` ${ui.dim(\"from query:\")} ${truncate(c.query, 60)}`);\n }\n for (const s of skipped) {\n ui.warn(`Skipped: ${truncate(s.query, 50)} — ${s.reason}`);\n }\n if (created.length > 0) {\n console.log();\n ui.info(\"Drafts are status=draft — edit them, then `haive memory promote` to validate.\");\n }\n return;\n }\n\n // ── Read-only listing flow ───────────────────────────────────────────\n if (opts.json) {\n console.log(JSON.stringify({ window: opts.since, suggestions }, null, 2));\n return;\n }\n\n const totals = aggregateUsage(events, since ?? undefined);\n console.log(ui.bold(`hAIve memory suggestions (${opts.since ?? \"all time\"})`));\n console.log(\n ui.dim(`scanned ${totals.total} events, ${suggestions.length} repeated queries (≥${minCount})`),\n );\n console.log();\n if (suggestions.length === 0) {\n ui.info(\"No recurring searches yet — nothing to suggest.\");\n return;\n }\n for (const s of suggestions.slice(0, 30)) {\n console.log(\n ` ${ui.bold(`×${s.count}`)} ${ui.dim(`[${s.tools.join(\",\")}]`)} ${truncate(s.query, 70)}`,\n );\n console.log(` ${ui.dim(\"→\")} ${s.reason}`);\n }\n console.log();\n ui.info(\"Run with --auto-save to draft the top-3 as draft memories.\");\n });\n}\n\nfunction chooseReason(tools: Set<string>, count: number): string {\n if (tools.has(\"code_search\")) {\n return `${count} agents searched the code for this — consider mem_save (architecture/decision) capturing where it lives.`;\n }\n if (tools.has(\"mem_search\") || tools.has(\"mem_relevant_to\")) {\n return `${count} agents asked but the memory layer had no clear answer — consider mem_save (convention/decision/gotcha).`;\n }\n return `${count} agents asked the briefing for this — consider promoting the answer to a team memory.`;\n}\n\nfunction inferType(tools: Set<string>, query: string): QuerySuggestion[\"inferred_type\"] {\n const q = query.toLowerCase();\n if (q.includes(\"bug\") || q.includes(\"error\") || q.includes(\"crash\") || q.includes(\"trap\")) return \"gotcha\";\n if (q.includes(\"decid\") || q.includes(\"why\") || q.includes(\"choose\") || q.includes(\"vs \")) return \"decision\";\n if (tools.has(\"code_search\") && (q.includes(\"where\") || q.includes(\"location\") || q.includes(\"structure\"))) {\n return \"architecture\";\n }\n return \"convention\";\n}\n\nfunction renderTemplate(s: QuerySuggestion): string {\n return [\n `# Auto-drafted from recurring searches`,\n ``,\n `> This memory was drafted by \\`haive memory suggest --auto-save\\` because`,\n `> agents searched for this **${s.count} times** in the recent window`,\n `> via ${s.tools.join(\", \")}.`,\n ``,\n `## Query`,\n ``,\n `> ${s.query}`,\n ``,\n `## What to fill in`,\n ``,\n `Replace this section with the actual answer the team keeps re-discovering:`,\n ``,\n `- **What** — the convention / decision / gotcha (1-3 sentences)`,\n `- **Why** — the rationale or root cause`,\n `- **How to apply** — what an agent should do when this comes up again`,\n ``,\n `Then run \\`haive memory promote ${truncate(s.query, 30)}\\` to mark it validated.`,\n ].join(\"\\n\");\n}\n\nfunction slugify(s: string): string {\n return s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 60);\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 1) + \"…\";\n}\n","import { existsSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n resolveHaivePaths,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ArchiveOptions {\n since?: string;\n type?: string;\n apply?: boolean;\n json?: boolean;\n dir?: string;\n}\n\ninterface Candidate {\n id: string;\n type: string;\n status: string;\n last_seen: string;\n reason: string;\n filePath: string;\n}\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\nexport function registerMemoryArchive(memory: Command): void {\n memory\n .command(\"archive\")\n .description(\n \"Archive obsolete memories: marks status='deprecated' for memories not read in N days\\n\" +\n \" whose anchored paths have all disappeared (or have no anchor at all).\\n\\n\" +\n \" Defaults to a DRY RUN — pass --apply to actually rewrite files.\\n\" +\n \" Targets `attempt` memories by default since they age the fastest.\\n\\n\" +\n \" Recover later with `haive memory edit <id>` to set status back to validated.\",\n )\n .option(\"--since <window>\", \"minimum age since last read (e.g. '180d', '6m')\", \"180d\")\n .option(\"--type <type>\", \"limit to a memory type (default 'attempt'). Pass 'all' to scan all types.\", \"attempt\")\n .option(\"--apply\", \"actually rewrite files (default: dry run)\", false)\n .option(\"--json\", \"emit JSON instead of human-readable output\", false)\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: ArchiveOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const minDays = parseDays(opts.since ?? \"180d\");\n if (minDays === null) {\n ui.error(`Invalid --since value: ${opts.since}. Use formats like '180d', '6m', '1y'.`);\n process.exitCode = 1;\n return;\n }\n const cutoff = Date.now() - minDays * MS_PER_DAY;\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const typeFilter = opts.type === \"all\" ? null : (opts.type ?? \"attempt\");\n\n const candidates: Candidate[] = [];\n for (const { memory: mem, filePath } of all) {\n const fm = mem.frontmatter;\n if (typeFilter && fm.type !== typeFilter) continue;\n // Skip already-archived states.\n if (fm.status === \"deprecated\" || fm.status === \"rejected\") continue;\n // Anchorless OR all anchored paths gone OR all anchored symbols missing\n const hasAnyAnchor = fm.anchor.paths.length + fm.anchor.symbols.length > 0;\n const allPathsGone = fm.anchor.paths.length > 0\n && fm.anchor.paths.every((p) => !existsSync(path.join(paths.root, p)));\n const isAnchorless = !hasAnyAnchor;\n if (!isAnchorless && !allPathsGone) continue;\n // Age check\n const u = getUsage(usage, fm.id);\n const lastSeen = u.last_read_at ?? fm.created_at;\n if (Date.parse(lastSeen) >= cutoff) continue;\n\n candidates.push({\n id: fm.id,\n type: fm.type,\n status: fm.status,\n last_seen: lastSeen,\n reason: isAnchorless\n ? `anchorless and not read since ${lastSeen.slice(0, 10)}`\n : `all ${fm.anchor.paths.length} anchored path(s) missing and not read since ${lastSeen.slice(0, 10)}`,\n filePath,\n });\n }\n\n if (opts.json) {\n console.log(JSON.stringify({\n dry_run: !opts.apply,\n window_days: minDays,\n candidates: candidates.length,\n archived: opts.apply ? candidates.length : 0,\n items: candidates,\n }, null, 2));\n } else {\n const header = opts.apply ? \"Archiving\" : \"Would archive\";\n console.log(ui.bold(`${header} ${candidates.length} memor${candidates.length === 1 ? \"y\" : \"ies\"} (older than ${minDays}d, type=${typeFilter ?? \"all\"})`));\n if (candidates.length === 0) {\n ui.info(\"Nothing to archive — all memories are anchored or read recently.\");\n return;\n }\n for (const c of candidates) {\n console.log(` ${ui.dim(c.last_seen.slice(0, 10))} ${c.id} ${ui.dim(`(${c.type})`)} — ${c.reason}`);\n }\n }\n\n if (!opts.apply) {\n if (!opts.json) {\n console.log();\n ui.info(\"Dry run — pass --apply to mark these as deprecated on disk.\");\n }\n return;\n }\n\n // Apply: rewrite each file with status=deprecated.\n let archived = 0;\n let failed = 0;\n for (const c of candidates) {\n const found = all.find(({ filePath }) => filePath === c.filePath);\n if (!found) continue;\n const fm = { ...found.memory.frontmatter, status: \"deprecated\" as const };\n try {\n await writeFile(c.filePath, serializeMemory({ frontmatter: fm, body: found.memory.body }), \"utf8\");\n archived++;\n } catch (err) {\n if (!opts.json) {\n ui.error(`Failed to archive ${c.id}: ${err instanceof Error ? err.message : String(err)}`);\n }\n failed++;\n }\n }\n if (!opts.json) {\n ui.success(`Archived ${archived} memor${archived === 1 ? \"y\" : \"ies\"}${failed > 0 ? ` (${failed} failed)` : \"\"}`);\n }\n });\n}\n\nfunction parseDays(input: string): number | null {\n const m = input.match(/^(\\d+)([dmy])$/);\n if (!m) return null;\n const n = parseInt(m[1] ?? \"0\", 10);\n const unit = m[2] ?? \"d\";\n if (unit === \"d\") return n;\n if (unit === \"m\") return n * 30;\n if (unit === \"y\") return n * 365;\n return null;\n}\n","import { existsSync } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n codeMapPath,\n findProjectRoot,\n getUsage,\n loadCodeMap,\n loadConfig,\n loadMemoriesFromDir,\n loadUsageIndex,\n readUsageEvents,\n resolveHaivePaths,\n type LoadedMemory,\n type UsageEvent,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface DoctorOptions {\n json?: boolean;\n dir?: string;\n fix?: boolean;\n}\n\ntype Severity = \"info\" | \"warn\" | \"error\";\n\ninterface Finding {\n severity: Severity;\n code: string;\n message: string;\n fix?: string;\n}\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\nexport function registerDoctor(program: Command): void {\n program\n .command(\"doctor\")\n .description(\n \"Analyze the local hAIve setup and emit actionable recommendations.\\n\\n\" +\n \" Inspects: project-context status, memory health (stale/anchorless/decay/pending),\\n\" +\n \" code-map freshness, usage log signals (low-hit briefings, repeated empty searches).\\n\\n\" +\n \" Read-only by default. Pass --fix to suggest commands you can copy-paste.\",\n )\n .option(\"--json\", \"emit JSON instead of human-readable output\", false)\n .option(\"--fix\", \"include suggested fix commands in human output\", false)\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: DoctorOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const findings: Finding[] = [];\n\n // ── 1. Init state ─────────────────────────────────────────────────────\n if (!existsSync(paths.haiveDir)) {\n findings.push({\n severity: \"error\",\n code: \"not-initialized\",\n message: \".ai/ directory missing — haive is not initialized in this project.\",\n fix: \"haive init\",\n });\n return emit(findings, opts);\n }\n\n // ── 2. Project context ────────────────────────────────────────────────\n if (!existsSync(paths.projectContext)) {\n findings.push({\n severity: \"warn\",\n code: \"no-project-context\",\n message: \".ai/project-context.md is missing.\",\n fix: \"haive init\",\n });\n } else {\n const { readFile } = await import(\"node:fs/promises\");\n const content = await readFile(paths.projectContext, \"utf8\");\n const isTemplate = content.includes(\"TODO — high-level overview\") ||\n content.includes(\"Generated by `haive init`\");\n if (isTemplate) {\n findings.push({\n severity: \"warn\",\n code: \"template-context\",\n message: \"project-context.md still contains the default template — get_briefing returns little value until filled.\",\n fix: \"Invoke the bootstrap_project MCP prompt from your AI client.\",\n });\n }\n }\n\n // ── 3. Memories ───────────────────────────────────────────────────────\n const memories: LoadedMemory[] = existsSync(paths.memoriesDir)\n ? await loadMemoriesFromDir(paths.memoriesDir)\n : [];\n const now = Date.now();\n\n if (memories.length === 0) {\n findings.push({\n severity: \"info\",\n code: \"no-memories\",\n message: \"No memories yet. Capture knowledge as agents work via mem_save / mem_observe / mem_tried.\",\n });\n } else {\n const usage = await loadUsageIndex(paths);\n\n const stale = memories.filter((m) => m.memory.frontmatter.status === \"stale\");\n if (stale.length > 0) {\n findings.push({\n severity: \"warn\",\n code: \"stale-memories\",\n message: `${stale.length} memor${stale.length === 1 ? \"y\" : \"ies\"} marked stale (anchored code drifted).`,\n fix: \"haive memory verify --update # re-check anchors\\nhaive memory edit <id> # manually refresh body\",\n });\n }\n\n const proposed = memories.filter((m) => m.memory.frontmatter.status === \"proposed\");\n if (proposed.length > 0) {\n findings.push({\n severity: \"info\",\n code: \"pending-review\",\n message: `${proposed.length} memor${proposed.length === 1 ? \"y is\" : \"ies are\"} proposed and awaiting validation.`,\n fix: \"haive memory pending # list them\\nhaive memory auto-promote # promote those with high read_count\",\n });\n }\n\n // Anchorless = no paths AND no symbols → cannot detect drift automatically\n const anchorless = memories.filter((m) =>\n m.memory.frontmatter.anchor.paths.length === 0 &&\n m.memory.frontmatter.anchor.symbols.length === 0 &&\n m.memory.frontmatter.type !== \"session_recap\" &&\n m.memory.frontmatter.type !== \"glossary\"\n );\n if (anchorless.length / Math.max(memories.length, 1) > 0.3) {\n findings.push({\n severity: \"warn\",\n code: \"anchorless-majority\",\n message: `${anchorless.length}/${memories.length} memories have no anchor path/symbol — staleness undetectable.`,\n fix: \"Add `paths:` + `symbols:` to mem_save calls to enable haive memory verify.\",\n });\n }\n\n // Decay candidates: validated memories not read in 180 days\n const decayCandidates = memories.filter((m) => {\n if (m.memory.frontmatter.status !== \"validated\") return false;\n const u = getUsage(usage, m.memory.frontmatter.id);\n const last = u.last_read_at ?? m.memory.frontmatter.created_at;\n return (now - Date.parse(last)) / MS_PER_DAY > 180;\n });\n if (decayCandidates.length > 0) {\n findings.push({\n severity: \"info\",\n code: \"decay-candidates\",\n message: `${decayCandidates.length} validated memor${decayCandidates.length === 1 ? \"y has\" : \"ies have\"} not been read in 180+ days — confidence is decaying.`,\n fix: \"haive memory archive --type all --since 365d # dry run\",\n });\n }\n }\n\n // ── 4. Code-map freshness ─────────────────────────────────────────────\n const codeMap = await loadCodeMap(paths);\n if (!codeMap) {\n findings.push({\n severity: \"warn\",\n code: \"no-code-map\",\n message: \"No code-map found — code_map MCP tool and symbol_locations are unavailable.\",\n fix: \"haive index code\",\n });\n } else {\n const cmFile = codeMapPath(paths);\n const cmStat = await stat(cmFile);\n const ageDays = (now - cmStat.mtimeMs) / MS_PER_DAY;\n if (ageDays > 14) {\n findings.push({\n severity: \"warn\",\n code: \"stale-code-map\",\n message: `code-map is ${Math.round(ageDays)} days old (${Object.keys(codeMap.files).length} files indexed).`,\n fix: \"haive index code # or rely on the post-merge git hook\",\n });\n }\n }\n\n // ── 5. Usage log signals ──────────────────────────────────────────────\n const events = await readUsageEvents(paths);\n if (events.length === 0) {\n findings.push({\n severity: \"info\",\n code: \"no-usage-log\",\n message: \"No usage log entries — MCP server hasn't recorded any calls yet, or this project hasn't been used by an agent.\",\n });\n } else {\n // Count searches that likely returned little (heuristic: same query repeated 3+ times)\n const queryRepeats = new Map<string, number>();\n for (const e of events) {\n if (!isSearchTool(e.tool)) continue;\n const key = (e.summary ?? \"\").toLowerCase().trim();\n if (!key) continue;\n queryRepeats.set(key, (queryRepeats.get(key) ?? 0) + 1);\n }\n const repeated = [...queryRepeats.entries()].filter(([, n]) => n >= 3);\n if (repeated.length > 0) {\n findings.push({\n severity: \"info\",\n code: \"recurring-searches\",\n message: `${repeated.length} query${repeated.length === 1 ? \"\" : \"ies\"} repeated 3+ times — agents keep asking the same things.`,\n fix: `haive memory suggest --auto-save --top-n ${Math.min(5, repeated.length)}`,\n });\n }\n\n // Code-map calls that errored (returned 0 files even though indexed)\n const codeMapCalls = events.filter((e) => e.tool === \"code_map\").length;\n const briefingCalls = events.filter((e) => e.tool === \"get_briefing\").length;\n if (codeMapCalls > 0 && memories.length > 0) {\n // we only have summaries, not output; this stays informational\n findings.push({\n severity: \"info\",\n code: \"tool-mix\",\n message: `${briefingCalls} get_briefing call${briefingCalls === 1 ? \"\" : \"s\"}, ${codeMapCalls} code_map call${codeMapCalls === 1 ? \"\" : \"s\"} recorded.`,\n });\n }\n }\n\n // ── 6. Config sanity ──────────────────────────────────────────────────\n const config = await loadConfig(paths);\n if (!config.autoSessionEnd) {\n findings.push({\n severity: \"info\",\n code: \"no-autopilot\",\n message: \"Autopilot is OFF — session recaps are not auto-saved on shutdown.\",\n fix: \"Edit .ai/haive.config.json: set autoSessionEnd: true (or re-run `haive init` without --manual).\",\n });\n }\n\n emit(findings, opts);\n });\n}\n\nfunction emit(findings: Finding[], opts: DoctorOptions): void {\n if (opts.json) {\n console.log(JSON.stringify({ findings }, null, 2));\n return;\n }\n if (findings.length === 0) {\n ui.success(\"hAIve doctor — no issues found.\");\n return;\n }\n console.log(ui.bold(`hAIve doctor — ${findings.length} finding${findings.length === 1 ? \"\" : \"s\"}`));\n console.log();\n const order: Severity[] = [\"error\", \"warn\", \"info\"];\n for (const sev of order) {\n for (const f of findings.filter((x) => x.severity === sev)) {\n const icon = sev === \"error\" ? ui.red(\"✗\") : sev === \"warn\" ? ui.yellow(\"⚠\") : ui.dim(\"ℹ\");\n console.log(`${icon} ${ui.bold(f.code)} ${f.message}`);\n if (opts.fix && f.fix) {\n for (const line of f.fix.split(\"\\n\")) {\n console.log(` ${ui.dim(\"$\")} ${line}`);\n }\n }\n }\n }\n if (!opts.fix && findings.some((f) => f.fix)) {\n console.log();\n ui.info(\"Re-run with --fix to see suggested commands.\");\n }\n}\n\nfunction isSearchTool(name: string): boolean {\n return [\"mem_search\", \"code_search\", \"mem_relevant_to\", \"get_briefing\"].includes(name);\n}\n","import { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadMemoriesFromDir,\n parseSince,\n readUsageEvents,\n resolveHaivePaths,\n type UsageEvent,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface PlaybackOptions {\n since?: string;\n json?: boolean;\n dir?: string;\n sessionGap?: string;\n limit?: string;\n}\n\ninterface SessionBucket {\n index: number;\n start: string;\n end: string;\n duration_minutes: number;\n events: number;\n tools_count: Record<string, number>;\n briefing_tasks: string[];\n memories_created_since: number;\n /** memories that exist now but didn't at session start */\n new_memories: string[];\n}\n\nconst MS_PER_MINUTE = 60_000;\n\nexport function registerPlayback(program: Command): void {\n program\n .command(\"playback\")\n .description(\n \"Replay past sessions from the usage log. For each session, show:\\n\" +\n \" - tool calls (what kind, how many)\\n\" +\n \" - briefing tasks asked\\n\" +\n \" - memories that have been created since then (that the session didn't have)\\n\\n\" +\n \" Useful to ask 'would today's haive have helped past me on this task?'\",\n )\n .option(\"--since <window>\", \"limit to events in this window (e.g. '7d')\", \"30d\")\n .option(\"--session-gap <minutes>\", \"minutes of inactivity that splits a session\", \"30\")\n .option(\"--limit <n>\", \"show at most this many sessions (newest first)\", \"10\")\n .option(\"--json\", \"emit JSON instead of human-readable output\", false)\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: PlaybackOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n const events = await readUsageEvents(paths);\n if (events.length === 0) {\n if (opts.json) {\n console.log(JSON.stringify({ sessions: [] }));\n return;\n }\n ui.warn(\"No usage log entries yet.\");\n return;\n }\n\n const since = parseSince(opts.since);\n const cutoff = since ? since.getTime() : 0;\n const filtered = cutoff > 0\n ? events.filter((e) => Date.parse(e.at) >= cutoff)\n : events;\n\n const gapMs = Math.max(1, parseInt(opts.sessionGap ?? \"30\", 10)) * MS_PER_MINUTE;\n const sessions = bucketSessions(filtered, gapMs);\n\n // Load memories and pre-index by created_at to compute \"new memories since\" deltas.\n const all = existsSync(paths.memoriesDir) ? await loadMemoriesFromDir(paths.memoriesDir) : [];\n const memByCreatedAt = all\n .filter(({ memory }) => memory.frontmatter.type !== \"session_recap\")\n .map(({ memory }) => ({ id: memory.frontmatter.id, at: Date.parse(memory.frontmatter.created_at) }))\n .sort((a, b) => a.at - b.at);\n\n const enriched: SessionBucket[] = sessions.map((s, i) => {\n const startMs = Date.parse(s.start);\n const newer = memByCreatedAt.filter((m) => m.at > startMs);\n return {\n index: i,\n start: s.start,\n end: s.end,\n duration_minutes: (Date.parse(s.end) - startMs) / MS_PER_MINUTE,\n events: s.events.length,\n tools_count: countTools(s.events),\n briefing_tasks: s.events\n .filter((e) => e.tool === \"get_briefing\" && e.summary)\n .map((e) => e.summary!)\n .slice(0, 5),\n memories_created_since: newer.length,\n new_memories: newer.slice(0, 5).map((m) => m.id),\n };\n });\n\n // Sort newest first and apply limit\n enriched.sort((a, b) => Date.parse(b.start) - Date.parse(a.start));\n const limit = Math.max(1, parseInt(opts.limit ?? \"10\", 10));\n const shown = enriched.slice(0, limit);\n\n if (opts.json) {\n console.log(JSON.stringify({\n window: opts.since,\n session_gap_minutes: gapMs / MS_PER_MINUTE,\n total_sessions: enriched.length,\n sessions: shown,\n }, null, 2));\n return;\n }\n\n console.log(ui.bold(`hAIve playback — ${enriched.length} session(s) over ${opts.since ?? \"all time\"}`));\n console.log();\n for (const s of shown) {\n console.log(\n `${ui.bold(`Session ${s.index + 1}`)} ${ui.dim(s.start.slice(0, 19) + \" → \" + s.end.slice(11, 19))}` +\n ` ${ui.dim(`(${Math.round(s.duration_minutes)}m, ${s.events} call${s.events === 1 ? \"\" : \"s\"})`)}`,\n );\n const toolList = Object.entries(s.tools_count)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([t, n]) => `${t}×${n}`)\n .join(\", \");\n if (toolList) console.log(` ${ui.dim(\"tools:\")} ${toolList}`);\n if (s.briefing_tasks.length > 0) {\n console.log(` ${ui.dim(\"briefings asked:\")}`);\n for (const t of s.briefing_tasks) {\n console.log(` • ${truncate(t, 80)}`);\n }\n }\n if (s.memories_created_since > 0) {\n console.log(\n ` ${ui.green(\"⤴\")} ${s.memories_created_since} memor${s.memories_created_since === 1 ? \"y has\" : \"ies have\"} been created since this session ` +\n ui.dim(`— newer haive could have answered better`),\n );\n for (const id of s.new_memories) {\n console.log(` + ${ui.dim(id)}`);\n }\n }\n console.log();\n }\n });\n}\n\nfunction bucketSessions(events: UsageEvent[], gapMs: number): Array<{ start: string; end: string; events: UsageEvent[] }> {\n if (events.length === 0) return [];\n const sorted = [...events].sort((a, b) => Date.parse(a.at) - Date.parse(b.at));\n const buckets: Array<{ start: string; end: string; events: UsageEvent[] }> = [];\n let current: { start: string; end: string; events: UsageEvent[] } | null = null;\n for (const e of sorted) {\n if (!current) {\n current = { start: e.at, end: e.at, events: [e] };\n continue;\n }\n if (Date.parse(e.at) - Date.parse(current.end) > gapMs) {\n buckets.push(current);\n current = { start: e.at, end: e.at, events: [e] };\n } else {\n current.events.push(e);\n current.end = e.at;\n }\n }\n if (current) buckets.push(current);\n return buckets;\n}\n\nfunction countTools(events: UsageEvent[]): Record<string, number> {\n const out: Record<string, number> = {};\n for (const e of events) out[e.tool] = (out[e.tool] ?? 0) + 1;\n return out;\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 1) + \"…\";\n}\n","import { spawn } from \"node:child_process\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { preCommitCheck } from \"@hiveai/mcp\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface PrecommitOptions {\n blockOn?: \"any\" | \"high-confidence\" | \"never\";\n noSemantic?: boolean;\n json?: boolean;\n dir?: string;\n paths?: string[];\n}\n\nexport function registerPrecommit(program: Command): void {\n program\n .command(\"precommit\")\n .description(\n \"Run a pre-commit safety check: scans `git diff --cached` against known anti-patterns,\\n\" +\n \" surfaces conventions/decisions anchored to touched files, and warns about stale anchored memories.\\n\\n\" +\n \" Wire it into git as: `.git/hooks/pre-commit` running `haive precommit` (exit 1 = block).\\n\\n\" +\n \" Examples:\\n\" +\n \" haive precommit # auto-detects staged diff\\n\" +\n \" haive precommit --block-on any # block on any warning, not just high-confidence\\n\" +\n \" haive precommit --paths src/auth.ts src/db.ts # explicit paths instead of git diff\",\n )\n .option(\n \"--block-on <mode>\",\n \"'any' | 'high-confidence' (default) | 'never' (report only)\",\n \"high-confidence\",\n )\n .option(\"--no-semantic\", \"disable semantic search in anti-patterns matching\")\n .option(\"--json\", \"emit JSON instead of human-readable output\", false)\n .option(\"--paths <paths...>\", \"explicit paths to check (skips git diff)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: PrecommitOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const ctx = { paths };\n\n let diff = \"\";\n let touchedPaths: string[] = opts.paths ?? [];\n\n if (touchedPaths.length === 0) {\n // Auto-detect from git\n try {\n diff = await runCommand(\"git\", [\"diff\", \"--cached\"], root);\n if (!diff.trim()) {\n ui.warn(\"No staged changes — nothing to check. Stage with `git add` first.\");\n return;\n }\n const nameOnly = await runCommand(\"git\", [\"diff\", \"--cached\", \"--name-only\"], root);\n touchedPaths = nameOnly.split(\"\\n\").map((s) => s.trim()).filter(Boolean);\n } catch (err) {\n ui.error(`git diff failed: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n }\n\n const result = await preCommitCheck({\n diff: diff || undefined,\n paths: touchedPaths,\n block_on: opts.blockOn ?? \"high-confidence\",\n semantic: opts.noSemantic ? false : true,\n }, ctx);\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n process.exit(result.should_block ? 1 : 0);\n }\n\n console.log(ui.bold(`hAIve precommit — ${touchedPaths.length} file(s)`));\n console.log(\n ui.dim(\n ` anti-patterns: ${result.summary.anti_patterns} ` +\n `relevant memories: ${result.summary.relevant_memories} ` +\n `stale anchors: ${result.summary.stale_anchors}`,\n ),\n );\n console.log();\n\n if (result.warnings.length > 0) {\n console.log(ui.bold(\"⚠ Anti-patterns matched:\"));\n for (const w of result.warnings.slice(0, 10)) {\n console.log(` ${ui.yellow(\"⚠\")} ${w.id} ${ui.dim(`(${w.type}, ${w.confidence})`)}`);\n for (const line of w.body_preview.split(\"\\n\").slice(0, 3)) {\n console.log(` ${ui.dim(line)}`);\n }\n console.log(` ${ui.dim(\"reasons:\")} ${w.reasons.join(\", \")}`);\n }\n console.log();\n }\n\n if (result.relevant_memories.length > 0) {\n console.log(ui.bold(\"📌 Relevant conventions/decisions:\"));\n for (const m of result.relevant_memories) {\n console.log(` • ${m.id} ${ui.dim(`(${m.type}, ${m.confidence})`)}`);\n }\n console.log();\n }\n\n if (result.stale_anchors.length > 0) {\n console.log(ui.bold(\"🕒 Stale anchored memories:\"));\n for (const s of result.stale_anchors) {\n console.log(` • ${s.id}`);\n if (s.body_preview) console.log(` ${ui.dim(s.body_preview)}`);\n }\n console.log();\n }\n\n if (result.should_block) {\n ui.error(`Blocking commit (block_on=${opts.blockOn ?? \"high-confidence\"}). Address the warnings above or pass --block-on never to bypass.`);\n process.exit(1);\n }\n\n if (result.warnings.length === 0 && result.stale_anchors.length === 0) {\n ui.success(\"No anti-patterns or stale anchors found.\");\n } else {\n ui.success(\"Check passed (block_on threshold not met).\");\n }\n });\n}\n\nfunction runCommand(cmd: string, args: string[], cwd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const proc = spawn(cmd, args, { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n proc.stdout.on(\"data\", (chunk) => { stdout += chunk.toString(); });\n proc.stderr.on(\"data\", (chunk) => { stderr += chunk.toString(); });\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) => {\n if (code === 0) resolve(stdout);\n else reject(new Error(stderr || `${cmd} exited with code ${code}`));\n });\n });\n}\n"],"mappings":"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","names":["Command","program","findProjectRoot","program","existsSync","path","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","path","stat","path","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","path","mkdir","readFile","writeFile","existsSync","path","buildCodeMap","resolveHaivePaths","saveCodeMap","readFile","existsSync","path","readFile","existsSync","path","mkdir","writeFile","existsSync","path","program","path","resolveHaivePaths","existsSync","mkdir","writeFile","buildCodeMap","saveCodeMap","readFile","mkdir","writeFile","readFile","existsSync","path","findProjectRoot","program","findProjectRoot","path","existsSync","mkdir","readFile","writeFile","existsSync","path","findProjectRoot","require","program","findProjectRoot","path","existsSync","spawnSync","readFile","writeFile","mkdir","existsSync","path","buildFrontmatter","findProjectRoot","loadCodeMap","loadMemoriesFromDir","resolveHaivePaths","serializeMemory","program","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memory","writeFile","serializeMemory","path","buildFrontmatter","mkdir","loadCodeMap","spawnSync","buildCodeMap","saveCodeMap","readFile","mkdir","readFile","writeFile","existsSync","path","buildFrontmatter","findProjectRoot","loadMemoriesFromDir","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","parseCsv","path","readFile","loadMemoriesFromDir","writeFile","serializeMemory","buildFrontmatter","memoryFilePath","mkdir","existsSync","path","findProjectRoot","resolveHaivePaths","loadMemoriesFromDir","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","mkdir","writeFile","existsSync","path","findProjectRoot","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memoryFilePath","mkdir","path","writeFile","serializeMemory","existsSync","writeFile","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","found","next","writeFile","serializeMemory","path","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","parseCsv","writeFile","serializeMemory","path","writeFile","existsSync","path","DEFAULT_AUTO_PROMOTE_RULE","findProjectRoot","getUsage","isAutoPromoteEligible","loadUsageIndex","resolveHaivePaths","serializeMemory","memory","DEFAULT_AUTO_PROMOTE_RULE","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","isAutoPromoteEligible","getUsage","path","writeFile","serializeMemory","spawn","existsSync","readFile","path","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","readFile","spawn","existsSync","path","findProjectRoot","getUsage","inferModulesFromPaths","loadUsageIndex","memoryMatchesAnchorPaths","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","inferModulesFromPaths","memoryMatchesAnchorPaths","getUsage","path","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","mkdir","writeFile","existsSync","path","buildFrontmatter","findProjectRoot","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","buildFrontmatter","parseCsv","memoryFilePath","mkdir","path","writeFile","serializeMemory","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","existsSync","path","findProjectRoot","literalMatchesAllTokens","literalMatchesAnyToken","resolveHaivePaths","tokenizeQuery","trackReads","memory","findProjectRoot","resolveHaivePaths","existsSync","tokenizeQuery","loadMemoriesFromDir","literalMatchesAllTokens","literalMatchesAnyToken","path","trackReads","writeFile","existsSync","findProjectRoot","loadUsageIndex","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","writeFile","serializeMemory","loadUsageIndex","existsSync","unlink","path","findProjectRoot","loadUsageIndex","resolveHaivePaths","saveUsageIndex","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","unlink","loadUsageIndex","saveUsageIndex","existsSync","readFile","path","deriveConfidence","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","readFile","loadUsageIndex","getUsage","deriveConfidence","path","existsSync","path","deriveConfidence","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","deriveConfidence","path","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","verifyAnchor","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","verifyAnchor","path","writeFile","serializeMemory","readFile","existsSync","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","readFile","existsSync","readFile","mkdir","writeFile","path","buildFrontmatter","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","path","existsSync","readFile","mkdir","buildFrontmatter","writeFile","serializeMemory","existsSync","writeFile","path","deriveConfidence","findProjectRoot","getUsage","loadMemoriesFromDir","loadUsageIndex","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","deriveConfidence","path","writeFile","writeFile","mkdir","existsSync","path","buildFrontmatter","findProjectRoot","loadMemoriesFromDir","memoryFilePath","resolveHaivePaths","serializeMemory","parseCsv","session","findProjectRoot","resolveHaivePaths","existsSync","path","loadMemoriesFromDir","memory","writeFile","serializeMemory","buildFrontmatter","memoryFilePath","mkdir","existsSync","readdir","path","findProjectRoot","loadConfig","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","path","readdir","name","config","loadConfig","contract","existsSync","mkdir","readFile","writeFile","path","spawnSync","findProjectRoot","loadConfig","loadMemoriesFromDir","resolveHaivePaths","saveConfig","serializeMemory","program","path","mkdir","spawnSync","writeFile","findProjectRoot","resolveHaivePaths","loadConfig","existsSync","loadMemoriesFromDir","memory","serializeMemory","readdir","readFile","saveConfig","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","mkdir","writeFile","existsSync","path","aggregateUsage","buildFrontmatter","findProjectRoot","loadMemoriesFromDir","memoryFilePath","parseSince","readUsageEvents","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","readUsageEvents","parseSince","existsSync","loadMemoriesFromDir","buildFrontmatter","memoryFilePath","mkdir","path","writeFile","serializeMemory","aggregateUsage","existsSync","writeFile","path","findProjectRoot","getUsage","loadMemoriesFromDir","loadUsageIndex","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","path","getUsage","writeFile","serializeMemory","existsSync","codeMapPath","findProjectRoot","getUsage","loadCodeMap","loadConfig","loadMemoriesFromDir","loadUsageIndex","readUsageEvents","resolveHaivePaths","MS_PER_DAY","program","findProjectRoot","resolveHaivePaths","existsSync","readFile","loadMemoriesFromDir","loadUsageIndex","getUsage","loadCodeMap","codeMapPath","readUsageEvents","loadConfig","existsSync","findProjectRoot","loadMemoriesFromDir","parseSince","readUsageEvents","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","readUsageEvents","parseSince","existsSync","loadMemoriesFromDir","memory","truncate","spawn","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","spawn","Command"]}
|