@hiveai/cli 0.9.11 → 0.9.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/briefing.ts","../src/utils/ui.ts","../src/utils/briefing-radar.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/utils/claude-hooks.ts","../src/commands/observe.ts","../src/commands/mcp.ts","../../mcp/src/server.ts","../../mcp/src/context.ts","../../mcp/src/tools/bootstrap-project-save.ts","../../mcp/src/tools/get-project-context.ts","../../mcp/src/tools/mem-list.ts","../../mcp/src/tools/mem-save.ts","../../mcp/src/tools/mem-search.ts","../../mcp/src/tools/mem-verify.ts","../../mcp/src/tools/mem-reject.ts","../../mcp/src/tools/mem-for-files.ts","../../mcp/src/tools/mem-get.ts","../../mcp/src/tools/mem-delete.ts","../../mcp/src/tools/mem-update.ts","../../mcp/src/tools/mem-pending.ts","../../mcp/src/tools/mem-approve.ts","../../mcp/src/tools/mem-tried.ts","../../mcp/src/tools/mem-observe.ts","../../mcp/src/tools/mem-session-end.ts","../../mcp/src/session-tracker.ts","../../mcp/src/tools/get-briefing.ts","../../mcp/src/tools/code-map.ts","../../mcp/src/tools/mem-diff.ts","../../mcp/src/tools/get-recap.ts","../../mcp/src/tools/mem-relevant-to.ts","../../mcp/src/tools/code-search.ts","../../mcp/src/tools/why-this-file.ts","../../mcp/src/tools/anti-patterns-check.ts","../../mcp/src/tools/mem-distill.ts","../../mcp/src/tools/why-this-decision.ts","../../mcp/src/tools/mem-conflicts.ts","../../mcp/src/tools/precommit-check.ts","../../mcp/src/tools/pattern-detect.ts","../../mcp/src/tools/mem-conflict-candidates.ts","../../mcp/src/tools/mem-resolve-project.ts","../../mcp/src/tools/mem-suggest-topic.ts","../../mcp/src/tools/mem-timeline.ts","../../mcp/src/tools/runtime-journal-append.ts","../../mcp/src/tools/runtime-journal-tail.ts","../../mcp/src/prompts/bootstrap-project.ts","../../mcp/src/prompts/post-task.ts","../../mcp/src/prompts/import-docs.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/benchmark.ts","../src/commands/memory-suggest.ts","../src/commands/memory-archive.ts","../src/commands/doctor.ts","../src/commands/playback.ts","../src/commands/precommit.ts","../src/commands/welcome.ts","../src/commands/memory-lint.ts","../src/commands/memory-suggest-topic.ts","../src/commands/resolve-project.ts","../src/commands/runtime-journal.ts","../src/commands/memory-timeline.ts","../src/commands/memory-conflict-candidates.ts","../src/commands/enforce.ts","../src/commands/run.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 { registerObserve } from \"./commands/observe.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 { registerBenchmark } from \"./commands/benchmark.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\";\nimport { registerWelcome } from \"./commands/welcome.js\";\nimport { registerMemoryLint } from \"./commands/memory-lint.js\";\nimport { registerMemorySuggestTopic } from \"./commands/memory-suggest-topic.js\";\nimport { registerResolveProject } from \"./commands/resolve-project.js\";\nimport { registerRuntime } from \"./commands/runtime-journal.js\";\nimport { registerMemoryTimeline } from \"./commands/memory-timeline.js\";\nimport { registerMemoryConflictCandidates } from \"./commands/memory-conflict-candidates.js\";\nimport { registerEnforce } from \"./commands/enforce.js\";\nimport { registerRun } from \"./commands/run.js\";\n\nconst program = new Command();\n\ndeclare const __HAIVE_VERSION__: string;\n\nprogram\n .name(\"haive\")\n .description(\"hAIve — policy enforcement layer for AI coding agents\")\n .version(__HAIVE_VERSION__);\n\nregisterInit(program);\nregisterWelcome(program);\nregisterResolveProject(program);\nregisterRuntime(program);\nregisterEnforce(program);\nregisterRun(program);\n\nregisterMcp(program);\nregisterBriefing(program);\nregisterTui(program);\nregisterEmbeddings(program);\nregisterSync(program);\nregisterInstallHooks(program);\nregisterObserve(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);\nregisterMemorySuggestTopic(memory);\nregisterMemoryTimeline(memory);\nregisterMemoryConflictCandidates(memory);\nregisterMemoryArchive(memory);\nregisterMemoryLint(memory);\n\nconst session = program.command(\"session\").description(\"Manage session lifecycle\");\nregisterSessionEnd(session);\n\nregisterSnapshot(program);\nregisterHub(program);\nregisterStats(program);\nregisterBench(program);\nregisterBenchmark(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 { mkdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n extractActionsBriefBody,\n findProjectRoot,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadCodeMap,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n queryCodeMap,\n resolveBriefingBudget,\n resolveHaivePaths,\n tokenizeQuery,\n trackReads,\n writeBriefingMarker,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\nimport { buildRadar, radarHasContent, type RadarReport } from \"../utils/briefing-radar.js\";\n\ninterface BriefingOptions {\n task?: string;\n files?: string;\n symbols?: string;\n maxMemories?: string;\n maxTokens?: string;\n explainSource?: boolean;\n scope?: string;\n includeDraft?: boolean;\n includeStale?: boolean;\n dir?: string;\n include?: string[];\n radar?: boolean;\n /** quick | balanced | deep — aligns with get_briefing budget_preset */\n budget?: string;\n /** full | actions — mimic get_briefing format for printed bodies */\n memoryFormat?: string;\n}\n\nconst RADAR_AUTO_THRESHOLD = 3;\n\nconst CHARS_PER_TOKEN = 4;\n\nfunction printRadar(\n radar: RadarReport,\n out: (text: string) => boolean,\n reason: \"low-memory-signal\" | \"forced\",\n): void {\n if (!radar.insideGitRepo) return;\n if (!radarHasContent(radar)) return;\n const header = reason === \"low-memory-signal\"\n ? \"=== Project Radar (few relevant memories — surfacing live signals) ===\"\n : \"=== Project Radar ===\";\n out(`${ui.bold(header)}\\n`);\n\n if (radar.recentCommits.length > 0) {\n out(ui.bold(\"Recent commits:\"));\n for (const c of radar.recentCommits) {\n const filesBlurb = c.files.slice(0, 3).join(\", \");\n const more = c.files.length > 3 ? ` (+${c.files.length - 3})` : \"\";\n out(` ${ui.dim(c.date)} ${c.sha} ${c.subject}`);\n if (filesBlurb) out(ui.dim(` ${filesBlurb}${more}`));\n }\n out(\"\");\n }\n if (radar.openTodos.length > 0) {\n out(ui.bold(\"Open TODOs/FIXMEs:\"));\n for (const t of radar.openTodos) {\n out(` ${ui.dim(t.file + \":\" + t.line)} ${t.text}`);\n }\n out(\"\");\n }\n if (radar.hotFiles.length > 0) {\n out(ui.bold(\"Hot files (most modified recently):\"));\n for (const f of radar.hotFiles) {\n out(` ${f.changes}× ${ui.dim(f.path)}`);\n }\n out(\"\");\n }\n}\n\nclass TokenBudgetWriter {\n private used = 0;\n private truncated = false;\n constructor(private readonly budgetChars: number) {}\n write(text: string): boolean {\n if (this.truncated) return false;\n const next = this.used + text.length + 1;\n if (next > this.budgetChars) {\n console.log(ui.dim(`... [briefing truncated to fit --max-tokens budget · ${Math.round(this.used / CHARS_PER_TOKEN)} tokens used]`));\n this.truncated = true;\n return false;\n }\n console.log(text);\n this.used = next;\n return true;\n }\n isTruncated(): boolean { return this.truncated; }\n remainingChars(): number { return Math.max(0, this.budgetChars - this.used); }\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 --budget quick --task \\\"tiny fix\\\"\\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(\"--max-tokens <n>\", \"approximate token budget for the entire briefing (truncates if exceeded)\")\n .option(\"--explain-source\", \"annotate each memory with [source: <relative-path> · anchors: <files>] for traceable citations\")\n .option(\"--radar\", \"force project radar (recent commits, open TODOs, hot files) even when memories are plentiful\")\n .option(\"--no-radar\", \"disable the project radar even when memories are scarce\")\n .option(\n \"--budget <preset>\",\n \"align with MCP get_briefing budget_preset: quick | balanced | deep — sets cap + truncation budget (overrides --max-memories / replaces default open-ended output)\",\n undefined,\n )\n .option(\n \"--memory-format <mode>\",\n \"printed memory bodies: full (default) | actions (cheap bullet-focused excerpt)\",\n \"full\",\n )\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 const markerFiles = parseCsv(opts.files);\n if (existsSync(paths.haiveDir)) {\n await mkdir(paths.runtimeDir, { recursive: true });\n await writeBriefingMarker(paths, {\n task: opts.task ?? \"CLI briefing\",\n source: \"haive-briefing-cli\",\n sessionId: process.env.HAIVE_SESSION_ID,\n files: markerFiles,\n }).catch(() => { /* marker is best-effort */ });\n }\n\n type BB = \"quick\" | \"balanced\" | \"deep\";\n let budgetPreset: BB | null = null;\n if (opts.budget) {\n const b = opts.budget.trim().toLowerCase();\n if (b === \"quick\" || b === \"balanced\" || b === \"deep\") budgetPreset = b;\n else ui.warn(`Unknown --budget '${opts.budget}' — ignoring (use quick|balanced|deep).`);\n }\n\n let maxMemories = Math.max(1, Number(opts.maxMemories ?? 10));\n let budgetTokensCap: number | null = opts.maxTokens ? Math.max(100, Number(opts.maxTokens)) : null;\n\n if (budgetPreset !== null) {\n const presetNums = resolveBriefingBudget(budgetPreset, {\n max_tokens: 8000,\n max_memories: 8,\n include_module_contexts: true,\n });\n budgetTokensCap = presetNums.max_tokens;\n maxMemories = presetNums.max_memories;\n }\n\n const writer = budgetTokensCap !== null ? new TokenBudgetWriter(budgetTokensCap * CHARS_PER_TOKEN) : null;\n const out = (text: string): boolean => {\n if (writer) return writer.write(text);\n console.log(text);\n return true;\n };\n const stopped = (): boolean => writer?.isTruncated() ?? false;\n\n if (!existsSync(paths.memoriesDir)) {\n // No memories yet — print project context (if any) + radar fallback\n if (existsSync(paths.projectContext)) {\n out(`${ui.bold(\"=== Project Context ===\")}\\n`);\n out((await readFile(paths.projectContext, \"utf8\")).trim());\n out(\"\");\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 if (opts.radar !== false && !stopped()) {\n const filePathsEarly = parseCsv(opts.files);\n const tokensEarly = opts.task ? tokenizeQuery(opts.task) : null;\n const radar = await buildRadar({ root, taskTokens: tokensEarly, filePaths: filePathsEarly });\n printRadar(radar, out, \"low-memory-signal\");\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 = markerFiles;\n const tokens = opts.task ? tokenizeQuery(opts.task) : null;\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 && !stopped()) {\n const recap = recaps[0]!;\n const fm = recap.memory.frontmatter;\n const rev = fm.revision_count ? ` · revision #${fm.revision_count}` : \"\";\n out(`${ui.bold(\"=== Last Session Recap ===\")}\\n`);\n out(ui.dim(`${fm.id} (${fm.scope}${rev})`));\n out(recap.memory.body.trim());\n out(\"\");\n }\n\n // ── 2. Project context ─────────────────────────────────────────────────────\n if (existsSync(paths.projectContext) && !stopped()) {\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 out(\"\");\n } else {\n out(`${ui.bold(\"=== Project Context ===\")}\\n`);\n out(ctx.trim());\n out(\"\");\n }\n } else if (!existsSync(paths.projectContext)) {\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 if (opts.radar !== false && !stopped()) {\n const radar = await buildRadar({ root, taskTokens: tokens, filePaths });\n out(\"\");\n printRadar(radar, out, \"low-memory-signal\");\n }\n return;\n }\n\n if (stopped()) return;\n const usageIndex = await loadUsageIndex(paths).catch(() => null);\n out(`${ui.bold(\"=== Relevant Memories ===\")}\\n`);\n for (const item of top) {\n if (stopped()) break;\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 const reads = usageIndex?.by_id[fm.id]?.read_count ?? 0;\n const hitMarker = reads > 0 ? ` ${ui.dim(\"· \" + reads + \"× read\")}` : \"\";\n out(\n `${ui.bold(fm.id)} ${ui.dim(fm.scope + \"/\" + fm.type)} ${badge}${draftMarker}${unverifiedMarker}${originMarker}${hitMarker}`,\n );\n if (opts.explainSource) {\n const relPath = path.relative(root, item.filePath);\n const anchorPaths = fm.anchor?.paths ?? [];\n const anchorSymbols = fm.anchor?.symbols ?? [];\n const parts: string[] = [`source: ${relPath}`];\n if (anchorPaths.length > 0) parts.push(`paths: ${anchorPaths.join(\", \")}`);\n if (anchorSymbols.length > 0) parts.push(`symbols: ${anchorSymbols.join(\", \")}`);\n out(ui.dim(` [${parts.join(\" · \")}]`));\n }\n const memBody =\n opts.memoryFormat?.toLowerCase() === \"actions\"\n ? extractActionsBriefBody(item.memory.body)\n : item.memory.body.trim();\n out(memBody);\n out(\"\");\n }\n if (!stopped()) out(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 await writeBriefingMarker(paths, {\n task: opts.task ?? \"CLI briefing\",\n source: \"haive-briefing-cli\",\n sessionId: process.env.HAIVE_SESSION_ID,\n memoryIds: ids,\n files: filePaths,\n }).catch(() => { /* marker is best-effort */ });\n }\n\n // ── Project radar — surface git/TODO/hot-file signals when memories are scarce ──\n const radarForced = opts.radar === true;\n const radarAuto = opts.radar !== false && top.length < RADAR_AUTO_THRESHOLD;\n if ((radarForced || radarAuto) && !stopped()) {\n const radar = await buildRadar({ root, taskTokens: tokens, filePaths });\n if (radarHasContent(radar)) {\n out(\"\");\n printRadar(radar, out, radarForced ? \"forced\" : \"low-memory-signal\");\n }\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 && !stopped()) {\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 out(`\\n${ui.bold(\"=== Symbol Locations ===\")}\\n`);\n for (const sym of requestedSymbols) {\n if (stopped()) break;\n const { files } = queryCodeMap(codeMap, { symbol: sym });\n if (files.length === 0) {\n out(`${ui.dim(sym)} (not found in code-map)`);\n } else {\n for (const f of files) {\n if (stopped()) break;\n const exports = f.entry.exports.filter((e) =>\n e.name.toLowerCase().includes(sym.toLowerCase()),\n );\n for (const e of exports) {\n if (stopped()) break;\n const desc = e.description ? ` — ${e.description}` : \"\";\n out(`${ui.bold(e.name)} ${ui.dim(f.path + \":\" + e.line)} [${e.kind}]${desc}`);\n }\n }\n }\n }\n out(\"\");\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 { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst exec = promisify(execFile);\n\nexport interface RadarOptions {\n root: string;\n taskTokens: string[] | null;\n filePaths: string[];\n daysBack?: number;\n maxCommits?: number;\n maxTodos?: number;\n maxHotFiles?: number;\n}\n\nexport interface RadarReport {\n recentCommits: { sha: string; date: string; subject: string; files: string[] }[];\n openTodos: { file: string; line: number; text: string }[];\n hotFiles: { path: string; changes: number }[];\n insideGitRepo: boolean;\n}\n\nconst DEFAULT_DAYS_BACK = 14;\nconst DEFAULT_MAX_COMMITS = 5;\nconst DEFAULT_MAX_TODOS = 8;\nconst DEFAULT_MAX_HOT_FILES = 5;\n\nconst TODO_RE = /\\b(?:TODO|FIXME|HACK|XXX)\\b[: ]?(.{0,120})/i;\n\nconst SOURCE_GLOBS = [\n \"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\", \"*.py\", \"*.go\", \"*.rs\",\n \"*.java\", \"*.kt\", \"*.swift\", \"*.rb\", \"*.php\", \"*.cs\", \"*.cpp\", \"*.c\", \"*.h\",\n];\n\nasync function isGitRepo(root: string): Promise<boolean> {\n try {\n await exec(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], { cwd: root });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function getRecentCommits(\n root: string,\n daysBack: number,\n maxCommits: number,\n taskTokens: string[] | null,\n filePaths: string[],\n): Promise<RadarReport[\"recentCommits\"]> {\n try {\n const { stdout } = await exec(\n \"git\",\n [\n \"log\",\n `--since=${daysBack}.days.ago`,\n \"--name-only\",\n \"--pretty=format:%x1f%h%x1f%ad%x1f%s\",\n \"--date=short\",\n \"-n\", \"60\",\n ],\n { cwd: root, maxBuffer: 4 * 1024 * 1024 },\n );\n\n const blocks = stdout.split(\"\\x1f\").filter((b) => b.trim().length > 0);\n const commits: RadarReport[\"recentCommits\"] = [];\n for (let i = 0; i + 2 < blocks.length; i += 3) {\n const sha = blocks[i]!.trim();\n const date = blocks[i + 1]!.trim();\n const tail = blocks[i + 2]!;\n const lines = tail.split(\"\\n\").map((l) => l.trim()).filter(Boolean);\n const subject = lines.shift() ?? \"\";\n const files = lines;\n commits.push({ sha, date, subject, files });\n }\n\n const lowerTokens = taskTokens?.map((t) => t.toLowerCase()) ?? [];\n const lowerPaths = filePaths.map((p) => p.toLowerCase());\n const scored = commits.map((c) => {\n let score = 0;\n const haystack = (c.subject + \" \" + c.files.join(\" \")).toLowerCase();\n for (const t of lowerTokens) if (haystack.includes(t)) score += 2;\n for (const p of lowerPaths) if (c.files.some((f) => f.toLowerCase().includes(p))) score += 3;\n return { c, score };\n });\n\n if (lowerTokens.length === 0 && lowerPaths.length === 0) {\n return commits.slice(0, maxCommits);\n }\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, maxCommits)\n .map((s) => s.c);\n } catch {\n return [];\n }\n}\n\nasync function getOpenTodos(\n root: string,\n maxTodos: number,\n taskTokens: string[] | null,\n filePaths: string[],\n): Promise<RadarReport[\"openTodos\"]> {\n try {\n const includeArgs = SOURCE_GLOBS.flatMap((g) => [\"--include\", g]);\n const { stdout } = await exec(\n \"grep\",\n [\n \"-rnE\",\n \"--exclude-dir=node_modules\",\n \"--exclude-dir=.git\",\n \"--exclude-dir=dist\",\n \"--exclude-dir=build\",\n \"--exclude-dir=.next\",\n \"--exclude-dir=coverage\",\n ...includeArgs,\n \"\\\\b(TODO|FIXME|HACK|XXX)\\\\b\",\n \".\",\n ],\n { cwd: root, maxBuffer: 4 * 1024 * 1024 },\n ).catch((err: { stdout?: string }) => ({ stdout: err.stdout ?? \"\" }));\n\n const lines = stdout.split(\"\\n\").filter(Boolean);\n const parsed: RadarReport[\"openTodos\"] = [];\n for (const line of lines) {\n const m = line.match(/^([^:]+):(\\d+):(.*)$/);\n if (!m) continue;\n const [, file, lineNoStr, rest] = m;\n const todoMatch = rest!.match(TODO_RE);\n if (!todoMatch) continue;\n const text = (todoMatch[1] ?? \"\").trim() || rest!.trim().slice(0, 120);\n parsed.push({ file: file!.replace(/^\\.\\//, \"\"), line: Number(lineNoStr), text });\n }\n\n const lowerTokens = taskTokens?.map((t) => t.toLowerCase()) ?? [];\n const lowerPaths = filePaths.map((p) => p.toLowerCase());\n if (lowerTokens.length === 0 && lowerPaths.length === 0) {\n return parsed.slice(0, maxTodos);\n }\n const scored = parsed.map((t) => {\n let score = 0;\n const hay = (t.file + \" \" + t.text).toLowerCase();\n for (const tok of lowerTokens) if (hay.includes(tok)) score += 1;\n for (const p of lowerPaths) if (t.file.toLowerCase().includes(p)) score += 2;\n return { t, score };\n });\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, maxTodos)\n .map((s) => s.t);\n } catch {\n return [];\n }\n}\n\nasync function getHotFiles(\n root: string,\n daysBack: number,\n maxHotFiles: number,\n filePaths: string[],\n): Promise<RadarReport[\"hotFiles\"]> {\n try {\n const { stdout } = await exec(\n \"git\",\n [\n \"log\",\n `--since=${daysBack * 6}.days.ago`,\n \"--name-only\",\n \"--pretty=format:\",\n ],\n { cwd: root, maxBuffer: 4 * 1024 * 1024 },\n );\n const counts = new Map<string, number>();\n for (const raw of stdout.split(\"\\n\")) {\n const f = raw.trim();\n if (!f) continue;\n counts.set(f, (counts.get(f) ?? 0) + 1);\n }\n let entries = [...counts.entries()].map(([path, changes]) => ({ path, changes }));\n\n const lowerPaths = filePaths.map((p) => p.toLowerCase());\n if (lowerPaths.length > 0) {\n entries = entries.filter((e) => lowerPaths.some((p) => e.path.toLowerCase().includes(p)));\n }\n\n return entries.sort((a, b) => b.changes - a.changes).slice(0, maxHotFiles);\n } catch {\n return [];\n }\n}\n\nexport async function buildRadar(opts: RadarOptions): Promise<RadarReport> {\n const inside = await isGitRepo(opts.root);\n if (!inside) {\n return { recentCommits: [], openTodos: [], hotFiles: [], insideGitRepo: false };\n }\n const daysBack = opts.daysBack ?? DEFAULT_DAYS_BACK;\n const [recentCommits, openTodos, hotFiles] = await Promise.all([\n getRecentCommits(opts.root, daysBack, opts.maxCommits ?? DEFAULT_MAX_COMMITS, opts.taskTokens, opts.filePaths),\n getOpenTodos(opts.root, opts.maxTodos ?? DEFAULT_MAX_TODOS, opts.taskTokens, opts.filePaths),\n getHotFiles(opts.root, daysBack, opts.maxHotFiles ?? DEFAULT_MAX_HOT_FILES, opts.filePaths),\n ]);\n return { recentCommits, openTodos, hotFiles, insideGitRepo: true };\n}\n\nexport function radarHasContent(r: RadarReport): boolean {\n return r.recentCommits.length > 0 || r.openTodos.length > 0 || r.hotFiles.length > 0;\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, configureProjectMcpClients } 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> **AI agents**: use the **haive** MCP (\\`get_briefing\\` / \\`mem_relevant_to\\`) before substantive edits — see bridge files and \\`.cursor/rules/haive-mcp-required.mdc\\`.\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\nInstalling or initializing hAIve in this repository means **the team expects AI agents to drive work through hAIve**, not bypass it.\n\n### MCP first (default — never optional unless the developer says so)\nThe **haive** MCP server must be enabled in your client. Until it is unavailable (misconfiguration report to the developer), you **must** use it for substantive work:\n\n- **Before** you edit project source files, configs (\\`package.json\\`, tooling), or workflows for the current goal, invoke \\`get_briefing\\` with a short **task** string (and **files** / **symbols** when you know them). If project context was already refreshed in this session and you only need ranked memories, you may call \\`mem_relevant_to\\` instead—but **still** consult hAIve before trusting ungrounded guesses.\n- **Before** declaring a coding task finished, invoke the MCP prompt \\`post_task\\` when the session produced learnings or substantive changes worth capturing.\n\nDo **not** treat these as nice-to-have: they are **default-required** for coding agents here.\n\n### Session rules\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\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\n/** Cursor \\`.cursor/rules/*.mdc\\` — alwaysApply so agents see it even if bridge files are thin. */\nconst CURSOR_HAIVE_RULE_MDC = `---\ndescription: Require hAIve MCP (get_briefing / mem_relevant_to) before substantive repo edits\nalwaysApply: true\n---\n\n# hAIve — required for agents\n\nThis repository uses **hAIve**. Running \\`haive init\\` means the team expects agents to **use the haive MCP server by default**, not skip it.\n\n## Before you change the repo\n\n1. Call **\\`get_briefing\\`** with \\`task\\` (and \\`files\\` / \\`symbols\\` when known), **or** \\`mem_relevant_to\\` if full project context is already loaded and you only need ranked memories.\n2. Then read/search the codebase as needed. Do not invert this order for non-trivial work.\n\n## During / after the task\n\n- On failure: **\\`mem_tried\\`** immediately.\n- Before closing a substantive session: MCP prompt **\\`post_task\\`** when there is something worth capturing.\n\n## If haive MCP is missing\n\nTell the developer to enable the **haive** server (e.g. \\`haive mcp --stdio\\` in client config) and restart the client. Do not silently ignore hAIve.\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 \" Auto-bootstraps project-context.md from local files and seeds detected stack packs.\\n\" +\n \" Add --manual to control memory approval and session recaps yourself.\\n\" +\n \" Add --no-bootstrap and --stack none to disable the auto-features.\",\n )\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .option(\"--no-bridges\", \"do not generate CLAUDE.md / .cursorrules / copilot-instructions.md / .cursor/rules/haive-mcp-required.mdc\")\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 (ON by default in autopilot)\",\n )\n .option(\n \"--no-bootstrap\",\n \"skip the project-context auto-generation (only the default template is written)\",\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 ` Defaults to 'auto' in autopilot mode (detects from package.json). Pass 'none' to disable.`,\n )\n .option(\n \"--no-mcp-setup\",\n \"skip auto-configuring haive MCP (haive mcp --stdio) 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 // In autopilot mode, default-on the value-from-day-zero auto-features\n // unless the user explicitly opted out. opts.bootstrap is `false` only\n // when the user passed --no-bootstrap; it's `undefined` when neither flag\n // was given, which we resolve to autopilot's default.\n const wantBootstrap = opts.bootstrap === undefined ? autopilot : opts.bootstrap;\n const wantStack =\n opts.stack === undefined\n ? autopilot ? \"auto\" : undefined\n : opts.stack === \"none\" ? undefined : opts.stack;\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 await ensureAiRuntimeLayout(paths.runtimeDir);\n\n // ── project-context.md ───────────────────────────────────────────────\n if (!existsSync(paths.projectContext)) {\n if (wantBootstrap) {\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 await writeCursorHaiveRule(root);\n }\n\n // ── Stack memory packs ───────────────────────────────────────────────\n const stacksToSeed = await resolveStacksToSeed(root, wantStack);\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 + enforcement 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 agent-agnostic enforcement gates (MCP policy config, git hooks,\n // CI workflow, and supported client hooks such as Claude Code).\n const haiveBin = process.argv[1]!;\n const enforcementResult = spawnSync(\n process.execPath,\n [haiveBin, \"enforce\", \"install\", \"--dir\", root],\n { encoding: \"utf8\" },\n );\n if (enforcementResult.status === 0) {\n ui.success(\"hAIve enforcement installed (MCP, git, CI, client hooks where available)\");\n } else {\n ui.warn(\"hAIve enforcement not fully installed — run `haive enforce install` 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 // User-level (global, written once per machine)\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: command \\\"haive\\\", args [\\\"mcp\\\", \\\"--stdio\\\"].\\n\" +\n \" See: https://github.com/Doucs91/hAIve#mcp-setup\",\n );\n }\n\n // Project-level (per workspace, includes HAIVE_PROJECT_ROOT to fix multi-project CWD)\n const projectMcpResults = await configureProjectMcpClients(root);\n for (const r of projectMcpResults) {\n if (r.status === \"configured\") {\n ui.success(`haive MCP project config written (${path.relative(root, r.path!)})`);\n }\n }\n\n // Ensure project-level MCP configs are gitignored (they contain absolute paths)\n await ensureGitignoreEntries(root, [\n \".cursor/mcp.json\",\n \".vscode/mcp.json\",\n \".mcp.json\",\n ]);\n\n if (configured.length > 0 || projectMcpResults.some((r) => r.status === \"configured\")) {\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(\" ✓ Agent-agnostic enforcement gates installed (MCP, git, CI, wrapper-ready)\"));\n console.log(ui.dim(\" ✓ CI workflows created (sync + enforcement)\"));\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 writeCursorHaiveRule(root: string): Promise<void> {\n const relPath = \".cursor/rules/haive-mcp-required.mdc\";\n const target = path.join(root, relPath);\n if (existsSync(target)) {\n ui.info(`Cursor rule ${relPath} already exists — skipped`);\n return;\n }\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, CURSOR_HAIVE_RULE_MDC, \"utf8\");\n ui.success(`Created Cursor rule ${relPath}`);\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\nconst RUNTIME_README_BODY = `# .ai/.runtime — disposable local layer\n\nNot team truth. Use for machine-local session notes or tooling scratch files.\nOfficial memories belong in .ai/memories/ (versioned in Git).\nOnly .gitignore and this README are meant to commit; everything else stays untracked.\n\nSession continuity (local): agents may append \\`session-journal.ndjson\\` via MCP \\`runtime_journal_append\\` or \\`haive runtime journal append\\`.\n`;\n\nconst RUNTIME_GITIGNORE_BODY = `*\n!.gitignore\n!README.md\n`;\n\nasync function ensureAiRuntimeLayout(runtimeDir: string): Promise<void> {\n await mkdir(runtimeDir, { recursive: true });\n const gi = path.join(runtimeDir, \".gitignore\");\n if (!existsSync(gi)) {\n await writeFile(gi, RUNTIME_GITIGNORE_BODY, \"utf8\");\n }\n const readme = path.join(runtimeDir, \"README.md\");\n if (!existsSync(readme)) {\n await writeFile(readme, RUNTIME_README_BODY, \"utf8\");\n }\n}\n\n/**\n * Append gitignore entries if they aren't already present.\n * Creates .gitignore if it doesn't exist.\n * Silently no-ops on any filesystem error (non-blocking).\n */\nasync function ensureGitignoreEntries(root: string, patterns: string[]): Promise<void> {\n try {\n const gitignorePath = path.join(root, \".gitignore\");\n let existing = \"\";\n if (existsSync(gitignorePath)) {\n existing = await readFile(gitignorePath, \"utf8\");\n }\n const lines = existing.split(\"\\n\");\n const missing = patterns.filter((p) => !lines.some((l) => l.trim() === p));\n if (missing.length === 0) return;\n const toAppend = (existing.endsWith(\"\\n\") || existing === \"\" ? \"\" : \"\\n\") +\n \"# hAIve project-level MCP configs (machine-specific absolute paths)\\n\" +\n missing.join(\"\\n\") + \"\\n\";\n await writeFile(gitignorePath, existing + toAppend, \"utf8\");\n } catch {\n // non-fatal\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 type { Dirent } from \"node:fs\";\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\", \"@trpc/client\"],\n \"Prisma\": [\"@prisma/client\"],\n \"Drizzle\": [\"drizzle-orm\"],\n \"Redux Toolkit\": [\"@reduxjs/toolkit\"],\n \"Zustand\": [\"zustand\"],\n \"TanStack Query\": [\"@tanstack/react-query\", \"react-query\"],\n \"Mongoose\": [\"mongoose\"],\n \"Apollo\": [\"@apollo/client\", \"@apollo/server\", \"apollo-server\"],\n \"GraphQL\": [\"graphql\"],\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 workspaces?: string[] | { packages: 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>, isMonorepo: boolean): string {\n if (isMonorepo) {\n if (frameworks.includes(\"NestJS\")) return \"Monorepo (NestJS backend)\";\n if (frameworks.includes(\"Next.js\")) return \"Monorepo (Next.js)\";\n if (frameworks.includes(\"React\")) return \"Multi-package monorepo (React)\";\n if (frameworks.length > 0) return `Multi-package monorepo (${frameworks.slice(0, 2).join(\", \")})`;\n return \"Multi-package monorepo\";\n }\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: Dirent<string>[];\n try {\n entries = await readdir(dir, { withFileTypes: true, encoding: \"utf8\" });\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[], frameworks: 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 \"decorators\": \"custom decorators\",\n \"interceptors\": \"NestJS interceptors\",\n \"filters\": \"exception filters\",\n \"pipes\": \"validation / transformation pipes\",\n \"dto\": \"Data Transfer Objects\",\n \"entities\": \"ORM entities / database models\",\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 \"auth\": \"authentication / authorization\",\n \"users\": \"user management\",\n \"products\": \"product catalog\",\n \"orders\": \"order management\",\n \"common\": \"shared / common utilities\",\n \"shared\": \"shared code across modules\",\n };\n\n const isNestJS = frameworks.includes(\"NestJS\");\n\n // When src/ has meaningful subdirectories, list them for any backend/API project\n // (NestJS, Express, Fastify, Hono, tRPC, GraphQL…) — not just NestJS\n const isSrcBased = isNestJS ||\n frameworks.some((f) => [\"Express\", \"Fastify\", \"Hono\", \"tRPC\", \"Apollo\", \"GraphQL\"].includes(f));\n const isFrontend = frameworks.some((f) => [\"React\", \"Vue\", \"Svelte\", \"SvelteKit\", \"Astro\"].includes(f));\n const srcSubdirs = dirs.filter((d) => d.startsWith(\"src/\") && d.split(\"/\").length === 2);\n\n // Expand src/ for: all backend stacks AND frontend projects with ≥3 src/ subdirs\n // (shallow frontends like CRA only have src/components + src/index → skip)\n if ((isSrcBased && srcSubdirs.length >= 2) || (isFrontend && srcSubdirs.length >= 3)) {\n const label = isNestJS ? \"main source (NestJS feature modules)\" : \"main source\";\n const result: string[] = [`- \\`src/\\` — ${label}`];\n for (const d of srcSubdirs.slice(0, 12)) {\n const name = d.split(\"/\")[1]!;\n const desc = known[name.toLowerCase()] ?? \"module\";\n result.push(` - \\`${name}/\\` — ${desc}`);\n }\n // Also list other top-level dirs (prisma/, docker/, etc.)\n const otherTopLevel = dirs\n .filter((d) => !d.includes(\"/\") && d !== \"src\")\n .slice(0, 6);\n for (const d of otherTopLevel) {\n const desc = known[d.toLowerCase()] ?? \"module\";\n result.push(`- \\`${d}/\\` — ${desc}`);\n }\n return result;\n }\n\n // Monorepo pattern: packages/ contains workspace sub-packages\n const isMonorepo = dirs.some((d) => d === \"packages\") &&\n dirs.some((d) => d.startsWith(\"packages/\") && d.split(\"/\").length === 2);\n if (isMonorepo) {\n const packageSubdirs = dirs.filter((d) => d.startsWith(\"packages/\") && d.split(\"/\").length === 2);\n const result: string[] = [`- \\`packages/\\` — monorepo sub-packages`];\n for (const d of packageSubdirs.slice(0, 10)) {\n const name = d.split(\"/\")[1]!;\n const desc = known[name.toLowerCase()] ?? \"sub-package\";\n result.push(` - \\`${name}/\\` — ${desc}`);\n }\n const otherTopLevel = dirs\n .filter((d) => !d.includes(\"/\") && d !== \"packages\")\n .slice(0, 5);\n for (const d of otherTopLevel) {\n const desc = known[d.toLowerCase()] ?? \"module\";\n result.push(`- \\`${d}/\\` — ${desc}`);\n }\n return result;\n }\n\n // Default: top-level dirs\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 isMonorepo = pkg.workspaces !== undefined &&\n (Array.isArray(pkg.workspaces) ? pkg.workspaces.length > 0 : true);\n const projectType = detectProjectType(frameworks, pkg.scripts ?? {}, isMonorepo);\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, frameworks);\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 * Two layers:\n * User-level (global, written once):\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 *\n * Project-level (per project, written at haive init, includes HAIVE_PROJECT_ROOT):\n * - Cursor (<root>/.cursor/mcp.json)\n * - VS Code (<root>/.vscode/mcp.json)\n * - Claude Code (<root>/.mcp.json)\n *\n * Project-level configs take precedence over user-level when the client opens that\n * workspace, ensuring the MCP server always resolves the correct project root even\n * when the same haive process serves multiple projects.\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\",\n args: [\"mcp\", \"--stdio\"],\n};\n\nfunction projectMcpEntry(root: string) {\n return {\n command: \"haive\",\n args: [\"mcp\", \"--stdio\"],\n env: { HAIVE_PROJECT_ROOT: root },\n };\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/**\n * Write project-level MCP configs that include HAIVE_PROJECT_ROOT so that\n * each AI client uses the correct project root regardless of the server's CWD.\n *\n * These files are machine-specific (absolute paths) and should be gitignored.\n * haive init appends them to .gitignore automatically.\n *\n * Project-level configs take precedence over user-level configs in Cursor and\n * VS Code when the workspace is opened. This is the canonical fix for the\n * \"MCP server uses wrong project root in multi-project setups\" bug.\n */\nexport async function configureProjectMcpClients(root: string): Promise<ConfigureResult[]> {\n const entry = projectMcpEntry(root);\n const results: ConfigureResult[] = [];\n\n // ── Cursor: <root>/.cursor/mcp.json ──────────────────────────────────────\n try {\n const cursorPath = path.join(root, \".cursor\", \"mcp.json\");\n let config: { mcpServers?: Record<string, unknown> } = {};\n if (existsSync(cursorPath)) {\n try { config = JSON.parse(await readFile(cursorPath, \"utf8\")); } catch { /* keep empty */ }\n }\n config.mcpServers ??= {};\n config.mcpServers[\"haive\"] = entry;\n await mkdir(path.dirname(cursorPath), { recursive: true });\n await writeFile(cursorPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\");\n results.push({ client: \"Cursor (project)\", status: \"configured\", path: cursorPath });\n } catch (err) {\n results.push({ client: \"Cursor (project)\", status: \"error\", error: String(err) });\n }\n\n // ── VS Code: <root>/.vscode/mcp.json ─────────────────────────────────────\n try {\n const vscodePath = path.join(root, \".vscode\", \"mcp.json\");\n let config: { servers?: Record<string, unknown> } = {};\n if (existsSync(vscodePath)) {\n try { config = JSON.parse(await readFile(vscodePath, \"utf8\")); } catch { /* keep empty */ }\n }\n config.servers ??= {};\n config.servers[\"haive\"] = { ...entry, type: \"stdio\" };\n await mkdir(path.dirname(vscodePath), { recursive: true });\n await writeFile(vscodePath, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\");\n results.push({ client: \"VS Code (workspace)\", status: \"configured\", path: vscodePath });\n } catch (err) {\n results.push({ client: \"VS Code (workspace)\", status: \"error\", error: String(err) });\n }\n\n // ── Claude Code: <root>/.mcp.json ────────────────────────────────────────\n try {\n const mcpPath = path.join(root, \".mcp.json\");\n let config: { mcpServers?: Record<string, unknown> } = {};\n if (existsSync(mcpPath)) {\n try { config = JSON.parse(await readFile(mcpPath, \"utf8\")); } catch { /* keep empty */ }\n }\n config.mcpServers ??= {};\n config.mcpServers[\"haive\"] = { ...entry, type: \"stdio\" };\n await writeFile(mcpPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\");\n results.push({ client: \"Claude Code (project)\", status: \"configured\", path: mcpPath });\n } catch (err) {\n results.push({ client: \"Claude Code (project)\", 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 | \"zustand\" | \"redux\" | \"reactquery\" | \"trpc\" | \"mongoose\" | \"graphql\";\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 zustand: [\n {\n slug: \"zustand-select-slices-not-whole-store\",\n type: \"convention\",\n tags: [\"zustand\", \"performance\", \"react\"],\n body: `Always select specific slices — never subscribe to the whole store.\n\n\\`\\`\\`ts\n// ❌ Re-renders on any store change (even unrelated fields)\nconst store = useStore();\n\n// ✅ Re-renders only when count changes\nconst count = useStore((s) => s.count);\n\\`\\`\\`\n\nSubscribing to the whole store is the single most common Zustand performance mistake.`,\n },\n {\n slug: \"zustand-devtools-wrap-dev-only\",\n type: \"convention\",\n tags: [\"zustand\", \"devtools\", \"performance\"],\n body: `Wrap Zustand devtools middleware in a dev-only condition.\n\n\\`\\`\\`ts\nimport { devtools } from 'zustand/middleware';\n\nconst useStore = create(\n process.env.NODE_ENV === 'development'\n ? devtools(storeImpl, { name: 'AppStore' })\n : storeImpl,\n);\n\\`\\`\\`\n\nShipping devtools to production adds overhead and exposes store internals in bundle.`,\n },\n {\n slug: \"zustand-persist-hydration-ssr\",\n type: \"gotcha\",\n tags: [\"zustand\", \"ssr\", \"nextjs\", \"hydration\"],\n body: `Zustand persist middleware causes hydration mismatch in SSR (Next.js / Remix).\n\nThe server renders with empty state; the client rehydrates from localStorage.\nFix: use \\`skipHydration: true\\` and manually call \\`rehydrate()\\` after mount.\n\n\\`\\`\\`ts\n// In a useEffect or useLayoutEffect on the client:\nuseEffect(() => { useStore.persist.rehydrate(); }, []);\n\\`\\`\\``,\n },\n ],\n\n redux: [\n {\n slug: \"redux-toolkit-immer-mutate-or-return\",\n type: \"gotcha\",\n tags: [\"redux\", \"redux-toolkit\", \"immer\"],\n body: `In RTK createSlice reducers (Immer), you must EITHER mutate the draft OR return a new value — never both.\n\n\\`\\`\\`ts\n// ✅ Mutate draft (Immer converts to immutable update)\nstate.count += 1;\n\n// ✅ Return new value\nreturn { ...state, count: state.count + 1 };\n\n// ❌ Both — causes undefined state\nstate.count += 1;\nreturn state; // DON'T — Immer sees both a mutation and a return\n\\`\\`\\``,\n },\n {\n slug: \"redux-toolkit-rtk-query-over-thunk\",\n type: \"decision\",\n tags: [\"redux\", \"redux-toolkit\", \"data-fetching\"],\n body: `Use RTK Query for server data, not createAsyncThunk.\n\nRTK Query automatically handles: caching, loading/error states, cache invalidation, polling, optimistic updates.\ncreateAsyncThunk is for one-off side effects that don't fit the query/mutation model (e.g. file upload with progress).`,\n },\n {\n slug: \"redux-toolkit-normalize-nested-data\",\n type: \"convention\",\n tags: [\"redux\", \"redux-toolkit\", \"normalization\"],\n body: `Normalize nested API responses before storing in Redux — use createEntityAdapter.\n\nStoring deeply nested objects causes:\n- Redundant re-renders when any deeply nested field changes\n- Difficult update logic (deep merge)\n\n\\`\\`\\`ts\nconst usersAdapter = createEntityAdapter<User>();\nconst usersSlice = createSlice({\n name: 'users',\n initialState: usersAdapter.getInitialState(),\n reducers: { usersReceived: usersAdapter.setAll },\n});\n\\`\\`\\``,\n },\n ],\n\n reactquery: [\n {\n slug: \"tanstack-query-stale-time-default\",\n type: \"gotcha\",\n tags: [\"react-query\", \"tanstack-query\", \"caching\"],\n body: `By default, TanStack Query marks data as stale immediately (staleTime: 0) and refetches on every window focus.\n\nSet a reasonable staleTime to avoid unnecessary network requests:\n\n\\`\\`\\`ts\nuseQuery({\n queryKey: ['user', id],\n queryFn: () => getUser(id),\n staleTime: 5 * 60 * 1000, // 5 minutes\n})\n\\`\\`\\`\n\nSet globally via QueryClient defaultOptions for consistency.`,\n },\n {\n slug: \"tanstack-query-invalidate-after-mutation\",\n type: \"convention\",\n tags: [\"react-query\", \"tanstack-query\", \"mutations\"],\n body: `Always invalidate related queries after a mutation to keep the cache fresh.\n\n\\`\\`\\`ts\nuseMutation({\n mutationFn: createUser,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['users'] }),\n})\n\\`\\`\\`\n\nSkipping invalidation causes the UI to show stale data after a write until the next background refetch.`,\n },\n {\n slug: \"tanstack-query-querykey-as-dependency\",\n type: \"convention\",\n tags: [\"react-query\", \"tanstack-query\"],\n body: `Treat the queryKey array as a dependency array — include all variables the queryFn depends on.\n\n\\`\\`\\`ts\n// ❌ Won't refetch when userId changes\nuseQuery({ queryKey: ['user'], queryFn: () => getUser(userId) });\n\n// ✅ Refetches automatically when userId changes\nuseQuery({ queryKey: ['user', userId], queryFn: () => getUser(userId) });\n\\`\\`\\``,\n },\n ],\n\n trpc: [\n {\n slug: \"trpc-always-validate-input-with-zod\",\n type: \"convention\",\n tags: [\"trpc\", \"validation\", \"security\"],\n body: `Always validate procedure inputs with Zod — tRPC infers types but doesn't enforce them at runtime without a schema.\n\n\\`\\`\\`ts\n// ❌ No runtime validation — input is 'unknown'\nt.procedure.query(({ input }) => getUser(input as string));\n\n// ✅ Validated and typed end-to-end\nt.procedure\n .input(z.object({ id: z.string().uuid() }))\n .query(({ input }) => getUser(input.id));\n\\`\\`\\``,\n },\n {\n slug: \"trpc-server-side-caller-for-ssr\",\n type: \"convention\",\n tags: [\"trpc\", \"nextjs\", \"ssr\"],\n body: `Use the server-side caller in Server Components / SSR — don't call tRPC over HTTP from the server.\n\n\\`\\`\\`ts\n// In Next.js App Router server component\nconst caller = appRouter.createCaller(await createContext());\nconst data = await caller.users.getAll(); // Direct function call, no HTTP\n\\`\\`\\`\n\nHTTP round-trips from server → server add latency and bypass auth context.`,\n },\n {\n slug: \"trpc-context-for-auth\",\n type: \"architecture\",\n tags: [\"trpc\", \"auth\"],\n body: `Put auth session on the tRPC context, not in individual procedures.\n\n\\`\\`\\`ts\n// createContext(): resolve session once, share across all procedures\nexport async function createContext({ req }: CreateNextContextOptions) {\n const session = await getServerSession(req);\n return { session, db };\n}\n\n// In procedure: ctx.session.user is always typed\nconst protectedProcedure = t.procedure.use(({ ctx, next }) => {\n if (!ctx.session?.user) throw new TRPCError({ code: 'UNAUTHORIZED' });\n return next({ ctx: { ...ctx, user: ctx.session.user } });\n});\n\\`\\`\\``,\n },\n ],\n\n mongoose: [\n {\n slug: \"mongoose-connection-singleton\",\n type: \"convention\",\n tags: [\"mongoose\", \"mongodb\", \"connection\", \"serverless\"],\n body: `Create one Mongoose connection at startup — never connect inside route handlers.\n\nIn serverless (Next.js, Vercel), cache the connection to reuse across warm invocations:\n\n\\`\\`\\`ts\nlet cached = (global as any).__mongoose ?? { conn: null, promise: null };\n\nexport async function dbConnect() {\n if (cached.conn) return cached.conn;\n if (!cached.promise) {\n cached.promise = mongoose.connect(process.env.MONGODB_URI!);\n }\n cached.conn = await cached.promise;\n (global as any).__mongoose = cached;\n return cached.conn;\n}\n\\`\\`\\``,\n },\n {\n slug: \"mongoose-lean-for-read-only\",\n type: \"convention\",\n tags: [\"mongoose\", \"performance\"],\n body: `Add .lean() to read-only queries to get plain JS objects instead of full Mongoose documents.\n\n\\`\\`\\`ts\n// ❌ Full Mongoose document — slow, heavy, has virtuals/methods\nconst users = await User.find({});\n\n// ✅ Plain JS object — 2-5x faster on large result sets\nconst users = await User.find({}).lean();\n\\`\\`\\`\n\nNever use .lean() when you need to call .save() or Mongoose instance methods.`,\n },\n {\n slug: \"mongoose-index-frequently-queried-fields\",\n type: \"gotcha\",\n tags: [\"mongoose\", \"mongodb\", \"performance\"],\n body: `Mongoose does NOT create indexes automatically unless you call syncIndexes() or ensureIndexes().\n\nDeclare indexes in the schema and sync them at startup:\n\n\\`\\`\\`ts\nUserSchema.index({ email: 1 }, { unique: true });\nUserSchema.index({ createdAt: -1 });\n\n// At startup (not per-request):\nawait User.syncIndexes();\n\\`\\`\\`\n\nMissing indexes cause full collection scans and timeouts at scale.`,\n },\n ],\n\n graphql: [\n {\n slug: \"graphql-n-plus-one-dataloader\",\n type: \"gotcha\",\n tags: [\"graphql\", \"performance\", \"n+1\"],\n body: `GraphQL resolvers cause N+1 database queries without DataLoader batching.\n\nEvery field resolver runs independently — fetching related data naively causes N queries for N items.\n\n\\`\\`\\`ts\n// In context, create one DataLoader per request (NOT per resolver call)\nconst userLoader = new DataLoader(async (ids: readonly string[]) =>\n User.findByIds(ids as string[])\n);\n\n// In resolver:\nauthor: (post) => userLoader.load(post.authorId),\n\\`\\`\\`\n\nA list of 100 posts with authors = 101 queries without DataLoader, 2 queries with it.`,\n },\n {\n slug: \"graphql-mask-internal-errors-in-production\",\n type: \"gotcha\",\n tags: [\"graphql\", \"security\", \"apollo\"],\n body: `Apollo Server exposes full error details (including stack traces) in development.\n\nIn production, mask internal errors to prevent leaking implementation details:\n\n\\`\\`\\`ts\nnew ApolloServer({\n formatError: (formattedError) => {\n if (formattedError.extensions?.code === 'INTERNAL_SERVER_ERROR') {\n return { message: 'Internal server error', extensions: { code: 'INTERNAL_SERVER_ERROR' } };\n }\n return formattedError;\n },\n});\n\\`\\`\\``,\n },\n {\n slug: \"graphql-depth-limit-and-complexity\",\n type: \"convention\",\n tags: [\"graphql\", \"security\", \"dos\"],\n body: `Add query depth and complexity limits to prevent DoS via deeply nested queries.\n\nWithout limits, a single query can request exponentially nested data and exhaust the server.\n\n\\`\\`\\`ts\nimport depthLimit from 'graphql-depth-limit';\nimport { createComplexityLimitRule } from 'graphql-validation-complexity';\n\nnew ApolloServer({\n validationRules: [\n depthLimit(7),\n createComplexityLimitRule(1000),\n ],\n});\n\\`\\`\\``,\n },\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 [\"zustand\", [\"zustand\"]],\n [\"redux\", [\"@reduxjs/toolkit\", \"redux\"]],\n [\"reactquery\", [\"@tanstack/react-query\", \"react-query\"]],\n [\"trpc\", [\"@trpc/server\", \"@trpc/client\"]],\n [\"mongoose\", [\"mongoose\"]],\n [\"graphql\", [\"@apollo/client\", \"@apollo/server\", \"apollo-server\", \"graphql\"]],\n ];\n for (const [stack, signals] of stackDetectors) {\n if (signals.some((s) => s in deps)) detected.push(stack);\n }\n // Deduplicate: avoid react when next/remix already detected\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\";\nimport {\n defaultClaudeSettingsPath,\n installClaudeHooksAtPath,\n uninstallClaudeHooksAtPath,\n} from \"../utils/claude-hooks.js\";\n\ninterface InstallHooksOptions {\n dir?: string;\n force?: boolean;\n scope?: \"user\" | \"project\";\n uninstall?: boolean;\n settings?: string;\n}\n\ntype Target = \"git\" | \"claude\";\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 the hAIve workflow policy gate. This is blocking by default:\n# initialized projects should not accept AI changes that bypass hAIve.\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_haive enforce check --stage pre-push --dir . || exit $?\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 name: \"pre-commit\",\n body: `#!/bin/sh\n${HOOK_MARKER} — keep this block to allow upgrades. Hand-edit anything outside it.\n\nif command -v haive >/dev/null 2>&1; then\n haive enforce check --stage pre-commit --dir . || exit $?\nelif [ -x ./node_modules/.bin/haive ]; then\n ./node_modules/.bin/haive enforce check --stage pre-commit --dir . || exit $?\nfi\n`,\n },\n];\n\nasync function installGitHooks(opts: InstallHooksOptions): Promise<void> {\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} git hook(s) in .git/hooks/${skipped ? `, skipped ${skipped}` : \"\"}`);\n ui.info(\"post-merge: haive sync runs after every pull/merge.\");\n ui.info(\"pre-commit: haive enforce check blocks unsafe staged changes.\");\n ui.info(\"pre-push: haive enforce check blocks pushes that bypass briefing/session recap policy.\");\n}\n\nasync function installClaudeHooks(opts: InstallHooksOptions): Promise<void> {\n const root = findProjectRoot(opts.dir);\n const scope = opts.scope ?? \"user\";\n const settingsPath = opts.settings ?? defaultClaudeSettingsPath(scope, root);\n\n if (opts.uninstall) {\n const result = await uninstallClaudeHooksAtPath(settingsPath);\n ui.success(`Removed hAIve hooks from ${result.settingsPath}`);\n return;\n }\n\n try {\n const result = await installClaudeHooksAtPath(settingsPath);\n if (result.created) {\n ui.success(`Created ${result.settingsPath} with hAIve enforcement hooks`);\n } else {\n ui.success(`Patched ${result.settingsPath} (existing user hooks preserved)`);\n }\n } catch (err) {\n ui.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n return;\n }\n\n ui.info(\"SessionStart hook: `haive enforce session-start` injects briefing context\");\n ui.info(\"PreToolUse hook: blocks Edit/Write/dangerous Bash until briefing is loaded\");\n ui.info(\"PostToolUse hook: `haive observe` captures Edit/Write/Bash activity\");\n ui.info(\"SessionEnd hook: `haive session end --auto --quiet` distills observations\");\n ui.info(\" into a session_recap memory at session close\");\n ui.info(\"Restart Claude Code (or open a new conversation) for the hooks to take effect.\");\n ui.info(`Run \\`haive install-hooks claude --uninstall\\` to remove.`);\n}\n\nexport function registerInstallHooks(program: Command): void {\n program\n .command(\"install-hooks [target]\")\n .description(\n \"Install hAIve hooks. Targets:\\n\\n\" +\n \" git (default) post-merge / post-rewrite / pre-push for haive sync + precommit\\n\" +\n \" claude SessionStart + PreToolUse + PostToolUse + SessionEnd hooks\\n\" +\n \" for briefing injection, pre-edit blocking, and capture (Claude Code only)\\n\\n\" +\n \" Examples:\\n\" +\n \" haive install-hooks # git hooks (legacy default)\\n\" +\n \" haive install-hooks git\\n\" +\n \" haive install-hooks claude\\n\" +\n \" haive install-hooks claude --scope project\\n\" +\n \" haive install-hooks claude --uninstall\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--force\", \"overwrite existing hooks (git target only)\")\n .option(\"--scope <scope>\", \"claude target: 'user' (~/.claude) or 'project' (.claude/)\", \"user\")\n .option(\"--uninstall\", \"remove previously installed hAIve hooks (claude target only)\")\n .option(\"--settings <path>\", \"explicit path to settings.json (claude target only)\")\n .action(async (target: string | undefined, opts: InstallHooksOptions) => {\n const t = (target ?? \"git\").toLowerCase() as Target | string;\n if (t === \"git\") {\n await installGitHooks(opts);\n } else if (t === \"claude\") {\n await installClaudeHooks(opts);\n } else {\n ui.error(`Unknown target: ${target}. Available: git, claude`);\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Patch a Claude Code settings.json file with hAIve enforcement hooks.\n *\n * Claude Code's hook format:\n * { \"hooks\": { \"PostToolUse\": [{ \"matcher\": \"...\", \"hooks\": [{ \"type\":\"command\", \"command\":\"...\" }] }] } }\n *\n * We add hAIve-marked entries so we can find and replace them on re-runs:\n * - SessionStart → `haive enforce session-start`\n * - PreToolUse → `haive enforce pre-tool-use` (matcher: Edit|Write|Bash)\n * - PostToolUse → `haive observe` (passive capture)\n * - SessionEnd → `haive session end --quiet --auto`\n *\n * Existing user-defined hooks are preserved untouched.\n */\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const HAIVE_HOOK_TAG = \"haive-enforcement\";\n\ninterface ClaudeHookEntry {\n type: \"command\";\n command: string;\n /** hAIve marker so we can identify our own entries on re-runs. */\n haive_tag?: string;\n}\n\ninterface ClaudeHookGroup {\n matcher?: string;\n hooks: ClaudeHookEntry[];\n}\n\ninterface ClaudeSettings {\n hooks?: Record<string, ClaudeHookGroup[]>;\n [key: string]: unknown;\n}\n\nconst POST_TOOL_USE_GROUP: ClaudeHookGroup = {\n matcher: \"Edit|Write|Bash\",\n hooks: [\n {\n type: \"command\",\n command: \"haive observe\",\n haive_tag: HAIVE_HOOK_TAG,\n },\n ],\n};\n\nconst PRE_TOOL_USE_GROUP: ClaudeHookGroup = {\n matcher: \"Edit|Write|MultiEdit|NotebookEdit|Bash\",\n hooks: [\n {\n type: \"command\",\n command: \"haive enforce pre-tool-use\",\n haive_tag: HAIVE_HOOK_TAG,\n },\n ],\n};\n\nconst SESSION_START_GROUP: ClaudeHookGroup = {\n hooks: [\n {\n type: \"command\",\n command: \"haive enforce session-start\",\n haive_tag: HAIVE_HOOK_TAG,\n },\n ],\n};\n\nconst SESSION_END_GROUP: ClaudeHookGroup = {\n hooks: [\n {\n type: \"command\",\n command: \"haive session end --quiet --auto\",\n haive_tag: HAIVE_HOOK_TAG,\n },\n ],\n};\n\nfunction dropHaiveGroups(groups: ClaudeHookGroup[]): ClaudeHookGroup[] {\n return groups.filter(\n (g) => !g.hooks.some((h) => h.haive_tag === HAIVE_HOOK_TAG),\n );\n}\n\nexport function patchClaudeSettings(input: ClaudeSettings | null): ClaudeSettings {\n const settings: ClaudeSettings = input ? { ...input } : {};\n const hooks = settings.hooks ? { ...settings.hooks } : {};\n hooks.SessionStart = [\n ...dropHaiveGroups(hooks.SessionStart ?? []),\n SESSION_START_GROUP,\n ];\n hooks.PreToolUse = [\n ...dropHaiveGroups(hooks.PreToolUse ?? []),\n PRE_TOOL_USE_GROUP,\n ];\n hooks.PostToolUse = [\n ...dropHaiveGroups(hooks.PostToolUse ?? []),\n POST_TOOL_USE_GROUP,\n ];\n hooks.SessionEnd = [\n ...dropHaiveGroups(hooks.SessionEnd ?? []),\n SESSION_END_GROUP,\n ];\n settings.hooks = hooks;\n return settings;\n}\n\nexport function unpatchClaudeSettings(input: ClaudeSettings | null): ClaudeSettings {\n const settings: ClaudeSettings = input ? { ...input } : {};\n if (!settings.hooks) return settings;\n const hooks = { ...settings.hooks };\n for (const [event, groups] of Object.entries(hooks)) {\n const cleaned = dropHaiveGroups(groups);\n if (cleaned.length === 0) {\n delete hooks[event];\n } else {\n hooks[event] = cleaned;\n }\n }\n settings.hooks = hooks;\n if (Object.keys(hooks).length === 0) delete settings.hooks;\n return settings;\n}\n\nexport interface ClaudeHooksInstallResult {\n settingsPath: string;\n created: boolean;\n}\n\nexport async function installClaudeHooksAtPath(\n settingsPath: string,\n): Promise<ClaudeHooksInstallResult> {\n let raw: ClaudeSettings | null = null;\n let created = false;\n if (existsSync(settingsPath)) {\n try {\n raw = JSON.parse(await readFile(settingsPath, \"utf8\")) as ClaudeSettings;\n } catch {\n throw new Error(`${settingsPath} exists but is not valid JSON. Fix it manually first.`);\n }\n } else {\n created = true;\n }\n const patched = patchClaudeSettings(raw);\n await mkdir(path.dirname(settingsPath), { recursive: true });\n await writeFile(settingsPath, JSON.stringify(patched, null, 2) + \"\\n\", \"utf8\");\n return { settingsPath, created };\n}\n\nexport async function uninstallClaudeHooksAtPath(\n settingsPath: string,\n): Promise<ClaudeHooksInstallResult> {\n if (!existsSync(settingsPath)) {\n return { settingsPath, created: false };\n }\n const raw = JSON.parse(await readFile(settingsPath, \"utf8\")) as ClaudeSettings;\n const cleaned = unpatchClaudeSettings(raw);\n await writeFile(settingsPath, JSON.stringify(cleaned, null, 2) + \"\\n\", \"utf8\");\n return { settingsPath, created: false };\n}\n\nexport function defaultClaudeSettingsPath(scope: \"user\" | \"project\", projectRoot: string): string {\n if (scope === \"user\") {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n return path.join(home, \".claude\", \"settings.json\");\n }\n return path.join(projectRoot, \".claude\", \"settings.local.json\");\n}\n","/**\n * `haive observe` — passive-capture endpoint for Claude Code's PostToolUse hook.\n *\n * Reads a single JSON payload on stdin (Claude Code's hook protocol) and appends\n * a compact observation record to `.ai/.cache/observations.jsonl`. The session-end\n * step later distills these records into proposed memories.\n *\n * Critical properties:\n * - exit 0 ALWAYS (a hook that errors interrupts the user's flow)\n * - bounded I/O (caps stdin read; no LLM call; no network)\n * - tolerant to missing .ai/ (silently no-op if haive isn't initialized here)\n */\nimport { appendFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { findProjectRoot, resolveHaivePaths } from \"@hiveai/core\";\n\nconst MAX_STDIN_BYTES = 256 * 1024; // 256 KB cap\nconst TRUNCATE_FIELD = 800;\n\ninterface HookPayload {\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_response?: Record<string, unknown> | string;\n cwd?: string;\n session_id?: string;\n}\n\ninterface Observation {\n ts: string;\n session_id?: string;\n cwd?: string;\n tool: string;\n summary: string;\n files?: string[];\n}\n\nfunction truncate(s: unknown, max = TRUNCATE_FIELD): string {\n if (s == null) return \"\";\n const str = typeof s === \"string\" ? s : JSON.stringify(s);\n return str.length > max ? str.slice(0, max) + \"…\" : str;\n}\n\nfunction extractFiles(payload: HookPayload): string[] {\n const files = new Set<string>();\n const input = payload.tool_input ?? {};\n for (const k of [\"file_path\", \"path\", \"notebook_path\"]) {\n const v = input[k];\n if (typeof v === \"string\") files.add(v);\n }\n // Bash tool: try to spot file-ish args\n const cmd = input[\"command\"];\n if (typeof cmd === \"string\") {\n const matches = cmd.match(/[\\w./-]+\\.(?:ts|tsx|js|jsx|py|go|rs|java|kt|swift|rb|php|cs|cpp|c|h|md|json|yml|yaml)\\b/g);\n if (matches) for (const m of matches) files.add(m);\n }\n return [...files].slice(0, 8);\n}\n\nfunction buildSummary(payload: HookPayload): string {\n const tool = payload.tool_name ?? \"?\";\n const input = payload.tool_input ?? {};\n if (tool === \"Bash\") return `Bash: ${truncate(input[\"command\"], 200)}`;\n if (tool === \"Edit\") return `Edit ${truncate(input[\"file_path\"], 200)}`;\n if (tool === \"Write\") return `Write ${truncate(input[\"file_path\"], 200)}`;\n return `${tool}: ${truncate(input, 200)}`;\n}\n\nasync function readStdin(maxBytes: number): Promise<string> {\n if (process.stdin.isTTY) return \"\";\n return await new Promise((resolve) => {\n const chunks: Buffer[] = [];\n let total = 0;\n let done = false;\n const finish = (): void => {\n if (done) return;\n done = true;\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n };\n process.stdin.on(\"data\", (c: Buffer) => {\n total += c.length;\n if (total > maxBytes) {\n process.stdin.destroy();\n finish();\n return;\n }\n chunks.push(c);\n });\n process.stdin.on(\"end\", finish);\n process.stdin.on(\"error\", finish);\n setTimeout(finish, 2000); // hard cap so a stuck hook never blocks Claude\n });\n}\n\nexport function registerObserve(program: Command): void {\n program\n .command(\"observe\")\n .description(\n \"Passive-capture endpoint for Claude Code PostToolUse hooks.\\n\\n\" +\n \" Reads a JSON payload on stdin and appends an observation record to\\n\" +\n \" .ai/.cache/observations.jsonl. Always exits 0; never blocks the agent.\\n\" +\n \" Wired up automatically by `haive install-hooks claude`.\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: { dir?: string }) => {\n try {\n const raw = await readStdin(MAX_STDIN_BYTES);\n if (!raw.trim()) return;\n\n let payload: HookPayload;\n try {\n payload = JSON.parse(raw) as HookPayload;\n } catch {\n return; // malformed payload — silently no-op\n }\n\n const root = (() => {\n try { return findProjectRoot(opts.dir ?? payload.cwd); } catch { return null; }\n })();\n if (!root) return;\n\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) return; // not a haive project\n\n const observation: Observation = {\n ts: new Date().toISOString(),\n session_id: payload.session_id,\n cwd: payload.cwd,\n tool: payload.tool_name ?? \"?\",\n summary: buildSummary(payload),\n files: extractFiles(payload),\n };\n\n const cacheDir = path.join(paths.haiveDir, \".cache\");\n await mkdir(cacheDir, { recursive: true });\n await appendFile(\n path.join(cacheDir, \"observations.jsonl\"),\n JSON.stringify(observation) + \"\\n\",\n \"utf8\",\n );\n } catch {\n // Hooks must never break the user's flow — swallow everything.\n }\n });\n}\n","import { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\nimport { runHaiveMcpStdio } from \"@hiveai/mcp\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface McpOptions {\n dir?: string;\n root?: string;\n /** Recognized so JSON configs may pass `[\\\"mcp\\\", \\\"--stdio\\\"]` — MCP always uses stdio. */\n stdio?: boolean;\n}\n\nexport function registerMcp(program: Command): void {\n program\n .command(\"mcp\")\n .description(\n \"Run the hAIve MCP server over stdio (bundled — same tools as legacy haive-mcp).\\n\\n\" +\n \" Configure via haive init (project-level), or manually:\\n\" +\n ' \\\"command\\\": \\\"haive\\\",\\n' +\n ' \\\"args\\\": [\\\"mcp\\\", \\\"--stdio\\\"],\\n' +\n \" optional env: HAIVE_PROJECT_ROOT (absolute project root).\\n\\n\" +\n \" Updating @hiveai/cli updates MCP; standalone haive-mcp is optional legacy.\",\n )\n .option(\"-d, --dir <dir>\", \"project root (walks up from here for .ai/ / .git/)\")\n .option(\"-r, --root <dir>\", \"same as --dir (parity with legacy haive-mcp --root)\")\n .option(\"--stdio\", \"optional marker for client configs — transport is always stdio\", false)\n .action(async (opts: McpOptions) => {\n void opts.stdio;\n const raw = opts.root ?? opts.dir;\n const root = raw ? findProjectRoot(raw) : findProjectRoot();\n try {\n await runHaiveMcpStdio({ root });\n } catch (err) {\n ui.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createContext, type CreateContextOptions, type HaiveContext } from \"./context.js\";\nimport {\n BootstrapProjectSaveInputSchema,\n bootstrapProjectSave,\n type BootstrapProjectSaveInput,\n} from \"./tools/bootstrap-project-save.js\";\nimport {\n GetProjectContextInputSchema,\n getProjectContext,\n type GetProjectContextInput,\n} from \"./tools/get-project-context.js\";\nimport { MemListInputSchema, memList, type MemListInput } from \"./tools/mem-list.js\";\nimport { MemSaveInputSchema, memSave, type MemSaveInput } from \"./tools/mem-save.js\";\nimport {\n MemSearchInputSchema,\n memSearch,\n type MemSearchInput,\n} from \"./tools/mem-search.js\";\nimport {\n MemVerifyInputSchema,\n memVerify,\n type MemVerifyInput,\n} from \"./tools/mem-verify.js\";\nimport {\n MemRejectInputSchema,\n memReject,\n type MemRejectInput,\n} from \"./tools/mem-reject.js\";\nimport {\n MemForFilesInputSchema,\n memForFiles,\n type MemForFilesInput,\n} from \"./tools/mem-for-files.js\";\nimport { MemGetInputSchema, memGet, type MemGetInput } from \"./tools/mem-get.js\";\nimport {\n MemDeleteInputSchema,\n memDelete,\n type MemDeleteInput,\n} from \"./tools/mem-delete.js\";\nimport {\n MemUpdateInputSchema,\n memUpdate,\n type MemUpdateInput,\n} from \"./tools/mem-update.js\";\nimport {\n MemPendingInputSchema,\n memPending,\n type MemPendingInput,\n} from \"./tools/mem-pending.js\";\nimport {\n MemApproveInputSchema,\n memApprove,\n type MemApproveInput,\n} from \"./tools/mem-approve.js\";\nimport {\n MemTriedInputSchema,\n memTried,\n type MemTriedInput,\n} from \"./tools/mem-tried.js\";\nimport {\n MemObserveInputSchema,\n memObserve,\n type MemObserveInput,\n} from \"./tools/mem-observe.js\";\nimport {\n MemSessionEndInputSchema,\n memSessionEnd,\n type MemSessionEndInput,\n} from \"./tools/mem-session-end.js\";\nimport {\n GetBriefingInputSchema,\n getBriefing,\n type GetBriefingInput,\n} from \"./tools/get-briefing.js\";\nimport {\n CodeMapInputSchema,\n codeMapTool,\n type CodeMapInput,\n} from \"./tools/code-map.js\";\nimport {\n MemDiffInputSchema,\n memDiff,\n type MemDiffInput,\n} from \"./tools/mem-diff.js\";\nimport {\n GetRecapInputSchema,\n getRecap,\n type GetRecapInput,\n} from \"./tools/get-recap.js\";\nimport {\n MemRelevantToInputSchema,\n memRelevantTo,\n type MemRelevantToInput,\n} from \"./tools/mem-relevant-to.js\";\nimport {\n CodeSearchInputSchema,\n codeSearch,\n type CodeSearchInput,\n} from \"./tools/code-search.js\";\nimport {\n WhyThisFileInputSchema,\n whyThisFile,\n type WhyThisFileInput,\n} from \"./tools/why-this-file.js\";\nimport {\n AntiPatternsCheckInputSchema,\n antiPatternsCheck,\n type AntiPatternsCheckInput,\n} from \"./tools/anti-patterns-check.js\";\nimport {\n MemDistillInputSchema,\n memDistill,\n type MemDistillInput,\n} from \"./tools/mem-distill.js\";\nimport {\n WhyThisDecisionInputSchema,\n whyThisDecision,\n type WhyThisDecisionInput,\n} from \"./tools/why-this-decision.js\";\nimport {\n MemConflictsInputSchema,\n memConflicts,\n type MemConflictsInput,\n} from \"./tools/mem-conflicts.js\";\nimport {\n PreCommitCheckInputSchema,\n preCommitCheck,\n type PreCommitCheckInput,\n} from \"./tools/precommit-check.js\";\nimport {\n PatternDetectInputSchema,\n patternDetect,\n type PatternDetectInput,\n} from \"./tools/pattern-detect.js\";\nimport {\n MemConflictCandidatesInputSchema,\n memConflictCandidates,\n type MemConflictCandidatesInput,\n} from \"./tools/mem-conflict-candidates.js\";\nimport {\n MemResolveProjectInputSchema,\n memResolveProject,\n type MemResolveProjectInput,\n} from \"./tools/mem-resolve-project.js\";\nimport {\n MemSuggestTopicInputSchema,\n memSuggestTopic,\n type MemSuggestTopicInput,\n} from \"./tools/mem-suggest-topic.js\";\nimport {\n MemTimelineInputSchema,\n memTimeline,\n type MemTimelineInput,\n} from \"./tools/mem-timeline.js\";\nimport {\n RuntimeJournalAppendInputSchema,\n runtimeJournalAppend,\n type RuntimeJournalAppendInput,\n} from \"./tools/runtime-journal-append.js\";\nimport {\n RuntimeJournalTailInputSchema,\n runtimeJournalTail,\n type RuntimeJournalTailInput,\n} from \"./tools/runtime-journal-tail.js\";\nimport {\n BootstrapProjectArgsSchema,\n bootstrapProjectPrompt,\n type BootstrapProjectArgs,\n} from \"./prompts/bootstrap-project.js\";\nimport {\n PostTaskArgsSchema,\n postTaskPrompt,\n type PostTaskArgs,\n} from \"./prompts/post-task.js\";\nimport {\n ImportDocsArgsSchema,\n importDocsPrompt,\n type ImportDocsArgs,\n} from \"./prompts/import-docs.js\";\nimport { SessionTracker } from \"./session-tracker.js\";\nimport { loadConfigSync } from \"@hiveai/core\";\n\n// Re-export tool implementations so `@hiveai/cli` (and integrators) can call\n// them programmatically without going through the MCP stdio transport.\n// These are the same handlers the MCP server registers below.\nexport {\n getBriefing,\n type GetBriefingInput,\n type BriefingOutput,\n} from \"./tools/get-briefing.js\";\nexport {\n codeMapTool,\n type CodeMapInput,\n type CodeMapToolOutput,\n} from \"./tools/code-map.js\";\nexport {\n getRecap,\n type GetRecapInput,\n type GetRecapOutput,\n} from \"./tools/get-recap.js\";\nexport {\n memRelevantTo,\n type MemRelevantToInput,\n type MemRelevantToOutput,\n} from \"./tools/mem-relevant-to.js\";\nexport {\n codeSearch,\n type CodeSearchInput,\n type CodeSearchOutput,\n} from \"./tools/code-search.js\";\nexport {\n whyThisFile,\n type WhyThisFileInput,\n type WhyThisFileOutput,\n} from \"./tools/why-this-file.js\";\nexport {\n antiPatternsCheck,\n type AntiPatternsCheckInput,\n type AntiPatternsCheckOutput,\n} from \"./tools/anti-patterns-check.js\";\nexport {\n memDistill,\n type MemDistillInput,\n type MemDistillOutput,\n} from \"./tools/mem-distill.js\";\nexport {\n whyThisDecision,\n type WhyThisDecisionInput,\n type WhyThisDecisionOutput,\n} from \"./tools/why-this-decision.js\";\nexport {\n memConflicts,\n type MemConflictsInput,\n type MemConflictsOutput,\n} from \"./tools/mem-conflicts.js\";\nexport {\n preCommitCheck,\n type PreCommitCheckInput,\n type PreCommitCheckOutput,\n} from \"./tools/precommit-check.js\";\nexport {\n patternDetect,\n type PatternDetectInput,\n type PatternDetectOutput,\n} from \"./tools/pattern-detect.js\";\nexport {\n memResolveProject,\n type MemResolveProjectInput,\n} from \"./tools/mem-resolve-project.js\";\nexport {\n memSuggestTopic,\n type MemSuggestTopicInput,\n} from \"./tools/mem-suggest-topic.js\";\nexport {\n memTimeline,\n type MemTimelineInput,\n} from \"./tools/mem-timeline.js\";\nexport {\n memConflictCandidates,\n type MemConflictCandidatesInput,\n} from \"./tools/mem-conflict-candidates.js\";\nexport {\n runtimeJournalAppend,\n type RuntimeJournalAppendInput,\n} from \"./tools/runtime-journal-append.js\";\nexport {\n runtimeJournalTail,\n type RuntimeJournalTailInput,\n} from \"./tools/runtime-journal-tail.js\";\n\ndeclare const __HAIVE_VERSION__: string;\n\nexport const SERVER_NAME = \"haive\";\nexport const SERVER_VERSION = __HAIVE_VERSION__;\n\nfunction jsonResult(data: unknown) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n}\n\nconst ENFORCEMENT_PROFILE_TOOLS = new Set([\n \"get_briefing\",\n \"mem_save\",\n \"mem_search\",\n \"mem_verify\",\n \"mem_relevant_to\",\n \"pre_commit_check\",\n \"mem_session_end\",\n]);\n\nconst BRIEFING_TOOLS = new Set([\"get_briefing\", \"mem_relevant_to\"]);\n\nconst MUTATING_TOOLS = new Set([\n \"mem_save\",\n \"mem_tried\",\n \"mem_observe\",\n \"mem_session_end\",\n \"bootstrap_project_save\",\n \"mem_update\",\n \"mem_approve\",\n \"mem_reject\",\n \"mem_delete\",\n \"runtime_journal_append\",\n \"pattern_detect\",\n]);\n\nexport function createHaiveServer(\n options: CreateContextOptions = {},\n): { server: McpServer; context: HaiveContext; tracker: SessionTracker } {\n const context = createContext(options);\n const config = loadConfigSync(context.paths);\n const toolProfile =\n (options.env?.HAIVE_TOOL_PROFILE as \"enforcement\" | \"full\" | undefined) ??\n config.enforcement?.toolProfile ??\n \"enforcement\";\n const requireBriefingFirst =\n options.env?.HAIVE_REQUIRE_BRIEFING_FIRST === \"0\"\n ? false\n : config.enforcement?.requireBriefingFirst ?? true;\n let briefingLoaded = false;\n const tracker = new SessionTracker(context);\n // Init is async — fire-and-forget at startup (registers shutdown handler if autopilot)\n void tracker.init();\n\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, prompts: {} } },\n );\n\n const shouldRegisterTool = (name: string): boolean =>\n toolProfile === \"full\" || ENFORCEMENT_PROFILE_TOOLS.has(name);\n\n const registerTool = <TInput>(\n name: string,\n description: string,\n schema: Record<string, unknown>,\n handler: (input: TInput) => Promise<unknown> | unknown,\n ): void => {\n if (!shouldRegisterTool(name)) return;\n const tool = server.tool.bind(server) as (\n toolName: string,\n toolDescription: string,\n toolSchema: Record<string, unknown>,\n toolHandler: (input: unknown) => Promise<unknown> | unknown,\n ) => unknown;\n tool(\n name,\n description,\n schema,\n async (input: unknown) => {\n if (BRIEFING_TOOLS.has(name)) {\n briefingLoaded = true;\n return await handler(input as TInput);\n }\n if (requireBriefingFirst && MUTATING_TOOLS.has(name) && !briefingLoaded) {\n return jsonResult({\n error: \"haive_briefing_required\",\n message:\n \"This hAIve project requires get_briefing or mem_relevant_to before state-changing hAIve tools. Call get_briefing({ task: '...' }) first.\",\n tool: name,\n });\n }\n return await handler(input as TInput);\n },\n );\n };\n\n const shouldRegisterPrompt = (name: string): boolean =>\n toolProfile === \"full\" || name === \"bootstrap_project\" || name === \"post_task\";\n\n // ── Memory creation ────────────────────────────────────────────────────\n\n registerTool(\n \"mem_save\",\n [\n \"Save a piece of knowledge as a persistent memory that survives across AI sessions.\",\n \"\",\n \"USE THIS WHEN you discover something worth remembering for future sessions:\",\n \" - A project convention (how things are done here)\",\n \" - An architectural decision and its rationale\",\n \" - A gotcha or non-obvious behavior that surprised you\",\n \" - A domain term and what it means in this codebase\",\n \"\",\n \"DO NOT USE for failed approaches → use mem_tried instead (better structure).\",\n \"DO NOT USE for code discoveries during exploration → use mem_observe instead.\",\n \"\",\n \"PARAMETERS:\",\n \" type — convention | decision | gotcha | architecture | glossary | attempt\",\n \" slug — short kebab-case id (e.g. 'flyway-no-modify-existing')\",\n \" body — Markdown content with the full knowledge\",\n \" scope — team (shared with all devs) | personal (private) | module (component-scoped)\",\n \" paths — anchor to source files for staleness detection (STRONGLY recommended)\",\n \" topic — stable key for upsert: if a memory with same topic+scope exists, update it in-place\",\n \"\",\n \"RETURNS: { id, scope, file_path, action: 'created'|'updated', warning?, invalid_paths? }\",\n \"WARNING: if paths point to non-existent files, they will be immediately stale after haive sync.\",\n \"DEDUP: identical body content within the same scope is rejected — use mem_update to modify.\",\n ].join(\"\\n\"),\n MemSaveInputSchema,\n async (input: MemSaveInput) => {\n tracker.record(\"mem_save\", input.slug);\n return jsonResult(await memSave(input, context));\n },\n );\n\n registerTool(\n \"mem_suggest_topic\",\n [\n \"Propose a stable `topic` key (topic-upsert) from type + short title.\",\n \"\",\n \"USE BEFORE mem_save when you want deterministic updates to the same memory over time;\",\n \"families mimic Engram-style grouping (architecture/*, bug/*, decision/*, …).\",\n \"\",\n \"PARAMETERS:\",\n \" type — convention | decision | gotcha | architecture | glossary | attempt | session_recap\",\n \" title — phrase to slugify under the suggested family prefix\",\n \"\",\n \"RETURNS: { topic_key, family, type }\",\n ].join(\"\\n\"),\n MemSuggestTopicInputSchema,\n async (input: MemSuggestTopicInput) =>\n jsonResult(await memSuggestTopic(input, context)),\n );\n\n registerTool(\n \"mem_tried\",\n [\n \"Record a FAILED approach so future agents don't repeat the same mistake.\",\n \"\",\n \"USE THIS IMMEDIATELY when you try something and it doesn't work. This is the\",\n \"most valuable type of negative knowledge — it saves hours of debugging for\",\n \"future agents working on the same codebase.\",\n \"\",\n \"Auto-validated (no approval cycle). Surfaced FIRST in future get_briefing calls\",\n \"so it's impossible to miss.\",\n \"\",\n \"PARAMETERS:\",\n \" what — short title of what you tried (e.g. 'importing X with ESM dynamic import')\",\n \" why_failed — the exact error or reason it failed\",\n \" instead — what to do instead (the correct approach)\",\n \" scope — team (default) | personal\",\n \" paths — source files where the issue lives\",\n \"\",\n \"RETURNS: { id, file_path, action: 'created' }\",\n ].join(\"\\n\"),\n MemTriedInputSchema,\n async (input: MemTriedInput) => {\n tracker.record(\"mem_tried\", input.what.slice(0, 80));\n return jsonResult(await memTried(input, context));\n },\n );\n\n registerTool(\n \"mem_observe\",\n [\n \"Capture a code-level discovery made WHILE READING existing code.\",\n \"\",\n \"USE THIS when you read a file and spot something the team may not know about:\",\n \" - A bug or race condition hiding in the code\",\n \" - A security gap or missing validation\",\n \" - An inconsistency between two files\",\n \" - A missing configuration or environment variable\",\n \" - Anything that could silently break in production\",\n \"\",\n \"DIFFERENCE from mem_save: mem_observe is for REACTIVE discoveries during code\",\n \"reading. mem_save is for deliberate knowledge capture (conventions, decisions).\",\n \"\",\n \"Auto-validated, anchored to file paths for staleness detection.\",\n \"\",\n \"PARAMETERS:\",\n \" what — one-line title (e.g. 'MobilePaymentController: duplicate @RequestBody')\",\n \" where — file path(s) where the issue lives\",\n \" impact — what breaks or could break because of this\",\n \" fix — suggested fix (optional)\",\n \" scope — team (default, since discoveries benefit everyone)\",\n \"\",\n \"RETURNS: { id, file_path }\",\n ].join(\"\\n\"),\n MemObserveInputSchema,\n async (input: MemObserveInput) => {\n tracker.record(\"mem_observe\", input.where);\n return jsonResult(await memObserve(input, context));\n },\n );\n\n registerTool(\n \"mem_session_end\",\n [\n \"Save an end-of-session recap so the NEXT session starts with fresh context.\",\n \"\",\n \"CALL THIS before closing any significant working session. In autopilot mode,\",\n \"the MCP server saves a minimal recap automatically on exit — but calling this\",\n \"manually produces a richer, more useful recap.\",\n \"\",\n \"HOW IT WORKS: uses topic-upsert — one recap per scope is kept and updated\",\n \"in-place (revision_count increments). get_briefing surfaces the latest recap\",\n \"at the very top of the next session's briefing, before project context.\",\n \"\",\n \"PARAMETERS:\",\n \" goal — what you were trying to accomplish (1–2 sentences)\",\n \" accomplished — what was actually done (bullet list recommended)\",\n \" discoveries — bugs, surprises, missing knowledge found during this session\",\n \" files_touched — key files read or modified (used as anchor for staleness)\",\n \" next_steps — what should happen in the next session or for a teammate\",\n \" scope — personal (default) | team\",\n \"\",\n \"RETURNS: { id, scope, action: 'created'|'updated', revision_count }\",\n ].join(\"\\n\"),\n MemSessionEndInputSchema,\n async (input: MemSessionEndInput) => {\n tracker.record(\"mem_session_end\", input.goal.slice(0, 80));\n return jsonResult(await memSessionEnd(input, context));\n },\n );\n\n // ── Memory retrieval ───────────────────────────────────────────────────\n\n registerTool(\n \"get_briefing\",\n [\n \"⭐ DEFAULT-FIRST for coding agents on any repo where `haive init` ran: call this BEFORE\",\n \"changing source or project config for the current goal (unless the developer explicitly opts out).\",\n \"One-shot onboarding: everything relevant in a single call under a token budget.\",\n \"\",\n \"PROGRESSIVE DISCLOSURE — after this, drill down only if needed:\",\n \" mem_relevant_to / mem_search (compact lists) → mem_get (full body + anchors).\",\n \"\",\n \"RETURNS (in order of priority):\",\n \" 0. action_required — ⚠️ HANDLE THIS FIRST if non-empty (see protocol below)\",\n \" 1. last_session — recap of the previous session (goal, what was done, next steps)\",\n \" 2. project_context — .ai/project-context.md (auto-generated from code-map if template)\",\n \" 3. module_contexts — relevant .ai/modules/<name>/context.md based on files being edited\",\n \" 4. memories — ranked team memories relevant to your task\",\n \" 5. symbol_locations — file:line:kind for any requested symbols (no grep needed)\",\n \" 6. setup_warnings — actionable warnings if setup is incomplete\",\n \" 7. decay_warnings — memories not read in >90 days (consider reviewing)\",\n \"\",\n \"⚠️ ACTION_REQUIRED PROTOCOL — MANDATORY:\",\n \" If action_required[] is non-empty, STOP and for each item:\",\n \" 1. Show the developer the exact developer_message field verbatim\",\n \" 2. Wait for explicit human confirmation ('yes', 'go ahead', 'oui', etc.)\",\n \" 3. Only then proceed with any code changes\",\n \" NEVER act autonomously on cross-repo breaking changes, dep bumps, or contract diffs.\",\n \"\",\n \"KEY PARAMETERS:\",\n \" task — what you are about to do (1–2 sentences) — ALWAYS provide this\",\n \" files — files you are about to edit — surfaces anchored memories\",\n \" symbols — symbol names to look up in the code-map (e.g. ['PaymentService'])\",\n \" format — 'full' (default) | 'compact' (1-line) | 'actions' (bullet-first excerpts)\",\n \" budget_preset — 'quick' | 'balanced' | 'deep' — scales max_tokens/memories/module contexts\",\n \"\",\n \"EXAMPLE USAGE:\",\n \" get_briefing({ task: 'add a Stripe payment integration', files: ['src/payments/'], symbols: ['PaymentService'] })\",\n \"\",\n \"CONFIDENCE LEVELS in memories:\",\n \" authoritative — validated + read 10+ times (highest trust)\",\n \" trusted — validated or proposed + read 3+ times\",\n \" low — proposed, few reads (take with caution)\",\n \" unverified — draft (unverified: true flag set)\",\n \"\",\n \"Replaces 4–5 separate tool calls. Prefer this first; use mem_search / mem_get only for follow-up.\",\n ].join(\"\\n\"),\n GetBriefingInputSchema,\n async (input: GetBriefingInput) => {\n tracker.record(\"get_briefing\", input.task ?? \"\");\n return jsonResult(await getBriefing(input, context));\n },\n );\n\n registerTool(\n \"mem_search\",\n [\n \"Search memories by keyword or semantic similarity.\",\n \"\",\n \"USE WHEN you need to find a specific memory and don't know its id.\",\n \"For session onboarding, use get_briefing instead (richer, ranked, budgeted).\",\n \"\",\n \"SEARCH MODES:\",\n \" Literal (default): AND search across id, tags, and body — all tokens must match.\",\n \" Falls back to OR automatically if no AND results (partial match).\",\n \" Lexical rank (lexical_rank: true, semantic: false): Okapi-BM25-style scoring on the\",\n \" filtered corpus — good for phrase-like queries without embeddings.\",\n \" Semantic (semantic: true): embedding-based similarity — finds related memories\",\n \" even with different wording. Requires haive embeddings index to be built.\",\n \"\",\n \"PARAMETERS:\",\n \" query — search terms or natural language question\",\n \" scope — filter by personal | team | module\",\n \" type — filter by convention | decision | gotcha | architecture | glossary\",\n \" semantic — true for embedding-based search (requires @hiveai/embeddings)\",\n \" lexical_rank — BM25-style ranking (ignored when semantic is true)\",\n \" limit — max results (default 10)\",\n \"\",\n \"RETURNS: array of { id, type, scope, status, confidence, body, match_quality }\",\n ].join(\"\\n\"),\n MemSearchInputSchema,\n async (input: MemSearchInput) => {\n tracker.record(\"mem_search\", input.query.slice(0, 80));\n return jsonResult(await memSearch(input, context));\n },\n );\n\n registerTool(\n \"mem_timeline\",\n [\n \"Chronological view of related memories: by shared frontmatter.topic OR expanded from a seed id\",\n \"(related_ids, same topic, overlapping anchor paths — one extra hop on related_ids).\",\n \"\",\n \"PARAMETERS:\",\n \" memory_id — optional seed memory id\",\n \" topic — optional topic key (required if memory_id omitted)\",\n \" limit — max entries (default 30)\",\n \"\",\n \"RETURNS: { entries: [{ id, type, scope, created_at, one_line, topic? }], total, notice? }\",\n ].join(\"\\n\"),\n MemTimelineInputSchema,\n async (input: MemTimelineInput) => jsonResult(await memTimeline(input, context)),\n );\n\n registerTool(\n \"mem_for_files\",\n [\n \"Surface memories relevant to the files you are currently editing.\",\n \"\",\n \"USE WHEN starting work on specific files and you want to know:\",\n \" - What conventions apply to these files\",\n \" - What gotchas are anchored to these paths\",\n \" - What decisions were made about this module\",\n \"\",\n \"Matching strategy (in priority order):\",\n \" 1. Anchor overlap — memories whose paths overlap with your files\",\n \" 2. Module context — .ai/modules/<name>/context.md if module is inferred\",\n \" 3. Domain/tag match — memories whose tags include path segments\",\n \"\",\n \"PARAMETERS:\",\n \" files — list of project-relative file paths you are editing\",\n \" scope — filter by scope (default: all)\",\n \"\",\n \"RETURNS: { memories: [...], module_contexts: [...] }\",\n ].join(\"\\n\"),\n MemForFilesInputSchema,\n async (input: MemForFilesInput) => jsonResult(await memForFiles(input, context)),\n );\n\n registerTool(\n \"mem_get\",\n [\n \"Fetch a single memory by its full id with all details.\",\n \"\",\n \"USE WHEN get_briefing / mem_relevant_to / mem_search returned a compact hit and you need\",\n \"the full body, or when you know the exact id of a memory.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id (e.g. '2026-04-28-gotcha-flyway-strict-no-ddl')\",\n \"\",\n \"RETURNS: { id, type, scope, status, confidence, body, anchor, tags, usage }\",\n ].join(\"\\n\"),\n MemGetInputSchema,\n async (input: MemGetInput) => jsonResult(await memGet(input, context)),\n );\n\n registerTool(\n \"mem_list\",\n [\n \"List memories with optional filters. Use for browsing, not for task onboarding.\",\n \"\",\n \"For task onboarding use get_briefing (ranked + budgeted).\",\n \"For keyword search use mem_search.\",\n \"\",\n \"PARAMETERS:\",\n \" scope — personal | team | module\",\n \" type — convention | decision | gotcha | architecture | glossary\",\n \" status — draft | proposed | validated | stale | rejected\",\n \" tags — filter by tags (AND match)\",\n \" module — filter by module name\",\n \"\",\n \"RETURNS: array of { id, type, scope, status, confidence, tags, created_at }\",\n ].join(\"\\n\"),\n MemListInputSchema,\n async (input: MemListInput) => jsonResult(await memList(input, context)),\n );\n\n // ── Project context ────────────────────────────────────────────────────\n\n registerTool(\n \"get_project_context\",\n [\n \"Read .ai/project-context.md (and optionally a module context) directly.\",\n \"\",\n \"USE WHEN you need the full project context without the memory ranking and\",\n \"token budgeting of get_briefing — e.g. for a reference architecture review.\",\n \"\",\n \"For normal task onboarding, use get_briefing instead (more efficient).\",\n \"\",\n \"PARAMETERS:\",\n \" module — also load .ai/modules/<module>/context.md if provided\",\n \"\",\n \"RETURNS: { content: string, module_context?: string }\",\n ].join(\"\\n\"),\n GetProjectContextInputSchema,\n async (input: GetProjectContextInput) =>\n jsonResult(await getProjectContext(input, context)),\n );\n\n registerTool(\n \"bootstrap_project_save\",\n [\n \"Persist the project context document (.ai/project-context.md) or a module\",\n \"context (.ai/modules/<name>/context.md) analyzed by the AI.\",\n \"\",\n \"USE AFTER the bootstrap_project MCP prompt: the prompt tells you how to\",\n \"analyze the codebase; this tool saves the result.\",\n \"\",\n \"PARAMETERS:\",\n \" content — full Markdown content of the context document\",\n \" module — if provided, saves as a module context (not root project context)\",\n \"\",\n \"RETURNS: { file_path, module? }\",\n ].join(\"\\n\"),\n BootstrapProjectSaveInputSchema,\n async (input: BootstrapProjectSaveInput) =>\n jsonResult(await bootstrapProjectSave(input, context)),\n );\n\n registerTool(\n \"code_map\",\n [\n \"Look up where symbols (classes, functions, interfaces) are defined in the codebase.\",\n \"\",\n \"USE INSTEAD OF grepping when you need to find where something lives.\",\n \"Requires haive index code to have been run (done automatically in autopilot mode).\",\n \"\",\n \"TIP: include symbols in get_briefing directly for auto-lookup at session start.\",\n \"\",\n \"PARAMETERS:\",\n \" symbol — name or partial name to search (e.g. 'PaymentService')\",\n \" file — filter by file path substring\",\n \" max_files — cap on results (default 40)\",\n \"\",\n \"RETURNS: { available: bool, files: [{ path, exports: [{ name, kind, line, description }] }] }\",\n \"If available: false → run haive index code first.\",\n ].join(\"\\n\"),\n CodeMapInputSchema,\n async (input: CodeMapInput) => jsonResult(await codeMapTool(input, context)),\n );\n\n registerTool(\n \"mem_resolve_project\",\n [\n \"Diagnostics: resolve which project root hAIve is using (never throws).\",\n \"\",\n \"USE IN multi-root workspaces or when the agent CWD may not be the repo root —\",\n \"mirrors HAIVE_PROJECT_ROOT, findProjectRoot markers, and presence of .ai/memories.\",\n \"\",\n \"PARAMETERS:\",\n \" cwd — optional directory used for discovery when HAIVE_PROJECT_ROOT is unset\",\n \"\",\n \"RETURNS: { ok: true, info: { cwd, resolved_root, haive_project_root_env, … } }\",\n ].join(\"\\n\"),\n MemResolveProjectInputSchema,\n async (input: MemResolveProjectInput) =>\n jsonResult(await memResolveProject(input, context)),\n );\n\n // ── Memory lifecycle ───────────────────────────────────────────────────\n\n registerTool(\n \"mem_update\",\n [\n \"Update the body, tags, or anchor of an existing memory in-place.\",\n \"\",\n \"USE WHEN a memory exists but its content has become outdated or incomplete.\",\n \"This preserves the memory's id, usage history, and read_count.\",\n \"\",\n \"For evolving memories that you will update repeatedly, use mem_save with a\",\n \"topic key instead (topic-upsert pattern).\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to update\",\n \" body — new Markdown content (replaces existing body)\",\n \" tags — new tag list (replaces existing tags)\",\n \" paths — new anchor paths (replaces existing paths)\",\n \" symbols — new anchor symbols (replaces existing symbols)\",\n \"\",\n \"RETURNS: { id, file_path, updated_fields: string[] }\",\n ].join(\"\\n\"),\n MemUpdateInputSchema,\n async (input: MemUpdateInput) => jsonResult(await memUpdate(input, context)),\n );\n\n registerTool(\n \"mem_verify\",\n [\n \"Check whether memory anchor paths and symbols still exist in the current code.\",\n \"\",\n \"USE WHEN you want to know if a specific memory is still valid after a refactor,\",\n \"or to check all memories for staleness (haive sync does this automatically).\",\n \"\",\n \"PARAMETERS:\",\n \" id — check a single memory (omit to check all)\",\n \" update — write 'stale' or 'validated' status back to disk\",\n \"\",\n \"RETURNS: { results: [{ id, status: 'fresh'|'stale'|'anchorless', reason? }] }\",\n \"Stale means the anchored file/symbol no longer exists at that path.\",\n \"Anchorless means the memory has no paths/symbols — staleness is undetectable.\",\n ].join(\"\\n\"),\n MemVerifyInputSchema,\n async (input: MemVerifyInput) => jsonResult(await memVerify(input, context)),\n );\n\n registerTool(\n \"mem_approve\",\n [\n \"Mark a memory as validated (trusted, approved by a human or the team).\",\n \"\",\n \"In autopilot mode, memories are validated automatically — you rarely need this.\",\n \"In manual mode, call this after reviewing a proposed memory to activate it.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to approve\",\n \"\",\n \"RETURNS: { id, previous_status, new_status: 'validated' }\",\n ].join(\"\\n\"),\n MemApproveInputSchema,\n async (input: MemApproveInput) => jsonResult(await memApprove(input, context)),\n );\n\n registerTool(\n \"mem_reject\",\n [\n \"Mark a memory as rejected and record a reason.\",\n \"\",\n \"USE WHEN a memory is factually wrong, outdated, or not useful.\",\n \"Rejection blocks auto-promotion and lowers the memory's trust signal.\",\n \"Rejected memories are excluded from get_briefing by default.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to reject\",\n \" reason — why this memory is being rejected (stored in frontmatter)\",\n \"\",\n \"RETURNS: { id, previous_status, new_status: 'rejected' }\",\n ].join(\"\\n\"),\n MemRejectInputSchema,\n async (input: MemRejectInput) => jsonResult(await memReject(input, context)),\n );\n\n registerTool(\n \"mem_pending\",\n [\n \"List memories in 'proposed' status awaiting review, sorted by read count.\",\n \"\",\n \"USE IN MANUAL MODE to see what memories are waiting for human review.\",\n \"In autopilot mode, proposed memories auto-approve after 72h.\",\n \"\",\n \"High read_count on a proposed memory = many agents found it useful without\",\n \"rejecting it = strong signal to approve.\",\n \"\",\n \"RETURNS: array of { id, type, scope, read_count, created_at, body_preview }\",\n ].join(\"\\n\"),\n MemPendingInputSchema,\n async (input: MemPendingInput) => jsonResult(await memPending(input, context)),\n );\n\n registerTool(\n \"mem_delete\",\n [\n \"Permanently delete a memory by id.\",\n \"\",\n \"USE WITH CAUTION — prefer mem_reject for outdated memories (preserves history).\",\n \"Use delete only for accidentally created memories or duplicates.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to delete\",\n \" delete_usage — also delete usage stats (default: true)\",\n \"\",\n \"RETURNS: { deleted: true, id }\",\n ].join(\"\\n\"),\n MemDeleteInputSchema,\n async (input: MemDeleteInput) => jsonResult(await memDelete(input, context)),\n );\n\n // ── v0.5.0: granular alternatives to get_briefing ─────────────────────\n // Use these when you don't need the full one-shot briefing payload.\n\n registerTool(\n \"get_recap\",\n [\n \"Return ONLY the most recent session_recap. Cheaper than get_briefing when\",\n \"you just want to know 'what was I doing last time?' and don't need project\",\n \"context, modules, or memory ranking.\",\n \"\",\n \"PARAMETERS:\",\n \" scope — 'personal' | 'team' | 'any' (default 'any', returns the most recent across both)\",\n \"\",\n \"RETURNS: { recap: { id, scope, revision_count, created_at, body } | null, notice? }\",\n ].join(\"\\n\"),\n GetRecapInputSchema,\n async (input: GetRecapInput) => {\n tracker.record(\"get_recap\", input.scope);\n return jsonResult(await getRecap(input, context));\n },\n );\n\n registerTool(\n \"mem_relevant_to\",\n [\n \"One-shot ranked memories for a task — use instead of get_briefing when\",\n \"project context is already loaded and you only want the relevant memory layer.\",\n \"\",\n \"Second step in progressive disclosure (after get_briefing): narrow here, then mem_get for full text.\",\n \"\",\n \"Reuses the same ranking pipeline (anchor / module / literal / semantic) but\",\n \"skips project_context, modules, action_required, etc.\",\n \"\",\n \"PARAMETERS:\",\n \" task — 1–2 sentences describing what you are about to do (required)\",\n \" files — files you'll edit (surfaces anchored memories)\",\n \" limit — cap on returned memories (default 8)\",\n \" min_semantic_score — drop weak semantic hits below this cosine (default 0.25)\",\n \" format — 'full' | 'compact' | 'actions' (inherits get_briefing memory framing)\",\n \"\",\n \"RETURNS: { task, search_mode, memories: [...], hints?: [...], empty?: true }\",\n ].join(\"\\n\"),\n MemRelevantToInputSchema,\n async (input: MemRelevantToInput) => {\n tracker.record(\"mem_relevant_to\", input.task.slice(0, 80));\n return jsonResult(await memRelevantTo(input, context));\n },\n );\n\n // ── v0.5.0: code semantic search ──────────────────────────────────────\n\n registerTool(\n \"code_search\",\n [\n \"Semantic search over the codebase — finds exported symbols (functions, classes,\",\n \"interfaces) related to a natural-language query. Replaces blind grep when you\",\n \"don't know the exact symbol name.\",\n \"\",\n \"Requires `haive index code-search` to have been run (builds embeddings for every\",\n \"exported symbol from the code-map). Falls back to a notice when index is missing.\",\n \"\",\n \"PARAMETERS:\",\n \" query — natural language (e.g. 'function that hashes passwords', 'JWT signing')\",\n \" k — number of top hits (default 5)\",\n \" min_score — minimum cosine similarity (default 0.2; try 0.3+ for stricter)\",\n \"\",\n \"RETURNS: { available: bool, hits: [{ file, name, kind, line, description?, score }] }\",\n ].join(\"\\n\"),\n CodeSearchInputSchema,\n async (input: CodeSearchInput) => {\n tracker.record(\"code_search\", input.query.slice(0, 80));\n return jsonResult(await codeSearch(input, context));\n },\n );\n\n // ── v0.5.0: file-context lookup ───────────────────────────────────────\n\n registerTool(\n \"why_this_file\",\n [\n \"One-shot file-context lookup: combines recent git history, memories anchored\",\n \"to the path, and the code-map entry. Answers 'why is this file the way it is?'\",\n \"in a single call instead of 3-4 manual ones.\",\n \"\",\n \"PARAMETERS:\",\n \" path — project-relative path (required)\",\n \" git_log_limit — recent commits to include (default 5)\",\n \" memory_limit — anchored memories cap (default 5)\",\n \"\",\n \"RETURNS: { file, exists, recent_commits: [...], memories: [...], code_map_entry, hints? }\",\n ].join(\"\\n\"),\n WhyThisFileInputSchema,\n async (input: WhyThisFileInput) => {\n tracker.record(\"why_this_file\", input.path);\n return jsonResult(await whyThisFile(input, context));\n },\n );\n\n // ── v0.5.0: anti-patterns check ───────────────────────────────────────\n\n registerTool(\n \"anti_patterns_check\",\n [\n \"Scan a diff (or set of paths) against documented attempt/gotcha memories.\",\n \"Surfaces 'you are about to repeat a known mistake' warnings BEFORE you commit.\",\n \"\",\n \"USE BEFORE finalizing a non-trivial change. Cheap and high-signal: the only\",\n \"memories scanned are 'attempt' and 'gotcha' types.\",\n \"\",\n \"PARAMETERS:\",\n \" diff — raw unified diff text (or any code snippet) — optional if `paths` provided\",\n \" paths — affected file paths (optional if `diff` provided)\",\n \" limit — cap on returned warnings (default 8)\",\n \" semantic — also use semantic search (default true; requires embeddings index)\",\n \"\",\n \"RETURNS: { scanned, warnings: [{ id, type, scope, confidence, body_preview, reasons, semantic_score? }] }\",\n ].join(\"\\n\"),\n AntiPatternsCheckInputSchema,\n async (input: AntiPatternsCheckInput) => {\n tracker.record(\"anti_patterns_check\", input.paths.join(\",\").slice(0, 80));\n return jsonResult(await antiPatternsCheck(input, context));\n },\n );\n\n // ── v0.6.0 additions ───────────────────────────────────────────────────\n\n registerTool(\n \"mem_distill\",\n [\n \"Cluster recurring observations / failed attempts so a human can collapse\",\n \"N similar memories into one richer convention/gotcha. Cheap heuristic\",\n \"(anchor path overlap + body keyword overlap) — no embeddings required.\",\n \"\",\n \"USE periodically (e.g. monthly) to prevent memory pollution from agents\",\n \"saving the same observation many times.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days — only consider memories from the last N days (default 30)\",\n \" min_cluster — minimum cluster size to surface (default 3)\",\n \" type_filter — 'gotcha' | 'attempt' | 'all' (default 'gotcha')\",\n \" scope — 'personal' | 'team' | 'module' | 'any' (default 'any')\",\n \"\",\n \"RETURNS: { scanned, singletons, clusters: [{ suggested_topic, member_ids, ... }] }\",\n \"Output is advisory — nothing is written to disk.\",\n ].join(\"\\n\"),\n MemDistillInputSchema,\n async (input: MemDistillInput) => {\n tracker.record(\"mem_distill\", `${input.type_filter}/since=${input.since_days}d`);\n return jsonResult(await memDistill(input, context));\n },\n );\n\n registerTool(\n \"why_this_decision\",\n [\n \"Trace the genealogy of a memory (especially decision/architecture):\",\n \"the memory itself + memories explicitly linked via related_ids + memories\",\n \"anchored to overlapping paths + recent commits touching those paths.\",\n \"\",\n \"USE WHEN you find a memory and need to understand WHY it was made and\",\n \"what surrounds it. One call instead of 4-5 manual lookups.\",\n \"\",\n \"PARAMETERS:\",\n \" id — memory id (required)\",\n \" git_log_limit — how many recent commits per anchor path (default 5)\",\n \"\",\n \"RETURNS: { decision, related: [...], path_neighbors: [...], recent_commits: [...] }\",\n ].join(\"\\n\"),\n WhyThisDecisionInputSchema,\n async (input: WhyThisDecisionInput) => {\n tracker.record(\"why_this_decision\", input.id);\n return jsonResult(await whyThisDecision(input, context));\n },\n );\n\n registerTool(\n \"mem_conflicts_with\",\n [\n \"Detect memories that potentially CONTRADICT a given memory.\",\n \"\",\n \"USE BEFORE relying on a memory's advice — surfaces 'another memory says\",\n \"the opposite'. Detection uses several heuristics layered together:\",\n \"\",\n \" 1. Opposite status — validated vs rejected on overlapping topic\",\n \" 2. attempt-vs-convention on overlapping anchor paths\",\n \" 3. Polarity keywords — 'use X' vs 'do not use X' among semantic neighbors\",\n \" 4. Explicit #contradicts:<id> tags in either body\",\n \"\",\n \"PARAMETERS:\",\n \" id — memory id to check (required)\",\n \" min_score — minimum cosine similarity for semantic neighbors (default 0.5)\",\n \" semantic — use embeddings (default true)\",\n \"\",\n \"RETURNS: { found, target, scanned, conflicts: [{ id, reasons, similarity, ... }] }\",\n ].join(\"\\n\"),\n MemConflictsInputSchema,\n async (input: MemConflictsInput) => {\n tracker.record(\"mem_conflicts_with\", input.id);\n return jsonResult(await memConflicts(input, context));\n },\n );\n\n registerTool(\n \"mem_conflict_candidates\",\n [\n \"Bulk scan for conflict CANDIDATES (not proof):\",\n \"\",\n \" 1. Lexical similarity (Jaccard) on decision/architecture-like pairs\",\n \" 2. Same frontmatter.topic with validated vs rejected — quick human-review signal\",\n \"\",\n \"Advisory only — follow with mem_conflicts_with on specific ids.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days, types, min_jaccard, max_pairs, max_scan, max_topic_pairs\",\n \"\",\n \"RETURNS: { pairs, topic_status_pairs, scanned, truncated, notice? }\",\n ].join(\"\\n\"),\n MemConflictCandidatesInputSchema,\n async (input: MemConflictCandidatesInput) => {\n tracker.record(\"mem_conflict_candidates\", `${input.since_days}d`);\n return jsonResult(await memConflictCandidates(input, context));\n },\n );\n\n registerTool(\n \"runtime_journal_append\",\n [\n \"Append one line to `.ai/.runtime/session-journal.ndjson` — machine-local session continuity.\",\n \"\",\n \"Does NOT replace team memories; complements mem_session_end recaps for local traces.\",\n \"\",\n \"PARAMETERS: message, kind (note|session_end|mcp), optional tool\",\n \"\",\n \"RETURNS: { ok, path_hint }\",\n ].join(\"\\n\"),\n RuntimeJournalAppendInputSchema,\n async (input: RuntimeJournalAppendInput) =>\n jsonResult(await runtimeJournalAppend(input, context)),\n );\n\n registerTool(\n \"runtime_journal_tail\",\n [\n \"Read the last N entries from the runtime session journal (parsed JSON lines).\",\n \"\",\n \"PARAMETERS: limit (default 30, max 500)\",\n \"\",\n \"RETURNS: { entries: [...], empty?: true }\",\n ].join(\"\\n\"),\n RuntimeJournalTailInputSchema,\n async (input: RuntimeJournalTailInput) =>\n jsonResult(await runtimeJournalTail(input, context)),\n );\n\n registerTool(\n \"pre_commit_check\",\n [\n \"One-shot 'should I block this commit?' check. Combines three signals:\",\n \"\",\n \" 1. anti_patterns_check — known gotchas/attempts that match the diff\",\n \" 2. mem_for_files — conventions/decisions anchored to touched files\",\n \" 3. mem_verify — memories whose anchors are stale (knowledge may be wrong)\",\n \"\",\n \"USE FROM A GIT HOOK or before finalizing a non-trivial change.\",\n \"\",\n \"PARAMETERS:\",\n \" diff — raw unified diff text (e.g. `git diff --cached`)\",\n \" paths — affected file paths (project-relative)\",\n \" block_on — 'any' | 'high-confidence' (default) | 'never'\",\n \" semantic — use embeddings in anti_patterns_check (default true)\",\n \"\",\n \"RETURNS: { should_block, summary, warnings, relevant_memories, stale_anchors }\",\n ].join(\"\\n\"),\n PreCommitCheckInputSchema,\n async (input: PreCommitCheckInput) => {\n tracker.record(\"pre_commit_check\", `${input.paths.length}p`);\n return jsonResult(await preCommitCheck(input, context));\n },\n );\n\n registerTool(\n \"pattern_detect\",\n [\n \"Heuristic memory detector — finds knowledge worth saving WITHOUT calling an LLM.\",\n \"\",\n \"Runs three signals over local git history and the tool-usage log:\",\n \" 1. CONFIG_CHANGE — config files modified recently (tsconfig, eslint, prettier, …)\",\n \" → proposes a convention memory with the git diff as body.\",\n \" 2. REPEATED_PATH — same file appears ≥3× in mem_tried/mem_observe events\",\n \" → proposes a gotcha memory anchored to that path.\",\n \" 3. HOT_FILE — source file referenced ≥3× in writing-tool events\",\n \" → proposes a convention memory (frequent edits = pattern emerging).\",\n \"\",\n \"Saves memories with status='proposed'. They feed into auto-promote (Phase 4)\",\n \"or are surfaced in the next post_task distillation for LLM review.\",\n \"\",\n \"USE periodically (e.g. end of sprint) or trigger from post-commit hook.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days — look-back window in days (default 7)\",\n \" dry_run — report matches without saving (default false)\",\n \" scope — 'team' (default) | 'personal'\",\n \"\",\n \"RETURNS: { scanned_events, matches: [{kind, signal, proposed_type, …}], saved, saved_ids }\",\n ].join(\"\\n\"),\n PatternDetectInputSchema,\n async (input: PatternDetectInput) => {\n tracker.record(\"pattern_detect\", `since=${input.since_days}d/dry_run=${input.dry_run}`);\n return jsonResult(await patternDetect(input, context));\n },\n );\n\n registerTool(\n \"mem_diff\",\n [\n \"Compare two memories side-by-side to decide if they should be merged.\",\n \"\",\n \"USE BEFORE merging or deduplicating similar memories.\",\n \"Shows: frontmatter fields that differ + lines unique to each body.\",\n \"\",\n \"PARAMETERS:\",\n \" id_a — first memory id\",\n \" id_b — second memory id\",\n \"\",\n \"RETURNS: { frontmatter_diff: {...}, body_only_in_a: [...], body_only_in_b: [...] }\",\n ].join(\"\\n\"),\n MemDiffInputSchema,\n async (input: MemDiffInput) => jsonResult(await memDiff(input, context)),\n );\n\n if (shouldRegisterPrompt(\"bootstrap_project\")) {\n server.prompt(\n \"bootstrap_project\",\n [\n \"Analyze the project codebase and write .ai/project-context.md — run once after haive init.\",\n \"The AI explores the directory structure, reads key files (package.json, README, config),\",\n \"identifies the tech stack, architectural patterns, key modules, and conventions,\",\n \"then persists everything via bootstrap_project_save.\",\n \"For multi-component projects, run with module param to create .ai/modules/<name>/context.md.\",\n ].join(\" \"),\n BootstrapProjectArgsSchema,\n (args: BootstrapProjectArgs) => bootstrapProjectPrompt(args, context),\n );\n }\n\n if (shouldRegisterPrompt(\"post_task\")) {\n server.prompt(\n \"post_task\",\n [\n \"⭐ Post-task reflection — run at the end of every session to capture what you learned:\",\n \"failed approaches (mem_tried), new conventions/decisions/gotchas (mem_save),\",\n \"code discoveries (mem_observe), and an end-of-session recap (mem_session_end).\",\n \"In autopilot mode a minimal recap saves automatically; calling this produces a richer one.\",\n ].join(\" \"),\n PostTaskArgsSchema,\n (args: PostTaskArgs) => postTaskPrompt(args, context),\n );\n }\n\n if (shouldRegisterPrompt(\"import_docs\")) {\n server.prompt(\n \"import_docs\",\n [\n \"Import knowledge from a document (README, ADR, wiki, API spec) as hAIve memories.\",\n \"Pass the full document content; the AI extracts up to 10 actionable memories\",\n \"(conventions, decisions, gotchas, architecture) and saves them via mem_save.\",\n \"Good candidates: ADRs, onboarding docs, runbooks, team wikis.\",\n ].join(\" \"),\n ImportDocsArgsSchema,\n (args: ImportDocsArgs) => importDocsPrompt(args, context),\n );\n }\n\n return { server, context, tracker };\n}\n\n// ── Stdio runtime (also invoked by `haive mcp --stdio` via bundled CLI) ─────\n\n/** Parse argv for the standalone haive-mcp binary / CLI subprocess parity. */\nexport function parseMcpCliArgs(argv: string[]): {\n root?: string;\n versionOnly: boolean;\n} {\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--version\" || arg === \"-V\") {\n return { versionOnly: true };\n }\n }\n const out: { root?: string } = {};\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--root\" || arg === \"-r\") {\n out.root = argv[++i];\n } else if (arg?.startsWith(\"--root=\")) {\n out.root = arg.slice(\"--root=\".length);\n }\n }\n return { root: out.root, versionOnly: false };\n}\n\n/** Print MCP server version (same as haive CLI when bundled together). */\nexport function printHaiveMcpVersion(): void {\n console.log(SERVER_VERSION);\n}\n\n/**\n * Run the MCP server over stdio. Used by `haive-mcp` and by `haive mcp --stdio`\n * when the MCP implementation is bundled into the CLI.\n */\nexport async function runHaiveMcpStdio(options: { root?: string }): Promise<void> {\n const { server, context } = createHaiveServer({ root: options.root, env: process.env });\n console.error(\n `[haive-mcp] starting server v${SERVER_VERSION} (project root: ${context.paths.root})`,\n );\n await server.connect(new StdioServerTransport());\n}\n","import { findProjectRoot, resolveHaivePaths, type HaivePaths } from \"@hiveai/core\";\n\nexport interface HaiveContext {\n paths: HaivePaths;\n}\n\nexport interface CreateContextOptions {\n root?: string;\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n}\n\nexport function createContext(options: CreateContextOptions = {}): HaiveContext {\n const env = options.env ?? process.env;\n const cwd = options.cwd ?? process.cwd();\n const root =\n options.root ??\n env.HAIVE_PROJECT_ROOT ??\n findProjectRoot(cwd);\n return { paths: resolveHaivePaths(root) };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectSaveInputSchema = {\n content: z\n .string()\n .min(1)\n .describe(\"Full Markdown content for the project (or module) context file\"),\n module: z\n .string()\n .optional()\n .describe(\n \"If provided, save under .ai/modules/<module>/context.md instead of .ai/project-context.md\",\n ),\n overwrite: z\n .boolean()\n .default(false)\n .describe(\"Overwrite an existing file instead of failing\"),\n};\n\nexport type BootstrapProjectSaveInput = {\n [K in keyof typeof BootstrapProjectSaveInputSchema]: z.infer<\n (typeof BootstrapProjectSaveInputSchema)[K]\n >;\n};\n\nexport interface BootstrapProjectSaveOutput {\n file_path: string;\n action: \"created\" | \"overwritten\";\n}\n\nexport async function bootstrapProjectSave(\n input: BootstrapProjectSaveInput,\n ctx: HaiveContext,\n): Promise<BootstrapProjectSaveOutput> {\n const target = input.module\n ? path.join(ctx.paths.modulesContextDir, input.module, \"context.md\")\n : ctx.paths.projectContext;\n\n const exists = existsSync(target);\n if (exists && !input.overwrite) {\n throw new Error(\n `${target} already exists. Pass overwrite=true to replace it.`,\n );\n }\n\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, input.content, \"utf8\");\n\n return {\n file_path: target,\n action: exists ? \"overwritten\" : \"created\",\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetProjectContextInputSchema = {\n module: z\n .string()\n .optional()\n .describe(\"If provided, also include the matching module's context file\"),\n list_modules: z\n .boolean()\n .default(false)\n .describe(\"Return the list of available module context files\"),\n};\n\nexport type GetProjectContextInput = {\n [K in keyof typeof GetProjectContextInputSchema]: z.infer<\n (typeof GetProjectContextInputSchema)[K]\n >;\n};\n\nexport interface GetProjectContextOutput {\n root_context: string | null;\n module_context?: { name: string; content: string };\n available_modules?: string[];\n}\n\nexport async function getProjectContext(\n input: GetProjectContextInput,\n ctx: HaiveContext,\n): Promise<GetProjectContextOutput> {\n const out: GetProjectContextOutput = { root_context: null };\n\n if (existsSync(ctx.paths.projectContext)) {\n out.root_context = await readFile(ctx.paths.projectContext, \"utf8\");\n }\n\n if (input.module) {\n const modFile = path.join(ctx.paths.modulesContextDir, input.module, \"context.md\");\n if (existsSync(modFile)) {\n out.module_context = {\n name: input.module,\n content: await readFile(modFile, \"utf8\"),\n };\n }\n }\n\n if (input.list_modules) {\n out.available_modules = await listModules(ctx.paths.modulesContextDir);\n }\n\n return out;\n}\n\nasync function listModules(modulesDir: string): Promise<string[]> {\n if (!existsSync(modulesDir)) return [];\n const entries = await readdir(modulesDir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemListInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional(),\n module: z.string().optional(),\n tag: z.string().optional(),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n include_body: z\n .boolean()\n .default(false)\n .describe(\"Include full body text. Default false to save tokens — use mem_get for a single memory's full content.\"),\n};\n\nexport type MemListInput = {\n [K in keyof typeof MemListInputSchema]: z.infer<(typeof MemListInputSchema)[K]>;\n};\n\nexport interface MemSummary {\n id: string;\n scope: string;\n type: string;\n module?: string;\n status: string;\n tags: string[];\n snippet: string;\n file_path: string;\n body?: string;\n}\n\nexport async function memList(\n input: MemListInput,\n ctx: HaiveContext,\n): Promise<{ memories: MemSummary[] }> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { memories: [] };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.tag && !fm.tags.includes(input.tag)) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n return true;\n });\n const memories: MemSummary[] = filtered.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const snippet = memory.body.replace(/\\s+/g, \" \").trim().slice(0, 120);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n status: fm.status,\n tags: fm.tags,\n snippet,\n file_path: filePath,\n ...(input.include_body ? { body: memory.body } : {}),\n };\n });\n return { memories };\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n loadConfig,\n loadMemoriesFromDir,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSaveInputSchema = {\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\", \"attempt\", \"session_recap\"])\n .describe(\n \"Kind of memory being saved. Use 'attempt' for failed approaches (auto-validated). \" +\n \"Use 'session_recap' via mem_session_end instead.\",\n ),\n slug: z\n .string()\n .min(1)\n .describe(\"Short human-readable identifier — becomes part of the filename\"),\n body: z\n .string()\n .describe(\"Markdown body of the memory\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .optional()\n .describe(\n \"Visibility scope: personal | team | module. \" +\n \"When omitted, falls back to defaultScope in haive.config.json (default: personal).\",\n ),\n module: z\n .string()\n .optional()\n .describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n domain: z.string().optional().describe(\"Domain (e.g. transactions, billing)\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Anchor paths (file paths this memory references)\"),\n symbols: z\n .array(z.string())\n .default([])\n .describe(\"Anchor symbols (function/class names this memory references)\"),\n commit: z\n .string()\n .optional()\n .describe(\"Anchor commit SHA (for staleness detection later)\"),\n topic: z\n .string()\n .optional()\n .describe(\n \"Stable key for this memory. If a memory with the same topic already exists in this scope, \" +\n \"it is updated in-place (revision_count++). Use for knowledge that evolves over time.\",\n ),\n};\n\nexport type MemSaveInput = {\n [K in keyof typeof MemSaveInputSchema]: z.infer<(typeof MemSaveInputSchema)[K]>;\n};\n\nexport interface MemSaveOutput {\n id: string;\n scope: string;\n file_path: string;\n action: \"created\" | \"updated\";\n revision_count?: number;\n warning?: string;\n similar_found?: string[];\n /** High textual overlap with existing memory (same scope+type); consider merging instead. */\n body_similar?: { id: string; score: number };\n invalid_paths?: string[];\n}\n\nfunction bodyHash(body: string): string {\n return createHash(\"sha256\").update(body.trim()).digest(\"hex\").slice(0, 12);\n}\n\nconst WORD_RE = /\\b[a-z0-9]{3,}\\b/gi;\n\nfunction bodyTokenSet(body: string): Set<string> {\n const raw = body.toLowerCase().match(WORD_RE) ?? [];\n return new Set(raw);\n}\n\n/** Jaccard similarity on alphanumeric tokens — warns when corpus has near-duplicate wording. */\nfunction maxBodySimilarity(\n incomingTokens: Set<string>,\n memories: Array<{ memory: { body: string; frontmatter: { scope: string; type: string; id: string; status?: string } } }>,\n scope: string,\n type: string,\n excludeIds?: ReadonlySet<string>,\n): { score: number; id: string } | null {\n if (incomingTokens.size < 6) return null;\n let best: { score: number; id: string } | null = null;\n const skip = excludeIds ?? new Set<string>();\n for (const { memory } of memories) {\n const fm = memory.frontmatter;\n if (skip.has(fm.id)) continue;\n if (fm.scope !== scope || fm.type !== type) continue;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n const other = bodyTokenSet(memory.body);\n if (other.size === 0) continue;\n let inter = 0;\n for (const t of incomingTokens) if (other.has(t)) inter++;\n const uni = incomingTokens.size + other.size - inter;\n const j = uni === 0 ? 0 : inter / uni;\n if (j >= 0.72 && (!best || j > best.score)) best = { score: j, id: fm.id };\n }\n return best;\n}\n\nexport async function memSave(\n input: MemSaveInput,\n ctx: HaiveContext,\n): Promise<MemSaveOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(\n `No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`,\n );\n }\n\n const existing = existsSync(ctx.paths.memoriesDir)\n ? await loadMemoriesFromDir(ctx.paths.memoriesDir)\n : [];\n\n // ── Resolve scope once: explicit input wins over config default ────────\n // Must be computed early so dedup and topic-upsert use the same scope\n // that the new memory will ultimately be saved under.\n const haiveConfig = await loadConfig(ctx.paths);\n const resolvedScope = (\n input.scope ?? haiveConfig.defaultScope ?? \"personal\"\n ) as \"personal\" | \"team\" | \"module\";\n\n // ── Anchor path validation ─────────────────────────────────────────────\n const invalidPaths = input.paths.filter(\n (p) => !existsSync(path.resolve(ctx.paths.root, p)),\n );\n\n // ── Dedup by content hash ──────────────────────────────────────────────\n const incomingHash = bodyHash(input.body);\n const hashDuplicate = existing.find(({ memory }) =>\n bodyHash(memory.body) === incomingHash &&\n memory.frontmatter.scope === resolvedScope,\n );\n if (hashDuplicate) {\n throw new Error(\n `Duplicate content detected — identical body already saved as \"${hashDuplicate.memory.frontmatter.id}\". ` +\n `Use mem_update to modify it, or change the body to add new information.`,\n );\n }\n\n const incomingTokens = bodyTokenSet(input.body);\n\n function bodySimilarWarnings(excludeIds?: ReadonlySet<string>): {\n similarityWarning?: string;\n body_similar?: MemSaveOutput[\"body_similar\"];\n } {\n const dup = maxBodySimilarity(incomingTokens, existing, resolvedScope, input.type, excludeIds);\n if (!dup?.id) return {};\n const body_similar: MemSaveOutput[\"body_similar\"] = {\n id: dup.id,\n score: Math.round(dup.score * 100) / 100,\n };\n return {\n similarityWarning: `Body is ~${Math.round(dup.score * 100)}% similar (token overlap) to existing \"${dup.id}\" — consolidate if redundant.`,\n body_similar,\n };\n }\n\n // ── Topic upsert ───────────────────────────────────────────────────────\n if (input.topic) {\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === input.topic &&\n memory.frontmatter.scope === resolvedScope &&\n (!input.module || memory.frontmatter.module === input.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const { similarityWarning: simW, body_similar: bs } = bodySimilarWarnings(new Set([fm.id]));\n const newFrontmatter = {\n ...fm,\n body: input.body,\n tags: input.tags.length ? input.tags : fm.tags,\n revision_count: (fm.revision_count ?? 0) + 1,\n anchor: {\n commit: input.commit ?? fm.anchor.commit,\n paths: input.paths.length ? input.paths : fm.anchor.paths,\n symbols: input.symbols.length ? input.symbols : fm.anchor.symbols,\n },\n };\n await writeFile(\n topicMatch.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: input.body }),\n \"utf8\",\n );\n const mergedTw = [\n invalidPaths.length > 0\n ? `Anchor path(s) not found in project: ${invalidPaths.join(\", \")}. They will be marked stale by haive sync.`\n : null,\n simW ?? null,\n ]\n .filter(Boolean)\n .join(\" — \") || undefined;\n\n return {\n id: fm.id,\n scope: fm.scope,\n file_path: topicMatch.filePath,\n action: \"updated\",\n revision_count: newFrontmatter.revision_count,\n ...(mergedTw ? { warning: mergedTw } : {}),\n ...(bs ? { body_similar: bs } : {}),\n ...(invalidPaths.length > 0 ? { invalid_paths: invalidPaths } : {}),\n };\n }\n }\n\n // ── Create new memory ──────────────────────────────────────────────────\n // resolvedScope and haiveConfig are already computed above.\n\n const frontmatter = buildFrontmatter({\n type: input.type,\n slug: input.slug,\n scope: resolvedScope,\n module: input.module,\n tags: input.tags,\n domain: input.domain,\n author: input.author,\n paths: input.paths,\n symbols: input.symbols,\n commit: input.commit,\n topic: input.topic,\n status: haiveConfig.defaultStatus === \"validated\" ? \"validated\" : undefined,\n });\n\n const file = memoryFilePath(\n ctx.paths,\n frontmatter.scope,\n frontmatter.id,\n frontmatter.module,\n );\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n throw new Error(`Memory already exists at ${file}`);\n }\n\n // ── Similar slug detection (warn but don't block) ──────────────────────\n let warning: string | undefined;\n let similar_found: string[] | undefined;\n if (existing.length > 0) {\n const slugTokens = input.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 similar_found = similar.map((m) => m.memory.frontmatter.id);\n warning = `Possible duplicate: similar memories already exist (${similar_found.join(\", \")}). Consider updating one of these instead.`;\n }\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body: input.body }), \"utf8\");\n\n const { similarityWarning: simWarnNew, body_similar: bsNew } = bodySimilarWarnings();\n\n // Merge warnings: invalid anchors + slug similarity + body similarity\n const finalWarning = [\n invalidPaths.length > 0\n ? `Anchor path(s) not found in project: ${invalidPaths.join(\", \")}. They will be marked stale by \\`haive sync\\`.`\n : null,\n warning ?? null,\n simWarnNew ?? null,\n ].filter(Boolean).join(\" — \") || undefined;\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n action: \"created\",\n ...(finalWarning ? { warning: finalWarning } : {}),\n ...(similar_found ? { similar_found } : {}),\n ...(bsNew ? { body_similar: bsNew } : {}),\n ...(invalidPaths.length > 0 ? { invalid_paths: invalidPaths } : {}),\n };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n extractSnippet,\n getUsage,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadMemoriesFromDir,\n loadUsageIndex,\n pickSnippetNeedle,\n rankMemoriesLexical,\n tokenizeQuery,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSearchInputSchema = {\n query: z.string().describe(\"Substring matched against id, tags, and body\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .optional()\n .describe(\"Restrict results to a single scope\"),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\", \"attempt\", \"session_recap\"])\n .optional()\n .describe(\"Restrict results to a memory type. session_recap is excluded by default — use type='session_recap' to include them.\"),\n include_session_recap: z\n .boolean()\n .default(false)\n .describe(\"Include session_recap memories in search results (excluded by default — they surface in get_briefing as last_session).\"),\n module: z.string().optional().describe(\"Restrict results to a module\"),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n limit: z.number().int().positive().max(100).default(20).describe(\"Max results\"),\n semantic: z\n .boolean()\n .default(false)\n .describe(\n \"Use semantic similarity from the embeddings index (requires `haive embeddings index`).\",\n ),\n lexical_rank: z\n .boolean()\n .default(false)\n .describe(\n \"When true (and semantic is false), rank the filtered corpus with Okapi-BM25-style lexical scoring instead of literal AND/OR. Helps phrase-like queries without embeddings.\",\n ),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0)\n .describe(\"Minimum cosine similarity (semantic mode only)\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories (used for passive validation)\"),\n};\n\nexport type MemSearchInput = {\n [K in keyof typeof MemSearchInputSchema]: z.infer<(typeof MemSearchInputSchema)[K]>;\n};\n\n/** session_recap memories are surfaced separately via get_briefing.last_session — not in search results by default. */\nfunction isSessionRecap(fm: { type: string }): boolean {\n return fm.type === \"session_recap\";\n}\n\nexport interface MemSearchHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n snippet: string;\n file_path: string;\n score?: number;\n}\n\nexport interface MemSearchOutput {\n matches: MemSearchHit[];\n total: number;\n mode: \"literal\" | \"semantic\" | \"literal_fallback\" | \"lexical_ranked\";\n notice?: string;\n}\n\nexport async function memSearch(\n input: MemSearchInput,\n ctx: HaiveContext,\n): Promise<MemSearchOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { matches: [], total: 0, mode: input.semantic ? \"literal_fallback\" : \"literal\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => passesFilters(memory.frontmatter, input));\n const usage = await loadUsageIndex(ctx.paths);\n\n let result: MemSearchOutput;\n if (input.semantic) {\n const semantic = await trySemanticSearch(ctx, input, filtered, usage);\n if (semantic) {\n result = semantic;\n } else {\n result = {\n ...buildLiteralResult(input, filtered, usage),\n mode: \"literal_fallback\",\n notice:\n \"Semantic search unavailable (embeddings index missing or @hiveai/embeddings not installed). Falling back to literal search.\",\n };\n }\n } else if (input.lexical_rank && input.query.trim()) {\n const { ranked, scores } = rankMemoriesLexical(\n filtered,\n input.query,\n input.limit,\n );\n if (ranked.length > 0) {\n const snippetNeedle = pickSnippetNeedle(input.query);\n result = {\n matches: ranked.map((loaded, i) =>\n lexicalHit(loaded, snippetNeedle, usage, scores[i]!),\n ),\n total: ranked.length,\n mode: \"lexical_ranked\",\n };\n } else {\n result = {\n ...buildLiteralResult(input, filtered, usage),\n notice: \"Lexical ranking found no BM25-positive hits — showing literal matches instead.\",\n };\n }\n } else {\n result = buildLiteralResult(input, filtered, usage);\n }\n\n if (input.track && result.matches.length > 0) {\n await trackReads(\n ctx.paths,\n result.matches.map((m) => m.id),\n );\n }\n\n return result;\n}\n\nfunction passesFilters(\n fm: LoadedMemory[\"memory\"][\"frontmatter\"],\n input: MemSearchInput,\n): boolean {\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n // session_recap memories surface via get_briefing.last_session — exclude unless explicitly requested\n if (!input.include_session_recap && isSessionRecap(fm)) return false;\n return true;\n}\n\nfunction buildLiteralResult(\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): { matches: MemSearchHit[]; total: number; mode: \"literal\"; notice?: string } {\n const tokens = tokenizeQuery(input.query);\n const snippetNeedle = pickSnippetNeedle(input.query);\n\n let andMatched = filtered.filter(({ memory }) => literalMatchesAllTokens(memory, tokens));\n if (andMatched.length > 0) {\n const top = andMatched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: andMatched.length,\n mode: \"literal\",\n };\n }\n\n // AND returned nothing — fall back to OR (any token)\n const orMatched = filtered.filter(({ memory }) => literalMatchesAnyToken(memory, tokens));\n const top = orMatched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: orMatched.length,\n mode: \"literal\",\n notice: `No exact match for all tokens. Showing partial matches (OR fallback) — ${orMatched.length} result${orMatched.length === 1 ? \"\" : \"s\"}.`,\n };\n}\n\nasync function trySemanticSearch(\n ctx: HaiveContext,\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): Promise<MemSearchOutput | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, input.query, {\n limit: Math.min(input.limit * 3, 100),\n minScore: input.min_score,\n });\n if (!result) return null;\n\n const allowedIds = new Set(filtered.map((m) => m.memory.frontmatter.id));\n const byId = new Map(filtered.map((m) => [m.memory.frontmatter.id, m]));\n\n const ranked = result.hits\n .filter((h) => allowedIds.has(h.id))\n .slice(0, input.limit);\n\n const matches: MemSearchHit[] = ranked.map((hit) => {\n const loaded = byId.get(hit.id);\n if (!loaded) {\n return {\n id: hit.id,\n scope: \"unknown\",\n type: \"unknown\",\n tags: [],\n status: \"unknown\",\n confidence: \"unverified\" as const,\n read_count: 0,\n snippet: \"\",\n file_path: hit.file_path,\n score: hit.score,\n };\n }\n const base = toHit(loaded, input.query.toLowerCase(), usage);\n return { ...base, score: hit.score };\n });\n\n return {\n matches,\n total: ranked.length,\n mode: \"semantic\",\n };\n}\n\nfunction toHit(loaded: LoadedMemory, needle: string, usage: UsageIndex): MemSearchHit {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n snippet: extractSnippet(loaded.memory.body, needle),\n file_path: loaded.filePath,\n };\n}\n\nfunction lexicalHit(\n loaded: LoadedMemory,\n needle: string,\n usage: UsageIndex,\n lexicalScore: number,\n): MemSearchHit {\n return { ...toHit(loaded, needle, usage), score: lexicalScore };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n verifyAnchor,\n type Memory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemVerifyInputSchema = {\n id: z.string().optional().describe(\"If set, verify only this memory id\"),\n update: z\n .boolean()\n .default(false)\n .describe(\"Write the resulting status back to disk (status=stale or validated)\"),\n};\n\nexport type MemVerifyInput = {\n [K in keyof typeof MemVerifyInputSchema]: z.infer<(typeof MemVerifyInputSchema)[K]>;\n};\n\nexport interface MemVerifyHit {\n id: string;\n file_path: string;\n stale: boolean;\n reason: string | null;\n possible_renames?: string[];\n status_after: string;\n skipped?: boolean;\n}\n\nexport interface MemVerifyOutput {\n results: MemVerifyHit[];\n summary: {\n checked: number;\n fresh: number;\n stale: number;\n anchorless_skipped: number;\n updated: number;\n };\n}\n\nexport async function memVerify(\n input: MemVerifyInput,\n ctx: HaiveContext,\n): Promise<MemVerifyOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n results: [],\n summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 },\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const targets = input.id\n ? all.filter((m) => m.memory.frontmatter.id === input.id)\n : all;\n\n const results: MemVerifyHit[] = [];\n let fresh = 0;\n let stale = 0;\n let anchorless = 0;\n let updated = 0;\n\n for (const { memory, filePath } of targets) {\n // session_recap records historical context — anchor staleness does not apply\n if (memory.frontmatter.type === \"session_recap\") {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const isAnchored =\n memory.frontmatter.anchor.paths.length > 0 ||\n memory.frontmatter.anchor.symbols.length > 0;\n if (!isAnchored) {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const result = await verifyAnchor(memory, { projectRoot: ctx.paths.root });\n if (result.stale) stale++;\n else fresh++;\n\n let statusAfter = memory.frontmatter.status;\n if (input.update) {\n const next = applyVerification(memory, result);\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n statusAfter = next.frontmatter.status;\n updated++;\n }\n\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: result.stale,\n reason: result.reason,\n ...(result.possibleRenames.length > 0 ? { possible_renames: result.possibleRenames } : {}),\n status_after: statusAfter,\n });\n }\n\n return {\n results,\n summary: {\n checked: results.length + anchorless,\n fresh,\n stale,\n anchorless_skipped: anchorless,\n updated,\n },\n };\n}\n\nfunction applyVerification(\n mem: Memory,\n result: { stale: boolean; reason: string | null },\n): Memory {\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 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 { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n recordRejection,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRejectInputSchema = {\n id: z.string().min(1).describe(\"Memory id being rejected\"),\n reason: z\n .string()\n .optional()\n .describe(\"Why this memory is being rejected (recorded for review)\"),\n};\n\nexport type MemRejectInput = {\n [K in keyof typeof MemRejectInputSchema]: z.infer<(typeof MemRejectInputSchema)[K]>;\n};\n\nexport interface MemRejectOutput {\n id: string;\n status: string;\n rejected_count: number;\n last_rejected_at: string | null;\n rejection_reason: string | null;\n}\n\nexport async function memReject(\n input: MemRejectInput,\n ctx: HaiveContext,\n): Promise<MemRejectOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n // Write rejected status and reason to disk\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: {\n ...loaded.memory.frontmatter,\n status: \"rejected\",\n stale_reason: input.reason ?? loaded.memory.frontmatter.stale_reason ?? null,\n },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(ctx.paths);\n recordRejection(idx, input.id, input.reason ?? null);\n await saveUsageIndex(ctx.paths, idx);\n const u = idx.by_id[input.id];\n return {\n id: input.id,\n status: \"rejected\",\n rejected_count: u?.rejected_count ?? 0,\n last_rejected_at: u?.last_rejected_at ?? null,\n rejection_reason: u?.rejection_reason ?? null,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n deriveConfidence,\n getUsage,\n inferModulesFromPaths,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemForFilesInputSchema = {\n files: z\n .array(z.string())\n .min(1)\n .describe(\"Project-relative file paths the agent is currently working on\"),\n include_module_contexts: z\n .boolean()\n .default(true)\n .describe(\"Inline the matching .ai/modules/<name>/context.md contents\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories\"),\n};\n\nexport type MemForFilesInput = {\n [K in keyof typeof MemForFilesInputSchema]: z.infer<(typeof MemForFilesInputSchema)[K]>;\n};\n\nexport interface MemMatch {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n reason: \"anchor_overlap\" | \"module\" | \"domain\";\n file_path: string;\n body: string;\n}\n\nexport interface MemForFilesOutput {\n inferred_modules: string[];\n by_anchor: MemMatch[];\n by_module: MemMatch[];\n by_domain: MemMatch[];\n module_contexts: Array<{ name: string; content: string }>;\n}\n\nexport async function memForFiles(\n input: MemForFilesInput,\n ctx: HaiveContext,\n): Promise<MemForFilesOutput> {\n const inferred = inferModulesFromPaths(input.files);\n\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n inferred_modules: inferred,\n by_anchor: [],\n by_module: [],\n by_domain: [],\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const seen = new Set<string>();\n\n const byAnchor: MemMatch[] = [];\n const byModule: MemMatch[] = [];\n const byDomain: MemMatch[] = [];\n\n for (const loaded of all) {\n // session_recap surfaces in get_briefing.last_session — skip here\n if (loaded.memory.frontmatter.type === \"session_recap\") continue;\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) {\n byAnchor.push(toMatch(loaded, \"anchor_overlap\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n // Extract meaningful path segments from input files for tag matching\n const pathSegments = extractPathSegments(input.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) => inferred.includes(t)) ||\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(toMatch(loaded, \"module\", usage));\n seen.add(fm.id);\n }\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(toMatch(loaded, \"domain\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n if (input.track) {\n await trackReads(ctx.paths, [...seen]);\n }\n\n return {\n inferred_modules: inferred,\n by_anchor: byAnchor,\n by_module: byModule,\n by_domain: byDomain,\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n}\n\nfunction toMatch(\n loaded: LoadedMemory,\n reason: MemMatch[\"reason\"],\n usage: Parameters<typeof getUsage>[0],\n): MemMatch {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n reason,\n file_path: loaded.filePath,\n body: loaded.memory.body,\n };\n}\n\n/**\n * Extract lowercase path segments from file paths that are likely domain/module names.\n * Filters out generic segments like src, main, java, com, org, test, etc.\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(/\\.[^.]+$/, \"\"); // strip extension\n if (seg.length >= 3 && !GENERIC.has(seg) && /^[a-z]/.test(seg)) {\n out.add(seg);\n // Also split camelCase / kebab-case segments: mobilepayment → mobile, payment\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\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n enabled: boolean,\n): Promise<Array<{ name: string; content: string }>> {\n if (!enabled || modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n type ConfidenceLevel,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemGetInputSchema = {\n id: z.string().min(1).describe(\"Memory id to fetch\"),\n};\n\nexport type MemGetInput = {\n [K in keyof typeof MemGetInputSchema]: z.infer<(typeof MemGetInputSchema)[K]>;\n};\n\nexport interface MemGetOutput {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n rejected_count: number;\n created_at: string;\n verified_at: string | null;\n stale_reason: string | null;\n anchor: { commit?: string; paths: string[]; symbols: string[] };\n body: string;\n file_path: string;\n}\n\nexport async function memGet(input: MemGetInput, ctx: HaiveContext): Promise<MemGetOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n const fm = found.memory.frontmatter;\n const u = getUsage(await loadUsageIndex(ctx.paths), fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n created_at: fm.created_at,\n verified_at: fm.verified_at,\n stale_reason: fm.stale_reason,\n anchor: {\n ...(fm.anchor.commit ? { commit: fm.anchor.commit } : {}),\n paths: fm.anchor.paths,\n symbols: fm.anchor.symbols,\n },\n body: found.memory.body,\n file_path: found.filePath,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDeleteInputSchema = {\n id: z.string().min(1).describe(\"Memory id to delete\"),\n keep_usage: z\n .boolean()\n .default(false)\n .describe(\"Keep the usage.json entry instead of removing it alongside the file\"),\n};\n\nexport type MemDeleteInput = {\n [K in keyof typeof MemDeleteInputSchema]: z.infer<(typeof MemDeleteInputSchema)[K]>;\n};\n\nexport interface MemDeleteOutput {\n id: string;\n deleted_file: string;\n usage_removed: boolean;\n}\n\nexport async function memDelete(\n input: MemDeleteInput,\n ctx: HaiveContext,\n): Promise<MemDeleteOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n await unlink(found.filePath);\n\n let usageRemoved = false;\n if (!input.keep_usage) {\n const idx = await loadUsageIndex(ctx.paths);\n if (idx.by_id[input.id]) {\n delete idx.by_id[input.id];\n await saveUsageIndex(ctx.paths, idx);\n usageRemoved = true;\n }\n }\n\n return { id: input.id, deleted_file: found.filePath, usage_removed: usageRemoved };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir, serializeMemory } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemUpdateInputSchema = {\n id: z.string().min(1).describe(\"Id of the memory to update\"),\n body: z.string().optional().describe(\"New Markdown body — replaces the existing body\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"New tags array — fully replaces existing tags\"),\n paths: z\n .array(z.string())\n .optional()\n .describe(\"New anchor paths — fully replaces existing anchor.paths\"),\n symbols: z\n .array(z.string())\n .optional()\n .describe(\"New anchor symbols — fully replaces existing anchor.symbols\"),\n commit: z.string().optional().describe(\"New anchor commit SHA\"),\n domain: z.string().optional().describe(\"New domain label\"),\n author: z.string().optional().describe(\"New author handle or email\"),\n};\n\nexport type MemUpdateInput = {\n [K in keyof typeof MemUpdateInputSchema]: z.infer<(typeof MemUpdateInputSchema)[K]>;\n};\n\nexport interface MemUpdateOutput {\n id: string;\n file_path: string;\n updated_fields: string[];\n}\n\nexport async function memUpdate(\n input: MemUpdateInput,\n ctx: HaiveContext,\n): Promise<MemUpdateOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n const { frontmatter, body } = loaded.memory;\n const updated_fields: string[] = [];\n\n const newAnchor = { ...frontmatter.anchor };\n if (input.paths !== undefined) { newAnchor.paths = input.paths; updated_fields.push(\"anchor.paths\"); }\n if (input.symbols !== undefined) { newAnchor.symbols = input.symbols; updated_fields.push(\"anchor.symbols\"); }\n if (input.commit !== undefined) { newAnchor.commit = input.commit; updated_fields.push(\"anchor.commit\"); }\n\n const newFrontmatter = {\n ...frontmatter,\n anchor: newAnchor,\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.domain !== undefined ? { domain: input.domain } : {}),\n ...(input.author !== undefined ? { author: input.author } : {}),\n };\n\n if (input.tags !== undefined) updated_fields.push(\"tags\");\n if (input.domain !== undefined) updated_fields.push(\"domain\");\n if (input.author !== undefined) updated_fields.push(\"author\");\n\n const newBody = input.body !== undefined ? input.body : body;\n if (input.body !== undefined) updated_fields.push(\"body\");\n\n if (updated_fields.length === 0) {\n throw new Error(\"No fields to update — provide at least one of: body, tags, paths, symbols, commit, domain, author.\");\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: newBody }),\n \"utf8\",\n );\n\n return { id: input.id, file_path: loaded.filePath, updated_fields };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemPendingInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n};\n\nexport type MemPendingInput = {\n [K in keyof typeof MemPendingInputSchema]: z.infer<(typeof MemPendingInputSchema)[K]>;\n};\n\nexport interface MemPendingHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n age_days: number;\n read_count: number;\n rejected_count: number;\n file_path: string;\n}\n\nexport interface MemPendingOutput {\n pending: MemPendingHit[];\n}\n\nexport async function memPending(\n input: MemPendingInput,\n ctx: HaiveContext,\n): Promise<MemPendingOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) return { pending: [] };\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const now = Date.now();\n const proposed = all.filter(({ memory }) => {\n if (memory.frontmatter.status !== \"proposed\") return false;\n if (input.scope && memory.frontmatter.scope !== input.scope) return false;\n return true;\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 return {\n pending: proposed.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n age_days: Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n file_path: filePath,\n };\n }),\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemApproveInputSchema = {\n id: z.string().min(1).describe(\"Memory id to approve (sets status=validated immediately)\"),\n};\n\nexport type MemApproveInput = {\n [K in keyof typeof MemApproveInputSchema]: z.infer<(typeof MemApproveInputSchema)[K]>;\n};\n\nexport interface MemApproveOutput {\n id: string;\n previous_status: string;\n status: \"validated\";\n file_path: string;\n}\n\nexport async function memApprove(\n input: MemApproveInput,\n ctx: HaiveContext,\n): Promise<MemApproveOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n const previous = found.memory.frontmatter.status;\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 return {\n id: input.id,\n previous_status: previous,\n status: \"validated\",\n file_path: found.filePath,\n };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemTriedInputSchema = {\n what: z.string().min(1).describe(\"Brief description of the approach that was tried\"),\n why_failed: z\n .string()\n .min(1)\n .describe(\"Why it failed or why it should NOT be used\"),\n instead: z\n .string()\n .optional()\n .describe(\"What to use or do instead (recommended alternative)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility scope\"),\n module: z.string().optional().describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Anchor file paths this applies to\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n};\n\nexport type MemTriedInput = {\n [K in keyof typeof MemTriedInputSchema]: z.infer<(typeof MemTriedInputSchema)[K]>;\n};\n\nexport interface MemTriedOutput {\n id: string;\n scope: string;\n file_path: string;\n}\n\nexport async function memTried(\n input: MemTriedInput,\n ctx: HaiveContext,\n): Promise<MemTriedOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n const slug = input.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: input.scope,\n module: input.module,\n tags: input.tags,\n paths: input.paths,\n author: input.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[] = [`# ${input.what}`, \"\"];\n lines.push(`**Why it failed / do NOT use:** ${input.why_failed}`);\n if (input.instead) {\n lines.push(\"\", `**Instead, use:** ${input.instead}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n\n const file = memoryFilePath(ctx.paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n throw new Error(`Memory already exists at ${file}`);\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n return { id: frontmatter.id, scope: frontmatter.scope, file_path: file };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n/**\n * mem_observe — capture a code-level discovery made during exploration.\n *\n * Unlike mem_tried (failed approaches) or mem_save (conventions/decisions),\n * mem_observe is for bugs, inconsistencies, and security gaps discovered by\n * reading existing code that were NOT in the briefing. Auto-validated (no review).\n */\nexport const MemObserveInputSchema = {\n what: z\n .string()\n .min(1)\n .describe(\"Short title: what did you observe? (e.g. 'MobilePaymentController has two @RequestBody on handleWebhook')\"),\n where: z\n .string()\n .min(1)\n .describe(\"File path(s) where the issue lives — be specific\"),\n impact: z\n .string()\n .min(1)\n .describe(\"What breaks or could break because of this (e.g. 'Spring MVC rejects the handler at startup')\"),\n fix: z\n .string()\n .optional()\n .describe(\"Suggested fix or workaround (optional — leave empty if unknown)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"team\")\n .describe(\"Visibility scope — defaults to team since discoveries benefit everyone\"),\n module: z.string().optional().describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n};\n\nexport type MemObserveInput = {\n [K in keyof typeof MemObserveInputSchema]: z.infer<(typeof MemObserveInputSchema)[K]>;\n};\n\nexport interface MemObserveOutput {\n id: string;\n scope: string;\n file_path: string;\n}\n\nexport async function memObserve(\n input: MemObserveInput,\n ctx: HaiveContext,\n): Promise<MemObserveOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n const slug = input.what\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .trim()\n .split(/\\s+/)\n .slice(0, 6)\n .join(\"-\");\n\n // Parse where into anchor paths (comma-separated or single path)\n const anchorPaths = input.where\n .split(/[,\\n]/)\n .map((s) => s.trim())\n .filter(Boolean);\n\n const baseFm = buildFrontmatter({\n type: \"gotcha\",\n slug,\n scope: input.scope,\n module: input.module,\n tags: input.tags,\n paths: anchorPaths,\n author: input.author,\n });\n // Observations are immediately validated — no review cycle needed\n const frontmatter = { ...baseFm, status: \"validated\" as const };\n\n const lines: string[] = [`# ${input.what}`, \"\"];\n lines.push(`**Where:** \\`${input.where}\\``);\n lines.push(\"\", `**Impact:** ${input.impact}`);\n if (input.fix) {\n lines.push(\"\", `**Fix/workaround:** ${input.fix}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n\n const file = memoryFilePath(ctx.paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n throw new Error(`Memory already exists at ${file}`);\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n return { id: frontmatter.id, scope: frontmatter.scope, file_path: file };\n}\n","/**\n * mem_session_end — save a structured end-of-session recap.\n *\n * Engram-inspired: explicit session lifecycle lets the next session start with\n * rich context about what was just done, which files were touched, and what\n * remains. Uses topic-upsert so there is always exactly ONE \"current recap\"\n * per scope/module: revisions accumulate in-place rather than creating clutter.\n */\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n loadMemoriesFromDir,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { clearPendingDistill } from \"../session-tracker.js\";\n\nexport const MemSessionEndInputSchema = {\n goal: z\n .string()\n .min(1)\n .describe(\"What you were trying to accomplish this session (1–2 sentences)\"),\n accomplished: z\n .string()\n .describe(\"What was actually done — bullet list recommended\"),\n discoveries: z\n .string()\n .default(\"\")\n .describe(\n \"Any bugs, inconsistencies, surprises, or missing knowledge found during this session. \" +\n \"Empty if nothing surprising was found.\",\n ),\n files_touched: z\n .array(z.string())\n .default([])\n .describe(\"Key files that were read or modified — used as anchor paths\"),\n next_steps: z\n .string()\n .default(\"\")\n .describe(\"What should happen next (for the next session or a teammate)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility: personal = private to you, team = shared with the team\"),\n module: z\n .string()\n .optional()\n .describe(\"Module name (required when scope=module)\"),\n};\n\nexport type MemSessionEndInput = {\n [K in keyof typeof MemSessionEndInputSchema]: z.infer<(typeof MemSessionEndInputSchema)[K]>;\n};\n\nexport interface MemSessionEndOutput {\n id: string;\n scope: string;\n file_path: string;\n action: \"created\" | \"updated\";\n revision_count: number;\n}\n\n/** Stable topic key for upsert — one recap per scope/module. */\nfunction recapTopic(scope: string, module?: string): string {\n return module ? `session-recap-${scope}-${module}` : `session-recap-${scope}`;\n}\n\nfunction buildBody(input: MemSessionEndInput): string {\n const lines: string[] = [];\n\n lines.push(`## Goal\\n${input.goal}`);\n lines.push(`\\n## Accomplished\\n${input.accomplished}`);\n\n if (input.discoveries.trim()) {\n lines.push(`\\n## Discoveries & surprises\\n${input.discoveries}`);\n }\n\n if (input.files_touched.length > 0) {\n lines.push(`\\n## Files touched\\n${input.files_touched.map((f) => `- \\`${f}\\``).join(\"\\n\")}`);\n }\n\n if (input.next_steps.trim()) {\n lines.push(`\\n## Next steps\\n${input.next_steps}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function memSessionEnd(\n input: MemSessionEndInput,\n ctx: HaiveContext,\n): Promise<MemSessionEndOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n const body = buildBody(input);\n const topic = recapTopic(input.scope, input.module);\n\n // Validate anchor paths exist before saving\n const invalidPaths = input.files_touched.filter(\n (p) => !existsSync(path.resolve(ctx.paths.root, p)),\n );\n if (invalidPaths.length > 0) {\n // Non-blocking for session end — just log in the output\n console.warn(`[haive] session end: anchor path(s) not found: ${invalidPaths.join(\", \")}`);\n }\n\n const existing = existsSync(ctx.paths.memoriesDir)\n ? await loadMemoriesFromDir(ctx.paths.memoriesDir)\n : [];\n\n // ── Topic upsert: update existing recap in-place ───────────────────────\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === topic &&\n memory.frontmatter.scope === input.scope &&\n (!input.module || memory.frontmatter.module === input.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const revisionCount = (fm.revision_count ?? 0) + 1;\n const newFrontmatter = {\n ...fm,\n revision_count: revisionCount,\n anchor: {\n ...fm.anchor,\n paths: input.files_touched.length ? input.files_touched : fm.anchor.paths,\n },\n };\n await writeFile(\n topicMatch.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body }),\n \"utf8\",\n );\n // Clear pending distill — a manual post_task flow completed successfully.\n await clearPendingDistill(ctx);\n return {\n id: fm.id,\n scope: fm.scope,\n file_path: topicMatch.filePath,\n action: \"updated\",\n revision_count: revisionCount,\n };\n }\n\n // ── Create new recap (first session) ──────────────────────────────────\n const frontmatter = buildFrontmatter({\n type: \"session_recap\",\n slug: \"recap\",\n scope: input.scope,\n module: input.module,\n tags: [\"session\", \"recap\"],\n paths: input.files_touched,\n topic,\n status: \"validated\",\n });\n\n const file = memoryFilePath(\n ctx.paths,\n frontmatter.scope,\n frontmatter.id,\n frontmatter.module,\n );\n await mkdir(path.dirname(file), { recursive: true });\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n // A successful manual mem_session_end (post_task flow) means the distillation\n // has been done properly — clear the shallow auto-recap marker so the next\n // get_briefing doesn't ask again.\n await clearPendingDistill(ctx);\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n action: \"created\",\n revision_count: 0,\n };\n}\n","/**\n * Auto-session tracker for autopilot mode.\n *\n * Tracks which MCP tools were called during a server session.\n * On SIGTERM/SIGINT (i.e. when the AI client closes), automatically:\n * 1. Saves a session recap via mem_session_end (always)\n * 2. Writes .ai/.cache/pending-distill.json so the next get_briefing\n * surfaces an action_required item prompting the agent to invoke\n * post_task for a richer LLM-driven distillation.\n */\nimport {\n appendUsageEvent,\n appendRuntimeJournalEntry,\n loadConfig,\n type HaiveConfig,\n} from \"@hiveai/core\";\nimport { mkdir, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport type { HaiveContext } from \"./context.js\";\nimport { memSessionEnd } from \"./tools/mem-session-end.js\";\n\nexport interface SessionEvent {\n tool: string;\n at: string; // ISO timestamp\n /** Partial input snapshot (non-sensitive fields only) */\n summary?: string;\n}\n\n/** Written to .ai/.cache/pending-distill.json at session end. */\nexport interface PendingDistill {\n session_start: string;\n session_end: string;\n total_tool_calls: number;\n /** Human-readable summary of which tools were called (\"get_briefing ×3, mem_save ×2\") */\n tool_summary: string;\n /** IDs of memories saved during this session */\n memories_saved: string[];\n /** True when git diff was captured and stored in git_diff field */\n git_diff_available: boolean;\n /** Snapshot of `git diff HEAD` at session close (truncated to 8 KB) */\n git_diff?: string;\n /** ID of the auto-generated session recap memory */\n recap_id?: string;\n}\n\n/** Path to the pending distill marker file. */\nexport function pendingDistillPath(ctx: HaiveContext): string {\n return path.join(ctx.paths.haiveDir, \".cache\", \"pending-distill.json\");\n}\n\nexport class SessionTracker {\n private events: SessionEvent[] = [];\n private startedAt: string = new Date().toISOString();\n private config: HaiveConfig | null = null;\n private ctx: HaiveContext;\n private shutdownRegistered = false;\n\n constructor(ctx: HaiveContext) {\n this.ctx = ctx;\n }\n\n async init(): Promise<void> {\n this.config = await loadConfig(this.ctx.paths);\n if (this.config.autoSessionEnd) {\n this.registerShutdownHandler();\n }\n }\n\n record(tool: string, summary?: string): void {\n const event: SessionEvent = { tool, at: new Date().toISOString(), summary };\n this.events.push(event);\n // Persist to .ai/.usage/tool-usage.jsonl for cross-session stats (haive stats).\n // Best-effort: never blocks the tool execution, never throws.\n void appendUsageEvent(this.ctx.paths, event);\n }\n\n private registerShutdownHandler(): void {\n if (this.shutdownRegistered) return;\n this.shutdownRegistered = true;\n\n const save = async (): Promise<void> => {\n const writingTools = this.events.filter((e) =>\n [\"mem_save\", \"mem_tried\", \"mem_observe\", \"mem_update\", \"bootstrap_project_save\"].includes(e.tool),\n );\n const totalCalls = this.events.length;\n\n if (totalCalls === 0) return;\n\n const toolSummary = summarizeTools(this.events);\n const filesSet = new Set<string>();\n for (const e of this.events) {\n if (e.summary) {\n const matches = e.summary.match(/[^\\s\"',]+\\.[a-zA-Z]{1,6}/g) ?? [];\n for (const m of matches) filesSet.add(m);\n }\n }\n\n // ── 1. Capture git diff (best-effort, 8 KB cap) ──────────────────────\n let gitDiff: string | undefined;\n try {\n const raw = execSync(\"git diff HEAD\", {\n cwd: this.ctx.paths.root,\n timeout: 5000,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n gitDiff = raw.slice(0, 8192) || undefined;\n } catch { /* not a git repo or no diff — ok */ }\n\n // ── 2. Save minimal session recap ────────────────────────────────────\n let recapId: string | undefined;\n try {\n const result = await memSessionEnd(\n {\n goal: `Auto-captured session (${totalCalls} tool call${totalCalls === 1 ? \"\" : \"s\"})`,\n accomplished: toolSummary,\n discoveries: writingTools.length > 0\n ? `${writingTools.length} memor${writingTools.length === 1 ? \"y\" : \"ies\"} saved during this session.`\n : \"No new memories saved this session.\",\n files_touched: [...filesSet].slice(0, 10),\n next_steps: \"\",\n scope: (this.config?.defaultScope as \"personal\" | \"team\") ?? \"personal\",\n module: undefined,\n },\n this.ctx,\n );\n recapId = result.id;\n } catch {\n // Non-fatal — never block process exit\n }\n\n void appendRuntimeJournalEntry(this.ctx.paths, {\n kind: \"session_end\",\n message: recapId\n ? `auto session close | ${toolSummary} | recap:${recapId}`\n : `auto session close | ${toolSummary}`,\n meta: {\n recap_id: recapId ?? null,\n total_tool_calls: totalCalls,\n },\n });\n\n // ── 3. Write pending-distill.json so next get_briefing can prompt ─────\n // Skip if the agent already ran post_task this session (no shallow recap).\n const ranPostTask = this.events.some((e) =>\n e.tool === \"mem_session_end\" && !e.summary?.startsWith(\"Auto-captured\"),\n );\n if (!ranPostTask && existsSync(this.ctx.paths.haiveDir)) {\n try {\n const memoriesSaved = writingTools\n .map((e) => e.summary ?? \"\")\n .filter(Boolean)\n .slice(0, 20);\n\n const payload: PendingDistill = {\n session_start: this.startedAt,\n session_end: new Date().toISOString(),\n total_tool_calls: totalCalls,\n tool_summary: toolSummary,\n memories_saved: memoriesSaved,\n git_diff_available: !!gitDiff,\n ...(gitDiff ? { git_diff: gitDiff } : {}),\n ...(recapId ? { recap_id: recapId } : {}),\n };\n\n const cacheDir = path.join(this.ctx.paths.haiveDir, \".cache\");\n await mkdir(cacheDir, { recursive: true });\n await writeFile(\n pendingDistillPath(this.ctx),\n JSON.stringify(payload, null, 2) + \"\\n\",\n \"utf8\",\n );\n } catch { /* Non-fatal */ }\n }\n };\n\n process.once(\"SIGTERM\", () => { void save().finally(() => process.exit(0)); });\n process.once(\"SIGINT\", () => { void save().finally(() => process.exit(0)); });\n }\n}\n\n/** Delete the pending distill marker if it exists. Called by mem_session_end. */\nexport async function clearPendingDistill(ctx: HaiveContext): Promise<void> {\n const p = pendingDistillPath(ctx);\n if (existsSync(p)) {\n try { await rm(p); } catch { /* non-fatal */ }\n }\n}\n\nfunction summarizeTools(events: SessionEvent[]): string {\n const counts = new Map<string, number>();\n for (const e of events) {\n counts.set(e.tool, (counts.get(e.tool) ?? 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([t, n]) => `${t} ×${n}`)\n .join(\", \");\n}\n","import { readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n allocateBudget,\n DEFAULT_AUTO_PROMOTE_RULE,\n deriveConfidence,\n estimateTokens,\n extractActionsBriefBody,\n getUsage,\n inferModulesFromPaths,\n isAutoPromoteEligible,\n isDecaying,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadCodeMap,\n loadConfig,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n queryCodeMap,\n resolveBriefingBudget,\n serializeMemory,\n tokenizeQuery,\n trackReads,\n truncateToTokens,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { pendingDistillPath, type PendingDistill } from \"../session-tracker.js\";\n\nexport const GetBriefingInputSchema = {\n task: z\n .string()\n .optional()\n .describe(\n \"What you are about to do, in 1–2 sentences. Used to rank relevant memories semantically.\",\n ),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Project-relative file paths the agent is currently looking at or about to edit\"),\n max_tokens: z\n .number()\n .int()\n .positive()\n .default(8000)\n .describe(\n \"Approximate token budget for the entire briefing. Each section is allocated a share and truncated to fit.\",\n ),\n max_memories: z\n .number()\n .int()\n .positive()\n .default(8)\n .describe(\"Cap on memories surfaced regardless of token budget\"),\n include_project_context: z.boolean().default(true),\n include_module_contexts: z.boolean().default(true),\n semantic: z\n .boolean()\n .default(true)\n .describe(\n \"Use semantic ranking when a task is provided (requires `haive embeddings index`).\",\n ),\n include_stale: z\n .boolean()\n .default(false)\n .describe(\"Include stale memories (excluded by default — they may be outdated)\"),\n track: z.boolean().default(true).describe(\"Increment read_count on returned memories\"),\n format: z\n .enum([\"full\", \"compact\", \"actions\"])\n .default(\"full\")\n .describe(\n \"Output format: 'full' returns memory bodies (honors token budget via truncation); \" +\n \"'compact' returns a 1-line summary per memory (call mem_get for detail); \" +\n \"'actions' squeezes bodies to actionable bullet lines — fewer tokens vs full.\",\n ),\n symbols: z\n .array(z.string())\n .default([])\n .describe(\n \"Symbol names to look up in the code-map (e.g. ['PaymentService', 'TenantFilter']). \" +\n \"Returns the file(s) exporting each symbol so agents don't need to grep. \" +\n \"Requires `haive index code` to have been run.\",\n ),\n min_semantic_score: z\n .number()\n .min(0)\n .max(1)\n .default(0)\n .describe(\n \"Drop semantic-only memory hits whose cosine score is below this threshold. \" +\n \"Useful to avoid weakly-related noise when the task is short or the corpus is broad. \" +\n \"Has no effect on memories matched via anchor/module/literal — those are always kept. \" +\n \"Try 0.25–0.4 for stricter matching.\",\n ),\n budget_preset: z\n .enum([\"quick\", \"balanced\", \"deep\"])\n .optional()\n .describe(\n \"Shortcut token budget: 'quick' minimizes tokens/skip module CONTEXT slices; 'balanced' mirrors historical defaults; \" +\n \"'deep' uses a larger briefing. When set, overrides max_tokens, max_memories, and include_module_contexts.\",\n ),\n};\n\n/** Single inferred type — optional keys are optional (not `| undefined` required everywhere). */\nexport const GetBriefingZod = z.object(GetBriefingInputSchema);\n\nexport type GetBriefingInput = z.infer<typeof GetBriefingZod>;\n\nexport interface BriefingMemory {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n /** Present when confidence is 'low' or 'unverified' — AI should weight this memory cautiously. */\n unverified?: true;\n read_count: number;\n reasons: Array<\"anchor\" | \"module\" | \"domain\" | \"semantic\">;\n match_quality: \"exact\" | \"partial\" | \"semantic\";\n semantic_score?: number;\n body: string;\n file_path: string;\n}\n\nexport interface CodeMapSymbolHit {\n symbol: string;\n /** files that export this symbol */\n locations: Array<{\n file: string;\n kind: string;\n line: number;\n description?: string;\n }>;\n}\n\nexport interface ActionRequiredItem {\n /** Memory id containing the alert */\n id: string;\n /** Short human-readable summary of the issue */\n summary: string;\n /**\n * The exact message to show the developer before doing anything.\n * Copy-paste this verbatim — do NOT paraphrase or act before confirmation.\n */\n developer_message: string;\n}\n\nexport interface BriefingOutput {\n task?: string;\n search_mode: \"semantic\" | \"literal_fallback\" | \"literal\";\n match_quality_note?: string;\n inferred_modules: string[];\n last_session?: { id: string; scope: string; revision_count: number; body: string };\n project_context: { content: string; truncated: boolean; is_template?: boolean; auto_generated?: boolean } | null;\n module_contexts: Array<{ name: string; content: string; truncated: boolean }>;\n memories: BriefingMemory[];\n symbol_locations?: CodeMapSymbolHit[];\n /**\n * Memories that require explicit human confirmation before any code action.\n * IMPORTANT: for each item, show developer_message to the developer and\n * wait for explicit approval before modifying any code.\n * These are surfaced separately from memories to make them impossible to miss.\n */\n action_required: ActionRequiredItem[];\n decay_warnings: string[];\n setup_warnings: string[];\n /**\n * True when this briefing carries little actionable signal:\n * - project-context.md is still the default template\n * - no memories matched the task (or none exist at all)\n * - no previous session recap\n * Clients can use this flag to skip surfacing a near-empty briefing to the model.\n */\n low_value?: true;\n /**\n * Short, action-oriented hints surfaced to the agent based on the briefing payload.\n * Examples: \"haive is uninitialized — use Read/Grep directly\", \"gotcha memories present — read first\".\n * Always non-empty when low_value=true.\n */\n hints?: string[];\n estimated_tokens: number;\n budget: {\n max_tokens: number;\n spent: { project: number; modules: number; memories: number };\n preset_applied?: \"quick\" | \"balanced\" | \"deep\";\n };\n}\n\nexport async function getBriefing(\n input: GetBriefingInput,\n ctx: HaiveContext,\n): Promise<BriefingOutput> {\n const resolvedBudget = resolveBriefingBudget(input.budget_preset, {\n max_tokens: input.max_tokens,\n max_memories: input.max_memories,\n include_module_contexts: input.include_module_contexts,\n });\n const briefingMaxTokens = resolvedBudget.max_tokens;\n const briefingMaxMemories = resolvedBudget.max_memories;\n const briefingIncludeModules = resolvedBudget.include_module_contexts;\n\n const inferred = inferModulesFromPaths(input.files);\n const memories: BriefingMemory[] = [];\n let searchMode: BriefingOutput[\"search_mode\"] = \"literal\";\n let usage: UsageIndex = { version: 1, updated_at: \"\", by_id: {} };\n let byId = new Map<string, LoadedMemory>();\n\n // ── Session recap ──────────────────────────────────────────────────────\n let lastSession: BriefingOutput[\"last_session\"] | undefined;\n\n if (existsSync(ctx.paths.memoriesDir)) {\n const allLoaded = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n\n // Find the most recent session_recap (by created_at) — exclude from main ranking\n const recaps = allLoaded\n .filter(({ memory }) => memory.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 r = recaps[0]!;\n const fm = r.memory.frontmatter;\n lastSession = {\n id: fm.id,\n scope: fm.scope,\n revision_count: fm.revision_count ?? 0,\n body: r.memory.body,\n };\n }\n\n const allMemories = allLoaded.filter(({ memory }) => {\n const s = memory.frontmatter.status;\n if (s === \"rejected\" || s === \"deprecated\") return false;\n if (!input.include_stale && s === \"stale\") return false;\n // session_recap surfaces separately in last_session, not in the ranked memories list\n if (memory.frontmatter.type === \"session_recap\") return false;\n return true;\n });\n usage = await loadUsageIndex(ctx.paths);\n // Build the id→loaded map up-front so the semantic-hits loop below\n // (and the related-id expansion later) can resolve hits to LoadedMemory.\n // Pre-fix: byId was assigned only after the semantic loop, so semantic hits\n // were silently dropped — search_mode said \"semantic\" but no memory ever\n // received a semantic_score. Fixed in v0.5.0.\n byId = new Map(allMemories.map((m) => [m.memory.frontmatter.id, m]));\n const semanticHits = input.task && input.semantic\n ? await trySemanticHits(ctx, input.task, allMemories.length * 2)\n : null;\n\n if (input.task && input.semantic) {\n searchMode = semanticHits ? \"semantic\" : \"literal_fallback\";\n }\n\n const seen = new Map<string, BriefingMemory>();\n\n const addOrUpdate = (\n loaded: LoadedMemory,\n reason: BriefingMemory[\"reasons\"][number],\n score?: number,\n matchQuality?: BriefingMemory[\"match_quality\"],\n ): void => {\n const fm = loaded.memory.frontmatter;\n const existing = seen.get(fm.id);\n if (existing) {\n if (!existing.reasons.includes(reason)) existing.reasons.push(reason);\n if (score !== undefined && (existing.semantic_score ?? 0) < score) {\n existing.semantic_score = score;\n }\n // upgrade match_quality if better evidence found\n if (matchQuality === \"exact\" && existing.match_quality !== \"exact\") {\n existing.match_quality = \"exact\";\n } else if (matchQuality === \"semantic\" && existing.match_quality === \"partial\") {\n existing.match_quality = \"semantic\";\n }\n return;\n }\n const u = getUsage(usage, fm.id);\n seen.set(fm.id, {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n ...(fm.status === \"draft\" || fm.status === \"proposed\" ? { unverified: true as const } : {}),\n read_count: u.read_count,\n reasons: [reason],\n match_quality: matchQuality ?? \"partial\",\n ...(score !== undefined ? { semantic_score: score } : {}),\n body: loaded.memory.body,\n file_path: loaded.filePath,\n });\n };\n\n if (input.files.length > 0) {\n for (const loaded of allMemories) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) addOrUpdate(loaded, \"anchor\", undefined, \"exact\");\n }\n for (const loaded of allMemories) {\n const fm = loaded.memory.frontmatter;\n if (fm.module && inferred.includes(fm.module)) addOrUpdate(loaded, \"module\", undefined, \"partial\");\n if (fm.domain && inferred.includes(fm.domain)) addOrUpdate(loaded, \"domain\", undefined, \"partial\");\n if (fm.tags.some((t) => inferred.includes(t))) addOrUpdate(loaded, \"module\", undefined, \"partial\");\n }\n }\n\n if (input.task) {\n const tokens = tokenizeQuery(input.task);\n // AND first — exact match\n const andHits = allMemories.filter((m) => literalMatchesAllTokens(m.memory, tokens));\n for (const loaded of andHits) {\n addOrUpdate(loaded, \"semantic\", undefined, \"exact\");\n }\n // OR fallback — if AND produced nothing, partial match is better than nothing\n if (andHits.length === 0 && tokens.length > 1) {\n for (const loaded of allMemories) {\n if (literalMatchesAnyToken(loaded.memory, tokens)) {\n addOrUpdate(loaded, \"semantic\", undefined, \"partial\");\n }\n }\n }\n if (semanticHits) {\n for (const hit of semanticHits) {\n // Filter out weakly-related semantic hits when caller asked for a stricter threshold.\n // Memories already attached via anchor/module/literal stay (addOrUpdate just upgrades them).\n if (hit.score < input.min_semantic_score) {\n const existing = seen.get(hit.id);\n if (!existing) continue;\n }\n const loaded = byId.get(hit.id);\n if (loaded) addOrUpdate(loaded, \"semantic\", hit.score, \"semantic\");\n }\n }\n }\n\n const ranked = [...seen.values()].sort((a, b) => {\n const reasonScore = (m: BriefingMemory): number =>\n (m.type === \"attempt\" ? 3 : 0) + // attempt = negative knowledge, surface first to prevent repeating mistakes\n (m.reasons.includes(\"anchor\") ? 4 : 0) +\n (m.reasons.includes(\"module\") ? 2 : 0) +\n (m.reasons.includes(\"semantic\") ? 2 : 0) +\n (m.reasons.includes(\"domain\") ? 1 : 0);\n const confidenceScore = (m: BriefingMemory): number =>\n m.confidence === \"authoritative\" ? 4 :\n m.confidence === \"trusted\" ? 3 :\n m.confidence === \"low\" ? 1 :\n m.confidence === \"stale\" ? -2 : 0;\n const sa = reasonScore(a) + confidenceScore(a) + (a.semantic_score ?? 0);\n const sb = reasonScore(b) + confidenceScore(b) + (b.semantic_score ?? 0);\n return sb - sa;\n });\n\n // Expand related_ids: pull in memories linked from the top results\n // (byId was already populated above, before the semantic-hits loop)\n for (const mem of ranked.slice(0, briefingMaxMemories)) {\n if (seen.size >= briefingMaxMemories * 2) break;\n const loaded = byId.get(mem.id);\n if (!loaded) continue;\n for (const relId of loaded.memory.frontmatter.related_ids ?? []) {\n if (seen.has(relId)) continue;\n const related = byId.get(relId);\n if (related) addOrUpdate(related, \"anchor\", undefined, \"partial\");\n }\n }\n\n memories.push(...ranked.slice(0, briefingMaxMemories));\n\n if (input.track && memories.length > 0) {\n await trackReads(ctx.paths, memories.map((m) => m.id));\n\n // ── Inline auto-promote: promote proposed memories that just crossed minReads\n // Load fresh usage after trackReads incremented the counters.\n const freshUsage = await loadUsageIndex(ctx.paths);\n const cfg = await loadConfig(ctx.paths);\n const rule = {\n minReads: cfg.autoPromoteMinReads ?? DEFAULT_AUTO_PROMOTE_RULE.minReads,\n maxRejections: DEFAULT_AUTO_PROMOTE_RULE.maxRejections,\n };\n for (const m of memories) {\n const loaded = byId.get(m.id);\n if (!loaded) continue;\n const u = getUsage(freshUsage, m.id);\n if (!isAutoPromoteEligible(loaded.memory.frontmatter, u, rule)) continue;\n // Promote in-place\n const newFm = { ...loaded.memory.frontmatter, status: \"validated\" as const };\n try {\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFm, body: loaded.memory.body }),\n \"utf8\",\n );\n // Update the in-memory object so the briefing output reflects validated status\n m.status = \"validated\";\n m.confidence = \"trusted\";\n } catch { /* non-fatal — auto-promote is best-effort */ }\n }\n }\n }\n\n // Build raw section payloads\n const projectContextRaw =\n input.include_project_context && existsSync(ctx.paths.projectContext)\n ? await readFile(ctx.paths.projectContext, \"utf8\")\n : \"\";\n const isTemplateContext =\n projectContextRaw.includes(\"TODO — high-level overview\") ||\n projectContextRaw.includes(\"Generated by `haive init`\");\n\n const setupWarnings: string[] = [];\n let autoContextGenerated = false;\n\n // In autopilot mode: if project-context.md is still the template, auto-generate\n // a minimal context from the code-map so get_briefing is useful immediately.\n let projectContext = isTemplateContext ? \"\" : projectContextRaw;\n if ((isTemplateContext || !existsSync(ctx.paths.projectContext)) && input.include_project_context) {\n const haiveConfig = await loadConfig(ctx.paths);\n if (haiveConfig.autoContext) {\n const codeMap = await loadCodeMap(ctx.paths);\n if (codeMap) {\n const totalFiles = Object.keys(codeMap.files).length;\n const extensions = new Map<string, number>();\n for (const filePath of Object.keys(codeMap.files)) {\n const ext = filePath.slice(filePath.lastIndexOf(\".\") + 1).toLowerCase();\n extensions.set(ext, (extensions.get(ext) ?? 0) + 1);\n }\n const topExts = [...extensions.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([e, n]) => `${e} (${n})`)\n .join(\", \");\n\n // Pick top exported symbols as a starting overview\n const topSymbols = Object.entries(codeMap.files)\n .flatMap(([fp, entry]) =>\n entry.exports.slice(0, 3).map((e) => `${e.name} (${fp.split(\"/\").slice(-2).join(\"/\")})`),\n )\n .slice(0, 15)\n .join(\", \");\n\n projectContext =\n `# Project context (auto-generated by hAIve)\\n\\n` +\n `> ⚠ This is a minimal auto-generated context based on the code-map. ` +\n `Invoke the \\`bootstrap_project\\` MCP prompt to replace it with a full analysis.\\n\\n` +\n `## Codebase overview\\n` +\n `- **${totalFiles} files** indexed in code-map\\n` +\n `- **Main file types:** ${topExts}\\n` +\n `- **Generated at:** ${codeMap.generated_at}\\n\\n` +\n `## Key exports (sample)\\n` +\n topSymbols + \"\\n\";\n\n autoContextGenerated = true;\n setupWarnings.push(\n \"project-context.md is still the default template. \" +\n \"A minimal auto-generated context has been injected from the code-map. \" +\n \"Invoke bootstrap_project to replace it with a full AI-analyzed context.\",\n );\n } else {\n setupWarnings.push(\n \"project-context.md is still the default template and no code-map found. \" +\n \"Run `haive index code` then invoke bootstrap_project for a full context.\",\n );\n }\n } else {\n if (isTemplateContext) {\n setupWarnings.push(\n \"project-context.md still contains the default template. \" +\n \"Invoke the bootstrap_project MCP prompt to auto-fill it from your codebase. \" +\n \"Until then, get_briefing returns no project context.\",\n );\n } else {\n setupWarnings.push(\n \"No project-context.md found. Run `haive init` then invoke the bootstrap_project MCP prompt.\",\n );\n }\n }\n }\n\n const moduleContents = briefingIncludeModules\n ? await loadModuleContexts(ctx, inferred)\n : [];\n\n const memoriesText = memories\n .map((m) => {\n const unverified = m.status === \"proposed\" ? \" [UNVERIFIED — not yet validated]\" : \"\";\n return `### ${m.id} (${m.scope}/${m.type}, ${m.confidence})${unverified}\\n${m.body.trim()}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n // Allocate budget across the three large pieces\n const slices = allocateBudget(\n [\n { key: \"project\", text: projectContext, weight: 3, mode: \"head\" },\n {\n key: \"modules\",\n text: moduleContents.map((m) => `## ${m.name}\\n${m.content}`).join(\"\\n\\n---\\n\\n\"),\n weight: 3,\n mode: \"head\",\n },\n { key: \"memories\", text: memoriesText, weight: 4, mode: \"head\" },\n ],\n briefingMaxTokens,\n );\n\n const projectSlice = slices.find((s) => s.key === \"project\")!;\n const modulesSlice = slices.find((s) => s.key === \"modules\")!;\n const memoriesSlice = slices.find((s) => s.key === \"memories\")!;\n\n const trimmedModules: BriefingOutput[\"module_contexts\"] = [];\n if (modulesSlice.text.length > 0 && moduleContents.length > 0) {\n // Distribute the modules slice across module entries proportionally\n const subSlices = allocateBudget(\n moduleContents.map((m) => ({ key: m.name, text: m.content, weight: 1, mode: \"head\" as const })),\n modulesSlice.allocatedTokens,\n );\n for (const m of moduleContents) {\n const sub = subSlices.find((s) => s.key === m.name)!;\n trimmedModules.push({ name: m.name, content: sub.text, truncated: sub.truncated });\n }\n }\n\n // Recompute memory bodies to fit using a cascade approach:\n // top-ranked memories get full budget first; lower-ranked ones are dropped if budget runs out.\n // This is better than uniform truncation which gives all memories a 37%-fragment.\n const trimmedMemories: BriefingMemory[] = [];\n if (!memoriesSlice.truncated) {\n trimmedMemories.push(...memories);\n } else {\n let remaining = memoriesSlice.allocatedTokens;\n for (const m of memories) {\n const bodyTokens = estimateTokens(m.body);\n if (remaining <= 0) break;\n if (bodyTokens <= remaining) {\n trimmedMemories.push(m);\n remaining -= bodyTokens;\n } else if (remaining > 80) {\n // Enough budget for a meaningful fragment — truncate and include\n const t = truncateToTokens(m.body, { maxTokens: remaining, mode: \"head\" });\n trimmedMemories.push({ ...m, body: t.text });\n remaining = 0;\n }\n // Otherwise skip — too small a fragment to be useful\n }\n }\n\n const totalTokens =\n projectSlice.estimatedTokens + modulesSlice.estimatedTokens + memoriesSlice.estimatedTokens;\n\n // Decay warnings: memories not read in >90 days\n const decayWarnings: string[] = [];\n for (const m of trimmedMemories) {\n const u = getUsage(usage, m.id);\n const loaded = byId.get(m.id);\n const createdAt = loaded?.memory.frontmatter.created_at ?? new Date().toISOString();\n if (isDecaying(u, createdAt)) decayWarnings.push(m.id);\n }\n\n // Compact / actions: squeeze bodies for fewer downstream tokens\n const outputMemories =\n input.format === \"compact\"\n ? trimmedMemories.map((m) => ({ ...m, body: compactSummary(m.body) }))\n : input.format === \"actions\"\n ? trimmedMemories.map((m) => ({\n ...m,\n body: extractActionsBriefBody(m.body),\n }))\n : trimmedMemories;\n\n // ── Code-map symbol lookup ──────────────────────────────────────────────\n // Also auto-look up symbols found in anchor paths of returned memories +\n // any explicit symbols[] the caller requested.\n let symbolLocations: CodeMapSymbolHit[] | undefined;\n const symbolsToLookup = new Set<string>(input.symbols);\n // Auto-collect symbols from memory anchors so agents get locations for free\n for (const m of outputMemories) {\n const loaded = byId.get(m.id);\n for (const sym of loaded?.memory.frontmatter.anchor.symbols ?? []) {\n symbolsToLookup.add(sym);\n }\n }\n if (symbolsToLookup.size > 0) {\n const codeMap = await loadCodeMap(ctx.paths);\n if (codeMap) {\n symbolLocations = [];\n for (const sym of symbolsToLookup) {\n const { files } = queryCodeMap(codeMap, { symbol: sym });\n if (files.length > 0) {\n symbolLocations.push({\n symbol: sym,\n locations: files.flatMap((f) =>\n f.entry.exports\n .filter((e) => e.name.toLowerCase().includes(sym.toLowerCase()))\n .map((e) => ({\n file: f.path,\n kind: e.kind,\n line: e.line,\n ...(e.description ? { description: e.description } : {}),\n })),\n ),\n });\n }\n }\n if (symbolLocations.length === 0) symbolLocations = undefined;\n }\n }\n\n // ── action_required: memories that need explicit human confirmation ──────\n const actionRequired: ActionRequiredItem[] = [];\n for (const m of outputMemories) {\n const loaded = byId.get(m.id);\n if (!loaded?.memory.frontmatter.requires_human_approval) continue;\n\n // Extract the developer message from the memory body (between the > quote block)\n const bodyLines = loaded.memory.body.split(\"\\n\");\n const quoteBlock = bodyLines\n .filter((l) => l.startsWith(\"> \"))\n .map((l) => l.slice(2))\n .join(\" \")\n .replace(/^\\*«\\s*/, \"\")\n .replace(/\\s*»\\*$/, \"\")\n .trim();\n\n // Build a short summary from the first heading\n const headingLine = bodyLines.find((l) => l.startsWith(\"## \"));\n const summary = headingLine?.replace(/^##\\s*/, \"\").trim() ?? m.id;\n\n actionRequired.push({\n id: m.id,\n summary,\n developer_message: quoteBlock ||\n `Une modification externe potentiellement incompatible a été détectée (${m.id}). ` +\n `Veux-tu que j'analyse l'impact et que je propose des mises à jour ?`,\n });\n }\n // Also load action_required memories that weren't in the ranked set\n // (they may not be relevant to the task but are still urgent)\n if (existsSync(ctx.paths.memoriesDir)) {\n const allMems = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n for (const { memory } of allMems) {\n const fm = memory.frontmatter;\n if (!fm.requires_human_approval) continue;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n if (actionRequired.some((a) => a.id === fm.id)) continue; // already included\n\n const bodyLines = memory.body.split(\"\\n\");\n const quoteBlock = bodyLines\n .filter((l) => l.startsWith(\"> \"))\n .map((l) => l.slice(2))\n .join(\" \")\n .replace(/^\\*«\\s*/, \"\")\n .replace(/\\s*»\\*$/, \"\")\n .trim();\n const headingLine = bodyLines.find((l) => l.startsWith(\"## \"));\n const summary = headingLine?.replace(/^##\\s*/, \"\").trim() ?? fm.id;\n\n actionRequired.push({\n id: fm.id,\n summary,\n developer_message: quoteBlock ||\n `Une modification externe potentiellement incompatible a été détectée (${fm.id}). ` +\n `Veux-tu que j'analyse l'impact et que je propose des mises à jour ?`,\n });\n }\n }\n\n // ── pending-distill: prompt agent to run post_task if shallow auto-recap ──\n // If the previous session was closed by autopilot (no manual post_task),\n // surface an action_required item so the LLM host distills learnings via\n // the post_task prompt. Auto-expires after 7 days (stale diff = useless).\n const pendingDistillFile = pendingDistillPath(ctx);\n if (existsSync(pendingDistillFile)) {\n try {\n const raw = await readFile(pendingDistillFile, \"utf8\");\n const pd = JSON.parse(raw) as PendingDistill;\n const ageMs = Date.now() - new Date(pd.session_end).getTime();\n const SEVEN_DAYS = 7 * 24 * 60 * 60 * 1000;\n if (ageMs < SEVEN_DAYS) {\n const savedNote = pd.memories_saved.length > 0\n ? ` ${pd.memories_saved.length} memor${pd.memories_saved.length === 1 ? \"y was\" : \"ies were\"} saved.`\n : \" No memories were saved.\";\n const diffNote = pd.git_diff_available\n ? \" A git diff snapshot is available in the pending-distill file for context.\"\n : \"\";\n actionRequired.push({\n id: \"__pending_distill__\",\n summary: \"Previous session has undistilled learnings — invoke post_task to capture them\",\n developer_message:\n `The previous session (${pd.total_tool_calls} tool calls, ${pd.tool_summary}) ` +\n `was closed by autopilot without a full post_task distillation.${savedNote}${diffNote}\\n\\n` +\n `**Before starting your task:** invoke the MCP prompt \\`post_task\\` to capture any ` +\n `decisions, gotchas, or conventions from that session. This takes ~30 seconds and ` +\n `prevents institutional knowledge from being lost.\\n\\n` +\n `When done, call \\`mem_session_end\\` to acknowledge — this clears the pending distill marker.`,\n });\n } else {\n // Auto-expire stale pending distill (> 7 days old)\n try {\n const { rm } = await import(\"node:fs/promises\");\n await rm(pendingDistillFile);\n } catch { /* non-fatal */ }\n }\n } catch { /* malformed or deleted between check and read — skip */ }\n }\n\n // ── low_value detection + hints ────────────────────────────────────────\n // A briefing is \"low value\" when the project has not been initialized yet\n // (template context + zero memories + no past session). Clients can short-circuit\n // and tell the model to use plain Read/Grep instead of paying for a near-empty briefing.\n const memoriesEmpty = outputMemories.length === 0;\n const hasMemoriesDir = existsSync(ctx.paths.memoriesDir);\n const isColdStart =\n isTemplateContext &&\n memoriesEmpty &&\n !lastSession &&\n !autoContextGenerated;\n\n const hints: string[] = [];\n if (isColdStart) {\n hints.push(\n \"haive is uninitialized for this project (project-context.md is template, \" +\n \"0 memories, no past session). Skip future get_briefing calls until memories exist — \" +\n \"use Read/Grep directly. Run `haive init` and the bootstrap_project prompt to fix.\",\n );\n } else {\n if (outputMemories.some((m) => m.type === \"attempt\")) {\n hints.push(\n \"⚠️ One or more 'attempt' memories matched — these document failed approaches. \" +\n \"Read them BEFORE writing code to avoid repeating the mistake.\",\n );\n }\n if (outputMemories.some((m) => m.type === \"gotcha\")) {\n hints.push(\n \"Gotcha memories matched — non-obvious traps. Verify the 'how to apply' line still holds \" +\n \"before assuming behavior.\",\n );\n }\n if (memoriesEmpty && hasMemoriesDir && input.task) {\n hints.push(\n \"No memories matched this task. Try mem_search with broader/different terms, \" +\n \"or call mem_for_files with the files you intend to edit.\",\n );\n }\n if (input.task && outputMemories.length > 0 && actionRequired.length === 0) {\n // Encourage capturing new knowledge proactively.\n hints.push(\n \"After completing the task: capture new gotchas with mem_observe, \" +\n \"failed approaches with mem_tried, validated patterns with mem_save.\",\n );\n }\n if (\n outputMemories.length > 2 &&\n !input.budget_preset &&\n input.task &&\n !hints.some((h) => h.includes(\"budget_preset\"))\n ) {\n hints.push(\n \"For tighter token budgets on small tasks pass budget_preset:'quick'; \" +\n \"for refactor-sized work use budget_preset:'deep'.\",\n );\n }\n }\n\n return {\n ...(input.task ? { task: input.task } : {}),\n search_mode: searchMode,\n inferred_modules: inferred,\n ...(lastSession ? { last_session: lastSession } : {}),\n project_context: (projectContextRaw || autoContextGenerated)\n ? {\n content: projectSlice.text,\n truncated: projectSlice.truncated,\n ...(isTemplateContext && !autoContextGenerated ? { is_template: true } : {}),\n ...(autoContextGenerated ? { auto_generated: true } : {}),\n }\n : null,\n module_contexts: trimmedModules,\n memories: outputMemories,\n ...(symbolLocations ? { symbol_locations: symbolLocations } : {}),\n action_required: actionRequired,\n decay_warnings: decayWarnings,\n setup_warnings: setupWarnings,\n ...(isColdStart ? { low_value: true as const } : {}),\n ...(hints.length > 0 ? { hints } : {}),\n estimated_tokens: totalTokens,\n budget: {\n max_tokens: briefingMaxTokens,\n ...(input.budget_preset ? { preset_applied: input.budget_preset } : {}),\n spent: {\n project: projectSlice.estimatedTokens,\n modules: modulesSlice.estimatedTokens,\n memories: memoriesSlice.estimatedTokens,\n },\n },\n };\n}\n\nfunction compactSummary(body: string): string {\n for (const line of body.split(\"\\n\")) {\n const trimmed = line.replace(/^#+\\s*/, \"\").trim();\n if (trimmed.length > 0) return trimmed.slice(0, 120);\n }\n return body.slice(0, 120);\n}\n\nasync function trySemanticHits(\n ctx: HaiveContext,\n task: string,\n limit: number,\n): Promise<Array<{ id: string; score: number }> | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, task, { limit });\n if (!result) return null;\n return result.hits.map((h) => ({ id: h.id, score: h.score }));\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n): Promise<Array<{ name: string; content: string }>> {\n if (modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n\n// Re-export estimateTokens at the module level for tests.\nexport { estimateTokens };\n","import { estimateTokens, loadCodeMap, queryCodeMap } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const CodeMapInputSchema = {\n file: z\n .string()\n .optional()\n .describe(\"Filter to files whose path contains this substring\"),\n symbol: z\n .string()\n .optional()\n .describe(\"Filter to files exporting a symbol whose name contains this substring\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\n \"Filter to files under any of these path prefixes (e.g. ['packages/mcp/src/tools/', 'src/auth/']). \" +\n \"OR-joined with `file` substring; useful to get a focused view of one module.\",\n ),\n max_files: z\n .number()\n .int()\n .positive()\n .default(40)\n .describe(\"Cap on returned files (hard limit, applied after token budget)\"),\n max_tokens: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"Approximate token budget for the response. When the matching set exceeds it, \" +\n \"files are ranked by export density (exports per LOC) and the highest-signal ones are kept first. \" +\n \"Omit to disable budgeting (legacy behavior).\",\n ),\n};\n\nexport const CodeMapInputZod = z.object(CodeMapInputSchema);\nexport type CodeMapInput = z.infer<typeof CodeMapInputZod>;\n\nexport interface CodeMapToolOutput {\n available: boolean;\n generated_at?: string;\n total_files?: number;\n files: Array<{\n path: string;\n summary?: string;\n loc: number;\n exports: Array<{ name: string; kind: string; description?: string; line: number }>;\n }>;\n /** Number of matched files dropped due to max_files / max_tokens. */\n truncated?: number;\n /** True when at least one file was dropped to fit the token budget. */\n budget_clipped?: true;\n notice?: string;\n}\n\nexport async function codeMapTool(\n input: CodeMapInput,\n ctx: HaiveContext,\n): Promise<CodeMapToolOutput> {\n const map = await loadCodeMap(ctx.paths);\n if (!map) {\n return {\n available: false,\n files: [],\n notice: \"No code map found. Run `haive index code` to generate `.ai/code-map.json`.\",\n };\n }\n const { files: matched } = queryCodeMap(map, { file: input.file, symbol: input.symbol });\n\n // Apply `paths` prefix filter on top of the substring match (OR within paths, AND with file).\n const pathsFiltered = input.paths.length === 0\n ? matched\n : matched.filter((f) => input.paths.some((p) => f.path.startsWith(stripLeadingSlash(p))));\n\n // Default order: alphabetical by path (predictable for callers).\n const alphabetical = [...pathsFiltered].sort((a, b) => a.path.localeCompare(b.path));\n\n let kept = alphabetical;\n let budgetClipped = false;\n if (input.max_tokens !== undefined) {\n // Density-rank to PICK which files to KEEP under budget, then re-sort alphabetically for output.\n const byDensity = [...alphabetical].sort((a, b) => {\n const da = density(a.entry.exports.length, a.entry.loc);\n const db = density(b.entry.exports.length, b.entry.loc);\n if (da !== db) return db - da;\n return a.path.localeCompare(b.path);\n });\n const keepSet = new Set<string>();\n let spent = 0;\n for (const f of byDensity) {\n const cost = estimateFileEntryTokens(f);\n if (spent + cost > input.max_tokens && keepSet.size > 0) {\n budgetClipped = true;\n break;\n }\n keepSet.add(f.path);\n spent += cost;\n }\n if (budgetClipped) {\n kept = alphabetical.filter((f) => keepSet.has(f.path));\n }\n }\n\n const finalFiles = kept.slice(0, input.max_files);\n const totalDropped = pathsFiltered.length - finalFiles.length;\n\n return {\n available: true,\n generated_at: map.generated_at,\n total_files: Object.keys(map.files).length,\n files: finalFiles.map((f) => ({\n path: f.path,\n ...(f.entry.summary ? { summary: f.entry.summary } : {}),\n loc: f.entry.loc,\n exports: f.entry.exports,\n })),\n ...(totalDropped > 0 ? { truncated: totalDropped } : {}),\n ...(budgetClipped ? { budget_clipped: true as const } : {}),\n };\n}\n\nfunction density(exports: number, loc: number): number {\n if (loc <= 0) return 0;\n return exports / Math.max(loc, 1);\n}\n\nfunction stripLeadingSlash(p: string): string {\n return p.startsWith(\"/\") ? p.slice(1) : p;\n}\n\nfunction estimateFileEntryTokens(f: { path: string; entry: { summary?: string; loc: number; exports: Array<{ name: string; kind: string; description?: string; line: number }> } }): number {\n // Rough payload size: path + summary + each export (~6 tokens for name+kind+line + description).\n const exportsCost = f.entry.exports.reduce(\n (acc, e) => acc + 6 + estimateTokens(e.description ?? \"\"),\n 0,\n );\n return estimateTokens(f.path) + estimateTokens(f.entry.summary ?? \"\") + exportsCost + 4;\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDiffInputSchema = {\n id_a: z.string().min(1).describe(\"First memory id\"),\n id_b: z.string().min(1).describe(\"Second memory id\"),\n};\n\nexport type MemDiffInput = {\n [K in keyof typeof MemDiffInputSchema]: z.infer<(typeof MemDiffInputSchema)[K]>;\n};\n\nexport interface MemDiffOutput {\n id_a: string;\n id_b: string;\n frontmatter_diff: Record<string, { a: unknown; b: unknown }>;\n body_diff: {\n lines_only_in_a: string[];\n lines_only_in_b: string[];\n common_lines: number;\n };\n}\n\nexport async function memDiff(input: MemDiffInput, ctx: HaiveContext): Promise<MemDiffOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const foundA = all.find((m) => m.memory.frontmatter.id === input.id_a);\n const foundB = all.find((m) => m.memory.frontmatter.id === input.id_b);\n if (!foundA) throw new Error(`No memory with id \"${input.id_a}\".`);\n if (!foundB) throw new Error(`No memory with id \"${input.id_b}\".`);\n\n const fmA = foundA.memory.frontmatter as Record<string, unknown>;\n const fmB = foundB.memory.frontmatter as Record<string, unknown>;\n\n const frontmatterDiff: Record<string, { a: unknown; b: unknown }> = {};\n const allKeys = new Set([...Object.keys(fmA), ...Object.keys(fmB)]);\n for (const key of allKeys) {\n const va = fmA[key];\n const vb = fmB[key];\n if (JSON.stringify(va) !== JSON.stringify(vb)) {\n frontmatterDiff[key] = { a: va, b: vb };\n }\n }\n\n const linesA = new Set(foundA.memory.body.split(\"\\n\").map((l) => l.trim()).filter(Boolean));\n const linesB = new Set(foundB.memory.body.split(\"\\n\").map((l) => l.trim()).filter(Boolean));\n\n const onlyA = [...linesA].filter((l) => !linesB.has(l));\n const onlyB = [...linesB].filter((l) => !linesA.has(l));\n const common = [...linesA].filter((l) => linesB.has(l)).length;\n\n return {\n id_a: input.id_a,\n id_b: input.id_b,\n frontmatter_diff: frontmatterDiff,\n body_diff: {\n lines_only_in_a: onlyA,\n lines_only_in_b: onlyB,\n common_lines: common,\n },\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetRecapInputSchema = {\n scope: z\n .enum([\"personal\", \"team\", \"any\"])\n .default(\"any\")\n .describe(\n \"Limit to a specific scope's recap. Default 'any' returns the most recent recap \" +\n \"across both personal and team scopes.\",\n ),\n};\n\nexport type GetRecapInput = {\n [K in keyof typeof GetRecapInputSchema]: z.infer<(typeof GetRecapInputSchema)[K]>;\n};\n\nexport interface GetRecapOutput {\n recap: {\n id: string;\n scope: string;\n revision_count: number;\n created_at: string;\n body: string;\n } | null;\n notice?: string;\n}\n\n/**\n * Lightweight alternative to get_briefing when you ONLY need the previous\n * session recap (e.g. resuming a long task between sessions). Skips project\n * context, modules, and memory ranking — pays only the recap's token cost.\n */\nexport async function getRecap(\n input: GetRecapInput,\n ctx: HaiveContext,\n): Promise<GetRecapOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { recap: null, notice: \"No .ai/memories directory — haive not initialized here.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const recaps = all\n .filter(({ memory }) => memory.frontmatter.type === \"session_recap\")\n .filter(({ memory }) => input.scope === \"any\" || memory.frontmatter.scope === input.scope)\n .sort(\n (a, b) =>\n new Date(b.memory.frontmatter.created_at).getTime() -\n new Date(a.memory.frontmatter.created_at).getTime(),\n );\n\n if (recaps.length === 0) {\n return {\n recap: null,\n notice:\n input.scope === \"any\"\n ? \"No session recap saved yet. Run mem_session_end (or post_task prompt) to capture one.\"\n : `No session recap found in scope '${input.scope}'.`,\n };\n }\n\n const r = recaps[0]!;\n const fm = r.memory.frontmatter;\n return {\n recap: {\n id: fm.id,\n scope: fm.scope,\n revision_count: fm.revision_count ?? 0,\n created_at: fm.created_at,\n body: r.memory.body,\n },\n };\n}\n","import { z } from \"zod\";\nimport { getBriefing, type BriefingMemory, type GetBriefingInput } from \"./get-briefing.js\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRelevantToInputSchema = {\n task: z\n .string()\n .min(1)\n .describe(\"What you are about to do, in 1–2 sentences. Used to rank relevant memories.\"),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Optional: files you are about to edit — surfaces anchored memories.\"),\n limit: z\n .number()\n .int()\n .positive()\n .max(30)\n .default(8)\n .describe(\"Cap on returned memories.\"),\n min_semantic_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.25)\n .describe(\"Drop weakly-related semantic hits below this cosine threshold.\"),\n format: z\n .enum([\"full\", \"compact\", \"actions\"])\n .default(\"full\")\n .describe(\"'compact' = id + 1-line summary; 'full' = complete bodies; 'actions' = bullet-first excerpts.\"),\n};\n\nexport type MemRelevantToInput = {\n [K in keyof typeof MemRelevantToInputSchema]: z.infer<(typeof MemRelevantToInputSchema)[K]>;\n};\n\nexport interface MemRelevantToOutput {\n task: string;\n search_mode: \"semantic\" | \"literal_fallback\" | \"literal\";\n memories: BriefingMemory[];\n hints?: string[];\n /**\n * True when the search returned zero memories — clients can skip surfacing\n * an empty payload to the model.\n */\n empty?: true;\n}\n\n/**\n * One-shot ranked memories for a task. Use instead of get_briefing when you\n * already have project context loaded and only want the relevant memory layer.\n *\n * Runs the same ranking (anchor / module / literal / semantic) as get_briefing\n * but skips project_context, module_contexts, action_required, etc. — paying\n * only the cost of the memory bodies you actually get back.\n */\nexport async function memRelevantTo(\n input: MemRelevantToInput,\n ctx: HaiveContext,\n): Promise<MemRelevantToOutput> {\n // Reuse the briefing pipeline but turn off the heavy bits.\n const briefingInput: GetBriefingInput = {\n task: input.task,\n files: input.files,\n max_tokens: 16000,\n max_memories: input.limit,\n include_project_context: false,\n include_module_contexts: false,\n semantic: true,\n include_stale: false,\n track: true,\n format: input.format,\n symbols: [],\n min_semantic_score: input.min_semantic_score,\n };\n\n const briefing = await getBriefing(briefingInput, ctx);\n\n const out: MemRelevantToOutput = {\n task: input.task,\n search_mode: briefing.search_mode,\n memories: briefing.memories,\n };\n if (briefing.hints && briefing.hints.length > 0) out.hints = briefing.hints;\n if (briefing.memories.length === 0) out.empty = true;\n return out;\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const CodeSearchInputSchema = {\n query: z\n .string()\n .min(1)\n .describe(\n \"Natural-language description of what you are looking for in the codebase \" +\n \"(e.g. 'function that hashes passwords', 'JWT signing logic', 'route registration').\",\n ),\n k: z\n .number()\n .int()\n .positive()\n .max(50)\n .default(5)\n .describe(\"Number of top hits to return.\"),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.2)\n .describe(\n \"Minimum cosine similarity. Hits below this threshold are dropped to avoid noise. \" +\n \"Try 0.3+ for stricter matching.\",\n ),\n};\n\nexport type CodeSearchInput = {\n [K in keyof typeof CodeSearchInputSchema]: z.infer<(typeof CodeSearchInputSchema)[K]>;\n};\n\nexport interface CodeSearchHit {\n file: string;\n name: string;\n kind: string;\n line: number;\n description?: string;\n score: number;\n}\n\nexport interface CodeSearchOutput {\n available: boolean;\n hits: CodeSearchHit[];\n notice?: string;\n}\n\nexport async function codeSearch(\n input: CodeSearchInput,\n ctx: HaiveContext,\n): Promise<CodeSearchOutput> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return {\n available: false,\n hits: [],\n notice:\n \"@hiveai/embeddings is not installed. Install it (`pnpm add @hiveai/embeddings`) \" +\n \"and run `haive index code-search` to enable semantic code search.\",\n };\n }\n\n const result = await mod.codeSemanticSearch(ctx.paths, input.query, {\n limit: input.k,\n minScore: input.min_score,\n });\n\n if (!result) {\n return {\n available: false,\n hits: [],\n notice:\n \"Code semantic-search index not built. Run `haive index code-search` to generate it \" +\n \"(builds embeddings for every exported symbol in the code-map).\",\n };\n }\n\n return { available: true, hits: result.hits };\n}\n","import { existsSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport {\n deriveConfidence,\n getUsage,\n loadCodeMap,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const WhyThisFileInputSchema = {\n path: z\n .string()\n .min(1)\n .describe(\n \"Project-relative path to the file you want context on (e.g. 'packages/mcp/src/tools/mem-save.ts').\",\n ),\n git_log_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"How many recent commits touching this file to include.\"),\n memory_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"Cap on memories anchored to this path.\"),\n};\n\nexport type WhyThisFileInput = {\n [K in keyof typeof WhyThisFileInputSchema]: z.infer<(typeof WhyThisFileInputSchema)[K]>;\n};\n\nexport interface WhyThisFileOutput {\n file: string;\n exists: boolean;\n recent_commits: Array<{ sha: string; author: string; relative_date: string; subject: string }>;\n memories: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n body_preview: string;\n }>;\n code_map_entry: {\n summary?: string;\n loc: number;\n exports: Array<{ name: string; kind: string; line: number; description?: string }>;\n } | null;\n hints?: string[];\n}\n\n/**\n * One-shot file-context lookup: combines recent git history, memories anchored\n * to the path, and the code-map entry. Designed to answer \"why is this file\n * the way it is?\" in a single call instead of 3-4 manual ones.\n */\nexport async function whyThisFile(\n input: WhyThisFileInput,\n ctx: HaiveContext,\n): Promise<WhyThisFileOutput> {\n const fileExists = existsSync(path.join(ctx.paths.root, input.path));\n\n const [commits, memories, codeMap] = await Promise.all([\n runGitLog(ctx.paths.root, input.path, input.git_log_limit).catch(() => []),\n collectAnchoredMemories(ctx, input.path, input.memory_limit),\n loadCodeMap(ctx.paths),\n ]);\n\n const codeMapEntry = codeMap?.files[input.path];\n\n const hints: string[] = [];\n if (!fileExists) {\n hints.push(`File '${input.path}' does not exist on disk — path may be wrong or file removed.`);\n }\n if (commits.length === 0 && fileExists) {\n hints.push(\"No git history found — file may be untracked or git not initialized.\");\n }\n if (memories.length === 0 && fileExists) {\n hints.push(\n \"No memories anchored here. If you discover something non-obvious while editing, \" +\n \"use mem_observe (with where=\" + input.path + \") to capture it.\",\n );\n }\n if (memories.some((m) => m.type === \"attempt\" || m.type === \"gotcha\")) {\n hints.push(\"⚠️ attempt/gotcha memories anchored to this file — read them BEFORE editing.\");\n }\n\n return {\n file: input.path,\n exists: fileExists,\n recent_commits: commits,\n memories,\n code_map_entry: codeMapEntry\n ? {\n ...(codeMapEntry.summary ? { summary: codeMapEntry.summary } : {}),\n loc: codeMapEntry.loc,\n exports: codeMapEntry.exports.map((e) => ({\n name: e.name,\n kind: e.kind,\n line: e.line,\n ...(e.description ? { description: e.description } : {}),\n })),\n }\n : null,\n ...(hints.length > 0 ? { hints } : {}),\n };\n}\n\nasync function collectAnchoredMemories(\n ctx: HaiveContext,\n filePath: string,\n limit: number,\n): Promise<WhyThisFileOutput[\"memories\"]> {\n if (!existsSync(ctx.paths.memoriesDir)) return [];\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const out: WhyThisFileOutput[\"memories\"] = [];\n for (const { memory } of all) {\n const fm = memory.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n if (fm.type === \"session_recap\") continue;\n if (!memoryMatchesAnchorPaths(memory, [filePath])) continue;\n const u = getUsage(usage, fm.id);\n out.push({\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n confidence: deriveConfidence(fm, u),\n body_preview: memory.body.split(\"\\n\").slice(0, 6).join(\"\\n\"),\n });\n if (out.length >= limit) break;\n }\n return out;\n}\n\nasync function runGitLog(\n cwd: string,\n filePath: string,\n limit: number,\n): Promise<WhyThisFileOutput[\"recent_commits\"]> {\n const sep = \"<<HV>>\";\n const fmt = `%h${sep}%an${sep}%ar${sep}%s`;\n const output = await runCommand(\n \"git\",\n [\"log\", `-n`, String(limit), `--pretty=format:${fmt}`, \"--\", filePath],\n cwd,\n );\n if (!output.trim()) return [];\n return output\n .split(\"\\n\")\n .map((line) => {\n const [sha = \"\", author = \"\", relative_date = \"\", subject = \"\"] = line.split(sep);\n return { sha, author, relative_date, subject };\n })\n .filter((c) => c.sha);\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) => {\n stdout += chunk.toString();\n });\n proc.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\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","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n literalMatchesAnyToken,\n memoryMatchesAnchorPaths,\n tokenizeQuery,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const AntiPatternsCheckInputSchema = {\n diff: z\n .string()\n .optional()\n .describe(\n \"Raw unified diff text (or any code/text snippet) to scan for previously documented anti-patterns. \" +\n \"Tokens from the diff are used to match memory bodies and the embeddings index.\",\n ),\n paths: z\n .array(z.string())\n .default([])\n .describe(\n \"File paths affected by the change. Memories anchored to any of these paths are surfaced regardless of the diff content.\",\n ),\n limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(8)\n .describe(\"Cap on returned warnings.\"),\n semantic: z\n .boolean()\n .default(true)\n .describe(\n \"When true, also use semantic search (requires @hiveai/embeddings + memory index) to find related anti-patterns.\",\n ),\n};\n\nexport type AntiPatternsCheckInput = {\n [K in keyof typeof AntiPatternsCheckInputSchema]: z.infer<(typeof AntiPatternsCheckInputSchema)[K]>;\n};\n\nexport interface AntiPatternsWarning {\n id: string;\n type: \"attempt\" | \"gotcha\";\n scope: string;\n confidence: string;\n body_preview: string;\n reasons: Array<\"anchor\" | \"literal\" | \"semantic\">;\n semantic_score?: number;\n}\n\nexport interface AntiPatternsCheckOutput {\n /** Total number of attempt+gotcha memories that exist in this project. */\n scanned: number;\n warnings: AntiPatternsWarning[];\n notice?: string;\n}\n\n/**\n * Scan a diff (or set of paths) against documented attempt/gotcha memories.\n * Surfaces \"you are about to repeat a known mistake\" warnings BEFORE you commit.\n *\n * Matching strategy:\n * 1. Anchor — memories anchored to any of the changed paths\n * 2. Literal — tokens from the diff overlap with memory body\n * 3. Semantic — cosine similarity (when enabled and index available)\n */\nexport async function antiPatternsCheck(\n input: AntiPatternsCheckInput,\n ctx: HaiveContext,\n): Promise<AntiPatternsCheckOutput> {\n if (!input.diff && input.paths.length === 0) {\n return {\n scanned: 0,\n warnings: [],\n notice: \"Nothing to check — provide either `diff` text or `paths`.\",\n };\n }\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { scanned: 0, warnings: [], notice: \"No .ai/memories directory — nothing to check against.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const negative = all.filter(({ memory }) => {\n const t = memory.frontmatter.type;\n if (t !== \"attempt\" && t !== \"gotcha\") return false;\n const s = memory.frontmatter.status;\n return s !== \"rejected\" && s !== \"deprecated\" && s !== \"stale\";\n });\n\n if (negative.length === 0) {\n return { scanned: 0, warnings: [], notice: \"No attempt/gotcha memories found yet.\" };\n }\n\n const usage = await loadUsageIndex(ctx.paths);\n const seen = new Map<string, AntiPatternsWarning>();\n\n const upsert = (\n fm: { id: string; type: string; scope: string },\n body: string,\n reason: AntiPatternsWarning[\"reasons\"][number],\n score?: number,\n ): void => {\n const existing = seen.get(fm.id);\n if (existing) {\n if (!existing.reasons.includes(reason)) existing.reasons.push(reason);\n if (score !== undefined && (existing.semantic_score ?? 0) < score) {\n existing.semantic_score = score;\n }\n return;\n }\n const u = getUsage(usage, fm.id);\n seen.set(fm.id, {\n id: fm.id,\n type: fm.type as \"attempt\" | \"gotcha\",\n scope: fm.scope,\n confidence: deriveConfidence(fm as Parameters<typeof deriveConfidence>[0], u),\n body_preview: body.split(\"\\n\").slice(0, 5).join(\"\\n\").slice(0, 400),\n reasons: [reason],\n ...(score !== undefined ? { semantic_score: score } : {}),\n });\n };\n\n // 1. Anchor matches\n if (input.paths.length > 0) {\n for (const { memory } of negative) {\n if (memoryMatchesAnchorPaths(memory, input.paths)) {\n upsert(memory.frontmatter, memory.body, \"anchor\");\n }\n }\n }\n\n // 2. Literal token overlap from diff\n if (input.diff) {\n const tokens = tokenizeQuery(input.diff);\n if (tokens.length > 0) {\n for (const { memory } of negative) {\n if (literalMatchesAnyToken(memory, tokens)) {\n upsert(memory.frontmatter, memory.body, \"literal\");\n }\n }\n }\n }\n\n // 3. Semantic search\n if (input.semantic && input.diff) {\n try {\n const mod = await import(\"@hiveai/embeddings\");\n const result = await mod.semanticSearch(ctx.paths, input.diff, { limit: input.limit * 2 });\n if (result) {\n const negativeIds = new Set(negative.map(({ memory }) => memory.frontmatter.id));\n for (const hit of result.hits) {\n if (!negativeIds.has(hit.id)) continue;\n const found = negative.find(({ memory }) => memory.frontmatter.id === hit.id);\n if (found) upsert(found.memory.frontmatter, found.memory.body, \"semantic\", hit.score);\n }\n }\n } catch {\n // embeddings not installed — silently skip semantic\n }\n }\n\n // Rank: anchor > literal > semantic, then by confidence\n const warnings = [...seen.values()]\n .sort((a, b) => {\n const score = (w: AntiPatternsWarning): number => {\n const reasonW =\n (w.reasons.includes(\"anchor\") ? 4 : 0) +\n (w.reasons.includes(\"literal\") ? 2 : 0) +\n (w.reasons.includes(\"semantic\") ? 1 : 0);\n const confW =\n w.confidence === \"authoritative\" ? 3 :\n w.confidence === \"trusted\" ? 2 :\n w.confidence === \"low\" ? 1 : 0;\n return reasonW + confW + (w.semantic_score ?? 0);\n };\n return score(b) - score(a);\n })\n .slice(0, input.limit);\n\n return {\n scanned: negative.length,\n warnings,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n tokenizeQuery,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDistillInputSchema = {\n since_days: z\n .number()\n .int()\n .positive()\n .default(30)\n .describe(\"Only consider memories created in the last N days.\"),\n min_cluster: z\n .number()\n .int()\n .min(2)\n .default(3)\n .describe(\"Minimum cluster size to surface.\"),\n type_filter: z\n .enum([\"gotcha\", \"attempt\", \"all\"])\n .default(\"gotcha\")\n .describe(\n \"Memory type to scan. 'gotcha' targets observe-style discoveries that recur, \" +\n \"'attempt' surfaces failed approaches that repeat, 'all' considers both.\",\n ),\n scope: z\n .enum([\"personal\", \"team\", \"module\", \"any\"])\n .default(\"any\")\n .describe(\"Restrict to a specific scope.\"),\n};\n\nexport type MemDistillInput = {\n [K in keyof typeof MemDistillInputSchema]: z.infer<(typeof MemDistillInputSchema)[K]>;\n};\n\nexport interface DistillCluster {\n suggested_topic: string;\n suggested_type: \"convention\" | \"gotcha\";\n member_ids: string[];\n overlapping_paths: string[];\n common_keywords: string[];\n sample_titles: string[];\n /** ISO date of the latest member */\n latest_at: string;\n}\n\nexport interface MemDistillOutput {\n scanned: number;\n /** Memories that didn't fit any cluster (kept here so callers can inspect singletons). */\n singletons: number;\n clusters: DistillCluster[];\n notice?: string;\n}\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\nconst STOP_WORDS = new Set([\n \"the\",\"and\",\"for\",\"with\",\"that\",\"this\",\"from\",\"into\",\"when\",\"then\",\"also\",\"must\",\n \"have\",\"does\",\"not\",\"but\",\"you\",\"your\",\"its\",\"because\",\"why\",\"how\",\"what\",\n \"use\",\"using\",\"used\",\"add\",\"added\",\"make\",\"made\",\"fix\",\"fixed\",\"bug\",\"error\",\n]);\n\n/**\n * Cluster recurring observations / attempts so a human can collapse N similar\n * memories into one richer convention/gotcha. Uses cheap heuristics (anchor\n * path overlap + body keyword overlap) — no embeddings needed.\n *\n * Output is *advisory*: nothing is written to disk. The caller (CLI / human)\n * decides whether to mem_save the consolidated form.\n */\nexport async function memDistill(\n input: MemDistillInput,\n ctx: HaiveContext,\n): Promise<MemDistillOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { scanned: 0, singletons: 0, clusters: [], notice: \"No .ai/memories directory.\" };\n }\n\n const cutoff = Date.now() - input.since_days * MS_PER_DAY;\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const candidates = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\" || fm.status === \"stale\") return false;\n if (input.scope !== \"any\" && fm.scope !== input.scope) return false;\n if (input.type_filter === \"gotcha\" && fm.type !== \"gotcha\") return false;\n if (input.type_filter === \"attempt\" && fm.type !== \"attempt\") return false;\n if (input.type_filter === \"all\" && fm.type !== \"gotcha\" && fm.type !== \"attempt\") return false;\n if (Date.parse(fm.created_at) < cutoff) return false;\n return true;\n });\n\n if (candidates.length < input.min_cluster) {\n return {\n scanned: candidates.length,\n singletons: candidates.length,\n clusters: [],\n notice: candidates.length === 0\n ? `No matching memories in the last ${input.since_days} days.`\n : `Only ${candidates.length} candidate${candidates.length === 1 ? \"\" : \"s\"} — below min_cluster=${input.min_cluster}.`,\n };\n }\n\n // Pre-compute features per memory: keyword set + path set\n const features = candidates.map((loaded) => ({\n loaded,\n keywords: keywordSet(loaded),\n paths: new Set<string>(loaded.memory.frontmatter.anchor.paths),\n }));\n\n // Single-linkage clustering: union-find by similarity threshold.\n const parent: number[] = features.map((_, i) => i);\n const find = (i: number): number => (parent[i] === i ? i : (parent[i] = find(parent[i] ?? 0)));\n const union = (a: number, b: number): void => {\n const ra = find(a), rb = find(b);\n if (ra !== rb) parent[ra] = rb;\n };\n\n for (let i = 0; i < features.length; i++) {\n for (let j = i + 1; j < features.length; j++) {\n const fi = features[i]!, fj = features[j]!;\n const pathSim = jaccard(fi.paths, fj.paths);\n const kwSim = jaccard(fi.keywords, fj.keywords);\n // Either strong path overlap OR strong keyword overlap qualifies.\n if (pathSim >= 0.5 || kwSim >= 0.4) union(i, j);\n }\n }\n\n // Group by root parent\n const groups = new Map<number, number[]>();\n for (let i = 0; i < features.length; i++) {\n const root = find(i);\n const arr = groups.get(root) ?? [];\n arr.push(i);\n groups.set(root, arr);\n }\n\n const clusters: DistillCluster[] = [];\n let singletons = 0;\n for (const indices of groups.values()) {\n if (indices.length < input.min_cluster) {\n singletons += indices.length;\n continue;\n }\n const members = indices.map((i) => features[i]!);\n const allPaths = new Set<string>();\n const allKeywords = new Map<string, number>();\n let latest = 0;\n for (const m of members) {\n for (const p of m.paths) allPaths.add(p);\n for (const k of m.keywords) allKeywords.set(k, (allKeywords.get(k) ?? 0) + 1);\n const t = Date.parse(m.loaded.memory.frontmatter.created_at);\n if (t > latest) latest = t;\n }\n const commonKeywords = [...allKeywords.entries()]\n .filter(([, n]) => n >= Math.max(2, Math.floor(members.length / 2)))\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([k]) => k);\n\n const titles = members\n .map((m) => firstHeading(m.loaded.memory.body) ?? m.loaded.memory.frontmatter.id)\n .slice(0, 5);\n\n const suggestedType: DistillCluster[\"suggested_type\"] =\n members.every((m) => m.loaded.memory.frontmatter.type === \"attempt\") ? \"gotcha\" : \"convention\";\n\n clusters.push({\n suggested_topic: commonKeywords.slice(0, 3).join(\"-\") || \"merged-observations\",\n suggested_type: suggestedType,\n member_ids: members.map((m) => m.loaded.memory.frontmatter.id),\n overlapping_paths: [...allPaths].slice(0, 10),\n common_keywords: commonKeywords,\n sample_titles: titles,\n latest_at: new Date(latest).toISOString(),\n });\n }\n\n // Sort clusters by size desc\n clusters.sort((a, b) => b.member_ids.length - a.member_ids.length);\n\n return {\n scanned: candidates.length,\n singletons,\n clusters,\n };\n}\n\nfunction keywordSet(loaded: LoadedMemory): Set<string> {\n const text = (loaded.memory.body + \" \" + loaded.memory.frontmatter.tags.join(\" \")).slice(0, 800);\n const tokens = tokenizeQuery(text)\n .filter((t) => t.length >= 4 && !STOP_WORDS.has(t));\n return new Set(tokens);\n}\n\nfunction jaccard<T>(a: Set<T>, b: Set<T>): number {\n if (a.size === 0 && b.size === 0) return 0;\n let intersect = 0;\n for (const x of a) if (b.has(x)) intersect++;\n const union = a.size + b.size - intersect;\n return union === 0 ? 0 : intersect / union;\n}\n\nfunction firstHeading(body: string): string | undefined {\n for (const line of body.split(\"\\n\")) {\n const t = line.trim();\n if (t.startsWith(\"#\")) return t.replace(/^#+\\s*/, \"\").slice(0, 80);\n if (t.length > 0) return t.slice(0, 80);\n }\n return undefined;\n}\n","import { existsSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n pathsOverlap as singlePathsOverlap,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const WhyThisDecisionInputSchema = {\n id: z\n .string()\n .min(1)\n .describe(\"Memory id to inspect (e.g. '2026-04-25-decision-esm-only').\"),\n git_log_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"How many recent commits per anchor path to surface.\"),\n};\n\nexport type WhyThisDecisionInput = {\n [K in keyof typeof WhyThisDecisionInputSchema]: z.infer<(typeof WhyThisDecisionInputSchema)[K]>;\n};\n\nexport interface WhyThisDecisionOutput {\n found: boolean;\n decision?: {\n id: string;\n type: string;\n scope: string;\n status: string;\n confidence: string;\n body: string;\n created_at: string;\n };\n /** Memories explicitly linked via related_ids on the decision (or vice versa). */\n related: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n body_preview: string;\n relation: \"explicit\" | \"back-link\";\n }>;\n /** Other memories anchored to overlapping paths — implicit context. */\n path_neighbors: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n overlap: string[];\n body_preview: string;\n }>;\n /** Recent git commits touching any of the decision's anchored paths. */\n recent_commits: Array<{\n path: string;\n sha: string;\n author: string;\n relative_date: string;\n subject: string;\n }>;\n hints?: string[];\n notice?: string;\n}\n\n/**\n * Trace the genealogy of a `decision` memory: the decision itself + memories\n * explicitly linked to it + memories anchored to overlapping paths + recent\n * commits touching those paths. One call instead of 4-5 manual lookups.\n *\n * Works on any memory type, but is optimized for `decision` and `architecture`.\n */\nexport async function whyThisDecision(\n input: WhyThisDecisionInput,\n ctx: HaiveContext,\n): Promise<WhyThisDecisionOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n found: false,\n related: [],\n path_neighbors: [],\n recent_commits: [],\n notice: \"No .ai/memories directory.\",\n };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const target = all.find(({ memory }) => memory.frontmatter.id === input.id);\n if (!target) {\n return {\n found: false,\n related: [],\n path_neighbors: [],\n recent_commits: [],\n notice: `Memory '${input.id}' not found.`,\n };\n }\n\n const fm = target.memory.frontmatter;\n const targetUsage = getUsage(usage, fm.id);\n const decision = {\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n status: fm.status,\n confidence: deriveConfidence(fm, targetUsage),\n body: target.memory.body,\n created_at: fm.created_at,\n };\n\n // ── related: explicit related_ids + reverse links ──────────────────────\n const relatedSet = new Set(fm.related_ids ?? []);\n const related: WhyThisDecisionOutput[\"related\"] = [];\n for (const { memory } of all) {\n if (memory.frontmatter.id === fm.id) continue;\n const isExplicit = relatedSet.has(memory.frontmatter.id);\n const isBackLink = (memory.frontmatter.related_ids ?? []).includes(fm.id);\n if (!isExplicit && !isBackLink) continue;\n const u = getUsage(usage, memory.frontmatter.id);\n related.push({\n id: memory.frontmatter.id,\n type: memory.frontmatter.type,\n scope: memory.frontmatter.scope,\n confidence: deriveConfidence(memory.frontmatter, u),\n body_preview: memory.body.split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 300),\n relation: isExplicit ? \"explicit\" : \"back-link\",\n });\n }\n\n // ── path_neighbors: memories anchored to overlapping paths ─────────────\n const targetPaths = fm.anchor.paths;\n const path_neighbors: WhyThisDecisionOutput[\"path_neighbors\"] = [];\n if (targetPaths.length > 0) {\n for (const { memory } of all) {\n if (memory.frontmatter.id === fm.id) continue;\n if (relatedSet.has(memory.frontmatter.id)) continue; // already in related\n const overlappingPaths = memory.frontmatter.anchor.paths.filter((p) =>\n targetPaths.some((tp) => singlePathsOverlap(p, tp)),\n );\n if (overlappingPaths.length === 0) continue;\n const u = getUsage(usage, memory.frontmatter.id);\n path_neighbors.push({\n id: memory.frontmatter.id,\n type: memory.frontmatter.type,\n scope: memory.frontmatter.scope,\n confidence: deriveConfidence(memory.frontmatter, u),\n overlap: overlappingPaths,\n body_preview: memory.body.split(\"\\n\").slice(0, 3).join(\"\\n\").slice(0, 200),\n });\n if (path_neighbors.length >= 10) break;\n }\n }\n\n // ── recent_commits: git log on each anchored path ──────────────────────\n const recent_commits: WhyThisDecisionOutput[\"recent_commits\"] = [];\n for (const p of targetPaths.slice(0, 5)) {\n try {\n const commits = await runGitLog(ctx.paths.root, p, input.git_log_limit);\n for (const c of commits) recent_commits.push({ path: p, ...c });\n } catch {\n /* git not available or path untracked — silent */\n }\n }\n\n const hints: string[] = [];\n if (decision.confidence === \"low\" || decision.confidence === \"stale\") {\n hints.push(`⚠️ Confidence is ${decision.confidence}. Verify this decision still applies before quoting it.`);\n }\n if (related.length === 0 && path_neighbors.length === 0 && targetPaths.length === 0) {\n hints.push(\"No related memories and no anchored paths — this decision is isolated; consider adding related_ids or paths.\");\n }\n if (fm.type !== \"decision\" && fm.type !== \"architecture\") {\n hints.push(`Memory type is '${fm.type}', not 'decision'/'architecture' — output may be less informative.`);\n }\n\n return {\n found: true,\n decision,\n related,\n path_neighbors,\n recent_commits,\n ...(hints.length > 0 ? { hints } : {}),\n };\n}\n\nasync function runGitLog(\n cwd: string,\n filePath: string,\n limit: number,\n): Promise<Array<{ sha: string; author: string; relative_date: string; subject: string }>> {\n const sep = \"<<HV>>\";\n const fmt = `%h${sep}%an${sep}%ar${sep}%s`;\n const output = await runCommand(\n \"git\",\n [\"log\", \"-n\", String(limit), `--pretty=format:${fmt}`, \"--\", filePath],\n cwd,\n );\n if (!output.trim()) return [];\n return output\n .split(\"\\n\")\n .map((line) => {\n const [sha = \"\", author = \"\", relative_date = \"\", subject = \"\"] = line.split(sep);\n return { sha, author, relative_date, subject };\n })\n .filter((c) => c.sha);\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","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n pathsOverlap,\n tokenizeQuery,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemConflictsInputSchema = {\n id: z\n .string()\n .min(1)\n .describe(\"Memory id to check for conflicts.\"),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.5)\n .describe(\"Minimum cosine similarity to consider a memory as a potential conflict (semantic mode).\"),\n semantic: z\n .boolean()\n .default(true)\n .describe(\"Use embeddings for similarity. Falls back to keyword overlap when embeddings are not installed.\"),\n};\n\nexport type MemConflictsInput = {\n [K in keyof typeof MemConflictsInputSchema]: z.infer<(typeof MemConflictsInputSchema)[K]>;\n};\n\nexport type ConflictReason =\n | \"opposite-status\"\n | \"attempt-vs-convention-same-paths\"\n | \"polarity-keywords\"\n | \"explicit-contradiction-tag\";\n\nexport interface ConflictHit {\n id: string;\n type: string;\n scope: string;\n status: string;\n confidence: string;\n body_preview: string;\n similarity: number | null;\n reasons: ConflictReason[];\n shared_paths: string[];\n}\n\nexport interface MemConflictsOutput {\n found: boolean;\n target?: { id: string; type: string; status: string };\n scanned: number;\n conflicts: ConflictHit[];\n notice?: string;\n}\n\nconst POSITIVE_PATTERNS = /\\b(use|prefer|always|should use|do this|recommended|ok to)\\b/i;\nconst NEGATIVE_PATTERNS = /\\b(do not use|don'?t use|never|avoid|forbidden|deprecated|stop using|do NOT|❌)\\b/i;\n\n/**\n * Find memories that potentially CONTRADICT the given memory. Useful before\n * relying on a memory's advice — surfaces \"another memory says the opposite\".\n *\n * Detection layers (any of these triggers a hit):\n * - Opposite status: target is validated, neighbor is rejected — for the same topic\n * - Type mismatch on overlapping paths: an `attempt` (don't do X) coexists with\n * a `convention` (do X) anchored to overlapping paths\n * - Polarity keywords: target says \"use X\" while a semantic neighbor says \"don't use X\"\n * - Explicit contradiction tag (#contradicts:<id>) in either body\n */\nexport async function memConflicts(\n input: MemConflictsInput,\n ctx: HaiveContext,\n): Promise<MemConflictsOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { found: false, scanned: 0, conflicts: [], notice: \"No .ai/memories directory.\" };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const target = all.find(({ memory }) => memory.frontmatter.id === input.id);\n if (!target) {\n return { found: false, scanned: 0, conflicts: [], notice: `Memory '${input.id}' not found.` };\n }\n\n const usage = await loadUsageIndex(ctx.paths);\n const others = all.filter(({ memory }) =>\n memory.frontmatter.id !== input.id &&\n memory.frontmatter.type !== \"session_recap\"\n );\n\n // Optional: get semantic similarity scores via embeddings\n const simScores = input.semantic ? await trySemanticSimilarities(ctx, target, others) : null;\n\n const targetText = (target.memory.body + \" \" + target.memory.frontmatter.tags.join(\" \"))\n .toLowerCase();\n const targetTokens = new Set(tokenizeQuery(targetText));\n const targetPolarity = polarity(targetText);\n const targetPaths = target.memory.frontmatter.anchor.paths;\n const explicitContradicts = extractContradictsTags(target.memory.body);\n\n const conflicts: ConflictHit[] = [];\n\n for (const other of others) {\n const fm = other.memory.frontmatter;\n const otherText = (other.memory.body + \" \" + fm.tags.join(\" \")).toLowerCase();\n const reasons: ConflictReason[] = [];\n\n const sim = simScores?.get(fm.id) ?? null;\n\n // Pre-filter: at least some keyword or path overlap or semantic hit.\n const hasPathOverlap = fm.anchor.paths.some((p) => targetPaths.some((tp) => pathsOverlap(p, tp)));\n const otherTokens = new Set(tokenizeQuery(otherText));\n const tokenOverlap = countIntersection(targetTokens, otherTokens);\n const isSemanticNeighbor = sim !== null && sim >= input.min_score;\n if (!hasPathOverlap && tokenOverlap < 4 && !isSemanticNeighbor) continue;\n\n // 1. Explicit contradicts tag\n const otherContradicts = extractContradictsTags(other.memory.body);\n if (explicitContradicts.has(fm.id) || otherContradicts.has(input.id)) {\n reasons.push(\"explicit-contradiction-tag\");\n }\n\n // 2. Opposite status (one validated, the other rejected on the same topic)\n if (\n target.memory.frontmatter.status === \"validated\" && fm.status === \"rejected\" ||\n target.memory.frontmatter.status === \"rejected\" && fm.status === \"validated\"\n ) {\n if (tokenOverlap >= 4 || isSemanticNeighbor) reasons.push(\"opposite-status\");\n }\n\n // 3. attempt vs convention/decision on overlapping paths\n if (hasPathOverlap) {\n const tType = target.memory.frontmatter.type;\n const oType = fm.type;\n const isAttemptVsRule = (tType === \"attempt\" && (oType === \"convention\" || oType === \"decision\")) ||\n (oType === \"attempt\" && (tType === \"convention\" || tType === \"decision\"));\n if (isAttemptVsRule) reasons.push(\"attempt-vs-convention-same-paths\");\n }\n\n // 4. Polarity inversion on shared keywords\n if (isSemanticNeighbor) {\n const otherPolarity = polarity(otherText);\n if (\n (targetPolarity === \"positive\" && otherPolarity === \"negative\") ||\n (targetPolarity === \"negative\" && otherPolarity === \"positive\")\n ) {\n reasons.push(\"polarity-keywords\");\n }\n }\n\n if (reasons.length === 0) continue;\n\n const u = getUsage(usage, fm.id);\n conflicts.push({\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n body_preview: other.memory.body.split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 300),\n similarity: sim,\n reasons,\n shared_paths: fm.anchor.paths.filter((p) => targetPaths.some((tp) => pathsOverlap(p, tp))),\n });\n }\n\n // Rank: explicit > opposite-status > others; tiebreak by similarity desc\n conflicts.sort((a, b) => {\n const score = (c: ConflictHit): number =>\n (c.reasons.includes(\"explicit-contradiction-tag\") ? 100 : 0) +\n (c.reasons.includes(\"opposite-status\") ? 50 : 0) +\n (c.reasons.includes(\"attempt-vs-convention-same-paths\") ? 25 : 0) +\n (c.reasons.includes(\"polarity-keywords\") ? 10 : 0) +\n (c.similarity ?? 0) * 5;\n return score(b) - score(a);\n });\n\n return {\n found: true,\n target: {\n id: target.memory.frontmatter.id,\n type: target.memory.frontmatter.type,\n status: target.memory.frontmatter.status,\n },\n scanned: others.length,\n conflicts: conflicts.slice(0, 10),\n };\n}\n\nfunction polarity(text: string): \"positive\" | \"negative\" | \"neutral\" {\n const neg = NEGATIVE_PATTERNS.test(text);\n const pos = POSITIVE_PATTERNS.test(text);\n if (neg && !pos) return \"negative\";\n if (pos && !neg) return \"positive\";\n return \"neutral\";\n}\n\nfunction extractContradictsTags(body: string): Set<string> {\n const out = new Set<string>();\n for (const m of body.matchAll(/#contradicts:([\\w-]+)/g)) {\n if (m[1]) out.add(m[1]);\n }\n return out;\n}\n\nfunction countIntersection<T>(a: Set<T>, b: Set<T>): number {\n let n = 0;\n for (const x of a) if (b.has(x)) n++;\n return n;\n}\n\nasync function trySemanticSimilarities(\n ctx: HaiveContext,\n target: LoadedMemory,\n others: LoadedMemory[],\n): Promise<Map<string, number> | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(\n ctx.paths,\n target.memory.body,\n { limit: others.length },\n );\n if (!result) return null;\n const map = new Map<string, number>();\n for (const hit of result.hits) map.set(hit.id, hit.score);\n return map;\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { antiPatternsCheck, type AntiPatternsWarning } from \"./anti-patterns-check.js\";\nimport { memForFiles } from \"./mem-for-files.js\";\nimport { memVerify } from \"./mem-verify.js\";\n\nexport const PreCommitCheckInputSchema = {\n diff: z\n .string()\n .optional()\n .describe(\n \"Raw unified diff text to scan. If omitted, only `paths` is used. \" +\n \"When called from a pre-commit hook, pipe the output of `git diff --cached`.\",\n ),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Project-relative paths affected by the change. At least one of `diff` or `paths` should be provided.\"),\n block_on: z\n .enum([\"any\", \"high-confidence\", \"never\"])\n .default(\"high-confidence\")\n .describe(\n \"When to set should_block=true: \" +\n \"'any' = any warning blocks; \" +\n \"'high-confidence' = only warnings from authoritative/trusted memories block; \" +\n \"'never' = report only, never block.\",\n ),\n semantic: z\n .boolean()\n .default(true)\n .describe(\"Enable semantic search in anti_patterns_check (requires embeddings index).\"),\n};\n\nexport type PreCommitCheckInput = {\n [K in keyof typeof PreCommitCheckInputSchema]: z.infer<(typeof PreCommitCheckInputSchema)[K]>;\n};\n\nexport interface PreCommitCheckOutput {\n /** True when at least one finding meets the configured block_on threshold. */\n should_block: boolean;\n /** Per-section summary; clients should surface the warnings + reasons to the user. */\n summary: {\n anti_patterns: number;\n relevant_memories: number;\n stale_anchors: number;\n };\n warnings: AntiPatternsWarning[];\n /** Memories anchored to the touched files — convention reminders for the change author. */\n relevant_memories: Array<{\n id: string;\n type: string;\n confidence: string;\n body_preview: string;\n }>;\n /** Memories whose anchored paths overlap with the diff AND are now stale — likely outdated knowledge. */\n stale_anchors: Array<{\n id: string;\n paths: string[];\n body_preview: string;\n }>;\n notice?: string;\n}\n\n/**\n * One-shot \"should I block this commit?\" check.\n *\n * Combines three signals into a single call agents and git hooks can consume:\n * 1. anti_patterns_check — known gotchas/attempts that match the diff\n * 2. mem_for_files — conventions/decisions anchored to touched files\n * 3. mem_verify — memories whose anchors are stale (knowledge may be wrong)\n *\n * Returns should_block per the configured threshold, plus the raw findings so\n * the caller can render them. CLI wrapper: `haive precommit`.\n */\nexport async function preCommitCheck(\n input: PreCommitCheckInput,\n ctx: HaiveContext,\n): Promise<PreCommitCheckOutput> {\n if (!input.diff && input.paths.length === 0) {\n return {\n should_block: false,\n summary: { anti_patterns: 0, relevant_memories: 0, stale_anchors: 0 },\n warnings: [],\n relevant_memories: [],\n stale_anchors: [],\n notice: \"Nothing to check — provide either `diff` or `paths`.\",\n };\n }\n\n // 1. Known anti-patterns\n const apResult = await antiPatternsCheck({\n diff: input.diff,\n paths: input.paths,\n limit: 20,\n semantic: input.semantic,\n }, ctx);\n\n // 2. Relevant conventions/decisions for the touched files\n const relevant = input.paths.length > 0\n ? await memForFiles({ files: input.paths, include_module_contexts: false, track: false }, ctx)\n : { by_anchor: [], by_module: [], by_domain: [], module_contexts: [], inferred_modules: [] };\n // Anchor matches are the most relevant for pre-commit; include module hits as a softer signal.\n const relevantMatches = [...relevant.by_anchor, ...relevant.by_module];\n\n // 3. Verify anchors — surface stale memories that touch these files\n const verifyResult = input.paths.length > 0\n ? await memVerify({ update: false, id: undefined }, ctx)\n : { results: [], summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 } };\n // We surface a stale memory when at least one of the verify hits says stale=true.\n // We don't have direct access to the memory's anchored paths from MemVerifyHit, so we rely on\n // mem_for_files to scope these to \"memories that touch our files\".\n const filesTouching = new Set(relevantMatches.map((m) => m.id));\n const staleHits = verifyResult.results.filter((r) => r.stale && filesTouching.has(r.id));\n\n // Determine should_block\n const blockOn = input.block_on;\n let should_block = false;\n if (blockOn !== \"never\") {\n const high = apResult.warnings.filter(\n (w) => w.confidence === \"authoritative\" || w.confidence === \"trusted\",\n );\n if (blockOn === \"any\" && (apResult.warnings.length > 0 || staleHits.length > 0)) should_block = true;\n if (blockOn === \"high-confidence\" && (high.length > 0 || staleHits.length > 0)) should_block = true;\n }\n\n // Map mem_for_files output to a simpler shape\n const relevant_memories = relevantMatches.slice(0, 8).map((m) => ({\n id: m.id,\n type: m.type,\n confidence: String(m.confidence),\n body_preview: (m.body ?? \"\").split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 250),\n }));\n\n return {\n should_block,\n summary: {\n anti_patterns: apResult.warnings.length,\n relevant_memories: relevant_memories.length,\n stale_anchors: staleHits.length,\n },\n warnings: apResult.warnings,\n relevant_memories,\n stale_anchors: staleHits.map((r) => ({\n id: r.id,\n // The matching `relevantMatches` entry tells us which paths overlap.\n paths: relevantMatches.find((m) => m.id === r.id)\n ? input.paths.filter((p) => relevantMatches.some((m) => m.id === r.id))\n : [],\n body_preview: r.reason ?? \"anchored code drifted; verify before relying on this memory\",\n })),\n };\n}\n","/**\n * pattern_detect — heuristic memory detector that runs without an LLM.\n *\n * Three signals (no LLM required):\n * 1. CONFIG_CHANGE: git diff shows changes to config files\n * (tsconfig, eslint, prettier, vitest, .env.example, …)\n * → proposes a convention memory with the diff as body.\n *\n * 2. REPEATED_PATH: same file path appears in ≥ N consecutive mem_tried /\n * mem_observe events in the usage log\n * → proposes a gotcha memory anchored to that path.\n *\n * 3. HOT_FILE: a non-config source file appears in mem_save / mem_tried /\n * mem_observe summaries ≥ 3 times in the look-back window\n * → proposes a convention memory (frequent edits signal a pattern).\n *\n * Output is `status: proposed` — auto-promote (Phase 4) or the next\n * get_briefing post_task flow will validate/reject them.\n *\n * Runs entirely from the local filesystem: git, usage log, no network.\n */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n readUsageEvents,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\n/** Glob patterns (lowercased) that identify config files. */\nconst CONFIG_PATTERNS = [\n \".eslintrc\", \"eslint.config\", \"prettier.config\", \".prettierrc\",\n \"tsconfig\", \"jsconfig\",\n \"vitest.config\", \"jest.config\",\n \".env.example\", \".env.defaults\",\n \"tailwind.config\", \"vite.config\", \"next.config\",\n \"babel.config\", \"postcss.config\",\n \"renovate.json\", \"dependabot.yml\",\n];\n\n/** Max length of a git diff included in a proposed memory body. */\nconst MAX_DIFF_BYTES = 4096;\n\n/** Threshold: path must appear this many times to trigger a HOT_FILE signal. */\nconst HOT_FILE_MIN = 3;\n\n// ── Input / Output ─────────────────────────────────────────────────────────\n\nexport const PatternDetectInputSchema = {\n since_days: z\n .number()\n .int()\n .min(1)\n .default(7)\n .describe(\"Look-back window in days for both git history and usage log.\"),\n dry_run: z\n .boolean()\n .default(false)\n .describe(\"When true, report matches without writing any memory files.\"),\n scope: z\n .enum([\"personal\", \"team\"])\n .default(\"team\")\n .describe(\"Scope for proposed memories.\"),\n};\n\nexport type PatternDetectInput = {\n [K in keyof typeof PatternDetectInputSchema]: z.infer<(typeof PatternDetectInputSchema)[K]>;\n};\n\nexport type PatternKind = \"config_change\" | \"repeated_path\" | \"hot_file\";\n\nexport interface PatternMatch {\n kind: PatternKind;\n signal: string;\n proposed_type: \"convention\" | \"gotcha\";\n proposed_slug: string;\n proposed_body: string;\n anchor_paths: string[];\n}\n\nexport interface PatternDetectOutput {\n scanned_events: number;\n matches: PatternMatch[];\n /** Number of proposed memories saved (0 if dry_run). */\n saved: number;\n /** IDs of saved memories. */\n saved_ids: string[];\n notice?: string;\n}\n\n// ── Implementation ─────────────────────────────────────────────────────────\n\nexport async function patternDetect(\n input: PatternDetectInput,\n ctx: HaiveContext,\n): Promise<PatternDetectOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n return {\n scanned_events: 0, matches: [], saved: 0, saved_ids: [],\n notice: \"No .ai/ directory found. Run 'haive init' first.\",\n };\n }\n\n const matches: PatternMatch[] = [];\n\n // ── Signal 1: CONFIG_CHANGE ─────────────────────────────────────────────\n try {\n const changedFiles = gitChangedFiles(ctx.paths.root, input.since_days);\n const configFiles = changedFiles.filter((f) =>\n CONFIG_PATTERNS.some((p) => path.basename(f.toLowerCase()).includes(p)),\n );\n for (const file of configFiles.slice(0, 5)) {\n const diff = gitFileDiff(ctx.paths.root, file, input.since_days);\n if (!diff) continue;\n // Include the nearest parent dir so `cli/vitest.config.ts` and\n // `core/vitest.config.ts` produce distinct slugs instead of colliding.\n const parentDir = path.basename(path.dirname(file));\n const baseName = path.basename(file).replace(/\\.[^.]+$/, \"\");\n const slug = `${parentDir}-${baseName}`\n .replace(/[^a-z0-9]/gi, \"-\")\n .toLowerCase()\n .slice(0, 40);\n matches.push({\n kind: \"config_change\",\n signal: `Config file modified: ${file}`,\n proposed_type: \"convention\",\n proposed_slug: `config-change-${slug}`,\n proposed_body: [\n `# Config change: \\`${file}\\``,\n \"\",\n \"This configuration file was recently modified. The diff below captures the intent.\",\n \"Review and update this memory with the **reason** for the change if known.\",\n \"\",\n \"```diff\",\n diff.slice(0, MAX_DIFF_BYTES),\n \"```\",\n ].join(\"\\n\"),\n anchor_paths: [file],\n });\n }\n } catch { /* git not available or no history — skip */ }\n\n // ── Signals 2 & 3: usage log analysis ──────────────────────────────────\n const events = await readUsageEvents(ctx.paths);\n const cutoff = Date.now() - input.since_days * 24 * 60 * 60 * 1000;\n const recent = events.filter((e) => Date.parse(e.at) >= cutoff);\n\n // Build per-path occurrence counts from writing tools\n const pathCounts = new Map<string, { count: number; tools: Set<string> }>();\n for (const e of recent) {\n if (![\"mem_tried\", \"mem_observe\", \"mem_save\"].includes(e.tool)) continue;\n if (!e.summary) continue;\n // Extract file-like tokens from the summary\n const tokens = e.summary.match(/[^\\s\"'`,;()[\\]{}]+\\.[a-zA-Z]{1,6}/g) ?? [];\n for (const t of tokens) {\n const key = t.toLowerCase();\n const existing = pathCounts.get(key);\n if (existing) {\n existing.count++;\n existing.tools.add(e.tool);\n } else {\n pathCounts.set(key, { count: 1, tools: new Set([e.tool]) });\n }\n }\n }\n\n // Signal 2: REPEATED_PATH — path appears mostly in mem_tried / mem_observe\n for (const [p, { count, tools }] of pathCounts) {\n if (count < HOT_FILE_MIN) continue;\n const isGotchaSignal = tools.has(\"mem_tried\") || tools.has(\"mem_observe\");\n if (!isGotchaSignal) continue;\n const slug = p.replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\").slice(0, 40);\n matches.push({\n kind: \"repeated_path\",\n signal: `Path '${p}' appears ${count}× in mem_tried/mem_observe events`,\n proposed_type: \"gotcha\",\n proposed_slug: `repeated-issue-${slug}`,\n proposed_body: [\n `# Recurring issue near \\`${p}\\``,\n \"\",\n `This file appeared ${count} times in failed-approach or observation events ` +\n `over the last ${input.since_days} days. ` +\n \"Review the related attempt/gotcha memories and consolidate them into a single authoritative gotcha.\",\n \"\",\n `**Source signals:** ${[...tools].join(\", \")} (${count} events)`,\n ].join(\"\\n\"),\n anchor_paths: [p],\n });\n }\n\n // Signal 3: HOT_FILE — any path appearing ≥ HOT_FILE_MIN times in any writing tool\n for (const [p, { count, tools }] of pathCounts) {\n if (count < HOT_FILE_MIN) continue;\n if (tools.has(\"mem_tried\") || tools.has(\"mem_observe\")) continue; // already covered by Signal 2\n // Only flag non-config source files\n if (CONFIG_PATTERNS.some((cp) => path.basename(p).includes(cp))) continue;\n const slug = p.replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\").slice(0, 40);\n matches.push({\n kind: \"hot_file\",\n signal: `Path '${p}' referenced ${count}× across mem_save events`,\n proposed_type: \"convention\",\n proposed_slug: `hot-file-${slug}`,\n proposed_body: [\n `# Frequent edits to \\`${p}\\``,\n \"\",\n `This file was referenced ${count} times in memory-saving events over the last ` +\n `${input.since_days} days — a signal that a recurring pattern or convention applies here.`,\n \"\",\n \"**Suggested action:** review recent memories anchored to this path and extract the \" +\n \"common pattern as a named convention.\",\n ].join(\"\\n\"),\n anchor_paths: [p],\n });\n }\n\n if (matches.length === 0) {\n return {\n scanned_events: recent.length,\n matches: [],\n saved: 0,\n saved_ids: [],\n notice: `No patterns detected in the last ${input.since_days} days (${recent.length} events scanned).`,\n };\n }\n\n if (input.dry_run) {\n return { scanned_events: recent.length, matches, saved: 0, saved_ids: [] };\n }\n\n // ── Save proposed memories ──────────────────────────────────────────────\n const savedIds: string[] = [];\n for (const match of matches) {\n try {\n const fm = buildFrontmatter({\n type: match.proposed_type,\n slug: match.proposed_slug,\n scope: input.scope,\n tags: [\"pattern-detect\", match.kind],\n paths: match.anchor_paths,\n status: \"proposed\",\n });\n const file = memoryFilePath(\n ctx.paths,\n fm.scope === \"shared\" ? \"team\" : fm.scope,\n fm.id,\n undefined,\n );\n if (existsSync(file)) continue; // don't overwrite existing\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(\n file,\n serializeMemory({ frontmatter: fm, body: match.proposed_body }),\n \"utf8\",\n );\n savedIds.push(fm.id);\n } catch { /* skip failures — non-blocking */ }\n }\n\n return {\n scanned_events: recent.length,\n matches,\n saved: savedIds.length,\n saved_ids: savedIds,\n };\n}\n\n// ── Git helpers ────────────────────────────────────────────────────────────\n\nfunction gitChangedFiles(root: string, sinceDays: number): string[] {\n try {\n const out = execSync(\n `git log --name-only --pretty=\"\" --diff-filter=AM --since=\"${sinceDays} days ago\"`,\n { cwd: root, encoding: \"utf8\", timeout: 5000, stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n return [...new Set(out.split(\"\\n\").map((l) => l.trim()).filter(Boolean))];\n } catch {\n return [];\n }\n}\n\nfunction gitFileDiff(root: string, file: string, sinceDays: number): string | null {\n try {\n const out = execSync(\n `git log -p --follow --since=\"${sinceDays} days ago\" -- \"${file}\"`,\n { cwd: root, encoding: \"utf8\", timeout: 5000, stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n if (!out.trim()) return null;\n // Extract only the diff hunks (lines starting with +/- or @@)\n const diffLines = out.split(\"\\n\").filter((l) =>\n l.startsWith(\"+\") || l.startsWith(\"-\") || l.startsWith(\"@@\") || l.startsWith(\"diff\"),\n );\n return diffLines.join(\"\\n\").slice(0, MAX_DIFF_BYTES) || null;\n } catch {\n return null;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport {\n findLexicalConflictPairs,\n findTopicStatusConflictPairs,\n loadMemoriesFromDir,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemConflictCandidatesInputSchema = {\n since_days: z\n .number()\n .int()\n .positive()\n .max(3650)\n .default(365)\n .describe(\"Only memories created since N days ago\"),\n types: z\n .array(z.enum([\"decision\", \"architecture\", \"convention\", \"gotcha\"]))\n .default([\"decision\", \"architecture\"])\n .describe(\"Memory types scanned for pairwise lexical overlap\"),\n min_jaccard: z\n .number()\n .min(0)\n .max(1)\n .default(0.45)\n .describe(\"Minimum Jaccard token similarity to surface as a candidate pair\"),\n max_pairs: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(20)\n .describe(\"Cap pairs returned\"),\n max_scan: z\n .number()\n .int()\n .positive()\n .max(2000)\n .default(500)\n .describe(\"Maximum memories sampled for O(n²) scan — excess dropped after chronological sort.\"),\n max_topic_pairs: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(20)\n .describe(\n \"Cap for extra signal: memories sharing the same topic with validated vs rejected status.\",\n ),\n};\n\nexport type MemConflictCandidatesInput = {\n [K in keyof typeof MemConflictCandidatesInputSchema]: z.infer<\n (typeof MemConflictCandidatesInputSchema)[K]\n >;\n};\n\nexport async function memConflictCandidates(\n input: MemConflictCandidatesInput,\n ctx: HaiveContext,\n) {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n pairs: [],\n topic_status_pairs: [],\n scanned: 0,\n truncated: false,\n notice: \"No .ai/memories directory.\",\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const { pairs, scanned, truncated } = findLexicalConflictPairs(all, {\n sinceDays: input.since_days,\n types: input.types,\n minJaccard: input.min_jaccard,\n maxPairs: input.max_pairs,\n maxScan: input.max_scan,\n });\n const topicStatusPairs = findTopicStatusConflictPairs(all, input.max_topic_pairs);\n\n const notice =\n pairs.length === 0 && topicStatusPairs.length === 0\n ? \"No lexical or topic-status candidates — widen since_days/types or lower min_jaccard.\"\n : undefined;\n\n return { pairs, topic_status_pairs: topicStatusPairs, scanned, truncated, notice };\n}\n","import { resolveProjectInfo } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n/** Input is intentionally minimal — callers may pass cwd for multi-root clients. */\nexport const MemResolveProjectInputSchema = {\n cwd: z\n .string()\n .optional()\n .describe(\"Directory used for root discovery when HAIVE_PROJECT_ROOT is unset.\"),\n};\n\nexport type MemResolveProjectInput = {\n [K in keyof typeof MemResolveProjectInputSchema]: z.infer<(typeof MemResolveProjectInputSchema)[K]>;\n};\n\nexport async function memResolveProject(\n input: MemResolveProjectInput,\n _ctx: HaiveContext,\n): Promise<{ info: ReturnType<typeof resolveProjectInfo>; ok: true }> {\n void _ctx;\n return {\n ok: true,\n info: resolveProjectInfo({\n cwd: input.cwd,\n }),\n };\n}\n","import { MemoryTypeSchema, suggestTopicKey } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSuggestTopicInputSchema = {\n type: MemoryTypeSchema.describe(\"Memory kind — drives the suggested topic family.\"),\n title: z\n .string()\n .min(1)\n .describe(\"Short title or phrase (headers, headings) — turned into slug\"),\n};\n\nexport type MemSuggestTopicInput = {\n [K in keyof typeof MemSuggestTopicInputSchema]: z.infer<(typeof MemSuggestTopicInputSchema)[K]>;\n};\n\nexport async function memSuggestTopic(\n input: MemSuggestTopicInput,\n _ctx: HaiveContext,\n): Promise<{ topic_key: string; family: string; type: string }> {\n void _ctx;\n const suggestion = suggestTopicKey(input.type, input.title);\n return { topic_key: suggestion.topic_key, family: suggestion.family, type: input.type };\n}\n","import { existsSync } from \"node:fs\";\nimport { collectTimelineEntries, loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemTimelineInputSchema = {\n memory_id: z.string().optional().describe(\"Seed id — expands via related_ids, topic, anchors\"),\n topic: z\n .string()\n .optional()\n .describe(\"Frontmatter.topic value — chronological list when memory_id omitted\"),\n limit: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(30)\n .describe(\"Max timeline entries returned\"),\n};\n\nexport type MemTimelineInput = {\n [K in keyof typeof MemTimelineInputSchema]: z.infer<(typeof MemTimelineInputSchema)[K]>;\n};\n\nexport async function memTimeline(input: MemTimelineInput, ctx: HaiveContext) {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { entries: [], total: 0, notice: \"No .ai/memories directory.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const { entries, notice } = collectTimelineEntries(all, {\n memoryId: input.memory_id,\n topic: input.topic,\n limit: input.limit,\n });\n return { entries, total: entries.length, notice };\n}\n","import { appendRuntimeJournalEntry } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const RuntimeJournalAppendInputSchema = {\n message: z.string().min(1).describe(\"Short line to append to the runtime session journal\"),\n kind: z.enum([\"note\", \"session_end\", \"mcp\"]).default(\"note\"),\n tool: z.string().optional().describe(\"When kind=mcp, which tool name (optional)\"),\n};\n\nexport type RuntimeJournalAppendInput = {\n [K in keyof typeof RuntimeJournalAppendInputSchema]: z.infer<\n (typeof RuntimeJournalAppendInputSchema)[K]\n >;\n};\n\nexport async function runtimeJournalAppend(\n input: RuntimeJournalAppendInput,\n ctx: HaiveContext,\n): Promise<{ ok: true; path_hint: string }> {\n await appendRuntimeJournalEntry(ctx.paths, {\n kind: input.kind,\n message: input.message,\n ...(input.tool ? { tool: input.tool } : {}),\n });\n return {\n ok: true,\n path_hint: `${ctx.paths.runtimeDir}/session-journal.ndjson`,\n };\n}\n","import { readRuntimeJournalTail } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const RuntimeJournalTailInputSchema = {\n limit: z\n .number()\n .int()\n .positive()\n .max(500)\n .default(30)\n .describe(\"Last N journal entries to return\"),\n};\n\nexport type RuntimeJournalTailInput = {\n [K in keyof typeof RuntimeJournalTailInputSchema]: z.infer<\n (typeof RuntimeJournalTailInputSchema)[K]\n >;\n};\n\nexport async function runtimeJournalTail(\n input: RuntimeJournalTailInput,\n ctx: HaiveContext,\n): Promise<{ entries: Awaited<ReturnType<typeof readRuntimeJournalTail>>; empty?: boolean }> {\n const entries = await readRuntimeJournalTail(ctx.paths, input.limit);\n if (entries.length === 0) {\n return { entries: [], empty: true };\n }\n return { entries };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectArgsSchema = {\n module: z\n .string()\n .optional()\n .describe(\n \"Optional module name to scope the analysis to (writes to .ai/modules/<module>/context.md)\",\n ),\n focus: z\n .string()\n .optional()\n .describe(\"Optional area to emphasize (e.g. 'data layer', 'API surface')\"),\n};\n\nexport type BootstrapProjectArgs = {\n [K in keyof typeof BootstrapProjectArgsSchema]: z.infer<\n (typeof BootstrapProjectArgsSchema)[K]\n >;\n};\n\nconst ROOT_TEMPLATE = `# Project context\n\n## Architecture\n<one or two paragraphs on the high-level architecture>\n\n## Key modules\n- <module-name>: <one line on its purpose>\n- ...\n\n## Conventions\n- <convention>: <why it matters here>\n- ...\n\n## Glossary\n- <term>: <definition in this codebase>\n- ...\n\n## Gotchas\n- <surprising behavior, hidden coupling, or known traps>\n- ...\n`;\n\nconst MODULE_TEMPLATE = `# Module context — {module}\n\n## Purpose\n<what this module is for>\n\n## Public surface\n- <exported symbol>: <one line>\n- ...\n\n## Internals\n<key files / classes / functions and how they connect>\n\n## Conventions specific to this module\n- ...\n\n## Gotchas\n- ...\n`;\n\nexport function bootstrapProjectPrompt(\n args: BootstrapProjectArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const target = args.module\n ? `\\`.ai/modules/${args.module}/context.md\\``\n : \"`.ai/project-context.md`\";\n const template = args.module\n ? MODULE_TEMPLATE.replace(\"{module}\", args.module)\n : ROOT_TEMPLATE;\n const focusLine = args.focus\n ? `\\nEmphasis area for this analysis: **${args.focus}**.\\n`\n : \"\";\n\n const text = `You are bootstrapping a hAIve shared project context for the team.\n\nProject root: \\`${ctx.paths.root}\\`\nTarget file: ${target}\n${focusLine}\n## What to do\n\n1. Explore the codebase: read the package manifests, top-level directories, build configs, and a representative sample of source files. Do not read every file — pick what gives you the highest signal per file (entry points, config, README if present, main domain models).\n2. Synthesize a concise, high-signal context document. Prefer load-bearing facts over exhaustive enumeration. A new teammate (human or AI) should be able to read it in 5 minutes and feel oriented.\n3. Match the structure of the template below. Keep each section short — link to files instead of repeating large code chunks.\n4. When you are done, call the \\`bootstrap_project_save\\` tool with the full Markdown content. Use \\`overwrite=true\\` only if the file already exists and you intend to replace it.\n\n## Template to fill\n\n\\`\\`\\`markdown\n${template}\\`\\`\\`\n\n## Tips\n\n- Anchor claims to file paths so future readers can verify them.\n- Write what is true *now*, not aspirational. Note open questions explicitly.\n- Skip sections that have nothing meaningful to say rather than padding them.\n`;\n\n return {\n description: args.module\n ? `Bootstrap context for module \"${args.module}\"`\n : \"Bootstrap the root project context\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const PostTaskArgsSchema = {\n task_summary: z\n .string()\n .optional()\n .describe(\"One sentence describing what you just did\"),\n files_touched: z\n .array(z.string())\n .optional()\n .describe(\"Files you created or modified during the task\"),\n};\n\nexport type PostTaskArgs = {\n [K in keyof typeof PostTaskArgsSchema]: z.infer<(typeof PostTaskArgsSchema)[K]>;\n};\n\nexport function postTaskPrompt(\n args: PostTaskArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const taskLine = args.task_summary ? `\\nTask just completed: **${args.task_summary}**` : \"\";\n const filesLine =\n args.files_touched && args.files_touched.length > 0\n ? `\\nFiles touched: ${args.files_touched.map((f) => `\\`${f}\\``).join(\", \")}`\n : \"\";\n\n const text = `You have just finished a task. Before closing this session, take 60 seconds to capture what you learned.\n${taskLine}${filesLine}\n\nProject root: \\`${ctx.paths.root}\\`\n\n## Checklist — answer each question honestly\n\nGo through each item. If the answer is yes, call the corresponding tool immediately.\n\n### 0. Did you read existing code and discover bugs, inconsistencies, or security gaps that weren't in the briefing?\nThis is the most important question. Deep code reading surfaces issues that no memory captures yet.\nExamples of things to look for:\n- A method with an invalid signature (e.g. two \\`@RequestBody\\` on the same handler)\n- A configuration that looks wrong or missing (e.g. webhook path not whitelisted in SecurityConfig)\n- A component scan / DI issue (e.g. a Spring bean not picked up because the package isn't scanned)\n- A DB constraint that will break when you add a new enum value\n- A hardcoded value that should be dynamic (e.g. hardcoded tenant id \"default-tenant\")\n- Anything that will silently break in production\n\n→ If yes, call **\\`mem_save\\`** with \\`type=\"gotcha\"\\`, \\`scope=\"team\"\\`, and **anchor it to the file** with \\`paths\\`.\n This transforms your discovery into institutional knowledge that protects every future agent.\n\n### 1. Did you try an approach that failed?\n→ If yes, call **\\`mem_tried\\`** with:\n - \\`what\\`: the approach you tried (e.g. \"importing gray-matter with ESM dynamic import\")\n - \\`why_failed\\`: why it didn't work\n - \\`instead\\`: what worked instead\n - \\`scope\\`: \"team\" if others will hit the same issue, \"personal\" if specific to your setup\n - \\`paths\\`: the files where the issue manifested\n\n### 2. Did you discover a convention that isn't documented?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"convention\"\\` and \\`scope=\"team\"\\`\n\n### 3. Did you make an architectural decision?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"decision\"\\` and document the WHY (constraints, tradeoffs), not just the what\n\n### 4. Did you hit a non-obvious bug or surprising behavior in a library or framework?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"gotcha\"\\` and anchor it to the relevant file paths\n\n### 5. Did you find that an existing memory is outdated or wrong?\n→ If yes, call **\\`mem_update\\`** with the correct information, or **\\`mem_reject\\`** if it's completely wrong\n\n## Rules\n\n- One memory per insight. Don't cram multiple lessons into one body.\n- Anchor memories to file paths when possible (the \\`paths\\` field) — this enables staleness detection.\n- Prefer \\`scope=\"team\"\\` for anything a teammate or future agent would benefit from.\n- Skip sections where you genuinely have nothing to add. Don't fabricate memories.\n- **Question 0 is not optional** — always scan your exploration history for code-level discoveries.\n\n### 6. Close the session — always\nCall **\\`mem_session_end\\`** with:\n- \\`goal\\`: what you set out to do\n- \\`accomplished\\`: what was actually done (bullet list)\n- \\`discoveries\\`: anything surprising or broken found during this session (leave empty if none)\n- \\`files_touched\\`: the key files you read or modified\n- \\`next_steps\\`: what remains for the next session or a teammate\n- \\`scope\\`: \"team\" if this task affects the whole team, \"personal\" otherwise\n\nThis creates/updates a single rolling recap that **get_briefing automatically surfaces** at the start of every subsequent session — no token waste re-explaining what happened.\n\nCalling \\`mem_session_end\\` also **clears the pending-distill marker** (if any), confirming that this session's learnings have been properly captured rather than left as an auto-recap skeleton.\n\nWhen done, respond with a brief summary: \"Saved N memories: [list of IDs]. Session recap saved.\"\n`;\n\n\n return {\n description: \"Post-task reflection: capture what you learned before closing the session\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const ImportDocsArgsSchema = {\n content: z\n .string()\n .describe(\"The documentation content to analyze and import as memories (Markdown, README, ADR, etc.)\"),\n source: z\n .string()\n .optional()\n .describe(\"Origin of the content (file path, URL, or document title) — used to anchor memories\"),\n scope: z\n .enum([\"personal\", \"team\"])\n .default(\"team\")\n .describe(\"Scope to assign to created memories\"),\n dry_run: z\n .boolean()\n .default(false)\n .describe(\"If true, describe what would be saved without actually calling mem_save\"),\n};\n\nexport type ImportDocsArgs = {\n [K in keyof typeof ImportDocsArgsSchema]: z.infer<(typeof ImportDocsArgsSchema)[K]>;\n};\n\nexport function importDocsPrompt(\n args: ImportDocsArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const sourceLine = args.source ? `\\nSource: **${args.source}**` : \"\";\n const dryRunNote = args.dry_run\n ? \"\\n> **DRY RUN** — describe what you would save but do not call any tools.\"\n : \"\";\n\n const text = `You are given documentation to analyze and import into the hAIve memory system.\n${sourceLine}\nScope: **${args.scope}**\nProject root: \\`${ctx.paths.root}\\`\n${dryRunNote}\n\n## Your task\n\nRead the documentation below and extract actionable memories. For each distinct piece of knowledge:\n\n1. **Identify the memory type** — which category fits best?\n - \\`convention\\` — how things are done here (naming, patterns, workflow)\n - \\`decision\\` — a choice that was made and why (tradeoffs, constraints)\n - \\`gotcha\\` — non-obvious behavior, traps, things that surprise newcomers\n - \\`architecture\\` — structural overview of a system or module\n - \\`glossary\\` — domain terms and their meaning in this project\n\n2. **Determine the anchor** — which files or symbols does this knowledge apply to? List them in \\`paths\\`.\n\n3. **Write a focused body** — one memory = one insight. Do not combine multiple unrelated facts.\n - Start with the key fact or rule\n - Add context: why it matters, when it applies\n - Add examples if helpful\n\n4. **Call \\`mem_save\\`** for each memory (unless dry_run).\n - Set \\`scope=\"${args.scope}\"\\`\n - Set \\`slug\\` to a short kebab-case identifier\n - Set \\`paths\\` to the relevant file paths (extracted from the doc if present)\n\n## Rules\n\n- Skip generic documentation that applies to any project (e.g., \"install with npm install\").\n- Prioritize gotchas, non-obvious decisions, and domain-specific conventions.\n- If the same knowledge is repeated in different sections, save it once.\n- Maximum 10 memories per import — select the most actionable ones.\n\n## Documentation to import\n\n---\n\n${args.content}\n\n---\n\nWhen done, respond with: \"Imported N memories: [list of IDs]\" or \"Nothing actionable found.\"\n`;\n\n return {\n description: \"Import documentation as hAIve memories\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\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 { Embedder, rebuildIndex } = await import(\"@hiveai/embeddings\");\n log(ui.dim(\"embed: rebuilding index…\"));\n const embedder = await Embedder.create();\n const { report } = await rebuildIndex(paths, embedder);\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 .alias(\"search\")\n .description(\"Search memories by id, tag, or substring (AND, OR fallback). Alias: search\")\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 const version = versionMatch?.[1];\n if (!version) continue;\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 const breakingText = breakingMatch?.[1]?.trim();\n if (breakingText && !entry.breaking.includes(breakingText)) {\n entry.breaking.push(breakingText);\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 const latest = entries[0];\n entries = latest ? [latest] : [];\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 &nbsp;&nbsp; [ ] reject &nbsp;&nbsp; [ ] 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, readFile, rm } 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 auto?: boolean;\n quiet?: boolean;\n}\n\ninterface Observation {\n ts: string;\n session_id?: string;\n cwd?: string;\n tool: string;\n summary: string;\n files?: string[];\n}\n\nasync function buildAutoRecap(\n paths: ReturnType<typeof resolveHaivePaths>,\n): Promise<{ goal: string; accomplished: string; files: string[]; rawCount: number } | null> {\n const obsFile = path.join(paths.haiveDir, \".cache\", \"observations.jsonl\");\n if (!existsSync(obsFile)) return null;\n const raw = await readFile(obsFile, \"utf8\").catch(() => \"\");\n if (!raw.trim()) return null;\n const lines = raw.split(\"\\n\").filter(Boolean);\n const obs: Observation[] = [];\n for (const line of lines) {\n try { obs.push(JSON.parse(line) as Observation); } catch { /* skip */ }\n }\n if (obs.length === 0) return null;\n\n const toolCounts = new Map<string, number>();\n const fileCounts = new Map<string, number>();\n const summaries: string[] = [];\n for (const o of obs) {\n toolCounts.set(o.tool, (toolCounts.get(o.tool) ?? 0) + 1);\n for (const f of o.files ?? []) fileCounts.set(f, (fileCounts.get(f) ?? 0) + 1);\n if (summaries.length < 10) summaries.push(`- ${o.summary}`);\n }\n\n const topTools = [...toolCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([t, c]) => `${t} ×${c}`)\n .join(\", \");\n const topFiles = [...fileCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 8);\n\n const goal = `Auto-captured session — ${obs.length} tool calls (${topTools})`;\n const accomplished = summaries.length\n ? `Recent activity:\\n${summaries.join(\"\\n\")}`\n : `Activity captured but no parseable summaries.`;\n\n return {\n goal,\n accomplished,\n files: topFiles.map(([f]) => f),\n rawCount: obs.length,\n };\n}\n\nfunction buildRecapBody(opts: {\n goal: string;\n accomplished: string;\n discoveries?: string;\n files?: string;\n next?: string;\n}): 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 .option(\"--goal <text>\", \"what you were trying to accomplish (1–2 sentences)\")\n .option(\"--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(\"--auto\", \"synthesize the recap from .ai/.cache/observations.jsonl (used by Claude Code SessionEnd hook)\")\n .option(\"--quiet\", \"suppress non-error output (for hook use)\")\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 if (opts.auto || opts.quiet) return; // hook context — silently no-op\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n // Auto mode: derive goal/accomplished/files from captured observations\n let resolvedFiles = opts.files;\n let goal = opts.goal;\n let accomplished = opts.accomplished;\n if (opts.auto) {\n const synth = await buildAutoRecap(paths);\n if (!synth) return; // nothing observed — silently no-op\n goal = goal ?? synth.goal;\n accomplished = accomplished ?? synth.accomplished;\n if (!resolvedFiles && synth.files.length) resolvedFiles = synth.files.join(\",\");\n }\n\n if (!goal || !accomplished) {\n if (opts.quiet) return;\n ui.error(\"session-end requires --goal and --accomplished (or pass --auto with captured observations).\");\n process.exitCode = 1;\n return;\n }\n\n const scope = opts.scope ?? \"personal\";\n const body = buildRecapBody({\n goal,\n accomplished,\n discoveries: opts.discoveries,\n files: resolvedFiles,\n next: opts.next,\n });\n const topic = recapTopic(scope, opts.module);\n const filesTouched = parseCsv(resolvedFiles);\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 && !opts.quiet) {\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 const cleanupObservations = async (): Promise<void> => {\n if (!opts.auto) return;\n const obsFile = path.join(paths.haiveDir, \".cache\", \"observations.jsonl\");\n if (existsSync(obsFile)) await rm(obsFile).catch(() => { /* non-fatal */ });\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 await cleanupObservations();\n if (!opts.quiet) {\n ui.success(`Session recap updated (revision #${revisionCount})`);\n ui.info(`id=${fm.id} file=${path.relative(root, topicMatch.filePath)}`);\n ui.info(\"Tip: `haive stats --export-report` generates a usage JSON suitable for dashboards.\");\n }\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 await cleanupObservations();\n\n if (!opts.quiet) {\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 ui.info(\"Tip: export a local MCP usage rollup with `haive stats --export-report .ai/tool-usage-roi-report.json`.\");\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","/**\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 { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n aggregateUsage,\n findProjectRoot,\n loadMemoriesFromDir,\n loadUsageIndex,\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 memoryHits?: boolean;\n exportReport?: string;\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(\"--memory-hits\", \"show top-read memories (which mems are actually being used)\", false)\n .option(\n \"--export-report <path>\",\n \"write a JSON rollup (tools + briefing counts + heuristic ROI hints). Parent dirs are created if needed.\",\n undefined,\n )\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 if (opts.exportReport) {\n await writeRoiReport(paths, root, opts.since ?? \"30d\", opts.exportReport);\n return;\n }\n\n if (opts.memoryHits) {\n await renderMemoryHits(paths, opts);\n return;\n }\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\nasync function writeRoiReport(\n paths: ReturnType<typeof resolveHaivePaths>,\n root: string,\n sinceRaw: string,\n outRelative: string,\n): Promise<void> {\n const outAbs = path.isAbsolute(outRelative)\n ? path.resolve(outRelative)\n : path.resolve(root, outRelative);\n\n const size = await usageLogSize(paths);\n let events = await readUsageEvents(paths);\n\n let memoryCount = { team: 0, personal: 0, total_skipped_session: 0 };\n if (existsSync(paths.memoriesDir)) {\n const mems = await loadMemoriesFromDir(paths.memoriesDir);\n for (const { memory } of mems) {\n const fm = memory.frontmatter;\n if (fm.type === \"session_recap\") memoryCount.total_skipped_session++;\n else if (fm.scope === \"team\") memoryCount.team++;\n else if (fm.scope === \"personal\") memoryCount.personal++;\n }\n }\n\n const sinceDt = parseSince(sinceRaw) ?? undefined;\n const aggregate = aggregateUsage(events, sinceDt);\n const inWindow = (at: string): boolean =>\n sinceDt === undefined || Date.parse(at) >= sinceDt.getTime();\n\n const briefingCalls = events.filter((e) => inWindow(e.at) && e.tool === \"get_briefing\").length;\n\n let memoryHitsLeader: { id: string; read_count: number } | null = null;\n try {\n const usageIdx = await loadUsageIndex(paths);\n const tops = Object.entries(usageIdx.by_id)\n .map(([id, v]) => ({ id, read_count: v.read_count }))\n .filter((x) => x.read_count > 0)\n .sort((a, b) => b.read_count - a.read_count);\n memoryHitsLeader = tops[0] ?? null;\n } catch {\n memoryHitsLeader = null;\n }\n\n const roiHints = [\n \"Correlate get_briefing calls with skipped multi-file exploration — proxies available via `pnpm benchmark:roi` at repo root.\",\n \"Prefer get_briefing(format:'actions') or budget_preset:'quick' for low-risk edits to reduce token pressure.\",\n \"Run `haive memory lint` in CI to keep the corpus actionable.\",\n \"Install the haive VS Code extension (packages/vscode) for always-on memory surfacing beside the editor.\",\n ];\n\n if (!size.exists || events.length === 0) {\n ui.warn(\"Usage log missing or empty — report still written with partial data.\");\n events = [];\n }\n\n await mkdir(path.dirname(outAbs), { recursive: true });\n const payload = {\n generated_at: new Date().toISOString(),\n project_root: root,\n window_since: sinceRaw,\n usage_log_meta: size,\n memory_inventory: memoryCount,\n aggregate,\n get_briefing_calls_in_window: briefingCalls,\n top_memory_reads: memoryHitsLeader,\n roi_hints: roiHints,\n };\n\n await writeFile(outAbs, JSON.stringify(payload, null, 2), \"utf8\");\n ui.success(`Wrote ROI / usage rollup → ${outAbs}`);\n}\n\nasync function renderMemoryHits(\n paths: ReturnType<typeof resolveHaivePaths>,\n opts: StatsOptions,\n): Promise<void> {\n const index = await loadUsageIndex(paths);\n const since = parseSince(opts.since ?? \"30d\");\n const sinceMs = since ? new Date(since).getTime() : null;\n const entries = Object.entries(index.by_id)\n .map(([id, usage]) => ({ id, ...usage }))\n .filter((e) => e.read_count > 0)\n .filter((e) => {\n if (!sinceMs || !e.last_read_at) return !sinceMs;\n return new Date(e.last_read_at).getTime() >= sinceMs;\n })\n .sort((a, b) => b.read_count - a.read_count);\n\n if (opts.json) {\n console.log(JSON.stringify({\n window: opts.since ?? \"30d\",\n total_mems_with_hits: entries.length,\n top: entries.slice(0, 50),\n }, null, 2));\n return;\n }\n\n const window = opts.since ?? \"30d\";\n console.log(ui.bold(`Memory hits (${window})`));\n if (entries.length === 0) {\n ui.info(\n `No memory reads recorded in window. Reads are logged when ` +\n `\\`haive briefing\\` or \\`haive memory query\\` surface a memory.`,\n );\n return;\n }\n console.log(\n ` ${ui.dim(\"memories with hits:\")} ${entries.length} ` +\n `${ui.dim(\"total reads:\")} ${entries.reduce((a, e) => a + e.read_count, 0)}`,\n );\n console.log();\n console.log(ui.bold(\"Top read memories:\"));\n const maxCount = entries[0]!.read_count;\n for (const e of entries.slice(0, 25)) {\n const bar = \"█\".repeat(Math.max(1, Math.round((e.read_count / maxCount) * 20)));\n const lastRead = e.last_read_at?.slice(0, 10) ?? \"?\";\n console.log(\n ` ${ui.bold(String(e.read_count).padStart(4))} ${ui.green(bar.padEnd(20))} ` +\n `${e.id} ${ui.dim(`last: ${lastRead}`)}`,\n );\n }\n const dead = Object.keys(index.by_id).length - entries.length;\n if (dead > 0) {\n console.log();\n ui.info(`${dead} memor${dead === 1 ? \"y\" : \"ies\"} never read in window — candidates for cleanup (run \\`haive doctor\\`).`);\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 { existsSync } from \"node:fs\";\nimport { readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { estimateTokens, findProjectRoot } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface BenchmarkOptions {\n dir?: string;\n out?: string;\n json?: boolean;\n}\n\ninterface AgentBenchmarkRow {\n fixture: string;\n group: \"haive\" | \"plain\" | \"unknown\";\n commands: number;\n files_read: number;\n files_modified: number;\n test_iterations: number;\n terminal_failures: number;\n decision_mentions: number;\n token_proxy: number;\n haive_impact: boolean;\n}\n\nexport function registerBenchmark(program: Command): void {\n const benchmark = program\n .command(\"benchmark\")\n .description(\"Official hAIve benchmark/demo utilities for measuring agent enforcement value.\");\n\n benchmark\n .command(\"report\")\n .description(\"Summarize BENCHMARK_AGENT_REPORT.md files from a paired hAIve/plain agent benchmark.\")\n .option(\"-d, --dir <dir>\", \"benchmark root\", \"benchmarks/agent-benchmark\")\n .option(\"--out <file>\", \"write a Markdown report\")\n .option(\"--json\", \"emit JSON\", false)\n .action(async (opts: BenchmarkOptions) => {\n const root = resolveBenchmarkRoot(opts.dir);\n const rows = await collectRows(root);\n const summary = summarizeRows(rows);\n\n if (opts.json) {\n console.log(JSON.stringify({ root, summary, rows }, null, 2));\n return;\n }\n\n const markdown = renderMarkdown(root, summary, rows);\n if (opts.out) {\n const outFile = path.isAbsolute(opts.out) ? opts.out : path.join(root, opts.out);\n await writeFile(outFile, markdown, \"utf8\");\n ui.success(`wrote ${path.relative(process.cwd(), outFile)}`);\n return;\n }\n console.log(markdown);\n });\n\n benchmark\n .command(\"demo\")\n .description(\"Print the recommended protocol for running a hAIve vs plain agent benchmark.\")\n .action(() => {\n console.log([\n \"# hAIve Agent Benchmark Demo\",\n \"\",\n \"1. Create paired fixtures: one `*-haive`, one `*-plain`.\",\n \"2. Put the same failing tests in both fixtures.\",\n \"3. Add precise `.ai/memories/team/*.md` policy memories only to the hAIve fixture.\",\n \"4. Run equal agents in parallel:\",\n \" - hAIve agents must run `haive briefing --files ... --task ...` first.\",\n \" - Plain agents must not read `.ai` or call hAIve.\",\n \"5. Require every agent to write `BENCHMARK_AGENT_REPORT.md`.\",\n \"6. Run `haive benchmark report --dir <benchmark-root> --out RESULTS.md`.\",\n \"\",\n \"Recommended metrics: pass rate, test iterations, files read, files changed, visible artifacts, decision quality, and token proxy.\",\n ].join(\"\\n\"));\n });\n}\n\nfunction resolveBenchmarkRoot(dir: string | undefined): string {\n const candidate = dir ?? \"benchmarks/agent-benchmark\";\n if (path.isAbsolute(candidate)) return candidate;\n const projectRoot = findProjectRoot(process.cwd());\n return path.join(projectRoot, candidate);\n}\n\nasync function collectRows(root: string): Promise<AgentBenchmarkRow[]> {\n if (!existsSync(root)) throw new Error(`Benchmark directory not found: ${root}`);\n const entries = await readdir(root, { withFileTypes: true });\n const rows: AgentBenchmarkRow[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const fixtureDir = path.join(root, entry.name);\n const reportFile = path.join(fixtureDir, \"BENCHMARK_AGENT_REPORT.md\");\n if (!existsSync(reportFile)) continue;\n const report = await readFile(reportFile, \"utf8\");\n rows.push(parseAgentReport(entry.name, report));\n }\n return rows.sort((a, b) => a.fixture.localeCompare(b.fixture));\n}\n\nfunction parseAgentReport(fixture: string, report: string): AgentBenchmarkRow {\n const group = fixture.endsWith(\"-haive\") ? \"haive\" : fixture.endsWith(\"-plain\") ? \"plain\" : \"unknown\";\n return {\n fixture,\n group,\n commands: sectionBulletCount(report, \"Commands\"),\n files_read: sectionBulletCount(report, \"Files Read\"),\n files_modified: sectionBulletCount(report, \"Files Modified\"),\n test_iterations: countMatches(section(report, \"Test Iterations\"), /Iteration\\s+\\d+|^- /gim),\n terminal_failures: countMatches(section(report, \"Terminal Errors\"), /fail|error|not raised|exited with code 1/gi),\n decision_mentions: sectionBulletCount(report, \"Key Decisions\"),\n token_proxy: estimateTokens(report),\n haive_impact: /hAIve Memory Impact[\\s\\S]*?\\b(yes|directly|changed|shaped|confirmed)\\b/i.test(report),\n };\n}\n\nfunction summarizeRows(rows: AgentBenchmarkRow[]) {\n const byGroup = (group: AgentBenchmarkRow[\"group\"]) => rows.filter((r) => r.group === group);\n return {\n fixtures: rows.length,\n haive: summarizeGroup(byGroup(\"haive\")),\n plain: summarizeGroup(byGroup(\"plain\")),\n };\n}\n\nfunction summarizeGroup(rows: AgentBenchmarkRow[]) {\n const sum = (key: keyof AgentBenchmarkRow): number =>\n rows.reduce((total, row) => total + Number(row[key] ?? 0), 0);\n return {\n fixtures: rows.length,\n commands: sum(\"commands\"),\n files_read: sum(\"files_read\"),\n files_modified: sum(\"files_modified\"),\n test_iterations: sum(\"test_iterations\"),\n terminal_failures: sum(\"terminal_failures\"),\n decision_mentions: sum(\"decision_mentions\"),\n token_proxy: sum(\"token_proxy\"),\n haive_impact_count: rows.filter((r) => r.haive_impact).length,\n };\n}\n\nfunction renderMarkdown(\n root: string,\n summary: ReturnType<typeof summarizeRows>,\n rows: AgentBenchmarkRow[],\n): string {\n const lines = [\n \"# hAIve Agent Benchmark Report\",\n \"\",\n `Benchmark root: \\`${root}\\``,\n \"\",\n \"## Summary\",\n \"\",\n \"| Group | Fixtures | Commands | Files read | Files modified | Test iterations | Terminal failures | Decision mentions | Token proxy | hAIve impact |\",\n \"| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |\",\n groupLine(\"hAIve\", summary.haive),\n groupLine(\"Plain\", summary.plain),\n \"\",\n \"## Fixtures\",\n \"\",\n \"| Fixture | Group | Commands | Files read | Files modified | Test iterations | Terminal failures | Decisions | Token proxy | hAIve impact |\",\n \"| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |\",\n ...rows.map((row) =>\n `| \\`${row.fixture}\\` | ${row.group} | ${row.commands} | ${row.files_read} | ${row.files_modified} | ${row.test_iterations} | ${row.terminal_failures} | ${row.decision_mentions} | ${row.token_proxy} | ${row.haive_impact ? \"yes\" : \"no\"} |`,\n ),\n \"\",\n \"## Reading\",\n \"\",\n \"The token proxy is estimated from the agent report size, not from private model billing data.\",\n \"Use this report to compare relative effort and decision quality, then pair it with final test results and a human review of the diffs.\",\n \"\",\n ];\n return lines.join(\"\\n\");\n}\n\nfunction groupLine(label: string, group: ReturnType<typeof summarizeGroup>): string {\n return `| ${label} | ${group.fixtures} | ${group.commands} | ${group.files_read} | ${group.files_modified} | ${group.test_iterations} | ${group.terminal_failures} | ${group.decision_mentions} | ${group.token_proxy} | ${group.haive_impact_count} |`;\n}\n\nfunction sectionBulletCount(markdown: string, title: string): number {\n return countMatches(section(markdown, title), /^- |^\\d+\\.\\s/gm);\n}\n\nfunction section(markdown: string, title: string): string {\n const re = new RegExp(`##\\\\s+[^\\\\n]*${escapeRegExp(title)}[^\\\\n]*\\\\n([\\\\s\\\\S]*?)(?=\\\\n##\\\\s+|$)`, \"i\");\n return re.exec(markdown)?.[1] ?? \"\";\n}\n\nfunction countMatches(text: string, re: RegExp): number {\n return [...text.matchAll(re)].length;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\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 { execSync } from \"node:child_process\";\nimport { Command } from \"commander\";\n\ndeclare const __HAIVE_VERSION__: string;\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.enforcement?.requireBriefingFirst) {\n const claudeSettings = path.join(root, \".claude\", \"settings.local.json\");\n let hasClaudeEnforcement = false;\n if (existsSync(claudeSettings)) {\n try {\n const { readFile } = await import(\"node:fs/promises\");\n const raw = await readFile(claudeSettings, \"utf8\");\n hasClaudeEnforcement =\n raw.includes(\"haive enforce session-start\") &&\n raw.includes(\"haive enforce pre-tool-use\");\n } catch {\n hasClaudeEnforcement = false;\n }\n }\n if (!hasClaudeEnforcement) {\n findings.push({\n severity: \"info\",\n code: \"claude-enforcement-hooks-missing\",\n message: \"hAIve enforcement is enabled, but project-scoped Claude Code hooks are not installed.\",\n fix: \"haive install-hooks claude --scope project\",\n });\n }\n }\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 // ── 7. Legacy standalone haive-mcp ──────────────────────────────────────\n // MCP runs inside `haive mcp --stdio` — updating @hiveai/cli is enough.\n // Warn only if an old global haive-mcp exists and disagrees with CLI.\n try {\n const legacyRaw = execSync(\"haive-mcp --version\", {\n encoding: \"utf8\",\n timeout: 3000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n const cliVersion = __HAIVE_VERSION__;\n if (legacyRaw && legacyRaw !== cliVersion) {\n findings.push({\n severity: \"warn\",\n code: \"legacy-haive-mcp-stale\",\n message:\n `Standalone haive-mcp on PATH is v${legacyRaw} but haive CLI is v${cliVersion}. ` +\n `Prefer MCP client config with command \\\"haive\\\" and args [\\\"mcp\\\", \\\"--stdio\\\"] — ` +\n `then removing @hiveai/mcp avoids version skew.`,\n fix:\n `npm install -g @hiveai/cli@${cliVersion}\\n` +\n `# optionally uninstall duplicate:\\n` +\n `npm uninstall -g @hiveai/mcp`,\n });\n }\n } catch {\n // haive-mcp not on PATH — expected when using bundled MCP via haive only\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","/**\n * Curated onboarding: print high-signal team memories in read order — no MCP required.\n */\nimport { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadMemoriesFromDir,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nconst TYPE_RANK: Record<string, number> = {\n decision: 0,\n architecture: 1,\n convention: 2,\n glossary: 3,\n gotcha: 4,\n attempt: 5,\n};\n\ninterface WelcomeOpts {\n limit?: string;\n dir?: string;\n}\n\nexport function registerWelcome(program: Command): void {\n program\n .command(\"welcome\")\n .description(\n \"Onboarding checklist: ranks validated/proposed **team** memories by type.\\n\" +\n \"Use after `haive init` so new devs skim institutional knowledge quickly.\\n\\n\" +\n \" haive welcome\\n\" +\n \" haive welcome --limit 15\\n\",\n )\n .option(\"--limit <n>\", \"maximum memories listed\", \"20\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: WelcomeOpts) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No memories at ${paths.memoriesDir}. Run 'haive init' first.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const team = all.filter(\n ({ memory }) =>\n memory.frontmatter.scope === \"team\" &&\n memory.frontmatter.status !== \"rejected\" &&\n memory.frontmatter.status !== \"deprecated\" &&\n memory.frontmatter.status !== \"stale\" &&\n memory.frontmatter.type !== \"session_recap\",\n );\n\n team.sort((a, b) => {\n const ta = TYPE_RANK[a.memory.frontmatter.type] ?? 99;\n const tb = TYPE_RANK[b.memory.frontmatter.type] ?? 99;\n if (ta !== tb) return ta - tb;\n const sta = a.memory.frontmatter.status === \"validated\" ? 0 : 1;\n const stb = b.memory.frontmatter.status === \"validated\" ? 0 : 1;\n if (sta !== stb) return sta - stb;\n return b.memory.frontmatter.created_at.localeCompare(a.memory.frontmatter.created_at);\n });\n\n const cap = Math.max(1, Math.min(500, Number(opts.limit) || 20));\n const pick = team.slice(0, cap);\n\n console.log(ui.bold(`hAIve welcome — ${pick.length} team memories (${root})`));\n console.log(ui.dim(`Next: invoke get_briefing with your task or run 'haive briefing --task \"…\"'`));\n\n if (pick.length === 0) {\n ui.warn(\"No team memories yet — add some with 'haive memory add' or promote personal ones.\");\n return;\n }\n\n let i = 1;\n for (const { memory } of pick) {\n const fm = memory.frontmatter;\n const head = memory.body.match(/^#\\s+(.+)/m)?.[1]?.trim();\n const line = head ?? fm.id;\n console.log(\n `${String(i).padStart(2, \" \")} ${fm.type.padEnd(12)} ${fm.status.padEnd(10)} ${ui.dim(fm.id)}\\n ${line}`,\n );\n i++;\n }\n });\n}\n","/**\n * Lightweight quality checks — no ML, safe to run on CI alongside tests.\n */\nimport { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadMemoriesFromDir,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nexport type LintSeverity = \"error\" | \"warn\" | \"info\";\n\nexport interface MemoryLintFinding {\n file: string;\n id: string;\n severity: LintSeverity;\n code: string;\n message: string;\n}\n\ninterface LintOpts {\n json?: boolean;\n dir?: string;\n}\n\nexport async function lintMemoriesAsync(root: string): Promise<MemoryLintFinding[]> {\n const paths = resolveHaivePaths(root);\n const out: MemoryLintFinding[] = [];\n if (!existsSync(paths.memoriesDir)) return out;\n\n const loaded = await loadMemoriesFromDir(paths.memoriesDir);\n\n const ANCHOR_TYPES = new Set([\"decision\", \"architecture\", \"gotcha\"]);\n\n for (const { filePath, memory } of loaded) {\n const fm = memory.frontmatter;\n if (fm.type === \"session_recap\") continue;\n\n const body = memory.body.trim();\n const naked = body.replace(/^#.*$/gm, \"\").replace(/```[\\s\\S]*?```/g, \"\").trim();\n\n if (naked.length < 40 && fm.status !== \"rejected\") {\n out.push({\n file: filePath,\n id: fm.id,\n severity: \"warn\",\n code: \"SHORT_BODY\",\n message: \"Body looks very short (< ~40 chars of prose after headings). Prefer actionable detail.\",\n });\n }\n\n if (ANCHOR_TYPES.has(fm.type) && fm.anchor.paths.length === 0 && fm.status === \"validated\") {\n out.push({\n file: filePath,\n id: fm.id,\n severity: \"warn\",\n code: \"MISSING_ANCHOR\",\n message:\n `${fm.type} is validated without anchor paths — add anchor.paths so haive sync can flag staleness.`,\n });\n }\n\n if (fm.status === \"stale\" && !fm.stale_reason) {\n out.push({\n file: filePath,\n id: fm.id,\n severity: \"info\",\n code: \"STALE_NO_REASON\",\n message: \"Status is stale but stale_reason is empty — document why when possible.\",\n });\n }\n\n if (fm.type === \"glossary\" && naked.length > 6000) {\n out.push({\n file: filePath,\n id: fm.id,\n severity: \"info\",\n code: \"LONG_GLOSSARY\",\n message: \"Very long glossary — consider splitting concepts for tighter briefings.\",\n });\n }\n\n const hasMarkdownHeading = /^#{1,3}\\s+\\S/m.test(memory.body.trim());\n if (!hasMarkdownHeading) {\n out.push({\n file: filePath,\n id: fm.id,\n severity: \"warn\",\n code: \"NO_MD_HEADING\",\n message:\n \"No Markdown heading (#/##/###) — add one so humans and auditors can skim the memo quickly.\",\n });\n }\n }\n\n return out;\n}\n\nexport function registerMemoryLint(parent: Command): void {\n parent\n .command(\"lint\")\n .description(\n \"Heuristic corpus checks (anchors on key types, headings, verbosity). Static analysis only.\",\n )\n .option(\"--json\", \"emit findings as JSON\", false)\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: LintOpts) => {\n const root = findProjectRoot(opts.dir);\n const findings = await lintMemoriesAsync(root);\n\n if (opts.json) {\n console.log(JSON.stringify({ findings_count: findings.length, findings }, null, 2));\n process.exitCode = findings.some((f) => f.severity === \"error\") ? 1 : 0;\n return;\n }\n\n if (findings.length === 0) {\n ui.success(`memory lint OK — ${root}`);\n return;\n }\n\n console.log(ui.bold(`memory lint (${findings.length} finding${findings.length === 1 ? \"\" : \"s\"})`) + `\\n`);\n\n const order: Record<LintSeverity, number> = { error: 0, warn: 1, info: 2 };\n findings.sort((a, b) => order[a.severity] - order[b.severity] || a.id.localeCompare(b.id));\n\n for (const f of findings) {\n const color =\n f.severity === \"error\" ? ui.red : f.severity === \"warn\" ? ui.yellow : ui.dim;\n console.log(\n `${color(f.severity.padEnd(5))} ${ui.dim(f.code)} ${f.id}`,\n );\n console.log(` ${f.message}`);\n console.log(ui.dim(` → ${f.file}`));\n }\n\n process.exitCode = findings.some((x) => x.severity === \"error\") ? 1 : 0;\n });\n}\n","import { Command } from \"commander\";\nimport { MemoryTypeSchema, suggestTopicKey } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nexport function registerMemorySuggestTopic(memory: Command): void {\n memory\n .command(\"suggest-topic\")\n .description(\"Suggest a stable topic key (topic-upsert) from type + title phrase\")\n .requiredOption(\n \"--type <type>\",\n \"convention | decision | gotcha | architecture | glossary | attempt | session_recap\",\n )\n .argument(\"<title>\", \"Short title or phrase to slugify\")\n .action((title: string, opts: { type: string }) => {\n const parsed = MemoryTypeSchema.safeParse(opts.type);\n if (!parsed.success) {\n ui.error(`Invalid type: ${opts.type}`);\n process.exit(1);\n }\n const suggestion = suggestTopicKey(parsed.data, title);\n console.log(JSON.stringify({ type: parsed.data, ...suggestion }, null, 2));\n });\n}\n","import path from \"node:path\";\nimport { Command } from \"commander\";\nimport { resolveProjectInfo } from \"@hiveai/core\";\n\nexport function registerResolveProject(program: Command): void {\n program\n .command(\"resolve-project\")\n .description(\n \"Print JSON for hAIve project root resolution (HAIVE_PROJECT_ROOT, markers, .ai layout).\",\n )\n .option(\"-d, --dir <dir>\", \"working directory\", process.cwd())\n .action((opts: { dir: string }) => {\n const info = resolveProjectInfo({ cwd: path.resolve(opts.dir) });\n console.log(JSON.stringify({ ok: true, info }, null, 2));\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n appendRuntimeJournalEntry,\n findProjectRoot,\n readRuntimeJournalTail,\n resolveHaivePaths,\n type RuntimeJournalEntry,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface JournalAppendOpts {\n kind: string;\n dir?: string;\n}\n\nexport function registerRuntime(program: Command): void {\n const runtime = program\n .command(\"runtime\")\n .description(\n \"Local-only .ai/.runtime helpers (not versioned team memory). See session-journal.ndjson.\",\n );\n\n const journal = runtime\n .command(\"journal\")\n .description(\"Append or read the machine-local session journal (NDJSON)\");\n\n journal\n .command(\"append\")\n .description(\"Append one JSON line to .ai/.runtime/session-journal.ndjson\")\n .argument(\"<message>\", \"short text to log\")\n .option(\"-k, --kind <kind>\", \"note | session_end | mcp\", \"note\")\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .action(async (message: string, opts: JournalAppendOpts) => {\n const root = path.resolve(opts.dir ?? process.cwd());\n const paths = resolveHaivePaths(findProjectRoot(root));\n const raw = opts.kind ?? \"note\";\n const kind = ([\"note\", \"session_end\", \"mcp\"].includes(raw)\n ? raw\n : \"note\") as RuntimeJournalEntry[\"kind\"];\n await appendRuntimeJournalEntry(paths, { kind, message });\n ui.success(`Appended to ${path.relative(root, paths.runtimeDir)}/session-journal.ndjson`);\n });\n\n journal\n .command(\"tail\")\n .description(\"Print the last N entries from the runtime session journal as JSON\")\n .option(\"-n, --limit <n>\", \"number of lines\", \"30\")\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .action(async (opts: { limit: string; dir?: string }) => {\n const root = path.resolve(opts.dir ?? process.cwd());\n const paths = resolveHaivePaths(findProjectRoot(root));\n const limit = Math.min(500, Math.max(1, parseInt(opts.limit, 10) || 30));\n if (!existsSync(paths.haiveDir)) {\n ui.error(\"No .ai/ — run `haive init` first.\");\n process.exitCode = 1;\n return;\n }\n const entries = await readRuntimeJournalTail(paths, limit);\n if (entries.length === 0) {\n ui.info(\"Journal empty or missing.\");\n return;\n }\n console.log(JSON.stringify({ entries, count: entries.length }, null, 2));\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n collectTimelineEntries,\n findProjectRoot,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface TimelineOpts {\n id?: string;\n topic?: string;\n limit: string;\n dir?: string;\n}\n\nexport function registerMemoryTimeline(memory: Command): void {\n memory\n .command(\"timeline\")\n .description(\n \"List related memories chronologically (topic, related_ids, anchors) — same logic as MCP mem_timeline.\",\n )\n .option(\"--id <id>\", \"seed memory id\")\n .option(\"--topic <key>\", \"filter by frontmatter.topic (use without --id for topic-only)\")\n .option(\"-n, --limit <n>\", \"max entries\", \"30\")\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .action(async (opts: TimelineOpts) => {\n if (!opts.id && !opts.topic) {\n ui.error(\"Provide --id and/or --topic.\");\n process.exitCode = 1;\n return;\n }\n const root = path.resolve(opts.dir ?? process.cwd());\n const paths = resolveHaivePaths(findProjectRoot(root));\n if (!existsSync(paths.memoriesDir)) {\n ui.error(\"No memories — run `haive init`.\");\n process.exitCode = 1;\n return;\n }\n const limit = Math.min(100, Math.max(1, parseInt(opts.limit, 10) || 30));\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const { entries, notice } = collectTimelineEntries(all, {\n memoryId: opts.id,\n topic: opts.topic,\n limit,\n });\n if (notice) ui.warn(notice);\n console.log(JSON.stringify({ entries, total: entries.length }, null, 2));\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findLexicalConflictPairs,\n findTopicStatusConflictPairs,\n findProjectRoot,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ntype MemType = \"decision\" | \"architecture\" | \"convention\" | \"gotcha\";\n\ninterface CandOpts {\n sinceDays: string;\n types: string;\n minJaccard: string;\n maxPairs: string;\n maxScan: string;\n maxTopicPairs: string;\n dir?: string;\n}\n\nfunction parseTypes(csv: string): MemType[] {\n const allowed: MemType[] = [\"decision\", \"architecture\", \"convention\", \"gotcha\"];\n const parts = csv.split(\",\").map((s) => s.trim().toLowerCase());\n const out = parts.filter((p): p is MemType => allowed.includes(p as MemType));\n return out.length ? out : [\"decision\", \"architecture\"];\n}\n\nexport function registerMemoryConflictCandidates(memory: Command): void {\n memory\n .command(\"conflict-candidates\")\n .description(\n \"Heuristic conflict candidates (lexical Jaccard + same-topic validated/rejected pairs) — aligns with MCP mem_conflict_candidates.\",\n )\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .option(\"--since-days <n>\", \"only memories created within N days (lexical scan)\", \"365\")\n .option(\n \"--types <csv>\",\n \"decision,architecture,convention,gotcha (lexical scan)\",\n \"decision,architecture\",\n )\n .option(\"--min-jaccard <x>\", \"minimum Jaccard for lexical pairs\", \"0.45\")\n .option(\"--max-pairs <n>\", \"cap lexical pairs\", \"20\")\n .option(\"--max-scan <n>\", \"max memories scanned (lexical)\", \"500\")\n .option(\"--max-topic-pairs <n>\", \"cap topic/status pairs\", \"20\")\n .action(async (opts: CandOpts) => {\n const root = path.resolve(opts.dir ?? process.cwd());\n const paths = resolveHaivePaths(findProjectRoot(root));\n if (!existsSync(paths.memoriesDir)) {\n ui.error(\"No memories — run `haive init`.\");\n process.exitCode = 1;\n return;\n }\n\n const sinceDays = Math.max(1, parseInt(opts.sinceDays, 10) || 365);\n const minJaccard = parseFloat(opts.minJaccard) || 0.45;\n const maxPairs = Math.min(100, Math.max(1, parseInt(opts.maxPairs, 10) || 20));\n const maxScan = Math.min(2000, Math.max(1, parseInt(opts.maxScan, 10) || 500));\n const maxTopicPairs = Math.min(100, Math.max(1, parseInt(opts.maxTopicPairs, 10) || 20));\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const lexical = findLexicalConflictPairs(all, {\n sinceDays,\n types: parseTypes(opts.types),\n minJaccard,\n maxPairs,\n maxScan,\n });\n const topicStatusPairs = findTopicStatusConflictPairs(all, maxTopicPairs);\n\n console.log(\n JSON.stringify(\n {\n pairs: lexical.pairs,\n topic_status_pairs: topicStatusPairs,\n scanned: lexical.scanned,\n truncated: lexical.truncated,\n },\n null,\n 2,\n ),\n );\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { chmod, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n hasRecentBriefingMarker,\n isFreshIsoDate,\n loadConfig,\n loadMemoriesFromDir,\n memoryMatchesAnchorPaths,\n readRecentBriefingMarker,\n resolveBriefingBudget,\n resolveHaivePaths,\n saveConfig,\n SESSION_RECAP_TTL_MS,\n verifyAnchor,\n writeBriefingMarker,\n type HaiveConfig,\n} from \"@hiveai/core\";\nimport { getBriefing, preCommitCheck } from \"@hiveai/mcp\";\nimport { ui } from \"../utils/ui.js\";\nimport { installClaudeHooksAtPath, defaultClaudeSettingsPath } from \"../utils/claude-hooks.js\";\n\nconst MAX_STDIN_BYTES = 256 * 1024;\nconst ENFORCE_HOOK_MARKER = \"# hAIve enforcement hook\";\n\ninterface HookPayload {\n cwd?: string;\n session_id?: string;\n prompt?: string;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n}\n\ninterface EnforceOptions {\n dir?: string;\n task?: string;\n source?: string;\n sessionId?: string;\n json?: boolean;\n stage?: \"local\" | \"pre-commit\" | \"pre-push\" | \"ci\";\n strict?: boolean;\n claude?: boolean;\n git?: boolean;\n ci?: boolean;\n}\n\ninterface EnforcementFinding {\n severity: \"ok\" | \"info\" | \"warn\" | \"error\";\n code: string;\n message: string;\n fix?: string;\n impact?: number;\n}\n\ninterface EnforcementScore {\n score: number;\n threshold: number;\n checks: {\n total: number;\n ok: number;\n warn: number;\n error: number;\n };\n}\n\ninterface EnforcementReport {\n root: string;\n initialized: boolean;\n mode: \"off\" | \"advisory\" | \"strict\";\n score: EnforcementScore;\n should_block: boolean;\n findings: EnforcementFinding[];\n}\n\nexport function registerEnforce(program: Command): void {\n const enforce = program\n .command(\"enforce\")\n .description(\n \"Agent-agnostic enforcement helpers: install policy gates, report status, and block unsafe workflows.\",\n );\n\n enforce\n .command(\"install\")\n .description(\"Install hAIve enforcement across MCP config, git hooks, CI template, and supported client hooks.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--no-git\", \"skip git pre-commit/pre-push enforcement hooks\")\n .option(\"--no-claude\", \"skip Claude Code hooks\")\n .option(\"--no-ci\", \"skip GitHub Actions enforcement workflow\")\n .action(async (opts: EnforceOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n await mkdir(paths.haiveDir, { recursive: true });\n const current = await loadConfig(paths);\n await saveConfig(paths, {\n ...current,\n enforcement: {\n ...current.enforcement,\n mode: \"strict\",\n requireBriefingFirst: true,\n requireSessionRecap: true,\n requireMemoryVerify: true,\n blockStaleDecisionChanges: true,\n requireDecisionCoverage: true,\n scoreThreshold: 85,\n cleanupGeneratedArtifacts: true,\n toolProfile: \"enforcement\",\n policyPacks: [\"architecture\", \"gotchas\", \"security\", \"domain\", \"release\"],\n },\n });\n ui.success(\"hAIve strict enforcement enabled in .ai/haive.config.json\");\n\n if (opts.git !== false) await installGitEnforcement(root);\n if (opts.ci !== false) await installCiEnforcement(root);\n if (opts.claude !== false) {\n try {\n const result = await installClaudeHooksAtPath(defaultClaudeSettingsPath(\"project\", root));\n ui.success(`${result.created ? \"Created\" : \"Patched\"} Claude Code hooks (${path.relative(root, result.settingsPath)})`);\n } catch (err) {\n ui.warn(`Claude Code hooks not installed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n ui.info(\"Agent-agnostic gates are now active at workflow level: MCP, git, CI, and optional client hooks.\");\n ui.info(\"Use `haive run -- <agent command>` for agents that do not expose blocking hooks.\");\n });\n\n enforce\n .command(\"status\")\n .description(\"Show whether this project has agent-agnostic hAIve enforcement installed.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--json\", \"emit JSON\", false)\n .action(async (opts: EnforceOptions) => {\n const report = await buildEnforcementReport(opts.dir, \"local\");\n printReport(report, Boolean(opts.json));\n if (report.should_block) process.exitCode = 1;\n });\n\n enforce\n .command(\"check\")\n .description(\"Run the hAIve policy gate. Intended for pre-commit, pre-push, wrappers, and any agent client.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--stage <stage>\", \"local | pre-commit | pre-push | ci\", \"local\")\n .option(\"--json\", \"emit JSON\", false)\n .action(async (opts: EnforceOptions) => {\n const report = await buildEnforcementReport(opts.dir, opts.stage ?? \"local\");\n printReport(report, Boolean(opts.json));\n if (report.should_block) process.exit(2);\n });\n\n enforce\n .command(\"cleanup\")\n .description(\"Remove generated hAIve runtime/cache artifacts that should not appear in commits.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--dry-run\", \"print what would be removed without deleting\", false)\n .action(async (opts: EnforceOptions & { dryRun?: boolean }) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const targets = [\n path.join(paths.haiveDir, \".cache\"),\n path.join(paths.haiveDir, \".runtime\"),\n ];\n for (const target of targets) {\n if (!existsSync(target)) continue;\n const rel = path.relative(root, target);\n if (opts.dryRun) ui.info(`would remove ${rel}`);\n else {\n await rm(target, { recursive: true, force: true });\n ui.success(`removed ${rel}`);\n }\n }\n });\n\n enforce\n .command(\"ci\")\n .description(\"CI entrypoint: fail if the repository violates hAIve enforcement policy.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--json\", \"emit JSON\", false)\n .action(async (opts: EnforceOptions) => {\n const report = await buildEnforcementReport(opts.dir, \"ci\");\n printReport(report, Boolean(opts.json));\n if (report.should_block) process.exit(2);\n });\n\n enforce\n .command(\"session-start\")\n .description(\"Claude Code SessionStart hook: inject briefing and write a local briefing marker.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--task <text>\", \"task text to rank memories\")\n .option(\"--source <name>\", \"marker source\", \"claude-session-start\")\n .option(\"--session-id <id>\", \"agent session id\")\n .action(async (opts: EnforceOptions) => {\n const payload = await readHookPayload();\n const root = resolveRoot(opts.dir, payload);\n if (!root) return;\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) return;\n await mkdir(paths.runtimeDir, { recursive: true });\n const sessionId = opts.sessionId ?? payload.session_id;\n const task = opts.task ?? payload.prompt ?? \"Start an AI coding session in this hAIve-initialized project.\";\n\n const budget = resolveBriefingBudget(\"quick\", {\n max_tokens: 2500,\n max_memories: 5,\n include_module_contexts: false,\n });\n const briefing = await getBriefing(\n {\n task,\n files: [],\n max_tokens: budget.max_tokens,\n max_memories: budget.max_memories,\n include_project_context: true,\n include_module_contexts: budget.include_module_contexts,\n semantic: true,\n include_stale: false,\n track: true,\n format: \"actions\",\n symbols: [],\n min_semantic_score: 0.25,\n budget_preset: \"quick\",\n },\n { paths },\n );\n await writeBriefingMarker(paths, {\n sessionId,\n task,\n source: opts.source ?? \"claude-session-start\",\n memoryIds: briefing.memories.map((m) => m.id),\n });\n\n console.log(\"hAIve briefing loaded. Agents must consult this before editing.\");\n if (briefing.last_session) {\n console.log(`\\n## Last session\\n${briefing.last_session.body.slice(0, 1200)}`);\n }\n if (briefing.project_context?.content) {\n console.log(`\\n## Project context\\n${briefing.project_context.content.slice(0, 1800)}`);\n }\n if (briefing.memories.length > 0) {\n console.log(\"\\n## Relevant memories\");\n for (const memory of briefing.memories.slice(0, 6)) {\n console.log(`\\n### ${memory.id} (${memory.scope}/${memory.type}, ${memory.confidence})`);\n console.log(memory.body.slice(0, 1000));\n }\n }\n for (const warning of briefing.setup_warnings) {\n console.log(`\\n[setup warning] ${warning}`);\n }\n });\n\n enforce\n .command(\"pre-tool-use\")\n .description(\"Claude Code PreToolUse hook: block writes until hAIve briefing has been loaded.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: EnforceOptions) => {\n const payload = await readHookPayload();\n const root = resolveRoot(opts.dir, payload);\n if (!root) return;\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) return;\n if (!isWriteLikeTool(payload)) return;\n\n const ok = await hasRecentBriefingMarker(paths, payload.session_id);\n if (ok) return;\n\n const tool = payload.tool_name ?? \"write tool\";\n console.error(\n [\n \"hAIve enforcement blocked this action.\",\n `Tool: ${tool}`,\n \"\",\n \"This project is initialized with hAIve. Load the team briefing before editing:\",\n \" haive enforce session-start\",\n \"or call MCP get_briefing / mem_relevant_to from your AI client.\",\n \"\",\n \"If this is intentional, a human can disable enforcement in .ai/haive.config.json:\",\n ' { \"enforcement\": { \"requireBriefingFirst\": false } }',\n ].join(\"\\n\"),\n );\n process.exit(2);\n });\n}\n\nexport async function runWithEnforcement(\n command: string,\n args: string[],\n opts: { dir?: string; task?: string },\n): Promise<void> {\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.exit(1);\n }\n\n const sessionId = `haive-run-${process.pid}-${Date.now()}`;\n const task = opts.task ?? `Run agent command: ${[command, ...args].join(\" \")}`;\n await writeBriefingMarker(paths, {\n sessionId,\n task,\n source: \"haive-run\",\n });\n const briefingFile = await writeWrapperBriefing(paths, sessionId, task);\n\n const before = await buildEnforcementReport(root, \"local\", sessionId);\n const blocking = before.findings.filter((f) => f.severity === \"error\" && f.code !== \"session-recap-missing\");\n if (blocking.length > 0) {\n printReport({ ...before, should_block: true, findings: blocking }, false);\n process.exit(2);\n }\n\n ui.info(`hAIve briefing marker created for wrapped agent session: ${sessionId}`);\n ui.info(`Briefing written to ${path.relative(root, briefingFile)} and exported as HAIVE_BRIEFING_FILE`);\n const child = spawn(command, args, {\n cwd: root,\n stdio: \"inherit\",\n env: {\n ...process.env,\n HAIVE_PROJECT_ROOT: root,\n HAIVE_SESSION_ID: sessionId,\n HAIVE_BRIEFING_FILE: briefingFile,\n HAIVE_ENFORCEMENT: \"strict\",\n HAIVE_TOOL_PROFILE: process.env.HAIVE_TOOL_PROFILE ?? \"enforcement\",\n },\n });\n await new Promise<void>((resolve, reject) => {\n child.on(\"error\", reject);\n child.on(\"close\", (code, signal) => {\n if (signal) process.exit(128);\n process.exitCode = code ?? 0;\n resolve();\n });\n });\n}\n\nasync function writeWrapperBriefing(\n paths: ReturnType<typeof resolveHaivePaths>,\n sessionId: string,\n task: string,\n): Promise<string> {\n const budget = resolveBriefingBudget(\"quick\", {\n max_tokens: 2500,\n max_memories: 5,\n include_module_contexts: false,\n });\n const briefing = await getBriefing({\n task,\n files: [],\n max_tokens: budget.max_tokens,\n max_memories: budget.max_memories,\n include_project_context: true,\n include_module_contexts: budget.include_module_contexts,\n semantic: true,\n include_stale: false,\n track: true,\n format: \"actions\",\n symbols: [],\n min_semantic_score: 0.25,\n budget_preset: \"quick\",\n }, { paths });\n await writeBriefingMarker(paths, {\n sessionId,\n task,\n source: \"haive-run\",\n memoryIds: briefing.memories.map((m) => m.id),\n });\n const dir = path.join(paths.runtimeDir, \"enforcement\", \"briefings\");\n await mkdir(dir, { recursive: true });\n const file = path.join(dir, `${sessionId}.md`);\n const parts = [\n \"# hAIve Briefing\",\n \"\",\n `Task: ${task}`,\n \"\",\n ];\n if (briefing.last_session) parts.push(\"## Last Session\", briefing.last_session.body.trim(), \"\");\n if (briefing.project_context?.content) parts.push(\"## Project Context\", briefing.project_context.content.trim(), \"\");\n if (briefing.memories.length > 0) {\n parts.push(\"## Relevant Memories\");\n for (const memory of briefing.memories) {\n parts.push(\"\", `### ${memory.id}`, memory.body.trim());\n }\n }\n if (briefing.setup_warnings.length > 0) {\n parts.push(\"\", \"## Setup Warnings\", ...briefing.setup_warnings.map((w) => `- ${w}`));\n }\n await writeFile(file, parts.join(\"\\n\") + \"\\n\", \"utf8\");\n return file;\n}\n\nasync function buildEnforcementReport(\n dir: string | undefined,\n stage: \"local\" | \"pre-commit\" | \"pre-push\" | \"ci\",\n sessionId?: string,\n): Promise<EnforcementReport> {\n const root = findProjectRoot(dir);\n const paths = resolveHaivePaths(root);\n const initialized = existsSync(paths.haiveDir);\n const config = initialized ? await loadConfig(paths) : {};\n const mode = config.enforcement?.mode ?? \"strict\";\n const findings: EnforcementFinding[] = [];\n\n if (!initialized) {\n return {\n root,\n initialized,\n mode,\n score: buildScore([], config.enforcement?.scoreThreshold),\n should_block: true,\n findings: [{\n severity: \"error\",\n code: \"not-initialized\",\n message: \"This repository is not initialized with hAIve.\",\n fix: \"Run `haive init` or `haive enforce install`.\",\n impact: 100,\n }],\n };\n }\n\n if (mode === \"off\") {\n return {\n root,\n initialized,\n mode,\n score: buildScore([], config.enforcement?.scoreThreshold),\n should_block: false,\n findings: [{ severity: \"info\", code: \"enforcement-off\", message: \"hAIve enforcement is disabled.\" }],\n };\n }\n\n if (config.enforcement?.requireBriefingFirst !== false && stage !== \"ci\") {\n const hasBriefing = await hasRecentBriefingMarker(paths, sessionId);\n findings.push(hasBriefing\n ? { severity: \"ok\", code: \"briefing-loaded\", message: \"A recent hAIve briefing marker exists.\" }\n : {\n severity: \"error\",\n code: \"briefing-missing\",\n message: \"No recent hAIve briefing marker was found for this workflow.\",\n fix: \"Run `haive briefing --task \\\"...\\\"`, `haive enforce session-start`, or wrap the agent with `haive run -- <agent>`.\",\n impact: 35,\n });\n }\n\n if (config.enforcement?.requireSessionRecap !== false && (stage === \"pre-push\" || stage === \"ci\")) {\n const hasRecap = await hasRecentSessionRecap(paths);\n findings.push(hasRecap\n ? { severity: \"ok\", code: \"session-recap-present\", message: \"A recent session_recap memory exists.\" }\n : stage === \"ci\"\n ? {\n severity: \"warn\",\n code: \"session-recap-missing\",\n message: \"No recent session_recap memory was found. CI reports this as a warning because personal recaps are usually not committed.\",\n fix: \"Run `haive session end --scope team --goal ... --accomplished ...` if you want a team recap visible in CI.\",\n impact: 5,\n }\n : {\n severity: \"error\",\n code: \"session-recap-missing\",\n message: \"No recent session_recap memory was found.\",\n fix: \"Run `haive session end --goal ... --accomplished ...` before pushing.\",\n impact: 20,\n });\n }\n\n if (config.enforcement?.requireMemoryVerify !== false) {\n findings.push(...await verifyMemoryPolicy(paths, config));\n }\n\n if (config.enforcement?.requireDecisionCoverage !== false) {\n findings.push(...await verifyDecisionCoverage(paths, stage, sessionId));\n }\n\n if (stage === \"pre-commit\" || stage === \"ci\") {\n findings.push(...await runPrecommitPolicy(paths));\n }\n\n if (config.enforcement?.cleanupGeneratedArtifacts !== false) {\n findings.push(...await findGeneratedArtifacts(paths));\n }\n\n const score = buildScore(findings, config.enforcement?.scoreThreshold);\n if (score.score < score.threshold) {\n findings.push({\n severity: \"error\",\n code: \"enforcement-score-below-threshold\",\n message: `Enforcement score ${score.score}% is below required threshold ${score.threshold}%.`,\n fix: \"Load the relevant briefing, address policy findings, then rerun `haive enforce check`.\",\n impact: 0,\n });\n }\n\n const hasErrors = findings.some((f) => f.severity === \"error\");\n return {\n root,\n initialized,\n mode,\n score: buildScore(findings, config.enforcement?.scoreThreshold),\n should_block: mode === \"strict\" && hasErrors,\n findings,\n };\n}\n\nasync function hasRecentSessionRecap(paths: ReturnType<typeof resolveHaivePaths>): Promise<boolean> {\n if (!existsSync(paths.memoriesDir)) return false;\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n return all.some(({ memory }) =>\n memory.frontmatter.type === \"session_recap\" &&\n memory.frontmatter.status !== \"rejected\" &&\n isFreshIsoDate(memory.frontmatter.created_at, SESSION_RECAP_TTL_MS),\n );\n}\n\nasync function verifyMemoryPolicy(\n paths: ReturnType<typeof resolveHaivePaths>,\n config: HaiveConfig,\n): Promise<EnforcementFinding[]> {\n if (!existsSync(paths.memoriesDir)) return [];\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const findings: EnforcementFinding[] = [];\n const staleImportant: string[] = [];\n let verified = 0;\n\n for (const { memory } of all) {\n const fm = memory.frontmatter;\n const anchored = fm.anchor.paths.length > 0 || fm.anchor.symbols.length > 0;\n if (!anchored || fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n verified++;\n if (fm.status === \"stale\") {\n if ([\"decision\", \"gotcha\", \"architecture\", \"convention\"].includes(fm.type)) {\n staleImportant.push(fm.id);\n }\n continue;\n }\n if (config.enforcement?.blockStaleDecisionChanges !== false && [\"decision\", \"gotcha\"].includes(fm.type)) {\n const result = await verifyAnchor(memory, { projectRoot: paths.root });\n if (result.stale) staleImportant.push(fm.id);\n }\n }\n\n findings.push({\n severity: \"ok\",\n code: \"memory-verify-ran\",\n message: `Checked ${verified} anchored memories for stale enforcement policy.`,\n });\n\n if (staleImportant.length > 0) {\n findings.push({\n severity: \"error\",\n code: \"stale-important-memories\",\n message: `${staleImportant.length} important anchored memories are stale: ${staleImportant.slice(0, 8).join(\", \")}`,\n fix: \"Run `haive memory verify --update`, then update or delete stale decisions/gotchas before merging.\",\n impact: 40,\n });\n }\n return findings;\n}\n\nasync function verifyDecisionCoverage(\n paths: ReturnType<typeof resolveHaivePaths>,\n stage: \"local\" | \"pre-commit\" | \"pre-push\" | \"ci\",\n sessionId?: string,\n): Promise<EnforcementFinding[]> {\n if (!existsSync(paths.memoriesDir)) return [];\n const changedFiles = await getChangedFiles(paths.root, stage);\n if (changedFiles.length === 0) {\n return [{ severity: \"info\", code: \"decision-coverage-no-changes\", message: \"No changed files to match against policy memories.\" }];\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const policyTypes = new Set([\"decision\", \"gotcha\", \"architecture\", \"convention\"]);\n const relevant = all\n .map(({ memory }) => memory)\n .filter((memory) => {\n const fm = memory.frontmatter;\n if (!policyTypes.has(fm.type)) return false;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\" || fm.status === \"stale\") return false;\n return memoryMatchesAnchorPaths(memory, changedFiles);\n });\n\n if (relevant.length === 0) {\n return [{\n severity: \"ok\",\n code: \"decision-coverage-none-required\",\n message: `No anchored decisions or policies matched ${changedFiles.length} changed file(s).`,\n }];\n }\n\n const marker = await readRecentBriefingMarker(paths, sessionId);\n const consulted = new Set(marker?.memory_ids ?? []);\n const missing = relevant.filter((memory) => !consulted.has(memory.frontmatter.id));\n if (missing.length === 0) {\n return [{\n severity: \"ok\",\n code: \"decision-coverage-pass\",\n message: `Relevant decisions/policies were surfaced for ${changedFiles.length} changed file(s): ${relevant.length}/${relevant.length}.`,\n }];\n }\n\n return [{\n severity: stage === \"local\" ? \"warn\" : \"error\",\n code: \"decision-coverage-missing\",\n message: `${missing.length}/${relevant.length} relevant anchored decisions/policies were not present in the latest briefing: ${missing.slice(0, 6).map((m) => m.frontmatter.id).join(\", \")}`,\n fix: `Run \\`haive briefing --files \"${changedFiles.slice(0, 10).join(\",\")}\" --task \"...\"\\` before committing.`,\n impact: Math.min(35, 10 + missing.length * 5),\n }];\n}\n\nasync function runPrecommitPolicy(paths: ReturnType<typeof resolveHaivePaths>): Promise<EnforcementFinding[]> {\n const staged = await runCommand(\"git\", [\"diff\", \"--cached\", \"--name-only\"], paths.root).catch(() => \"\");\n const touchedPaths = staged.split(\"\\n\").map((s) => s.trim()).filter(Boolean);\n if (touchedPaths.length === 0) {\n return [{ severity: \"info\", code: \"no-staged-changes\", message: \"No staged changes found for pre-commit policy.\" }];\n }\n const diff = await runCommand(\"git\", [\"diff\", \"--cached\"], paths.root).catch(() => \"\");\n const result = await preCommitCheck({\n diff,\n paths: touchedPaths,\n block_on: \"high-confidence\",\n semantic: true,\n }, { paths });\n if (!result.should_block) {\n return [{\n severity: \"ok\",\n code: \"precommit-policy-pass\",\n message: `Pre-commit policy passed for ${touchedPaths.length} staged file(s).`,\n }];\n }\n return [{\n severity: \"error\",\n code: \"precommit-policy-block\",\n message: `Pre-commit policy matched ${result.summary.anti_patterns} anti-pattern(s), ${result.summary.stale_anchors} stale anchor(s).`,\n fix: \"Review the hAIve warnings, then update the code or the relevant memories.\",\n impact: 45,\n }];\n}\n\nasync function findGeneratedArtifacts(paths: ReturnType<typeof resolveHaivePaths>): Promise<EnforcementFinding[]> {\n const dirty = await runCommand(\"git\", [\"status\", \"--short\", \"--untracked-files=all\"], paths.root).catch(() => \"\");\n const generated = dirty\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .filter((line) =>\n line.includes(\".ai/.cache/\") ||\n line.includes(\".ai/.runtime/\") ||\n line.includes(\"__pycache__/\") ||\n line.endsWith(\".pyc\"),\n );\n if (generated.length === 0) {\n return [{ severity: \"ok\", code: \"generated-artifacts-clean\", message: \"No generated runtime/cache artifacts are visible to git.\" }];\n }\n return [{\n severity: \"warn\",\n code: \"generated-artifacts-visible\",\n message: `${generated.length} generated artifact(s) are visible in git status.`,\n fix: \"Run `haive enforce cleanup`, update .gitignore, or remove test/runtime outputs before committing.\",\n impact: 10,\n }];\n}\n\nasync function getChangedFiles(\n root: string,\n stage: \"local\" | \"pre-commit\" | \"pre-push\" | \"ci\",\n): Promise<string[]> {\n const commands =\n stage === \"pre-commit\"\n ? [[\"diff\", \"--cached\", \"--name-only\"]]\n : [\n [\"diff\", \"--cached\", \"--name-only\"],\n [\"diff\", \"--name-only\"],\n ];\n const files = new Set<string>();\n for (const args of commands) {\n const out = await runCommand(\"git\", args, root).catch(() => \"\");\n for (const line of out.split(\"\\n\")) {\n const file = line.trim();\n if (file) files.add(file);\n }\n }\n return [...files].filter((file) => !file.startsWith(\".ai/.runtime/\") && !file.startsWith(\".ai/.cache/\"));\n}\n\nfunction buildScore(findings: EnforcementFinding[], threshold = 80): EnforcementScore {\n const checks = {\n total: findings.length,\n ok: findings.filter((f) => f.severity === \"ok\").length,\n warn: findings.filter((f) => f.severity === \"warn\").length,\n error: findings.filter((f) => f.severity === \"error\").length,\n };\n const penalty = findings.reduce((sum, f) => {\n if (f.severity === \"error\") return sum + (f.impact ?? 25);\n if (f.severity === \"warn\") return sum + (f.impact ?? 8);\n return sum;\n }, 0);\n return {\n score: Math.max(0, Math.min(100, 100 - penalty)),\n threshold,\n checks,\n };\n}\n\nasync function installGitEnforcement(root: string): Promise<void> {\n const hooksDir = path.join(root, \".git\", \"hooks\");\n if (!existsSync(path.join(root, \".git\"))) {\n ui.warn(\"No .git directory found; git enforcement hooks skipped.\");\n return;\n }\n await mkdir(hooksDir, { recursive: true });\n const hooks = [\n {\n name: \"pre-commit\",\n body: `#!/bin/sh\n${ENFORCE_HOOK_MARKER}\nhaive enforce check --stage pre-commit --dir . || exit $?\n`,\n },\n {\n name: \"pre-push\",\n body: `#!/bin/sh\n${ENFORCE_HOOK_MARKER}\nhaive enforce check --stage pre-push --dir . || exit $?\n`,\n },\n ];\n for (const hook of hooks) {\n const file = path.join(hooksDir, hook.name);\n if (existsSync(file)) {\n const current = await readFile(file, \"utf8\").catch(() => \"\");\n if (current.includes(ENFORCE_HOOK_MARKER)) {\n await writeFile(file, hook.body, \"utf8\");\n } else {\n await writeFile(file, `${current.trimEnd()}\\n\\n${hook.body}`, \"utf8\");\n }\n } else {\n await writeFile(file, hook.body, \"utf8\");\n }\n await chmod(file, 0o755);\n }\n ui.success(\"Installed blocking git enforcement hooks: pre-commit, pre-push\");\n}\n\nasync function installCiEnforcement(root: string): Promise<void> {\n const workflowPath = path.join(root, \".github\", \"workflows\", \"haive-enforcement.yml\");\n await mkdir(path.dirname(workflowPath), { recursive: true });\n if (existsSync(workflowPath)) {\n ui.info(\"GitHub Actions enforcement workflow already exists — skipped\");\n return;\n }\n await writeFile(workflowPath, `name: haive-enforcement\n\non:\n pull_request:\n push:\n branches: [main, master]\n\njobs:\n haive-enforcement:\n runs-on: ubuntu-latest\n permissions:\n contents: read\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: Enforce hAIve policy\n run: haive enforce ci\n`, \"utf8\");\n ui.success(`Created ${path.relative(root, workflowPath)}`);\n}\n\nfunction printReport(report: EnforcementReport, json: boolean): void {\n if (json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(ui.bold(`hAIve enforcement — ${report.mode}`));\n console.log(ui.dim(` root: ${report.root}`));\n console.log(ui.dim(` score: ${report.score.score}% / threshold ${report.score.threshold}%`));\n for (const finding of report.findings) {\n const marker = finding.severity === \"error\"\n ? ui.red(\"✗\")\n : finding.severity === \"warn\"\n ? ui.yellow(\"⚠\")\n : finding.severity === \"ok\"\n ? ui.green(\"✓\")\n : ui.dim(\"•\");\n console.log(`${marker} ${finding.code}: ${finding.message}`);\n if (finding.fix) console.log(ui.dim(` fix: ${finding.fix}`));\n }\n if (report.should_block) ui.error(\"hAIve enforcement gate failed.\");\n else ui.success(\"hAIve enforcement gate passed.\");\n}\n\nasync function readHookPayload(): Promise<HookPayload> {\n const raw = await readStdin(MAX_STDIN_BYTES);\n if (!raw.trim()) return {};\n try {\n return JSON.parse(raw) as HookPayload;\n } catch {\n return {};\n }\n}\n\nfunction resolveRoot(dir: string | undefined, payload: HookPayload): string | null {\n try {\n return findProjectRoot(dir ?? payload.cwd);\n } catch {\n return null;\n }\n}\n\nfunction isWriteLikeTool(payload: HookPayload): boolean {\n const tool = payload.tool_name ?? \"\";\n if ([\"Edit\", \"Write\", \"MultiEdit\", \"NotebookEdit\"].includes(tool)) return true;\n if (tool !== \"Bash\") return false;\n const command = String(payload.tool_input?.[\"command\"] ?? \"\");\n return /\\b(rm|mv|cp|mkdir|touch|tee|sed|perl|python|node|npm|pnpm|yarn|git)\\b/.test(command) ||\n />{1,2}/.test(command);\n}\n\nasync function readStdin(maxBytes: number): Promise<string> {\n if (process.stdin.isTTY) return \"\";\n return await new Promise((resolve) => {\n const chunks: Buffer[] = [];\n let total = 0;\n let done = false;\n const finish = (): void => {\n if (done) return;\n done = true;\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n };\n process.stdin.on(\"data\", (c: Buffer) => {\n total += c.length;\n if (total > maxBytes) {\n process.stdin.destroy();\n finish();\n return;\n }\n chunks.push(c);\n });\n process.stdin.on(\"end\", finish);\n process.stdin.on(\"error\", finish);\n setTimeout(finish, 2000);\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","import { Command } from \"commander\";\nimport { runWithEnforcement } from \"./enforce.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface RunOptions {\n dir?: string;\n task?: string;\n}\n\nexport function registerRun(program: Command): void {\n program\n .command(\"run\")\n .description(\"Run any AI agent command inside a hAIve-enforced session.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--task <text>\", \"task text used for the hAIve briefing marker\")\n .allowUnknownOption(true)\n .argument(\"[cmd]\", \"agent command to run\")\n .argument(\"[args...]\", \"agent command arguments\")\n .action(async (cmd: string | undefined, args: string[], opts: RunOptions) => {\n if (!cmd) {\n ui.error(\"Usage: haive run -- <agent command> [args...]\");\n process.exit(1);\n }\n await runWithEnforcement(cmd, args, opts);\n });\n}\n"],"mappings":"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K,IAAI;IACX;IACA,OAAO,UAAwB;AAC7B,cAAQ,OAAO,YAAY,MAAM,IAAI;AACrC,aAAO,WAAW,MAAM,QAAQ,OAAO,OAAO,CAAC;IACjD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UACL,WAAW,MAAM,gBAAgB,OAAO,OAAO,CAAC;EACpD;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAyB;AAC9B,cAAQ,OAAO,aAAa,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC;AACnD,aAAO,WAAW,MAAM,SAAS,OAAO,OAAO,CAAC;IAClD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA2B;AAChC,cAAQ,OAAO,eAAe,MAAM,KAAK;AACzC,aAAO,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;IACpD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA8B;AACnC,cAAQ,OAAO,mBAAmB,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC;AACzD,aAAO,WAAW,MAAM,cAAc,OAAO,OAAO,CAAC;IACvD;EACF;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA4B;AACjC,cAAQ,OAAO,gBAAgB,MAAM,QAAQ,EAAE;AAC/C,aAAO,WAAW,MAAM,YAAY,OAAO,OAAO,CAAC;IACrD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA0B;AAC/B,cAAQ,OAAO,cAAc,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC;AACrD,aAAO,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;IACnD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA4B,WAAW,MAAM,YAAY,OAAO,OAAO,CAAC;EACjF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA4B,WAAW,MAAM,YAAY,OAAO,OAAO,CAAC;EACjF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAuB,WAAW,MAAM,OAAO,OAAO,OAAO,CAAC;EACvE;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAwB,WAAW,MAAM,QAAQ,OAAO,OAAO,CAAC;EACzE;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UACL,WAAW,MAAM,kBAAkB,OAAO,OAAO,CAAC;EACtD;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UACL,WAAW,MAAM,qBAAqB,OAAO,OAAO,CAAC;EACzD;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAwB,WAAW,MAAM,YAAY,OAAO,OAAO,CAAC;EAC7E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UACL,WAAW,MAAM,kBAAkB,OAAO,OAAO,CAAC;EACtD;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;EAC7E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;EAC7E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA2B,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;EAC/E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;EAC7E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA2B,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;EAC/E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;EAC7E;AAKA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAyB;AAC9B,cAAQ,OAAO,aAAa,MAAM,KAAK;AACvC,aAAO,WAAW,MAAM,SAAS,OAAO,OAAO,CAAC;IAClD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA8B;AACnC,cAAQ,OAAO,mBAAmB,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC;AACzD,aAAO,WAAW,MAAM,cAAc,OAAO,OAAO,CAAC;IACvD;EACF;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA2B;AAChC,cAAQ,OAAO,eAAe,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC;AACtD,aAAO,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;IACpD;EACF;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA4B;AACjC,cAAQ,OAAO,iBAAiB,MAAM,IAAI;AAC1C,aAAO,WAAW,MAAM,YAAY,OAAO,OAAO,CAAC;IACrD;EACF;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAkC;AACvC,cAAQ,OAAO,uBAAuB,MAAM,MAAM,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;AACxE,aAAO,WAAW,MAAM,kBAAkB,OAAO,OAAO,CAAC;IAC3D;EACF;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA2B;AAChC,cAAQ,OAAO,eAAe,GAAG,MAAM,WAAW,UAAU,MAAM,UAAU,GAAG;AAC/E,aAAO,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;IACpD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAgC;AACrC,cAAQ,OAAO,qBAAqB,MAAM,EAAE;AAC5C,aAAO,WAAW,MAAM,gBAAgB,OAAO,OAAO,CAAC;IACzD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA6B;AAClC,cAAQ,OAAO,sBAAsB,MAAM,EAAE;AAC7C,aAAO,WAAW,MAAM,aAAa,OAAO,OAAO,CAAC;IACtD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAsC;AAC3C,cAAQ,OAAO,2BAA2B,GAAG,MAAM,UAAU,GAAG;AAChE,aAAO,WAAW,MAAM,sBAAsB,OAAO,OAAO,CAAC;IAC/D;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UACL,WAAW,MAAM,qBAAqB,OAAO,OAAO,CAAC;EACzD;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UACL,WAAW,MAAM,mBAAmB,OAAO,OAAO,CAAC;EACvD;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;I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","names":["Command","path","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","mkdir","existsSync","path","mkdir","writeFile","existsSync","path","program","path","resolveHaivePaths","existsSync","mkdir","writeFile","buildCodeMap","saveCodeMap","readFile","mkdir","writeFile","readFile","existsSync","path","findProjectRoot","existsSync","mkdir","readFile","writeFile","path","findProjectRoot","path","existsSync","mkdir","readFile","writeFile","program","mkdir","existsSync","path","findProjectRoot","resolveHaivePaths","program","findProjectRoot","findProjectRoot","resolveHaivePaths","mkdir","writeFile","existsSync","path","readFile","readdir","z","loadMemoriesFromDir","buildFrontmatter","memoryFilePath","serializeMemory","literalMatchesAllTokens","literalMatchesAnyToken","loadUsageIndex","tokenizeQuery","trackReads","deriveConfidence","getUsage","memoryMatchesAnchorPaths","saveUsageIndex","loadConfig","extractActionsBriefBody","inferModulesFromPaths","loadCodeMap","queryCodeMap","resolveBriefingBudget","estimateTokens","spawn","execSync","appendRuntimeJournalEntry","memory","top","loadModuleContexts","rm","runGitLog","runCommand","program","findProjectRoot","spawnSync","readFile","writeFile","mkdir","existsSync","path","DEFAULT_AUTO_PROMOTE_RULE","buildFrontmatter","findProjectRoot","getUsage","isAutoPromoteEligible","isDecaying","loadCodeMap","loadConfig","loadMemoriesFromDir","loadUsageIndex","resolveHaivePaths","serializeMemory","verifyAnchor","program","findProjectRoot","resolveHaivePaths","existsSync","loadConfig","DEFAULT_AUTO_PROMOTE_RULE","loadMemoriesFromDir","memory","writeFile","serializeMemory","verifyAnchor","loadUsageIndex","isAutoPromoteEligible","getUsage","path","isDecaying","buildFrontmatter","mkdir","loadCodeMap","spawnSync","buildCodeMap","saveCodeMap","readFile","createHash","mkdir","readFile","writeFile","existsSync","path","buildFrontmatter","findProjectRoot","inferModulesFromPaths","loadMemoriesFromDir","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","parseCsv","inferModulesFromPaths","path","readFile","createHash","loadMemoriesFromDir","writeFile","serializeMemory","buildFrontmatter","memoryFilePath","mkdir","existsSync","path","findProjectRoot","resolveHaivePaths","loadMemoriesFromDir","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","mkdir","unlink","writeFile","existsSync","path","findProjectRoot","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memoryFilePath","mkdir","path","writeFile","serializeMemory","unlink","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","deriveConfidence","findProjectRoot","getUsage","inferModulesFromPaths","loadUsageIndex","memoryMatchesAnchorPaths","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","inferModulesFromPaths","memoryMatchesAnchorPaths","extractPathSegments","getUsage","deriveConfidence","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","extractSnippet","findProjectRoot","literalMatchesAllTokens","literalMatchesAnyToken","pickSnippetNeedle","resolveHaivePaths","tokenizeQuery","trackReads","memory","findProjectRoot","resolveHaivePaths","existsSync","tokenizeQuery","loadMemoriesFromDir","passesFilters","literalMatchesAllTokens","literalMatchesAnyToken","pickSnippetNeedle","path","extractSnippet","trackReads","writeFile","existsSync","findProjectRoot","loadUsageIndex","recordRejection","resolveHaivePaths","saveUsageIndex","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","writeFile","serializeMemory","loadUsageIndex","recordRejection","saveUsageIndex","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","applyVerification","writeFile","serializeMemory","readFile","existsSync","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","readFile","existsSync","readFile","mkdir","writeFile","path","buildFrontmatter","findProjectRoot","resolveHaivePaths","serializeMemory","section","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","readFile","rm","existsSync","path","buildFrontmatter","findProjectRoot","loadMemoriesFromDir","memoryFilePath","resolveHaivePaths","serializeMemory","path","existsSync","readFile","parseCsv","recapTopic","session","findProjectRoot","resolveHaivePaths","rm","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","existsSync","mkdir","writeFile","path","findProjectRoot","loadMemoriesFromDir","loadUsageIndex","readUsageEvents","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","readUsageEvents","path","existsSync","loadMemoriesFromDir","memory","loadUsageIndex","mkdir","writeFile","estimateTokens","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","estimateTokens","existsSync","readdir","readFile","writeFile","path","estimateTokens","findProjectRoot","program","path","writeFile","findProjectRoot","existsSync","readdir","readFile","estimateTokens","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","truncate","aggregateUsage","existsSync","writeFile","path","findProjectRoot","getUsage","loadMemoriesFromDir","loadUsageIndex","resolveHaivePaths","serializeMemory","MS_PER_DAY","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","path","getUsage","writeFile","serializeMemory","existsSync","path","execSync","codeMapPath","findProjectRoot","getUsage","loadCodeMap","loadConfig","loadMemoriesFromDir","loadUsageIndex","readUsageEvents","resolveHaivePaths","MS_PER_DAY","program","findProjectRoot","resolveHaivePaths","existsSync","readFile","loadMemoriesFromDir","loadUsageIndex","getUsage","loadCodeMap","codeMapPath","readUsageEvents","loadConfig","path","execSync","existsSync","findProjectRoot","loadMemoriesFromDir","parseSince","readUsageEvents","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","readUsageEvents","parseSince","existsSync","loadMemoriesFromDir","memory","truncate","spawn","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","runCommand","spawn","existsSync","findProjectRoot","loadMemoriesFromDir","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memory","existsSync","findProjectRoot","loadMemoriesFromDir","resolveHaivePaths","resolveHaivePaths","existsSync","loadMemoriesFromDir","memory","findProjectRoot","MemoryTypeSchema","suggestTopicKey","memory","MemoryTypeSchema","suggestTopicKey","path","resolveProjectInfo","program","existsSync","path","appendRuntimeJournalEntry","findProjectRoot","readRuntimeJournalTail","resolveHaivePaths","program","path","resolveHaivePaths","findProjectRoot","appendRuntimeJournalEntry","existsSync","readRuntimeJournalTail","existsSync","path","collectTimelineEntries","findProjectRoot","resolveHaivePaths","memory","path","resolveHaivePaths","findProjectRoot","existsSync","loadMemoriesFromDir","collectTimelineEntries","existsSync","path","findLexicalConflictPairs","findTopicStatusConflictPairs","findProjectRoot","resolveHaivePaths","memory","path","resolveHaivePaths","findProjectRoot","existsSync","loadMemoriesFromDir","findLexicalConflictPairs","findTopicStatusConflictPairs","spawn","existsSync","chmod","mkdir","readFile","rm","writeFile","path","findProjectRoot","loadConfig","loadMemoriesFromDir","memoryMatchesAnchorPaths","resolveBriefingBudget","resolveHaivePaths","saveConfig","verifyAnchor","writeBriefingMarker","MAX_STDIN_BYTES","program","findProjectRoot","resolveHaivePaths","mkdir","loadConfig","saveConfig","path","existsSync","rm","resolveBriefingBudget","writeBriefingMarker","memory","spawn","writeFile","loadMemoriesFromDir","verifyAnchor","memoryMatchesAnchorPaths","runCommand","readFile","chmod","readStdin","program","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/briefing.ts","../src/utils/ui.ts","../src/utils/briefing-radar.ts","../src/commands/tui.ts","../src/commands/embeddings.ts","../src/commands/index-code.ts","../src/commands/init.ts","../src/commands/agent.ts","../src/commands/init-mcp-setup.ts","../src/commands/init-bootstrap.ts","../src/commands/init-stack-packs.ts","../src/commands/install-hooks.ts","../src/utils/claude-hooks.ts","../src/commands/observe.ts","../src/commands/mcp.ts","../../mcp/src/server.ts","../../mcp/src/context.ts","../../mcp/src/tools/bootstrap-project-save.ts","../../mcp/src/tools/get-project-context.ts","../../mcp/src/tools/mem-list.ts","../../mcp/src/tools/mem-save.ts","../../mcp/src/tools/mem-search.ts","../../mcp/src/tools/mem-verify.ts","../../mcp/src/tools/mem-reject.ts","../../mcp/src/tools/mem-for-files.ts","../../mcp/src/tools/mem-get.ts","../../mcp/src/tools/mem-delete.ts","../../mcp/src/tools/mem-update.ts","../../mcp/src/tools/mem-pending.ts","../../mcp/src/tools/mem-approve.ts","../../mcp/src/tools/mem-tried.ts","../../mcp/src/tools/mem-observe.ts","../../mcp/src/tools/mem-session-end.ts","../../mcp/src/session-tracker.ts","../../mcp/src/tools/get-briefing.ts","../../mcp/src/tools/code-map.ts","../../mcp/src/tools/mem-diff.ts","../../mcp/src/tools/get-recap.ts","../../mcp/src/tools/mem-relevant-to.ts","../../mcp/src/tools/code-search.ts","../../mcp/src/tools/why-this-file.ts","../../mcp/src/tools/anti-patterns-check.ts","../../mcp/src/tools/mem-distill.ts","../../mcp/src/tools/why-this-decision.ts","../../mcp/src/tools/mem-conflicts.ts","../../mcp/src/tools/precommit-check.ts","../../mcp/src/tools/pattern-detect.ts","../../mcp/src/tools/mem-conflict-candidates.ts","../../mcp/src/tools/mem-resolve-project.ts","../../mcp/src/tools/mem-suggest-topic.ts","../../mcp/src/tools/mem-timeline.ts","../../mcp/src/tools/runtime-journal-append.ts","../../mcp/src/tools/runtime-journal-tail.ts","../../mcp/src/prompts/bootstrap-project.ts","../../mcp/src/prompts/post-task.ts","../../mcp/src/prompts/import-docs.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/benchmark.ts","../src/commands/memory-suggest.ts","../src/commands/memory-archive.ts","../src/commands/doctor.ts","../src/commands/playback.ts","../src/commands/precommit.ts","../src/commands/welcome.ts","../src/commands/memory-lint.ts","../src/commands/memory-suggest-topic.ts","../src/commands/resolve-project.ts","../src/commands/runtime-journal.ts","../src/commands/memory-timeline.ts","../src/commands/memory-conflict-candidates.ts","../src/commands/enforce.ts","../src/commands/run.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 { registerObserve } from \"./commands/observe.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 { registerBenchmark } from \"./commands/benchmark.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\";\nimport { registerWelcome } from \"./commands/welcome.js\";\nimport { registerMemoryLint } from \"./commands/memory-lint.js\";\nimport { registerMemorySuggestTopic } from \"./commands/memory-suggest-topic.js\";\nimport { registerResolveProject } from \"./commands/resolve-project.js\";\nimport { registerRuntime } from \"./commands/runtime-journal.js\";\nimport { registerMemoryTimeline } from \"./commands/memory-timeline.js\";\nimport { registerMemoryConflictCandidates } from \"./commands/memory-conflict-candidates.js\";\nimport { registerEnforce } from \"./commands/enforce.js\";\nimport { registerRun } from \"./commands/run.js\";\nimport { registerAgent } from \"./commands/agent.js\";\n\nconst program = new Command();\n\ndeclare const __HAIVE_VERSION__: string;\n\nprogram\n .name(\"haive\")\n .description(\"hAIve — policy enforcement layer for AI coding agents\")\n .version(__HAIVE_VERSION__);\n\nregisterInit(program);\nregisterWelcome(program);\nregisterResolveProject(program);\nregisterRuntime(program);\nregisterEnforce(program);\nregisterRun(program);\nregisterAgent(program);\n\nregisterMcp(program);\nregisterBriefing(program);\nregisterTui(program);\nregisterEmbeddings(program);\nregisterSync(program);\nregisterInstallHooks(program);\nregisterObserve(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);\nregisterMemorySuggestTopic(memory);\nregisterMemoryTimeline(memory);\nregisterMemoryConflictCandidates(memory);\nregisterMemoryArchive(memory);\nregisterMemoryLint(memory);\n\nconst session = program.command(\"session\").description(\"Manage session lifecycle\");\nregisterSessionEnd(session);\n\nregisterSnapshot(program);\nregisterHub(program);\nregisterStats(program);\nregisterBench(program);\nregisterBenchmark(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 { mkdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n extractActionsBriefBody,\n findProjectRoot,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadCodeMap,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n queryCodeMap,\n resolveBriefingBudget,\n resolveHaivePaths,\n tokenizeQuery,\n trackReads,\n writeBriefingMarker,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\nimport { buildRadar, radarHasContent, type RadarReport } from \"../utils/briefing-radar.js\";\n\ninterface BriefingOptions {\n task?: string;\n files?: string;\n symbols?: string;\n maxMemories?: string;\n maxTokens?: string;\n explainSource?: boolean;\n scope?: string;\n includeDraft?: boolean;\n includeStale?: boolean;\n dir?: string;\n include?: string[];\n radar?: boolean;\n /** quick | balanced | deep — aligns with get_briefing budget_preset */\n budget?: string;\n /** full | actions — mimic get_briefing format for printed bodies */\n memoryFormat?: string;\n}\n\nconst RADAR_AUTO_THRESHOLD = 3;\n\nconst CHARS_PER_TOKEN = 4;\n\nfunction printRadar(\n radar: RadarReport,\n out: (text: string) => boolean,\n reason: \"low-memory-signal\" | \"forced\",\n): void {\n if (!radar.insideGitRepo) return;\n if (!radarHasContent(radar)) return;\n const header = reason === \"low-memory-signal\"\n ? \"=== Project Radar (few relevant memories — surfacing live signals) ===\"\n : \"=== Project Radar ===\";\n out(`${ui.bold(header)}\\n`);\n\n if (radar.recentCommits.length > 0) {\n out(ui.bold(\"Recent commits:\"));\n for (const c of radar.recentCommits) {\n const filesBlurb = c.files.slice(0, 3).join(\", \");\n const more = c.files.length > 3 ? ` (+${c.files.length - 3})` : \"\";\n out(` ${ui.dim(c.date)} ${c.sha} ${c.subject}`);\n if (filesBlurb) out(ui.dim(` ${filesBlurb}${more}`));\n }\n out(\"\");\n }\n if (radar.openTodos.length > 0) {\n out(ui.bold(\"Open TODOs/FIXMEs:\"));\n for (const t of radar.openTodos) {\n out(` ${ui.dim(t.file + \":\" + t.line)} ${t.text}`);\n }\n out(\"\");\n }\n if (radar.hotFiles.length > 0) {\n out(ui.bold(\"Hot files (most modified recently):\"));\n for (const f of radar.hotFiles) {\n out(` ${f.changes}× ${ui.dim(f.path)}`);\n }\n out(\"\");\n }\n}\n\nclass TokenBudgetWriter {\n private used = 0;\n private truncated = false;\n constructor(private readonly budgetChars: number) {}\n write(text: string): boolean {\n if (this.truncated) return false;\n const next = this.used + text.length + 1;\n if (next > this.budgetChars) {\n console.log(ui.dim(`... [briefing truncated to fit --max-tokens budget · ${Math.round(this.used / CHARS_PER_TOKEN)} tokens used]`));\n this.truncated = true;\n return false;\n }\n console.log(text);\n this.used = next;\n return true;\n }\n isTruncated(): boolean { return this.truncated; }\n remainingChars(): number { return Math.max(0, this.budgetChars - this.used); }\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 --budget quick --task \\\"tiny fix\\\"\\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(\"--max-tokens <n>\", \"approximate token budget for the entire briefing (truncates if exceeded)\")\n .option(\"--explain-source\", \"annotate each memory with [source: <relative-path> · anchors: <files>] for traceable citations\")\n .option(\"--radar\", \"force project radar (recent commits, open TODOs, hot files) even when memories are plentiful\")\n .option(\"--no-radar\", \"disable the project radar even when memories are scarce\")\n .option(\n \"--budget <preset>\",\n \"align with MCP get_briefing budget_preset: quick | balanced | deep — sets cap + truncation budget (overrides --max-memories / replaces default open-ended output)\",\n undefined,\n )\n .option(\n \"--memory-format <mode>\",\n \"printed memory bodies: full (default) | actions (cheap bullet-focused excerpt)\",\n \"full\",\n )\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 const markerFiles = parseCsv(opts.files);\n if (existsSync(paths.haiveDir)) {\n await mkdir(paths.runtimeDir, { recursive: true });\n await writeBriefingMarker(paths, {\n task: opts.task ?? \"CLI briefing\",\n source: \"haive-briefing-cli\",\n sessionId: process.env.HAIVE_SESSION_ID,\n files: markerFiles,\n }).catch(() => { /* marker is best-effort */ });\n }\n\n type BB = \"quick\" | \"balanced\" | \"deep\";\n let budgetPreset: BB | null = null;\n if (opts.budget) {\n const b = opts.budget.trim().toLowerCase();\n if (b === \"quick\" || b === \"balanced\" || b === \"deep\") budgetPreset = b;\n else ui.warn(`Unknown --budget '${opts.budget}' — ignoring (use quick|balanced|deep).`);\n }\n\n let maxMemories = Math.max(1, Number(opts.maxMemories ?? 10));\n let budgetTokensCap: number | null = opts.maxTokens ? Math.max(100, Number(opts.maxTokens)) : null;\n\n if (budgetPreset !== null) {\n const presetNums = resolveBriefingBudget(budgetPreset, {\n max_tokens: 8000,\n max_memories: 8,\n include_module_contexts: true,\n });\n budgetTokensCap = presetNums.max_tokens;\n maxMemories = presetNums.max_memories;\n }\n\n const writer = budgetTokensCap !== null ? new TokenBudgetWriter(budgetTokensCap * CHARS_PER_TOKEN) : null;\n const out = (text: string): boolean => {\n if (writer) return writer.write(text);\n console.log(text);\n return true;\n };\n const stopped = (): boolean => writer?.isTruncated() ?? false;\n\n if (!existsSync(paths.memoriesDir)) {\n // No memories yet — print project context (if any) + radar fallback\n if (existsSync(paths.projectContext)) {\n out(`${ui.bold(\"=== Project Context ===\")}\\n`);\n out((await readFile(paths.projectContext, \"utf8\")).trim());\n out(\"\");\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 if (opts.radar !== false && !stopped()) {\n const filePathsEarly = parseCsv(opts.files);\n const tokensEarly = opts.task ? tokenizeQuery(opts.task) : null;\n const radar = await buildRadar({ root, taskTokens: tokensEarly, filePaths: filePathsEarly });\n printRadar(radar, out, \"low-memory-signal\");\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 = markerFiles;\n const tokens = opts.task ? tokenizeQuery(opts.task) : null;\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 && !stopped()) {\n const recap = recaps[0]!;\n const fm = recap.memory.frontmatter;\n const rev = fm.revision_count ? ` · revision #${fm.revision_count}` : \"\";\n out(`${ui.bold(\"=== Last Session Recap ===\")}\\n`);\n out(ui.dim(`${fm.id} (${fm.scope}${rev})`));\n out(recap.memory.body.trim());\n out(\"\");\n }\n\n // ── 2. Project context ─────────────────────────────────────────────────────\n if (existsSync(paths.projectContext) && !stopped()) {\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 out(\"\");\n } else {\n out(`${ui.bold(\"=== Project Context ===\")}\\n`);\n out(ctx.trim());\n out(\"\");\n }\n } else if (!existsSync(paths.projectContext)) {\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 if (opts.radar !== false && !stopped()) {\n const radar = await buildRadar({ root, taskTokens: tokens, filePaths });\n out(\"\");\n printRadar(radar, out, \"low-memory-signal\");\n }\n return;\n }\n\n if (stopped()) return;\n const usageIndex = await loadUsageIndex(paths).catch(() => null);\n out(`${ui.bold(\"=== Relevant Memories ===\")}\\n`);\n for (const item of top) {\n if (stopped()) break;\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 const reads = usageIndex?.by_id[fm.id]?.read_count ?? 0;\n const hitMarker = reads > 0 ? ` ${ui.dim(\"· \" + reads + \"× read\")}` : \"\";\n out(\n `${ui.bold(fm.id)} ${ui.dim(fm.scope + \"/\" + fm.type)} ${badge}${draftMarker}${unverifiedMarker}${originMarker}${hitMarker}`,\n );\n if (opts.explainSource) {\n const relPath = path.relative(root, item.filePath);\n const anchorPaths = fm.anchor?.paths ?? [];\n const anchorSymbols = fm.anchor?.symbols ?? [];\n const parts: string[] = [`source: ${relPath}`];\n if (anchorPaths.length > 0) parts.push(`paths: ${anchorPaths.join(\", \")}`);\n if (anchorSymbols.length > 0) parts.push(`symbols: ${anchorSymbols.join(\", \")}`);\n out(ui.dim(` [${parts.join(\" · \")}]`));\n }\n const memBody =\n opts.memoryFormat?.toLowerCase() === \"actions\"\n ? extractActionsBriefBody(item.memory.body)\n : item.memory.body.trim();\n out(memBody);\n out(\"\");\n }\n if (!stopped()) out(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 await writeBriefingMarker(paths, {\n task: opts.task ?? \"CLI briefing\",\n source: \"haive-briefing-cli\",\n sessionId: process.env.HAIVE_SESSION_ID,\n memoryIds: ids,\n files: filePaths,\n }).catch(() => { /* marker is best-effort */ });\n }\n\n // ── Project radar — surface git/TODO/hot-file signals when memories are scarce ──\n const radarForced = opts.radar === true;\n const radarAuto = opts.radar !== false && top.length < RADAR_AUTO_THRESHOLD;\n if ((radarForced || radarAuto) && !stopped()) {\n const radar = await buildRadar({ root, taskTokens: tokens, filePaths });\n if (radarHasContent(radar)) {\n out(\"\");\n printRadar(radar, out, radarForced ? \"forced\" : \"low-memory-signal\");\n }\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 && !stopped()) {\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 out(`\\n${ui.bold(\"=== Symbol Locations ===\")}\\n`);\n for (const sym of requestedSymbols) {\n if (stopped()) break;\n const { files } = queryCodeMap(codeMap, { symbol: sym });\n if (files.length === 0) {\n out(`${ui.dim(sym)} (not found in code-map)`);\n } else {\n for (const f of files) {\n if (stopped()) break;\n const exports = f.entry.exports.filter((e) =>\n e.name.toLowerCase().includes(sym.toLowerCase()),\n );\n for (const e of exports) {\n if (stopped()) break;\n const desc = e.description ? ` — ${e.description}` : \"\";\n out(`${ui.bold(e.name)} ${ui.dim(f.path + \":\" + e.line)} [${e.kind}]${desc}`);\n }\n }\n }\n }\n out(\"\");\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 { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst exec = promisify(execFile);\n\nexport interface RadarOptions {\n root: string;\n taskTokens: string[] | null;\n filePaths: string[];\n daysBack?: number;\n maxCommits?: number;\n maxTodos?: number;\n maxHotFiles?: number;\n}\n\nexport interface RadarReport {\n recentCommits: { sha: string; date: string; subject: string; files: string[] }[];\n openTodos: { file: string; line: number; text: string }[];\n hotFiles: { path: string; changes: number }[];\n insideGitRepo: boolean;\n}\n\nconst DEFAULT_DAYS_BACK = 14;\nconst DEFAULT_MAX_COMMITS = 5;\nconst DEFAULT_MAX_TODOS = 8;\nconst DEFAULT_MAX_HOT_FILES = 5;\n\nconst TODO_RE = /\\b(?:TODO|FIXME|HACK|XXX)\\b[: ]?(.{0,120})/i;\n\nconst SOURCE_GLOBS = [\n \"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\", \"*.py\", \"*.go\", \"*.rs\",\n \"*.java\", \"*.kt\", \"*.swift\", \"*.rb\", \"*.php\", \"*.cs\", \"*.cpp\", \"*.c\", \"*.h\",\n];\n\nasync function isGitRepo(root: string): Promise<boolean> {\n try {\n await exec(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], { cwd: root });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function getRecentCommits(\n root: string,\n daysBack: number,\n maxCommits: number,\n taskTokens: string[] | null,\n filePaths: string[],\n): Promise<RadarReport[\"recentCommits\"]> {\n try {\n const { stdout } = await exec(\n \"git\",\n [\n \"log\",\n `--since=${daysBack}.days.ago`,\n \"--name-only\",\n \"--pretty=format:%x1f%h%x1f%ad%x1f%s\",\n \"--date=short\",\n \"-n\", \"60\",\n ],\n { cwd: root, maxBuffer: 4 * 1024 * 1024 },\n );\n\n const blocks = stdout.split(\"\\x1f\").filter((b) => b.trim().length > 0);\n const commits: RadarReport[\"recentCommits\"] = [];\n for (let i = 0; i + 2 < blocks.length; i += 3) {\n const sha = blocks[i]!.trim();\n const date = blocks[i + 1]!.trim();\n const tail = blocks[i + 2]!;\n const lines = tail.split(\"\\n\").map((l) => l.trim()).filter(Boolean);\n const subject = lines.shift() ?? \"\";\n const files = lines;\n commits.push({ sha, date, subject, files });\n }\n\n const lowerTokens = taskTokens?.map((t) => t.toLowerCase()) ?? [];\n const lowerPaths = filePaths.map((p) => p.toLowerCase());\n const scored = commits.map((c) => {\n let score = 0;\n const haystack = (c.subject + \" \" + c.files.join(\" \")).toLowerCase();\n for (const t of lowerTokens) if (haystack.includes(t)) score += 2;\n for (const p of lowerPaths) if (c.files.some((f) => f.toLowerCase().includes(p))) score += 3;\n return { c, score };\n });\n\n if (lowerTokens.length === 0 && lowerPaths.length === 0) {\n return commits.slice(0, maxCommits);\n }\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, maxCommits)\n .map((s) => s.c);\n } catch {\n return [];\n }\n}\n\nasync function getOpenTodos(\n root: string,\n maxTodos: number,\n taskTokens: string[] | null,\n filePaths: string[],\n): Promise<RadarReport[\"openTodos\"]> {\n try {\n const includeArgs = SOURCE_GLOBS.flatMap((g) => [\"--include\", g]);\n const { stdout } = await exec(\n \"grep\",\n [\n \"-rnE\",\n \"--exclude-dir=node_modules\",\n \"--exclude-dir=.git\",\n \"--exclude-dir=dist\",\n \"--exclude-dir=build\",\n \"--exclude-dir=.next\",\n \"--exclude-dir=coverage\",\n ...includeArgs,\n \"\\\\b(TODO|FIXME|HACK|XXX)\\\\b\",\n \".\",\n ],\n { cwd: root, maxBuffer: 4 * 1024 * 1024 },\n ).catch((err: { stdout?: string }) => ({ stdout: err.stdout ?? \"\" }));\n\n const lines = stdout.split(\"\\n\").filter(Boolean);\n const parsed: RadarReport[\"openTodos\"] = [];\n for (const line of lines) {\n const m = line.match(/^([^:]+):(\\d+):(.*)$/);\n if (!m) continue;\n const [, file, lineNoStr, rest] = m;\n const todoMatch = rest!.match(TODO_RE);\n if (!todoMatch) continue;\n const text = (todoMatch[1] ?? \"\").trim() || rest!.trim().slice(0, 120);\n parsed.push({ file: file!.replace(/^\\.\\//, \"\"), line: Number(lineNoStr), text });\n }\n\n const lowerTokens = taskTokens?.map((t) => t.toLowerCase()) ?? [];\n const lowerPaths = filePaths.map((p) => p.toLowerCase());\n if (lowerTokens.length === 0 && lowerPaths.length === 0) {\n return parsed.slice(0, maxTodos);\n }\n const scored = parsed.map((t) => {\n let score = 0;\n const hay = (t.file + \" \" + t.text).toLowerCase();\n for (const tok of lowerTokens) if (hay.includes(tok)) score += 1;\n for (const p of lowerPaths) if (t.file.toLowerCase().includes(p)) score += 2;\n return { t, score };\n });\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, maxTodos)\n .map((s) => s.t);\n } catch {\n return [];\n }\n}\n\nasync function getHotFiles(\n root: string,\n daysBack: number,\n maxHotFiles: number,\n filePaths: string[],\n): Promise<RadarReport[\"hotFiles\"]> {\n try {\n const { stdout } = await exec(\n \"git\",\n [\n \"log\",\n `--since=${daysBack * 6}.days.ago`,\n \"--name-only\",\n \"--pretty=format:\",\n ],\n { cwd: root, maxBuffer: 4 * 1024 * 1024 },\n );\n const counts = new Map<string, number>();\n for (const raw of stdout.split(\"\\n\")) {\n const f = raw.trim();\n if (!f) continue;\n counts.set(f, (counts.get(f) ?? 0) + 1);\n }\n let entries = [...counts.entries()].map(([path, changes]) => ({ path, changes }));\n\n const lowerPaths = filePaths.map((p) => p.toLowerCase());\n if (lowerPaths.length > 0) {\n entries = entries.filter((e) => lowerPaths.some((p) => e.path.toLowerCase().includes(p)));\n }\n\n return entries.sort((a, b) => b.changes - a.changes).slice(0, maxHotFiles);\n } catch {\n return [];\n }\n}\n\nexport async function buildRadar(opts: RadarOptions): Promise<RadarReport> {\n const inside = await isGitRepo(opts.root);\n if (!inside) {\n return { recentCommits: [], openTodos: [], hotFiles: [], insideGitRepo: false };\n }\n const daysBack = opts.daysBack ?? DEFAULT_DAYS_BACK;\n const [recentCommits, openTodos, hotFiles] = await Promise.all([\n getRecentCommits(opts.root, daysBack, opts.maxCommits ?? DEFAULT_MAX_COMMITS, opts.taskTokens, opts.filePaths),\n getOpenTodos(opts.root, opts.maxTodos ?? DEFAULT_MAX_TODOS, opts.taskTokens, opts.filePaths),\n getHotFiles(opts.root, daysBack, opts.maxHotFiles ?? DEFAULT_MAX_HOT_FILES, opts.filePaths),\n ]);\n return { recentCommits, openTodos, hotFiles, insideGitRepo: true };\n}\n\nexport function radarHasContent(r: RadarReport): boolean {\n return r.recentCommits.length > 0 || r.openTodos.length > 0 || r.hotFiles.length > 0;\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 { setupAgentMode } from \"./agent.js\";\nimport { generateBootstrapContext } from \"./init-bootstrap.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> **AI agents**: use the **haive** MCP (\\`get_briefing\\` / \\`mem_relevant_to\\`) before substantive edits — see bridge files and \\`.cursor/rules/haive-mcp-required.mdc\\`.\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\nInstalling or initializing hAIve in this repository means **the team expects AI agents to drive work through hAIve**, not bypass it.\n\n### MCP first (default — never optional unless the developer says so)\nThe **haive** MCP server must be enabled in your client. Until it is unavailable (misconfiguration report to the developer), you **must** use it for substantive work:\n\n- **Before** you edit project source files, configs (\\`package.json\\`, tooling), or workflows for the current goal, invoke \\`get_briefing\\` with a short **task** string (and **files** / **symbols** when you know them). If project context was already refreshed in this session and you only need ranked memories, you may call \\`mem_relevant_to\\` instead—but **still** consult hAIve before trusting ungrounded guesses.\n- **Before** declaring a coding task finished, invoke the MCP prompt \\`post_task\\` when the session produced learnings or substantive changes worth capturing.\n\nDo **not** treat these as nice-to-have: they are **default-required** for coding agents here.\n\n### Session rules\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\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\n/** Cursor \\`.cursor/rules/*.mdc\\` — alwaysApply so agents see it even if bridge files are thin. */\nconst CURSOR_HAIVE_RULE_MDC = `---\ndescription: Require hAIve MCP (get_briefing / mem_relevant_to) before substantive repo edits\nalwaysApply: true\n---\n\n# hAIve — required for agents\n\nThis repository uses **hAIve**. Running \\`haive init\\` means the team expects agents to **use the haive MCP server by default**, not skip it.\n\n## Before you change the repo\n\n1. Call **\\`get_briefing\\`** with \\`task\\` (and \\`files\\` / \\`symbols\\` when known), **or** \\`mem_relevant_to\\` if full project context is already loaded and you only need ranked memories.\n2. Then read/search the codebase as needed. Do not invert this order for non-trivial work.\n\n## During / after the task\n\n- On failure: **\\`mem_tried\\`** immediately.\n- Before closing a substantive session: MCP prompt **\\`post_task\\`** when there is something worth capturing.\n\n## If haive MCP is missing\n\nTell the developer to enable the **haive** server (e.g. \\`haive mcp --stdio\\` in client config) and restart the client. Do not silently ignore hAIve.\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 \" Auto-bootstraps project-context.md from local files and seeds detected stack packs.\\n\" +\n \" Add --manual to control memory approval and session recaps yourself.\\n\" +\n \" Add --no-bootstrap and --stack none to disable the auto-features.\",\n )\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .option(\"--no-bridges\", \"do not generate CLAUDE.md / .cursorrules / copilot-instructions.md / .cursor/rules/haive-mcp-required.mdc\")\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 (ON by default in autopilot)\",\n )\n .option(\n \"--no-bootstrap\",\n \"skip the project-context auto-generation (only the default template is written)\",\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 ` Defaults to 'auto' in autopilot mode (detects from package.json). Pass 'none' to disable.`,\n )\n .option(\n \"--no-mcp-setup\",\n \"skip auto-configuring haive MCP (haive mcp --stdio) in Cursor / VS Code / Claude Code\",\n )\n .option(\n \"-y, --yes\",\n \"approve user-level AI client configuration prompts during agent setup\",\n false,\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 yes?: 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 // In autopilot mode, default-on the value-from-day-zero auto-features\n // unless the user explicitly opted out. opts.bootstrap is `false` only\n // when the user passed --no-bootstrap; it's `undefined` when neither flag\n // was given, which we resolve to autopilot's default.\n const wantBootstrap = opts.bootstrap === undefined ? autopilot : opts.bootstrap;\n const wantStack =\n opts.stack === undefined\n ? autopilot ? \"auto\" : undefined\n : opts.stack === \"none\" ? undefined : opts.stack;\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 await ensureAiRuntimeLayout(paths.runtimeDir);\n\n // ── project-context.md ───────────────────────────────────────────────\n if (!existsSync(paths.projectContext)) {\n if (wantBootstrap) {\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 await writeCursorHaiveRule(root);\n }\n\n // ── Stack memory packs ───────────────────────────────────────────────\n const stacksToSeed = await resolveStacksToSeed(root, wantStack);\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 + enforcement 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 agent-agnostic enforcement gates (MCP policy config, git hooks,\n // CI workflow, and supported client hooks such as Claude Code).\n const haiveBin = process.argv[1]!;\n const enforcementResult = spawnSync(\n process.execPath,\n [haiveBin, \"enforce\", \"install\", \"--dir\", root],\n { encoding: \"utf8\" },\n );\n if (enforcementResult.status === 0) {\n ui.success(\"hAIve enforcement installed (MCP, git, CI, client hooks where available)\");\n } else {\n ui.warn(\"hAIve enforcement not fully installed — run `haive enforce install` 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 agentSetup = await setupAgentMode(root, {\n yes: opts.yes === true,\n global: true,\n interactive: process.stdin.isTTY,\n });\n for (const r of agentSetup.project_results) {\n if (r.status === \"configured\" && r.path) ui.success(`haive MCP project config written (${path.relative(root, r.path)})`);\n else if (r.status === \"error\") ui.warn(`${r.client}: ${r.error}`);\n }\n for (const r of agentSetup.global_results) {\n if (r.status === \"configured\") ui.success(`haive MCP configured in ${r.client}${r.path ? ` (${r.path})` : \"\"}`);\n else if (r.status === \"already_configured\") ui.info(`haive MCP already configured in ${r.client} — skipped`);\n }\n if (agentSetup.global_skipped_reason) ui.warn(agentSetup.global_skipped_reason);\n ui.info(`Recommended agent mode: ${agentSetup.detection.recommended_mode}`);\n ui.info(agentSetup.detection.recommended_command);\n await ensureGitignoreEntries(root, [\n \".cursor/mcp.json\",\n \".vscode/mcp.json\",\n \".mcp.json\",\n ]);\n ui.info(ui.dim(\" → Restart your AI client for MCP changes to take effect.\"));\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(\" ✓ Agent-agnostic enforcement gates installed (MCP, git, CI, wrapper-ready)\"));\n console.log(ui.dim(\" ✓ CI workflows created (sync + enforcement)\"));\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 writeCursorHaiveRule(root: string): Promise<void> {\n const relPath = \".cursor/rules/haive-mcp-required.mdc\";\n const target = path.join(root, relPath);\n if (existsSync(target)) {\n ui.info(`Cursor rule ${relPath} already exists — skipped`);\n return;\n }\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, CURSOR_HAIVE_RULE_MDC, \"utf8\");\n ui.success(`Created Cursor rule ${relPath}`);\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\nconst RUNTIME_README_BODY = `# .ai/.runtime — disposable local layer\n\nNot team truth. Use for machine-local session notes or tooling scratch files.\nOfficial memories belong in .ai/memories/ (versioned in Git).\nOnly .gitignore and this README are meant to commit; everything else stays untracked.\n\nSession continuity (local): agents may append \\`session-journal.ndjson\\` via MCP \\`runtime_journal_append\\` or \\`haive runtime journal append\\`.\n`;\n\nconst RUNTIME_GITIGNORE_BODY = `*\n!.gitignore\n!README.md\n`;\n\nasync function ensureAiRuntimeLayout(runtimeDir: string): Promise<void> {\n await mkdir(runtimeDir, { recursive: true });\n const gi = path.join(runtimeDir, \".gitignore\");\n if (!existsSync(gi)) {\n await writeFile(gi, RUNTIME_GITIGNORE_BODY, \"utf8\");\n }\n const readme = path.join(runtimeDir, \"README.md\");\n if (!existsSync(readme)) {\n await writeFile(readme, RUNTIME_README_BODY, \"utf8\");\n }\n}\n\n/**\n * Append gitignore entries if they aren't already present.\n * Creates .gitignore if it doesn't exist.\n * Silently no-ops on any filesystem error (non-blocking).\n */\nasync function ensureGitignoreEntries(root: string, patterns: string[]): Promise<void> {\n try {\n const gitignorePath = path.join(root, \".gitignore\");\n let existing = \"\";\n if (existsSync(gitignorePath)) {\n existing = await readFile(gitignorePath, \"utf8\");\n }\n const lines = existing.split(\"\\n\");\n const missing = patterns.filter((p) => !lines.some((l) => l.trim() === p));\n if (missing.length === 0) return;\n const toAppend = (existing.endsWith(\"\\n\") || existing === \"\" ? \"\" : \"\\n\") +\n \"# hAIve project-level MCP configs (machine-specific absolute paths)\\n\" +\n missing.join(\"\\n\") + \"\\n\";\n await writeFile(gitignorePath, existing + toAppend, \"utf8\");\n } catch {\n // non-fatal\n }\n}\n","import { spawnSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport { findProjectRoot, resolveHaivePaths } from \"@hiveai/core\";\nimport { autoConfigureMcpClients, configureProjectMcpClients, type ConfigureResult } from \"./init-mcp-setup.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface AgentOptions {\n dir?: string;\n json?: boolean;\n yes?: boolean;\n global?: boolean;\n noGlobal?: boolean;\n}\n\ninterface AgentDetection {\n root: string;\n initialized: boolean;\n project_mcp: Array<{ client: string; path: string; present: boolean }>;\n installed_agents: Array<{ agent: string; command: string; installed: boolean; mcp_configured?: boolean }>;\n recommended_mode: \"mcp\" | \"wrapped\" | \"fallback\";\n recommended_command: string;\n}\n\ninterface AgentModeRecord {\n selected_mode: AgentDetection[\"recommended_mode\"];\n recommended_command: string;\n configured_at: string;\n project_root: string;\n notes: string[];\n}\n\nexport function registerAgent(program: Command): void {\n const agent = program\n .command(\"agent\")\n .description(\"Detect, configure, and report the best hAIve mode for AI coding agents.\");\n\n agent\n .command(\"detect\")\n .description(\"Detect available AI agents and hAIve MCP/wrapper readiness.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--json\", \"emit JSON\", false)\n .action(async (opts: AgentOptions) => {\n const detection = await detectAgentMode(opts.dir);\n printDetection(detection, Boolean(opts.json));\n });\n\n agent\n .command(\"status\")\n .description(\"Alias for agent detect.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--json\", \"emit JSON\", false)\n .action(async (opts: AgentOptions) => {\n const detection = await detectAgentMode(opts.dir);\n printDetection(detection, Boolean(opts.json));\n });\n\n agent\n .command(\"setup\")\n .description(\"Configure hAIve project MCP, optional global MCP clients, and wrapper fallback metadata.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"-y, --yes\", \"approve user-level/global MCP configuration without prompting\", false)\n .option(\"--no-global\", \"skip user-level/global MCP configuration\")\n .option(\"--json\", \"emit JSON\", false)\n .action(async (opts: AgentOptions) => {\n const result = await setupAgentMode(opts.dir, {\n yes: Boolean(opts.yes),\n global: opts.global !== false && opts.noGlobal !== true,\n interactive: process.stdin.isTTY,\n });\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n printSetupResult(result);\n });\n}\n\nexport async function setupAgentMode(\n dir: string | undefined,\n opts: { yes?: boolean; global?: boolean; interactive?: boolean } = {},\n): Promise<{\n detection: AgentDetection;\n project_results: ConfigureResult[];\n global_results: ConfigureResult[];\n mode_file: string;\n global_skipped_reason?: string;\n}> {\n const root = findProjectRoot(dir);\n const paths = resolveHaivePaths(root);\n const projectResults = await configureProjectMcpClients(root);\n const detectionBeforeGlobal = await detectAgentMode(root);\n\n let globalResults: ConfigureResult[] = [];\n let globalSkippedReason: string | undefined;\n const shouldConsiderGlobal = opts.global !== false;\n if (shouldConsiderGlobal) {\n const approved = opts.yes === true || (opts.interactive ? await confirmGlobalSetup() : false);\n if (approved) {\n globalResults = await autoConfigureMcpClients();\n const codex = await configureCodexIfAvailable(root);\n if (codex) globalResults.push(codex);\n } else {\n globalSkippedReason = opts.interactive\n ? \"User declined user-level/global MCP configuration.\"\n : \"Non-interactive shell; skipped user-level/global MCP configuration. Re-run `haive agent setup --yes` to apply it.\";\n }\n } else {\n globalSkippedReason = \"User-level/global MCP configuration disabled.\";\n }\n\n const detection = await detectAgentMode(root);\n const modeFile = await writeAgentModeRecord(paths, detection, globalSkippedReason);\n return {\n detection,\n project_results: projectResults,\n global_results: globalResults,\n mode_file: modeFile,\n ...(globalSkippedReason ? { global_skipped_reason: globalSkippedReason } : {}),\n };\n}\n\nexport async function detectAgentMode(dir?: string): Promise<AgentDetection> {\n const root = findProjectRoot(dir);\n const paths = resolveHaivePaths(root);\n const projectMcp = [\n { client: \"Claude Code\", path: path.join(root, \".mcp.json\"), present: existsSync(path.join(root, \".mcp.json\")) },\n { client: \"Cursor\", path: path.join(root, \".cursor\", \"mcp.json\"), present: existsSync(path.join(root, \".cursor\", \"mcp.json\")) },\n { client: \"VS Code\", path: path.join(root, \".vscode\", \"mcp.json\"), present: existsSync(path.join(root, \".vscode\", \"mcp.json\")) },\n ];\n const installedAgents = [\n { agent: \"Codex\", command: \"codex\", installed: commandExists(\"codex\"), mcp_configured: codexMcpConfigured() },\n { agent: \"Claude\", command: \"claude\", installed: commandExists(\"claude\") },\n { agent: \"Aider\", command: \"aider\", installed: commandExists(\"aider\") },\n { agent: \"Cursor\", command: \"cursor\", installed: commandExists(\"cursor\") },\n ];\n const hasProjectMcp = projectMcp.some((item) => item.present);\n const hasNativeMcp = hasProjectMcp || installedAgents.some((a) => a.mcp_configured);\n const wrapperAgent = installedAgents.find((a) => a.installed && [\"codex\", \"claude\", \"aider\"].includes(a.command));\n const recommendedMode: AgentDetection[\"recommended_mode\"] = hasNativeMcp ? \"mcp\" : wrapperAgent ? \"wrapped\" : \"fallback\";\n const recommendedCommand =\n recommendedMode === \"mcp\"\n ? \"Restart your AI client, then call get_briefing before editing.\"\n : recommendedMode === \"wrapped\" && wrapperAgent\n ? `haive run -- ${wrapperAgent.command}`\n : 'haive briefing --task \"...\" --files \"...\"';\n\n return {\n root,\n initialized: existsSync(paths.haiveDir),\n project_mcp: projectMcp,\n installed_agents: installedAgents,\n recommended_mode: recommendedMode,\n recommended_command: recommendedCommand,\n };\n}\n\nasync function writeAgentModeRecord(\n paths: ReturnType<typeof resolveHaivePaths>,\n detection: AgentDetection,\n skippedReason?: string,\n): Promise<string> {\n const dir = path.join(paths.runtimeDir, \"enforcement\");\n await mkdir(dir, { recursive: true });\n const file = path.join(dir, \"agent-mode.json\");\n const record: AgentModeRecord = {\n selected_mode: detection.recommended_mode,\n recommended_command: detection.recommended_command,\n configured_at: new Date().toISOString(),\n project_root: detection.root,\n notes: [\n \"mcp = native hAIve MCP tools are available or project MCP config exists.\",\n \"wrapped = use haive run when native MCP is unavailable.\",\n \"fallback = use haive briefing/enforce manually.\",\n ...(skippedReason ? [skippedReason] : []),\n ],\n };\n await writeFile(file, JSON.stringify(record, null, 2) + \"\\n\", \"utf8\");\n return file;\n}\n\nasync function confirmGlobalSetup(): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = await rl.question(\n \"Configure hAIve in user-level AI client configs (Cursor/VS Code/Claude/Codex when detected)? [y/N] \",\n );\n return /^y(es)?$/i.test(answer.trim());\n } finally {\n rl.close();\n }\n}\n\nasync function configureCodexIfAvailable(root: string): Promise<ConfigureResult | null> {\n if (!commandExists(\"codex\")) return { client: \"Codex\", status: \"not_installed\" };\n if (codexMcpConfigured()) return { client: \"Codex\", status: \"already_configured\" };\n const result = spawnSync(\"codex\", [\n \"mcp\",\n \"add\",\n \"haive\",\n \"--env\",\n `HAIVE_PROJECT_ROOT=${root}`,\n \"--\",\n \"haive\",\n \"mcp\",\n \"--stdio\",\n ], { encoding: \"utf8\" });\n if (result.status === 0) return { client: \"Codex\", status: \"configured\", path: path.join(os.homedir(), \".codex\", \"config.toml\") };\n return { client: \"Codex\", status: \"error\", error: result.stderr || result.stdout || \"codex mcp add failed\" };\n}\n\nfunction commandExists(command: string): boolean {\n const result = spawnSync(process.platform === \"win32\" ? \"where\" : \"which\", [command], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n return result.status === 0;\n}\n\nfunction codexMcpConfigured(): boolean {\n if (!commandExists(\"codex\")) return false;\n const result = spawnSync(\"codex\", [\"mcp\", \"get\", \"haive\"], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n return result.status === 0;\n}\n\nfunction printDetection(detection: AgentDetection, json: boolean): void {\n if (json) {\n console.log(JSON.stringify(detection, null, 2));\n return;\n }\n console.log(ui.bold(\"hAIve agent status\"));\n console.log(ui.dim(` root: ${detection.root}`));\n console.log(`${detection.initialized ? ui.green(\"✓\") : ui.red(\"✗\")} project initialized`);\n for (const cfg of detection.project_mcp) {\n console.log(`${cfg.present ? ui.green(\"✓\") : ui.yellow(\"•\")} ${cfg.client} project MCP ${ui.dim(path.relative(detection.root, cfg.path))}`);\n }\n for (const agent of detection.installed_agents) {\n const marker = agent.installed ? ui.green(\"✓\") : ui.dim(\"•\");\n const mcp = agent.mcp_configured === true ? \" + hAIve MCP\" : \"\";\n console.log(`${marker} ${agent.agent} (${agent.command})${mcp}`);\n }\n console.log(ui.bold(`Recommended mode: ${detection.recommended_mode}`));\n console.log(` ${detection.recommended_command}`);\n}\n\nfunction printSetupResult(result: Awaited<ReturnType<typeof setupAgentMode>>): void {\n for (const item of result.project_results) {\n if (item.status === \"configured\") ui.success(`${item.client} project MCP config written (${item.path})`);\n else if (item.status === \"already_configured\") ui.info(`${item.client} already configured`);\n else if (item.status === \"error\") ui.warn(`${item.client}: ${item.error}`);\n }\n for (const item of result.global_results) {\n if (item.status === \"configured\") ui.success(`${item.client} user-level MCP configured${item.path ? ` (${item.path})` : \"\"}`);\n else if (item.status === \"already_configured\") ui.info(`${item.client} user-level MCP already configured`);\n else if (item.status === \"not_installed\") ui.info(`${item.client} not detected`);\n else if (item.status === \"error\") ui.warn(`${item.client}: ${item.error}`);\n }\n if (result.global_skipped_reason) ui.warn(result.global_skipped_reason);\n ui.success(`Agent mode recorded at ${result.mode_file}`);\n printDetection(result.detection, false);\n}\n","/**\n * Auto-configure haive-mcp in supported AI clients.\n *\n * Two layers:\n * User-level (global, written once):\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 *\n * Project-level (per project, written at haive init, includes HAIVE_PROJECT_ROOT):\n * - Cursor (<root>/.cursor/mcp.json)\n * - VS Code (<root>/.vscode/mcp.json)\n * - Claude Code (<root>/.mcp.json)\n *\n * Project-level configs take precedence over user-level when the client opens that\n * workspace, ensuring the MCP server always resolves the correct project root even\n * when the same haive process serves multiple projects.\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\",\n args: [\"mcp\", \"--stdio\"],\n};\n\nfunction projectMcpEntry(root: string) {\n return {\n command: \"haive\",\n args: [\"mcp\", \"--stdio\"],\n env: { HAIVE_PROJECT_ROOT: root },\n };\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/**\n * Write project-level MCP configs that include HAIVE_PROJECT_ROOT so that\n * each AI client uses the correct project root regardless of the server's CWD.\n *\n * These files are machine-specific (absolute paths) and should be gitignored.\n * haive init appends them to .gitignore automatically.\n *\n * Project-level configs take precedence over user-level configs in Cursor and\n * VS Code when the workspace is opened. This is the canonical fix for the\n * \"MCP server uses wrong project root in multi-project setups\" bug.\n */\nexport async function configureProjectMcpClients(root: string): Promise<ConfigureResult[]> {\n const entry = projectMcpEntry(root);\n const results: ConfigureResult[] = [];\n\n // ── Cursor: <root>/.cursor/mcp.json ──────────────────────────────────────\n try {\n const cursorPath = path.join(root, \".cursor\", \"mcp.json\");\n let config: { mcpServers?: Record<string, unknown> } = {};\n if (existsSync(cursorPath)) {\n try { config = JSON.parse(await readFile(cursorPath, \"utf8\")); } catch { /* keep empty */ }\n }\n config.mcpServers ??= {};\n config.mcpServers[\"haive\"] = entry;\n await mkdir(path.dirname(cursorPath), { recursive: true });\n await writeFile(cursorPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\");\n results.push({ client: \"Cursor (project)\", status: \"configured\", path: cursorPath });\n } catch (err) {\n results.push({ client: \"Cursor (project)\", status: \"error\", error: String(err) });\n }\n\n // ── VS Code: <root>/.vscode/mcp.json ─────────────────────────────────────\n try {\n const vscodePath = path.join(root, \".vscode\", \"mcp.json\");\n let config: { servers?: Record<string, unknown> } = {};\n if (existsSync(vscodePath)) {\n try { config = JSON.parse(await readFile(vscodePath, \"utf8\")); } catch { /* keep empty */ }\n }\n config.servers ??= {};\n config.servers[\"haive\"] = { ...entry, type: \"stdio\" };\n await mkdir(path.dirname(vscodePath), { recursive: true });\n await writeFile(vscodePath, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\");\n results.push({ client: \"VS Code (workspace)\", status: \"configured\", path: vscodePath });\n } catch (err) {\n results.push({ client: \"VS Code (workspace)\", status: \"error\", error: String(err) });\n }\n\n // ── Claude Code: <root>/.mcp.json ────────────────────────────────────────\n try {\n const mcpPath = path.join(root, \".mcp.json\");\n let config: { mcpServers?: Record<string, unknown> } = {};\n if (existsSync(mcpPath)) {\n try { config = JSON.parse(await readFile(mcpPath, \"utf8\")); } catch { /* keep empty */ }\n }\n config.mcpServers ??= {};\n config.mcpServers[\"haive\"] = { ...entry, type: \"stdio\" };\n await writeFile(mcpPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\");\n results.push({ client: \"Claude Code (project)\", status: \"configured\", path: mcpPath });\n } catch (err) {\n results.push({ client: \"Claude Code (project)\", status: \"error\", error: String(err) });\n }\n\n return results;\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 type { Dirent } from \"node:fs\";\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\", \"@trpc/client\"],\n \"Prisma\": [\"@prisma/client\"],\n \"Drizzle\": [\"drizzle-orm\"],\n \"Redux Toolkit\": [\"@reduxjs/toolkit\"],\n \"Zustand\": [\"zustand\"],\n \"TanStack Query\": [\"@tanstack/react-query\", \"react-query\"],\n \"Mongoose\": [\"mongoose\"],\n \"Apollo\": [\"@apollo/client\", \"@apollo/server\", \"apollo-server\"],\n \"GraphQL\": [\"graphql\"],\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 workspaces?: string[] | { packages: 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>, isMonorepo: boolean): string {\n if (isMonorepo) {\n if (frameworks.includes(\"NestJS\")) return \"Monorepo (NestJS backend)\";\n if (frameworks.includes(\"Next.js\")) return \"Monorepo (Next.js)\";\n if (frameworks.includes(\"React\")) return \"Multi-package monorepo (React)\";\n if (frameworks.length > 0) return `Multi-package monorepo (${frameworks.slice(0, 2).join(\", \")})`;\n return \"Multi-package monorepo\";\n }\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: Dirent<string>[];\n try {\n entries = await readdir(dir, { withFileTypes: true, encoding: \"utf8\" });\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[], frameworks: 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 \"decorators\": \"custom decorators\",\n \"interceptors\": \"NestJS interceptors\",\n \"filters\": \"exception filters\",\n \"pipes\": \"validation / transformation pipes\",\n \"dto\": \"Data Transfer Objects\",\n \"entities\": \"ORM entities / database models\",\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 \"auth\": \"authentication / authorization\",\n \"users\": \"user management\",\n \"products\": \"product catalog\",\n \"orders\": \"order management\",\n \"common\": \"shared / common utilities\",\n \"shared\": \"shared code across modules\",\n };\n\n const isNestJS = frameworks.includes(\"NestJS\");\n\n // When src/ has meaningful subdirectories, list them for any backend/API project\n // (NestJS, Express, Fastify, Hono, tRPC, GraphQL…) — not just NestJS\n const isSrcBased = isNestJS ||\n frameworks.some((f) => [\"Express\", \"Fastify\", \"Hono\", \"tRPC\", \"Apollo\", \"GraphQL\"].includes(f));\n const isFrontend = frameworks.some((f) => [\"React\", \"Vue\", \"Svelte\", \"SvelteKit\", \"Astro\"].includes(f));\n const srcSubdirs = dirs.filter((d) => d.startsWith(\"src/\") && d.split(\"/\").length === 2);\n\n // Expand src/ for: all backend stacks AND frontend projects with ≥3 src/ subdirs\n // (shallow frontends like CRA only have src/components + src/index → skip)\n if ((isSrcBased && srcSubdirs.length >= 2) || (isFrontend && srcSubdirs.length >= 3)) {\n const label = isNestJS ? \"main source (NestJS feature modules)\" : \"main source\";\n const result: string[] = [`- \\`src/\\` — ${label}`];\n for (const d of srcSubdirs.slice(0, 12)) {\n const name = d.split(\"/\")[1]!;\n const desc = known[name.toLowerCase()] ?? \"module\";\n result.push(` - \\`${name}/\\` — ${desc}`);\n }\n // Also list other top-level dirs (prisma/, docker/, etc.)\n const otherTopLevel = dirs\n .filter((d) => !d.includes(\"/\") && d !== \"src\")\n .slice(0, 6);\n for (const d of otherTopLevel) {\n const desc = known[d.toLowerCase()] ?? \"module\";\n result.push(`- \\`${d}/\\` — ${desc}`);\n }\n return result;\n }\n\n // Monorepo pattern: packages/ contains workspace sub-packages\n const isMonorepo = dirs.some((d) => d === \"packages\") &&\n dirs.some((d) => d.startsWith(\"packages/\") && d.split(\"/\").length === 2);\n if (isMonorepo) {\n const packageSubdirs = dirs.filter((d) => d.startsWith(\"packages/\") && d.split(\"/\").length === 2);\n const result: string[] = [`- \\`packages/\\` — monorepo sub-packages`];\n for (const d of packageSubdirs.slice(0, 10)) {\n const name = d.split(\"/\")[1]!;\n const desc = known[name.toLowerCase()] ?? \"sub-package\";\n result.push(` - \\`${name}/\\` — ${desc}`);\n }\n const otherTopLevel = dirs\n .filter((d) => !d.includes(\"/\") && d !== \"packages\")\n .slice(0, 5);\n for (const d of otherTopLevel) {\n const desc = known[d.toLowerCase()] ?? \"module\";\n result.push(`- \\`${d}/\\` — ${desc}`);\n }\n return result;\n }\n\n // Default: top-level dirs\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 isMonorepo = pkg.workspaces !== undefined &&\n (Array.isArray(pkg.workspaces) ? pkg.workspaces.length > 0 : true);\n const projectType = detectProjectType(frameworks, pkg.scripts ?? {}, isMonorepo);\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, frameworks);\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 * 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 | \"zustand\" | \"redux\" | \"reactquery\" | \"trpc\" | \"mongoose\" | \"graphql\";\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 zustand: [\n {\n slug: \"zustand-select-slices-not-whole-store\",\n type: \"convention\",\n tags: [\"zustand\", \"performance\", \"react\"],\n body: `Always select specific slices — never subscribe to the whole store.\n\n\\`\\`\\`ts\n// ❌ Re-renders on any store change (even unrelated fields)\nconst store = useStore();\n\n// ✅ Re-renders only when count changes\nconst count = useStore((s) => s.count);\n\\`\\`\\`\n\nSubscribing to the whole store is the single most common Zustand performance mistake.`,\n },\n {\n slug: \"zustand-devtools-wrap-dev-only\",\n type: \"convention\",\n tags: [\"zustand\", \"devtools\", \"performance\"],\n body: `Wrap Zustand devtools middleware in a dev-only condition.\n\n\\`\\`\\`ts\nimport { devtools } from 'zustand/middleware';\n\nconst useStore = create(\n process.env.NODE_ENV === 'development'\n ? devtools(storeImpl, { name: 'AppStore' })\n : storeImpl,\n);\n\\`\\`\\`\n\nShipping devtools to production adds overhead and exposes store internals in bundle.`,\n },\n {\n slug: \"zustand-persist-hydration-ssr\",\n type: \"gotcha\",\n tags: [\"zustand\", \"ssr\", \"nextjs\", \"hydration\"],\n body: `Zustand persist middleware causes hydration mismatch in SSR (Next.js / Remix).\n\nThe server renders with empty state; the client rehydrates from localStorage.\nFix: use \\`skipHydration: true\\` and manually call \\`rehydrate()\\` after mount.\n\n\\`\\`\\`ts\n// In a useEffect or useLayoutEffect on the client:\nuseEffect(() => { useStore.persist.rehydrate(); }, []);\n\\`\\`\\``,\n },\n ],\n\n redux: [\n {\n slug: \"redux-toolkit-immer-mutate-or-return\",\n type: \"gotcha\",\n tags: [\"redux\", \"redux-toolkit\", \"immer\"],\n body: `In RTK createSlice reducers (Immer), you must EITHER mutate the draft OR return a new value — never both.\n\n\\`\\`\\`ts\n// ✅ Mutate draft (Immer converts to immutable update)\nstate.count += 1;\n\n// ✅ Return new value\nreturn { ...state, count: state.count + 1 };\n\n// ❌ Both — causes undefined state\nstate.count += 1;\nreturn state; // DON'T — Immer sees both a mutation and a return\n\\`\\`\\``,\n },\n {\n slug: \"redux-toolkit-rtk-query-over-thunk\",\n type: \"decision\",\n tags: [\"redux\", \"redux-toolkit\", \"data-fetching\"],\n body: `Use RTK Query for server data, not createAsyncThunk.\n\nRTK Query automatically handles: caching, loading/error states, cache invalidation, polling, optimistic updates.\ncreateAsyncThunk is for one-off side effects that don't fit the query/mutation model (e.g. file upload with progress).`,\n },\n {\n slug: \"redux-toolkit-normalize-nested-data\",\n type: \"convention\",\n tags: [\"redux\", \"redux-toolkit\", \"normalization\"],\n body: `Normalize nested API responses before storing in Redux — use createEntityAdapter.\n\nStoring deeply nested objects causes:\n- Redundant re-renders when any deeply nested field changes\n- Difficult update logic (deep merge)\n\n\\`\\`\\`ts\nconst usersAdapter = createEntityAdapter<User>();\nconst usersSlice = createSlice({\n name: 'users',\n initialState: usersAdapter.getInitialState(),\n reducers: { usersReceived: usersAdapter.setAll },\n});\n\\`\\`\\``,\n },\n ],\n\n reactquery: [\n {\n slug: \"tanstack-query-stale-time-default\",\n type: \"gotcha\",\n tags: [\"react-query\", \"tanstack-query\", \"caching\"],\n body: `By default, TanStack Query marks data as stale immediately (staleTime: 0) and refetches on every window focus.\n\nSet a reasonable staleTime to avoid unnecessary network requests:\n\n\\`\\`\\`ts\nuseQuery({\n queryKey: ['user', id],\n queryFn: () => getUser(id),\n staleTime: 5 * 60 * 1000, // 5 minutes\n})\n\\`\\`\\`\n\nSet globally via QueryClient defaultOptions for consistency.`,\n },\n {\n slug: \"tanstack-query-invalidate-after-mutation\",\n type: \"convention\",\n tags: [\"react-query\", \"tanstack-query\", \"mutations\"],\n body: `Always invalidate related queries after a mutation to keep the cache fresh.\n\n\\`\\`\\`ts\nuseMutation({\n mutationFn: createUser,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['users'] }),\n})\n\\`\\`\\`\n\nSkipping invalidation causes the UI to show stale data after a write until the next background refetch.`,\n },\n {\n slug: \"tanstack-query-querykey-as-dependency\",\n type: \"convention\",\n tags: [\"react-query\", \"tanstack-query\"],\n body: `Treat the queryKey array as a dependency array — include all variables the queryFn depends on.\n\n\\`\\`\\`ts\n// ❌ Won't refetch when userId changes\nuseQuery({ queryKey: ['user'], queryFn: () => getUser(userId) });\n\n// ✅ Refetches automatically when userId changes\nuseQuery({ queryKey: ['user', userId], queryFn: () => getUser(userId) });\n\\`\\`\\``,\n },\n ],\n\n trpc: [\n {\n slug: \"trpc-always-validate-input-with-zod\",\n type: \"convention\",\n tags: [\"trpc\", \"validation\", \"security\"],\n body: `Always validate procedure inputs with Zod — tRPC infers types but doesn't enforce them at runtime without a schema.\n\n\\`\\`\\`ts\n// ❌ No runtime validation — input is 'unknown'\nt.procedure.query(({ input }) => getUser(input as string));\n\n// ✅ Validated and typed end-to-end\nt.procedure\n .input(z.object({ id: z.string().uuid() }))\n .query(({ input }) => getUser(input.id));\n\\`\\`\\``,\n },\n {\n slug: \"trpc-server-side-caller-for-ssr\",\n type: \"convention\",\n tags: [\"trpc\", \"nextjs\", \"ssr\"],\n body: `Use the server-side caller in Server Components / SSR — don't call tRPC over HTTP from the server.\n\n\\`\\`\\`ts\n// In Next.js App Router server component\nconst caller = appRouter.createCaller(await createContext());\nconst data = await caller.users.getAll(); // Direct function call, no HTTP\n\\`\\`\\`\n\nHTTP round-trips from server → server add latency and bypass auth context.`,\n },\n {\n slug: \"trpc-context-for-auth\",\n type: \"architecture\",\n tags: [\"trpc\", \"auth\"],\n body: `Put auth session on the tRPC context, not in individual procedures.\n\n\\`\\`\\`ts\n// createContext(): resolve session once, share across all procedures\nexport async function createContext({ req }: CreateNextContextOptions) {\n const session = await getServerSession(req);\n return { session, db };\n}\n\n// In procedure: ctx.session.user is always typed\nconst protectedProcedure = t.procedure.use(({ ctx, next }) => {\n if (!ctx.session?.user) throw new TRPCError({ code: 'UNAUTHORIZED' });\n return next({ ctx: { ...ctx, user: ctx.session.user } });\n});\n\\`\\`\\``,\n },\n ],\n\n mongoose: [\n {\n slug: \"mongoose-connection-singleton\",\n type: \"convention\",\n tags: [\"mongoose\", \"mongodb\", \"connection\", \"serverless\"],\n body: `Create one Mongoose connection at startup — never connect inside route handlers.\n\nIn serverless (Next.js, Vercel), cache the connection to reuse across warm invocations:\n\n\\`\\`\\`ts\nlet cached = (global as any).__mongoose ?? { conn: null, promise: null };\n\nexport async function dbConnect() {\n if (cached.conn) return cached.conn;\n if (!cached.promise) {\n cached.promise = mongoose.connect(process.env.MONGODB_URI!);\n }\n cached.conn = await cached.promise;\n (global as any).__mongoose = cached;\n return cached.conn;\n}\n\\`\\`\\``,\n },\n {\n slug: \"mongoose-lean-for-read-only\",\n type: \"convention\",\n tags: [\"mongoose\", \"performance\"],\n body: `Add .lean() to read-only queries to get plain JS objects instead of full Mongoose documents.\n\n\\`\\`\\`ts\n// ❌ Full Mongoose document — slow, heavy, has virtuals/methods\nconst users = await User.find({});\n\n// ✅ Plain JS object — 2-5x faster on large result sets\nconst users = await User.find({}).lean();\n\\`\\`\\`\n\nNever use .lean() when you need to call .save() or Mongoose instance methods.`,\n },\n {\n slug: \"mongoose-index-frequently-queried-fields\",\n type: \"gotcha\",\n tags: [\"mongoose\", \"mongodb\", \"performance\"],\n body: `Mongoose does NOT create indexes automatically unless you call syncIndexes() or ensureIndexes().\n\nDeclare indexes in the schema and sync them at startup:\n\n\\`\\`\\`ts\nUserSchema.index({ email: 1 }, { unique: true });\nUserSchema.index({ createdAt: -1 });\n\n// At startup (not per-request):\nawait User.syncIndexes();\n\\`\\`\\`\n\nMissing indexes cause full collection scans and timeouts at scale.`,\n },\n ],\n\n graphql: [\n {\n slug: \"graphql-n-plus-one-dataloader\",\n type: \"gotcha\",\n tags: [\"graphql\", \"performance\", \"n+1\"],\n body: `GraphQL resolvers cause N+1 database queries without DataLoader batching.\n\nEvery field resolver runs independently — fetching related data naively causes N queries for N items.\n\n\\`\\`\\`ts\n// In context, create one DataLoader per request (NOT per resolver call)\nconst userLoader = new DataLoader(async (ids: readonly string[]) =>\n User.findByIds(ids as string[])\n);\n\n// In resolver:\nauthor: (post) => userLoader.load(post.authorId),\n\\`\\`\\`\n\nA list of 100 posts with authors = 101 queries without DataLoader, 2 queries with it.`,\n },\n {\n slug: \"graphql-mask-internal-errors-in-production\",\n type: \"gotcha\",\n tags: [\"graphql\", \"security\", \"apollo\"],\n body: `Apollo Server exposes full error details (including stack traces) in development.\n\nIn production, mask internal errors to prevent leaking implementation details:\n\n\\`\\`\\`ts\nnew ApolloServer({\n formatError: (formattedError) => {\n if (formattedError.extensions?.code === 'INTERNAL_SERVER_ERROR') {\n return { message: 'Internal server error', extensions: { code: 'INTERNAL_SERVER_ERROR' } };\n }\n return formattedError;\n },\n});\n\\`\\`\\``,\n },\n {\n slug: \"graphql-depth-limit-and-complexity\",\n type: \"convention\",\n tags: [\"graphql\", \"security\", \"dos\"],\n body: `Add query depth and complexity limits to prevent DoS via deeply nested queries.\n\nWithout limits, a single query can request exponentially nested data and exhaust the server.\n\n\\`\\`\\`ts\nimport depthLimit from 'graphql-depth-limit';\nimport { createComplexityLimitRule } from 'graphql-validation-complexity';\n\nnew ApolloServer({\n validationRules: [\n depthLimit(7),\n createComplexityLimitRule(1000),\n ],\n});\n\\`\\`\\``,\n },\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 [\"zustand\", [\"zustand\"]],\n [\"redux\", [\"@reduxjs/toolkit\", \"redux\"]],\n [\"reactquery\", [\"@tanstack/react-query\", \"react-query\"]],\n [\"trpc\", [\"@trpc/server\", \"@trpc/client\"]],\n [\"mongoose\", [\"mongoose\"]],\n [\"graphql\", [\"@apollo/client\", \"@apollo/server\", \"apollo-server\", \"graphql\"]],\n ];\n for (const [stack, signals] of stackDetectors) {\n if (signals.some((s) => s in deps)) detected.push(stack);\n }\n // Deduplicate: avoid react when next/remix already detected\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\";\nimport {\n defaultClaudeSettingsPath,\n installClaudeHooksAtPath,\n uninstallClaudeHooksAtPath,\n} from \"../utils/claude-hooks.js\";\n\ninterface InstallHooksOptions {\n dir?: string;\n force?: boolean;\n scope?: \"user\" | \"project\";\n uninstall?: boolean;\n settings?: string;\n}\n\ntype Target = \"git\" | \"claude\";\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 the hAIve workflow policy gate. This is blocking by default:\n# initialized projects should not accept AI changes that bypass hAIve.\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_haive enforce check --stage pre-push --dir . || exit $?\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 name: \"pre-commit\",\n body: `#!/bin/sh\n${HOOK_MARKER} — keep this block to allow upgrades. Hand-edit anything outside it.\n\nif command -v haive >/dev/null 2>&1; then\n haive enforce check --stage pre-commit --dir . || exit $?\nelif [ -x ./node_modules/.bin/haive ]; then\n ./node_modules/.bin/haive enforce check --stage pre-commit --dir . || exit $?\nfi\n`,\n },\n];\n\nasync function installGitHooks(opts: InstallHooksOptions): Promise<void> {\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} git hook(s) in .git/hooks/${skipped ? `, skipped ${skipped}` : \"\"}`);\n ui.info(\"post-merge: haive sync runs after every pull/merge.\");\n ui.info(\"pre-commit: haive enforce check blocks unsafe staged changes.\");\n ui.info(\"pre-push: haive enforce check blocks pushes that bypass briefing/session recap policy.\");\n}\n\nasync function installClaudeHooks(opts: InstallHooksOptions): Promise<void> {\n const root = findProjectRoot(opts.dir);\n const scope = opts.scope ?? \"user\";\n const settingsPath = opts.settings ?? defaultClaudeSettingsPath(scope, root);\n\n if (opts.uninstall) {\n const result = await uninstallClaudeHooksAtPath(settingsPath);\n ui.success(`Removed hAIve hooks from ${result.settingsPath}`);\n return;\n }\n\n try {\n const result = await installClaudeHooksAtPath(settingsPath);\n if (result.created) {\n ui.success(`Created ${result.settingsPath} with hAIve enforcement hooks`);\n } else {\n ui.success(`Patched ${result.settingsPath} (existing user hooks preserved)`);\n }\n } catch (err) {\n ui.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n return;\n }\n\n ui.info(\"SessionStart hook: `haive enforce session-start` injects briefing context\");\n ui.info(\"PreToolUse hook: blocks Edit/Write/dangerous Bash until briefing is loaded\");\n ui.info(\"PostToolUse hook: `haive observe` captures Edit/Write/Bash activity\");\n ui.info(\"SessionEnd hook: `haive session end --auto --quiet` distills observations\");\n ui.info(\" into a session_recap memory at session close\");\n ui.info(\"Restart Claude Code (or open a new conversation) for the hooks to take effect.\");\n ui.info(`Run \\`haive install-hooks claude --uninstall\\` to remove.`);\n}\n\nexport function registerInstallHooks(program: Command): void {\n program\n .command(\"install-hooks [target]\")\n .description(\n \"Install hAIve hooks. Targets:\\n\\n\" +\n \" git (default) post-merge / post-rewrite / pre-push for haive sync + precommit\\n\" +\n \" claude SessionStart + PreToolUse + PostToolUse + SessionEnd hooks\\n\" +\n \" for briefing injection, pre-edit blocking, and capture (Claude Code only)\\n\\n\" +\n \" Examples:\\n\" +\n \" haive install-hooks # git hooks (legacy default)\\n\" +\n \" haive install-hooks git\\n\" +\n \" haive install-hooks claude\\n\" +\n \" haive install-hooks claude --scope project\\n\" +\n \" haive install-hooks claude --uninstall\\n\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--force\", \"overwrite existing hooks (git target only)\")\n .option(\"--scope <scope>\", \"claude target: 'user' (~/.claude) or 'project' (.claude/)\", \"user\")\n .option(\"--uninstall\", \"remove previously installed hAIve hooks (claude target only)\")\n .option(\"--settings <path>\", \"explicit path to settings.json (claude target only)\")\n .action(async (target: string | undefined, opts: InstallHooksOptions) => {\n const t = (target ?? \"git\").toLowerCase() as Target | string;\n if (t === \"git\") {\n await installGitHooks(opts);\n } else if (t === \"claude\") {\n await installClaudeHooks(opts);\n } else {\n ui.error(`Unknown target: ${target}. Available: git, claude`);\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Patch a Claude Code settings.json file with hAIve enforcement hooks.\n *\n * Claude Code's hook format:\n * { \"hooks\": { \"PostToolUse\": [{ \"matcher\": \"...\", \"hooks\": [{ \"type\":\"command\", \"command\":\"...\" }] }] } }\n *\n * We add hAIve-marked entries so we can find and replace them on re-runs:\n * - SessionStart → `haive enforce session-start`\n * - PreToolUse → `haive enforce pre-tool-use` (matcher: Edit|Write|Bash)\n * - PostToolUse → `haive observe` (passive capture)\n * - SessionEnd → `haive session end --quiet --auto`\n *\n * Existing user-defined hooks are preserved untouched.\n */\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const HAIVE_HOOK_TAG = \"haive-enforcement\";\n\ninterface ClaudeHookEntry {\n type: \"command\";\n command: string;\n /** hAIve marker so we can identify our own entries on re-runs. */\n haive_tag?: string;\n}\n\ninterface ClaudeHookGroup {\n matcher?: string;\n hooks: ClaudeHookEntry[];\n}\n\ninterface ClaudeSettings {\n hooks?: Record<string, ClaudeHookGroup[]>;\n [key: string]: unknown;\n}\n\nconst POST_TOOL_USE_GROUP: ClaudeHookGroup = {\n matcher: \"Edit|Write|Bash\",\n hooks: [\n {\n type: \"command\",\n command: \"haive observe\",\n haive_tag: HAIVE_HOOK_TAG,\n },\n ],\n};\n\nconst PRE_TOOL_USE_GROUP: ClaudeHookGroup = {\n matcher: \"Edit|Write|MultiEdit|NotebookEdit|Bash\",\n hooks: [\n {\n type: \"command\",\n command: \"haive enforce pre-tool-use\",\n haive_tag: HAIVE_HOOK_TAG,\n },\n ],\n};\n\nconst SESSION_START_GROUP: ClaudeHookGroup = {\n hooks: [\n {\n type: \"command\",\n command: \"haive enforce session-start\",\n haive_tag: HAIVE_HOOK_TAG,\n },\n ],\n};\n\nconst SESSION_END_GROUP: ClaudeHookGroup = {\n hooks: [\n {\n type: \"command\",\n command: \"haive session end --quiet --auto\",\n haive_tag: HAIVE_HOOK_TAG,\n },\n ],\n};\n\nfunction dropHaiveGroups(groups: ClaudeHookGroup[]): ClaudeHookGroup[] {\n return groups.filter(\n (g) => !g.hooks.some((h) => h.haive_tag === HAIVE_HOOK_TAG),\n );\n}\n\nexport function patchClaudeSettings(input: ClaudeSettings | null): ClaudeSettings {\n const settings: ClaudeSettings = input ? { ...input } : {};\n const hooks = settings.hooks ? { ...settings.hooks } : {};\n hooks.SessionStart = [\n ...dropHaiveGroups(hooks.SessionStart ?? []),\n SESSION_START_GROUP,\n ];\n hooks.PreToolUse = [\n ...dropHaiveGroups(hooks.PreToolUse ?? []),\n PRE_TOOL_USE_GROUP,\n ];\n hooks.PostToolUse = [\n ...dropHaiveGroups(hooks.PostToolUse ?? []),\n POST_TOOL_USE_GROUP,\n ];\n hooks.SessionEnd = [\n ...dropHaiveGroups(hooks.SessionEnd ?? []),\n SESSION_END_GROUP,\n ];\n settings.hooks = hooks;\n return settings;\n}\n\nexport function unpatchClaudeSettings(input: ClaudeSettings | null): ClaudeSettings {\n const settings: ClaudeSettings = input ? { ...input } : {};\n if (!settings.hooks) return settings;\n const hooks = { ...settings.hooks };\n for (const [event, groups] of Object.entries(hooks)) {\n const cleaned = dropHaiveGroups(groups);\n if (cleaned.length === 0) {\n delete hooks[event];\n } else {\n hooks[event] = cleaned;\n }\n }\n settings.hooks = hooks;\n if (Object.keys(hooks).length === 0) delete settings.hooks;\n return settings;\n}\n\nexport interface ClaudeHooksInstallResult {\n settingsPath: string;\n created: boolean;\n}\n\nexport async function installClaudeHooksAtPath(\n settingsPath: string,\n): Promise<ClaudeHooksInstallResult> {\n let raw: ClaudeSettings | null = null;\n let created = false;\n if (existsSync(settingsPath)) {\n try {\n raw = JSON.parse(await readFile(settingsPath, \"utf8\")) as ClaudeSettings;\n } catch {\n throw new Error(`${settingsPath} exists but is not valid JSON. Fix it manually first.`);\n }\n } else {\n created = true;\n }\n const patched = patchClaudeSettings(raw);\n await mkdir(path.dirname(settingsPath), { recursive: true });\n await writeFile(settingsPath, JSON.stringify(patched, null, 2) + \"\\n\", \"utf8\");\n return { settingsPath, created };\n}\n\nexport async function uninstallClaudeHooksAtPath(\n settingsPath: string,\n): Promise<ClaudeHooksInstallResult> {\n if (!existsSync(settingsPath)) {\n return { settingsPath, created: false };\n }\n const raw = JSON.parse(await readFile(settingsPath, \"utf8\")) as ClaudeSettings;\n const cleaned = unpatchClaudeSettings(raw);\n await writeFile(settingsPath, JSON.stringify(cleaned, null, 2) + \"\\n\", \"utf8\");\n return { settingsPath, created: false };\n}\n\nexport function defaultClaudeSettingsPath(scope: \"user\" | \"project\", projectRoot: string): string {\n if (scope === \"user\") {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n return path.join(home, \".claude\", \"settings.json\");\n }\n return path.join(projectRoot, \".claude\", \"settings.local.json\");\n}\n","/**\n * `haive observe` — passive-capture endpoint for Claude Code's PostToolUse hook.\n *\n * Reads a single JSON payload on stdin (Claude Code's hook protocol) and appends\n * a compact observation record to `.ai/.cache/observations.jsonl`. The session-end\n * step later distills these records into proposed memories.\n *\n * Critical properties:\n * - exit 0 ALWAYS (a hook that errors interrupts the user's flow)\n * - bounded I/O (caps stdin read; no LLM call; no network)\n * - tolerant to missing .ai/ (silently no-op if haive isn't initialized here)\n */\nimport { appendFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { findProjectRoot, resolveHaivePaths } from \"@hiveai/core\";\n\nconst MAX_STDIN_BYTES = 256 * 1024; // 256 KB cap\nconst TRUNCATE_FIELD = 800;\n\ninterface HookPayload {\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_response?: Record<string, unknown> | string;\n cwd?: string;\n session_id?: string;\n}\n\ninterface Observation {\n ts: string;\n session_id?: string;\n cwd?: string;\n tool: string;\n summary: string;\n files?: string[];\n}\n\nfunction truncate(s: unknown, max = TRUNCATE_FIELD): string {\n if (s == null) return \"\";\n const str = typeof s === \"string\" ? s : JSON.stringify(s);\n return str.length > max ? str.slice(0, max) + \"…\" : str;\n}\n\nfunction extractFiles(payload: HookPayload): string[] {\n const files = new Set<string>();\n const input = payload.tool_input ?? {};\n for (const k of [\"file_path\", \"path\", \"notebook_path\"]) {\n const v = input[k];\n if (typeof v === \"string\") files.add(v);\n }\n // Bash tool: try to spot file-ish args\n const cmd = input[\"command\"];\n if (typeof cmd === \"string\") {\n const matches = cmd.match(/[\\w./-]+\\.(?:ts|tsx|js|jsx|py|go|rs|java|kt|swift|rb|php|cs|cpp|c|h|md|json|yml|yaml)\\b/g);\n if (matches) for (const m of matches) files.add(m);\n }\n return [...files].slice(0, 8);\n}\n\nfunction buildSummary(payload: HookPayload): string {\n const tool = payload.tool_name ?? \"?\";\n const input = payload.tool_input ?? {};\n if (tool === \"Bash\") return `Bash: ${truncate(input[\"command\"], 200)}`;\n if (tool === \"Edit\") return `Edit ${truncate(input[\"file_path\"], 200)}`;\n if (tool === \"Write\") return `Write ${truncate(input[\"file_path\"], 200)}`;\n return `${tool}: ${truncate(input, 200)}`;\n}\n\nasync function readStdin(maxBytes: number): Promise<string> {\n if (process.stdin.isTTY) return \"\";\n return await new Promise((resolve) => {\n const chunks: Buffer[] = [];\n let total = 0;\n let done = false;\n const finish = (): void => {\n if (done) return;\n done = true;\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n };\n process.stdin.on(\"data\", (c: Buffer) => {\n total += c.length;\n if (total > maxBytes) {\n process.stdin.destroy();\n finish();\n return;\n }\n chunks.push(c);\n });\n process.stdin.on(\"end\", finish);\n process.stdin.on(\"error\", finish);\n setTimeout(finish, 2000); // hard cap so a stuck hook never blocks Claude\n });\n}\n\nexport function registerObserve(program: Command): void {\n program\n .command(\"observe\")\n .description(\n \"Passive-capture endpoint for Claude Code PostToolUse hooks.\\n\\n\" +\n \" Reads a JSON payload on stdin and appends an observation record to\\n\" +\n \" .ai/.cache/observations.jsonl. Always exits 0; never blocks the agent.\\n\" +\n \" Wired up automatically by `haive install-hooks claude`.\",\n )\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: { dir?: string }) => {\n try {\n const raw = await readStdin(MAX_STDIN_BYTES);\n if (!raw.trim()) return;\n\n let payload: HookPayload;\n try {\n payload = JSON.parse(raw) as HookPayload;\n } catch {\n return; // malformed payload — silently no-op\n }\n\n const root = (() => {\n try { return findProjectRoot(opts.dir ?? payload.cwd); } catch { return null; }\n })();\n if (!root) return;\n\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) return; // not a haive project\n\n const observation: Observation = {\n ts: new Date().toISOString(),\n session_id: payload.session_id,\n cwd: payload.cwd,\n tool: payload.tool_name ?? \"?\",\n summary: buildSummary(payload),\n files: extractFiles(payload),\n };\n\n const cacheDir = path.join(paths.haiveDir, \".cache\");\n await mkdir(cacheDir, { recursive: true });\n await appendFile(\n path.join(cacheDir, \"observations.jsonl\"),\n JSON.stringify(observation) + \"\\n\",\n \"utf8\",\n );\n } catch {\n // Hooks must never break the user's flow — swallow everything.\n }\n });\n}\n","import { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\nimport { runHaiveMcpStdio } from \"@hiveai/mcp\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface McpOptions {\n dir?: string;\n root?: string;\n /** Recognized so JSON configs may pass `[\\\"mcp\\\", \\\"--stdio\\\"]` — MCP always uses stdio. */\n stdio?: boolean;\n}\n\nexport function registerMcp(program: Command): void {\n program\n .command(\"mcp\")\n .description(\n \"Run the hAIve MCP server over stdio (bundled — same tools as legacy haive-mcp).\\n\\n\" +\n \" Configure via haive init (project-level), or manually:\\n\" +\n ' \\\"command\\\": \\\"haive\\\",\\n' +\n ' \\\"args\\\": [\\\"mcp\\\", \\\"--stdio\\\"],\\n' +\n \" optional env: HAIVE_PROJECT_ROOT (absolute project root).\\n\\n\" +\n \" Updating @hiveai/cli updates MCP; standalone haive-mcp is optional legacy.\",\n )\n .option(\"-d, --dir <dir>\", \"project root (walks up from here for .ai/ / .git/)\")\n .option(\"-r, --root <dir>\", \"same as --dir (parity with legacy haive-mcp --root)\")\n .option(\"--stdio\", \"optional marker for client configs — transport is always stdio\", false)\n .action(async (opts: McpOptions) => {\n void opts.stdio;\n const raw = opts.root ?? opts.dir;\n const root = raw ? findProjectRoot(raw) : findProjectRoot();\n try {\n await runHaiveMcpStdio({ root });\n } catch (err) {\n ui.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createContext, type CreateContextOptions, type HaiveContext } from \"./context.js\";\nimport {\n BootstrapProjectSaveInputSchema,\n bootstrapProjectSave,\n type BootstrapProjectSaveInput,\n} from \"./tools/bootstrap-project-save.js\";\nimport {\n GetProjectContextInputSchema,\n getProjectContext,\n type GetProjectContextInput,\n} from \"./tools/get-project-context.js\";\nimport { MemListInputSchema, memList, type MemListInput } from \"./tools/mem-list.js\";\nimport { MemSaveInputSchema, memSave, type MemSaveInput } from \"./tools/mem-save.js\";\nimport {\n MemSearchInputSchema,\n memSearch,\n type MemSearchInput,\n} from \"./tools/mem-search.js\";\nimport {\n MemVerifyInputSchema,\n memVerify,\n type MemVerifyInput,\n} from \"./tools/mem-verify.js\";\nimport {\n MemRejectInputSchema,\n memReject,\n type MemRejectInput,\n} from \"./tools/mem-reject.js\";\nimport {\n MemForFilesInputSchema,\n memForFiles,\n type MemForFilesInput,\n} from \"./tools/mem-for-files.js\";\nimport { MemGetInputSchema, memGet, type MemGetInput } from \"./tools/mem-get.js\";\nimport {\n MemDeleteInputSchema,\n memDelete,\n type MemDeleteInput,\n} from \"./tools/mem-delete.js\";\nimport {\n MemUpdateInputSchema,\n memUpdate,\n type MemUpdateInput,\n} from \"./tools/mem-update.js\";\nimport {\n MemPendingInputSchema,\n memPending,\n type MemPendingInput,\n} from \"./tools/mem-pending.js\";\nimport {\n MemApproveInputSchema,\n memApprove,\n type MemApproveInput,\n} from \"./tools/mem-approve.js\";\nimport {\n MemTriedInputSchema,\n memTried,\n type MemTriedInput,\n} from \"./tools/mem-tried.js\";\nimport {\n MemObserveInputSchema,\n memObserve,\n type MemObserveInput,\n} from \"./tools/mem-observe.js\";\nimport {\n MemSessionEndInputSchema,\n memSessionEnd,\n type MemSessionEndInput,\n} from \"./tools/mem-session-end.js\";\nimport {\n GetBriefingInputSchema,\n getBriefing,\n type GetBriefingInput,\n} from \"./tools/get-briefing.js\";\nimport {\n CodeMapInputSchema,\n codeMapTool,\n type CodeMapInput,\n} from \"./tools/code-map.js\";\nimport {\n MemDiffInputSchema,\n memDiff,\n type MemDiffInput,\n} from \"./tools/mem-diff.js\";\nimport {\n GetRecapInputSchema,\n getRecap,\n type GetRecapInput,\n} from \"./tools/get-recap.js\";\nimport {\n MemRelevantToInputSchema,\n memRelevantTo,\n type MemRelevantToInput,\n} from \"./tools/mem-relevant-to.js\";\nimport {\n CodeSearchInputSchema,\n codeSearch,\n type CodeSearchInput,\n} from \"./tools/code-search.js\";\nimport {\n WhyThisFileInputSchema,\n whyThisFile,\n type WhyThisFileInput,\n} from \"./tools/why-this-file.js\";\nimport {\n AntiPatternsCheckInputSchema,\n antiPatternsCheck,\n type AntiPatternsCheckInput,\n} from \"./tools/anti-patterns-check.js\";\nimport {\n MemDistillInputSchema,\n memDistill,\n type MemDistillInput,\n} from \"./tools/mem-distill.js\";\nimport {\n WhyThisDecisionInputSchema,\n whyThisDecision,\n type WhyThisDecisionInput,\n} from \"./tools/why-this-decision.js\";\nimport {\n MemConflictsInputSchema,\n memConflicts,\n type MemConflictsInput,\n} from \"./tools/mem-conflicts.js\";\nimport {\n PreCommitCheckInputSchema,\n preCommitCheck,\n type PreCommitCheckInput,\n} from \"./tools/precommit-check.js\";\nimport {\n PatternDetectInputSchema,\n patternDetect,\n type PatternDetectInput,\n} from \"./tools/pattern-detect.js\";\nimport {\n MemConflictCandidatesInputSchema,\n memConflictCandidates,\n type MemConflictCandidatesInput,\n} from \"./tools/mem-conflict-candidates.js\";\nimport {\n MemResolveProjectInputSchema,\n memResolveProject,\n type MemResolveProjectInput,\n} from \"./tools/mem-resolve-project.js\";\nimport {\n MemSuggestTopicInputSchema,\n memSuggestTopic,\n type MemSuggestTopicInput,\n} from \"./tools/mem-suggest-topic.js\";\nimport {\n MemTimelineInputSchema,\n memTimeline,\n type MemTimelineInput,\n} from \"./tools/mem-timeline.js\";\nimport {\n RuntimeJournalAppendInputSchema,\n runtimeJournalAppend,\n type RuntimeJournalAppendInput,\n} from \"./tools/runtime-journal-append.js\";\nimport {\n RuntimeJournalTailInputSchema,\n runtimeJournalTail,\n type RuntimeJournalTailInput,\n} from \"./tools/runtime-journal-tail.js\";\nimport {\n BootstrapProjectArgsSchema,\n bootstrapProjectPrompt,\n type BootstrapProjectArgs,\n} from \"./prompts/bootstrap-project.js\";\nimport {\n PostTaskArgsSchema,\n postTaskPrompt,\n type PostTaskArgs,\n} from \"./prompts/post-task.js\";\nimport {\n ImportDocsArgsSchema,\n importDocsPrompt,\n type ImportDocsArgs,\n} from \"./prompts/import-docs.js\";\nimport { SessionTracker } from \"./session-tracker.js\";\nimport { loadConfigSync } from \"@hiveai/core\";\n\n// Re-export tool implementations so `@hiveai/cli` (and integrators) can call\n// them programmatically without going through the MCP stdio transport.\n// These are the same handlers the MCP server registers below.\nexport {\n getBriefing,\n type GetBriefingInput,\n type BriefingOutput,\n} from \"./tools/get-briefing.js\";\nexport {\n codeMapTool,\n type CodeMapInput,\n type CodeMapToolOutput,\n} from \"./tools/code-map.js\";\nexport {\n getRecap,\n type GetRecapInput,\n type GetRecapOutput,\n} from \"./tools/get-recap.js\";\nexport {\n memRelevantTo,\n type MemRelevantToInput,\n type MemRelevantToOutput,\n} from \"./tools/mem-relevant-to.js\";\nexport {\n codeSearch,\n type CodeSearchInput,\n type CodeSearchOutput,\n} from \"./tools/code-search.js\";\nexport {\n whyThisFile,\n type WhyThisFileInput,\n type WhyThisFileOutput,\n} from \"./tools/why-this-file.js\";\nexport {\n antiPatternsCheck,\n type AntiPatternsCheckInput,\n type AntiPatternsCheckOutput,\n} from \"./tools/anti-patterns-check.js\";\nexport {\n memDistill,\n type MemDistillInput,\n type MemDistillOutput,\n} from \"./tools/mem-distill.js\";\nexport {\n whyThisDecision,\n type WhyThisDecisionInput,\n type WhyThisDecisionOutput,\n} from \"./tools/why-this-decision.js\";\nexport {\n memConflicts,\n type MemConflictsInput,\n type MemConflictsOutput,\n} from \"./tools/mem-conflicts.js\";\nexport {\n preCommitCheck,\n type PreCommitCheckInput,\n type PreCommitCheckOutput,\n} from \"./tools/precommit-check.js\";\nexport {\n patternDetect,\n type PatternDetectInput,\n type PatternDetectOutput,\n} from \"./tools/pattern-detect.js\";\nexport {\n memResolveProject,\n type MemResolveProjectInput,\n} from \"./tools/mem-resolve-project.js\";\nexport {\n memSuggestTopic,\n type MemSuggestTopicInput,\n} from \"./tools/mem-suggest-topic.js\";\nexport {\n memTimeline,\n type MemTimelineInput,\n} from \"./tools/mem-timeline.js\";\nexport {\n memConflictCandidates,\n type MemConflictCandidatesInput,\n} from \"./tools/mem-conflict-candidates.js\";\nexport {\n runtimeJournalAppend,\n type RuntimeJournalAppendInput,\n} from \"./tools/runtime-journal-append.js\";\nexport {\n runtimeJournalTail,\n type RuntimeJournalTailInput,\n} from \"./tools/runtime-journal-tail.js\";\n\ndeclare const __HAIVE_VERSION__: string;\n\nexport const SERVER_NAME = \"haive\";\nexport const SERVER_VERSION = __HAIVE_VERSION__;\n\nfunction jsonResult(data: unknown) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n}\n\nconst ENFORCEMENT_PROFILE_TOOLS = new Set([\n \"get_briefing\",\n \"mem_save\",\n \"mem_search\",\n \"mem_verify\",\n \"mem_relevant_to\",\n \"pre_commit_check\",\n \"mem_session_end\",\n]);\n\nconst BRIEFING_TOOLS = new Set([\"get_briefing\", \"mem_relevant_to\"]);\n\nconst MUTATING_TOOLS = new Set([\n \"mem_save\",\n \"mem_tried\",\n \"mem_observe\",\n \"mem_session_end\",\n \"bootstrap_project_save\",\n \"mem_update\",\n \"mem_approve\",\n \"mem_reject\",\n \"mem_delete\",\n \"runtime_journal_append\",\n \"pattern_detect\",\n]);\n\nexport function createHaiveServer(\n options: CreateContextOptions = {},\n): { server: McpServer; context: HaiveContext; tracker: SessionTracker } {\n const context = createContext(options);\n const config = loadConfigSync(context.paths);\n const toolProfile =\n (options.env?.HAIVE_TOOL_PROFILE as \"enforcement\" | \"full\" | undefined) ??\n config.enforcement?.toolProfile ??\n \"enforcement\";\n const requireBriefingFirst =\n options.env?.HAIVE_REQUIRE_BRIEFING_FIRST === \"0\"\n ? false\n : config.enforcement?.requireBriefingFirst ?? true;\n let briefingLoaded = false;\n const tracker = new SessionTracker(context);\n // Init is async — fire-and-forget at startup (registers shutdown handler if autopilot)\n void tracker.init();\n\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, prompts: {} } },\n );\n\n const shouldRegisterTool = (name: string): boolean =>\n toolProfile === \"full\" || ENFORCEMENT_PROFILE_TOOLS.has(name);\n\n const registerTool = <TInput>(\n name: string,\n description: string,\n schema: Record<string, unknown>,\n handler: (input: TInput) => Promise<unknown> | unknown,\n ): void => {\n if (!shouldRegisterTool(name)) return;\n const tool = server.tool.bind(server) as (\n toolName: string,\n toolDescription: string,\n toolSchema: Record<string, unknown>,\n toolHandler: (input: unknown) => Promise<unknown> | unknown,\n ) => unknown;\n tool(\n name,\n description,\n schema,\n async (input: unknown) => {\n if (BRIEFING_TOOLS.has(name)) {\n briefingLoaded = true;\n return await handler(input as TInput);\n }\n if (requireBriefingFirst && MUTATING_TOOLS.has(name) && !briefingLoaded) {\n return jsonResult({\n error: \"haive_briefing_required\",\n message:\n \"This hAIve project requires get_briefing or mem_relevant_to before state-changing hAIve tools. Call get_briefing({ task: '...' }) first.\",\n tool: name,\n });\n }\n return await handler(input as TInput);\n },\n );\n };\n\n const shouldRegisterPrompt = (name: string): boolean =>\n toolProfile === \"full\" || name === \"bootstrap_project\" || name === \"post_task\";\n\n // ── Memory creation ────────────────────────────────────────────────────\n\n registerTool(\n \"mem_save\",\n [\n \"Save a piece of knowledge as a persistent memory that survives across AI sessions.\",\n \"\",\n \"USE THIS WHEN you discover something worth remembering for future sessions:\",\n \" - A project convention (how things are done here)\",\n \" - An architectural decision and its rationale\",\n \" - A gotcha or non-obvious behavior that surprised you\",\n \" - A domain term and what it means in this codebase\",\n \"\",\n \"DO NOT USE for failed approaches → use mem_tried instead (better structure).\",\n \"DO NOT USE for code discoveries during exploration → use mem_observe instead.\",\n \"\",\n \"PARAMETERS:\",\n \" type — convention | decision | gotcha | architecture | glossary | attempt\",\n \" slug — short kebab-case id (e.g. 'flyway-no-modify-existing')\",\n \" body — Markdown content with the full knowledge\",\n \" scope — team (shared with all devs) | personal (private) | module (component-scoped)\",\n \" paths — anchor to source files for staleness detection (STRONGLY recommended)\",\n \" topic — stable key for upsert: if a memory with same topic+scope exists, update it in-place\",\n \"\",\n \"RETURNS: { id, scope, file_path, action: 'created'|'updated', warning?, invalid_paths? }\",\n \"WARNING: if paths point to non-existent files, they will be immediately stale after haive sync.\",\n \"DEDUP: identical body content within the same scope is rejected — use mem_update to modify.\",\n ].join(\"\\n\"),\n MemSaveInputSchema,\n async (input: MemSaveInput) => {\n tracker.record(\"mem_save\", input.slug);\n return jsonResult(await memSave(input, context));\n },\n );\n\n registerTool(\n \"mem_suggest_topic\",\n [\n \"Propose a stable `topic` key (topic-upsert) from type + short title.\",\n \"\",\n \"USE BEFORE mem_save when you want deterministic updates to the same memory over time;\",\n \"families mimic Engram-style grouping (architecture/*, bug/*, decision/*, …).\",\n \"\",\n \"PARAMETERS:\",\n \" type — convention | decision | gotcha | architecture | glossary | attempt | session_recap\",\n \" title — phrase to slugify under the suggested family prefix\",\n \"\",\n \"RETURNS: { topic_key, family, type }\",\n ].join(\"\\n\"),\n MemSuggestTopicInputSchema,\n async (input: MemSuggestTopicInput) =>\n jsonResult(await memSuggestTopic(input, context)),\n );\n\n registerTool(\n \"mem_tried\",\n [\n \"Record a FAILED approach so future agents don't repeat the same mistake.\",\n \"\",\n \"USE THIS IMMEDIATELY when you try something and it doesn't work. This is the\",\n \"most valuable type of negative knowledge — it saves hours of debugging for\",\n \"future agents working on the same codebase.\",\n \"\",\n \"Auto-validated (no approval cycle). Surfaced FIRST in future get_briefing calls\",\n \"so it's impossible to miss.\",\n \"\",\n \"PARAMETERS:\",\n \" what — short title of what you tried (e.g. 'importing X with ESM dynamic import')\",\n \" why_failed — the exact error or reason it failed\",\n \" instead — what to do instead (the correct approach)\",\n \" scope — team (default) | personal\",\n \" paths — source files where the issue lives\",\n \"\",\n \"RETURNS: { id, file_path, action: 'created' }\",\n ].join(\"\\n\"),\n MemTriedInputSchema,\n async (input: MemTriedInput) => {\n tracker.record(\"mem_tried\", input.what.slice(0, 80));\n return jsonResult(await memTried(input, context));\n },\n );\n\n registerTool(\n \"mem_observe\",\n [\n \"Capture a code-level discovery made WHILE READING existing code.\",\n \"\",\n \"USE THIS when you read a file and spot something the team may not know about:\",\n \" - A bug or race condition hiding in the code\",\n \" - A security gap or missing validation\",\n \" - An inconsistency between two files\",\n \" - A missing configuration or environment variable\",\n \" - Anything that could silently break in production\",\n \"\",\n \"DIFFERENCE from mem_save: mem_observe is for REACTIVE discoveries during code\",\n \"reading. mem_save is for deliberate knowledge capture (conventions, decisions).\",\n \"\",\n \"Auto-validated, anchored to file paths for staleness detection.\",\n \"\",\n \"PARAMETERS:\",\n \" what — one-line title (e.g. 'MobilePaymentController: duplicate @RequestBody')\",\n \" where — file path(s) where the issue lives\",\n \" impact — what breaks or could break because of this\",\n \" fix — suggested fix (optional)\",\n \" scope — team (default, since discoveries benefit everyone)\",\n \"\",\n \"RETURNS: { id, file_path }\",\n ].join(\"\\n\"),\n MemObserveInputSchema,\n async (input: MemObserveInput) => {\n tracker.record(\"mem_observe\", input.where);\n return jsonResult(await memObserve(input, context));\n },\n );\n\n registerTool(\n \"mem_session_end\",\n [\n \"Save an end-of-session recap so the NEXT session starts with fresh context.\",\n \"\",\n \"CALL THIS before closing any significant working session. In autopilot mode,\",\n \"the MCP server saves a minimal recap automatically on exit — but calling this\",\n \"manually produces a richer, more useful recap.\",\n \"\",\n \"HOW IT WORKS: uses topic-upsert — one recap per scope is kept and updated\",\n \"in-place (revision_count increments). get_briefing surfaces the latest recap\",\n \"at the very top of the next session's briefing, before project context.\",\n \"\",\n \"PARAMETERS:\",\n \" goal — what you were trying to accomplish (1–2 sentences)\",\n \" accomplished — what was actually done (bullet list recommended)\",\n \" discoveries — bugs, surprises, missing knowledge found during this session\",\n \" files_touched — key files read or modified (used as anchor for staleness)\",\n \" next_steps — what should happen in the next session or for a teammate\",\n \" scope — personal (default) | team\",\n \"\",\n \"RETURNS: { id, scope, action: 'created'|'updated', revision_count }\",\n ].join(\"\\n\"),\n MemSessionEndInputSchema,\n async (input: MemSessionEndInput) => {\n tracker.record(\"mem_session_end\", input.goal.slice(0, 80));\n return jsonResult(await memSessionEnd(input, context));\n },\n );\n\n // ── Memory retrieval ───────────────────────────────────────────────────\n\n registerTool(\n \"get_briefing\",\n [\n \"⭐ DEFAULT-FIRST for coding agents on any repo where `haive init` ran: call this BEFORE\",\n \"changing source or project config for the current goal (unless the developer explicitly opts out).\",\n \"One-shot onboarding: everything relevant in a single call under a token budget.\",\n \"\",\n \"PROGRESSIVE DISCLOSURE — after this, drill down only if needed:\",\n \" mem_relevant_to / mem_search (compact lists) → mem_get (full body + anchors).\",\n \"\",\n \"RETURNS (in order of priority):\",\n \" 0. action_required — ⚠️ HANDLE THIS FIRST if non-empty (see protocol below)\",\n \" 1. last_session — recap of the previous session (goal, what was done, next steps)\",\n \" 2. project_context — .ai/project-context.md (auto-generated from code-map if template)\",\n \" 3. module_contexts — relevant .ai/modules/<name>/context.md based on files being edited\",\n \" 4. memories — ranked team memories relevant to your task\",\n \" 5. symbol_locations — file:line:kind for any requested symbols (no grep needed)\",\n \" 6. setup_warnings — actionable warnings if setup is incomplete\",\n \" 7. decay_warnings — memories not read in >90 days (consider reviewing)\",\n \"\",\n \"⚠️ ACTION_REQUIRED PROTOCOL — MANDATORY:\",\n \" If action_required[] is non-empty, STOP and for each item:\",\n \" 1. Show the developer the exact developer_message field verbatim\",\n \" 2. Wait for explicit human confirmation ('yes', 'go ahead', 'oui', etc.)\",\n \" 3. Only then proceed with any code changes\",\n \" NEVER act autonomously on cross-repo breaking changes, dep bumps, or contract diffs.\",\n \"\",\n \"KEY PARAMETERS:\",\n \" task — what you are about to do (1–2 sentences) — ALWAYS provide this\",\n \" files — files you are about to edit — surfaces anchored memories\",\n \" symbols — symbol names to look up in the code-map (e.g. ['PaymentService'])\",\n \" format — 'full' (default) | 'compact' (1-line) | 'actions' (bullet-first excerpts)\",\n \" budget_preset — 'quick' | 'balanced' | 'deep' — scales max_tokens/memories/module contexts\",\n \"\",\n \"EXAMPLE USAGE:\",\n \" get_briefing({ task: 'add a Stripe payment integration', files: ['src/payments/'], symbols: ['PaymentService'] })\",\n \"\",\n \"CONFIDENCE LEVELS in memories:\",\n \" authoritative — validated + read 10+ times (highest trust)\",\n \" trusted — validated or proposed + read 3+ times\",\n \" low — proposed, few reads (take with caution)\",\n \" unverified — draft (unverified: true flag set)\",\n \"\",\n \"Replaces 4–5 separate tool calls. Prefer this first; use mem_search / mem_get only for follow-up.\",\n ].join(\"\\n\"),\n GetBriefingInputSchema,\n async (input: GetBriefingInput) => {\n tracker.record(\"get_briefing\", input.task ?? \"\");\n return jsonResult(await getBriefing(input, context));\n },\n );\n\n registerTool(\n \"mem_search\",\n [\n \"Search memories by keyword or semantic similarity.\",\n \"\",\n \"USE WHEN you need to find a specific memory and don't know its id.\",\n \"For session onboarding, use get_briefing instead (richer, ranked, budgeted).\",\n \"\",\n \"SEARCH MODES:\",\n \" Literal (default): AND search across id, tags, and body — all tokens must match.\",\n \" Falls back to OR automatically if no AND results (partial match).\",\n \" Lexical rank (lexical_rank: true, semantic: false): Okapi-BM25-style scoring on the\",\n \" filtered corpus — good for phrase-like queries without embeddings.\",\n \" Semantic (semantic: true): embedding-based similarity — finds related memories\",\n \" even with different wording. Requires haive embeddings index to be built.\",\n \"\",\n \"PARAMETERS:\",\n \" query — search terms or natural language question\",\n \" scope — filter by personal | team | module\",\n \" type — filter by convention | decision | gotcha | architecture | glossary\",\n \" semantic — true for embedding-based search (requires @hiveai/embeddings)\",\n \" lexical_rank — BM25-style ranking (ignored when semantic is true)\",\n \" limit — max results (default 10)\",\n \"\",\n \"RETURNS: array of { id, type, scope, status, confidence, body, match_quality }\",\n ].join(\"\\n\"),\n MemSearchInputSchema,\n async (input: MemSearchInput) => {\n tracker.record(\"mem_search\", input.query.slice(0, 80));\n return jsonResult(await memSearch(input, context));\n },\n );\n\n registerTool(\n \"mem_timeline\",\n [\n \"Chronological view of related memories: by shared frontmatter.topic OR expanded from a seed id\",\n \"(related_ids, same topic, overlapping anchor paths — one extra hop on related_ids).\",\n \"\",\n \"PARAMETERS:\",\n \" memory_id — optional seed memory id\",\n \" topic — optional topic key (required if memory_id omitted)\",\n \" limit — max entries (default 30)\",\n \"\",\n \"RETURNS: { entries: [{ id, type, scope, created_at, one_line, topic? }], total, notice? }\",\n ].join(\"\\n\"),\n MemTimelineInputSchema,\n async (input: MemTimelineInput) => jsonResult(await memTimeline(input, context)),\n );\n\n registerTool(\n \"mem_for_files\",\n [\n \"Surface memories relevant to the files you are currently editing.\",\n \"\",\n \"USE WHEN starting work on specific files and you want to know:\",\n \" - What conventions apply to these files\",\n \" - What gotchas are anchored to these paths\",\n \" - What decisions were made about this module\",\n \"\",\n \"Matching strategy (in priority order):\",\n \" 1. Anchor overlap — memories whose paths overlap with your files\",\n \" 2. Module context — .ai/modules/<name>/context.md if module is inferred\",\n \" 3. Domain/tag match — memories whose tags include path segments\",\n \"\",\n \"PARAMETERS:\",\n \" files — list of project-relative file paths you are editing\",\n \" scope — filter by scope (default: all)\",\n \"\",\n \"RETURNS: { memories: [...], module_contexts: [...] }\",\n ].join(\"\\n\"),\n MemForFilesInputSchema,\n async (input: MemForFilesInput) => jsonResult(await memForFiles(input, context)),\n );\n\n registerTool(\n \"mem_get\",\n [\n \"Fetch a single memory by its full id with all details.\",\n \"\",\n \"USE WHEN get_briefing / mem_relevant_to / mem_search returned a compact hit and you need\",\n \"the full body, or when you know the exact id of a memory.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id (e.g. '2026-04-28-gotcha-flyway-strict-no-ddl')\",\n \"\",\n \"RETURNS: { id, type, scope, status, confidence, body, anchor, tags, usage }\",\n ].join(\"\\n\"),\n MemGetInputSchema,\n async (input: MemGetInput) => jsonResult(await memGet(input, context)),\n );\n\n registerTool(\n \"mem_list\",\n [\n \"List memories with optional filters. Use for browsing, not for task onboarding.\",\n \"\",\n \"For task onboarding use get_briefing (ranked + budgeted).\",\n \"For keyword search use mem_search.\",\n \"\",\n \"PARAMETERS:\",\n \" scope — personal | team | module\",\n \" type — convention | decision | gotcha | architecture | glossary\",\n \" status — draft | proposed | validated | stale | rejected\",\n \" tags — filter by tags (AND match)\",\n \" module — filter by module name\",\n \"\",\n \"RETURNS: array of { id, type, scope, status, confidence, tags, created_at }\",\n ].join(\"\\n\"),\n MemListInputSchema,\n async (input: MemListInput) => jsonResult(await memList(input, context)),\n );\n\n // ── Project context ────────────────────────────────────────────────────\n\n registerTool(\n \"get_project_context\",\n [\n \"Read .ai/project-context.md (and optionally a module context) directly.\",\n \"\",\n \"USE WHEN you need the full project context without the memory ranking and\",\n \"token budgeting of get_briefing — e.g. for a reference architecture review.\",\n \"\",\n \"For normal task onboarding, use get_briefing instead (more efficient).\",\n \"\",\n \"PARAMETERS:\",\n \" module — also load .ai/modules/<module>/context.md if provided\",\n \"\",\n \"RETURNS: { content: string, module_context?: string }\",\n ].join(\"\\n\"),\n GetProjectContextInputSchema,\n async (input: GetProjectContextInput) =>\n jsonResult(await getProjectContext(input, context)),\n );\n\n registerTool(\n \"bootstrap_project_save\",\n [\n \"Persist the project context document (.ai/project-context.md) or a module\",\n \"context (.ai/modules/<name>/context.md) analyzed by the AI.\",\n \"\",\n \"USE AFTER the bootstrap_project MCP prompt: the prompt tells you how to\",\n \"analyze the codebase; this tool saves the result.\",\n \"\",\n \"PARAMETERS:\",\n \" content — full Markdown content of the context document\",\n \" module — if provided, saves as a module context (not root project context)\",\n \"\",\n \"RETURNS: { file_path, module? }\",\n ].join(\"\\n\"),\n BootstrapProjectSaveInputSchema,\n async (input: BootstrapProjectSaveInput) =>\n jsonResult(await bootstrapProjectSave(input, context)),\n );\n\n registerTool(\n \"code_map\",\n [\n \"Look up where symbols (classes, functions, interfaces) are defined in the codebase.\",\n \"\",\n \"USE INSTEAD OF grepping when you need to find where something lives.\",\n \"Requires haive index code to have been run (done automatically in autopilot mode).\",\n \"\",\n \"TIP: include symbols in get_briefing directly for auto-lookup at session start.\",\n \"\",\n \"PARAMETERS:\",\n \" symbol — name or partial name to search (e.g. 'PaymentService')\",\n \" file — filter by file path substring\",\n \" max_files — cap on results (default 40)\",\n \"\",\n \"RETURNS: { available: bool, files: [{ path, exports: [{ name, kind, line, description }] }] }\",\n \"If available: false → run haive index code first.\",\n ].join(\"\\n\"),\n CodeMapInputSchema,\n async (input: CodeMapInput) => jsonResult(await codeMapTool(input, context)),\n );\n\n registerTool(\n \"mem_resolve_project\",\n [\n \"Diagnostics: resolve which project root hAIve is using (never throws).\",\n \"\",\n \"USE IN multi-root workspaces or when the agent CWD may not be the repo root —\",\n \"mirrors HAIVE_PROJECT_ROOT, findProjectRoot markers, and presence of .ai/memories.\",\n \"\",\n \"PARAMETERS:\",\n \" cwd — optional directory used for discovery when HAIVE_PROJECT_ROOT is unset\",\n \"\",\n \"RETURNS: { ok: true, info: { cwd, resolved_root, haive_project_root_env, … } }\",\n ].join(\"\\n\"),\n MemResolveProjectInputSchema,\n async (input: MemResolveProjectInput) =>\n jsonResult(await memResolveProject(input, context)),\n );\n\n // ── Memory lifecycle ───────────────────────────────────────────────────\n\n registerTool(\n \"mem_update\",\n [\n \"Update the body, tags, or anchor of an existing memory in-place.\",\n \"\",\n \"USE WHEN a memory exists but its content has become outdated or incomplete.\",\n \"This preserves the memory's id, usage history, and read_count.\",\n \"\",\n \"For evolving memories that you will update repeatedly, use mem_save with a\",\n \"topic key instead (topic-upsert pattern).\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to update\",\n \" body — new Markdown content (replaces existing body)\",\n \" tags — new tag list (replaces existing tags)\",\n \" paths — new anchor paths (replaces existing paths)\",\n \" symbols — new anchor symbols (replaces existing symbols)\",\n \"\",\n \"RETURNS: { id, file_path, updated_fields: string[] }\",\n ].join(\"\\n\"),\n MemUpdateInputSchema,\n async (input: MemUpdateInput) => jsonResult(await memUpdate(input, context)),\n );\n\n registerTool(\n \"mem_verify\",\n [\n \"Check whether memory anchor paths and symbols still exist in the current code.\",\n \"\",\n \"USE WHEN you want to know if a specific memory is still valid after a refactor,\",\n \"or to check all memories for staleness (haive sync does this automatically).\",\n \"\",\n \"PARAMETERS:\",\n \" id — check a single memory (omit to check all)\",\n \" update — write 'stale' or 'validated' status back to disk\",\n \"\",\n \"RETURNS: { results: [{ id, status: 'fresh'|'stale'|'anchorless', reason? }] }\",\n \"Stale means the anchored file/symbol no longer exists at that path.\",\n \"Anchorless means the memory has no paths/symbols — staleness is undetectable.\",\n ].join(\"\\n\"),\n MemVerifyInputSchema,\n async (input: MemVerifyInput) => jsonResult(await memVerify(input, context)),\n );\n\n registerTool(\n \"mem_approve\",\n [\n \"Mark a memory as validated (trusted, approved by a human or the team).\",\n \"\",\n \"In autopilot mode, memories are validated automatically — you rarely need this.\",\n \"In manual mode, call this after reviewing a proposed memory to activate it.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to approve\",\n \"\",\n \"RETURNS: { id, previous_status, new_status: 'validated' }\",\n ].join(\"\\n\"),\n MemApproveInputSchema,\n async (input: MemApproveInput) => jsonResult(await memApprove(input, context)),\n );\n\n registerTool(\n \"mem_reject\",\n [\n \"Mark a memory as rejected and record a reason.\",\n \"\",\n \"USE WHEN a memory is factually wrong, outdated, or not useful.\",\n \"Rejection blocks auto-promotion and lowers the memory's trust signal.\",\n \"Rejected memories are excluded from get_briefing by default.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to reject\",\n \" reason — why this memory is being rejected (stored in frontmatter)\",\n \"\",\n \"RETURNS: { id, previous_status, new_status: 'rejected' }\",\n ].join(\"\\n\"),\n MemRejectInputSchema,\n async (input: MemRejectInput) => jsonResult(await memReject(input, context)),\n );\n\n registerTool(\n \"mem_pending\",\n [\n \"List memories in 'proposed' status awaiting review, sorted by read count.\",\n \"\",\n \"USE IN MANUAL MODE to see what memories are waiting for human review.\",\n \"In autopilot mode, proposed memories auto-approve after 72h.\",\n \"\",\n \"High read_count on a proposed memory = many agents found it useful without\",\n \"rejecting it = strong signal to approve.\",\n \"\",\n \"RETURNS: array of { id, type, scope, read_count, created_at, body_preview }\",\n ].join(\"\\n\"),\n MemPendingInputSchema,\n async (input: MemPendingInput) => jsonResult(await memPending(input, context)),\n );\n\n registerTool(\n \"mem_delete\",\n [\n \"Permanently delete a memory by id.\",\n \"\",\n \"USE WITH CAUTION — prefer mem_reject for outdated memories (preserves history).\",\n \"Use delete only for accidentally created memories or duplicates.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to delete\",\n \" delete_usage — also delete usage stats (default: true)\",\n \"\",\n \"RETURNS: { deleted: true, id }\",\n ].join(\"\\n\"),\n MemDeleteInputSchema,\n async (input: MemDeleteInput) => jsonResult(await memDelete(input, context)),\n );\n\n // ── v0.5.0: granular alternatives to get_briefing ─────────────────────\n // Use these when you don't need the full one-shot briefing payload.\n\n registerTool(\n \"get_recap\",\n [\n \"Return ONLY the most recent session_recap. Cheaper than get_briefing when\",\n \"you just want to know 'what was I doing last time?' and don't need project\",\n \"context, modules, or memory ranking.\",\n \"\",\n \"PARAMETERS:\",\n \" scope — 'personal' | 'team' | 'any' (default 'any', returns the most recent across both)\",\n \"\",\n \"RETURNS: { recap: { id, scope, revision_count, created_at, body } | null, notice? }\",\n ].join(\"\\n\"),\n GetRecapInputSchema,\n async (input: GetRecapInput) => {\n tracker.record(\"get_recap\", input.scope);\n return jsonResult(await getRecap(input, context));\n },\n );\n\n registerTool(\n \"mem_relevant_to\",\n [\n \"One-shot ranked memories for a task — use instead of get_briefing when\",\n \"project context is already loaded and you only want the relevant memory layer.\",\n \"\",\n \"Second step in progressive disclosure (after get_briefing): narrow here, then mem_get for full text.\",\n \"\",\n \"Reuses the same ranking pipeline (anchor / module / literal / semantic) but\",\n \"skips project_context, modules, action_required, etc.\",\n \"\",\n \"PARAMETERS:\",\n \" task — 1–2 sentences describing what you are about to do (required)\",\n \" files — files you'll edit (surfaces anchored memories)\",\n \" limit — cap on returned memories (default 8)\",\n \" min_semantic_score — drop weak semantic hits below this cosine (default 0.25)\",\n \" format — 'full' | 'compact' | 'actions' (inherits get_briefing memory framing)\",\n \"\",\n \"RETURNS: { task, search_mode, memories: [...], hints?: [...], empty?: true }\",\n ].join(\"\\n\"),\n MemRelevantToInputSchema,\n async (input: MemRelevantToInput) => {\n tracker.record(\"mem_relevant_to\", input.task.slice(0, 80));\n return jsonResult(await memRelevantTo(input, context));\n },\n );\n\n // ── v0.5.0: code semantic search ──────────────────────────────────────\n\n registerTool(\n \"code_search\",\n [\n \"Semantic search over the codebase — finds exported symbols (functions, classes,\",\n \"interfaces) related to a natural-language query. Replaces blind grep when you\",\n \"don't know the exact symbol name.\",\n \"\",\n \"Requires `haive index code-search` to have been run (builds embeddings for every\",\n \"exported symbol from the code-map). Falls back to a notice when index is missing.\",\n \"\",\n \"PARAMETERS:\",\n \" query — natural language (e.g. 'function that hashes passwords', 'JWT signing')\",\n \" k — number of top hits (default 5)\",\n \" min_score — minimum cosine similarity (default 0.2; try 0.3+ for stricter)\",\n \"\",\n \"RETURNS: { available: bool, hits: [{ file, name, kind, line, description?, score }] }\",\n ].join(\"\\n\"),\n CodeSearchInputSchema,\n async (input: CodeSearchInput) => {\n tracker.record(\"code_search\", input.query.slice(0, 80));\n return jsonResult(await codeSearch(input, context));\n },\n );\n\n // ── v0.5.0: file-context lookup ───────────────────────────────────────\n\n registerTool(\n \"why_this_file\",\n [\n \"One-shot file-context lookup: combines recent git history, memories anchored\",\n \"to the path, and the code-map entry. Answers 'why is this file the way it is?'\",\n \"in a single call instead of 3-4 manual ones.\",\n \"\",\n \"PARAMETERS:\",\n \" path — project-relative path (required)\",\n \" git_log_limit — recent commits to include (default 5)\",\n \" memory_limit — anchored memories cap (default 5)\",\n \"\",\n \"RETURNS: { file, exists, recent_commits: [...], memories: [...], code_map_entry, hints? }\",\n ].join(\"\\n\"),\n WhyThisFileInputSchema,\n async (input: WhyThisFileInput) => {\n tracker.record(\"why_this_file\", input.path);\n return jsonResult(await whyThisFile(input, context));\n },\n );\n\n // ── v0.5.0: anti-patterns check ───────────────────────────────────────\n\n registerTool(\n \"anti_patterns_check\",\n [\n \"Scan a diff (or set of paths) against documented attempt/gotcha memories.\",\n \"Surfaces 'you are about to repeat a known mistake' warnings BEFORE you commit.\",\n \"\",\n \"USE BEFORE finalizing a non-trivial change. Cheap and high-signal: the only\",\n \"memories scanned are 'attempt' and 'gotcha' types.\",\n \"\",\n \"PARAMETERS:\",\n \" diff — raw unified diff text (or any code snippet) — optional if `paths` provided\",\n \" paths — affected file paths (optional if `diff` provided)\",\n \" limit — cap on returned warnings (default 8)\",\n \" semantic — also use semantic search (default true; requires embeddings index)\",\n \"\",\n \"RETURNS: { scanned, warnings: [{ id, type, scope, confidence, body_preview, reasons, semantic_score? }] }\",\n ].join(\"\\n\"),\n AntiPatternsCheckInputSchema,\n async (input: AntiPatternsCheckInput) => {\n tracker.record(\"anti_patterns_check\", input.paths.join(\",\").slice(0, 80));\n return jsonResult(await antiPatternsCheck(input, context));\n },\n );\n\n // ── v0.6.0 additions ───────────────────────────────────────────────────\n\n registerTool(\n \"mem_distill\",\n [\n \"Cluster recurring observations / failed attempts so a human can collapse\",\n \"N similar memories into one richer convention/gotcha. Cheap heuristic\",\n \"(anchor path overlap + body keyword overlap) — no embeddings required.\",\n \"\",\n \"USE periodically (e.g. monthly) to prevent memory pollution from agents\",\n \"saving the same observation many times.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days — only consider memories from the last N days (default 30)\",\n \" min_cluster — minimum cluster size to surface (default 3)\",\n \" type_filter — 'gotcha' | 'attempt' | 'all' (default 'gotcha')\",\n \" scope — 'personal' | 'team' | 'module' | 'any' (default 'any')\",\n \"\",\n \"RETURNS: { scanned, singletons, clusters: [{ suggested_topic, member_ids, ... }] }\",\n \"Output is advisory — nothing is written to disk.\",\n ].join(\"\\n\"),\n MemDistillInputSchema,\n async (input: MemDistillInput) => {\n tracker.record(\"mem_distill\", `${input.type_filter}/since=${input.since_days}d`);\n return jsonResult(await memDistill(input, context));\n },\n );\n\n registerTool(\n \"why_this_decision\",\n [\n \"Trace the genealogy of a memory (especially decision/architecture):\",\n \"the memory itself + memories explicitly linked via related_ids + memories\",\n \"anchored to overlapping paths + recent commits touching those paths.\",\n \"\",\n \"USE WHEN you find a memory and need to understand WHY it was made and\",\n \"what surrounds it. One call instead of 4-5 manual lookups.\",\n \"\",\n \"PARAMETERS:\",\n \" id — memory id (required)\",\n \" git_log_limit — how many recent commits per anchor path (default 5)\",\n \"\",\n \"RETURNS: { decision, related: [...], path_neighbors: [...], recent_commits: [...] }\",\n ].join(\"\\n\"),\n WhyThisDecisionInputSchema,\n async (input: WhyThisDecisionInput) => {\n tracker.record(\"why_this_decision\", input.id);\n return jsonResult(await whyThisDecision(input, context));\n },\n );\n\n registerTool(\n \"mem_conflicts_with\",\n [\n \"Detect memories that potentially CONTRADICT a given memory.\",\n \"\",\n \"USE BEFORE relying on a memory's advice — surfaces 'another memory says\",\n \"the opposite'. Detection uses several heuristics layered together:\",\n \"\",\n \" 1. Opposite status — validated vs rejected on overlapping topic\",\n \" 2. attempt-vs-convention on overlapping anchor paths\",\n \" 3. Polarity keywords — 'use X' vs 'do not use X' among semantic neighbors\",\n \" 4. Explicit #contradicts:<id> tags in either body\",\n \"\",\n \"PARAMETERS:\",\n \" id — memory id to check (required)\",\n \" min_score — minimum cosine similarity for semantic neighbors (default 0.5)\",\n \" semantic — use embeddings (default true)\",\n \"\",\n \"RETURNS: { found, target, scanned, conflicts: [{ id, reasons, similarity, ... }] }\",\n ].join(\"\\n\"),\n MemConflictsInputSchema,\n async (input: MemConflictsInput) => {\n tracker.record(\"mem_conflicts_with\", input.id);\n return jsonResult(await memConflicts(input, context));\n },\n );\n\n registerTool(\n \"mem_conflict_candidates\",\n [\n \"Bulk scan for conflict CANDIDATES (not proof):\",\n \"\",\n \" 1. Lexical similarity (Jaccard) on decision/architecture-like pairs\",\n \" 2. Same frontmatter.topic with validated vs rejected — quick human-review signal\",\n \"\",\n \"Advisory only — follow with mem_conflicts_with on specific ids.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days, types, min_jaccard, max_pairs, max_scan, max_topic_pairs\",\n \"\",\n \"RETURNS: { pairs, topic_status_pairs, scanned, truncated, notice? }\",\n ].join(\"\\n\"),\n MemConflictCandidatesInputSchema,\n async (input: MemConflictCandidatesInput) => {\n tracker.record(\"mem_conflict_candidates\", `${input.since_days}d`);\n return jsonResult(await memConflictCandidates(input, context));\n },\n );\n\n registerTool(\n \"runtime_journal_append\",\n [\n \"Append one line to `.ai/.runtime/session-journal.ndjson` — machine-local session continuity.\",\n \"\",\n \"Does NOT replace team memories; complements mem_session_end recaps for local traces.\",\n \"\",\n \"PARAMETERS: message, kind (note|session_end|mcp), optional tool\",\n \"\",\n \"RETURNS: { ok, path_hint }\",\n ].join(\"\\n\"),\n RuntimeJournalAppendInputSchema,\n async (input: RuntimeJournalAppendInput) =>\n jsonResult(await runtimeJournalAppend(input, context)),\n );\n\n registerTool(\n \"runtime_journal_tail\",\n [\n \"Read the last N entries from the runtime session journal (parsed JSON lines).\",\n \"\",\n \"PARAMETERS: limit (default 30, max 500)\",\n \"\",\n \"RETURNS: { entries: [...], empty?: true }\",\n ].join(\"\\n\"),\n RuntimeJournalTailInputSchema,\n async (input: RuntimeJournalTailInput) =>\n jsonResult(await runtimeJournalTail(input, context)),\n );\n\n registerTool(\n \"pre_commit_check\",\n [\n \"One-shot 'should I block this commit?' check. Combines three signals:\",\n \"\",\n \" 1. anti_patterns_check — known gotchas/attempts that match the diff\",\n \" 2. mem_for_files — conventions/decisions anchored to touched files\",\n \" 3. mem_verify — memories whose anchors are stale (knowledge may be wrong)\",\n \"\",\n \"USE FROM A GIT HOOK or before finalizing a non-trivial change.\",\n \"\",\n \"PARAMETERS:\",\n \" diff — raw unified diff text (e.g. `git diff --cached`)\",\n \" paths — affected file paths (project-relative)\",\n \" block_on — 'any' | 'high-confidence' (default) | 'never'\",\n \" semantic — use embeddings in anti_patterns_check (default true)\",\n \"\",\n \"RETURNS: { should_block, summary, warnings, relevant_memories, stale_anchors }\",\n ].join(\"\\n\"),\n PreCommitCheckInputSchema,\n async (input: PreCommitCheckInput) => {\n tracker.record(\"pre_commit_check\", `${input.paths.length}p`);\n return jsonResult(await preCommitCheck(input, context));\n },\n );\n\n registerTool(\n \"pattern_detect\",\n [\n \"Heuristic memory detector — finds knowledge worth saving WITHOUT calling an LLM.\",\n \"\",\n \"Runs three signals over local git history and the tool-usage log:\",\n \" 1. CONFIG_CHANGE — config files modified recently (tsconfig, eslint, prettier, …)\",\n \" → proposes a convention memory with the git diff as body.\",\n \" 2. REPEATED_PATH — same file appears ≥3× in mem_tried/mem_observe events\",\n \" → proposes a gotcha memory anchored to that path.\",\n \" 3. HOT_FILE — source file referenced ≥3× in writing-tool events\",\n \" → proposes a convention memory (frequent edits = pattern emerging).\",\n \"\",\n \"Saves memories with status='proposed'. They feed into auto-promote (Phase 4)\",\n \"or are surfaced in the next post_task distillation for LLM review.\",\n \"\",\n \"USE periodically (e.g. end of sprint) or trigger from post-commit hook.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days — look-back window in days (default 7)\",\n \" dry_run — report matches without saving (default false)\",\n \" scope — 'team' (default) | 'personal'\",\n \"\",\n \"RETURNS: { scanned_events, matches: [{kind, signal, proposed_type, …}], saved, saved_ids }\",\n ].join(\"\\n\"),\n PatternDetectInputSchema,\n async (input: PatternDetectInput) => {\n tracker.record(\"pattern_detect\", `since=${input.since_days}d/dry_run=${input.dry_run}`);\n return jsonResult(await patternDetect(input, context));\n },\n );\n\n registerTool(\n \"mem_diff\",\n [\n \"Compare two memories side-by-side to decide if they should be merged.\",\n \"\",\n \"USE BEFORE merging or deduplicating similar memories.\",\n \"Shows: frontmatter fields that differ + lines unique to each body.\",\n \"\",\n \"PARAMETERS:\",\n \" id_a — first memory id\",\n \" id_b — second memory id\",\n \"\",\n \"RETURNS: { frontmatter_diff: {...}, body_only_in_a: [...], body_only_in_b: [...] }\",\n ].join(\"\\n\"),\n MemDiffInputSchema,\n async (input: MemDiffInput) => jsonResult(await memDiff(input, context)),\n );\n\n if (shouldRegisterPrompt(\"bootstrap_project\")) {\n server.prompt(\n \"bootstrap_project\",\n [\n \"Analyze the project codebase and write .ai/project-context.md — run once after haive init.\",\n \"The AI explores the directory structure, reads key files (package.json, README, config),\",\n \"identifies the tech stack, architectural patterns, key modules, and conventions,\",\n \"then persists everything via bootstrap_project_save.\",\n \"For multi-component projects, run with module param to create .ai/modules/<name>/context.md.\",\n ].join(\" \"),\n BootstrapProjectArgsSchema,\n (args: BootstrapProjectArgs) => bootstrapProjectPrompt(args, context),\n );\n }\n\n if (shouldRegisterPrompt(\"post_task\")) {\n server.prompt(\n \"post_task\",\n [\n \"⭐ Post-task reflection — run at the end of every session to capture what you learned:\",\n \"failed approaches (mem_tried), new conventions/decisions/gotchas (mem_save),\",\n \"code discoveries (mem_observe), and an end-of-session recap (mem_session_end).\",\n \"In autopilot mode a minimal recap saves automatically; calling this produces a richer one.\",\n ].join(\" \"),\n PostTaskArgsSchema,\n (args: PostTaskArgs) => postTaskPrompt(args, context),\n );\n }\n\n if (shouldRegisterPrompt(\"import_docs\")) {\n server.prompt(\n \"import_docs\",\n [\n \"Import knowledge from a document (README, ADR, wiki, API spec) as hAIve memories.\",\n \"Pass the full document content; the AI extracts up to 10 actionable memories\",\n \"(conventions, decisions, gotchas, architecture) and saves them via mem_save.\",\n \"Good candidates: ADRs, onboarding docs, runbooks, team wikis.\",\n ].join(\" \"),\n ImportDocsArgsSchema,\n (args: ImportDocsArgs) => importDocsPrompt(args, context),\n );\n }\n\n return { server, context, tracker };\n}\n\n// ── Stdio runtime (also invoked by `haive mcp --stdio` via bundled CLI) ─────\n\n/** Parse argv for the standalone haive-mcp binary / CLI subprocess parity. */\nexport function parseMcpCliArgs(argv: string[]): {\n root?: string;\n versionOnly: boolean;\n} {\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--version\" || arg === \"-V\") {\n return { versionOnly: true };\n }\n }\n const out: { root?: string } = {};\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--root\" || arg === \"-r\") {\n out.root = argv[++i];\n } else if (arg?.startsWith(\"--root=\")) {\n out.root = arg.slice(\"--root=\".length);\n }\n }\n return { root: out.root, versionOnly: false };\n}\n\n/** Print MCP server version (same as haive CLI when bundled together). */\nexport function printHaiveMcpVersion(): void {\n console.log(SERVER_VERSION);\n}\n\n/**\n * Run the MCP server over stdio. Used by `haive-mcp` and by `haive mcp --stdio`\n * when the MCP implementation is bundled into the CLI.\n */\nexport async function runHaiveMcpStdio(options: { root?: string }): Promise<void> {\n const { server, context } = createHaiveServer({ root: options.root, env: process.env });\n console.error(\n `[haive-mcp] starting server v${SERVER_VERSION} (project root: ${context.paths.root})`,\n );\n await server.connect(new StdioServerTransport());\n}\n","import { findProjectRoot, resolveHaivePaths, type HaivePaths } from \"@hiveai/core\";\n\nexport interface HaiveContext {\n paths: HaivePaths;\n}\n\nexport interface CreateContextOptions {\n root?: string;\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n}\n\nexport function createContext(options: CreateContextOptions = {}): HaiveContext {\n const env = options.env ?? process.env;\n const cwd = options.cwd ?? process.cwd();\n const root =\n options.root ??\n env.HAIVE_PROJECT_ROOT ??\n findProjectRoot(cwd);\n return { paths: resolveHaivePaths(root) };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectSaveInputSchema = {\n content: z\n .string()\n .min(1)\n .describe(\"Full Markdown content for the project (or module) context file\"),\n module: z\n .string()\n .optional()\n .describe(\n \"If provided, save under .ai/modules/<module>/context.md instead of .ai/project-context.md\",\n ),\n overwrite: z\n .boolean()\n .default(false)\n .describe(\"Overwrite an existing file instead of failing\"),\n};\n\nexport type BootstrapProjectSaveInput = {\n [K in keyof typeof BootstrapProjectSaveInputSchema]: z.infer<\n (typeof BootstrapProjectSaveInputSchema)[K]\n >;\n};\n\nexport interface BootstrapProjectSaveOutput {\n file_path: string;\n action: \"created\" | \"overwritten\";\n}\n\nexport async function bootstrapProjectSave(\n input: BootstrapProjectSaveInput,\n ctx: HaiveContext,\n): Promise<BootstrapProjectSaveOutput> {\n const target = input.module\n ? path.join(ctx.paths.modulesContextDir, input.module, \"context.md\")\n : ctx.paths.projectContext;\n\n const exists = existsSync(target);\n if (exists && !input.overwrite) {\n throw new Error(\n `${target} already exists. Pass overwrite=true to replace it.`,\n );\n }\n\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, input.content, \"utf8\");\n\n return {\n file_path: target,\n action: exists ? \"overwritten\" : \"created\",\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetProjectContextInputSchema = {\n module: z\n .string()\n .optional()\n .describe(\"If provided, also include the matching module's context file\"),\n list_modules: z\n .boolean()\n .default(false)\n .describe(\"Return the list of available module context files\"),\n};\n\nexport type GetProjectContextInput = {\n [K in keyof typeof GetProjectContextInputSchema]: z.infer<\n (typeof GetProjectContextInputSchema)[K]\n >;\n};\n\nexport interface GetProjectContextOutput {\n root_context: string | null;\n module_context?: { name: string; content: string };\n available_modules?: string[];\n}\n\nexport async function getProjectContext(\n input: GetProjectContextInput,\n ctx: HaiveContext,\n): Promise<GetProjectContextOutput> {\n const out: GetProjectContextOutput = { root_context: null };\n\n if (existsSync(ctx.paths.projectContext)) {\n out.root_context = await readFile(ctx.paths.projectContext, \"utf8\");\n }\n\n if (input.module) {\n const modFile = path.join(ctx.paths.modulesContextDir, input.module, \"context.md\");\n if (existsSync(modFile)) {\n out.module_context = {\n name: input.module,\n content: await readFile(modFile, \"utf8\"),\n };\n }\n }\n\n if (input.list_modules) {\n out.available_modules = await listModules(ctx.paths.modulesContextDir);\n }\n\n return out;\n}\n\nasync function listModules(modulesDir: string): Promise<string[]> {\n if (!existsSync(modulesDir)) return [];\n const entries = await readdir(modulesDir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemListInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional(),\n module: z.string().optional(),\n tag: z.string().optional(),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n include_body: z\n .boolean()\n .default(false)\n .describe(\"Include full body text. Default false to save tokens — use mem_get for a single memory's full content.\"),\n};\n\nexport type MemListInput = {\n [K in keyof typeof MemListInputSchema]: z.infer<(typeof MemListInputSchema)[K]>;\n};\n\nexport interface MemSummary {\n id: string;\n scope: string;\n type: string;\n module?: string;\n status: string;\n tags: string[];\n snippet: string;\n file_path: string;\n body?: string;\n}\n\nexport async function memList(\n input: MemListInput,\n ctx: HaiveContext,\n): Promise<{ memories: MemSummary[] }> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { memories: [] };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.tag && !fm.tags.includes(input.tag)) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n return true;\n });\n const memories: MemSummary[] = filtered.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const snippet = memory.body.replace(/\\s+/g, \" \").trim().slice(0, 120);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n status: fm.status,\n tags: fm.tags,\n snippet,\n file_path: filePath,\n ...(input.include_body ? { body: memory.body } : {}),\n };\n });\n return { memories };\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n loadConfig,\n loadMemoriesFromDir,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSaveInputSchema = {\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\", \"attempt\", \"session_recap\"])\n .describe(\n \"Kind of memory being saved. Use 'attempt' for failed approaches (auto-validated). \" +\n \"Use 'session_recap' via mem_session_end instead.\",\n ),\n slug: z\n .string()\n .min(1)\n .describe(\"Short human-readable identifier — becomes part of the filename\"),\n body: z\n .string()\n .describe(\"Markdown body of the memory\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .optional()\n .describe(\n \"Visibility scope: personal | team | module. \" +\n \"When omitted, falls back to defaultScope in haive.config.json (default: personal).\",\n ),\n module: z\n .string()\n .optional()\n .describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n domain: z.string().optional().describe(\"Domain (e.g. transactions, billing)\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Anchor paths (file paths this memory references)\"),\n symbols: z\n .array(z.string())\n .default([])\n .describe(\"Anchor symbols (function/class names this memory references)\"),\n commit: z\n .string()\n .optional()\n .describe(\"Anchor commit SHA (for staleness detection later)\"),\n topic: z\n .string()\n .optional()\n .describe(\n \"Stable key for this memory. If a memory with the same topic already exists in this scope, \" +\n \"it is updated in-place (revision_count++). Use for knowledge that evolves over time.\",\n ),\n};\n\nexport type MemSaveInput = {\n [K in keyof typeof MemSaveInputSchema]: z.infer<(typeof MemSaveInputSchema)[K]>;\n};\n\nexport interface MemSaveOutput {\n id: string;\n scope: string;\n file_path: string;\n action: \"created\" | \"updated\";\n revision_count?: number;\n warning?: string;\n similar_found?: string[];\n /** High textual overlap with existing memory (same scope+type); consider merging instead. */\n body_similar?: { id: string; score: number };\n invalid_paths?: string[];\n}\n\nfunction bodyHash(body: string): string {\n return createHash(\"sha256\").update(body.trim()).digest(\"hex\").slice(0, 12);\n}\n\nconst WORD_RE = /\\b[a-z0-9]{3,}\\b/gi;\n\nfunction bodyTokenSet(body: string): Set<string> {\n const raw = body.toLowerCase().match(WORD_RE) ?? [];\n return new Set(raw);\n}\n\n/** Jaccard similarity on alphanumeric tokens — warns when corpus has near-duplicate wording. */\nfunction maxBodySimilarity(\n incomingTokens: Set<string>,\n memories: Array<{ memory: { body: string; frontmatter: { scope: string; type: string; id: string; status?: string } } }>,\n scope: string,\n type: string,\n excludeIds?: ReadonlySet<string>,\n): { score: number; id: string } | null {\n if (incomingTokens.size < 6) return null;\n let best: { score: number; id: string } | null = null;\n const skip = excludeIds ?? new Set<string>();\n for (const { memory } of memories) {\n const fm = memory.frontmatter;\n if (skip.has(fm.id)) continue;\n if (fm.scope !== scope || fm.type !== type) continue;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n const other = bodyTokenSet(memory.body);\n if (other.size === 0) continue;\n let inter = 0;\n for (const t of incomingTokens) if (other.has(t)) inter++;\n const uni = incomingTokens.size + other.size - inter;\n const j = uni === 0 ? 0 : inter / uni;\n if (j >= 0.72 && (!best || j > best.score)) best = { score: j, id: fm.id };\n }\n return best;\n}\n\nexport async function memSave(\n input: MemSaveInput,\n ctx: HaiveContext,\n): Promise<MemSaveOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(\n `No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`,\n );\n }\n\n const existing = existsSync(ctx.paths.memoriesDir)\n ? await loadMemoriesFromDir(ctx.paths.memoriesDir)\n : [];\n\n // ── Resolve scope once: explicit input wins over config default ────────\n // Must be computed early so dedup and topic-upsert use the same scope\n // that the new memory will ultimately be saved under.\n const haiveConfig = await loadConfig(ctx.paths);\n const resolvedScope = (\n input.scope ?? haiveConfig.defaultScope ?? \"personal\"\n ) as \"personal\" | \"team\" | \"module\";\n\n // ── Anchor path validation ─────────────────────────────────────────────\n const invalidPaths = input.paths.filter(\n (p) => !existsSync(path.resolve(ctx.paths.root, p)),\n );\n\n // ── Dedup by content hash ──────────────────────────────────────────────\n const incomingHash = bodyHash(input.body);\n const hashDuplicate = existing.find(({ memory }) =>\n bodyHash(memory.body) === incomingHash &&\n memory.frontmatter.scope === resolvedScope,\n );\n if (hashDuplicate) {\n throw new Error(\n `Duplicate content detected — identical body already saved as \"${hashDuplicate.memory.frontmatter.id}\". ` +\n `Use mem_update to modify it, or change the body to add new information.`,\n );\n }\n\n const incomingTokens = bodyTokenSet(input.body);\n\n function bodySimilarWarnings(excludeIds?: ReadonlySet<string>): {\n similarityWarning?: string;\n body_similar?: MemSaveOutput[\"body_similar\"];\n } {\n const dup = maxBodySimilarity(incomingTokens, existing, resolvedScope, input.type, excludeIds);\n if (!dup?.id) return {};\n const body_similar: MemSaveOutput[\"body_similar\"] = {\n id: dup.id,\n score: Math.round(dup.score * 100) / 100,\n };\n return {\n similarityWarning: `Body is ~${Math.round(dup.score * 100)}% similar (token overlap) to existing \"${dup.id}\" — consolidate if redundant.`,\n body_similar,\n };\n }\n\n // ── Topic upsert ───────────────────────────────────────────────────────\n if (input.topic) {\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === input.topic &&\n memory.frontmatter.scope === resolvedScope &&\n (!input.module || memory.frontmatter.module === input.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const { similarityWarning: simW, body_similar: bs } = bodySimilarWarnings(new Set([fm.id]));\n const newFrontmatter = {\n ...fm,\n body: input.body,\n tags: input.tags.length ? input.tags : fm.tags,\n revision_count: (fm.revision_count ?? 0) + 1,\n anchor: {\n commit: input.commit ?? fm.anchor.commit,\n paths: input.paths.length ? input.paths : fm.anchor.paths,\n symbols: input.symbols.length ? input.symbols : fm.anchor.symbols,\n },\n };\n await writeFile(\n topicMatch.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: input.body }),\n \"utf8\",\n );\n const mergedTw = [\n invalidPaths.length > 0\n ? `Anchor path(s) not found in project: ${invalidPaths.join(\", \")}. They will be marked stale by haive sync.`\n : null,\n simW ?? null,\n ]\n .filter(Boolean)\n .join(\" — \") || undefined;\n\n return {\n id: fm.id,\n scope: fm.scope,\n file_path: topicMatch.filePath,\n action: \"updated\",\n revision_count: newFrontmatter.revision_count,\n ...(mergedTw ? { warning: mergedTw } : {}),\n ...(bs ? { body_similar: bs } : {}),\n ...(invalidPaths.length > 0 ? { invalid_paths: invalidPaths } : {}),\n };\n }\n }\n\n // ── Create new memory ──────────────────────────────────────────────────\n // resolvedScope and haiveConfig are already computed above.\n\n const frontmatter = buildFrontmatter({\n type: input.type,\n slug: input.slug,\n scope: resolvedScope,\n module: input.module,\n tags: input.tags,\n domain: input.domain,\n author: input.author,\n paths: input.paths,\n symbols: input.symbols,\n commit: input.commit,\n topic: input.topic,\n status: haiveConfig.defaultStatus === \"validated\" ? \"validated\" : undefined,\n });\n\n const file = memoryFilePath(\n ctx.paths,\n frontmatter.scope,\n frontmatter.id,\n frontmatter.module,\n );\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n throw new Error(`Memory already exists at ${file}`);\n }\n\n // ── Similar slug detection (warn but don't block) ──────────────────────\n let warning: string | undefined;\n let similar_found: string[] | undefined;\n if (existing.length > 0) {\n const slugTokens = input.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 similar_found = similar.map((m) => m.memory.frontmatter.id);\n warning = `Possible duplicate: similar memories already exist (${similar_found.join(\", \")}). Consider updating one of these instead.`;\n }\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body: input.body }), \"utf8\");\n\n const { similarityWarning: simWarnNew, body_similar: bsNew } = bodySimilarWarnings();\n\n // Merge warnings: invalid anchors + slug similarity + body similarity\n const finalWarning = [\n invalidPaths.length > 0\n ? `Anchor path(s) not found in project: ${invalidPaths.join(\", \")}. They will be marked stale by \\`haive sync\\`.`\n : null,\n warning ?? null,\n simWarnNew ?? null,\n ].filter(Boolean).join(\" — \") || undefined;\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n action: \"created\",\n ...(finalWarning ? { warning: finalWarning } : {}),\n ...(similar_found ? { similar_found } : {}),\n ...(bsNew ? { body_similar: bsNew } : {}),\n ...(invalidPaths.length > 0 ? { invalid_paths: invalidPaths } : {}),\n };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n extractSnippet,\n getUsage,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadMemoriesFromDir,\n loadUsageIndex,\n pickSnippetNeedle,\n rankMemoriesLexical,\n tokenizeQuery,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSearchInputSchema = {\n query: z.string().describe(\"Substring matched against id, tags, and body\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .optional()\n .describe(\"Restrict results to a single scope\"),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\", \"attempt\", \"session_recap\"])\n .optional()\n .describe(\"Restrict results to a memory type. session_recap is excluded by default — use type='session_recap' to include them.\"),\n include_session_recap: z\n .boolean()\n .default(false)\n .describe(\"Include session_recap memories in search results (excluded by default — they surface in get_briefing as last_session).\"),\n module: z.string().optional().describe(\"Restrict results to a module\"),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n limit: z.number().int().positive().max(100).default(20).describe(\"Max results\"),\n semantic: z\n .boolean()\n .default(false)\n .describe(\n \"Use semantic similarity from the embeddings index (requires `haive embeddings index`).\",\n ),\n lexical_rank: z\n .boolean()\n .default(false)\n .describe(\n \"When true (and semantic is false), rank the filtered corpus with Okapi-BM25-style lexical scoring instead of literal AND/OR. Helps phrase-like queries without embeddings.\",\n ),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0)\n .describe(\"Minimum cosine similarity (semantic mode only)\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories (used for passive validation)\"),\n};\n\nexport type MemSearchInput = {\n [K in keyof typeof MemSearchInputSchema]: z.infer<(typeof MemSearchInputSchema)[K]>;\n};\n\n/** session_recap memories are surfaced separately via get_briefing.last_session — not in search results by default. */\nfunction isSessionRecap(fm: { type: string }): boolean {\n return fm.type === \"session_recap\";\n}\n\nexport interface MemSearchHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n snippet: string;\n file_path: string;\n score?: number;\n}\n\nexport interface MemSearchOutput {\n matches: MemSearchHit[];\n total: number;\n mode: \"literal\" | \"semantic\" | \"literal_fallback\" | \"lexical_ranked\";\n notice?: string;\n}\n\nexport async function memSearch(\n input: MemSearchInput,\n ctx: HaiveContext,\n): Promise<MemSearchOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { matches: [], total: 0, mode: input.semantic ? \"literal_fallback\" : \"literal\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => passesFilters(memory.frontmatter, input));\n const usage = await loadUsageIndex(ctx.paths);\n\n let result: MemSearchOutput;\n if (input.semantic) {\n const semantic = await trySemanticSearch(ctx, input, filtered, usage);\n if (semantic) {\n result = semantic;\n } else {\n result = {\n ...buildLiteralResult(input, filtered, usage),\n mode: \"literal_fallback\",\n notice:\n \"Semantic search unavailable (embeddings index missing or @hiveai/embeddings not installed). Falling back to literal search.\",\n };\n }\n } else if (input.lexical_rank && input.query.trim()) {\n const { ranked, scores } = rankMemoriesLexical(\n filtered,\n input.query,\n input.limit,\n );\n if (ranked.length > 0) {\n const snippetNeedle = pickSnippetNeedle(input.query);\n result = {\n matches: ranked.map((loaded, i) =>\n lexicalHit(loaded, snippetNeedle, usage, scores[i]!),\n ),\n total: ranked.length,\n mode: \"lexical_ranked\",\n };\n } else {\n result = {\n ...buildLiteralResult(input, filtered, usage),\n notice: \"Lexical ranking found no BM25-positive hits — showing literal matches instead.\",\n };\n }\n } else {\n result = buildLiteralResult(input, filtered, usage);\n }\n\n if (input.track && result.matches.length > 0) {\n await trackReads(\n ctx.paths,\n result.matches.map((m) => m.id),\n );\n }\n\n return result;\n}\n\nfunction passesFilters(\n fm: LoadedMemory[\"memory\"][\"frontmatter\"],\n input: MemSearchInput,\n): boolean {\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n // session_recap memories surface via get_briefing.last_session — exclude unless explicitly requested\n if (!input.include_session_recap && isSessionRecap(fm)) return false;\n return true;\n}\n\nfunction buildLiteralResult(\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): { matches: MemSearchHit[]; total: number; mode: \"literal\"; notice?: string } {\n const tokens = tokenizeQuery(input.query);\n const snippetNeedle = pickSnippetNeedle(input.query);\n\n let andMatched = filtered.filter(({ memory }) => literalMatchesAllTokens(memory, tokens));\n if (andMatched.length > 0) {\n const top = andMatched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: andMatched.length,\n mode: \"literal\",\n };\n }\n\n // AND returned nothing — fall back to OR (any token)\n const orMatched = filtered.filter(({ memory }) => literalMatchesAnyToken(memory, tokens));\n const top = orMatched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: orMatched.length,\n mode: \"literal\",\n notice: `No exact match for all tokens. Showing partial matches (OR fallback) — ${orMatched.length} result${orMatched.length === 1 ? \"\" : \"s\"}.`,\n };\n}\n\nasync function trySemanticSearch(\n ctx: HaiveContext,\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): Promise<MemSearchOutput | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, input.query, {\n limit: Math.min(input.limit * 3, 100),\n minScore: input.min_score,\n });\n if (!result) return null;\n\n const allowedIds = new Set(filtered.map((m) => m.memory.frontmatter.id));\n const byId = new Map(filtered.map((m) => [m.memory.frontmatter.id, m]));\n\n const ranked = result.hits\n .filter((h) => allowedIds.has(h.id))\n .slice(0, input.limit);\n\n const matches: MemSearchHit[] = ranked.map((hit) => {\n const loaded = byId.get(hit.id);\n if (!loaded) {\n return {\n id: hit.id,\n scope: \"unknown\",\n type: \"unknown\",\n tags: [],\n status: \"unknown\",\n confidence: \"unverified\" as const,\n read_count: 0,\n snippet: \"\",\n file_path: hit.file_path,\n score: hit.score,\n };\n }\n const base = toHit(loaded, input.query.toLowerCase(), usage);\n return { ...base, score: hit.score };\n });\n\n return {\n matches,\n total: ranked.length,\n mode: \"semantic\",\n };\n}\n\nfunction toHit(loaded: LoadedMemory, needle: string, usage: UsageIndex): MemSearchHit {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n snippet: extractSnippet(loaded.memory.body, needle),\n file_path: loaded.filePath,\n };\n}\n\nfunction lexicalHit(\n loaded: LoadedMemory,\n needle: string,\n usage: UsageIndex,\n lexicalScore: number,\n): MemSearchHit {\n return { ...toHit(loaded, needle, usage), score: lexicalScore };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n verifyAnchor,\n type Memory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemVerifyInputSchema = {\n id: z.string().optional().describe(\"If set, verify only this memory id\"),\n update: z\n .boolean()\n .default(false)\n .describe(\"Write the resulting status back to disk (status=stale or validated)\"),\n};\n\nexport type MemVerifyInput = {\n [K in keyof typeof MemVerifyInputSchema]: z.infer<(typeof MemVerifyInputSchema)[K]>;\n};\n\nexport interface MemVerifyHit {\n id: string;\n file_path: string;\n stale: boolean;\n reason: string | null;\n possible_renames?: string[];\n status_after: string;\n skipped?: boolean;\n}\n\nexport interface MemVerifyOutput {\n results: MemVerifyHit[];\n summary: {\n checked: number;\n fresh: number;\n stale: number;\n anchorless_skipped: number;\n updated: number;\n };\n}\n\nexport async function memVerify(\n input: MemVerifyInput,\n ctx: HaiveContext,\n): Promise<MemVerifyOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n results: [],\n summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 },\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const targets = input.id\n ? all.filter((m) => m.memory.frontmatter.id === input.id)\n : all;\n\n const results: MemVerifyHit[] = [];\n let fresh = 0;\n let stale = 0;\n let anchorless = 0;\n let updated = 0;\n\n for (const { memory, filePath } of targets) {\n // session_recap records historical context — anchor staleness does not apply\n if (memory.frontmatter.type === \"session_recap\") {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const isAnchored =\n memory.frontmatter.anchor.paths.length > 0 ||\n memory.frontmatter.anchor.symbols.length > 0;\n if (!isAnchored) {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const result = await verifyAnchor(memory, { projectRoot: ctx.paths.root });\n if (result.stale) stale++;\n else fresh++;\n\n let statusAfter = memory.frontmatter.status;\n if (input.update) {\n const next = applyVerification(memory, result);\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n statusAfter = next.frontmatter.status;\n updated++;\n }\n\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: result.stale,\n reason: result.reason,\n ...(result.possibleRenames.length > 0 ? { possible_renames: result.possibleRenames } : {}),\n status_after: statusAfter,\n });\n }\n\n return {\n results,\n summary: {\n checked: results.length + anchorless,\n fresh,\n stale,\n anchorless_skipped: anchorless,\n updated,\n },\n };\n}\n\nfunction applyVerification(\n mem: Memory,\n result: { stale: boolean; reason: string | null },\n): Memory {\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 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 { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n recordRejection,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRejectInputSchema = {\n id: z.string().min(1).describe(\"Memory id being rejected\"),\n reason: z\n .string()\n .optional()\n .describe(\"Why this memory is being rejected (recorded for review)\"),\n};\n\nexport type MemRejectInput = {\n [K in keyof typeof MemRejectInputSchema]: z.infer<(typeof MemRejectInputSchema)[K]>;\n};\n\nexport interface MemRejectOutput {\n id: string;\n status: string;\n rejected_count: number;\n last_rejected_at: string | null;\n rejection_reason: string | null;\n}\n\nexport async function memReject(\n input: MemRejectInput,\n ctx: HaiveContext,\n): Promise<MemRejectOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n // Write rejected status and reason to disk\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: {\n ...loaded.memory.frontmatter,\n status: \"rejected\",\n stale_reason: input.reason ?? loaded.memory.frontmatter.stale_reason ?? null,\n },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(ctx.paths);\n recordRejection(idx, input.id, input.reason ?? null);\n await saveUsageIndex(ctx.paths, idx);\n const u = idx.by_id[input.id];\n return {\n id: input.id,\n status: \"rejected\",\n rejected_count: u?.rejected_count ?? 0,\n last_rejected_at: u?.last_rejected_at ?? null,\n rejection_reason: u?.rejection_reason ?? null,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n deriveConfidence,\n getUsage,\n inferModulesFromPaths,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemForFilesInputSchema = {\n files: z\n .array(z.string())\n .min(1)\n .describe(\"Project-relative file paths the agent is currently working on\"),\n include_module_contexts: z\n .boolean()\n .default(true)\n .describe(\"Inline the matching .ai/modules/<name>/context.md contents\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories\"),\n};\n\nexport type MemForFilesInput = {\n [K in keyof typeof MemForFilesInputSchema]: z.infer<(typeof MemForFilesInputSchema)[K]>;\n};\n\nexport interface MemMatch {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n reason: \"anchor_overlap\" | \"module\" | \"domain\";\n file_path: string;\n body: string;\n}\n\nexport interface MemForFilesOutput {\n inferred_modules: string[];\n by_anchor: MemMatch[];\n by_module: MemMatch[];\n by_domain: MemMatch[];\n module_contexts: Array<{ name: string; content: string }>;\n}\n\nexport async function memForFiles(\n input: MemForFilesInput,\n ctx: HaiveContext,\n): Promise<MemForFilesOutput> {\n const inferred = inferModulesFromPaths(input.files);\n\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n inferred_modules: inferred,\n by_anchor: [],\n by_module: [],\n by_domain: [],\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const seen = new Set<string>();\n\n const byAnchor: MemMatch[] = [];\n const byModule: MemMatch[] = [];\n const byDomain: MemMatch[] = [];\n\n for (const loaded of all) {\n // session_recap surfaces in get_briefing.last_session — skip here\n if (loaded.memory.frontmatter.type === \"session_recap\") continue;\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) {\n byAnchor.push(toMatch(loaded, \"anchor_overlap\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n // Extract meaningful path segments from input files for tag matching\n const pathSegments = extractPathSegments(input.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) => inferred.includes(t)) ||\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(toMatch(loaded, \"module\", usage));\n seen.add(fm.id);\n }\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(toMatch(loaded, \"domain\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n if (input.track) {\n await trackReads(ctx.paths, [...seen]);\n }\n\n return {\n inferred_modules: inferred,\n by_anchor: byAnchor,\n by_module: byModule,\n by_domain: byDomain,\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n}\n\nfunction toMatch(\n loaded: LoadedMemory,\n reason: MemMatch[\"reason\"],\n usage: Parameters<typeof getUsage>[0],\n): MemMatch {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n reason,\n file_path: loaded.filePath,\n body: loaded.memory.body,\n };\n}\n\n/**\n * Extract lowercase path segments from file paths that are likely domain/module names.\n * Filters out generic segments like src, main, java, com, org, test, etc.\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(/\\.[^.]+$/, \"\"); // strip extension\n if (seg.length >= 3 && !GENERIC.has(seg) && /^[a-z]/.test(seg)) {\n out.add(seg);\n // Also split camelCase / kebab-case segments: mobilepayment → mobile, payment\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\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n enabled: boolean,\n): Promise<Array<{ name: string; content: string }>> {\n if (!enabled || modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n type ConfidenceLevel,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemGetInputSchema = {\n id: z.string().min(1).describe(\"Memory id to fetch\"),\n};\n\nexport type MemGetInput = {\n [K in keyof typeof MemGetInputSchema]: z.infer<(typeof MemGetInputSchema)[K]>;\n};\n\nexport interface MemGetOutput {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n rejected_count: number;\n created_at: string;\n verified_at: string | null;\n stale_reason: string | null;\n anchor: { commit?: string; paths: string[]; symbols: string[] };\n body: string;\n file_path: string;\n}\n\nexport async function memGet(input: MemGetInput, ctx: HaiveContext): Promise<MemGetOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n const fm = found.memory.frontmatter;\n const u = getUsage(await loadUsageIndex(ctx.paths), fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n created_at: fm.created_at,\n verified_at: fm.verified_at,\n stale_reason: fm.stale_reason,\n anchor: {\n ...(fm.anchor.commit ? { commit: fm.anchor.commit } : {}),\n paths: fm.anchor.paths,\n symbols: fm.anchor.symbols,\n },\n body: found.memory.body,\n file_path: found.filePath,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDeleteInputSchema = {\n id: z.string().min(1).describe(\"Memory id to delete\"),\n keep_usage: z\n .boolean()\n .default(false)\n .describe(\"Keep the usage.json entry instead of removing it alongside the file\"),\n};\n\nexport type MemDeleteInput = {\n [K in keyof typeof MemDeleteInputSchema]: z.infer<(typeof MemDeleteInputSchema)[K]>;\n};\n\nexport interface MemDeleteOutput {\n id: string;\n deleted_file: string;\n usage_removed: boolean;\n}\n\nexport async function memDelete(\n input: MemDeleteInput,\n ctx: HaiveContext,\n): Promise<MemDeleteOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n await unlink(found.filePath);\n\n let usageRemoved = false;\n if (!input.keep_usage) {\n const idx = await loadUsageIndex(ctx.paths);\n if (idx.by_id[input.id]) {\n delete idx.by_id[input.id];\n await saveUsageIndex(ctx.paths, idx);\n usageRemoved = true;\n }\n }\n\n return { id: input.id, deleted_file: found.filePath, usage_removed: usageRemoved };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir, serializeMemory } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemUpdateInputSchema = {\n id: z.string().min(1).describe(\"Id of the memory to update\"),\n body: z.string().optional().describe(\"New Markdown body — replaces the existing body\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"New tags array — fully replaces existing tags\"),\n paths: z\n .array(z.string())\n .optional()\n .describe(\"New anchor paths — fully replaces existing anchor.paths\"),\n symbols: z\n .array(z.string())\n .optional()\n .describe(\"New anchor symbols — fully replaces existing anchor.symbols\"),\n commit: z.string().optional().describe(\"New anchor commit SHA\"),\n domain: z.string().optional().describe(\"New domain label\"),\n author: z.string().optional().describe(\"New author handle or email\"),\n};\n\nexport type MemUpdateInput = {\n [K in keyof typeof MemUpdateInputSchema]: z.infer<(typeof MemUpdateInputSchema)[K]>;\n};\n\nexport interface MemUpdateOutput {\n id: string;\n file_path: string;\n updated_fields: string[];\n}\n\nexport async function memUpdate(\n input: MemUpdateInput,\n ctx: HaiveContext,\n): Promise<MemUpdateOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n const { frontmatter, body } = loaded.memory;\n const updated_fields: string[] = [];\n\n const newAnchor = { ...frontmatter.anchor };\n if (input.paths !== undefined) { newAnchor.paths = input.paths; updated_fields.push(\"anchor.paths\"); }\n if (input.symbols !== undefined) { newAnchor.symbols = input.symbols; updated_fields.push(\"anchor.symbols\"); }\n if (input.commit !== undefined) { newAnchor.commit = input.commit; updated_fields.push(\"anchor.commit\"); }\n\n const newFrontmatter = {\n ...frontmatter,\n anchor: newAnchor,\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.domain !== undefined ? { domain: input.domain } : {}),\n ...(input.author !== undefined ? { author: input.author } : {}),\n };\n\n if (input.tags !== undefined) updated_fields.push(\"tags\");\n if (input.domain !== undefined) updated_fields.push(\"domain\");\n if (input.author !== undefined) updated_fields.push(\"author\");\n\n const newBody = input.body !== undefined ? input.body : body;\n if (input.body !== undefined) updated_fields.push(\"body\");\n\n if (updated_fields.length === 0) {\n throw new Error(\"No fields to update — provide at least one of: body, tags, paths, symbols, commit, domain, author.\");\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: newBody }),\n \"utf8\",\n );\n\n return { id: input.id, file_path: loaded.filePath, updated_fields };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemPendingInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n};\n\nexport type MemPendingInput = {\n [K in keyof typeof MemPendingInputSchema]: z.infer<(typeof MemPendingInputSchema)[K]>;\n};\n\nexport interface MemPendingHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n age_days: number;\n read_count: number;\n rejected_count: number;\n file_path: string;\n}\n\nexport interface MemPendingOutput {\n pending: MemPendingHit[];\n}\n\nexport async function memPending(\n input: MemPendingInput,\n ctx: HaiveContext,\n): Promise<MemPendingOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) return { pending: [] };\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const now = Date.now();\n const proposed = all.filter(({ memory }) => {\n if (memory.frontmatter.status !== \"proposed\") return false;\n if (input.scope && memory.frontmatter.scope !== input.scope) return false;\n return true;\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 return {\n pending: proposed.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n age_days: Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n file_path: filePath,\n };\n }),\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemApproveInputSchema = {\n id: z.string().min(1).describe(\"Memory id to approve (sets status=validated immediately)\"),\n};\n\nexport type MemApproveInput = {\n [K in keyof typeof MemApproveInputSchema]: z.infer<(typeof MemApproveInputSchema)[K]>;\n};\n\nexport interface MemApproveOutput {\n id: string;\n previous_status: string;\n status: \"validated\";\n file_path: string;\n}\n\nexport async function memApprove(\n input: MemApproveInput,\n ctx: HaiveContext,\n): Promise<MemApproveOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n const previous = found.memory.frontmatter.status;\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 return {\n id: input.id,\n previous_status: previous,\n status: \"validated\",\n file_path: found.filePath,\n };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemTriedInputSchema = {\n what: z.string().min(1).describe(\"Brief description of the approach that was tried\"),\n why_failed: z\n .string()\n .min(1)\n .describe(\"Why it failed or why it should NOT be used\"),\n instead: z\n .string()\n .optional()\n .describe(\"What to use or do instead (recommended alternative)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility scope\"),\n module: z.string().optional().describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Anchor file paths this applies to\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n};\n\nexport type MemTriedInput = {\n [K in keyof typeof MemTriedInputSchema]: z.infer<(typeof MemTriedInputSchema)[K]>;\n};\n\nexport interface MemTriedOutput {\n id: string;\n scope: string;\n file_path: string;\n}\n\nexport async function memTried(\n input: MemTriedInput,\n ctx: HaiveContext,\n): Promise<MemTriedOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n const slug = input.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: input.scope,\n module: input.module,\n tags: input.tags,\n paths: input.paths,\n author: input.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[] = [`# ${input.what}`, \"\"];\n lines.push(`**Why it failed / do NOT use:** ${input.why_failed}`);\n if (input.instead) {\n lines.push(\"\", `**Instead, use:** ${input.instead}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n\n const file = memoryFilePath(ctx.paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n throw new Error(`Memory already exists at ${file}`);\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n return { id: frontmatter.id, scope: frontmatter.scope, file_path: file };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n/**\n * mem_observe — capture a code-level discovery made during exploration.\n *\n * Unlike mem_tried (failed approaches) or mem_save (conventions/decisions),\n * mem_observe is for bugs, inconsistencies, and security gaps discovered by\n * reading existing code that were NOT in the briefing. Auto-validated (no review).\n */\nexport const MemObserveInputSchema = {\n what: z\n .string()\n .min(1)\n .describe(\"Short title: what did you observe? (e.g. 'MobilePaymentController has two @RequestBody on handleWebhook')\"),\n where: z\n .string()\n .min(1)\n .describe(\"File path(s) where the issue lives — be specific\"),\n impact: z\n .string()\n .min(1)\n .describe(\"What breaks or could break because of this (e.g. 'Spring MVC rejects the handler at startup')\"),\n fix: z\n .string()\n .optional()\n .describe(\"Suggested fix or workaround (optional — leave empty if unknown)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"team\")\n .describe(\"Visibility scope — defaults to team since discoveries benefit everyone\"),\n module: z.string().optional().describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n};\n\nexport type MemObserveInput = {\n [K in keyof typeof MemObserveInputSchema]: z.infer<(typeof MemObserveInputSchema)[K]>;\n};\n\nexport interface MemObserveOutput {\n id: string;\n scope: string;\n file_path: string;\n}\n\nexport async function memObserve(\n input: MemObserveInput,\n ctx: HaiveContext,\n): Promise<MemObserveOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n const slug = input.what\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .trim()\n .split(/\\s+/)\n .slice(0, 6)\n .join(\"-\");\n\n // Parse where into anchor paths (comma-separated or single path)\n const anchorPaths = input.where\n .split(/[,\\n]/)\n .map((s) => s.trim())\n .filter(Boolean);\n\n const baseFm = buildFrontmatter({\n type: \"gotcha\",\n slug,\n scope: input.scope,\n module: input.module,\n tags: input.tags,\n paths: anchorPaths,\n author: input.author,\n });\n // Observations are immediately validated — no review cycle needed\n const frontmatter = { ...baseFm, status: \"validated\" as const };\n\n const lines: string[] = [`# ${input.what}`, \"\"];\n lines.push(`**Where:** \\`${input.where}\\``);\n lines.push(\"\", `**Impact:** ${input.impact}`);\n if (input.fix) {\n lines.push(\"\", `**Fix/workaround:** ${input.fix}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n\n const file = memoryFilePath(ctx.paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n throw new Error(`Memory already exists at ${file}`);\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n return { id: frontmatter.id, scope: frontmatter.scope, file_path: file };\n}\n","/**\n * mem_session_end — save a structured end-of-session recap.\n *\n * Engram-inspired: explicit session lifecycle lets the next session start with\n * rich context about what was just done, which files were touched, and what\n * remains. Uses topic-upsert so there is always exactly ONE \"current recap\"\n * per scope/module: revisions accumulate in-place rather than creating clutter.\n */\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n loadMemoriesFromDir,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { clearPendingDistill } from \"../session-tracker.js\";\n\nexport const MemSessionEndInputSchema = {\n goal: z\n .string()\n .min(1)\n .describe(\"What you were trying to accomplish this session (1–2 sentences)\"),\n accomplished: z\n .string()\n .describe(\"What was actually done — bullet list recommended\"),\n discoveries: z\n .string()\n .default(\"\")\n .describe(\n \"Any bugs, inconsistencies, surprises, or missing knowledge found during this session. \" +\n \"Empty if nothing surprising was found.\",\n ),\n files_touched: z\n .array(z.string())\n .default([])\n .describe(\"Key files that were read or modified — used as anchor paths\"),\n next_steps: z\n .string()\n .default(\"\")\n .describe(\"What should happen next (for the next session or a teammate)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility: personal = private to you, team = shared with the team\"),\n module: z\n .string()\n .optional()\n .describe(\"Module name (required when scope=module)\"),\n};\n\nexport type MemSessionEndInput = {\n [K in keyof typeof MemSessionEndInputSchema]: z.infer<(typeof MemSessionEndInputSchema)[K]>;\n};\n\nexport interface MemSessionEndOutput {\n id: string;\n scope: string;\n file_path: string;\n action: \"created\" | \"updated\";\n revision_count: number;\n}\n\n/** Stable topic key for upsert — one recap per scope/module. */\nfunction recapTopic(scope: string, module?: string): string {\n return module ? `session-recap-${scope}-${module}` : `session-recap-${scope}`;\n}\n\nfunction buildBody(input: MemSessionEndInput): string {\n const lines: string[] = [];\n\n lines.push(`## Goal\\n${input.goal}`);\n lines.push(`\\n## Accomplished\\n${input.accomplished}`);\n\n if (input.discoveries.trim()) {\n lines.push(`\\n## Discoveries & surprises\\n${input.discoveries}`);\n }\n\n if (input.files_touched.length > 0) {\n lines.push(`\\n## Files touched\\n${input.files_touched.map((f) => `- \\`${f}\\``).join(\"\\n\")}`);\n }\n\n if (input.next_steps.trim()) {\n lines.push(`\\n## Next steps\\n${input.next_steps}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function memSessionEnd(\n input: MemSessionEndInput,\n ctx: HaiveContext,\n): Promise<MemSessionEndOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n const body = buildBody(input);\n const topic = recapTopic(input.scope, input.module);\n\n // Validate anchor paths exist before saving\n const invalidPaths = input.files_touched.filter(\n (p) => !existsSync(path.resolve(ctx.paths.root, p)),\n );\n if (invalidPaths.length > 0) {\n // Non-blocking for session end — just log in the output\n console.warn(`[haive] session end: anchor path(s) not found: ${invalidPaths.join(\", \")}`);\n }\n\n const existing = existsSync(ctx.paths.memoriesDir)\n ? await loadMemoriesFromDir(ctx.paths.memoriesDir)\n : [];\n\n // ── Topic upsert: update existing recap in-place ───────────────────────\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === topic &&\n memory.frontmatter.scope === input.scope &&\n (!input.module || memory.frontmatter.module === input.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const revisionCount = (fm.revision_count ?? 0) + 1;\n const newFrontmatter = {\n ...fm,\n verified_at: new Date().toISOString(),\n revision_count: revisionCount,\n anchor: {\n ...fm.anchor,\n paths: input.files_touched.length ? input.files_touched : fm.anchor.paths,\n },\n };\n await writeFile(\n topicMatch.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body }),\n \"utf8\",\n );\n // Clear pending distill — a manual post_task flow completed successfully.\n await clearPendingDistill(ctx);\n return {\n id: fm.id,\n scope: fm.scope,\n file_path: topicMatch.filePath,\n action: \"updated\",\n revision_count: revisionCount,\n };\n }\n\n // ── Create new recap (first session) ──────────────────────────────────\n const frontmatter = buildFrontmatter({\n type: \"session_recap\",\n slug: \"recap\",\n scope: input.scope,\n module: input.module,\n tags: [\"session\", \"recap\"],\n paths: input.files_touched,\n topic,\n status: \"validated\",\n });\n\n const file = memoryFilePath(\n ctx.paths,\n frontmatter.scope,\n frontmatter.id,\n frontmatter.module,\n );\n await mkdir(path.dirname(file), { recursive: true });\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n // A successful manual mem_session_end (post_task flow) means the distillation\n // has been done properly — clear the shallow auto-recap marker so the next\n // get_briefing doesn't ask again.\n await clearPendingDistill(ctx);\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n action: \"created\",\n revision_count: 0,\n };\n}\n","/**\n * Auto-session tracker for autopilot mode.\n *\n * Tracks which MCP tools were called during a server session.\n * On SIGTERM/SIGINT (i.e. when the AI client closes), automatically:\n * 1. Saves a session recap via mem_session_end (always)\n * 2. Writes .ai/.cache/pending-distill.json so the next get_briefing\n * surfaces an action_required item prompting the agent to invoke\n * post_task for a richer LLM-driven distillation.\n */\nimport {\n appendUsageEvent,\n appendRuntimeJournalEntry,\n loadConfig,\n type HaiveConfig,\n} from \"@hiveai/core\";\nimport { mkdir, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport type { HaiveContext } from \"./context.js\";\nimport { memSessionEnd } from \"./tools/mem-session-end.js\";\n\nexport interface SessionEvent {\n tool: string;\n at: string; // ISO timestamp\n /** Partial input snapshot (non-sensitive fields only) */\n summary?: string;\n}\n\n/** Written to .ai/.cache/pending-distill.json at session end. */\nexport interface PendingDistill {\n session_start: string;\n session_end: string;\n total_tool_calls: number;\n /** Human-readable summary of which tools were called (\"get_briefing ×3, mem_save ×2\") */\n tool_summary: string;\n /** IDs of memories saved during this session */\n memories_saved: string[];\n /** True when git diff was captured and stored in git_diff field */\n git_diff_available: boolean;\n /** Snapshot of `git diff HEAD` at session close (truncated to 8 KB) */\n git_diff?: string;\n /** ID of the auto-generated session recap memory */\n recap_id?: string;\n}\n\n/** Path to the pending distill marker file. */\nexport function pendingDistillPath(ctx: HaiveContext): string {\n return path.join(ctx.paths.haiveDir, \".cache\", \"pending-distill.json\");\n}\n\nexport class SessionTracker {\n private events: SessionEvent[] = [];\n private startedAt: string = new Date().toISOString();\n private config: HaiveConfig | null = null;\n private ctx: HaiveContext;\n private shutdownRegistered = false;\n\n constructor(ctx: HaiveContext) {\n this.ctx = ctx;\n }\n\n async init(): Promise<void> {\n this.config = await loadConfig(this.ctx.paths);\n if (this.config.autoSessionEnd) {\n this.registerShutdownHandler();\n }\n }\n\n record(tool: string, summary?: string): void {\n const event: SessionEvent = { tool, at: new Date().toISOString(), summary };\n this.events.push(event);\n // Persist to .ai/.usage/tool-usage.jsonl for cross-session stats (haive stats).\n // Best-effort: never blocks the tool execution, never throws.\n void appendUsageEvent(this.ctx.paths, event);\n }\n\n private registerShutdownHandler(): void {\n if (this.shutdownRegistered) return;\n this.shutdownRegistered = true;\n\n const save = async (): Promise<void> => {\n const writingTools = this.events.filter((e) =>\n [\"mem_save\", \"mem_tried\", \"mem_observe\", \"mem_update\", \"bootstrap_project_save\"].includes(e.tool),\n );\n const totalCalls = this.events.length;\n\n if (totalCalls === 0) return;\n\n const toolSummary = summarizeTools(this.events);\n const filesSet = new Set<string>();\n for (const e of this.events) {\n if (e.summary) {\n const matches = e.summary.match(/[^\\s\"',]+\\.[a-zA-Z]{1,6}/g) ?? [];\n for (const m of matches) filesSet.add(m);\n }\n }\n\n // ── 1. Capture git diff (best-effort, 8 KB cap) ──────────────────────\n let gitDiff: string | undefined;\n try {\n const raw = execSync(\"git diff HEAD\", {\n cwd: this.ctx.paths.root,\n timeout: 5000,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n gitDiff = raw.slice(0, 8192) || undefined;\n } catch { /* not a git repo or no diff — ok */ }\n\n // ── 2. Save minimal session recap ────────────────────────────────────\n let recapId: string | undefined;\n try {\n const result = await memSessionEnd(\n {\n goal: `Auto-captured session (${totalCalls} tool call${totalCalls === 1 ? \"\" : \"s\"})`,\n accomplished: toolSummary,\n discoveries: writingTools.length > 0\n ? `${writingTools.length} memor${writingTools.length === 1 ? \"y\" : \"ies\"} saved during this session.`\n : \"No new memories saved this session.\",\n files_touched: [...filesSet].slice(0, 10),\n next_steps: \"\",\n scope: (this.config?.defaultScope as \"personal\" | \"team\") ?? \"personal\",\n module: undefined,\n },\n this.ctx,\n );\n recapId = result.id;\n } catch {\n // Non-fatal — never block process exit\n }\n\n void appendRuntimeJournalEntry(this.ctx.paths, {\n kind: \"session_end\",\n message: recapId\n ? `auto session close | ${toolSummary} | recap:${recapId}`\n : `auto session close | ${toolSummary}`,\n meta: {\n recap_id: recapId ?? null,\n total_tool_calls: totalCalls,\n },\n });\n\n // ── 3. Write pending-distill.json so next get_briefing can prompt ─────\n // Skip if the agent already ran post_task this session (no shallow recap).\n const ranPostTask = this.events.some((e) =>\n e.tool === \"mem_session_end\" && !e.summary?.startsWith(\"Auto-captured\"),\n );\n if (!ranPostTask && existsSync(this.ctx.paths.haiveDir)) {\n try {\n const memoriesSaved = writingTools\n .map((e) => e.summary ?? \"\")\n .filter(Boolean)\n .slice(0, 20);\n\n const payload: PendingDistill = {\n session_start: this.startedAt,\n session_end: new Date().toISOString(),\n total_tool_calls: totalCalls,\n tool_summary: toolSummary,\n memories_saved: memoriesSaved,\n git_diff_available: !!gitDiff,\n ...(gitDiff ? { git_diff: gitDiff } : {}),\n ...(recapId ? { recap_id: recapId } : {}),\n };\n\n const cacheDir = path.join(this.ctx.paths.haiveDir, \".cache\");\n await mkdir(cacheDir, { recursive: true });\n await writeFile(\n pendingDistillPath(this.ctx),\n JSON.stringify(payload, null, 2) + \"\\n\",\n \"utf8\",\n );\n } catch { /* Non-fatal */ }\n }\n };\n\n process.once(\"SIGTERM\", () => { void save().finally(() => process.exit(0)); });\n process.once(\"SIGINT\", () => { void save().finally(() => process.exit(0)); });\n }\n}\n\n/** Delete the pending distill marker if it exists. Called by mem_session_end. */\nexport async function clearPendingDistill(ctx: HaiveContext): Promise<void> {\n const p = pendingDistillPath(ctx);\n if (existsSync(p)) {\n try { await rm(p); } catch { /* non-fatal */ }\n }\n}\n\nfunction summarizeTools(events: SessionEvent[]): string {\n const counts = new Map<string, number>();\n for (const e of events) {\n counts.set(e.tool, (counts.get(e.tool) ?? 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([t, n]) => `${t} ×${n}`)\n .join(\", \");\n}\n","import { readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n allocateBudget,\n DEFAULT_AUTO_PROMOTE_RULE,\n deriveConfidence,\n estimateTokens,\n extractActionsBriefBody,\n getUsage,\n inferModulesFromPaths,\n isAutoPromoteEligible,\n isDecaying,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadCodeMap,\n loadConfig,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n queryCodeMap,\n resolveBriefingBudget,\n serializeMemory,\n tokenizeQuery,\n trackReads,\n truncateToTokens,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { pendingDistillPath, type PendingDistill } from \"../session-tracker.js\";\n\nexport const GetBriefingInputSchema = {\n task: z\n .string()\n .optional()\n .describe(\n \"What you are about to do, in 1–2 sentences. Used to rank relevant memories semantically.\",\n ),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Project-relative file paths the agent is currently looking at or about to edit\"),\n max_tokens: z\n .number()\n .int()\n .positive()\n .default(8000)\n .describe(\n \"Approximate token budget for the entire briefing. Each section is allocated a share and truncated to fit.\",\n ),\n max_memories: z\n .number()\n .int()\n .positive()\n .default(8)\n .describe(\"Cap on memories surfaced regardless of token budget\"),\n include_project_context: z.boolean().default(true),\n include_module_contexts: z.boolean().default(true),\n semantic: z\n .boolean()\n .default(true)\n .describe(\n \"Use semantic ranking when a task is provided (requires `haive embeddings index`).\",\n ),\n include_stale: z\n .boolean()\n .default(false)\n .describe(\"Include stale memories (excluded by default — they may be outdated)\"),\n track: z.boolean().default(true).describe(\"Increment read_count on returned memories\"),\n format: z\n .enum([\"full\", \"compact\", \"actions\"])\n .default(\"full\")\n .describe(\n \"Output format: 'full' returns memory bodies (honors token budget via truncation); \" +\n \"'compact' returns a 1-line summary per memory (call mem_get for detail); \" +\n \"'actions' squeezes bodies to actionable bullet lines — fewer tokens vs full.\",\n ),\n symbols: z\n .array(z.string())\n .default([])\n .describe(\n \"Symbol names to look up in the code-map (e.g. ['PaymentService', 'TenantFilter']). \" +\n \"Returns the file(s) exporting each symbol so agents don't need to grep. \" +\n \"Requires `haive index code` to have been run.\",\n ),\n min_semantic_score: z\n .number()\n .min(0)\n .max(1)\n .default(0)\n .describe(\n \"Drop semantic-only memory hits whose cosine score is below this threshold. \" +\n \"Useful to avoid weakly-related noise when the task is short or the corpus is broad. \" +\n \"Has no effect on memories matched via anchor/module/literal — those are always kept. \" +\n \"Try 0.25–0.4 for stricter matching.\",\n ),\n budget_preset: z\n .enum([\"quick\", \"balanced\", \"deep\"])\n .optional()\n .describe(\n \"Shortcut token budget: 'quick' minimizes tokens/skip module CONTEXT slices; 'balanced' mirrors historical defaults; \" +\n \"'deep' uses a larger briefing. When set, overrides max_tokens, max_memories, and include_module_contexts.\",\n ),\n};\n\n/** Single inferred type — optional keys are optional (not `| undefined` required everywhere). */\nexport const GetBriefingZod = z.object(GetBriefingInputSchema);\n\nexport type GetBriefingInput = z.infer<typeof GetBriefingZod>;\n\nexport interface BriefingMemory {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n /** Present when confidence is 'low' or 'unverified' — AI should weight this memory cautiously. */\n unverified?: true;\n read_count: number;\n reasons: Array<\"anchor\" | \"module\" | \"domain\" | \"semantic\">;\n match_quality: \"exact\" | \"partial\" | \"semantic\";\n semantic_score?: number;\n body: string;\n file_path: string;\n}\n\nexport interface CodeMapSymbolHit {\n symbol: string;\n /** files that export this symbol */\n locations: Array<{\n file: string;\n kind: string;\n line: number;\n description?: string;\n }>;\n}\n\nexport interface ActionRequiredItem {\n /** Memory id containing the alert */\n id: string;\n /** Short human-readable summary of the issue */\n summary: string;\n /**\n * The exact message to show the developer before doing anything.\n * Copy-paste this verbatim — do NOT paraphrase or act before confirmation.\n */\n developer_message: string;\n}\n\nexport interface BriefingOutput {\n task?: string;\n search_mode: \"semantic\" | \"literal_fallback\" | \"literal\";\n match_quality_note?: string;\n inferred_modules: string[];\n last_session?: { id: string; scope: string; revision_count: number; body: string };\n project_context: { content: string; truncated: boolean; is_template?: boolean; auto_generated?: boolean } | null;\n module_contexts: Array<{ name: string; content: string; truncated: boolean }>;\n memories: BriefingMemory[];\n symbol_locations?: CodeMapSymbolHit[];\n /**\n * Memories that require explicit human confirmation before any code action.\n * IMPORTANT: for each item, show developer_message to the developer and\n * wait for explicit approval before modifying any code.\n * These are surfaced separately from memories to make them impossible to miss.\n */\n action_required: ActionRequiredItem[];\n decay_warnings: string[];\n setup_warnings: string[];\n /**\n * True when this briefing carries little actionable signal:\n * - project-context.md is still the default template\n * - no memories matched the task (or none exist at all)\n * - no previous session recap\n * Clients can use this flag to skip surfacing a near-empty briefing to the model.\n */\n low_value?: true;\n /**\n * Short, action-oriented hints surfaced to the agent based on the briefing payload.\n * Examples: \"haive is uninitialized — use Read/Grep directly\", \"gotcha memories present — read first\".\n * Always non-empty when low_value=true.\n */\n hints?: string[];\n estimated_tokens: number;\n budget: {\n max_tokens: number;\n spent: { project: number; modules: number; memories: number };\n preset_applied?: \"quick\" | \"balanced\" | \"deep\";\n };\n}\n\nexport async function getBriefing(\n input: GetBriefingInput,\n ctx: HaiveContext,\n): Promise<BriefingOutput> {\n const resolvedBudget = resolveBriefingBudget(input.budget_preset, {\n max_tokens: input.max_tokens,\n max_memories: input.max_memories,\n include_module_contexts: input.include_module_contexts,\n });\n const briefingMaxTokens = resolvedBudget.max_tokens;\n const briefingMaxMemories = resolvedBudget.max_memories;\n const briefingIncludeModules = resolvedBudget.include_module_contexts;\n\n const inferred = inferModulesFromPaths(input.files);\n const memories: BriefingMemory[] = [];\n let searchMode: BriefingOutput[\"search_mode\"] = \"literal\";\n let usage: UsageIndex = { version: 1, updated_at: \"\", by_id: {} };\n let byId = new Map<string, LoadedMemory>();\n\n // ── Session recap ──────────────────────────────────────────────────────\n let lastSession: BriefingOutput[\"last_session\"] | undefined;\n\n if (existsSync(ctx.paths.memoriesDir)) {\n const allLoaded = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n\n // Find the most recent session_recap (by created_at) — exclude from main ranking\n const recaps = allLoaded\n .filter(({ memory }) => memory.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 r = recaps[0]!;\n const fm = r.memory.frontmatter;\n lastSession = {\n id: fm.id,\n scope: fm.scope,\n revision_count: fm.revision_count ?? 0,\n body: r.memory.body,\n };\n }\n\n const allMemories = allLoaded.filter(({ memory }) => {\n const s = memory.frontmatter.status;\n if (s === \"rejected\" || s === \"deprecated\") return false;\n if (!input.include_stale && s === \"stale\") return false;\n // session_recap surfaces separately in last_session, not in the ranked memories list\n if (memory.frontmatter.type === \"session_recap\") return false;\n return true;\n });\n usage = await loadUsageIndex(ctx.paths);\n // Build the id→loaded map up-front so the semantic-hits loop below\n // (and the related-id expansion later) can resolve hits to LoadedMemory.\n // Pre-fix: byId was assigned only after the semantic loop, so semantic hits\n // were silently dropped — search_mode said \"semantic\" but no memory ever\n // received a semantic_score. Fixed in v0.5.0.\n byId = new Map(allMemories.map((m) => [m.memory.frontmatter.id, m]));\n const semanticHits = input.task && input.semantic\n ? await trySemanticHits(ctx, input.task, allMemories.length * 2)\n : null;\n\n if (input.task && input.semantic) {\n searchMode = semanticHits ? \"semantic\" : \"literal_fallback\";\n }\n\n const seen = new Map<string, BriefingMemory>();\n\n const addOrUpdate = (\n loaded: LoadedMemory,\n reason: BriefingMemory[\"reasons\"][number],\n score?: number,\n matchQuality?: BriefingMemory[\"match_quality\"],\n ): void => {\n const fm = loaded.memory.frontmatter;\n const existing = seen.get(fm.id);\n if (existing) {\n if (!existing.reasons.includes(reason)) existing.reasons.push(reason);\n if (score !== undefined && (existing.semantic_score ?? 0) < score) {\n existing.semantic_score = score;\n }\n // upgrade match_quality if better evidence found\n if (matchQuality === \"exact\" && existing.match_quality !== \"exact\") {\n existing.match_quality = \"exact\";\n } else if (matchQuality === \"semantic\" && existing.match_quality === \"partial\") {\n existing.match_quality = \"semantic\";\n }\n return;\n }\n const u = getUsage(usage, fm.id);\n seen.set(fm.id, {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n ...(fm.status === \"draft\" || fm.status === \"proposed\" ? { unverified: true as const } : {}),\n read_count: u.read_count,\n reasons: [reason],\n match_quality: matchQuality ?? \"partial\",\n ...(score !== undefined ? { semantic_score: score } : {}),\n body: loaded.memory.body,\n file_path: loaded.filePath,\n });\n };\n\n if (input.files.length > 0) {\n for (const loaded of allMemories) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) addOrUpdate(loaded, \"anchor\", undefined, \"exact\");\n }\n for (const loaded of allMemories) {\n const fm = loaded.memory.frontmatter;\n if (fm.module && inferred.includes(fm.module)) addOrUpdate(loaded, \"module\", undefined, \"partial\");\n if (fm.domain && inferred.includes(fm.domain)) addOrUpdate(loaded, \"domain\", undefined, \"partial\");\n if (fm.tags.some((t) => inferred.includes(t))) addOrUpdate(loaded, \"module\", undefined, \"partial\");\n }\n }\n\n if (input.task) {\n const tokens = tokenizeQuery(input.task);\n // AND first — exact match\n const andHits = allMemories.filter((m) => literalMatchesAllTokens(m.memory, tokens));\n for (const loaded of andHits) {\n addOrUpdate(loaded, \"semantic\", undefined, \"exact\");\n }\n // OR fallback — if AND produced nothing, partial match is better than nothing\n if (andHits.length === 0 && tokens.length > 1) {\n for (const loaded of allMemories) {\n if (literalMatchesAnyToken(loaded.memory, tokens)) {\n addOrUpdate(loaded, \"semantic\", undefined, \"partial\");\n }\n }\n }\n if (semanticHits) {\n for (const hit of semanticHits) {\n // Filter out weakly-related semantic hits when caller asked for a stricter threshold.\n // Memories already attached via anchor/module/literal stay (addOrUpdate just upgrades them).\n if (hit.score < input.min_semantic_score) {\n const existing = seen.get(hit.id);\n if (!existing) continue;\n }\n const loaded = byId.get(hit.id);\n if (loaded) addOrUpdate(loaded, \"semantic\", hit.score, \"semantic\");\n }\n }\n }\n\n const ranked = [...seen.values()].sort((a, b) => {\n const reasonScore = (m: BriefingMemory): number =>\n (m.type === \"attempt\" ? 3 : 0) + // attempt = negative knowledge, surface first to prevent repeating mistakes\n (m.reasons.includes(\"anchor\") ? 4 : 0) +\n (m.reasons.includes(\"module\") ? 2 : 0) +\n (m.reasons.includes(\"semantic\") ? 2 : 0) +\n (m.reasons.includes(\"domain\") ? 1 : 0);\n const confidenceScore = (m: BriefingMemory): number =>\n m.confidence === \"authoritative\" ? 4 :\n m.confidence === \"trusted\" ? 3 :\n m.confidence === \"low\" ? 1 :\n m.confidence === \"stale\" ? -2 : 0;\n const sa = reasonScore(a) + confidenceScore(a) + (a.semantic_score ?? 0);\n const sb = reasonScore(b) + confidenceScore(b) + (b.semantic_score ?? 0);\n return sb - sa;\n });\n\n // Expand related_ids: pull in memories linked from the top results\n // (byId was already populated above, before the semantic-hits loop)\n for (const mem of ranked.slice(0, briefingMaxMemories)) {\n if (seen.size >= briefingMaxMemories * 2) break;\n const loaded = byId.get(mem.id);\n if (!loaded) continue;\n for (const relId of loaded.memory.frontmatter.related_ids ?? []) {\n if (seen.has(relId)) continue;\n const related = byId.get(relId);\n if (related) addOrUpdate(related, \"anchor\", undefined, \"partial\");\n }\n }\n\n memories.push(...ranked.slice(0, briefingMaxMemories));\n\n if (input.track && memories.length > 0) {\n await trackReads(ctx.paths, memories.map((m) => m.id));\n\n // ── Inline auto-promote: promote proposed memories that just crossed minReads\n // Load fresh usage after trackReads incremented the counters.\n const freshUsage = await loadUsageIndex(ctx.paths);\n const cfg = await loadConfig(ctx.paths);\n const rule = {\n minReads: cfg.autoPromoteMinReads ?? DEFAULT_AUTO_PROMOTE_RULE.minReads,\n maxRejections: DEFAULT_AUTO_PROMOTE_RULE.maxRejections,\n };\n for (const m of memories) {\n const loaded = byId.get(m.id);\n if (!loaded) continue;\n const u = getUsage(freshUsage, m.id);\n if (!isAutoPromoteEligible(loaded.memory.frontmatter, u, rule)) continue;\n // Promote in-place\n const newFm = { ...loaded.memory.frontmatter, status: \"validated\" as const };\n try {\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFm, body: loaded.memory.body }),\n \"utf8\",\n );\n // Update the in-memory object so the briefing output reflects validated status\n m.status = \"validated\";\n m.confidence = \"trusted\";\n } catch { /* non-fatal — auto-promote is best-effort */ }\n }\n }\n }\n\n // Build raw section payloads\n const projectContextRaw =\n input.include_project_context && existsSync(ctx.paths.projectContext)\n ? await readFile(ctx.paths.projectContext, \"utf8\")\n : \"\";\n const isTemplateContext =\n projectContextRaw.includes(\"TODO — high-level overview\") ||\n projectContextRaw.includes(\"Generated by `haive init`\");\n\n const setupWarnings: string[] = [];\n let autoContextGenerated = false;\n\n // In autopilot mode: if project-context.md is still the template, auto-generate\n // a minimal context from the code-map so get_briefing is useful immediately.\n let projectContext = isTemplateContext ? \"\" : projectContextRaw;\n if ((isTemplateContext || !existsSync(ctx.paths.projectContext)) && input.include_project_context) {\n const haiveConfig = await loadConfig(ctx.paths);\n if (haiveConfig.autoContext) {\n const codeMap = await loadCodeMap(ctx.paths);\n if (codeMap) {\n const totalFiles = Object.keys(codeMap.files).length;\n const extensions = new Map<string, number>();\n for (const filePath of Object.keys(codeMap.files)) {\n const ext = filePath.slice(filePath.lastIndexOf(\".\") + 1).toLowerCase();\n extensions.set(ext, (extensions.get(ext) ?? 0) + 1);\n }\n const topExts = [...extensions.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([e, n]) => `${e} (${n})`)\n .join(\", \");\n\n // Pick top exported symbols as a starting overview\n const topSymbols = Object.entries(codeMap.files)\n .flatMap(([fp, entry]) =>\n entry.exports.slice(0, 3).map((e) => `${e.name} (${fp.split(\"/\").slice(-2).join(\"/\")})`),\n )\n .slice(0, 15)\n .join(\", \");\n\n projectContext =\n `# Project context (auto-generated by hAIve)\\n\\n` +\n `> ⚠ This is a minimal auto-generated context based on the code-map. ` +\n `Invoke the \\`bootstrap_project\\` MCP prompt to replace it with a full analysis.\\n\\n` +\n `## Codebase overview\\n` +\n `- **${totalFiles} files** indexed in code-map\\n` +\n `- **Main file types:** ${topExts}\\n` +\n `- **Generated at:** ${codeMap.generated_at}\\n\\n` +\n `## Key exports (sample)\\n` +\n topSymbols + \"\\n\";\n\n autoContextGenerated = true;\n setupWarnings.push(\n \"project-context.md is still the default template. \" +\n \"A minimal auto-generated context has been injected from the code-map. \" +\n \"Invoke bootstrap_project to replace it with a full AI-analyzed context.\",\n );\n } else {\n setupWarnings.push(\n \"project-context.md is still the default template and no code-map found. \" +\n \"Run `haive index code` then invoke bootstrap_project for a full context.\",\n );\n }\n } else {\n if (isTemplateContext) {\n setupWarnings.push(\n \"project-context.md still contains the default template. \" +\n \"Invoke the bootstrap_project MCP prompt to auto-fill it from your codebase. \" +\n \"Until then, get_briefing returns no project context.\",\n );\n } else {\n setupWarnings.push(\n \"No project-context.md found. Run `haive init` then invoke the bootstrap_project MCP prompt.\",\n );\n }\n }\n }\n\n const moduleContents = briefingIncludeModules\n ? await loadModuleContexts(ctx, inferred)\n : [];\n\n const memoriesText = memories\n .map((m) => {\n const unverified = m.status === \"proposed\" ? \" [UNVERIFIED — not yet validated]\" : \"\";\n return `### ${m.id} (${m.scope}/${m.type}, ${m.confidence})${unverified}\\n${m.body.trim()}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n // Allocate budget across the three large pieces\n const slices = allocateBudget(\n [\n { key: \"project\", text: projectContext, weight: 3, mode: \"head\" },\n {\n key: \"modules\",\n text: moduleContents.map((m) => `## ${m.name}\\n${m.content}`).join(\"\\n\\n---\\n\\n\"),\n weight: 3,\n mode: \"head\",\n },\n { key: \"memories\", text: memoriesText, weight: 4, mode: \"head\" },\n ],\n briefingMaxTokens,\n );\n\n const projectSlice = slices.find((s) => s.key === \"project\")!;\n const modulesSlice = slices.find((s) => s.key === \"modules\")!;\n const memoriesSlice = slices.find((s) => s.key === \"memories\")!;\n\n const trimmedModules: BriefingOutput[\"module_contexts\"] = [];\n if (modulesSlice.text.length > 0 && moduleContents.length > 0) {\n // Distribute the modules slice across module entries proportionally\n const subSlices = allocateBudget(\n moduleContents.map((m) => ({ key: m.name, text: m.content, weight: 1, mode: \"head\" as const })),\n modulesSlice.allocatedTokens,\n );\n for (const m of moduleContents) {\n const sub = subSlices.find((s) => s.key === m.name)!;\n trimmedModules.push({ name: m.name, content: sub.text, truncated: sub.truncated });\n }\n }\n\n // Recompute memory bodies to fit using a cascade approach:\n // top-ranked memories get full budget first; lower-ranked ones are dropped if budget runs out.\n // This is better than uniform truncation which gives all memories a 37%-fragment.\n const trimmedMemories: BriefingMemory[] = [];\n if (!memoriesSlice.truncated) {\n trimmedMemories.push(...memories);\n } else {\n let remaining = memoriesSlice.allocatedTokens;\n for (const m of memories) {\n const bodyTokens = estimateTokens(m.body);\n if (remaining <= 0) break;\n if (bodyTokens <= remaining) {\n trimmedMemories.push(m);\n remaining -= bodyTokens;\n } else if (remaining > 80) {\n // Enough budget for a meaningful fragment — truncate and include\n const t = truncateToTokens(m.body, { maxTokens: remaining, mode: \"head\" });\n trimmedMemories.push({ ...m, body: t.text });\n remaining = 0;\n }\n // Otherwise skip — too small a fragment to be useful\n }\n }\n\n const totalTokens =\n projectSlice.estimatedTokens + modulesSlice.estimatedTokens + memoriesSlice.estimatedTokens;\n\n // Decay warnings: memories not read in >90 days\n const decayWarnings: string[] = [];\n for (const m of trimmedMemories) {\n const u = getUsage(usage, m.id);\n const loaded = byId.get(m.id);\n const createdAt = loaded?.memory.frontmatter.created_at ?? new Date().toISOString();\n if (isDecaying(u, createdAt)) decayWarnings.push(m.id);\n }\n\n // Compact / actions: squeeze bodies for fewer downstream tokens\n const outputMemories =\n input.format === \"compact\"\n ? trimmedMemories.map((m) => ({ ...m, body: compactSummary(m.body) }))\n : input.format === \"actions\"\n ? trimmedMemories.map((m) => ({\n ...m,\n body: extractActionsBriefBody(m.body),\n }))\n : trimmedMemories;\n\n // ── Code-map symbol lookup ──────────────────────────────────────────────\n // Also auto-look up symbols found in anchor paths of returned memories +\n // any explicit symbols[] the caller requested.\n let symbolLocations: CodeMapSymbolHit[] | undefined;\n const symbolsToLookup = new Set<string>(input.symbols);\n // Auto-collect symbols from memory anchors so agents get locations for free\n for (const m of outputMemories) {\n const loaded = byId.get(m.id);\n for (const sym of loaded?.memory.frontmatter.anchor.symbols ?? []) {\n symbolsToLookup.add(sym);\n }\n }\n if (symbolsToLookup.size > 0) {\n const codeMap = await loadCodeMap(ctx.paths);\n if (codeMap) {\n symbolLocations = [];\n for (const sym of symbolsToLookup) {\n const { files } = queryCodeMap(codeMap, { symbol: sym });\n if (files.length > 0) {\n symbolLocations.push({\n symbol: sym,\n locations: files.flatMap((f) =>\n f.entry.exports\n .filter((e) => e.name.toLowerCase().includes(sym.toLowerCase()))\n .map((e) => ({\n file: f.path,\n kind: e.kind,\n line: e.line,\n ...(e.description ? { description: e.description } : {}),\n })),\n ),\n });\n }\n }\n if (symbolLocations.length === 0) symbolLocations = undefined;\n }\n }\n\n // ── action_required: memories that need explicit human confirmation ──────\n const actionRequired: ActionRequiredItem[] = [];\n for (const m of outputMemories) {\n const loaded = byId.get(m.id);\n if (!loaded?.memory.frontmatter.requires_human_approval) continue;\n\n // Extract the developer message from the memory body (between the > quote block)\n const bodyLines = loaded.memory.body.split(\"\\n\");\n const quoteBlock = bodyLines\n .filter((l) => l.startsWith(\"> \"))\n .map((l) => l.slice(2))\n .join(\" \")\n .replace(/^\\*«\\s*/, \"\")\n .replace(/\\s*»\\*$/, \"\")\n .trim();\n\n // Build a short summary from the first heading\n const headingLine = bodyLines.find((l) => l.startsWith(\"## \"));\n const summary = headingLine?.replace(/^##\\s*/, \"\").trim() ?? m.id;\n\n actionRequired.push({\n id: m.id,\n summary,\n developer_message: quoteBlock ||\n `Une modification externe potentiellement incompatible a été détectée (${m.id}). ` +\n `Veux-tu que j'analyse l'impact et que je propose des mises à jour ?`,\n });\n }\n // Also load action_required memories that weren't in the ranked set\n // (they may not be relevant to the task but are still urgent)\n if (existsSync(ctx.paths.memoriesDir)) {\n const allMems = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n for (const { memory } of allMems) {\n const fm = memory.frontmatter;\n if (!fm.requires_human_approval) continue;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n if (actionRequired.some((a) => a.id === fm.id)) continue; // already included\n\n const bodyLines = memory.body.split(\"\\n\");\n const quoteBlock = bodyLines\n .filter((l) => l.startsWith(\"> \"))\n .map((l) => l.slice(2))\n .join(\" \")\n .replace(/^\\*«\\s*/, \"\")\n .replace(/\\s*»\\*$/, \"\")\n .trim();\n const headingLine = bodyLines.find((l) => l.startsWith(\"## \"));\n const summary = headingLine?.replace(/^##\\s*/, \"\").trim() ?? fm.id;\n\n actionRequired.push({\n id: fm.id,\n summary,\n developer_message: quoteBlock ||\n `Une modification externe potentiellement incompatible a été détectée (${fm.id}). ` +\n `Veux-tu que j'analyse l'impact et que je propose des mises à jour ?`,\n });\n }\n }\n\n // ── pending-distill: prompt agent to run post_task if shallow auto-recap ──\n // If the previous session was closed by autopilot (no manual post_task),\n // surface an action_required item so the LLM host distills learnings via\n // the post_task prompt. Auto-expires after 7 days (stale diff = useless).\n const pendingDistillFile = pendingDistillPath(ctx);\n if (existsSync(pendingDistillFile)) {\n try {\n const raw = await readFile(pendingDistillFile, \"utf8\");\n const pd = JSON.parse(raw) as PendingDistill;\n const ageMs = Date.now() - new Date(pd.session_end).getTime();\n const SEVEN_DAYS = 7 * 24 * 60 * 60 * 1000;\n if (ageMs < SEVEN_DAYS) {\n const savedNote = pd.memories_saved.length > 0\n ? ` ${pd.memories_saved.length} memor${pd.memories_saved.length === 1 ? \"y was\" : \"ies were\"} saved.`\n : \" No memories were saved.\";\n const diffNote = pd.git_diff_available\n ? \" A git diff snapshot is available in the pending-distill file for context.\"\n : \"\";\n actionRequired.push({\n id: \"__pending_distill__\",\n summary: \"Previous session has undistilled learnings — invoke post_task to capture them\",\n developer_message:\n `The previous session (${pd.total_tool_calls} tool calls, ${pd.tool_summary}) ` +\n `was closed by autopilot without a full post_task distillation.${savedNote}${diffNote}\\n\\n` +\n `**Before starting your task:** invoke the MCP prompt \\`post_task\\` to capture any ` +\n `decisions, gotchas, or conventions from that session. This takes ~30 seconds and ` +\n `prevents institutional knowledge from being lost.\\n\\n` +\n `When done, call \\`mem_session_end\\` to acknowledge — this clears the pending distill marker.`,\n });\n } else {\n // Auto-expire stale pending distill (> 7 days old)\n try {\n const { rm } = await import(\"node:fs/promises\");\n await rm(pendingDistillFile);\n } catch { /* non-fatal */ }\n }\n } catch { /* malformed or deleted between check and read — skip */ }\n }\n\n // ── low_value detection + hints ────────────────────────────────────────\n // A briefing is \"low value\" when the project has not been initialized yet\n // (template context + zero memories + no past session). Clients can short-circuit\n // and tell the model to use plain Read/Grep instead of paying for a near-empty briefing.\n const memoriesEmpty = outputMemories.length === 0;\n const hasMemoriesDir = existsSync(ctx.paths.memoriesDir);\n const isColdStart =\n isTemplateContext &&\n memoriesEmpty &&\n !lastSession &&\n !autoContextGenerated;\n\n const hints: string[] = [];\n if (isColdStart) {\n hints.push(\n \"haive is uninitialized for this project (project-context.md is template, \" +\n \"0 memories, no past session). Skip future get_briefing calls until memories exist — \" +\n \"use Read/Grep directly. Run `haive init` and the bootstrap_project prompt to fix.\",\n );\n } else {\n if (outputMemories.some((m) => m.type === \"attempt\")) {\n hints.push(\n \"⚠️ One or more 'attempt' memories matched — these document failed approaches. \" +\n \"Read them BEFORE writing code to avoid repeating the mistake.\",\n );\n }\n if (outputMemories.some((m) => m.type === \"gotcha\")) {\n hints.push(\n \"Gotcha memories matched — non-obvious traps. Verify the 'how to apply' line still holds \" +\n \"before assuming behavior.\",\n );\n }\n if (memoriesEmpty && hasMemoriesDir && input.task) {\n hints.push(\n \"No memories matched this task. Try mem_search with broader/different terms, \" +\n \"or call mem_for_files with the files you intend to edit.\",\n );\n }\n if (input.task && outputMemories.length > 0 && actionRequired.length === 0) {\n // Encourage capturing new knowledge proactively.\n hints.push(\n \"After completing the task: capture new gotchas with mem_observe, \" +\n \"failed approaches with mem_tried, validated patterns with mem_save.\",\n );\n }\n if (\n outputMemories.length > 2 &&\n !input.budget_preset &&\n input.task &&\n !hints.some((h) => h.includes(\"budget_preset\"))\n ) {\n hints.push(\n \"For tighter token budgets on small tasks pass budget_preset:'quick'; \" +\n \"for refactor-sized work use budget_preset:'deep'.\",\n );\n }\n }\n\n return {\n ...(input.task ? { task: input.task } : {}),\n search_mode: searchMode,\n inferred_modules: inferred,\n ...(lastSession ? { last_session: lastSession } : {}),\n project_context: (projectContextRaw || autoContextGenerated)\n ? {\n content: projectSlice.text,\n truncated: projectSlice.truncated,\n ...(isTemplateContext && !autoContextGenerated ? { is_template: true } : {}),\n ...(autoContextGenerated ? { auto_generated: true } : {}),\n }\n : null,\n module_contexts: trimmedModules,\n memories: outputMemories,\n ...(symbolLocations ? { symbol_locations: symbolLocations } : {}),\n action_required: actionRequired,\n decay_warnings: decayWarnings,\n setup_warnings: setupWarnings,\n ...(isColdStart ? { low_value: true as const } : {}),\n ...(hints.length > 0 ? { hints } : {}),\n estimated_tokens: totalTokens,\n budget: {\n max_tokens: briefingMaxTokens,\n ...(input.budget_preset ? { preset_applied: input.budget_preset } : {}),\n spent: {\n project: projectSlice.estimatedTokens,\n modules: modulesSlice.estimatedTokens,\n memories: memoriesSlice.estimatedTokens,\n },\n },\n };\n}\n\nfunction compactSummary(body: string): string {\n for (const line of body.split(\"\\n\")) {\n const trimmed = line.replace(/^#+\\s*/, \"\").trim();\n if (trimmed.length > 0) return trimmed.slice(0, 120);\n }\n return body.slice(0, 120);\n}\n\nasync function trySemanticHits(\n ctx: HaiveContext,\n task: string,\n limit: number,\n): Promise<Array<{ id: string; score: number }> | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, task, { limit });\n if (!result) return null;\n return result.hits.map((h) => ({ id: h.id, score: h.score }));\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n): Promise<Array<{ name: string; content: string }>> {\n if (modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n\n// Re-export estimateTokens at the module level for tests.\nexport { estimateTokens };\n","import { estimateTokens, loadCodeMap, queryCodeMap } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const CodeMapInputSchema = {\n file: z\n .string()\n .optional()\n .describe(\"Filter to files whose path contains this substring\"),\n symbol: z\n .string()\n .optional()\n .describe(\"Filter to files exporting a symbol whose name contains this substring\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\n \"Filter to files under any of these path prefixes (e.g. ['packages/mcp/src/tools/', 'src/auth/']). \" +\n \"OR-joined with `file` substring; useful to get a focused view of one module.\",\n ),\n max_files: z\n .number()\n .int()\n .positive()\n .default(40)\n .describe(\"Cap on returned files (hard limit, applied after token budget)\"),\n max_tokens: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"Approximate token budget for the response. When the matching set exceeds it, \" +\n \"files are ranked by export density (exports per LOC) and the highest-signal ones are kept first. \" +\n \"Omit to disable budgeting (legacy behavior).\",\n ),\n};\n\nexport const CodeMapInputZod = z.object(CodeMapInputSchema);\nexport type CodeMapInput = z.infer<typeof CodeMapInputZod>;\n\nexport interface CodeMapToolOutput {\n available: boolean;\n generated_at?: string;\n total_files?: number;\n files: Array<{\n path: string;\n summary?: string;\n loc: number;\n exports: Array<{ name: string; kind: string; description?: string; line: number }>;\n }>;\n /** Number of matched files dropped due to max_files / max_tokens. */\n truncated?: number;\n /** True when at least one file was dropped to fit the token budget. */\n budget_clipped?: true;\n notice?: string;\n}\n\nexport async function codeMapTool(\n input: CodeMapInput,\n ctx: HaiveContext,\n): Promise<CodeMapToolOutput> {\n const map = await loadCodeMap(ctx.paths);\n if (!map) {\n return {\n available: false,\n files: [],\n notice: \"No code map found. Run `haive index code` to generate `.ai/code-map.json`.\",\n };\n }\n const { files: matched } = queryCodeMap(map, { file: input.file, symbol: input.symbol });\n\n // Apply `paths` prefix filter on top of the substring match (OR within paths, AND with file).\n const pathsFiltered = input.paths.length === 0\n ? matched\n : matched.filter((f) => input.paths.some((p) => f.path.startsWith(stripLeadingSlash(p))));\n\n // Default order: alphabetical by path (predictable for callers).\n const alphabetical = [...pathsFiltered].sort((a, b) => a.path.localeCompare(b.path));\n\n let kept = alphabetical;\n let budgetClipped = false;\n if (input.max_tokens !== undefined) {\n // Density-rank to PICK which files to KEEP under budget, then re-sort alphabetically for output.\n const byDensity = [...alphabetical].sort((a, b) => {\n const da = density(a.entry.exports.length, a.entry.loc);\n const db = density(b.entry.exports.length, b.entry.loc);\n if (da !== db) return db - da;\n return a.path.localeCompare(b.path);\n });\n const keepSet = new Set<string>();\n let spent = 0;\n for (const f of byDensity) {\n const cost = estimateFileEntryTokens(f);\n if (spent + cost > input.max_tokens && keepSet.size > 0) {\n budgetClipped = true;\n break;\n }\n keepSet.add(f.path);\n spent += cost;\n }\n if (budgetClipped) {\n kept = alphabetical.filter((f) => keepSet.has(f.path));\n }\n }\n\n const finalFiles = kept.slice(0, input.max_files);\n const totalDropped = pathsFiltered.length - finalFiles.length;\n\n return {\n available: true,\n generated_at: map.generated_at,\n total_files: Object.keys(map.files).length,\n files: finalFiles.map((f) => ({\n path: f.path,\n ...(f.entry.summary ? { summary: f.entry.summary } : {}),\n loc: f.entry.loc,\n exports: f.entry.exports,\n })),\n ...(totalDropped > 0 ? { truncated: totalDropped } : {}),\n ...(budgetClipped ? { budget_clipped: true as const } : {}),\n };\n}\n\nfunction density(exports: number, loc: number): number {\n if (loc <= 0) return 0;\n return exports / Math.max(loc, 1);\n}\n\nfunction stripLeadingSlash(p: string): string {\n return p.startsWith(\"/\") ? p.slice(1) : p;\n}\n\nfunction estimateFileEntryTokens(f: { path: string; entry: { summary?: string; loc: number; exports: Array<{ name: string; kind: string; description?: string; line: number }> } }): number {\n // Rough payload size: path + summary + each export (~6 tokens for name+kind+line + description).\n const exportsCost = f.entry.exports.reduce(\n (acc, e) => acc + 6 + estimateTokens(e.description ?? \"\"),\n 0,\n );\n return estimateTokens(f.path) + estimateTokens(f.entry.summary ?? \"\") + exportsCost + 4;\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDiffInputSchema = {\n id_a: z.string().min(1).describe(\"First memory id\"),\n id_b: z.string().min(1).describe(\"Second memory id\"),\n};\n\nexport type MemDiffInput = {\n [K in keyof typeof MemDiffInputSchema]: z.infer<(typeof MemDiffInputSchema)[K]>;\n};\n\nexport interface MemDiffOutput {\n id_a: string;\n id_b: string;\n frontmatter_diff: Record<string, { a: unknown; b: unknown }>;\n body_diff: {\n lines_only_in_a: string[];\n lines_only_in_b: string[];\n common_lines: number;\n };\n}\n\nexport async function memDiff(input: MemDiffInput, ctx: HaiveContext): Promise<MemDiffOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const foundA = all.find((m) => m.memory.frontmatter.id === input.id_a);\n const foundB = all.find((m) => m.memory.frontmatter.id === input.id_b);\n if (!foundA) throw new Error(`No memory with id \"${input.id_a}\".`);\n if (!foundB) throw new Error(`No memory with id \"${input.id_b}\".`);\n\n const fmA = foundA.memory.frontmatter as Record<string, unknown>;\n const fmB = foundB.memory.frontmatter as Record<string, unknown>;\n\n const frontmatterDiff: Record<string, { a: unknown; b: unknown }> = {};\n const allKeys = new Set([...Object.keys(fmA), ...Object.keys(fmB)]);\n for (const key of allKeys) {\n const va = fmA[key];\n const vb = fmB[key];\n if (JSON.stringify(va) !== JSON.stringify(vb)) {\n frontmatterDiff[key] = { a: va, b: vb };\n }\n }\n\n const linesA = new Set(foundA.memory.body.split(\"\\n\").map((l) => l.trim()).filter(Boolean));\n const linesB = new Set(foundB.memory.body.split(\"\\n\").map((l) => l.trim()).filter(Boolean));\n\n const onlyA = [...linesA].filter((l) => !linesB.has(l));\n const onlyB = [...linesB].filter((l) => !linesA.has(l));\n const common = [...linesA].filter((l) => linesB.has(l)).length;\n\n return {\n id_a: input.id_a,\n id_b: input.id_b,\n frontmatter_diff: frontmatterDiff,\n body_diff: {\n lines_only_in_a: onlyA,\n lines_only_in_b: onlyB,\n common_lines: common,\n },\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetRecapInputSchema = {\n scope: z\n .enum([\"personal\", \"team\", \"any\"])\n .default(\"any\")\n .describe(\n \"Limit to a specific scope's recap. Default 'any' returns the most recent recap \" +\n \"across both personal and team scopes.\",\n ),\n};\n\nexport type GetRecapInput = {\n [K in keyof typeof GetRecapInputSchema]: z.infer<(typeof GetRecapInputSchema)[K]>;\n};\n\nexport interface GetRecapOutput {\n recap: {\n id: string;\n scope: string;\n revision_count: number;\n created_at: string;\n body: string;\n } | null;\n notice?: string;\n}\n\n/**\n * Lightweight alternative to get_briefing when you ONLY need the previous\n * session recap (e.g. resuming a long task between sessions). Skips project\n * context, modules, and memory ranking — pays only the recap's token cost.\n */\nexport async function getRecap(\n input: GetRecapInput,\n ctx: HaiveContext,\n): Promise<GetRecapOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { recap: null, notice: \"No .ai/memories directory — haive not initialized here.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const recaps = all\n .filter(({ memory }) => memory.frontmatter.type === \"session_recap\")\n .filter(({ memory }) => input.scope === \"any\" || memory.frontmatter.scope === input.scope)\n .sort(\n (a, b) =>\n new Date(b.memory.frontmatter.created_at).getTime() -\n new Date(a.memory.frontmatter.created_at).getTime(),\n );\n\n if (recaps.length === 0) {\n return {\n recap: null,\n notice:\n input.scope === \"any\"\n ? \"No session recap saved yet. Run mem_session_end (or post_task prompt) to capture one.\"\n : `No session recap found in scope '${input.scope}'.`,\n };\n }\n\n const r = recaps[0]!;\n const fm = r.memory.frontmatter;\n return {\n recap: {\n id: fm.id,\n scope: fm.scope,\n revision_count: fm.revision_count ?? 0,\n created_at: fm.created_at,\n body: r.memory.body,\n },\n };\n}\n","import { z } from \"zod\";\nimport { getBriefing, type BriefingMemory, type GetBriefingInput } from \"./get-briefing.js\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRelevantToInputSchema = {\n task: z\n .string()\n .min(1)\n .describe(\"What you are about to do, in 1–2 sentences. Used to rank relevant memories.\"),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Optional: files you are about to edit — surfaces anchored memories.\"),\n limit: z\n .number()\n .int()\n .positive()\n .max(30)\n .default(8)\n .describe(\"Cap on returned memories.\"),\n min_semantic_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.25)\n .describe(\"Drop weakly-related semantic hits below this cosine threshold.\"),\n format: z\n .enum([\"full\", \"compact\", \"actions\"])\n .default(\"full\")\n .describe(\"'compact' = id + 1-line summary; 'full' = complete bodies; 'actions' = bullet-first excerpts.\"),\n};\n\nexport type MemRelevantToInput = {\n [K in keyof typeof MemRelevantToInputSchema]: z.infer<(typeof MemRelevantToInputSchema)[K]>;\n};\n\nexport interface MemRelevantToOutput {\n task: string;\n search_mode: \"semantic\" | \"literal_fallback\" | \"literal\";\n memories: BriefingMemory[];\n hints?: string[];\n /**\n * True when the search returned zero memories — clients can skip surfacing\n * an empty payload to the model.\n */\n empty?: true;\n}\n\n/**\n * One-shot ranked memories for a task. Use instead of get_briefing when you\n * already have project context loaded and only want the relevant memory layer.\n *\n * Runs the same ranking (anchor / module / literal / semantic) as get_briefing\n * but skips project_context, module_contexts, action_required, etc. — paying\n * only the cost of the memory bodies you actually get back.\n */\nexport async function memRelevantTo(\n input: MemRelevantToInput,\n ctx: HaiveContext,\n): Promise<MemRelevantToOutput> {\n // Reuse the briefing pipeline but turn off the heavy bits.\n const briefingInput: GetBriefingInput = {\n task: input.task,\n files: input.files,\n max_tokens: 16000,\n max_memories: input.limit,\n include_project_context: false,\n include_module_contexts: false,\n semantic: true,\n include_stale: false,\n track: true,\n format: input.format,\n symbols: [],\n min_semantic_score: input.min_semantic_score,\n };\n\n const briefing = await getBriefing(briefingInput, ctx);\n\n const out: MemRelevantToOutput = {\n task: input.task,\n search_mode: briefing.search_mode,\n memories: briefing.memories,\n };\n if (briefing.hints && briefing.hints.length > 0) out.hints = briefing.hints;\n if (briefing.memories.length === 0) out.empty = true;\n return out;\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const CodeSearchInputSchema = {\n query: z\n .string()\n .min(1)\n .describe(\n \"Natural-language description of what you are looking for in the codebase \" +\n \"(e.g. 'function that hashes passwords', 'JWT signing logic', 'route registration').\",\n ),\n k: z\n .number()\n .int()\n .positive()\n .max(50)\n .default(5)\n .describe(\"Number of top hits to return.\"),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.2)\n .describe(\n \"Minimum cosine similarity. Hits below this threshold are dropped to avoid noise. \" +\n \"Try 0.3+ for stricter matching.\",\n ),\n};\n\nexport type CodeSearchInput = {\n [K in keyof typeof CodeSearchInputSchema]: z.infer<(typeof CodeSearchInputSchema)[K]>;\n};\n\nexport interface CodeSearchHit {\n file: string;\n name: string;\n kind: string;\n line: number;\n description?: string;\n score: number;\n}\n\nexport interface CodeSearchOutput {\n available: boolean;\n hits: CodeSearchHit[];\n notice?: string;\n}\n\nexport async function codeSearch(\n input: CodeSearchInput,\n ctx: HaiveContext,\n): Promise<CodeSearchOutput> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return {\n available: false,\n hits: [],\n notice:\n \"@hiveai/embeddings is not installed. Install it (`pnpm add @hiveai/embeddings`) \" +\n \"and run `haive index code-search` to enable semantic code search.\",\n };\n }\n\n const result = await mod.codeSemanticSearch(ctx.paths, input.query, {\n limit: input.k,\n minScore: input.min_score,\n });\n\n if (!result) {\n return {\n available: false,\n hits: [],\n notice:\n \"Code semantic-search index not built. Run `haive index code-search` to generate it \" +\n \"(builds embeddings for every exported symbol in the code-map).\",\n };\n }\n\n return { available: true, hits: result.hits };\n}\n","import { existsSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport {\n deriveConfidence,\n getUsage,\n loadCodeMap,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const WhyThisFileInputSchema = {\n path: z\n .string()\n .min(1)\n .describe(\n \"Project-relative path to the file you want context on (e.g. 'packages/mcp/src/tools/mem-save.ts').\",\n ),\n git_log_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"How many recent commits touching this file to include.\"),\n memory_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"Cap on memories anchored to this path.\"),\n};\n\nexport type WhyThisFileInput = {\n [K in keyof typeof WhyThisFileInputSchema]: z.infer<(typeof WhyThisFileInputSchema)[K]>;\n};\n\nexport interface WhyThisFileOutput {\n file: string;\n exists: boolean;\n recent_commits: Array<{ sha: string; author: string; relative_date: string; subject: string }>;\n memories: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n body_preview: string;\n }>;\n code_map_entry: {\n summary?: string;\n loc: number;\n exports: Array<{ name: string; kind: string; line: number; description?: string }>;\n } | null;\n hints?: string[];\n}\n\n/**\n * One-shot file-context lookup: combines recent git history, memories anchored\n * to the path, and the code-map entry. Designed to answer \"why is this file\n * the way it is?\" in a single call instead of 3-4 manual ones.\n */\nexport async function whyThisFile(\n input: WhyThisFileInput,\n ctx: HaiveContext,\n): Promise<WhyThisFileOutput> {\n const fileExists = existsSync(path.join(ctx.paths.root, input.path));\n\n const [commits, memories, codeMap] = await Promise.all([\n runGitLog(ctx.paths.root, input.path, input.git_log_limit).catch(() => []),\n collectAnchoredMemories(ctx, input.path, input.memory_limit),\n loadCodeMap(ctx.paths),\n ]);\n\n const codeMapEntry = codeMap?.files[input.path];\n\n const hints: string[] = [];\n if (!fileExists) {\n hints.push(`File '${input.path}' does not exist on disk — path may be wrong or file removed.`);\n }\n if (commits.length === 0 && fileExists) {\n hints.push(\"No git history found — file may be untracked or git not initialized.\");\n }\n if (memories.length === 0 && fileExists) {\n hints.push(\n \"No memories anchored here. If you discover something non-obvious while editing, \" +\n \"use mem_observe (with where=\" + input.path + \") to capture it.\",\n );\n }\n if (memories.some((m) => m.type === \"attempt\" || m.type === \"gotcha\")) {\n hints.push(\"⚠️ attempt/gotcha memories anchored to this file — read them BEFORE editing.\");\n }\n\n return {\n file: input.path,\n exists: fileExists,\n recent_commits: commits,\n memories,\n code_map_entry: codeMapEntry\n ? {\n ...(codeMapEntry.summary ? { summary: codeMapEntry.summary } : {}),\n loc: codeMapEntry.loc,\n exports: codeMapEntry.exports.map((e) => ({\n name: e.name,\n kind: e.kind,\n line: e.line,\n ...(e.description ? { description: e.description } : {}),\n })),\n }\n : null,\n ...(hints.length > 0 ? { hints } : {}),\n };\n}\n\nasync function collectAnchoredMemories(\n ctx: HaiveContext,\n filePath: string,\n limit: number,\n): Promise<WhyThisFileOutput[\"memories\"]> {\n if (!existsSync(ctx.paths.memoriesDir)) return [];\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const out: WhyThisFileOutput[\"memories\"] = [];\n for (const { memory } of all) {\n const fm = memory.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n if (fm.type === \"session_recap\") continue;\n if (!memoryMatchesAnchorPaths(memory, [filePath])) continue;\n const u = getUsage(usage, fm.id);\n out.push({\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n confidence: deriveConfidence(fm, u),\n body_preview: memory.body.split(\"\\n\").slice(0, 6).join(\"\\n\"),\n });\n if (out.length >= limit) break;\n }\n return out;\n}\n\nasync function runGitLog(\n cwd: string,\n filePath: string,\n limit: number,\n): Promise<WhyThisFileOutput[\"recent_commits\"]> {\n const sep = \"<<HV>>\";\n const fmt = `%h${sep}%an${sep}%ar${sep}%s`;\n const output = await runCommand(\n \"git\",\n [\"log\", `-n`, String(limit), `--pretty=format:${fmt}`, \"--\", filePath],\n cwd,\n );\n if (!output.trim()) return [];\n return output\n .split(\"\\n\")\n .map((line) => {\n const [sha = \"\", author = \"\", relative_date = \"\", subject = \"\"] = line.split(sep);\n return { sha, author, relative_date, subject };\n })\n .filter((c) => c.sha);\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) => {\n stdout += chunk.toString();\n });\n proc.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\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","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n literalMatchesAnyToken,\n memoryMatchesAnchorPaths,\n tokenizeQuery,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const AntiPatternsCheckInputSchema = {\n diff: z\n .string()\n .optional()\n .describe(\n \"Raw unified diff text (or any code/text snippet) to scan for previously documented anti-patterns. \" +\n \"Tokens from the diff are used to match memory bodies and the embeddings index.\",\n ),\n paths: z\n .array(z.string())\n .default([])\n .describe(\n \"File paths affected by the change. Memories anchored to any of these paths are surfaced regardless of the diff content.\",\n ),\n limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(8)\n .describe(\"Cap on returned warnings.\"),\n semantic: z\n .boolean()\n .default(true)\n .describe(\n \"When true, also use semantic search (requires @hiveai/embeddings + memory index) to find related anti-patterns.\",\n ),\n};\n\nexport type AntiPatternsCheckInput = {\n [K in keyof typeof AntiPatternsCheckInputSchema]: z.infer<(typeof AntiPatternsCheckInputSchema)[K]>;\n};\n\nexport interface AntiPatternsWarning {\n id: string;\n type: \"attempt\" | \"gotcha\";\n scope: string;\n confidence: string;\n body_preview: string;\n reasons: Array<\"anchor\" | \"literal\" | \"semantic\">;\n semantic_score?: number;\n}\n\nexport interface AntiPatternsCheckOutput {\n /** Total number of attempt+gotcha memories that exist in this project. */\n scanned: number;\n warnings: AntiPatternsWarning[];\n notice?: string;\n}\n\n/**\n * Scan a diff (or set of paths) against documented attempt/gotcha memories.\n * Surfaces \"you are about to repeat a known mistake\" warnings BEFORE you commit.\n *\n * Matching strategy:\n * 1. Anchor — memories anchored to any of the changed paths\n * 2. Literal — tokens from the diff overlap with memory body\n * 3. Semantic — cosine similarity (when enabled and index available)\n */\nexport async function antiPatternsCheck(\n input: AntiPatternsCheckInput,\n ctx: HaiveContext,\n): Promise<AntiPatternsCheckOutput> {\n if (!input.diff && input.paths.length === 0) {\n return {\n scanned: 0,\n warnings: [],\n notice: \"Nothing to check — provide either `diff` text or `paths`.\",\n };\n }\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { scanned: 0, warnings: [], notice: \"No .ai/memories directory — nothing to check against.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const negative = all.filter(({ memory }) => {\n const t = memory.frontmatter.type;\n if (t !== \"attempt\" && t !== \"gotcha\") return false;\n const s = memory.frontmatter.status;\n return s !== \"rejected\" && s !== \"deprecated\" && s !== \"stale\";\n });\n\n if (negative.length === 0) {\n return { scanned: 0, warnings: [], notice: \"No attempt/gotcha memories found yet.\" };\n }\n\n const usage = await loadUsageIndex(ctx.paths);\n const seen = new Map<string, AntiPatternsWarning>();\n\n const upsert = (\n fm: { id: string; type: string; scope: string },\n body: string,\n reason: AntiPatternsWarning[\"reasons\"][number],\n score?: number,\n ): void => {\n const existing = seen.get(fm.id);\n if (existing) {\n if (!existing.reasons.includes(reason)) existing.reasons.push(reason);\n if (score !== undefined && (existing.semantic_score ?? 0) < score) {\n existing.semantic_score = score;\n }\n return;\n }\n const u = getUsage(usage, fm.id);\n seen.set(fm.id, {\n id: fm.id,\n type: fm.type as \"attempt\" | \"gotcha\",\n scope: fm.scope,\n confidence: deriveConfidence(fm as Parameters<typeof deriveConfidence>[0], u),\n body_preview: body.split(\"\\n\").slice(0, 5).join(\"\\n\").slice(0, 400),\n reasons: [reason],\n ...(score !== undefined ? { semantic_score: score } : {}),\n });\n };\n\n // 1. Anchor matches\n if (input.paths.length > 0) {\n for (const { memory } of negative) {\n if (memoryMatchesAnchorPaths(memory, input.paths)) {\n upsert(memory.frontmatter, memory.body, \"anchor\");\n }\n }\n }\n\n // 2. Literal token overlap from diff\n if (input.diff) {\n const tokens = tokenizeQuery(input.diff);\n if (tokens.length > 0) {\n for (const { memory } of negative) {\n if (literalMatchesAnyToken(memory, tokens)) {\n upsert(memory.frontmatter, memory.body, \"literal\");\n }\n }\n }\n }\n\n // 3. Semantic search\n if (input.semantic && input.diff) {\n try {\n const mod = await import(\"@hiveai/embeddings\");\n const result = await mod.semanticSearch(ctx.paths, input.diff, { limit: input.limit * 2 });\n if (result) {\n const negativeIds = new Set(negative.map(({ memory }) => memory.frontmatter.id));\n for (const hit of result.hits) {\n if (!negativeIds.has(hit.id)) continue;\n const found = negative.find(({ memory }) => memory.frontmatter.id === hit.id);\n if (found) upsert(found.memory.frontmatter, found.memory.body, \"semantic\", hit.score);\n }\n }\n } catch {\n // embeddings not installed — silently skip semantic\n }\n }\n\n // Rank: anchor > literal > semantic, then by confidence\n const warnings = [...seen.values()]\n .sort((a, b) => {\n const score = (w: AntiPatternsWarning): number => {\n const reasonW =\n (w.reasons.includes(\"anchor\") ? 4 : 0) +\n (w.reasons.includes(\"literal\") ? 2 : 0) +\n (w.reasons.includes(\"semantic\") ? 1 : 0);\n const confW =\n w.confidence === \"authoritative\" ? 3 :\n w.confidence === \"trusted\" ? 2 :\n w.confidence === \"low\" ? 1 : 0;\n return reasonW + confW + (w.semantic_score ?? 0);\n };\n return score(b) - score(a);\n })\n .slice(0, input.limit);\n\n return {\n scanned: negative.length,\n warnings,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n tokenizeQuery,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDistillInputSchema = {\n since_days: z\n .number()\n .int()\n .positive()\n .default(30)\n .describe(\"Only consider memories created in the last N days.\"),\n min_cluster: z\n .number()\n .int()\n .min(2)\n .default(3)\n .describe(\"Minimum cluster size to surface.\"),\n type_filter: z\n .enum([\"gotcha\", \"attempt\", \"all\"])\n .default(\"gotcha\")\n .describe(\n \"Memory type to scan. 'gotcha' targets observe-style discoveries that recur, \" +\n \"'attempt' surfaces failed approaches that repeat, 'all' considers both.\",\n ),\n scope: z\n .enum([\"personal\", \"team\", \"module\", \"any\"])\n .default(\"any\")\n .describe(\"Restrict to a specific scope.\"),\n};\n\nexport type MemDistillInput = {\n [K in keyof typeof MemDistillInputSchema]: z.infer<(typeof MemDistillInputSchema)[K]>;\n};\n\nexport interface DistillCluster {\n suggested_topic: string;\n suggested_type: \"convention\" | \"gotcha\";\n member_ids: string[];\n overlapping_paths: string[];\n common_keywords: string[];\n sample_titles: string[];\n /** ISO date of the latest member */\n latest_at: string;\n}\n\nexport interface MemDistillOutput {\n scanned: number;\n /** Memories that didn't fit any cluster (kept here so callers can inspect singletons). */\n singletons: number;\n clusters: DistillCluster[];\n notice?: string;\n}\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\nconst STOP_WORDS = new Set([\n \"the\",\"and\",\"for\",\"with\",\"that\",\"this\",\"from\",\"into\",\"when\",\"then\",\"also\",\"must\",\n \"have\",\"does\",\"not\",\"but\",\"you\",\"your\",\"its\",\"because\",\"why\",\"how\",\"what\",\n \"use\",\"using\",\"used\",\"add\",\"added\",\"make\",\"made\",\"fix\",\"fixed\",\"bug\",\"error\",\n]);\n\n/**\n * Cluster recurring observations / attempts so a human can collapse N similar\n * memories into one richer convention/gotcha. Uses cheap heuristics (anchor\n * path overlap + body keyword overlap) — no embeddings needed.\n *\n * Output is *advisory*: nothing is written to disk. The caller (CLI / human)\n * decides whether to mem_save the consolidated form.\n */\nexport async function memDistill(\n input: MemDistillInput,\n ctx: HaiveContext,\n): Promise<MemDistillOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { scanned: 0, singletons: 0, clusters: [], notice: \"No .ai/memories directory.\" };\n }\n\n const cutoff = Date.now() - input.since_days * MS_PER_DAY;\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const candidates = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\" || fm.status === \"stale\") return false;\n if (input.scope !== \"any\" && fm.scope !== input.scope) return false;\n if (input.type_filter === \"gotcha\" && fm.type !== \"gotcha\") return false;\n if (input.type_filter === \"attempt\" && fm.type !== \"attempt\") return false;\n if (input.type_filter === \"all\" && fm.type !== \"gotcha\" && fm.type !== \"attempt\") return false;\n if (Date.parse(fm.created_at) < cutoff) return false;\n return true;\n });\n\n if (candidates.length < input.min_cluster) {\n return {\n scanned: candidates.length,\n singletons: candidates.length,\n clusters: [],\n notice: candidates.length === 0\n ? `No matching memories in the last ${input.since_days} days.`\n : `Only ${candidates.length} candidate${candidates.length === 1 ? \"\" : \"s\"} — below min_cluster=${input.min_cluster}.`,\n };\n }\n\n // Pre-compute features per memory: keyword set + path set\n const features = candidates.map((loaded) => ({\n loaded,\n keywords: keywordSet(loaded),\n paths: new Set<string>(loaded.memory.frontmatter.anchor.paths),\n }));\n\n // Single-linkage clustering: union-find by similarity threshold.\n const parent: number[] = features.map((_, i) => i);\n const find = (i: number): number => (parent[i] === i ? i : (parent[i] = find(parent[i] ?? 0)));\n const union = (a: number, b: number): void => {\n const ra = find(a), rb = find(b);\n if (ra !== rb) parent[ra] = rb;\n };\n\n for (let i = 0; i < features.length; i++) {\n for (let j = i + 1; j < features.length; j++) {\n const fi = features[i]!, fj = features[j]!;\n const pathSim = jaccard(fi.paths, fj.paths);\n const kwSim = jaccard(fi.keywords, fj.keywords);\n // Either strong path overlap OR strong keyword overlap qualifies.\n if (pathSim >= 0.5 || kwSim >= 0.4) union(i, j);\n }\n }\n\n // Group by root parent\n const groups = new Map<number, number[]>();\n for (let i = 0; i < features.length; i++) {\n const root = find(i);\n const arr = groups.get(root) ?? [];\n arr.push(i);\n groups.set(root, arr);\n }\n\n const clusters: DistillCluster[] = [];\n let singletons = 0;\n for (const indices of groups.values()) {\n if (indices.length < input.min_cluster) {\n singletons += indices.length;\n continue;\n }\n const members = indices.map((i) => features[i]!);\n const allPaths = new Set<string>();\n const allKeywords = new Map<string, number>();\n let latest = 0;\n for (const m of members) {\n for (const p of m.paths) allPaths.add(p);\n for (const k of m.keywords) allKeywords.set(k, (allKeywords.get(k) ?? 0) + 1);\n const t = Date.parse(m.loaded.memory.frontmatter.created_at);\n if (t > latest) latest = t;\n }\n const commonKeywords = [...allKeywords.entries()]\n .filter(([, n]) => n >= Math.max(2, Math.floor(members.length / 2)))\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([k]) => k);\n\n const titles = members\n .map((m) => firstHeading(m.loaded.memory.body) ?? m.loaded.memory.frontmatter.id)\n .slice(0, 5);\n\n const suggestedType: DistillCluster[\"suggested_type\"] =\n members.every((m) => m.loaded.memory.frontmatter.type === \"attempt\") ? \"gotcha\" : \"convention\";\n\n clusters.push({\n suggested_topic: commonKeywords.slice(0, 3).join(\"-\") || \"merged-observations\",\n suggested_type: suggestedType,\n member_ids: members.map((m) => m.loaded.memory.frontmatter.id),\n overlapping_paths: [...allPaths].slice(0, 10),\n common_keywords: commonKeywords,\n sample_titles: titles,\n latest_at: new Date(latest).toISOString(),\n });\n }\n\n // Sort clusters by size desc\n clusters.sort((a, b) => b.member_ids.length - a.member_ids.length);\n\n return {\n scanned: candidates.length,\n singletons,\n clusters,\n };\n}\n\nfunction keywordSet(loaded: LoadedMemory): Set<string> {\n const text = (loaded.memory.body + \" \" + loaded.memory.frontmatter.tags.join(\" \")).slice(0, 800);\n const tokens = tokenizeQuery(text)\n .filter((t) => t.length >= 4 && !STOP_WORDS.has(t));\n return new Set(tokens);\n}\n\nfunction jaccard<T>(a: Set<T>, b: Set<T>): number {\n if (a.size === 0 && b.size === 0) return 0;\n let intersect = 0;\n for (const x of a) if (b.has(x)) intersect++;\n const union = a.size + b.size - intersect;\n return union === 0 ? 0 : intersect / union;\n}\n\nfunction firstHeading(body: string): string | undefined {\n for (const line of body.split(\"\\n\")) {\n const t = line.trim();\n if (t.startsWith(\"#\")) return t.replace(/^#+\\s*/, \"\").slice(0, 80);\n if (t.length > 0) return t.slice(0, 80);\n }\n return undefined;\n}\n","import { existsSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n pathsOverlap as singlePathsOverlap,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const WhyThisDecisionInputSchema = {\n id: z\n .string()\n .min(1)\n .describe(\"Memory id to inspect (e.g. '2026-04-25-decision-esm-only').\"),\n git_log_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"How many recent commits per anchor path to surface.\"),\n};\n\nexport type WhyThisDecisionInput = {\n [K in keyof typeof WhyThisDecisionInputSchema]: z.infer<(typeof WhyThisDecisionInputSchema)[K]>;\n};\n\nexport interface WhyThisDecisionOutput {\n found: boolean;\n decision?: {\n id: string;\n type: string;\n scope: string;\n status: string;\n confidence: string;\n body: string;\n created_at: string;\n };\n /** Memories explicitly linked via related_ids on the decision (or vice versa). */\n related: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n body_preview: string;\n relation: \"explicit\" | \"back-link\";\n }>;\n /** Other memories anchored to overlapping paths — implicit context. */\n path_neighbors: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n overlap: string[];\n body_preview: string;\n }>;\n /** Recent git commits touching any of the decision's anchored paths. */\n recent_commits: Array<{\n path: string;\n sha: string;\n author: string;\n relative_date: string;\n subject: string;\n }>;\n hints?: string[];\n notice?: string;\n}\n\n/**\n * Trace the genealogy of a `decision` memory: the decision itself + memories\n * explicitly linked to it + memories anchored to overlapping paths + recent\n * commits touching those paths. One call instead of 4-5 manual lookups.\n *\n * Works on any memory type, but is optimized for `decision` and `architecture`.\n */\nexport async function whyThisDecision(\n input: WhyThisDecisionInput,\n ctx: HaiveContext,\n): Promise<WhyThisDecisionOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n found: false,\n related: [],\n path_neighbors: [],\n recent_commits: [],\n notice: \"No .ai/memories directory.\",\n };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const target = all.find(({ memory }) => memory.frontmatter.id === input.id);\n if (!target) {\n return {\n found: false,\n related: [],\n path_neighbors: [],\n recent_commits: [],\n notice: `Memory '${input.id}' not found.`,\n };\n }\n\n const fm = target.memory.frontmatter;\n const targetUsage = getUsage(usage, fm.id);\n const decision = {\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n status: fm.status,\n confidence: deriveConfidence(fm, targetUsage),\n body: target.memory.body,\n created_at: fm.created_at,\n };\n\n // ── related: explicit related_ids + reverse links ──────────────────────\n const relatedSet = new Set(fm.related_ids ?? []);\n const related: WhyThisDecisionOutput[\"related\"] = [];\n for (const { memory } of all) {\n if (memory.frontmatter.id === fm.id) continue;\n const isExplicit = relatedSet.has(memory.frontmatter.id);\n const isBackLink = (memory.frontmatter.related_ids ?? []).includes(fm.id);\n if (!isExplicit && !isBackLink) continue;\n const u = getUsage(usage, memory.frontmatter.id);\n related.push({\n id: memory.frontmatter.id,\n type: memory.frontmatter.type,\n scope: memory.frontmatter.scope,\n confidence: deriveConfidence(memory.frontmatter, u),\n body_preview: memory.body.split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 300),\n relation: isExplicit ? \"explicit\" : \"back-link\",\n });\n }\n\n // ── path_neighbors: memories anchored to overlapping paths ─────────────\n const targetPaths = fm.anchor.paths;\n const path_neighbors: WhyThisDecisionOutput[\"path_neighbors\"] = [];\n if (targetPaths.length > 0) {\n for (const { memory } of all) {\n if (memory.frontmatter.id === fm.id) continue;\n if (relatedSet.has(memory.frontmatter.id)) continue; // already in related\n const overlappingPaths = memory.frontmatter.anchor.paths.filter((p) =>\n targetPaths.some((tp) => singlePathsOverlap(p, tp)),\n );\n if (overlappingPaths.length === 0) continue;\n const u = getUsage(usage, memory.frontmatter.id);\n path_neighbors.push({\n id: memory.frontmatter.id,\n type: memory.frontmatter.type,\n scope: memory.frontmatter.scope,\n confidence: deriveConfidence(memory.frontmatter, u),\n overlap: overlappingPaths,\n body_preview: memory.body.split(\"\\n\").slice(0, 3).join(\"\\n\").slice(0, 200),\n });\n if (path_neighbors.length >= 10) break;\n }\n }\n\n // ── recent_commits: git log on each anchored path ──────────────────────\n const recent_commits: WhyThisDecisionOutput[\"recent_commits\"] = [];\n for (const p of targetPaths.slice(0, 5)) {\n try {\n const commits = await runGitLog(ctx.paths.root, p, input.git_log_limit);\n for (const c of commits) recent_commits.push({ path: p, ...c });\n } catch {\n /* git not available or path untracked — silent */\n }\n }\n\n const hints: string[] = [];\n if (decision.confidence === \"low\" || decision.confidence === \"stale\") {\n hints.push(`⚠️ Confidence is ${decision.confidence}. Verify this decision still applies before quoting it.`);\n }\n if (related.length === 0 && path_neighbors.length === 0 && targetPaths.length === 0) {\n hints.push(\"No related memories and no anchored paths — this decision is isolated; consider adding related_ids or paths.\");\n }\n if (fm.type !== \"decision\" && fm.type !== \"architecture\") {\n hints.push(`Memory type is '${fm.type}', not 'decision'/'architecture' — output may be less informative.`);\n }\n\n return {\n found: true,\n decision,\n related,\n path_neighbors,\n recent_commits,\n ...(hints.length > 0 ? { hints } : {}),\n };\n}\n\nasync function runGitLog(\n cwd: string,\n filePath: string,\n limit: number,\n): Promise<Array<{ sha: string; author: string; relative_date: string; subject: string }>> {\n const sep = \"<<HV>>\";\n const fmt = `%h${sep}%an${sep}%ar${sep}%s`;\n const output = await runCommand(\n \"git\",\n [\"log\", \"-n\", String(limit), `--pretty=format:${fmt}`, \"--\", filePath],\n cwd,\n );\n if (!output.trim()) return [];\n return output\n .split(\"\\n\")\n .map((line) => {\n const [sha = \"\", author = \"\", relative_date = \"\", subject = \"\"] = line.split(sep);\n return { sha, author, relative_date, subject };\n })\n .filter((c) => c.sha);\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","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n pathsOverlap,\n tokenizeQuery,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemConflictsInputSchema = {\n id: z\n .string()\n .min(1)\n .describe(\"Memory id to check for conflicts.\"),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.5)\n .describe(\"Minimum cosine similarity to consider a memory as a potential conflict (semantic mode).\"),\n semantic: z\n .boolean()\n .default(true)\n .describe(\"Use embeddings for similarity. Falls back to keyword overlap when embeddings are not installed.\"),\n};\n\nexport type MemConflictsInput = {\n [K in keyof typeof MemConflictsInputSchema]: z.infer<(typeof MemConflictsInputSchema)[K]>;\n};\n\nexport type ConflictReason =\n | \"opposite-status\"\n | \"attempt-vs-convention-same-paths\"\n | \"polarity-keywords\"\n | \"explicit-contradiction-tag\";\n\nexport interface ConflictHit {\n id: string;\n type: string;\n scope: string;\n status: string;\n confidence: string;\n body_preview: string;\n similarity: number | null;\n reasons: ConflictReason[];\n shared_paths: string[];\n}\n\nexport interface MemConflictsOutput {\n found: boolean;\n target?: { id: string; type: string; status: string };\n scanned: number;\n conflicts: ConflictHit[];\n notice?: string;\n}\n\nconst POSITIVE_PATTERNS = /\\b(use|prefer|always|should use|do this|recommended|ok to)\\b/i;\nconst NEGATIVE_PATTERNS = /\\b(do not use|don'?t use|never|avoid|forbidden|deprecated|stop using|do NOT|❌)\\b/i;\n\n/**\n * Find memories that potentially CONTRADICT the given memory. Useful before\n * relying on a memory's advice — surfaces \"another memory says the opposite\".\n *\n * Detection layers (any of these triggers a hit):\n * - Opposite status: target is validated, neighbor is rejected — for the same topic\n * - Type mismatch on overlapping paths: an `attempt` (don't do X) coexists with\n * a `convention` (do X) anchored to overlapping paths\n * - Polarity keywords: target says \"use X\" while a semantic neighbor says \"don't use X\"\n * - Explicit contradiction tag (#contradicts:<id>) in either body\n */\nexport async function memConflicts(\n input: MemConflictsInput,\n ctx: HaiveContext,\n): Promise<MemConflictsOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { found: false, scanned: 0, conflicts: [], notice: \"No .ai/memories directory.\" };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const target = all.find(({ memory }) => memory.frontmatter.id === input.id);\n if (!target) {\n return { found: false, scanned: 0, conflicts: [], notice: `Memory '${input.id}' not found.` };\n }\n\n const usage = await loadUsageIndex(ctx.paths);\n const others = all.filter(({ memory }) =>\n memory.frontmatter.id !== input.id &&\n memory.frontmatter.type !== \"session_recap\"\n );\n\n // Optional: get semantic similarity scores via embeddings\n const simScores = input.semantic ? await trySemanticSimilarities(ctx, target, others) : null;\n\n const targetText = (target.memory.body + \" \" + target.memory.frontmatter.tags.join(\" \"))\n .toLowerCase();\n const targetTokens = new Set(tokenizeQuery(targetText));\n const targetPolarity = polarity(targetText);\n const targetPaths = target.memory.frontmatter.anchor.paths;\n const explicitContradicts = extractContradictsTags(target.memory.body);\n\n const conflicts: ConflictHit[] = [];\n\n for (const other of others) {\n const fm = other.memory.frontmatter;\n const otherText = (other.memory.body + \" \" + fm.tags.join(\" \")).toLowerCase();\n const reasons: ConflictReason[] = [];\n\n const sim = simScores?.get(fm.id) ?? null;\n\n // Pre-filter: at least some keyword or path overlap or semantic hit.\n const hasPathOverlap = fm.anchor.paths.some((p) => targetPaths.some((tp) => pathsOverlap(p, tp)));\n const otherTokens = new Set(tokenizeQuery(otherText));\n const tokenOverlap = countIntersection(targetTokens, otherTokens);\n const isSemanticNeighbor = sim !== null && sim >= input.min_score;\n if (!hasPathOverlap && tokenOverlap < 4 && !isSemanticNeighbor) continue;\n\n // 1. Explicit contradicts tag\n const otherContradicts = extractContradictsTags(other.memory.body);\n if (explicitContradicts.has(fm.id) || otherContradicts.has(input.id)) {\n reasons.push(\"explicit-contradiction-tag\");\n }\n\n // 2. Opposite status (one validated, the other rejected on the same topic)\n if (\n target.memory.frontmatter.status === \"validated\" && fm.status === \"rejected\" ||\n target.memory.frontmatter.status === \"rejected\" && fm.status === \"validated\"\n ) {\n if (tokenOverlap >= 4 || isSemanticNeighbor) reasons.push(\"opposite-status\");\n }\n\n // 3. attempt vs convention/decision on overlapping paths\n if (hasPathOverlap) {\n const tType = target.memory.frontmatter.type;\n const oType = fm.type;\n const isAttemptVsRule = (tType === \"attempt\" && (oType === \"convention\" || oType === \"decision\")) ||\n (oType === \"attempt\" && (tType === \"convention\" || tType === \"decision\"));\n if (isAttemptVsRule) reasons.push(\"attempt-vs-convention-same-paths\");\n }\n\n // 4. Polarity inversion on shared keywords\n if (isSemanticNeighbor) {\n const otherPolarity = polarity(otherText);\n if (\n (targetPolarity === \"positive\" && otherPolarity === \"negative\") ||\n (targetPolarity === \"negative\" && otherPolarity === \"positive\")\n ) {\n reasons.push(\"polarity-keywords\");\n }\n }\n\n if (reasons.length === 0) continue;\n\n const u = getUsage(usage, fm.id);\n conflicts.push({\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n body_preview: other.memory.body.split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 300),\n similarity: sim,\n reasons,\n shared_paths: fm.anchor.paths.filter((p) => targetPaths.some((tp) => pathsOverlap(p, tp))),\n });\n }\n\n // Rank: explicit > opposite-status > others; tiebreak by similarity desc\n conflicts.sort((a, b) => {\n const score = (c: ConflictHit): number =>\n (c.reasons.includes(\"explicit-contradiction-tag\") ? 100 : 0) +\n (c.reasons.includes(\"opposite-status\") ? 50 : 0) +\n (c.reasons.includes(\"attempt-vs-convention-same-paths\") ? 25 : 0) +\n (c.reasons.includes(\"polarity-keywords\") ? 10 : 0) +\n (c.similarity ?? 0) * 5;\n return score(b) - score(a);\n });\n\n return {\n found: true,\n target: {\n id: target.memory.frontmatter.id,\n type: target.memory.frontmatter.type,\n status: target.memory.frontmatter.status,\n },\n scanned: others.length,\n conflicts: conflicts.slice(0, 10),\n };\n}\n\nfunction polarity(text: string): \"positive\" | \"negative\" | \"neutral\" {\n const neg = NEGATIVE_PATTERNS.test(text);\n const pos = POSITIVE_PATTERNS.test(text);\n if (neg && !pos) return \"negative\";\n if (pos && !neg) return \"positive\";\n return \"neutral\";\n}\n\nfunction extractContradictsTags(body: string): Set<string> {\n const out = new Set<string>();\n for (const m of body.matchAll(/#contradicts:([\\w-]+)/g)) {\n if (m[1]) out.add(m[1]);\n }\n return out;\n}\n\nfunction countIntersection<T>(a: Set<T>, b: Set<T>): number {\n let n = 0;\n for (const x of a) if (b.has(x)) n++;\n return n;\n}\n\nasync function trySemanticSimilarities(\n ctx: HaiveContext,\n target: LoadedMemory,\n others: LoadedMemory[],\n): Promise<Map<string, number> | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(\n ctx.paths,\n target.memory.body,\n { limit: others.length },\n );\n if (!result) return null;\n const map = new Map<string, number>();\n for (const hit of result.hits) map.set(hit.id, hit.score);\n return map;\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { antiPatternsCheck, type AntiPatternsWarning } from \"./anti-patterns-check.js\";\nimport { memForFiles } from \"./mem-for-files.js\";\nimport { memVerify } from \"./mem-verify.js\";\n\nexport const PreCommitCheckInputSchema = {\n diff: z\n .string()\n .optional()\n .describe(\n \"Raw unified diff text to scan. If omitted, only `paths` is used. \" +\n \"When called from a pre-commit hook, pipe the output of `git diff --cached`.\",\n ),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Project-relative paths affected by the change. At least one of `diff` or `paths` should be provided.\"),\n block_on: z\n .enum([\"any\", \"high-confidence\", \"never\"])\n .default(\"high-confidence\")\n .describe(\n \"When to set should_block=true: \" +\n \"'any' = any warning blocks; \" +\n \"'high-confidence' = only warnings from authoritative/trusted memories block; \" +\n \"'never' = report only, never block.\",\n ),\n semantic: z\n .boolean()\n .default(true)\n .describe(\"Enable semantic search in anti_patterns_check (requires embeddings index).\"),\n};\n\nexport type PreCommitCheckInput = {\n [K in keyof typeof PreCommitCheckInputSchema]: z.infer<(typeof PreCommitCheckInputSchema)[K]>;\n};\n\nexport interface PreCommitCheckOutput {\n /** True when at least one finding meets the configured block_on threshold. */\n should_block: boolean;\n /** Per-section summary; clients should surface the warnings + reasons to the user. */\n summary: {\n anti_patterns: number;\n blocking_warnings?: number;\n relevant_memories: number;\n stale_anchors: number;\n };\n warnings: AntiPatternsWarning[];\n /** Memories anchored to the touched files — convention reminders for the change author. */\n relevant_memories: Array<{\n id: string;\n type: string;\n confidence: string;\n body_preview: string;\n }>;\n /** Memories whose anchored paths overlap with the diff AND are now stale — likely outdated knowledge. */\n stale_anchors: Array<{\n id: string;\n paths: string[];\n body_preview: string;\n }>;\n notice?: string;\n}\n\n/**\n * One-shot \"should I block this commit?\" check.\n *\n * Combines three signals into a single call agents and git hooks can consume:\n * 1. anti_patterns_check — known gotchas/attempts that match the diff\n * 2. mem_for_files — conventions/decisions anchored to touched files\n * 3. mem_verify — memories whose anchors are stale (knowledge may be wrong)\n *\n * Returns should_block per the configured threshold, plus the raw findings so\n * the caller can render them. CLI wrapper: `haive precommit`.\n */\nexport async function preCommitCheck(\n input: PreCommitCheckInput,\n ctx: HaiveContext,\n): Promise<PreCommitCheckOutput> {\n if (!input.diff && input.paths.length === 0) {\n return {\n should_block: false,\n summary: { anti_patterns: 0, relevant_memories: 0, stale_anchors: 0 },\n warnings: [],\n relevant_memories: [],\n stale_anchors: [],\n notice: \"Nothing to check — provide either `diff` or `paths`.\",\n };\n }\n\n // 1. Known anti-patterns\n const apResult = await antiPatternsCheck({\n diff: input.diff,\n paths: input.paths,\n limit: 20,\n semantic: input.semantic,\n }, ctx);\n\n // 2. Relevant conventions/decisions for the touched files\n const relevant = input.paths.length > 0\n ? await memForFiles({ files: input.paths, include_module_contexts: false, track: false }, ctx)\n : { by_anchor: [], by_module: [], by_domain: [], module_contexts: [], inferred_modules: [] };\n // Anchor matches are the most relevant for pre-commit; include module hits as a softer signal.\n const relevantMatches = [...relevant.by_anchor, ...relevant.by_module];\n\n // 3. Verify anchors — surface stale memories that touch these files\n const verifyResult = input.paths.length > 0\n ? await memVerify({ update: false, id: undefined }, ctx)\n : { results: [], summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 } };\n // We surface a stale memory when at least one of the verify hits says stale=true.\n // We don't have direct access to the memory's anchored paths from MemVerifyHit, so we rely on\n // mem_for_files to scope these to \"memories that touch our files\".\n const filesTouching = new Set(relevantMatches.map((m) => m.id));\n const staleHits = verifyResult.results.filter((r) => r.stale && filesTouching.has(r.id));\n\n // Determine should_block\n const blockOn = input.block_on;\n const blockingWarnings = apResult.warnings.filter(isBlockingWarning);\n let should_block = false;\n if (blockOn !== \"never\") {\n if (blockOn === \"any\" && (apResult.warnings.length > 0 || staleHits.length > 0)) should_block = true;\n if (blockOn === \"high-confidence\" && (blockingWarnings.length > 0 || staleHits.length > 0)) should_block = true;\n }\n\n // Map mem_for_files output to a simpler shape\n const relevant_memories = relevantMatches.slice(0, 8).map((m) => ({\n id: m.id,\n type: m.type,\n confidence: String(m.confidence),\n body_preview: (m.body ?? \"\").split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 250),\n }));\n\n return {\n should_block,\n summary: {\n anti_patterns: apResult.warnings.length,\n blocking_warnings: blockingWarnings.length,\n relevant_memories: relevant_memories.length,\n stale_anchors: staleHits.length,\n },\n warnings: apResult.warnings,\n relevant_memories,\n stale_anchors: staleHits.map((r) => ({\n id: r.id,\n // The matching `relevantMatches` entry tells us which paths overlap.\n paths: relevantMatches.find((m) => m.id === r.id)\n ? input.paths.filter((p) => relevantMatches.some((m) => m.id === r.id))\n : [],\n body_preview: r.reason ?? \"anchored code drifted; verify before relying on this memory\",\n })),\n };\n}\n\nfunction isBlockingWarning(warning: AntiPatternsWarning): boolean {\n const highConfidence = warning.confidence === \"authoritative\" || warning.confidence === \"trusted\";\n if (!highConfidence) return false;\n\n // Anchors and lexical matches prove relevance, not violation. A broad diff\n // can touch package files or share common tokens with old gotchas. Require\n // a semantic corroboration strong enough to indicate the same mistake.\n return warning.reasons.includes(\"semantic\") && (warning.semantic_score ?? 0) >= 0.65;\n}\n","/**\n * pattern_detect — heuristic memory detector that runs without an LLM.\n *\n * Three signals (no LLM required):\n * 1. CONFIG_CHANGE: git diff shows changes to config files\n * (tsconfig, eslint, prettier, vitest, .env.example, …)\n * → proposes a convention memory with the diff as body.\n *\n * 2. REPEATED_PATH: same file path appears in ≥ N consecutive mem_tried /\n * mem_observe events in the usage log\n * → proposes a gotcha memory anchored to that path.\n *\n * 3. HOT_FILE: a non-config source file appears in mem_save / mem_tried /\n * mem_observe summaries ≥ 3 times in the look-back window\n * → proposes a convention memory (frequent edits signal a pattern).\n *\n * Output is `status: proposed` — auto-promote (Phase 4) or the next\n * get_briefing post_task flow will validate/reject them.\n *\n * Runs entirely from the local filesystem: git, usage log, no network.\n */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n readUsageEvents,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\n/** Glob patterns (lowercased) that identify config files. */\nconst CONFIG_PATTERNS = [\n \".eslintrc\", \"eslint.config\", \"prettier.config\", \".prettierrc\",\n \"tsconfig\", \"jsconfig\",\n \"vitest.config\", \"jest.config\",\n \".env.example\", \".env.defaults\",\n \"tailwind.config\", \"vite.config\", \"next.config\",\n \"babel.config\", \"postcss.config\",\n \"renovate.json\", \"dependabot.yml\",\n];\n\n/** Max length of a git diff included in a proposed memory body. */\nconst MAX_DIFF_BYTES = 4096;\n\n/** Threshold: path must appear this many times to trigger a HOT_FILE signal. */\nconst HOT_FILE_MIN = 3;\n\n// ── Input / Output ─────────────────────────────────────────────────────────\n\nexport const PatternDetectInputSchema = {\n since_days: z\n .number()\n .int()\n .min(1)\n .default(7)\n .describe(\"Look-back window in days for both git history and usage log.\"),\n dry_run: z\n .boolean()\n .default(false)\n .describe(\"When true, report matches without writing any memory files.\"),\n scope: z\n .enum([\"personal\", \"team\"])\n .default(\"team\")\n .describe(\"Scope for proposed memories.\"),\n};\n\nexport type PatternDetectInput = {\n [K in keyof typeof PatternDetectInputSchema]: z.infer<(typeof PatternDetectInputSchema)[K]>;\n};\n\nexport type PatternKind = \"config_change\" | \"repeated_path\" | \"hot_file\";\n\nexport interface PatternMatch {\n kind: PatternKind;\n signal: string;\n proposed_type: \"convention\" | \"gotcha\";\n proposed_slug: string;\n proposed_body: string;\n anchor_paths: string[];\n}\n\nexport interface PatternDetectOutput {\n scanned_events: number;\n matches: PatternMatch[];\n /** Number of proposed memories saved (0 if dry_run). */\n saved: number;\n /** IDs of saved memories. */\n saved_ids: string[];\n notice?: string;\n}\n\n// ── Implementation ─────────────────────────────────────────────────────────\n\nexport async function patternDetect(\n input: PatternDetectInput,\n ctx: HaiveContext,\n): Promise<PatternDetectOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n return {\n scanned_events: 0, matches: [], saved: 0, saved_ids: [],\n notice: \"No .ai/ directory found. Run 'haive init' first.\",\n };\n }\n\n const matches: PatternMatch[] = [];\n\n // ── Signal 1: CONFIG_CHANGE ─────────────────────────────────────────────\n try {\n const changedFiles = gitChangedFiles(ctx.paths.root, input.since_days);\n const configFiles = changedFiles.filter((f) =>\n CONFIG_PATTERNS.some((p) => path.basename(f.toLowerCase()).includes(p)),\n );\n for (const file of configFiles.slice(0, 5)) {\n const diff = gitFileDiff(ctx.paths.root, file, input.since_days);\n if (!diff) continue;\n // Include the nearest parent dir so `cli/vitest.config.ts` and\n // `core/vitest.config.ts` produce distinct slugs instead of colliding.\n const parentDir = path.basename(path.dirname(file));\n const baseName = path.basename(file).replace(/\\.[^.]+$/, \"\");\n const slug = `${parentDir}-${baseName}`\n .replace(/[^a-z0-9]/gi, \"-\")\n .toLowerCase()\n .slice(0, 40);\n matches.push({\n kind: \"config_change\",\n signal: `Config file modified: ${file}`,\n proposed_type: \"convention\",\n proposed_slug: `config-change-${slug}`,\n proposed_body: [\n `# Config change: \\`${file}\\``,\n \"\",\n \"This configuration file was recently modified. The diff below captures the intent.\",\n \"Review and update this memory with the **reason** for the change if known.\",\n \"\",\n \"```diff\",\n diff.slice(0, MAX_DIFF_BYTES),\n \"```\",\n ].join(\"\\n\"),\n anchor_paths: [file],\n });\n }\n } catch { /* git not available or no history — skip */ }\n\n // ── Signals 2 & 3: usage log analysis ──────────────────────────────────\n const events = await readUsageEvents(ctx.paths);\n const cutoff = Date.now() - input.since_days * 24 * 60 * 60 * 1000;\n const recent = events.filter((e) => Date.parse(e.at) >= cutoff);\n\n // Build per-path occurrence counts from writing tools\n const pathCounts = new Map<string, { count: number; tools: Set<string> }>();\n for (const e of recent) {\n if (![\"mem_tried\", \"mem_observe\", \"mem_save\"].includes(e.tool)) continue;\n if (!e.summary) continue;\n // Extract file-like tokens from the summary\n const tokens = e.summary.match(/[^\\s\"'`,;()[\\]{}]+\\.[a-zA-Z]{1,6}/g) ?? [];\n for (const t of tokens) {\n const key = t.toLowerCase();\n const existing = pathCounts.get(key);\n if (existing) {\n existing.count++;\n existing.tools.add(e.tool);\n } else {\n pathCounts.set(key, { count: 1, tools: new Set([e.tool]) });\n }\n }\n }\n\n // Signal 2: REPEATED_PATH — path appears mostly in mem_tried / mem_observe\n for (const [p, { count, tools }] of pathCounts) {\n if (count < HOT_FILE_MIN) continue;\n const isGotchaSignal = tools.has(\"mem_tried\") || tools.has(\"mem_observe\");\n if (!isGotchaSignal) continue;\n const slug = p.replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\").slice(0, 40);\n matches.push({\n kind: \"repeated_path\",\n signal: `Path '${p}' appears ${count}× in mem_tried/mem_observe events`,\n proposed_type: \"gotcha\",\n proposed_slug: `repeated-issue-${slug}`,\n proposed_body: [\n `# Recurring issue near \\`${p}\\``,\n \"\",\n `This file appeared ${count} times in failed-approach or observation events ` +\n `over the last ${input.since_days} days. ` +\n \"Review the related attempt/gotcha memories and consolidate them into a single authoritative gotcha.\",\n \"\",\n `**Source signals:** ${[...tools].join(\", \")} (${count} events)`,\n ].join(\"\\n\"),\n anchor_paths: [p],\n });\n }\n\n // Signal 3: HOT_FILE — any path appearing ≥ HOT_FILE_MIN times in any writing tool\n for (const [p, { count, tools }] of pathCounts) {\n if (count < HOT_FILE_MIN) continue;\n if (tools.has(\"mem_tried\") || tools.has(\"mem_observe\")) continue; // already covered by Signal 2\n // Only flag non-config source files\n if (CONFIG_PATTERNS.some((cp) => path.basename(p).includes(cp))) continue;\n const slug = p.replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\").slice(0, 40);\n matches.push({\n kind: \"hot_file\",\n signal: `Path '${p}' referenced ${count}× across mem_save events`,\n proposed_type: \"convention\",\n proposed_slug: `hot-file-${slug}`,\n proposed_body: [\n `# Frequent edits to \\`${p}\\``,\n \"\",\n `This file was referenced ${count} times in memory-saving events over the last ` +\n `${input.since_days} days — a signal that a recurring pattern or convention applies here.`,\n \"\",\n \"**Suggested action:** review recent memories anchored to this path and extract the \" +\n \"common pattern as a named convention.\",\n ].join(\"\\n\"),\n anchor_paths: [p],\n });\n }\n\n if (matches.length === 0) {\n return {\n scanned_events: recent.length,\n matches: [],\n saved: 0,\n saved_ids: [],\n notice: `No patterns detected in the last ${input.since_days} days (${recent.length} events scanned).`,\n };\n }\n\n if (input.dry_run) {\n return { scanned_events: recent.length, matches, saved: 0, saved_ids: [] };\n }\n\n // ── Save proposed memories ──────────────────────────────────────────────\n const savedIds: string[] = [];\n for (const match of matches) {\n try {\n const fm = buildFrontmatter({\n type: match.proposed_type,\n slug: match.proposed_slug,\n scope: input.scope,\n tags: [\"pattern-detect\", match.kind],\n paths: match.anchor_paths,\n status: \"proposed\",\n });\n const file = memoryFilePath(\n ctx.paths,\n fm.scope === \"shared\" ? \"team\" : fm.scope,\n fm.id,\n undefined,\n );\n if (existsSync(file)) continue; // don't overwrite existing\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(\n file,\n serializeMemory({ frontmatter: fm, body: match.proposed_body }),\n \"utf8\",\n );\n savedIds.push(fm.id);\n } catch { /* skip failures — non-blocking */ }\n }\n\n return {\n scanned_events: recent.length,\n matches,\n saved: savedIds.length,\n saved_ids: savedIds,\n };\n}\n\n// ── Git helpers ────────────────────────────────────────────────────────────\n\nfunction gitChangedFiles(root: string, sinceDays: number): string[] {\n try {\n const out = execSync(\n `git log --name-only --pretty=\"\" --diff-filter=AM --since=\"${sinceDays} days ago\"`,\n { cwd: root, encoding: \"utf8\", timeout: 5000, stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n return [...new Set(out.split(\"\\n\").map((l) => l.trim()).filter(Boolean))];\n } catch {\n return [];\n }\n}\n\nfunction gitFileDiff(root: string, file: string, sinceDays: number): string | null {\n try {\n const out = execSync(\n `git log -p --follow --since=\"${sinceDays} days ago\" -- \"${file}\"`,\n { cwd: root, encoding: \"utf8\", timeout: 5000, stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n if (!out.trim()) return null;\n // Extract only the diff hunks (lines starting with +/- or @@)\n const diffLines = out.split(\"\\n\").filter((l) =>\n l.startsWith(\"+\") || l.startsWith(\"-\") || l.startsWith(\"@@\") || l.startsWith(\"diff\"),\n );\n return diffLines.join(\"\\n\").slice(0, MAX_DIFF_BYTES) || null;\n } catch {\n return null;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport {\n findLexicalConflictPairs,\n findTopicStatusConflictPairs,\n loadMemoriesFromDir,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemConflictCandidatesInputSchema = {\n since_days: z\n .number()\n .int()\n .positive()\n .max(3650)\n .default(365)\n .describe(\"Only memories created since N days ago\"),\n types: z\n .array(z.enum([\"decision\", \"architecture\", \"convention\", \"gotcha\"]))\n .default([\"decision\", \"architecture\"])\n .describe(\"Memory types scanned for pairwise lexical overlap\"),\n min_jaccard: z\n .number()\n .min(0)\n .max(1)\n .default(0.45)\n .describe(\"Minimum Jaccard token similarity to surface as a candidate pair\"),\n max_pairs: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(20)\n .describe(\"Cap pairs returned\"),\n max_scan: z\n .number()\n .int()\n .positive()\n .max(2000)\n .default(500)\n .describe(\"Maximum memories sampled for O(n²) scan — excess dropped after chronological sort.\"),\n max_topic_pairs: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(20)\n .describe(\n \"Cap for extra signal: memories sharing the same topic with validated vs rejected status.\",\n ),\n};\n\nexport type MemConflictCandidatesInput = {\n [K in keyof typeof MemConflictCandidatesInputSchema]: z.infer<\n (typeof MemConflictCandidatesInputSchema)[K]\n >;\n};\n\nexport async function memConflictCandidates(\n input: MemConflictCandidatesInput,\n ctx: HaiveContext,\n) {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n pairs: [],\n topic_status_pairs: [],\n scanned: 0,\n truncated: false,\n notice: \"No .ai/memories directory.\",\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const { pairs, scanned, truncated } = findLexicalConflictPairs(all, {\n sinceDays: input.since_days,\n types: input.types,\n minJaccard: input.min_jaccard,\n maxPairs: input.max_pairs,\n maxScan: input.max_scan,\n });\n const topicStatusPairs = findTopicStatusConflictPairs(all, input.max_topic_pairs);\n\n const notice =\n pairs.length === 0 && topicStatusPairs.length === 0\n ? \"No lexical or topic-status candidates — widen since_days/types or lower min_jaccard.\"\n : undefined;\n\n return { pairs, topic_status_pairs: topicStatusPairs, scanned, truncated, notice };\n}\n","import { resolveProjectInfo } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n/** Input is intentionally minimal — callers may pass cwd for multi-root clients. */\nexport const MemResolveProjectInputSchema = {\n cwd: z\n .string()\n .optional()\n .describe(\"Directory used for root discovery when HAIVE_PROJECT_ROOT is unset.\"),\n};\n\nexport type MemResolveProjectInput = {\n [K in keyof typeof MemResolveProjectInputSchema]: z.infer<(typeof MemResolveProjectInputSchema)[K]>;\n};\n\nexport async function memResolveProject(\n input: MemResolveProjectInput,\n _ctx: HaiveContext,\n): Promise<{ info: ReturnType<typeof resolveProjectInfo>; ok: true }> {\n void _ctx;\n return {\n ok: true,\n info: resolveProjectInfo({\n cwd: input.cwd,\n }),\n };\n}\n","import { MemoryTypeSchema, suggestTopicKey } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSuggestTopicInputSchema = {\n type: MemoryTypeSchema.describe(\"Memory kind — drives the suggested topic family.\"),\n title: z\n .string()\n .min(1)\n .describe(\"Short title or phrase (headers, headings) — turned into slug\"),\n};\n\nexport type MemSuggestTopicInput = {\n [K in keyof typeof MemSuggestTopicInputSchema]: z.infer<(typeof MemSuggestTopicInputSchema)[K]>;\n};\n\nexport async function memSuggestTopic(\n input: MemSuggestTopicInput,\n _ctx: HaiveContext,\n): Promise<{ topic_key: string; family: string; type: string }> {\n void _ctx;\n const suggestion = suggestTopicKey(input.type, input.title);\n return { topic_key: suggestion.topic_key, family: suggestion.family, type: input.type };\n}\n","import { existsSync } from \"node:fs\";\nimport { collectTimelineEntries, loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemTimelineInputSchema = {\n memory_id: z.string().optional().describe(\"Seed id — expands via related_ids, topic, anchors\"),\n topic: z\n .string()\n .optional()\n .describe(\"Frontmatter.topic value — chronological list when memory_id omitted\"),\n limit: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(30)\n .describe(\"Max timeline entries returned\"),\n};\n\nexport type MemTimelineInput = {\n [K in keyof typeof MemTimelineInputSchema]: z.infer<(typeof MemTimelineInputSchema)[K]>;\n};\n\nexport async function memTimeline(input: MemTimelineInput, ctx: HaiveContext) {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { entries: [], total: 0, notice: \"No .ai/memories directory.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const { entries, notice } = collectTimelineEntries(all, {\n memoryId: input.memory_id,\n topic: input.topic,\n limit: input.limit,\n });\n return { entries, total: entries.length, notice };\n}\n","import { appendRuntimeJournalEntry } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const RuntimeJournalAppendInputSchema = {\n message: z.string().min(1).describe(\"Short line to append to the runtime session journal\"),\n kind: z.enum([\"note\", \"session_end\", \"mcp\"]).default(\"note\"),\n tool: z.string().optional().describe(\"When kind=mcp, which tool name (optional)\"),\n};\n\nexport type RuntimeJournalAppendInput = {\n [K in keyof typeof RuntimeJournalAppendInputSchema]: z.infer<\n (typeof RuntimeJournalAppendInputSchema)[K]\n >;\n};\n\nexport async function runtimeJournalAppend(\n input: RuntimeJournalAppendInput,\n ctx: HaiveContext,\n): Promise<{ ok: true; path_hint: string }> {\n await appendRuntimeJournalEntry(ctx.paths, {\n kind: input.kind,\n message: input.message,\n ...(input.tool ? { tool: input.tool } : {}),\n });\n return {\n ok: true,\n path_hint: `${ctx.paths.runtimeDir}/session-journal.ndjson`,\n };\n}\n","import { readRuntimeJournalTail } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const RuntimeJournalTailInputSchema = {\n limit: z\n .number()\n .int()\n .positive()\n .max(500)\n .default(30)\n .describe(\"Last N journal entries to return\"),\n};\n\nexport type RuntimeJournalTailInput = {\n [K in keyof typeof RuntimeJournalTailInputSchema]: z.infer<\n (typeof RuntimeJournalTailInputSchema)[K]\n >;\n};\n\nexport async function runtimeJournalTail(\n input: RuntimeJournalTailInput,\n ctx: HaiveContext,\n): Promise<{ entries: Awaited<ReturnType<typeof readRuntimeJournalTail>>; empty?: boolean }> {\n const entries = await readRuntimeJournalTail(ctx.paths, input.limit);\n if (entries.length === 0) {\n return { entries: [], empty: true };\n }\n return { entries };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectArgsSchema = {\n module: z\n .string()\n .optional()\n .describe(\n \"Optional module name to scope the analysis to (writes to .ai/modules/<module>/context.md)\",\n ),\n focus: z\n .string()\n .optional()\n .describe(\"Optional area to emphasize (e.g. 'data layer', 'API surface')\"),\n};\n\nexport type BootstrapProjectArgs = {\n [K in keyof typeof BootstrapProjectArgsSchema]: z.infer<\n (typeof BootstrapProjectArgsSchema)[K]\n >;\n};\n\nconst ROOT_TEMPLATE = `# Project context\n\n## Architecture\n<one or two paragraphs on the high-level architecture>\n\n## Key modules\n- <module-name>: <one line on its purpose>\n- ...\n\n## Conventions\n- <convention>: <why it matters here>\n- ...\n\n## Glossary\n- <term>: <definition in this codebase>\n- ...\n\n## Gotchas\n- <surprising behavior, hidden coupling, or known traps>\n- ...\n`;\n\nconst MODULE_TEMPLATE = `# Module context — {module}\n\n## Purpose\n<what this module is for>\n\n## Public surface\n- <exported symbol>: <one line>\n- ...\n\n## Internals\n<key files / classes / functions and how they connect>\n\n## Conventions specific to this module\n- ...\n\n## Gotchas\n- ...\n`;\n\nexport function bootstrapProjectPrompt(\n args: BootstrapProjectArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const target = args.module\n ? `\\`.ai/modules/${args.module}/context.md\\``\n : \"`.ai/project-context.md`\";\n const template = args.module\n ? MODULE_TEMPLATE.replace(\"{module}\", args.module)\n : ROOT_TEMPLATE;\n const focusLine = args.focus\n ? `\\nEmphasis area for this analysis: **${args.focus}**.\\n`\n : \"\";\n\n const text = `You are bootstrapping a hAIve shared project context for the team.\n\nProject root: \\`${ctx.paths.root}\\`\nTarget file: ${target}\n${focusLine}\n## What to do\n\n1. Explore the codebase: read the package manifests, top-level directories, build configs, and a representative sample of source files. Do not read every file — pick what gives you the highest signal per file (entry points, config, README if present, main domain models).\n2. Synthesize a concise, high-signal context document. Prefer load-bearing facts over exhaustive enumeration. A new teammate (human or AI) should be able to read it in 5 minutes and feel oriented.\n3. Match the structure of the template below. Keep each section short — link to files instead of repeating large code chunks.\n4. When you are done, call the \\`bootstrap_project_save\\` tool with the full Markdown content. Use \\`overwrite=true\\` only if the file already exists and you intend to replace it.\n\n## Template to fill\n\n\\`\\`\\`markdown\n${template}\\`\\`\\`\n\n## Tips\n\n- Anchor claims to file paths so future readers can verify them.\n- Write what is true *now*, not aspirational. Note open questions explicitly.\n- Skip sections that have nothing meaningful to say rather than padding them.\n`;\n\n return {\n description: args.module\n ? `Bootstrap context for module \"${args.module}\"`\n : \"Bootstrap the root project context\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const PostTaskArgsSchema = {\n task_summary: z\n .string()\n .optional()\n .describe(\"One sentence describing what you just did\"),\n files_touched: z\n .array(z.string())\n .optional()\n .describe(\"Files you created or modified during the task\"),\n};\n\nexport type PostTaskArgs = {\n [K in keyof typeof PostTaskArgsSchema]: z.infer<(typeof PostTaskArgsSchema)[K]>;\n};\n\nexport function postTaskPrompt(\n args: PostTaskArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const taskLine = args.task_summary ? `\\nTask just completed: **${args.task_summary}**` : \"\";\n const filesLine =\n args.files_touched && args.files_touched.length > 0\n ? `\\nFiles touched: ${args.files_touched.map((f) => `\\`${f}\\``).join(\", \")}`\n : \"\";\n\n const text = `You have just finished a task. Before closing this session, take 60 seconds to capture what you learned.\n${taskLine}${filesLine}\n\nProject root: \\`${ctx.paths.root}\\`\n\n## Checklist — answer each question honestly\n\nGo through each item. If the answer is yes, call the corresponding tool immediately.\n\n### 0. Did you read existing code and discover bugs, inconsistencies, or security gaps that weren't in the briefing?\nThis is the most important question. Deep code reading surfaces issues that no memory captures yet.\nExamples of things to look for:\n- A method with an invalid signature (e.g. two \\`@RequestBody\\` on the same handler)\n- A configuration that looks wrong or missing (e.g. webhook path not whitelisted in SecurityConfig)\n- A component scan / DI issue (e.g. a Spring bean not picked up because the package isn't scanned)\n- A DB constraint that will break when you add a new enum value\n- A hardcoded value that should be dynamic (e.g. hardcoded tenant id \"default-tenant\")\n- Anything that will silently break in production\n\n→ If yes, call **\\`mem_save\\`** with \\`type=\"gotcha\"\\`, \\`scope=\"team\"\\`, and **anchor it to the file** with \\`paths\\`.\n This transforms your discovery into institutional knowledge that protects every future agent.\n\n### 1. Did you try an approach that failed?\n→ If yes, call **\\`mem_tried\\`** with:\n - \\`what\\`: the approach you tried (e.g. \"importing gray-matter with ESM dynamic import\")\n - \\`why_failed\\`: why it didn't work\n - \\`instead\\`: what worked instead\n - \\`scope\\`: \"team\" if others will hit the same issue, \"personal\" if specific to your setup\n - \\`paths\\`: the files where the issue manifested\n\n### 2. Did you discover a convention that isn't documented?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"convention\"\\` and \\`scope=\"team\"\\`\n\n### 3. Did you make an architectural decision?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"decision\"\\` and document the WHY (constraints, tradeoffs), not just the what\n\n### 4. Did you hit a non-obvious bug or surprising behavior in a library or framework?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"gotcha\"\\` and anchor it to the relevant file paths\n\n### 5. Did you find that an existing memory is outdated or wrong?\n→ If yes, call **\\`mem_update\\`** with the correct information, or **\\`mem_reject\\`** if it's completely wrong\n\n## Rules\n\n- One memory per insight. Don't cram multiple lessons into one body.\n- Anchor memories to file paths when possible (the \\`paths\\` field) — this enables staleness detection.\n- Prefer \\`scope=\"team\"\\` for anything a teammate or future agent would benefit from.\n- Skip sections where you genuinely have nothing to add. Don't fabricate memories.\n- **Question 0 is not optional** — always scan your exploration history for code-level discoveries.\n\n### 6. Close the session — always\nCall **\\`mem_session_end\\`** with:\n- \\`goal\\`: what you set out to do\n- \\`accomplished\\`: what was actually done (bullet list)\n- \\`discoveries\\`: anything surprising or broken found during this session (leave empty if none)\n- \\`files_touched\\`: the key files you read or modified\n- \\`next_steps\\`: what remains for the next session or a teammate\n- \\`scope\\`: \"team\" if this task affects the whole team, \"personal\" otherwise\n\nThis creates/updates a single rolling recap that **get_briefing automatically surfaces** at the start of every subsequent session — no token waste re-explaining what happened.\n\nCalling \\`mem_session_end\\` also **clears the pending-distill marker** (if any), confirming that this session's learnings have been properly captured rather than left as an auto-recap skeleton.\n\nWhen done, respond with a brief summary: \"Saved N memories: [list of IDs]. Session recap saved.\"\n`;\n\n\n return {\n description: \"Post-task reflection: capture what you learned before closing the session\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const ImportDocsArgsSchema = {\n content: z\n .string()\n .describe(\"The documentation content to analyze and import as memories (Markdown, README, ADR, etc.)\"),\n source: z\n .string()\n .optional()\n .describe(\"Origin of the content (file path, URL, or document title) — used to anchor memories\"),\n scope: z\n .enum([\"personal\", \"team\"])\n .default(\"team\")\n .describe(\"Scope to assign to created memories\"),\n dry_run: z\n .boolean()\n .default(false)\n .describe(\"If true, describe what would be saved without actually calling mem_save\"),\n};\n\nexport type ImportDocsArgs = {\n [K in keyof typeof ImportDocsArgsSchema]: z.infer<(typeof ImportDocsArgsSchema)[K]>;\n};\n\nexport function importDocsPrompt(\n args: ImportDocsArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const sourceLine = args.source ? `\\nSource: **${args.source}**` : \"\";\n const dryRunNote = args.dry_run\n ? \"\\n> **DRY RUN** — describe what you would save but do not call any tools.\"\n : \"\";\n\n const text = `You are given documentation to analyze and import into the hAIve memory system.\n${sourceLine}\nScope: **${args.scope}**\nProject root: \\`${ctx.paths.root}\\`\n${dryRunNote}\n\n## Your task\n\nRead the documentation below and extract actionable memories. For each distinct piece of knowledge:\n\n1. **Identify the memory type** — which category fits best?\n - \\`convention\\` — how things are done here (naming, patterns, workflow)\n - \\`decision\\` — a choice that was made and why (tradeoffs, constraints)\n - \\`gotcha\\` — non-obvious behavior, traps, things that surprise newcomers\n - \\`architecture\\` — structural overview of a system or module\n - \\`glossary\\` — domain terms and their meaning in this project\n\n2. **Determine the anchor** — which files or symbols does this knowledge apply to? List them in \\`paths\\`.\n\n3. **Write a focused body** — one memory = one insight. Do not combine multiple unrelated facts.\n - Start with the key fact or rule\n - Add context: why it matters, when it applies\n - Add examples if helpful\n\n4. **Call \\`mem_save\\`** for each memory (unless dry_run).\n - Set \\`scope=\"${args.scope}\"\\`\n - Set \\`slug\\` to a short kebab-case identifier\n - Set \\`paths\\` to the relevant file paths (extracted from the doc if present)\n\n## Rules\n\n- Skip generic documentation that applies to any project (e.g., \"install with npm install\").\n- Prioritize gotchas, non-obvious decisions, and domain-specific conventions.\n- If the same knowledge is repeated in different sections, save it once.\n- Maximum 10 memories per import — select the most actionable ones.\n\n## Documentation to import\n\n---\n\n${args.content}\n\n---\n\nWhen done, respond with: \"Imported N memories: [list of IDs]\" or \"Nothing actionable found.\"\n`;\n\n return {\n description: \"Import documentation as hAIve memories\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\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 { Embedder, rebuildIndex } = await import(\"@hiveai/embeddings\");\n log(ui.dim(\"embed: rebuilding index…\"));\n const embedder = await Embedder.create();\n const { report } = await rebuildIndex(paths, embedder);\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 .alias(\"search\")\n .description(\"Search memories by id, tag, or substring (AND, OR fallback). Alias: search\")\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 const version = versionMatch?.[1];\n if (!version) continue;\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 const breakingText = breakingMatch?.[1]?.trim();\n if (breakingText && !entry.breaking.includes(breakingText)) {\n entry.breaking.push(breakingText);\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 const latest = entries[0];\n entries = latest ? [latest] : [];\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 &nbsp;&nbsp; [ ] reject &nbsp;&nbsp; [ ] 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, readFile, rm } 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 auto?: boolean;\n quiet?: boolean;\n}\n\ninterface Observation {\n ts: string;\n session_id?: string;\n cwd?: string;\n tool: string;\n summary: string;\n files?: string[];\n}\n\nasync function buildAutoRecap(\n paths: ReturnType<typeof resolveHaivePaths>,\n): Promise<{ goal: string; accomplished: string; files: string[]; rawCount: number } | null> {\n const obsFile = path.join(paths.haiveDir, \".cache\", \"observations.jsonl\");\n if (!existsSync(obsFile)) return null;\n const raw = await readFile(obsFile, \"utf8\").catch(() => \"\");\n if (!raw.trim()) return null;\n const lines = raw.split(\"\\n\").filter(Boolean);\n const obs: Observation[] = [];\n for (const line of lines) {\n try { obs.push(JSON.parse(line) as Observation); } catch { /* skip */ }\n }\n if (obs.length === 0) return null;\n\n const toolCounts = new Map<string, number>();\n const fileCounts = new Map<string, number>();\n const summaries: string[] = [];\n for (const o of obs) {\n toolCounts.set(o.tool, (toolCounts.get(o.tool) ?? 0) + 1);\n for (const f of o.files ?? []) fileCounts.set(f, (fileCounts.get(f) ?? 0) + 1);\n if (summaries.length < 10) summaries.push(`- ${o.summary}`);\n }\n\n const topTools = [...toolCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([t, c]) => `${t} ×${c}`)\n .join(\", \");\n const topFiles = [...fileCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 8);\n\n const goal = `Auto-captured session — ${obs.length} tool calls (${topTools})`;\n const accomplished = summaries.length\n ? `Recent activity:\\n${summaries.join(\"\\n\")}`\n : `Activity captured but no parseable summaries.`;\n\n return {\n goal,\n accomplished,\n files: topFiles.map(([f]) => f),\n rawCount: obs.length,\n };\n}\n\nfunction buildRecapBody(opts: {\n goal: string;\n accomplished: string;\n discoveries?: string;\n files?: string;\n next?: string;\n}): 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 .option(\"--goal <text>\", \"what you were trying to accomplish (1–2 sentences)\")\n .option(\"--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(\"--auto\", \"synthesize the recap from .ai/.cache/observations.jsonl (used by Claude Code SessionEnd hook)\")\n .option(\"--quiet\", \"suppress non-error output (for hook use)\")\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 if (opts.auto || opts.quiet) return; // hook context — silently no-op\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n // Auto mode: derive goal/accomplished/files from captured observations\n let resolvedFiles = opts.files;\n let goal = opts.goal;\n let accomplished = opts.accomplished;\n if (opts.auto) {\n const synth = await buildAutoRecap(paths);\n if (!synth) return; // nothing observed — silently no-op\n goal = goal ?? synth.goal;\n accomplished = accomplished ?? synth.accomplished;\n if (!resolvedFiles && synth.files.length) resolvedFiles = synth.files.join(\",\");\n }\n\n if (!goal || !accomplished) {\n if (opts.quiet) return;\n ui.error(\"session-end requires --goal and --accomplished (or pass --auto with captured observations).\");\n process.exitCode = 1;\n return;\n }\n\n const scope = opts.scope ?? \"personal\";\n const body = buildRecapBody({\n goal,\n accomplished,\n discoveries: opts.discoveries,\n files: resolvedFiles,\n next: opts.next,\n });\n const topic = recapTopic(scope, opts.module);\n const filesTouched = parseCsv(resolvedFiles);\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 && !opts.quiet) {\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 const cleanupObservations = async (): Promise<void> => {\n if (!opts.auto) return;\n const obsFile = path.join(paths.haiveDir, \".cache\", \"observations.jsonl\");\n if (existsSync(obsFile)) await rm(obsFile).catch(() => { /* non-fatal */ });\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 verified_at: new Date().toISOString(),\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 await cleanupObservations();\n if (!opts.quiet) {\n ui.success(`Session recap updated (revision #${revisionCount})`);\n ui.info(`id=${fm.id} file=${path.relative(root, topicMatch.filePath)}`);\n ui.info(\"Tip: `haive stats --export-report` generates a usage JSON suitable for dashboards.\");\n }\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 await cleanupObservations();\n\n if (!opts.quiet) {\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 ui.info(\"Tip: export a local MCP usage rollup with `haive stats --export-report .ai/tool-usage-roi-report.json`.\");\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","/**\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 { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n aggregateUsage,\n findProjectRoot,\n loadMemoriesFromDir,\n loadUsageIndex,\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 memoryHits?: boolean;\n exportReport?: string;\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(\"--memory-hits\", \"show top-read memories (which mems are actually being used)\", false)\n .option(\n \"--export-report <path>\",\n \"write a JSON rollup (tools + briefing counts + heuristic ROI hints). Parent dirs are created if needed.\",\n undefined,\n )\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 if (opts.exportReport) {\n await writeRoiReport(paths, root, opts.since ?? \"30d\", opts.exportReport);\n return;\n }\n\n if (opts.memoryHits) {\n await renderMemoryHits(paths, opts);\n return;\n }\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\nasync function writeRoiReport(\n paths: ReturnType<typeof resolveHaivePaths>,\n root: string,\n sinceRaw: string,\n outRelative: string,\n): Promise<void> {\n const outAbs = path.isAbsolute(outRelative)\n ? path.resolve(outRelative)\n : path.resolve(root, outRelative);\n\n const size = await usageLogSize(paths);\n let events = await readUsageEvents(paths);\n\n let memoryCount = { team: 0, personal: 0, total_skipped_session: 0 };\n if (existsSync(paths.memoriesDir)) {\n const mems = await loadMemoriesFromDir(paths.memoriesDir);\n for (const { memory } of mems) {\n const fm = memory.frontmatter;\n if (fm.type === \"session_recap\") memoryCount.total_skipped_session++;\n else if (fm.scope === \"team\") memoryCount.team++;\n else if (fm.scope === \"personal\") memoryCount.personal++;\n }\n }\n\n const sinceDt = parseSince(sinceRaw) ?? undefined;\n const aggregate = aggregateUsage(events, sinceDt);\n const inWindow = (at: string): boolean =>\n sinceDt === undefined || Date.parse(at) >= sinceDt.getTime();\n\n const briefingCalls = events.filter((e) => inWindow(e.at) && e.tool === \"get_briefing\").length;\n\n let memoryHitsLeader: { id: string; read_count: number } | null = null;\n try {\n const usageIdx = await loadUsageIndex(paths);\n const tops = Object.entries(usageIdx.by_id)\n .map(([id, v]) => ({ id, read_count: v.read_count }))\n .filter((x) => x.read_count > 0)\n .sort((a, b) => b.read_count - a.read_count);\n memoryHitsLeader = tops[0] ?? null;\n } catch {\n memoryHitsLeader = null;\n }\n\n const roiHints = [\n \"Correlate get_briefing calls with skipped multi-file exploration — proxies available via `pnpm benchmark:roi` at repo root.\",\n \"Prefer get_briefing(format:'actions') or budget_preset:'quick' for low-risk edits to reduce token pressure.\",\n \"Run `haive memory lint` in CI to keep the corpus actionable.\",\n \"Install the haive VS Code extension (packages/vscode) for always-on memory surfacing beside the editor.\",\n ];\n\n if (!size.exists || events.length === 0) {\n ui.warn(\"Usage log missing or empty — report still written with partial data.\");\n events = [];\n }\n\n await mkdir(path.dirname(outAbs), { recursive: true });\n const payload = {\n generated_at: new Date().toISOString(),\n project_root: root,\n window_since: sinceRaw,\n usage_log_meta: size,\n memory_inventory: memoryCount,\n aggregate,\n get_briefing_calls_in_window: briefingCalls,\n top_memory_reads: memoryHitsLeader,\n roi_hints: roiHints,\n };\n\n await writeFile(outAbs, JSON.stringify(payload, null, 2), \"utf8\");\n ui.success(`Wrote ROI / usage rollup → ${outAbs}`);\n}\n\nasync function renderMemoryHits(\n paths: ReturnType<typeof resolveHaivePaths>,\n opts: StatsOptions,\n): Promise<void> {\n const index = await loadUsageIndex(paths);\n const since = parseSince(opts.since ?? \"30d\");\n const sinceMs = since ? new Date(since).getTime() : null;\n const entries = Object.entries(index.by_id)\n .map(([id, usage]) => ({ id, ...usage }))\n .filter((e) => e.read_count > 0)\n .filter((e) => {\n if (!sinceMs || !e.last_read_at) return !sinceMs;\n return new Date(e.last_read_at).getTime() >= sinceMs;\n })\n .sort((a, b) => b.read_count - a.read_count);\n\n if (opts.json) {\n console.log(JSON.stringify({\n window: opts.since ?? \"30d\",\n total_mems_with_hits: entries.length,\n top: entries.slice(0, 50),\n }, null, 2));\n return;\n }\n\n const window = opts.since ?? \"30d\";\n console.log(ui.bold(`Memory hits (${window})`));\n if (entries.length === 0) {\n ui.info(\n `No memory reads recorded in window. Reads are logged when ` +\n `\\`haive briefing\\` or \\`haive memory query\\` surface a memory.`,\n );\n return;\n }\n console.log(\n ` ${ui.dim(\"memories with hits:\")} ${entries.length} ` +\n `${ui.dim(\"total reads:\")} ${entries.reduce((a, e) => a + e.read_count, 0)}`,\n );\n console.log();\n console.log(ui.bold(\"Top read memories:\"));\n const maxCount = entries[0]!.read_count;\n for (const e of entries.slice(0, 25)) {\n const bar = \"█\".repeat(Math.max(1, Math.round((e.read_count / maxCount) * 20)));\n const lastRead = e.last_read_at?.slice(0, 10) ?? \"?\";\n console.log(\n ` ${ui.bold(String(e.read_count).padStart(4))} ${ui.green(bar.padEnd(20))} ` +\n `${e.id} ${ui.dim(`last: ${lastRead}`)}`,\n );\n }\n const dead = Object.keys(index.by_id).length - entries.length;\n if (dead > 0) {\n console.log();\n ui.info(`${dead} memor${dead === 1 ? \"y\" : \"ies\"} never read in window — candidates for cleanup (run \\`haive doctor\\`).`);\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 { existsSync } from \"node:fs\";\nimport { readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { estimateTokens, findProjectRoot } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface BenchmarkOptions {\n dir?: string;\n out?: string;\n json?: boolean;\n}\n\ninterface AgentBenchmarkRow {\n fixture: string;\n group: \"haive\" | \"plain\" | \"unknown\";\n commands: number;\n files_read: number;\n files_modified: number;\n test_iterations: number;\n terminal_failures: number;\n decision_mentions: number;\n token_proxy: number;\n haive_impact: boolean;\n}\n\nexport function registerBenchmark(program: Command): void {\n const benchmark = program\n .command(\"benchmark\")\n .description(\"Official hAIve benchmark/demo utilities for measuring agent enforcement value.\");\n\n benchmark\n .command(\"report\")\n .description(\"Summarize BENCHMARK_AGENT_REPORT.md files from a paired hAIve/plain agent benchmark.\")\n .option(\"-d, --dir <dir>\", \"benchmark root\", \"benchmarks/agent-benchmark\")\n .option(\"--out <file>\", \"write a Markdown report\")\n .option(\"--json\", \"emit JSON\", false)\n .action(async (opts: BenchmarkOptions) => {\n const root = resolveBenchmarkRoot(opts.dir);\n const rows = await collectRows(root);\n const summary = summarizeRows(rows);\n\n if (opts.json) {\n console.log(JSON.stringify({ root, summary, rows }, null, 2));\n return;\n }\n\n const markdown = renderMarkdown(root, summary, rows);\n if (opts.out) {\n const outFile = path.isAbsolute(opts.out) ? opts.out : path.join(root, opts.out);\n await writeFile(outFile, markdown, \"utf8\");\n ui.success(`wrote ${path.relative(process.cwd(), outFile)}`);\n return;\n }\n console.log(markdown);\n });\n\n benchmark\n .command(\"demo\")\n .description(\"Print the recommended protocol for running a hAIve vs plain agent benchmark.\")\n .action(() => {\n console.log([\n \"# hAIve Agent Benchmark Demo\",\n \"\",\n \"1. Create paired fixtures: one `*-haive`, one `*-plain`.\",\n \"2. Put the same failing tests in both fixtures.\",\n \"3. Add precise `.ai/memories/team/*.md` policy memories only to the hAIve fixture.\",\n \"4. Run equal agents in parallel:\",\n \" - hAIve agents must run `haive briefing --files ... --task ...` first.\",\n \" - Plain agents must not read `.ai` or call hAIve.\",\n \"5. Require every agent to write `BENCHMARK_AGENT_REPORT.md`.\",\n \"6. Run `haive benchmark report --dir <benchmark-root> --out RESULTS.md`.\",\n \"\",\n \"Recommended metrics: pass rate, test iterations, files read, files changed, visible artifacts, decision quality, and token proxy.\",\n ].join(\"\\n\"));\n });\n}\n\nfunction resolveBenchmarkRoot(dir: string | undefined): string {\n const candidate = dir ?? \"benchmarks/agent-benchmark\";\n if (path.isAbsolute(candidate)) return candidate;\n const projectRoot = findProjectRoot(process.cwd());\n return path.join(projectRoot, candidate);\n}\n\nasync function collectRows(root: string): Promise<AgentBenchmarkRow[]> {\n if (!existsSync(root)) throw new Error(`Benchmark directory not found: ${root}`);\n const entries = await readdir(root, { withFileTypes: true });\n const rows: AgentBenchmarkRow[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const fixtureDir = path.join(root, entry.name);\n const reportFile = path.join(fixtureDir, \"BENCHMARK_AGENT_REPORT.md\");\n if (!existsSync(reportFile)) continue;\n const report = await readFile(reportFile, \"utf8\");\n rows.push(parseAgentReport(entry.name, report));\n }\n return rows.sort((a, b) => a.fixture.localeCompare(b.fixture));\n}\n\nfunction parseAgentReport(fixture: string, report: string): AgentBenchmarkRow {\n const group = fixture.endsWith(\"-haive\") ? \"haive\" : fixture.endsWith(\"-plain\") ? \"plain\" : \"unknown\";\n return {\n fixture,\n group,\n commands: sectionBulletCount(report, \"Commands\"),\n files_read: sectionBulletCount(report, \"Files Read\"),\n files_modified: sectionBulletCount(report, \"Files Modified\"),\n test_iterations: countMatches(section(report, \"Test Iterations\"), /Iteration\\s+\\d+|^- /gim),\n terminal_failures: countMatches(section(report, \"Terminal Errors\"), /fail|error|not raised|exited with code 1/gi),\n decision_mentions: sectionBulletCount(report, \"Key Decisions\"),\n token_proxy: estimateTokens(report),\n haive_impact: /hAIve Memory Impact[\\s\\S]*?\\b(yes|directly|changed|shaped|confirmed)\\b/i.test(report),\n };\n}\n\nfunction summarizeRows(rows: AgentBenchmarkRow[]) {\n const byGroup = (group: AgentBenchmarkRow[\"group\"]) => rows.filter((r) => r.group === group);\n return {\n fixtures: rows.length,\n haive: summarizeGroup(byGroup(\"haive\")),\n plain: summarizeGroup(byGroup(\"plain\")),\n };\n}\n\nfunction summarizeGroup(rows: AgentBenchmarkRow[]) {\n const sum = (key: keyof AgentBenchmarkRow): number =>\n rows.reduce((total, row) => total + Number(row[key] ?? 0), 0);\n return {\n fixtures: rows.length,\n commands: sum(\"commands\"),\n files_read: sum(\"files_read\"),\n files_modified: sum(\"files_modified\"),\n test_iterations: sum(\"test_iterations\"),\n terminal_failures: sum(\"terminal_failures\"),\n decision_mentions: sum(\"decision_mentions\"),\n token_proxy: sum(\"token_proxy\"),\n haive_impact_count: rows.filter((r) => r.haive_impact).length,\n };\n}\n\nfunction renderMarkdown(\n root: string,\n summary: ReturnType<typeof summarizeRows>,\n rows: AgentBenchmarkRow[],\n): string {\n const lines = [\n \"# hAIve Agent Benchmark Report\",\n \"\",\n `Benchmark root: \\`${root}\\``,\n \"\",\n \"## Summary\",\n \"\",\n \"| Group | Fixtures | Commands | Files read | Files modified | Test iterations | Terminal failures | Decision mentions | Token proxy | hAIve impact |\",\n \"| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |\",\n groupLine(\"hAIve\", summary.haive),\n groupLine(\"Plain\", summary.plain),\n \"\",\n \"## Fixtures\",\n \"\",\n \"| Fixture | Group | Commands | Files read | Files modified | Test iterations | Terminal failures | Decisions | Token proxy | hAIve impact |\",\n \"| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |\",\n ...rows.map((row) =>\n `| \\`${row.fixture}\\` | ${row.group} | ${row.commands} | ${row.files_read} | ${row.files_modified} | ${row.test_iterations} | ${row.terminal_failures} | ${row.decision_mentions} | ${row.token_proxy} | ${row.haive_impact ? \"yes\" : \"no\"} |`,\n ),\n \"\",\n \"## Reading\",\n \"\",\n \"The token proxy is estimated from the agent report size, not from private model billing data.\",\n \"Use this report to compare relative effort and decision quality, then pair it with final test results and a human review of the diffs.\",\n \"\",\n ];\n return lines.join(\"\\n\");\n}\n\nfunction groupLine(label: string, group: ReturnType<typeof summarizeGroup>): string {\n return `| ${label} | ${group.fixtures} | ${group.commands} | ${group.files_read} | ${group.files_modified} | ${group.test_iterations} | ${group.terminal_failures} | ${group.decision_mentions} | ${group.token_proxy} | ${group.haive_impact_count} |`;\n}\n\nfunction sectionBulletCount(markdown: string, title: string): number {\n return countMatches(section(markdown, title), /^- |^\\d+\\.\\s/gm);\n}\n\nfunction section(markdown: string, title: string): string {\n const re = new RegExp(`##\\\\s+[^\\\\n]*${escapeRegExp(title)}[^\\\\n]*\\\\n([\\\\s\\\\S]*?)(?=\\\\n##\\\\s+|$)`, \"i\");\n return re.exec(markdown)?.[1] ?? \"\";\n}\n\nfunction countMatches(text: string, re: RegExp): number {\n return [...text.matchAll(re)].length;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\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 { execSync } from \"node:child_process\";\nimport { Command } from \"commander\";\n\ndeclare const __HAIVE_VERSION__: string;\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.enforcement?.requireBriefingFirst) {\n const claudeSettings = path.join(root, \".claude\", \"settings.local.json\");\n let hasClaudeEnforcement = false;\n if (existsSync(claudeSettings)) {\n try {\n const { readFile } = await import(\"node:fs/promises\");\n const raw = await readFile(claudeSettings, \"utf8\");\n hasClaudeEnforcement =\n raw.includes(\"haive enforce session-start\") &&\n raw.includes(\"haive enforce pre-tool-use\");\n } catch {\n hasClaudeEnforcement = false;\n }\n }\n if (!hasClaudeEnforcement) {\n findings.push({\n severity: \"info\",\n code: \"claude-enforcement-hooks-missing\",\n message: \"hAIve enforcement is enabled, but project-scoped Claude Code hooks are not installed.\",\n fix: \"haive install-hooks claude --scope project\",\n });\n }\n }\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 // ── 7. Legacy standalone haive-mcp ──────────────────────────────────────\n // MCP runs inside `haive mcp --stdio` — updating @hiveai/cli is enough.\n // Warn only if an old global haive-mcp exists and disagrees with CLI.\n try {\n const legacyRaw = execSync(\"haive-mcp --version\", {\n encoding: \"utf8\",\n timeout: 3000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n const cliVersion = __HAIVE_VERSION__;\n if (legacyRaw && legacyRaw !== cliVersion) {\n findings.push({\n severity: \"warn\",\n code: \"legacy-haive-mcp-stale\",\n message:\n `Standalone haive-mcp on PATH is v${legacyRaw} but haive CLI is v${cliVersion}. ` +\n `Prefer MCP client config with command \\\"haive\\\" and args [\\\"mcp\\\", \\\"--stdio\\\"] — ` +\n `then removing @hiveai/mcp avoids version skew.`,\n fix:\n `npm install -g @hiveai/cli@${cliVersion}\\n` +\n `# optionally uninstall duplicate:\\n` +\n `npm uninstall -g @hiveai/mcp`,\n });\n }\n } catch {\n // haive-mcp not on PATH — expected when using bundled MCP via haive only\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 `blocking: ${result.summary.blocking_warnings ?? 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","/**\n * Curated onboarding: print high-signal team memories in read order — no MCP required.\n */\nimport { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadMemoriesFromDir,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nconst TYPE_RANK: Record<string, number> = {\n decision: 0,\n architecture: 1,\n convention: 2,\n glossary: 3,\n gotcha: 4,\n attempt: 5,\n};\n\ninterface WelcomeOpts {\n limit?: string;\n dir?: string;\n}\n\nexport function registerWelcome(program: Command): void {\n program\n .command(\"welcome\")\n .description(\n \"Onboarding checklist: ranks validated/proposed **team** memories by type.\\n\" +\n \"Use after `haive init` so new devs skim institutional knowledge quickly.\\n\\n\" +\n \" haive welcome\\n\" +\n \" haive welcome --limit 15\\n\",\n )\n .option(\"--limit <n>\", \"maximum memories listed\", \"20\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: WelcomeOpts) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No memories at ${paths.memoriesDir}. Run 'haive init' first.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const team = all.filter(\n ({ memory }) =>\n memory.frontmatter.scope === \"team\" &&\n memory.frontmatter.status !== \"rejected\" &&\n memory.frontmatter.status !== \"deprecated\" &&\n memory.frontmatter.status !== \"stale\" &&\n memory.frontmatter.type !== \"session_recap\",\n );\n\n team.sort((a, b) => {\n const ta = TYPE_RANK[a.memory.frontmatter.type] ?? 99;\n const tb = TYPE_RANK[b.memory.frontmatter.type] ?? 99;\n if (ta !== tb) return ta - tb;\n const sta = a.memory.frontmatter.status === \"validated\" ? 0 : 1;\n const stb = b.memory.frontmatter.status === \"validated\" ? 0 : 1;\n if (sta !== stb) return sta - stb;\n return b.memory.frontmatter.created_at.localeCompare(a.memory.frontmatter.created_at);\n });\n\n const cap = Math.max(1, Math.min(500, Number(opts.limit) || 20));\n const pick = team.slice(0, cap);\n\n console.log(ui.bold(`hAIve welcome — ${pick.length} team memories (${root})`));\n console.log(ui.dim(`Next: invoke get_briefing with your task or run 'haive briefing --task \"…\"'`));\n\n if (pick.length === 0) {\n ui.warn(\"No team memories yet — add some with 'haive memory add' or promote personal ones.\");\n return;\n }\n\n let i = 1;\n for (const { memory } of pick) {\n const fm = memory.frontmatter;\n const head = memory.body.match(/^#\\s+(.+)/m)?.[1]?.trim();\n const line = head ?? fm.id;\n console.log(\n `${String(i).padStart(2, \" \")} ${fm.type.padEnd(12)} ${fm.status.padEnd(10)} ${ui.dim(fm.id)}\\n ${line}`,\n );\n i++;\n }\n });\n}\n","/**\n * Lightweight quality checks — no ML, safe to run on CI alongside tests.\n */\nimport { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadMemoriesFromDir,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nexport type LintSeverity = \"error\" | \"warn\" | \"info\";\n\nexport interface MemoryLintFinding {\n file: string;\n id: string;\n severity: LintSeverity;\n code: string;\n message: string;\n}\n\ninterface LintOpts {\n json?: boolean;\n dir?: string;\n}\n\nexport async function lintMemoriesAsync(root: string): Promise<MemoryLintFinding[]> {\n const paths = resolveHaivePaths(root);\n const out: MemoryLintFinding[] = [];\n if (!existsSync(paths.memoriesDir)) return out;\n\n const loaded = await loadMemoriesFromDir(paths.memoriesDir);\n\n const ANCHOR_TYPES = new Set([\"decision\", \"architecture\", \"gotcha\"]);\n\n for (const { filePath, memory } of loaded) {\n const fm = memory.frontmatter;\n if (fm.type === \"session_recap\") continue;\n\n const body = memory.body.trim();\n const naked = body.replace(/^#.*$/gm, \"\").replace(/```[\\s\\S]*?```/g, \"\").trim();\n\n if (naked.length < 40 && fm.status !== \"rejected\") {\n out.push({\n file: filePath,\n id: fm.id,\n severity: \"warn\",\n code: \"SHORT_BODY\",\n message: \"Body looks very short (< ~40 chars of prose after headings). Prefer actionable detail.\",\n });\n }\n\n if (ANCHOR_TYPES.has(fm.type) && fm.anchor.paths.length === 0 && fm.status === \"validated\") {\n out.push({\n file: filePath,\n id: fm.id,\n severity: \"warn\",\n code: \"MISSING_ANCHOR\",\n message:\n `${fm.type} is validated without anchor paths — add anchor.paths so haive sync can flag staleness.`,\n });\n }\n\n if (fm.status === \"stale\" && !fm.stale_reason) {\n out.push({\n file: filePath,\n id: fm.id,\n severity: \"info\",\n code: \"STALE_NO_REASON\",\n message: \"Status is stale but stale_reason is empty — document why when possible.\",\n });\n }\n\n if (fm.type === \"glossary\" && naked.length > 6000) {\n out.push({\n file: filePath,\n id: fm.id,\n severity: \"info\",\n code: \"LONG_GLOSSARY\",\n message: \"Very long glossary — consider splitting concepts for tighter briefings.\",\n });\n }\n\n const hasMarkdownHeading = /^#{1,3}\\s+\\S/m.test(memory.body.trim());\n if (!hasMarkdownHeading) {\n out.push({\n file: filePath,\n id: fm.id,\n severity: \"warn\",\n code: \"NO_MD_HEADING\",\n message:\n \"No Markdown heading (#/##/###) — add one so humans and auditors can skim the memo quickly.\",\n });\n }\n }\n\n return out;\n}\n\nexport function registerMemoryLint(parent: Command): void {\n parent\n .command(\"lint\")\n .description(\n \"Heuristic corpus checks (anchors on key types, headings, verbosity). Static analysis only.\",\n )\n .option(\"--json\", \"emit findings as JSON\", false)\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: LintOpts) => {\n const root = findProjectRoot(opts.dir);\n const findings = await lintMemoriesAsync(root);\n\n if (opts.json) {\n console.log(JSON.stringify({ findings_count: findings.length, findings }, null, 2));\n process.exitCode = findings.some((f) => f.severity === \"error\") ? 1 : 0;\n return;\n }\n\n if (findings.length === 0) {\n ui.success(`memory lint OK — ${root}`);\n return;\n }\n\n console.log(ui.bold(`memory lint (${findings.length} finding${findings.length === 1 ? \"\" : \"s\"})`) + `\\n`);\n\n const order: Record<LintSeverity, number> = { error: 0, warn: 1, info: 2 };\n findings.sort((a, b) => order[a.severity] - order[b.severity] || a.id.localeCompare(b.id));\n\n for (const f of findings) {\n const color =\n f.severity === \"error\" ? ui.red : f.severity === \"warn\" ? ui.yellow : ui.dim;\n console.log(\n `${color(f.severity.padEnd(5))} ${ui.dim(f.code)} ${f.id}`,\n );\n console.log(` ${f.message}`);\n console.log(ui.dim(` → ${f.file}`));\n }\n\n process.exitCode = findings.some((x) => x.severity === \"error\") ? 1 : 0;\n });\n}\n","import { Command } from \"commander\";\nimport { MemoryTypeSchema, suggestTopicKey } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nexport function registerMemorySuggestTopic(memory: Command): void {\n memory\n .command(\"suggest-topic\")\n .description(\"Suggest a stable topic key (topic-upsert) from type + title phrase\")\n .requiredOption(\n \"--type <type>\",\n \"convention | decision | gotcha | architecture | glossary | attempt | session_recap\",\n )\n .argument(\"<title>\", \"Short title or phrase to slugify\")\n .action((title: string, opts: { type: string }) => {\n const parsed = MemoryTypeSchema.safeParse(opts.type);\n if (!parsed.success) {\n ui.error(`Invalid type: ${opts.type}`);\n process.exit(1);\n }\n const suggestion = suggestTopicKey(parsed.data, title);\n console.log(JSON.stringify({ type: parsed.data, ...suggestion }, null, 2));\n });\n}\n","import path from \"node:path\";\nimport { Command } from \"commander\";\nimport { resolveProjectInfo } from \"@hiveai/core\";\n\nexport function registerResolveProject(program: Command): void {\n program\n .command(\"resolve-project\")\n .description(\n \"Print JSON for hAIve project root resolution (HAIVE_PROJECT_ROOT, markers, .ai layout).\",\n )\n .option(\"-d, --dir <dir>\", \"working directory\", process.cwd())\n .action((opts: { dir: string }) => {\n const info = resolveProjectInfo({ cwd: path.resolve(opts.dir) });\n console.log(JSON.stringify({ ok: true, info }, null, 2));\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n appendRuntimeJournalEntry,\n findProjectRoot,\n readRuntimeJournalTail,\n resolveHaivePaths,\n type RuntimeJournalEntry,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface JournalAppendOpts {\n kind: string;\n dir?: string;\n}\n\nexport function registerRuntime(program: Command): void {\n const runtime = program\n .command(\"runtime\")\n .description(\n \"Local-only .ai/.runtime helpers (not versioned team memory). See session-journal.ndjson.\",\n );\n\n const journal = runtime\n .command(\"journal\")\n .description(\"Append or read the machine-local session journal (NDJSON)\");\n\n journal\n .command(\"append\")\n .description(\"Append one JSON line to .ai/.runtime/session-journal.ndjson\")\n .argument(\"<message>\", \"short text to log\")\n .option(\"-k, --kind <kind>\", \"note | session_end | mcp\", \"note\")\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .action(async (message: string, opts: JournalAppendOpts) => {\n const root = path.resolve(opts.dir ?? process.cwd());\n const paths = resolveHaivePaths(findProjectRoot(root));\n const raw = opts.kind ?? \"note\";\n const kind = ([\"note\", \"session_end\", \"mcp\"].includes(raw)\n ? raw\n : \"note\") as RuntimeJournalEntry[\"kind\"];\n await appendRuntimeJournalEntry(paths, { kind, message });\n ui.success(`Appended to ${path.relative(root, paths.runtimeDir)}/session-journal.ndjson`);\n });\n\n journal\n .command(\"tail\")\n .description(\"Print the last N entries from the runtime session journal as JSON\")\n .option(\"-n, --limit <n>\", \"number of lines\", \"30\")\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .action(async (opts: { limit: string; dir?: string }) => {\n const root = path.resolve(opts.dir ?? process.cwd());\n const paths = resolveHaivePaths(findProjectRoot(root));\n const limit = Math.min(500, Math.max(1, parseInt(opts.limit, 10) || 30));\n if (!existsSync(paths.haiveDir)) {\n ui.error(\"No .ai/ — run `haive init` first.\");\n process.exitCode = 1;\n return;\n }\n const entries = await readRuntimeJournalTail(paths, limit);\n if (entries.length === 0) {\n ui.info(\"Journal empty or missing.\");\n return;\n }\n console.log(JSON.stringify({ entries, count: entries.length }, null, 2));\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n collectTimelineEntries,\n findProjectRoot,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface TimelineOpts {\n id?: string;\n topic?: string;\n limit: string;\n dir?: string;\n}\n\nexport function registerMemoryTimeline(memory: Command): void {\n memory\n .command(\"timeline\")\n .description(\n \"List related memories chronologically (topic, related_ids, anchors) — same logic as MCP mem_timeline.\",\n )\n .option(\"--id <id>\", \"seed memory id\")\n .option(\"--topic <key>\", \"filter by frontmatter.topic (use without --id for topic-only)\")\n .option(\"-n, --limit <n>\", \"max entries\", \"30\")\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .action(async (opts: TimelineOpts) => {\n if (!opts.id && !opts.topic) {\n ui.error(\"Provide --id and/or --topic.\");\n process.exitCode = 1;\n return;\n }\n const root = path.resolve(opts.dir ?? process.cwd());\n const paths = resolveHaivePaths(findProjectRoot(root));\n if (!existsSync(paths.memoriesDir)) {\n ui.error(\"No memories — run `haive init`.\");\n process.exitCode = 1;\n return;\n }\n const limit = Math.min(100, Math.max(1, parseInt(opts.limit, 10) || 30));\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const { entries, notice } = collectTimelineEntries(all, {\n memoryId: opts.id,\n topic: opts.topic,\n limit,\n });\n if (notice) ui.warn(notice);\n console.log(JSON.stringify({ entries, total: entries.length }, null, 2));\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findLexicalConflictPairs,\n findTopicStatusConflictPairs,\n findProjectRoot,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ntype MemType = \"decision\" | \"architecture\" | \"convention\" | \"gotcha\";\n\ninterface CandOpts {\n sinceDays: string;\n types: string;\n minJaccard: string;\n maxPairs: string;\n maxScan: string;\n maxTopicPairs: string;\n dir?: string;\n}\n\nfunction parseTypes(csv: string): MemType[] {\n const allowed: MemType[] = [\"decision\", \"architecture\", \"convention\", \"gotcha\"];\n const parts = csv.split(\",\").map((s) => s.trim().toLowerCase());\n const out = parts.filter((p): p is MemType => allowed.includes(p as MemType));\n return out.length ? out : [\"decision\", \"architecture\"];\n}\n\nexport function registerMemoryConflictCandidates(memory: Command): void {\n memory\n .command(\"conflict-candidates\")\n .description(\n \"Heuristic conflict candidates (lexical Jaccard + same-topic validated/rejected pairs) — aligns with MCP mem_conflict_candidates.\",\n )\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .option(\"--since-days <n>\", \"only memories created within N days (lexical scan)\", \"365\")\n .option(\n \"--types <csv>\",\n \"decision,architecture,convention,gotcha (lexical scan)\",\n \"decision,architecture\",\n )\n .option(\"--min-jaccard <x>\", \"minimum Jaccard for lexical pairs\", \"0.45\")\n .option(\"--max-pairs <n>\", \"cap lexical pairs\", \"20\")\n .option(\"--max-scan <n>\", \"max memories scanned (lexical)\", \"500\")\n .option(\"--max-topic-pairs <n>\", \"cap topic/status pairs\", \"20\")\n .action(async (opts: CandOpts) => {\n const root = path.resolve(opts.dir ?? process.cwd());\n const paths = resolveHaivePaths(findProjectRoot(root));\n if (!existsSync(paths.memoriesDir)) {\n ui.error(\"No memories — run `haive init`.\");\n process.exitCode = 1;\n return;\n }\n\n const sinceDays = Math.max(1, parseInt(opts.sinceDays, 10) || 365);\n const minJaccard = parseFloat(opts.minJaccard) || 0.45;\n const maxPairs = Math.min(100, Math.max(1, parseInt(opts.maxPairs, 10) || 20));\n const maxScan = Math.min(2000, Math.max(1, parseInt(opts.maxScan, 10) || 500));\n const maxTopicPairs = Math.min(100, Math.max(1, parseInt(opts.maxTopicPairs, 10) || 20));\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const lexical = findLexicalConflictPairs(all, {\n sinceDays,\n types: parseTypes(opts.types),\n minJaccard,\n maxPairs,\n maxScan,\n });\n const topicStatusPairs = findTopicStatusConflictPairs(all, maxTopicPairs);\n\n console.log(\n JSON.stringify(\n {\n pairs: lexical.pairs,\n topic_status_pairs: topicStatusPairs,\n scanned: lexical.scanned,\n truncated: lexical.truncated,\n },\n null,\n 2,\n ),\n );\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { chmod, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n hasRecentBriefingMarker,\n isFreshIsoDate,\n loadConfig,\n loadMemoriesFromDir,\n memoryMatchesAnchorPaths,\n readRecentBriefingMarker,\n resolveBriefingBudget,\n resolveHaivePaths,\n saveConfig,\n SESSION_RECAP_TTL_MS,\n verifyAnchor,\n writeBriefingMarker,\n type HaiveConfig,\n} from \"@hiveai/core\";\nimport { getBriefing, preCommitCheck } from \"@hiveai/mcp\";\nimport { ui } from \"../utils/ui.js\";\nimport { installClaudeHooksAtPath, defaultClaudeSettingsPath } from \"../utils/claude-hooks.js\";\n\nconst MAX_STDIN_BYTES = 256 * 1024;\nconst ENFORCE_HOOK_MARKER = \"# hAIve enforcement hook\";\n\ninterface HookPayload {\n cwd?: string;\n session_id?: string;\n prompt?: string;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n}\n\ninterface EnforceOptions {\n dir?: string;\n task?: string;\n source?: string;\n sessionId?: string;\n json?: boolean;\n stage?: \"local\" | \"pre-commit\" | \"pre-push\" | \"ci\";\n strict?: boolean;\n claude?: boolean;\n git?: boolean;\n ci?: boolean;\n}\n\ninterface EnforcementFinding {\n severity: \"ok\" | \"info\" | \"warn\" | \"error\";\n code: string;\n message: string;\n fix?: string;\n impact?: number;\n}\n\ninterface EnforcementScore {\n score: number;\n threshold: number;\n checks: {\n total: number;\n ok: number;\n warn: number;\n error: number;\n };\n}\n\ninterface EnforcementReport {\n root: string;\n initialized: boolean;\n mode: \"off\" | \"advisory\" | \"strict\";\n score: EnforcementScore;\n should_block: boolean;\n findings: EnforcementFinding[];\n}\n\nexport function registerEnforce(program: Command): void {\n const enforce = program\n .command(\"enforce\")\n .description(\n \"Agent-agnostic enforcement helpers: install policy gates, report status, and block unsafe workflows.\",\n );\n\n enforce\n .command(\"install\")\n .description(\"Install hAIve enforcement across MCP config, git hooks, CI template, and supported client hooks.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--no-git\", \"skip git pre-commit/pre-push enforcement hooks\")\n .option(\"--no-claude\", \"skip Claude Code hooks\")\n .option(\"--no-ci\", \"skip GitHub Actions enforcement workflow\")\n .action(async (opts: EnforceOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n await mkdir(paths.haiveDir, { recursive: true });\n const current = await loadConfig(paths);\n await saveConfig(paths, {\n ...current,\n enforcement: {\n ...current.enforcement,\n mode: \"strict\",\n requireBriefingFirst: true,\n requireSessionRecap: true,\n requireMemoryVerify: true,\n blockStaleDecisionChanges: true,\n requireDecisionCoverage: true,\n scoreThreshold: 85,\n cleanupGeneratedArtifacts: true,\n toolProfile: \"enforcement\",\n policyPacks: [\"architecture\", \"gotchas\", \"security\", \"domain\", \"release\"],\n },\n });\n ui.success(\"hAIve strict enforcement enabled in .ai/haive.config.json\");\n\n if (opts.git !== false) await installGitEnforcement(root);\n if (opts.ci !== false) await installCiEnforcement(root);\n if (opts.claude !== false) {\n try {\n const result = await installClaudeHooksAtPath(defaultClaudeSettingsPath(\"project\", root));\n ui.success(`${result.created ? \"Created\" : \"Patched\"} Claude Code hooks (${path.relative(root, result.settingsPath)})`);\n } catch (err) {\n ui.warn(`Claude Code hooks not installed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n ui.info(\"Agent-agnostic gates are now active at workflow level: MCP, git, CI, and optional client hooks.\");\n ui.info(\"Use `haive run -- <agent command>` for agents that do not expose blocking hooks.\");\n });\n\n enforce\n .command(\"status\")\n .description(\"Show whether this project has agent-agnostic hAIve enforcement installed.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--json\", \"emit JSON\", false)\n .action(async (opts: EnforceOptions) => {\n const report = await buildEnforcementReport(opts.dir, \"local\");\n printReport(report, Boolean(opts.json));\n if (report.should_block) process.exitCode = 1;\n });\n\n enforce\n .command(\"check\")\n .description(\"Run the hAIve policy gate. Intended for pre-commit, pre-push, wrappers, and any agent client.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--stage <stage>\", \"local | pre-commit | pre-push | ci\", \"local\")\n .option(\"--json\", \"emit JSON\", false)\n .action(async (opts: EnforceOptions) => {\n const report = await buildEnforcementReport(opts.dir, opts.stage ?? \"local\");\n printReport(report, Boolean(opts.json));\n if (report.should_block) process.exit(2);\n });\n\n enforce\n .command(\"cleanup\")\n .description(\"Remove generated hAIve runtime/cache artifacts that should not appear in commits.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--dry-run\", \"print what would be removed without deleting\", false)\n .action(async (opts: EnforceOptions & { dryRun?: boolean }) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n const targets = [\n path.join(paths.haiveDir, \".cache\"),\n path.join(paths.haiveDir, \".runtime\"),\n ];\n for (const target of targets) {\n if (!existsSync(target)) continue;\n const rel = path.relative(root, target);\n if (opts.dryRun) ui.info(`would remove ${rel}`);\n else {\n await rm(target, { recursive: true, force: true });\n ui.success(`removed ${rel}`);\n }\n }\n });\n\n enforce\n .command(\"ci\")\n .description(\"CI entrypoint: fail if the repository violates hAIve enforcement policy.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--json\", \"emit JSON\", false)\n .action(async (opts: EnforceOptions) => {\n const report = await buildEnforcementReport(opts.dir, \"ci\");\n printReport(report, Boolean(opts.json));\n if (report.should_block) process.exit(2);\n });\n\n enforce\n .command(\"session-start\")\n .description(\"Claude Code SessionStart hook: inject briefing and write a local briefing marker.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--task <text>\", \"task text to rank memories\")\n .option(\"--source <name>\", \"marker source\", \"claude-session-start\")\n .option(\"--session-id <id>\", \"agent session id\")\n .action(async (opts: EnforceOptions) => {\n const payload = await readHookPayload();\n const root = resolveRoot(opts.dir, payload);\n if (!root) return;\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) return;\n await mkdir(paths.runtimeDir, { recursive: true });\n const sessionId = opts.sessionId ?? payload.session_id;\n const task = opts.task ?? payload.prompt ?? \"Start an AI coding session in this hAIve-initialized project.\";\n\n const budget = resolveBriefingBudget(\"quick\", {\n max_tokens: 2500,\n max_memories: 5,\n include_module_contexts: false,\n });\n const briefing = await getBriefing(\n {\n task,\n files: [],\n max_tokens: budget.max_tokens,\n max_memories: budget.max_memories,\n include_project_context: true,\n include_module_contexts: budget.include_module_contexts,\n semantic: true,\n include_stale: false,\n track: true,\n format: \"actions\",\n symbols: [],\n min_semantic_score: 0.25,\n budget_preset: \"quick\",\n },\n { paths },\n );\n await writeBriefingMarker(paths, {\n sessionId,\n task,\n source: opts.source ?? \"claude-session-start\",\n memoryIds: briefing.memories.map((m) => m.id),\n });\n\n console.log(\"hAIve briefing loaded. Agents must consult this before editing.\");\n if (briefing.last_session) {\n console.log(`\\n## Last session\\n${briefing.last_session.body.slice(0, 1200)}`);\n }\n if (briefing.project_context?.content) {\n console.log(`\\n## Project context\\n${briefing.project_context.content.slice(0, 1800)}`);\n }\n if (briefing.memories.length > 0) {\n console.log(\"\\n## Relevant memories\");\n for (const memory of briefing.memories.slice(0, 6)) {\n console.log(`\\n### ${memory.id} (${memory.scope}/${memory.type}, ${memory.confidence})`);\n console.log(memory.body.slice(0, 1000));\n }\n }\n for (const warning of briefing.setup_warnings) {\n console.log(`\\n[setup warning] ${warning}`);\n }\n });\n\n enforce\n .command(\"pre-tool-use\")\n .description(\"Claude Code PreToolUse hook: block writes until hAIve briefing has been loaded.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: EnforceOptions) => {\n const payload = await readHookPayload();\n const root = resolveRoot(opts.dir, payload);\n if (!root) return;\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) return;\n if (!isWriteLikeTool(payload)) return;\n\n const ok = await hasRecentBriefingMarker(paths, payload.session_id);\n if (ok) return;\n\n const tool = payload.tool_name ?? \"write tool\";\n console.error(\n [\n \"hAIve enforcement blocked this action.\",\n `Tool: ${tool}`,\n \"\",\n \"This project is initialized with hAIve. Load the team briefing before editing:\",\n \" haive enforce session-start\",\n \"or call MCP get_briefing / mem_relevant_to from your AI client.\",\n \"\",\n \"If this is intentional, a human can disable enforcement in .ai/haive.config.json:\",\n ' { \"enforcement\": { \"requireBriefingFirst\": false } }',\n ].join(\"\\n\"),\n );\n process.exit(2);\n });\n}\n\nexport async function runWithEnforcement(\n command: string,\n args: string[],\n opts: { dir?: string; task?: string },\n): Promise<void> {\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.exit(1);\n }\n\n const sessionId = `haive-run-${process.pid}-${Date.now()}`;\n const task = opts.task ?? `Run agent command: ${[command, ...args].join(\" \")}`;\n await writeBriefingMarker(paths, {\n sessionId,\n task,\n source: \"haive-run\",\n });\n const briefingFile = await writeWrapperBriefing(paths, sessionId, task);\n\n const before = await buildEnforcementReport(root, \"local\", sessionId);\n const blocking = before.findings.filter((f) => f.severity === \"error\" && f.code !== \"session-recap-missing\");\n if (blocking.length > 0) {\n printReport({ ...before, should_block: true, findings: blocking }, false);\n process.exit(2);\n }\n\n ui.info(`hAIve briefing marker created for wrapped agent session: ${sessionId}`);\n ui.info(`Briefing written to ${path.relative(root, briefingFile)} and exported as HAIVE_BRIEFING_FILE`);\n const child = spawn(command, args, {\n cwd: root,\n stdio: \"inherit\",\n env: {\n ...process.env,\n HAIVE_PROJECT_ROOT: root,\n HAIVE_SESSION_ID: sessionId,\n HAIVE_BRIEFING_FILE: briefingFile,\n HAIVE_ENFORCEMENT: \"strict\",\n HAIVE_TOOL_PROFILE: process.env.HAIVE_TOOL_PROFILE ?? \"enforcement\",\n },\n });\n await new Promise<void>((resolve, reject) => {\n child.on(\"error\", reject);\n child.on(\"close\", (code, signal) => {\n if (signal) process.exit(128);\n process.exitCode = code ?? 0;\n resolve();\n });\n });\n}\n\nasync function writeWrapperBriefing(\n paths: ReturnType<typeof resolveHaivePaths>,\n sessionId: string,\n task: string,\n): Promise<string> {\n const budget = resolveBriefingBudget(\"quick\", {\n max_tokens: 2500,\n max_memories: 5,\n include_module_contexts: false,\n });\n const briefing = await getBriefing({\n task,\n files: [],\n max_tokens: budget.max_tokens,\n max_memories: budget.max_memories,\n include_project_context: true,\n include_module_contexts: budget.include_module_contexts,\n semantic: true,\n include_stale: false,\n track: true,\n format: \"actions\",\n symbols: [],\n min_semantic_score: 0.25,\n budget_preset: \"quick\",\n }, { paths });\n await writeBriefingMarker(paths, {\n sessionId,\n task,\n source: \"haive-run\",\n memoryIds: briefing.memories.map((m) => m.id),\n });\n const dir = path.join(paths.runtimeDir, \"enforcement\", \"briefings\");\n await mkdir(dir, { recursive: true });\n const file = path.join(dir, `${sessionId}.md`);\n const parts = [\n \"# hAIve Briefing\",\n \"\",\n `Task: ${task}`,\n \"\",\n ];\n if (briefing.last_session) parts.push(\"## Last Session\", briefing.last_session.body.trim(), \"\");\n if (briefing.project_context?.content) parts.push(\"## Project Context\", briefing.project_context.content.trim(), \"\");\n if (briefing.memories.length > 0) {\n parts.push(\"## Relevant Memories\");\n for (const memory of briefing.memories) {\n parts.push(\"\", `### ${memory.id}`, memory.body.trim());\n }\n }\n if (briefing.setup_warnings.length > 0) {\n parts.push(\"\", \"## Setup Warnings\", ...briefing.setup_warnings.map((w) => `- ${w}`));\n }\n await writeFile(file, parts.join(\"\\n\") + \"\\n\", \"utf8\");\n return file;\n}\n\nasync function buildEnforcementReport(\n dir: string | undefined,\n stage: \"local\" | \"pre-commit\" | \"pre-push\" | \"ci\",\n sessionId?: string,\n): Promise<EnforcementReport> {\n const root = findProjectRoot(dir);\n const paths = resolveHaivePaths(root);\n const initialized = existsSync(paths.haiveDir);\n const config = initialized ? await loadConfig(paths) : {};\n const mode = config.enforcement?.mode ?? \"strict\";\n const findings: EnforcementFinding[] = [];\n\n if (!initialized) {\n return {\n root,\n initialized,\n mode,\n score: buildScore([], config.enforcement?.scoreThreshold),\n should_block: true,\n findings: [{\n severity: \"error\",\n code: \"not-initialized\",\n message: \"This repository is not initialized with hAIve.\",\n fix: \"Run `haive init` or `haive enforce install`.\",\n impact: 100,\n }],\n };\n }\n\n if (mode === \"off\") {\n return {\n root,\n initialized,\n mode,\n score: buildScore([], config.enforcement?.scoreThreshold),\n should_block: false,\n findings: [{ severity: \"info\", code: \"enforcement-off\", message: \"hAIve enforcement is disabled.\" }],\n };\n }\n\n if (config.enforcement?.requireBriefingFirst !== false && stage !== \"ci\") {\n const hasBriefing = await hasRecentBriefingMarker(paths, sessionId);\n findings.push(hasBriefing\n ? { severity: \"ok\", code: \"briefing-loaded\", message: \"A recent hAIve briefing marker exists.\" }\n : {\n severity: \"error\",\n code: \"briefing-missing\",\n message: \"No recent hAIve briefing marker was found for this workflow.\",\n fix: \"Run `haive briefing --task \\\"...\\\"`, `haive enforce session-start`, or wrap the agent with `haive run -- <agent>`.\",\n impact: 35,\n });\n }\n\n if (config.enforcement?.requireSessionRecap !== false && (stage === \"pre-push\" || stage === \"ci\")) {\n const hasRecap = await hasRecentSessionRecap(paths);\n findings.push(hasRecap\n ? { severity: \"ok\", code: \"session-recap-present\", message: \"A recent session_recap memory exists.\" }\n : stage === \"ci\"\n ? {\n severity: \"warn\",\n code: \"session-recap-missing\",\n message: \"No recent session_recap memory was found. CI reports this as a warning because personal recaps are usually not committed.\",\n fix: \"Run `haive session end --scope team --goal ... --accomplished ...` if you want a team recap visible in CI.\",\n impact: 5,\n }\n : {\n severity: \"error\",\n code: \"session-recap-missing\",\n message: \"No recent session_recap memory was found.\",\n fix: \"Run `haive session end --goal ... --accomplished ...` before pushing.\",\n impact: 20,\n });\n }\n\n if (config.enforcement?.requireMemoryVerify !== false) {\n findings.push(...await verifyMemoryPolicy(paths, config));\n }\n\n if (config.enforcement?.requireDecisionCoverage !== false) {\n findings.push(...await verifyDecisionCoverage(paths, stage, sessionId));\n }\n\n if (stage === \"pre-commit\" || stage === \"ci\") {\n findings.push(...await runPrecommitPolicy(paths));\n }\n\n if (config.enforcement?.cleanupGeneratedArtifacts !== false) {\n findings.push(...await findGeneratedArtifacts(paths));\n }\n\n const score = buildScore(findings, config.enforcement?.scoreThreshold);\n if (score.score < score.threshold) {\n findings.push({\n severity: \"error\",\n code: \"enforcement-score-below-threshold\",\n message: `Enforcement score ${score.score}% is below required threshold ${score.threshold}%.`,\n fix: \"Load the relevant briefing, address policy findings, then rerun `haive enforce check`.\",\n impact: 0,\n });\n }\n\n const hasErrors = findings.some((f) => f.severity === \"error\");\n return {\n root,\n initialized,\n mode,\n score: buildScore(findings, config.enforcement?.scoreThreshold),\n should_block: mode === \"strict\" && hasErrors,\n findings,\n };\n}\n\nasync function hasRecentSessionRecap(paths: ReturnType<typeof resolveHaivePaths>): Promise<boolean> {\n if (!existsSync(paths.memoriesDir)) return false;\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n return all.some(({ memory }) => {\n const fm = memory.frontmatter;\n const freshnessDate = fm.verified_at ?? fm.created_at;\n return fm.type === \"session_recap\" &&\n fm.status !== \"rejected\" &&\n isFreshIsoDate(freshnessDate, SESSION_RECAP_TTL_MS);\n });\n}\n\nasync function verifyMemoryPolicy(\n paths: ReturnType<typeof resolveHaivePaths>,\n config: HaiveConfig,\n): Promise<EnforcementFinding[]> {\n if (!existsSync(paths.memoriesDir)) return [];\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const findings: EnforcementFinding[] = [];\n const staleImportant: string[] = [];\n let verified = 0;\n\n for (const { memory } of all) {\n const fm = memory.frontmatter;\n const anchored = fm.anchor.paths.length > 0 || fm.anchor.symbols.length > 0;\n if (!anchored || fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n verified++;\n if (fm.status === \"stale\") {\n if ([\"decision\", \"gotcha\", \"architecture\", \"convention\"].includes(fm.type)) {\n staleImportant.push(fm.id);\n }\n continue;\n }\n if (config.enforcement?.blockStaleDecisionChanges !== false && [\"decision\", \"gotcha\"].includes(fm.type)) {\n const result = await verifyAnchor(memory, { projectRoot: paths.root });\n if (result.stale) staleImportant.push(fm.id);\n }\n }\n\n findings.push({\n severity: \"ok\",\n code: \"memory-verify-ran\",\n message: `Checked ${verified} anchored memories for stale enforcement policy.`,\n });\n\n if (staleImportant.length > 0) {\n findings.push({\n severity: \"error\",\n code: \"stale-important-memories\",\n message: `${staleImportant.length} important anchored memories are stale: ${staleImportant.slice(0, 8).join(\", \")}`,\n fix: \"Run `haive memory verify --update`, then update or delete stale decisions/gotchas before merging.\",\n impact: 40,\n });\n }\n return findings;\n}\n\nasync function verifyDecisionCoverage(\n paths: ReturnType<typeof resolveHaivePaths>,\n stage: \"local\" | \"pre-commit\" | \"pre-push\" | \"ci\",\n sessionId?: string,\n): Promise<EnforcementFinding[]> {\n if (!existsSync(paths.memoriesDir)) return [];\n const changedFiles = await getChangedFiles(paths.root, stage);\n if (changedFiles.length === 0) {\n return [{ severity: \"info\", code: \"decision-coverage-no-changes\", message: \"No changed files to match against policy memories.\" }];\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const policyTypes = new Set([\"decision\", \"gotcha\", \"architecture\", \"convention\"]);\n const relevant = all\n .map(({ memory }) => memory)\n .filter((memory) => {\n const fm = memory.frontmatter;\n if (!policyTypes.has(fm.type)) return false;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\" || fm.status === \"stale\") return false;\n return memoryMatchesAnchorPaths(memory, changedFiles);\n });\n\n if (relevant.length === 0) {\n return [{\n severity: \"ok\",\n code: \"decision-coverage-none-required\",\n message: `No anchored decisions or policies matched ${changedFiles.length} changed file(s).`,\n }];\n }\n\n const marker = await readRecentBriefingMarker(paths, sessionId);\n const consulted = new Set(marker?.memory_ids ?? []);\n const missing = relevant.filter((memory) => !consulted.has(memory.frontmatter.id));\n if (missing.length === 0) {\n return [{\n severity: \"ok\",\n code: \"decision-coverage-pass\",\n message: `Relevant decisions/policies were surfaced for ${changedFiles.length} changed file(s): ${relevant.length}/${relevant.length}.`,\n }];\n }\n\n return [{\n severity: stage === \"local\" ? \"warn\" : \"error\",\n code: \"decision-coverage-missing\",\n message: `${missing.length}/${relevant.length} relevant anchored decisions/policies were not present in the latest briefing: ${missing.slice(0, 6).map((m) => m.frontmatter.id).join(\", \")}`,\n fix: `Run \\`haive briefing --files \"${changedFiles.slice(0, 10).join(\",\")}\" --task \"...\"\\` before committing.`,\n impact: Math.min(35, 10 + missing.length * 5),\n }];\n}\n\nasync function runPrecommitPolicy(paths: ReturnType<typeof resolveHaivePaths>): Promise<EnforcementFinding[]> {\n const staged = await runCommand(\"git\", [\"diff\", \"--cached\", \"--name-only\"], paths.root).catch(() => \"\");\n const touchedPaths = staged.split(\"\\n\").map((s) => s.trim()).filter(Boolean);\n if (touchedPaths.length === 0) {\n return [{ severity: \"info\", code: \"no-staged-changes\", message: \"No staged changes found for pre-commit policy.\" }];\n }\n const diff = await runCommand(\"git\", [\"diff\", \"--cached\"], paths.root).catch(() => \"\");\n const result = await preCommitCheck({\n diff,\n paths: touchedPaths,\n block_on: \"high-confidence\",\n semantic: true,\n }, { paths });\n if (!result.should_block) {\n return [{\n severity: \"ok\",\n code: \"precommit-policy-pass\",\n message: `Pre-commit policy passed for ${touchedPaths.length} staged file(s).`,\n }];\n }\n return [{\n severity: \"error\",\n code: \"precommit-policy-block\",\n message: `Pre-commit policy matched ${result.summary.blocking_warnings ?? result.summary.anti_patterns} blocking anti-pattern(s), ${result.summary.stale_anchors} stale anchor(s).`,\n fix: \"Review the hAIve warnings, then update the code or the relevant memories.\",\n impact: 45,\n }];\n}\n\nasync function findGeneratedArtifacts(paths: ReturnType<typeof resolveHaivePaths>): Promise<EnforcementFinding[]> {\n const dirty = await runCommand(\"git\", [\"status\", \"--short\", \"--untracked-files=all\"], paths.root).catch(() => \"\");\n const generated = dirty\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .filter((line) =>\n line.includes(\".ai/.cache/\") ||\n line.includes(\".ai/.runtime/\") ||\n line.includes(\"__pycache__/\") ||\n line.endsWith(\".pyc\"),\n );\n if (generated.length === 0) {\n return [{ severity: \"ok\", code: \"generated-artifacts-clean\", message: \"No generated runtime/cache artifacts are visible to git.\" }];\n }\n return [{\n severity: \"warn\",\n code: \"generated-artifacts-visible\",\n message: `${generated.length} generated artifact(s) are visible in git status.`,\n fix: \"Run `haive enforce cleanup`, update .gitignore, or remove test/runtime outputs before committing.\",\n impact: 10,\n }];\n}\n\nasync function getChangedFiles(\n root: string,\n stage: \"local\" | \"pre-commit\" | \"pre-push\" | \"ci\",\n): Promise<string[]> {\n const commands =\n stage === \"pre-commit\"\n ? [[\"diff\", \"--cached\", \"--name-only\"]]\n : [\n [\"diff\", \"--cached\", \"--name-only\"],\n [\"diff\", \"--name-only\"],\n ];\n const files = new Set<string>();\n for (const args of commands) {\n const out = await runCommand(\"git\", args, root).catch(() => \"\");\n for (const line of out.split(\"\\n\")) {\n const file = line.trim();\n if (file) files.add(file);\n }\n }\n return [...files].filter((file) => !file.startsWith(\".ai/.runtime/\") && !file.startsWith(\".ai/.cache/\"));\n}\n\nfunction buildScore(findings: EnforcementFinding[], threshold = 80): EnforcementScore {\n const checks = {\n total: findings.length,\n ok: findings.filter((f) => f.severity === \"ok\").length,\n warn: findings.filter((f) => f.severity === \"warn\").length,\n error: findings.filter((f) => f.severity === \"error\").length,\n };\n const penalty = findings.reduce((sum, f) => {\n if (f.severity === \"error\") return sum + (f.impact ?? 25);\n if (f.severity === \"warn\") return sum + (f.impact ?? 8);\n return sum;\n }, 0);\n return {\n score: Math.max(0, Math.min(100, 100 - penalty)),\n threshold,\n checks,\n };\n}\n\nasync function installGitEnforcement(root: string): Promise<void> {\n const hooksDir = path.join(root, \".git\", \"hooks\");\n if (!existsSync(path.join(root, \".git\"))) {\n ui.warn(\"No .git directory found; git enforcement hooks skipped.\");\n return;\n }\n await mkdir(hooksDir, { recursive: true });\n const hooks = [\n {\n name: \"pre-commit\",\n body: `#!/bin/sh\n${ENFORCE_HOOK_MARKER}\nhaive enforce check --stage pre-commit --dir . || exit $?\n`,\n },\n {\n name: \"pre-push\",\n body: `#!/bin/sh\n${ENFORCE_HOOK_MARKER}\nhaive enforce check --stage pre-push --dir . || exit $?\n`,\n },\n ];\n for (const hook of hooks) {\n const file = path.join(hooksDir, hook.name);\n if (existsSync(file)) {\n const current = await readFile(file, \"utf8\").catch(() => \"\");\n if (current.includes(ENFORCE_HOOK_MARKER)) {\n await writeFile(file, hook.body, \"utf8\");\n } else {\n await writeFile(file, `${current.trimEnd()}\\n\\n${hook.body}`, \"utf8\");\n }\n } else {\n await writeFile(file, hook.body, \"utf8\");\n }\n await chmod(file, 0o755);\n }\n ui.success(\"Installed blocking git enforcement hooks: pre-commit, pre-push\");\n}\n\nasync function installCiEnforcement(root: string): Promise<void> {\n const workflowPath = path.join(root, \".github\", \"workflows\", \"haive-enforcement.yml\");\n await mkdir(path.dirname(workflowPath), { recursive: true });\n if (existsSync(workflowPath)) {\n ui.info(\"GitHub Actions enforcement workflow already exists — skipped\");\n return;\n }\n await writeFile(workflowPath, `name: haive-enforcement\n\non:\n pull_request:\n push:\n branches: [main, master]\n\njobs:\n haive-enforcement:\n runs-on: ubuntu-latest\n permissions:\n contents: read\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: Enforce hAIve policy\n run: haive enforce ci\n`, \"utf8\");\n ui.success(`Created ${path.relative(root, workflowPath)}`);\n}\n\nfunction printReport(report: EnforcementReport, json: boolean): void {\n if (json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(ui.bold(`hAIve enforcement — ${report.mode}`));\n console.log(ui.dim(` root: ${report.root}`));\n console.log(ui.dim(` score: ${report.score.score}% / threshold ${report.score.threshold}%`));\n for (const finding of report.findings) {\n const marker = finding.severity === \"error\"\n ? ui.red(\"✗\")\n : finding.severity === \"warn\"\n ? ui.yellow(\"⚠\")\n : finding.severity === \"ok\"\n ? ui.green(\"✓\")\n : ui.dim(\"•\");\n console.log(`${marker} ${finding.code}: ${finding.message}`);\n if (finding.fix) console.log(ui.dim(` fix: ${finding.fix}`));\n }\n if (report.should_block) ui.error(\"hAIve enforcement gate failed.\");\n else ui.success(\"hAIve enforcement gate passed.\");\n}\n\nasync function readHookPayload(): Promise<HookPayload> {\n const raw = await readStdin(MAX_STDIN_BYTES);\n if (!raw.trim()) return {};\n try {\n return JSON.parse(raw) as HookPayload;\n } catch {\n return {};\n }\n}\n\nfunction resolveRoot(dir: string | undefined, payload: HookPayload): string | null {\n try {\n return findProjectRoot(dir ?? payload.cwd);\n } catch {\n return null;\n }\n}\n\nfunction isWriteLikeTool(payload: HookPayload): boolean {\n const tool = payload.tool_name ?? \"\";\n if ([\"Edit\", \"Write\", \"MultiEdit\", \"NotebookEdit\"].includes(tool)) return true;\n if (tool !== \"Bash\") return false;\n const command = String(payload.tool_input?.[\"command\"] ?? \"\");\n return /\\b(rm|mv|cp|mkdir|touch|tee|sed|perl|python|node|npm|pnpm|yarn|git)\\b/.test(command) ||\n />{1,2}/.test(command);\n}\n\nasync function readStdin(maxBytes: number): Promise<string> {\n if (process.stdin.isTTY) return \"\";\n return await new Promise((resolve) => {\n const chunks: Buffer[] = [];\n let total = 0;\n let done = false;\n const finish = (): void => {\n if (done) return;\n done = true;\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n };\n process.stdin.on(\"data\", (c: Buffer) => {\n total += c.length;\n if (total > maxBytes) {\n process.stdin.destroy();\n finish();\n return;\n }\n chunks.push(c);\n });\n process.stdin.on(\"end\", finish);\n process.stdin.on(\"error\", finish);\n setTimeout(finish, 2000);\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","import { Command } from \"commander\";\nimport { runWithEnforcement } from \"./enforce.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface RunOptions {\n dir?: string;\n task?: string;\n}\n\nexport function registerRun(program: Command): void {\n program\n .command(\"run\")\n .description(\"Run any AI agent command inside a hAIve-enforced session.\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--task <text>\", \"task text used for the hAIve briefing marker\")\n .allowUnknownOption(true)\n .argument(\"[cmd]\", \"agent command to run\")\n .argument(\"[args...]\", \"agent command arguments\")\n .action(async (cmd: string | undefined, args: string[], opts: RunOptions) => {\n if (!cmd) {\n ui.error(\"Usage: haive run -- <agent command> [args...]\");\n process.exit(1);\n }\n await runWithEnforcement(cmd, args, opts);\n });\n}\n"],"mappings":"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AM,uBAAuB,CAAC,SAC5B,gBAAgB,UAAU,SAAS,uBAAuB,SAAS;AAIrE;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAwB;AAC7B,cAAQ,OAAO,YAAY,MAAM,IAAI;AACrC,aAAO,WAAW,MAAM,QAAQ,OAAO,OAAO,CAAC;IACjD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UACL,WAAW,MAAM,gBAAgB,OAAO,OAAO,CAAC;EACpD;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAyB;AAC9B,cAAQ,OAAO,aAAa,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC;AACnD,aAAO,WAAW,MAAM,SAAS,OAAO,OAAO,CAAC;IAClD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA2B;AAChC,cAAQ,OAAO,eAAe,MAAM,KAAK;AACzC,aAAO,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;IACpD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA8B;AACnC,cAAQ,OAAO,mBAAmB,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC;AACzD,aAAO,WAAW,MAAM,cAAc,OAAO,OAAO,CAAC;IACvD;EACF;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA4B;AACjC,cAAQ,OAAO,gBAAgB,MAAM,QAAQ,EAAE;AAC/C,aAAO,WAAW,MAAM,YAAY,OAAO,OAAO,CAAC;IACrD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA0B;AAC/B,cAAQ,OAAO,cAAc,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC;AACrD,aAAO,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;IACnD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA4B,WAAW,MAAM,YAAY,OAAO,OAAO,CAAC;EACjF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA4B,WAAW,MAAM,YAAY,OAAO,OAAO,CAAC;EACjF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAuB,WAAW,MAAM,OAAO,OAAO,OAAO,CAAC;EACvE;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAwB,WAAW,MAAM,QAAQ,OAAO,OAAO,CAAC;EACzE;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UACL,WAAW,MAAM,kBAAkB,OAAO,OAAO,CAAC;EACtD;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UACL,WAAW,MAAM,qBAAqB,OAAO,OAAO,CAAC;EACzD;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAwB,WAAW,MAAM,YAAY,OAAO,OAAO,CAAC;EAC7E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UACL,WAAW,MAAM,kBAAkB,OAAO,OAAO,CAAC;EACtD;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;EAC7E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;EAC7E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA2B,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;EAC/E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;EAC7E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA2B,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;EAC/E;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;EAC7E;AAKA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAAyB;AAC9B,cAAQ,OAAO,aAAa,MAAM,KAAK;AACvC,aAAO,WAAW,MAAM,SAAS,OAAO,OAAO,CAAC;IAClD;EACF;AAEA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA8B;AACnC,cAAQ,OAAO,mBAAmB,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC;AACzD,aAAO,WAAW,MAAM,cAAc,OAAO,OAAO,CAAC;IACvD;EACF;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA2B;AAChC,cAAQ,OAAO,eAAe,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC;AACtD,aAAO,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;IACpD;EACF;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,KAAK,IAAI;IACX;IACA,OAAO,UAA4B;AACjC,cAAQ,OAAO,iBAAiB,MAAM,IAAI;AAC1C,aAAO,WAAW,MAAM,YAAY,OAAO,OAAO,CAAC;IACrD;EACF;AAIA;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MA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","names":["Command","path","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","spawnSync","buildCodeMap","resolveHaivePaths","saveCodeMap","existsSync","mkdir","writeFile","os","path","findProjectRoot","resolveHaivePaths","readFile","mkdir","existsSync","path","program","findProjectRoot","resolveHaivePaths","path","existsSync","mkdir","writeFile","os","readFile","existsSync","path","mkdir","writeFile","existsSync","path","program","path","resolveHaivePaths","existsSync","mkdir","writeFile","spawnSync","buildCodeMap","saveCodeMap","readFile","mkdir","writeFile","readFile","existsSync","path","findProjectRoot","existsSync","mkdir","readFile","writeFile","path","findProjectRoot","path","existsSync","mkdir","readFile","writeFile","program","mkdir","existsSync","path","findProjectRoot","resolveHaivePaths","program","findProjectRoot","findProjectRoot","resolveHaivePaths","mkdir","writeFile","existsSync","path","readFile","readdir","z","loadMemoriesFromDir","buildFrontmatter","memoryFilePath","serializeMemory","literalMatchesAllTokens","literalMatchesAnyToken","loadUsageIndex","tokenizeQuery","trackReads","deriveConfidence","getUsage","memoryMatchesAnchorPaths","saveUsageIndex","loadConfig","extractActionsBriefBody","inferModulesFromPaths","loadCodeMap","queryCodeMap","resolveBriefingBudget","estimateTokens","spawn","execSync","appendRuntimeJournalEntry","memory","top","loadModuleContexts","rm","runGitLog","runCommand","program","findProjectRoot","spawnSync","readFile","writeFile","mkdir","existsSync","path","DEFAULT_AUTO_PROMOTE_RULE","buildFrontmatter","findProjectRoot","getUsage","isAutoPromoteEligible","isDecaying","loadCodeMap","loadConfig","loadMemoriesFromDir","loadUsageIndex","resolveHaivePaths","serializeMemory","verifyAnchor","program","findProjectRoot","resolveHaivePaths","existsSync","loadConfig","DEFAULT_AUTO_PROMOTE_RULE","loadMemoriesFromDir","memory","writeFile","serializeMemory","verifyAnchor","loadUsageIndex","isAutoPromoteEligible","getUsage","path","isDecaying","buildFrontmatter","mkdir","loadCodeMap","spawnSync","buildCodeMap","saveCodeMap","readFile","createHash","mkdir","readFile","writeFile","existsSync","path","buildFrontmatter","findProjectRoot","inferModulesFromPaths","loadMemoriesFromDir","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","parseCsv","inferModulesFromPaths","path","readFile","createHash","loadMemoriesFromDir","writeFile","serializeMemory","buildFrontmatter","memoryFilePath","mkdir","existsSync","path","findProjectRoot","resolveHaivePaths","loadMemoriesFromDir","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","mkdir","unlink","writeFile","existsSync","path","findProjectRoot","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memoryFilePath","mkdir","path","writeFile","serializeMemory","unlink","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","deriveConfidence","findProjectRoot","getUsage","inferModulesFromPaths","loadUsageIndex","memoryMatchesAnchorPaths","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","inferModulesFromPaths","memoryMatchesAnchorPaths","extractPathSegments","getUsage","deriveConfidence","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","extractSnippet","findProjectRoot","literalMatchesAllTokens","literalMatchesAnyToken","pickSnippetNeedle","resolveHaivePaths","tokenizeQuery","trackReads","memory","findProjectRoot","resolveHaivePaths","existsSync","tokenizeQuery","loadMemoriesFromDir","passesFilters","literalMatchesAllTokens","literalMatchesAnyToken","pickSnippetNeedle","path","extractSnippet","trackReads","writeFile","existsSync","findProjectRoot","loadUsageIndex","recordRejection","resolveHaivePaths","saveUsageIndex","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","writeFile","serializeMemory","loadUsageIndex","recordRejection","saveUsageIndex","existsSync","unlink","path","createInterface","findProjectRoot","loadUsageIndex","resolveHaivePaths","saveUsageIndex","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","createInterface","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","applyVerification","writeFile","serializeMemory","readFile","existsSync","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","readFile","existsSync","readFile","mkdir","writeFile","path","buildFrontmatter","findProjectRoot","resolveHaivePaths","serializeMemory","section","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","readFile","rm","existsSync","path","buildFrontmatter","findProjectRoot","loadMemoriesFromDir","memoryFilePath","resolveHaivePaths","serializeMemory","path","existsSync","readFile","parseCsv","recapTopic","session","findProjectRoot","resolveHaivePaths","rm","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","existsSync","mkdir","writeFile","path","findProjectRoot","loadMemoriesFromDir","loadUsageIndex","readUsageEvents","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","readUsageEvents","path","existsSync","loadMemoriesFromDir","memory","loadUsageIndex","mkdir","writeFile","estimateTokens","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","estimateTokens","existsSync","readdir","readFile","writeFile","path","estimateTokens","findProjectRoot","program","path","writeFile","findProjectRoot","existsSync","readdir","readFile","estimateTokens","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","truncate","aggregateUsage","existsSync","writeFile","path","findProjectRoot","getUsage","loadMemoriesFromDir","loadUsageIndex","resolveHaivePaths","serializeMemory","MS_PER_DAY","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","path","getUsage","writeFile","serializeMemory","existsSync","path","execSync","codeMapPath","findProjectRoot","getUsage","loadCodeMap","loadConfig","loadMemoriesFromDir","loadUsageIndex","readUsageEvents","resolveHaivePaths","MS_PER_DAY","program","findProjectRoot","resolveHaivePaths","existsSync","readFile","loadMemoriesFromDir","loadUsageIndex","getUsage","loadCodeMap","codeMapPath","readUsageEvents","loadConfig","path","execSync","existsSync","findProjectRoot","loadMemoriesFromDir","parseSince","readUsageEvents","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","readUsageEvents","parseSince","existsSync","loadMemoriesFromDir","memory","truncate","spawn","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","runCommand","spawn","existsSync","findProjectRoot","loadMemoriesFromDir","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memory","existsSync","findProjectRoot","loadMemoriesFromDir","resolveHaivePaths","resolveHaivePaths","existsSync","loadMemoriesFromDir","memory","findProjectRoot","MemoryTypeSchema","suggestTopicKey","memory","MemoryTypeSchema","suggestTopicKey","path","resolveProjectInfo","program","existsSync","path","appendRuntimeJournalEntry","findProjectRoot","readRuntimeJournalTail","resolveHaivePaths","program","path","resolveHaivePaths","findProjectRoot","appendRuntimeJournalEntry","existsSync","readRuntimeJournalTail","existsSync","path","collectTimelineEntries","findProjectRoot","resolveHaivePaths","memory","path","resolveHaivePaths","findProjectRoot","existsSync","loadMemoriesFromDir","collectTimelineEntries","existsSync","path","findLexicalConflictPairs","findTopicStatusConflictPairs","findProjectRoot","resolveHaivePaths","memory","path","resolveHaivePaths","findProjectRoot","existsSync","loadMemoriesFromDir","findLexicalConflictPairs","findTopicStatusConflictPairs","spawn","existsSync","chmod","mkdir","readFile","rm","writeFile","path","findProjectRoot","loadConfig","loadMemoriesFromDir","memoryMatchesAnchorPaths","resolveBriefingBudget","resolveHaivePaths","saveConfig","verifyAnchor","writeBriefingMarker","MAX_STDIN_BYTES","program","findProjectRoot","resolveHaivePaths","mkdir","loadConfig","saveConfig","path","existsSync","rm","resolveBriefingBudget","writeBriefingMarker","memory","spawn","writeFile","loadMemoriesFromDir","verifyAnchor","memoryMatchesAnchorPaths","runCommand","readFile","chmod","readStdin","program","Command"]}