@hiveai/cli 0.2.15 → 0.2.16
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 +81 -13
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -89,13 +89,24 @@ function registerBriefing(program2) {
|
|
|
89
89
|
}
|
|
90
90
|
if (existsSync(paths.projectContext)) {
|
|
91
91
|
const ctx = await readFile(paths.projectContext, "utf8");
|
|
92
|
-
|
|
92
|
+
const isTemplate = ctx.includes("TODO \u2014 high-level overview") || ctx.includes("Generated by `haive init`");
|
|
93
|
+
if (isTemplate) {
|
|
94
|
+
ui.warn(
|
|
95
|
+
"project-context.md still contains the default template \u2014 get_briefing will return little value."
|
|
96
|
+
);
|
|
97
|
+
ui.warn(
|
|
98
|
+
"Fix: in your AI client, invoke the MCP prompt bootstrap_project to auto-fill it from your codebase."
|
|
99
|
+
);
|
|
100
|
+
console.log();
|
|
101
|
+
} else {
|
|
102
|
+
console.log(`${ui.bold("=== Project Context ===")}
|
|
93
103
|
`);
|
|
94
|
-
|
|
95
|
-
|
|
104
|
+
console.log(ctx.trim());
|
|
105
|
+
console.log();
|
|
106
|
+
}
|
|
96
107
|
} else {
|
|
97
108
|
ui.warn(
|
|
98
|
-
"No project-context.md found. Run `haive init`
|
|
109
|
+
"No project-context.md found. Run `haive init` then invoke the bootstrap_project MCP prompt."
|
|
99
110
|
);
|
|
100
111
|
}
|
|
101
112
|
const candidates = all.filter(({ memory: mem }) => {
|
|
@@ -338,12 +349,15 @@ on:
|
|
|
338
349
|
push:
|
|
339
350
|
branches: [main, master]
|
|
340
351
|
pull_request:
|
|
341
|
-
|
|
342
|
-
- '.ai/**'
|
|
352
|
+
branches: [main, master]
|
|
343
353
|
|
|
344
354
|
jobs:
|
|
345
|
-
sync
|
|
355
|
+
# On push to main/master: sync anchors + auto-promote + commit changes
|
|
356
|
+
sync-on-merge:
|
|
357
|
+
if: github.event_name == 'push'
|
|
346
358
|
runs-on: ubuntu-latest
|
|
359
|
+
permissions:
|
|
360
|
+
contents: write
|
|
347
361
|
steps:
|
|
348
362
|
- uses: actions/checkout@v4
|
|
349
363
|
with:
|
|
@@ -353,19 +367,58 @@ jobs:
|
|
|
353
367
|
with:
|
|
354
368
|
node-version: '20'
|
|
355
369
|
|
|
356
|
-
- name:
|
|
357
|
-
run: npm install -g @
|
|
370
|
+
- name: install haive
|
|
371
|
+
run: npm install -g @hiveai/cli
|
|
358
372
|
|
|
359
|
-
- name:
|
|
360
|
-
run: haive sync --
|
|
373
|
+
- name: refresh memory anchors + auto-promote
|
|
374
|
+
run: haive sync --since HEAD~1 || true
|
|
361
375
|
|
|
362
|
-
- name:
|
|
376
|
+
- name: commit updated memories (if any)
|
|
363
377
|
run: |
|
|
364
378
|
git config user.name "github-actions[bot]"
|
|
365
379
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
366
380
|
git add .ai/
|
|
367
381
|
git diff --cached --quiet || git commit -m "chore: haive sync [skip ci]"
|
|
368
382
|
git push
|
|
383
|
+
|
|
384
|
+
# On pull request: warn if PR touches files that would invalidate memories
|
|
385
|
+
pr-stale-check:
|
|
386
|
+
if: github.event_name == 'pull_request'
|
|
387
|
+
runs-on: ubuntu-latest
|
|
388
|
+
permissions:
|
|
389
|
+
pull-requests: write
|
|
390
|
+
steps:
|
|
391
|
+
- uses: actions/checkout@v4
|
|
392
|
+
with:
|
|
393
|
+
fetch-depth: 0
|
|
394
|
+
|
|
395
|
+
- uses: actions/setup-node@v4
|
|
396
|
+
with:
|
|
397
|
+
node-version: '20'
|
|
398
|
+
|
|
399
|
+
- name: install haive
|
|
400
|
+
run: npm install -g @hiveai/cli
|
|
401
|
+
|
|
402
|
+
- name: verify memory anchors touched by this PR
|
|
403
|
+
id: verify
|
|
404
|
+
run: |
|
|
405
|
+
haive memory verify 2>&1 | tee /tmp/haive-verify.txt || true
|
|
406
|
+
STALE=$(grep -c 'stale' /tmp/haive-verify.txt || echo 0)
|
|
407
|
+
echo "stale_count=$STALE" >> "$GITHUB_OUTPUT"
|
|
408
|
+
|
|
409
|
+
- name: comment on PR if stale memories detected
|
|
410
|
+
if: steps.verify.outputs.stale_count != '0'
|
|
411
|
+
uses: actions/github-script@v7
|
|
412
|
+
with:
|
|
413
|
+
script: |
|
|
414
|
+
const fs = require('fs');
|
|
415
|
+
const report = fs.readFileSync('/tmp/haive-verify.txt', 'utf8').trim();
|
|
416
|
+
await github.rest.issues.createComment({
|
|
417
|
+
owner: context.repo.owner,
|
|
418
|
+
repo: context.repo.repo,
|
|
419
|
+
issue_number: context.issue.number,
|
|
420
|
+
body: \`### haive \u2014 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.\`
|
|
421
|
+
});
|
|
369
422
|
`;
|
|
370
423
|
function registerInit(program2) {
|
|
371
424
|
program2.command("init").description("Initialize a hAIve project (.ai/ structure + bridge files)").option("-d, --dir <dir>", "project root", process.cwd()).option("--no-bridges", "do not generate CLAUDE.md / .cursorrules / copilot-instructions.md").option("--with-ci", "write a GitHub Actions workflow (.github/workflows/haive-sync.yml)").action(async (opts) => {
|
|
@@ -813,6 +866,16 @@ function registerMemoryAdd(memory2) {
|
|
|
813
866
|
const autoTagsEnabled = opts.autoTag !== false;
|
|
814
867
|
const inferredTags = autoTagsEnabled ? inferModulesFromPaths(anchorPaths) : [];
|
|
815
868
|
const mergedTags = Array.from(/* @__PURE__ */ new Set([...userTags, ...inferredTags]));
|
|
869
|
+
if (anchorPaths.length > 0) {
|
|
870
|
+
const missing = anchorPaths.filter((p) => !existsSync7(path7.resolve(root, p)));
|
|
871
|
+
if (missing.length > 0) {
|
|
872
|
+
ui.warn(`Anchor path${missing.length > 1 ? "s" : ""} not found in project:`);
|
|
873
|
+
for (const p of missing) ui.warn(` \u2717 ${p}`);
|
|
874
|
+
ui.warn(
|
|
875
|
+
"Memories anchored to non-existent paths will be immediately marked stale by `haive sync`.\n Verify the paths are relative to the project root and the files/directories exist."
|
|
876
|
+
);
|
|
877
|
+
}
|
|
878
|
+
}
|
|
816
879
|
const title = opts.title ?? opts.slug;
|
|
817
880
|
let body;
|
|
818
881
|
if (opts.bodyFile !== void 0) {
|
|
@@ -2120,6 +2183,11 @@ function registerSessionEnd(session2) {
|
|
|
2120
2183
|
const body = buildRecapBody(opts);
|
|
2121
2184
|
const topic = recapTopic(scope, opts.module);
|
|
2122
2185
|
const filesTouched = parseCsv5(opts.files);
|
|
2186
|
+
const missingPaths = filesTouched.filter((p) => !existsSync25(path23.resolve(root, p)));
|
|
2187
|
+
if (missingPaths.length > 0) {
|
|
2188
|
+
ui.warn(`Anchor path${missingPaths.length > 1 ? "s" : ""} not found in project (will be stale):`);
|
|
2189
|
+
for (const p of missingPaths) ui.warn(` \u2717 ${p}`);
|
|
2190
|
+
}
|
|
2123
2191
|
if (existsSync25(paths.memoriesDir)) {
|
|
2124
2192
|
const existing = await loadMemoriesFromDir5(paths.memoriesDir);
|
|
2125
2193
|
const topicMatch = existing.find(
|
|
@@ -2167,7 +2235,7 @@ function parseCsv5(value) {
|
|
|
2167
2235
|
|
|
2168
2236
|
// src/index.ts
|
|
2169
2237
|
var program = new Command28();
|
|
2170
|
-
program.name("haive").description("hAIve \u2014 team-first persistent memory layer for AI coding agents").version("0.2.
|
|
2238
|
+
program.name("haive").description("hAIve \u2014 team-first persistent memory layer for AI coding agents").version("0.2.16");
|
|
2171
2239
|
registerInit(program);
|
|
2172
2240
|
registerMcp(program);
|
|
2173
2241
|
registerBriefing(program);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/briefing.ts","../src/utils/ui.ts","../src/commands/tui.ts","../src/commands/embeddings.ts","../src/commands/index-code.ts","../src/commands/init.ts","../src/commands/install-hooks.ts","../src/commands/mcp.ts","../src/commands/sync.ts","../src/commands/memory-add.ts","../src/commands/memory-list.ts","../src/utils/fs.ts","../src/commands/memory-promote.ts","../src/commands/memory-approve.ts","../src/commands/memory-update.ts","../src/commands/memory-auto-promote.ts","../src/commands/memory-edit.ts","../src/commands/memory-for-files.ts","../src/commands/memory-hot.ts","../src/commands/memory-tried.ts","../src/commands/memory-pending.ts","../src/commands/memory-query.ts","../src/commands/memory-reject.ts","../src/commands/memory-rm.ts","../src/commands/memory-show.ts","../src/commands/memory-stats.ts","../src/commands/memory-verify.ts","../src/commands/memory-import.ts","../src/commands/session-end.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { registerBriefing } from \"./commands/briefing.js\";\nimport { registerTui } from \"./commands/tui.js\";\nimport { registerEmbeddings } from \"./commands/embeddings.js\";\nimport { registerIndexCode } from \"./commands/index-code.js\";\nimport { registerInit } from \"./commands/init.js\";\nimport { registerInstallHooks } from \"./commands/install-hooks.js\";\nimport { registerMcp } from \"./commands/mcp.js\";\nimport { registerSync } from \"./commands/sync.js\";\nimport { registerMemoryAdd } from \"./commands/memory-add.js\";\nimport { registerMemoryList } from \"./commands/memory-list.js\";\nimport { registerMemoryPromote } from \"./commands/memory-promote.js\";\nimport { registerMemoryApprove } from \"./commands/memory-approve.js\";\nimport { registerMemoryUpdate } from \"./commands/memory-update.js\";\nimport { registerMemoryAutoPromote } from \"./commands/memory-auto-promote.js\";\nimport { registerMemoryEdit } from \"./commands/memory-edit.js\";\nimport { registerMemoryForFiles } from \"./commands/memory-for-files.js\";\nimport { registerMemoryHot } from \"./commands/memory-hot.js\";\nimport { registerMemoryTried } from \"./commands/memory-tried.js\";\nimport { registerMemoryPending } from \"./commands/memory-pending.js\";\nimport { registerMemoryQuery } from \"./commands/memory-query.js\";\nimport { registerMemoryReject } from \"./commands/memory-reject.js\";\nimport { registerMemoryRm } from \"./commands/memory-rm.js\";\nimport { registerMemoryShow } from \"./commands/memory-show.js\";\nimport { registerMemoryStats } from \"./commands/memory-stats.js\";\nimport { registerMemoryVerify } from \"./commands/memory-verify.js\";\nimport { registerMemoryImport } from \"./commands/memory-import.js\";\nimport { registerSessionEnd } from \"./commands/session-end.js\";\n\nconst program = new Command();\n\ndeclare const __HAIVE_VERSION__: string;\n\nprogram\n .name(\"haive\")\n .description(\"hAIve — team-first persistent memory layer for AI coding agents\")\n .version(__HAIVE_VERSION__);\n\nregisterInit(program);\nregisterMcp(program);\nregisterBriefing(program);\nregisterTui(program);\nregisterEmbeddings(program);\nregisterSync(program);\nregisterInstallHooks(program);\nregisterIndexCode(program);\n\nconst memory = program.command(\"memory\").description(\"Manage memory entries\");\nregisterMemoryAdd(memory);\nregisterMemoryList(memory);\nregisterMemoryQuery(memory);\nregisterMemoryPromote(memory);\nregisterMemoryVerify(memory);\nregisterMemoryStats(memory);\nregisterMemoryReject(memory);\nregisterMemoryAutoPromote(memory);\nregisterMemoryForFiles(memory);\nregisterMemoryShow(memory);\nregisterMemoryEdit(memory);\nregisterMemoryRm(memory);\nregisterMemoryPending(memory);\nregisterMemoryApprove(memory);\nregisterMemoryUpdate(memory);\nregisterMemoryHot(memory);\nregisterMemoryTried(memory);\nregisterMemoryImport(memory);\n\nconst session = program.command(\"session\").description(\"Manage session lifecycle\");\nregisterSessionEnd(session);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n if (isZodError(err)) {\n for (const issue of err.issues) {\n const field = issue.path.length > 0 ? `${String(issue.path.join(\".\"))}: ` : \"\";\n console.error(`\\x1b[31m✗\\x1b[0m ${field}${issue.message}`);\n }\n } else {\n console.error(err instanceof Error ? err.message : err);\n }\n process.exit(1);\n});\n\nfunction isZodError(\n err: unknown,\n): err is { issues: Array<{ path: unknown[]; message: string }> } {\n return (\n err !== null &&\n typeof err === \"object\" &&\n \"issues\" in err &&\n Array.isArray((err as Record<string, unknown>).issues)\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadMemoriesFromDir,\n memoryMatchesAnchorPaths,\n resolveHaivePaths,\n tokenizeQuery,\n trackReads,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface BriefingOptions {\n task?: string;\n files?: string;\n maxMemories?: string;\n scope?: string;\n includeDraft?: boolean;\n includeStale?: boolean;\n dir?: string;\n}\n\nexport function registerBriefing(program: Command): void {\n program\n .command(\"briefing\")\n .description(\n \"Print project context + relevant memories in one shot — ideal for agent onboarding\",\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 (anchors memories)\")\n .option(\"--max-memories <n>\", \"cap on memories surfaced\", \"10\")\n .option(\n \"--scope <scope>\",\n \"personal | team | module | all (default: team)\",\n \"team\",\n )\n .option(\"--include-draft\", \"include draft memories (excluded by default)\")\n .option(\"--include-stale\", \"include stale memories (excluded by default — may be outdated)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: BriefingOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.memoriesDir)) {\n // No memories yet — just print project context and exit\n if (existsSync(paths.projectContext)) {\n console.log(`${ui.bold(\"=== Project Context ===\")}\\n`);\n console.log((await readFile(paths.projectContext, \"utf8\")).trim());\n } else {\n ui.warn(\"No project-context.md found. Run `haive init` and the `bootstrap_project` MCP prompt to set it up.\");\n }\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const filePaths = parseCsv(opts.files);\n const tokens = opts.task ? tokenizeQuery(opts.task) : null;\n const maxMemories = Math.max(1, Number(opts.maxMemories ?? 10));\n const scopeFilter = opts.scope ?? \"team\";\n\n // ── 1. Session recap — always shown first so agents start with fresh context ──\n const recaps = all\n .filter(({ memory: mem }) => mem.frontmatter.type === \"session_recap\")\n .sort((a, b) =>\n new Date(b.memory.frontmatter.created_at).getTime() -\n new Date(a.memory.frontmatter.created_at).getTime(),\n );\n if (recaps.length > 0) {\n const recap = recaps[0]!;\n const fm = recap.memory.frontmatter;\n const rev = fm.revision_count ? ` · revision #${fm.revision_count}` : \"\";\n console.log(`${ui.bold(\"=== Last Session Recap ===\")}\\n`);\n console.log(ui.dim(`${fm.id} (${fm.scope}${rev})`));\n console.log(recap.memory.body.trim());\n console.log();\n }\n\n // ── 2. Project context ─────────────────────────────────────────────────────\n if (existsSync(paths.projectContext)) {\n const ctx = await readFile(paths.projectContext, \"utf8\");\n console.log(`${ui.bold(\"=== Project Context ===\")}\\n`);\n console.log(ctx.trim());\n console.log();\n } else {\n ui.warn(\n \"No project-context.md found. Run `haive init` and the `bootstrap_project` MCP prompt to set it up.\",\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) return false;\n if (fm.type === \"session_recap\") return false; // shown separately above\n return true;\n });\n\n // Score by relevance (AND on task tokens; OR fallback if AND produces no task hits)\n const andTaskHits = tokens\n ? new Set(candidates.filter(({ memory: mem }) => literalMatchesAllTokens(mem, tokens)).map(({ memory: mem }) => mem.frontmatter.id))\n : null;\n const useOrFallback = andTaskHits !== null && andTaskHits.size === 0 && (tokens?.length ?? 0) > 1;\n\n const scored = candidates.map(({ memory: mem, filePath }) => {\n const fm = mem.frontmatter;\n let score = 0;\n if (fm.status === \"validated\") score += 3;\n else if (fm.status === \"proposed\") score += 1;\n if (filePaths.length > 0 && memoryMatchesAnchorPaths(mem, filePaths)) score += 4;\n if (tokens) {\n if (andTaskHits?.has(fm.id)) score += 3;\n else if (useOrFallback && literalMatchesAnyToken(mem, tokens)) score += 1;\n }\n return { memory: mem, filePath, score };\n });\n\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, maxMemories);\n\n if (top.length === 0) {\n ui.info(\"No relevant memories found.\");\n const draftCount = all.filter(\n (m) =>\n m.memory.frontmatter.status === \"draft\" &&\n (scopeFilter === \"all\" || m.memory.frontmatter.scope === scopeFilter),\n ).length;\n if (draftCount > 0) {\n ui.info(`(${draftCount} draft memories excluded — use --include-draft to show)`);\n }\n return;\n }\n\n console.log(`${ui.bold(\"=== Relevant Memories ===\")}\\n`);\n for (const { memory: mem } of top) {\n const fm = mem.frontmatter;\n const badge = ui.statusBadge(fm.status);\n const draftMarker = fm.status === \"draft\" ? ui.yellow(\" [DRAFT]\") : \"\";\n const unverifiedMarker = fm.status === \"proposed\" ? ui.yellow(\" [UNVERIFIED]\") : \"\";\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(fm.scope + \"/\" + fm.type)} ${badge}${draftMarker}${unverifiedMarker}`,\n );\n console.log(mem.body.trim());\n console.log();\n }\n console.log(ui.dim(`${top.length} memor${top.length === 1 ? \"y\" : \"ies\"} surfaced`));\n\n // Track reads so usage stats, decay, and hot-memory detection work via CLI too\n const ids = top.map(({ memory: mem }) => mem.frontmatter.id);\n if (ids.length > 0) {\n await trackReads(paths, ids).catch(() => { /* non-fatal */ });\n }\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n","import pc from \"picocolors\";\n\nexport const ui = {\n info: (msg: string) => console.log(pc.cyan(\"ℹ\"), msg),\n success: (msg: string) => console.log(pc.green(\"✓\"), msg),\n warn: (msg: string) => console.log(pc.yellow(\"⚠\"), msg),\n error: (msg: string) => console.error(pc.red(\"✗\"), msg),\n dim: (msg: string) => pc.dim(msg),\n bold: (msg: string) => pc.bold(msg),\n green: (msg: string) => pc.green(msg),\n yellow: (msg: string) => pc.yellow(msg),\n red: (msg: string) => pc.red(msg),\n statusBadge: (status: string): string => {\n switch (status) {\n case \"validated\": return pc.green(status);\n case \"proposed\": return pc.yellow(status);\n case \"stale\": return pc.yellow(status);\n case \"rejected\": return pc.red(status);\n case \"deprecated\": return pc.dim(status);\n default: return pc.dim(status); // draft\n }\n },\n};\n","import { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\n\nexport function registerTui(program: Command): void {\n program\n .command(\"tui\")\n .description(\"Interactive TUI dashboard — browse, filter, and manage memories in the terminal\")\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.command(\"index\").description(\"Build local indexes that help AIs read less code\");\n idx.action(() => idx.help());\n idx\n .command(\"code\")\n .description(\"Scan source files and write .ai/code-map.json (file → exports + 1-line description)\")\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","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { 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\nconst PROJECT_CONTEXT_TEMPLATE = `# Project context\n\n> Generated by \\`haive init\\`. Edit this file (or let your AI agent fill it via the upcoming MCP \\`bootstrap_project\\` tool).\n\n## Architecture\nTODO — high-level overview of the codebase.\n\n## Key modules\nTODO — list main modules and their purpose.\n\n## Conventions\nTODO — coding conventions, naming, patterns the team follows.\n\n## Glossary\nTODO — domain terms and what they mean here.\n\n## Gotchas\nTODO — known traps, surprising behavior, things newcomers stub their toes on.\n`;\n\nconst BRIDGE_BODY = `<!-- hAIve bridge file — do not edit by hand. -->\n<!-- This file points your AI tool at the shared hAIve project context. -->\n\nSee \\`.ai/project-context.md\\` for the full project context.\nMemories live under \\`.ai/memories/\\` (personal/team/module).\n\n## hAIve — mandatory rules for AI agents\n- **Before** marking a task as done (\"Done\", \"Finished\", \"C'est fait\"), call the MCP prompt \\`post_task\\`.\n- **Immediately** when an approach fails (wrong API, wrong pattern, wrong assumption), call \\`mem_tried\\` — do not wait until the end of the session.\n- When starting a new task, call \\`get_briefing\\` with the task description to load relevant memories and avoid repeating past mistakes.\n`;\n\nconst CI_WORKFLOW = `name: haive-sync\n\non:\n push:\n branches: [main, master]\n pull_request:\n paths:\n - '.ai/**'\n\njobs:\n sync:\n runs-on: ubuntu-latest\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 CLI\n run: npm install -g @haive/cli\n\n - name: Sync memories (verify anchors + auto-promote)\n run: haive sync --quiet\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\nexport function registerInit(program: Command): void {\n program\n .command(\"init\")\n .description(\"Initialize a hAIve project (.ai/ structure + bridge files)\")\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .option(\"--no-bridges\", \"do not generate CLAUDE.md / .cursorrules / copilot-instructions.md\")\n .option(\"--with-ci\", \"write a GitHub Actions workflow (.github/workflows/haive-sync.yml)\")\n .action(async (opts: { dir: string; bridges: boolean; withCi?: boolean }) => {\n const root = path.resolve(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (existsSync(paths.haiveDir)) {\n ui.warn(`.ai/ already exists at ${paths.haiveDir} — leaving existing files in place.`);\n }\n\n await mkdir(paths.personalDir, { recursive: true });\n await mkdir(paths.teamDir, { recursive: true });\n await mkdir(paths.moduleDir, { recursive: true });\n await mkdir(paths.modulesContextDir, { recursive: true });\n\n if (!existsSync(paths.projectContext)) {\n await writeFile(paths.projectContext, PROJECT_CONTEXT_TEMPLATE, \"utf8\");\n ui.success(`Created ${path.relative(root, paths.projectContext)}`);\n }\n\n if (opts.bridges) {\n await writeBridge(root, \"CLAUDE.md\");\n await writeBridge(root, \".cursorrules\");\n await writeBridge(root, path.join(\".github\", \"copilot-instructions.md\"));\n }\n\n if (opts.withCi) {\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 ui.success(`hAIve initialized at ${root}`);\n console.log();\n console.log(ui.bold(\"Next steps:\"));\n console.log(\n ui.dim(\" 1. Fill project context — let your AI agent do it:\"),\n );\n console.log(\n \" \" + ui.bold(\"In your AI client (Claude, Cursor…), invoke the MCP prompt: bootstrap_project\"),\n );\n console.log(\n ui.dim(\" This analyzes your codebase and writes .ai/project-context.md automatically.\"),\n );\n console.log(\n ui.dim(\" Without this step, get_briefing returns a blank template (little value).\"),\n );\n console.log();\n console.log(ui.dim(\" 2. Point your AI client at the MCP server:\"));\n console.log(\n ` haive-mcp --root ${root}`,\n );\n console.log();\n console.log(ui.dim(\" 3. Start every AI session with:\"));\n console.log(\" \" + ui.bold(\"get_briefing({ task: '…what you are about to do…' })\"));\n });\n}\n\nasync function writeBridge(root: string, relPath: string): Promise<void> {\n const target = path.join(root, relPath);\n if (existsSync(target)) {\n ui.info(`Bridge ${relPath} already exists — skipped`);\n return;\n }\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, BRIDGE_BODY, \"utf8\");\n ui.success(`Created bridge ${relPath}`);\n}\n\n","import { mkdir, writeFile, chmod, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface InstallHooksOptions {\n dir?: string;\n force?: boolean;\n}\n\nconst HOOK_MARKER = \"# hAIve auto-generated\";\n\nconst HOOK_BODY = `#!/bin/sh\n${HOOK_MARKER} — keep this block to allow upgrades. Hand-edit anything outside it.\n\n# After a merge or pull, refresh memory anchors and auto-promote eligible\n# memories so that everyone on this branch sees consistent confidence levels.\nif command -v haive >/dev/null 2>&1; then\n haive sync --quiet --since ORIG_HEAD || true\nelif [ -x ./node_modules/.bin/haive ]; then\n ./node_modules/.bin/haive sync --quiet --since ORIG_HEAD || true\nfi\n`;\n\nconst HOOKS = [\"post-merge\", \"post-rewrite\"] as const;\n\nexport function registerInstallHooks(program: Command): void {\n program\n .command(\"install-hooks\")\n .description(\"Install git hooks that run `haive sync` after pull/merge\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--force\", \"overwrite existing hooks\")\n .action(async (opts: InstallHooksOptions) => {\n const root = findProjectRoot(opts.dir);\n const gitDir = path.join(root, \".git\");\n if (!existsSync(gitDir)) {\n ui.error(`No .git directory at ${root}.`);\n process.exitCode = 1;\n return;\n }\n const hooksDir = path.join(gitDir, \"hooks\");\n await mkdir(hooksDir, { recursive: true });\n\n let installed = 0;\n let skipped = 0;\n for (const name of HOOKS) {\n const file = path.join(hooksDir, name);\n if (existsSync(file) && !opts.force) {\n const existing = await readFile(file, \"utf8\");\n if (!existing.includes(HOOK_MARKER)) {\n ui.warn(`${name} already exists and was not written by hAIve. Re-run with --force to overwrite.`);\n skipped++;\n continue;\n }\n }\n await writeFile(file, HOOK_BODY, \"utf8\");\n await chmod(file, 0o755);\n installed++;\n }\n ui.success(`Installed ${installed} hook(s) in .git/hooks/${skipped ? `, skipped ${skipped}` : \"\"}`);\n ui.info(\"Test with: git pull (or any merge), then check .ai/memories for status updates.\");\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nconst require = createRequire(import.meta.url);\n\ninterface McpOptions {\n dir?: string;\n}\n\nexport function registerMcp(program: Command): void {\n program\n .command(\"mcp\")\n .description(\"Start the hAIve MCP server (stdio transport)\")\n .option(\"-d, --dir <dir>\", \"project root (defaults to nearest .ai/ or .git/)\")\n .action((opts: McpOptions) => {\n const root = findProjectRoot(opts.dir);\n const bin = locateMcpBin();\n if (!bin) {\n ui.error(\n \"@hiveai/mcp binary not found. Install @hiveai/mcp or run `pnpm build` in the monorepo.\",\n );\n process.exit(1);\n }\n const child = spawn(\"node\", [bin, \"--root\", root], {\n stdio: [\"inherit\", \"inherit\", \"inherit\"],\n env: process.env,\n });\n child.on(\"exit\", (code) => process.exit(code ?? 0));\n });\n}\n\nfunction locateMcpBin(): string | null {\n // 1. Resolve the @hiveai/mcp package and use its bin entry.\n try {\n const pkgPath = require.resolve(\"@hiveai/mcp/package.json\");\n const pkgDir = path.dirname(pkgPath);\n const candidate = path.join(pkgDir, \"dist\", \"index.js\");\n if (existsSync(candidate)) return candidate;\n } catch {\n // not installed — fall through\n }\n\n // 2. Fallback: look for sibling package in monorepo dev mode.\n const here = path.dirname(fileURLToPath(import.meta.url));\n const sibling = path.resolve(here, \"..\", \"..\", \"..\", \"mcp\", \"dist\", \"index.js\");\n if (existsSync(sibling)) return sibling;\n\n return null;\n}\n","import { spawnSync } from \"node:child_process\";\nimport { readFile, writeFile } 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 isDecaying,\n loadMemoriesFromDir,\n loadUsageIndex,\n resolveHaivePaths,\n serializeMemory,\n verifyAnchor,\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}\n\nexport function registerSync(program: Command): void {\n program\n .command(\"sync\")\n .description(\"Refresh memory state after a pull/merge: verify anchors, auto-promote, report changes\")\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 .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 let staleMarked = 0;\n let revalidated = 0;\n let promoted = 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 for (const { memory, filePath } of memories) {\n if (\n isAutoPromoteEligible(\n memory.frontmatter,\n getUsage(usage, memory.frontmatter.id),\n DEFAULT_AUTO_PROMOTE_RULE,\n )\n ) {\n await writeFile(\n filePath,\n serializeMemory({\n frontmatter: { ...memory.frontmatter, status: \"validated\" },\n body: memory.body,\n }),\n \"utf8\",\n );\n promoted++;\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 log(\n `${ui.dim(\"sync:\")} ${staleMarked} stale · ${revalidated} revalidated · ${promoted} promoted${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 // --embed: rebuild embeddings index after sync\n if (opts.embed) {\n try {\n const emb = await import(\"@hiveai/embeddings\");\n log(ui.dim(\"embed: rebuilding index…\"));\n const report = await emb.rebuildIndex(paths);\n log(ui.dim(`embed: index rebuilt (${report.added} added, ${report.updated} updated, ${report.removed} removed)`));\n } catch {\n ui.warn(\"--embed: @hiveai/embeddings not available or index build failed. Run `haive embeddings index` manually.\");\n }\n }\n });\n}\n\nasync function injectBridge(\n bridgeFile: string,\n memoriesDir: string,\n maxMemories: number,\n root: string,\n quiet?: boolean,\n): Promise<void> {\n if (!existsSync(memoriesDir)) return;\n\n const all = await loadMemoriesFromDir(memoriesDir);\n const top = all\n .filter(({ memory }) => {\n const s = memory.frontmatter.status;\n if (memory.frontmatter.type === \"session_recap\") return false;\n return s === \"validated\" || s === \"proposed\";\n })\n .sort((a, b) => {\n const score = (m: typeof a) => {\n const s = m.memory.frontmatter.status;\n return (s === \"validated\" ? 2 : 1);\n };\n return score(b) - score(a);\n })\n .slice(0, maxMemories);\n\n const block = top\n .map((m) => {\n const fm = m.memory.frontmatter;\n const unverified = fm.status === \"proposed\" ? \" [UNVERIFIED]\" : \"\";\n return `### ${fm.id} (${fm.scope}/${fm.type})${unverified}\\n${m.memory.body.trim()}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n const injected =\n `${BRIDGE_START}\\n` +\n `<!-- AUTO-GENERATED by haive sync --inject-bridge — do not edit between these markers -->\\n\\n` +\n block +\n `\\n\\n${BRIDGE_END}`;\n\n const fileExists = existsSync(bridgeFile);\n let existing = fileExists ? await readFile(bridgeFile, \"utf8\") : \"\";\n // Normalize line endings to avoid \\r\\n accumulation\n existing = existing.replace(/\\r\\n/g, \"\\n\");\n\n const startIdx = existing.indexOf(BRIDGE_START);\n const endIdx = existing.indexOf(BRIDGE_END);\n\n // Detect partial markers — safer to abort than silently corrupt the file\n if (startIdx !== -1 && endIdx === -1) {\n ui.warn(`${path.relative(root, bridgeFile)}: found ${BRIDGE_START} without ${BRIDGE_END}. Fix the file manually before running --inject-bridge.`);\n return;\n }\n if (startIdx === -1 && endIdx !== -1) {\n ui.warn(`${path.relative(root, bridgeFile)}: found ${BRIDGE_END} without ${BRIDGE_START}. Fix the file manually before running --inject-bridge.`);\n return;\n }\n\n let updated: string;\n if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {\n updated = existing.slice(0, startIdx) + injected + existing.slice(endIdx + BRIDGE_END.length);\n } else {\n if (!fileExists && !quiet) {\n ui.info(`Creating ${path.relative(root, bridgeFile)} with haive memory block.`);\n }\n updated = existing + (existing.endsWith(\"\\n\") ? \"\" : \"\\n\") + \"\\n\" + injected + \"\\n\";\n }\n\n await writeFile(bridgeFile, updated, \"utf8\");\n if (!quiet) {\n console.log(\n ui.dim(`bridge: injected ${top.length} memor${top.length === 1 ? \"y\" : \"ies\"} into ${path.relative(root, bridgeFile)}`),\n );\n }\n}\n\ninterface SinceReport {\n added: string[];\n modified: string[];\n removed: string[];\n}\n\nfunction collectSinceChanges(root: string, ref: string): SinceReport | null {\n const result = spawnSync(\n \"git\",\n [\"-C\", root, \"diff\", \"--name-status\", \"--diff-filter=AMD\", `${ref}...HEAD`, \"--\", \".ai/memories\"],\n { encoding: \"utf8\" },\n );\n if (result.status !== 0) return null;\n\n const report: SinceReport = { added: [], modified: [], removed: [] };\n for (const line of result.stdout.split(\"\\n\")) {\n const [status, ...rest] = line.split(\"\\t\");\n const file = rest.join(\"\\t\").trim();\n if (!file) continue;\n if (status === \"A\") report.added.push(file);\n else if (status === \"M\") report.modified.push(file);\n else if (status === \"D\") report.removed.push(file);\n }\n return report;\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n inferModulesFromPaths,\n loadMemoriesFromDir,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n type MemoryFrontmatter,\n type MemoryScope,\n type MemoryType,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface AddOptions {\n type: MemoryType;\n slug: string;\n title?: string;\n scope?: MemoryScope;\n module?: string;\n tags?: string;\n domain?: string;\n author?: string;\n paths?: string;\n symbols?: string;\n commit?: string;\n body?: string;\n bodyFile?: string;\n topic?: string;\n dir?: string;\n}\n\nexport function registerMemoryAdd(memory: Command): void {\n memory\n .command(\"add\")\n .description(\"Add a new memory (defaults to personal scope)\")\n .requiredOption(\"--type <type>\", \"convention | decision | gotcha | architecture | glossary | attempt\")\n .requiredOption(\"--slug <slug>\", \"short 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\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"--tags <csv>\", \"comma-separated tags\")\n .option(\"--domain <domain>\", \"domain (e.g. transactions)\")\n .option(\"--author <author>\", \"author email or handle\")\n .option(\"--paths <csv>\", \"anchor paths, comma-separated\")\n .option(\"--symbols <csv>\", \"anchor symbols, comma-separated\")\n .option(\"--commit <sha>\", \"anchor 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 — alternative to --body for long content\")\n .option(\"--no-auto-tag\", \"disable automatic tag suggestions inferred from anchor paths\")\n .option(\"--topic <key>\", \"stable key: if a memory with this topic+scope already exists it is updated 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 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 — negative knowledge to prevent repeated AI mistakes\",\n )\n .requiredOption(\"--what <text>\", \"what approach was tried\")\n .requiredOption(\"--why-failed <text>\", \"why it failed or should NOT be used\")\n .option(\"--instead <text>\", \"recommended alternative\")\n .option(\"--scope <scope>\", \"personal | team | module\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"--tags <csv>\", \"comma-separated tags\")\n .option(\"--paths <csv>\", \"anchor paths, comma-separated\")\n .option(\"--author <author>\", \"author email or handle\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: TriedOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const slug = opts.what\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .trim()\n .split(/\\s+/)\n .slice(0, 5)\n .join(\"-\");\n\n const baseFm = buildFrontmatter({\n type: \"attempt\",\n slug,\n scope: opts.scope,\n module: opts.module,\n tags: parseCsv(opts.tags),\n paths: parseCsv(opts.paths),\n author: opts.author,\n });\n // attempt memories are immediately validated — no review cycle needed\n const frontmatter = { ...baseFm, status: \"validated\" as const };\n\n const lines: string[] = [`# ${opts.what}`, \"\"];\n lines.push(`**Why it failed / do NOT use:** ${opts.whyFailed}`);\n if (opts.instead) {\n lines.push(\"\", `**Instead, use:** ${opts.instead}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n\n const file = memoryFilePath(paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n ui.error(`Memory already exists at ${file}`);\n process.exitCode = 1;\n return;\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n ui.success(`Recorded: ${path.relative(root, file)}`);\n ui.info(`id=${frontmatter.id} type=attempt status=validated (auto-approved)`);\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface PendingOptions {\n scope?: \"personal\" | \"team\" | \"module\";\n dir?: string;\n}\n\nexport function registerMemoryPending(memory: Command): void {\n memory\n .command(\"pending\")\n .description(\"List 'proposed' memories awaiting review (sorted by reads desc)\")\n .option(\"--scope <scope>\", \"filter by scope (personal | team | module)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: PendingOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const proposed = all.filter(({ memory: mem }) => {\n if (mem.frontmatter.status !== \"proposed\") return false;\n if (opts.scope && mem.frontmatter.scope !== opts.scope) return false;\n return true;\n });\n\n if (proposed.length === 0) {\n ui.info(\"No memories awaiting review.\");\n return;\n }\n\n proposed.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n const now = Date.now();\n for (const { memory: mem, filePath } of proposed) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const ageDays = Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000);\n const ageStr = ageDays === 0 ? \"today\" : `${ageDays}d`;\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.dim(`age=${ageStr} reads=${u.read_count} rejections=${u.rejected_count}`)}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n ui.info(`${proposed.length} pending`);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n extractSnippet,\n findProjectRoot,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n pickSnippetNeedle,\n resolveHaivePaths,\n tokenizeQuery,\n trackReads,\n type MemoryScope,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface QueryOptions {\n dir?: string;\n limit?: string;\n scope?: MemoryScope;\n status?: string;\n showRejected?: boolean;\n}\n\nexport function registerMemoryQuery(memory: Command): void {\n memory\n .command(\"query <text>\")\n .description(\"Search memories by id, tag, or substring (AND, OR fallback)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--limit <n>\", \"max results\", \"20\")\n .option(\"--scope <scope>\", \"personal | team | module\")\n .option(\"--status <csv>\", \"filter by status (draft,proposed,validated,stale,rejected)\")\n .option(\"--show-rejected\", \"include rejected memories (hidden by default)\")\n .action(async (text: string, opts: QueryOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No memories directory at ${paths.memoriesDir}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const tokens = tokenizeQuery(text);\n if (tokens.length === 0) {\n ui.warn(\"Empty query — use \\`haive memory list\\` to list all memories.\");\n return;\n }\n const statusFilter = opts.status ? opts.status.split(\",\").map((s) => s.trim()) : null;\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n\n const passesFilters = (mem: (typeof all)[number][\"memory\"]) => {\n const fm = mem.frontmatter;\n if (opts.scope && fm.scope !== opts.scope) return false;\n if (!opts.showRejected && !statusFilter && fm.status === \"rejected\") return false;\n if (statusFilter && !statusFilter.includes(fm.status)) return false;\n // session_recap surfaces in briefing as last_session, not in regular search\n if (fm.type === \"session_recap\") return false;\n return true;\n };\n\n const eligible = all.filter(({ memory: mem }) => passesFilters(mem));\n let matches = eligible.filter(({ memory: mem }) => literalMatchesAllTokens(mem, tokens));\n let fallback = false;\n if (matches.length === 0 && tokens.length > 1) {\n matches = eligible.filter(({ memory: mem }) => literalMatchesAnyToken(mem, tokens));\n fallback = true;\n }\n\n const limit = Math.max(1, Number(opts.limit ?? 20));\n const top = matches.slice(0, limit);\n\n if (top.length === 0) {\n ui.info(`No matches for \"${text}\".`);\n return;\n }\n if (fallback) {\n ui.info(`No exact match — showing partial results (OR fallback):`);\n }\n\n const snippetNeedle = pickSnippetNeedle(text);\n for (const { memory: mem, filePath } of top) {\n const fm = mem.frontmatter;\n const statusBadge = ui.statusBadge(fm.status);\n console.log(`${ui.bold(fm.id)} ${ui.dim(fm.scope)} ${statusBadge}`);\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n const snippet = extractSnippet(mem.body, snippetNeedle);\n if (snippet) console.log(` ${snippet}`);\n }\n console.log(\n ui.dim(`\\n${top.length} of ${matches.length} match${matches.length === 1 ? \"\" : \"es\"}`),\n );\n\n // Track reads for usage stats / decay / hot detection\n const ids = top.map(({ memory: mem }) => mem.frontmatter.id);\n if (ids.length > 0) {\n await trackReads(paths, ids).catch(() => { /* non-fatal */ });\n }\n });\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadUsageIndex,\n recordRejection,\n resolveHaivePaths,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface RejectOptions {\n reason?: string;\n dir?: string;\n}\n\nexport function registerMemoryReject(memory: Command): void {\n memory\n .command(\"reject <id>\")\n .description(\"Record a rejection (blocks auto-promotion and lowers confidence)\")\n .option(\"-r, --reason <reason>\", \"why this memory is being rejected\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: RejectOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === id);\n if (!loaded) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: {\n ...loaded.memory.frontmatter,\n status: \"rejected\",\n stale_reason: opts.reason ?? loaded.memory.frontmatter.stale_reason ?? null,\n },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(paths);\n recordRejection(idx, id, opts.reason ?? null);\n await saveUsageIndex(paths, idx);\n const u = idx.by_id[id]!;\n ui.success(\n `Rejected ${id} (status=rejected, ${u.rejected_count} rejection${u.rejected_count === 1 ? \"\" : \"s\"})`,\n );\n if (opts.reason) ui.info(`reason: ${opts.reason}`);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadUsageIndex,\n resolveHaivePaths,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface RmOptions {\n yes?: boolean;\n keepUsage?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryRm(memory: Command): void {\n memory\n .command(\"rm <id>\")\n .description(\"Delete a memory file (and its usage entry by default)\")\n .option(\"-y, --yes\", \"skip the confirmation prompt\")\n .option(\"--keep-usage\", \"do not remove the usage.json entry\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: RmOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n const rel = path.relative(root, found.filePath);\n if (!opts.yes) {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = (await rl.question(`Delete ${rel}? [y/N] `)).trim().toLowerCase();\n rl.close();\n if (answer !== \"y\" && answer !== \"yes\") {\n ui.info(\"Aborted.\");\n return;\n }\n }\n\n await unlink(found.filePath);\n ui.success(`Deleted ${rel}`);\n\n if (!opts.keepUsage) {\n const idx = await loadUsageIndex(paths);\n if (idx.by_id[id]) {\n delete idx.by_id[id];\n await saveUsageIndex(paths, idx);\n ui.info(\"Removed usage entry\");\n }\n }\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ShowOptions {\n raw?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryShow(memory: Command): void {\n memory\n .command(\"show <id>\")\n .description(\"Print a memory's frontmatter, body, and confidence/usage\")\n .option(\"--raw\", \"print the raw file contents instead of a summary\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: ShowOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n if (opts.raw) {\n console.log(await readFile(found.filePath, \"utf8\"));\n return;\n }\n\n const fm = found.memory.frontmatter;\n const usage = await loadUsageIndex(paths);\n const u = getUsage(usage, fm.id);\n const conf = deriveConfidence(fm, u);\n\n console.log(ui.bold(fm.id));\n console.log(`${ui.dim(\"scope:\")} ${fm.scope}${fm.module ? ` / ${fm.module}` : \"\"}`);\n console.log(`${ui.dim(\"type:\")} ${fm.type}`);\n console.log(`${ui.dim(\"status:\")} ${fm.status} ${ui.dim(\"→ confidence:\")} ${ui.bold(conf)}`);\n console.log(`${ui.dim(\"tags:\")} ${fm.tags.length ? fm.tags.join(\", \") : \"(none)\"}`);\n console.log(`${ui.dim(\"created:\")} ${fm.created_at}`);\n if (fm.verified_at) console.log(`${ui.dim(\"verified:\")} ${fm.verified_at}`);\n if (fm.stale_reason) console.log(`${ui.dim(\"stale:\")} ${fm.stale_reason}`);\n console.log(`${ui.dim(\"reads:\")} ${u.read_count} ${ui.dim(\"rejections:\")} ${u.rejected_count}`);\n console.log(`${ui.dim(\"file:\")} ${path.relative(root, found.filePath)}`);\n if (fm.anchor.paths.length || fm.anchor.symbols.length) {\n console.log(ui.dim(\"anchor:\"));\n if (fm.anchor.commit) console.log(` ${ui.dim(\"commit:\")} ${fm.anchor.commit}`);\n if (fm.anchor.paths.length)\n console.log(` ${ui.dim(\"paths:\")} ${fm.anchor.paths.join(\", \")}`);\n if (fm.anchor.symbols.length)\n console.log(` ${ui.dim(\"symbols:\")} ${fm.anchor.symbols.join(\", \")}`);\n }\n console.log();\n console.log(found.memory.body);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface StatsOptions {\n id?: string;\n dir?: string;\n}\n\nexport function registerMemoryStats(memory: Command): void {\n memory\n .command(\"stats\")\n .description(\"Show usage stats and confidence levels per memory\")\n .option(\"--id <id>\", \"show stats for a single memory id\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: StatsOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const target = opts.id\n ? all.filter((m) => m.memory.frontmatter.id === opts.id)\n : all;\n\n if (target.length === 0) {\n ui.info(opts.id ? `No memory with id \"${opts.id}\".` : \"No memories.\");\n return;\n }\n\n // Sort by read_count desc to surface the popular ones.\n target.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n for (const { memory: mem, filePath } of target) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const conf = deriveConfidence(fm, u);\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(conf)}`,\n );\n console.log(\n ` ${ui.dim(\"status:\")} ${fm.status} ${ui.dim(\"reads:\")} ${u.read_count} ${ui.dim(\"rejections:\")} ${u.rejected_count}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n });\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n resolveHaivePaths,\n serializeMemory,\n verifyAnchor,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface VerifyOptions {\n id?: string;\n all?: boolean;\n update?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryVerify(memory: Command): void {\n memory\n .command(\"verify\")\n .description(\"Check memory anchors against current code, optionally marking stale ones\")\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 for re-freshed) 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 session end — save a structured end-of-session recap.\n *\n * Uses topic-upsert: one recap per scope is kept and updated in-place.\n * get_briefing automatically surfaces the latest recap at the next session start.\n */\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n loadMemoriesFromDir,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n type MemoryFrontmatter,\n type MemoryScope,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface SessionEndOptions {\n goal: string;\n accomplished: string;\n discoveries?: string;\n files?: string;\n next?: string;\n scope?: MemoryScope;\n module?: string;\n dir?: string;\n}\n\nfunction buildRecapBody(opts: SessionEndOptions): string {\n const lines: string[] = [];\n lines.push(`## Goal\\n${opts.goal}`);\n lines.push(`\\n## Accomplished\\n${opts.accomplished}`);\n if (opts.discoveries?.trim()) {\n lines.push(`\\n## Discoveries & surprises\\n${opts.discoveries}`);\n }\n const filesTouched = parseCsv(opts.files);\n if (filesTouched.length > 0) {\n lines.push(`\\n## Files touched\\n${filesTouched.map((f) => `- \\`${f}\\``).join(\"\\n\")}`);\n }\n if (opts.next?.trim()) {\n lines.push(`\\n## Next steps\\n${opts.next}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction recapTopic(scope: string, module?: string): string {\n return module ? `session-recap-${scope}-${module}` : `session-recap-${scope}`;\n}\n\nexport function registerSessionEnd(session: Command): void {\n session\n .command(\"end\")\n .description(\"Save a structured end-of-session recap (goal / accomplished / discoveries / next steps)\")\n .requiredOption(\"--goal <text>\", \"What you were trying to accomplish (1–2 sentences)\")\n .requiredOption(\"--accomplished <text>\", \"What was actually done (bullet list recommended)\")\n .option(\"--discoveries <text>\", \"Bugs, surprises, or inconsistencies found during this session\")\n .option(\"--files <csv>\", \"Key files touched, comma-separated\")\n .option(\"--next <text>\", \"What should happen next (for the next session or a teammate)\")\n .option(\"--scope <scope>\", \"personal | team | module\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: SessionEndOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const scope = opts.scope ?? \"personal\";\n const body = buildRecapBody(opts);\n const topic = recapTopic(scope, opts.module);\n const filesTouched = parseCsv(opts.files);\n\n // ── Topic upsert ────────────────────────────────────────────────\n if (existsSync(paths.memoriesDir)) {\n const existing = await loadMemoriesFromDir(paths.memoriesDir);\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === topic &&\n memory.frontmatter.scope === scope &&\n (!opts.module || memory.frontmatter.module === opts.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const revisionCount = (fm.revision_count ?? 0) + 1;\n const newFrontmatter: MemoryFrontmatter = {\n ...fm,\n revision_count: revisionCount,\n anchor: {\n ...fm.anchor,\n paths: filesTouched.length ? filesTouched : fm.anchor.paths,\n },\n };\n await writeFile(topicMatch.filePath, serializeMemory({ frontmatter: newFrontmatter, body }), \"utf8\");\n ui.success(`Session recap updated (revision #${revisionCount})`);\n ui.info(`id=${fm.id} file=${path.relative(root, topicMatch.filePath)}`);\n return;\n }\n }\n\n // ── Create first recap ──────────────────────────────────────────\n const frontmatter = buildFrontmatter({\n type: \"session_recap\",\n slug: \"recap\",\n scope,\n module: opts.module,\n tags: [\"session\", \"recap\"],\n paths: filesTouched,\n topic,\n status: \"validated\",\n });\n\n const file = memoryFilePath(paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n ui.success(`Session recap created`);\n ui.info(`id=${frontmatter.id} scope=${scope} file=${path.relative(root, file)}`);\n ui.info(\"Next session: call \\`get_briefing\\` — the recap will be surfaced automatically.\");\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n"],"mappings":"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","names":["Command","program","findProjectRoot","program","existsSync","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","path","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","path","existsSync","path","resolveHaivePaths","program","path","resolveHaivePaths","existsSync","mkdir","writeFile","readFile","existsSync","path","findProjectRoot","program","findProjectRoot","path","existsSync","mkdir","readFile","writeFile","existsSync","path","findProjectRoot","require","program","findProjectRoot","path","existsSync","readFile","writeFile","existsSync","path","findProjectRoot","loadMemoriesFromDir","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memory","writeFile","path","readFile","mkdir","readFile","writeFile","existsSync","path","findProjectRoot","loadMemoriesFromDir","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","parseCsv","readFile","loadMemoriesFromDir","writeFile","serializeMemory","path","mkdir","existsSync","path","findProjectRoot","resolveHaivePaths","loadMemoriesFromDir","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","mkdir","writeFile","existsSync","path","findProjectRoot","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memoryFilePath","mkdir","path","writeFile","serializeMemory","existsSync","writeFile","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","found","next","writeFile","serializeMemory","path","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","parseCsv","writeFile","serializeMemory","path","writeFile","existsSync","path","DEFAULT_AUTO_PROMOTE_RULE","findProjectRoot","getUsage","isAutoPromoteEligible","loadUsageIndex","resolveHaivePaths","serializeMemory","memory","DEFAULT_AUTO_PROMOTE_RULE","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","isAutoPromoteEligible","getUsage","path","writeFile","serializeMemory","spawn","existsSync","readFile","path","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","readFile","spawn","existsSync","path","findProjectRoot","getUsage","inferModulesFromPaths","loadUsageIndex","memoryMatchesAnchorPaths","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","inferModulesFromPaths","memoryMatchesAnchorPaths","getUsage","path","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","mkdir","writeFile","existsSync","path","buildFrontmatter","findProjectRoot","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","buildFrontmatter","parseCsv","memoryFilePath","mkdir","path","writeFile","serializeMemory","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","existsSync","path","findProjectRoot","literalMatchesAllTokens","literalMatchesAnyToken","resolveHaivePaths","tokenizeQuery","trackReads","memory","findProjectRoot","resolveHaivePaths","existsSync","tokenizeQuery","loadMemoriesFromDir","literalMatchesAllTokens","literalMatchesAnyToken","path","trackReads","writeFile","existsSync","findProjectRoot","loadUsageIndex","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","writeFile","serializeMemory","loadUsageIndex","existsSync","unlink","path","findProjectRoot","loadUsageIndex","resolveHaivePaths","saveUsageIndex","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","unlink","loadUsageIndex","saveUsageIndex","existsSync","readFile","path","deriveConfidence","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","readFile","loadUsageIndex","getUsage","deriveConfidence","path","existsSync","path","deriveConfidence","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","deriveConfidence","path","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","verifyAnchor","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","verifyAnchor","path","writeFile","serializeMemory","readFile","existsSync","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","readFile","writeFile","mkdir","existsSync","path","buildFrontmatter","findProjectRoot","loadMemoriesFromDir","memoryFilePath","resolveHaivePaths","serializeMemory","parseCsv","session","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memory","writeFile","serializeMemory","path","buildFrontmatter","memoryFilePath","mkdir","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/briefing.ts","../src/utils/ui.ts","../src/commands/tui.ts","../src/commands/embeddings.ts","../src/commands/index-code.ts","../src/commands/init.ts","../src/commands/install-hooks.ts","../src/commands/mcp.ts","../src/commands/sync.ts","../src/commands/memory-add.ts","../src/commands/memory-list.ts","../src/utils/fs.ts","../src/commands/memory-promote.ts","../src/commands/memory-approve.ts","../src/commands/memory-update.ts","../src/commands/memory-auto-promote.ts","../src/commands/memory-edit.ts","../src/commands/memory-for-files.ts","../src/commands/memory-hot.ts","../src/commands/memory-tried.ts","../src/commands/memory-pending.ts","../src/commands/memory-query.ts","../src/commands/memory-reject.ts","../src/commands/memory-rm.ts","../src/commands/memory-show.ts","../src/commands/memory-stats.ts","../src/commands/memory-verify.ts","../src/commands/memory-import.ts","../src/commands/session-end.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { registerBriefing } from \"./commands/briefing.js\";\nimport { registerTui } from \"./commands/tui.js\";\nimport { registerEmbeddings } from \"./commands/embeddings.js\";\nimport { registerIndexCode } from \"./commands/index-code.js\";\nimport { registerInit } from \"./commands/init.js\";\nimport { registerInstallHooks } from \"./commands/install-hooks.js\";\nimport { registerMcp } from \"./commands/mcp.js\";\nimport { registerSync } from \"./commands/sync.js\";\nimport { registerMemoryAdd } from \"./commands/memory-add.js\";\nimport { registerMemoryList } from \"./commands/memory-list.js\";\nimport { registerMemoryPromote } from \"./commands/memory-promote.js\";\nimport { registerMemoryApprove } from \"./commands/memory-approve.js\";\nimport { registerMemoryUpdate } from \"./commands/memory-update.js\";\nimport { registerMemoryAutoPromote } from \"./commands/memory-auto-promote.js\";\nimport { registerMemoryEdit } from \"./commands/memory-edit.js\";\nimport { registerMemoryForFiles } from \"./commands/memory-for-files.js\";\nimport { registerMemoryHot } from \"./commands/memory-hot.js\";\nimport { registerMemoryTried } from \"./commands/memory-tried.js\";\nimport { registerMemoryPending } from \"./commands/memory-pending.js\";\nimport { registerMemoryQuery } from \"./commands/memory-query.js\";\nimport { registerMemoryReject } from \"./commands/memory-reject.js\";\nimport { registerMemoryRm } from \"./commands/memory-rm.js\";\nimport { registerMemoryShow } from \"./commands/memory-show.js\";\nimport { registerMemoryStats } from \"./commands/memory-stats.js\";\nimport { registerMemoryVerify } from \"./commands/memory-verify.js\";\nimport { registerMemoryImport } from \"./commands/memory-import.js\";\nimport { registerSessionEnd } from \"./commands/session-end.js\";\n\nconst program = new Command();\n\ndeclare const __HAIVE_VERSION__: string;\n\nprogram\n .name(\"haive\")\n .description(\"hAIve — team-first persistent memory layer for AI coding agents\")\n .version(__HAIVE_VERSION__);\n\nregisterInit(program);\nregisterMcp(program);\nregisterBriefing(program);\nregisterTui(program);\nregisterEmbeddings(program);\nregisterSync(program);\nregisterInstallHooks(program);\nregisterIndexCode(program);\n\nconst memory = program.command(\"memory\").description(\"Manage memory entries\");\nregisterMemoryAdd(memory);\nregisterMemoryList(memory);\nregisterMemoryQuery(memory);\nregisterMemoryPromote(memory);\nregisterMemoryVerify(memory);\nregisterMemoryStats(memory);\nregisterMemoryReject(memory);\nregisterMemoryAutoPromote(memory);\nregisterMemoryForFiles(memory);\nregisterMemoryShow(memory);\nregisterMemoryEdit(memory);\nregisterMemoryRm(memory);\nregisterMemoryPending(memory);\nregisterMemoryApprove(memory);\nregisterMemoryUpdate(memory);\nregisterMemoryHot(memory);\nregisterMemoryTried(memory);\nregisterMemoryImport(memory);\n\nconst session = program.command(\"session\").description(\"Manage session lifecycle\");\nregisterSessionEnd(session);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n if (isZodError(err)) {\n for (const issue of err.issues) {\n const field = issue.path.length > 0 ? `${String(issue.path.join(\".\"))}: ` : \"\";\n console.error(`\\x1b[31m✗\\x1b[0m ${field}${issue.message}`);\n }\n } else {\n console.error(err instanceof Error ? err.message : err);\n }\n process.exit(1);\n});\n\nfunction isZodError(\n err: unknown,\n): err is { issues: Array<{ path: unknown[]; message: string }> } {\n return (\n err !== null &&\n typeof err === \"object\" &&\n \"issues\" in err &&\n Array.isArray((err as Record<string, unknown>).issues)\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadMemoriesFromDir,\n memoryMatchesAnchorPaths,\n resolveHaivePaths,\n tokenizeQuery,\n trackReads,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface BriefingOptions {\n task?: string;\n files?: string;\n maxMemories?: string;\n scope?: string;\n includeDraft?: boolean;\n includeStale?: boolean;\n dir?: string;\n}\n\nexport function registerBriefing(program: Command): void {\n program\n .command(\"briefing\")\n .description(\n \"Print project context + relevant memories in one shot — ideal for agent onboarding\",\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 (anchors memories)\")\n .option(\"--max-memories <n>\", \"cap on memories surfaced\", \"10\")\n .option(\n \"--scope <scope>\",\n \"personal | team | module | all (default: team)\",\n \"team\",\n )\n .option(\"--include-draft\", \"include draft memories (excluded by default)\")\n .option(\"--include-stale\", \"include stale memories (excluded by default — may be outdated)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: BriefingOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.memoriesDir)) {\n // No memories yet — just print project context and exit\n if (existsSync(paths.projectContext)) {\n console.log(`${ui.bold(\"=== Project Context ===\")}\\n`);\n console.log((await readFile(paths.projectContext, \"utf8\")).trim());\n } else {\n ui.warn(\"No project-context.md found. Run `haive init` and the `bootstrap_project` MCP prompt to set it up.\");\n }\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const filePaths = parseCsv(opts.files);\n const tokens = opts.task ? tokenizeQuery(opts.task) : null;\n const maxMemories = Math.max(1, Number(opts.maxMemories ?? 10));\n const scopeFilter = opts.scope ?? \"team\";\n\n // ── 1. Session recap — always shown first so agents start with fresh context ──\n const recaps = all\n .filter(({ memory: mem }) => mem.frontmatter.type === \"session_recap\")\n .sort((a, b) =>\n new Date(b.memory.frontmatter.created_at).getTime() -\n new Date(a.memory.frontmatter.created_at).getTime(),\n );\n if (recaps.length > 0) {\n const recap = recaps[0]!;\n const fm = recap.memory.frontmatter;\n const rev = fm.revision_count ? ` · revision #${fm.revision_count}` : \"\";\n console.log(`${ui.bold(\"=== Last Session Recap ===\")}\\n`);\n console.log(ui.dim(`${fm.id} (${fm.scope}${rev})`));\n console.log(recap.memory.body.trim());\n console.log();\n }\n\n // ── 2. Project context ─────────────────────────────────────────────────────\n if (existsSync(paths.projectContext)) {\n const ctx = await readFile(paths.projectContext, \"utf8\");\n const isTemplate = ctx.includes(\"TODO — high-level overview\") || ctx.includes(\"Generated by `haive init`\");\n if (isTemplate) {\n ui.warn(\n \"project-context.md still contains the default template — get_briefing will return little value.\",\n );\n ui.warn(\n \"Fix: in your AI client, invoke the MCP prompt bootstrap_project to auto-fill it from your codebase.\",\n );\n console.log();\n } else {\n console.log(`${ui.bold(\"=== Project Context ===\")}\\n`);\n console.log(ctx.trim());\n console.log();\n }\n } else {\n ui.warn(\n \"No project-context.md found. Run `haive init` then invoke the bootstrap_project MCP prompt.\",\n );\n }\n\n // Filter: exclude noise, drafts, stale, and session_recap (shown above) by default\n const candidates = all.filter(({ memory: mem }) => {\n const fm = mem.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") return false;\n if (!opts.includeDraft && fm.status === \"draft\") return false;\n if (!opts.includeStale && fm.status === \"stale\") return false;\n if (scopeFilter !== \"all\" && fm.scope !== scopeFilter) return false;\n if (fm.type === \"session_recap\") return false; // shown separately above\n return true;\n });\n\n // Score by relevance (AND on task tokens; OR fallback if AND produces no task hits)\n const andTaskHits = tokens\n ? new Set(candidates.filter(({ memory: mem }) => literalMatchesAllTokens(mem, tokens)).map(({ memory: mem }) => mem.frontmatter.id))\n : null;\n const useOrFallback = andTaskHits !== null && andTaskHits.size === 0 && (tokens?.length ?? 0) > 1;\n\n const scored = candidates.map(({ memory: mem, filePath }) => {\n const fm = mem.frontmatter;\n let score = 0;\n if (fm.status === \"validated\") score += 3;\n else if (fm.status === \"proposed\") score += 1;\n if (filePaths.length > 0 && memoryMatchesAnchorPaths(mem, filePaths)) score += 4;\n if (tokens) {\n if (andTaskHits?.has(fm.id)) score += 3;\n else if (useOrFallback && literalMatchesAnyToken(mem, tokens)) score += 1;\n }\n return { memory: mem, filePath, score };\n });\n\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, maxMemories);\n\n if (top.length === 0) {\n ui.info(\"No relevant memories found.\");\n const draftCount = all.filter(\n (m) =>\n m.memory.frontmatter.status === \"draft\" &&\n (scopeFilter === \"all\" || m.memory.frontmatter.scope === scopeFilter),\n ).length;\n if (draftCount > 0) {\n ui.info(`(${draftCount} draft memories excluded — use --include-draft to show)`);\n }\n return;\n }\n\n console.log(`${ui.bold(\"=== Relevant Memories ===\")}\\n`);\n for (const { memory: mem } of top) {\n const fm = mem.frontmatter;\n const badge = ui.statusBadge(fm.status);\n const draftMarker = fm.status === \"draft\" ? ui.yellow(\" [DRAFT]\") : \"\";\n const unverifiedMarker = fm.status === \"proposed\" ? ui.yellow(\" [UNVERIFIED]\") : \"\";\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(fm.scope + \"/\" + fm.type)} ${badge}${draftMarker}${unverifiedMarker}`,\n );\n console.log(mem.body.trim());\n console.log();\n }\n console.log(ui.dim(`${top.length} memor${top.length === 1 ? \"y\" : \"ies\"} surfaced`));\n\n // Track reads so usage stats, decay, and hot-memory detection work via CLI too\n const ids = top.map(({ memory: mem }) => mem.frontmatter.id);\n if (ids.length > 0) {\n await trackReads(paths, ids).catch(() => { /* non-fatal */ });\n }\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n","import pc from \"picocolors\";\n\nexport const ui = {\n info: (msg: string) => console.log(pc.cyan(\"ℹ\"), msg),\n success: (msg: string) => console.log(pc.green(\"✓\"), msg),\n warn: (msg: string) => console.log(pc.yellow(\"⚠\"), msg),\n error: (msg: string) => console.error(pc.red(\"✗\"), msg),\n dim: (msg: string) => pc.dim(msg),\n bold: (msg: string) => pc.bold(msg),\n green: (msg: string) => pc.green(msg),\n yellow: (msg: string) => pc.yellow(msg),\n red: (msg: string) => pc.red(msg),\n statusBadge: (status: string): string => {\n switch (status) {\n case \"validated\": return pc.green(status);\n case \"proposed\": return pc.yellow(status);\n case \"stale\": return pc.yellow(status);\n case \"rejected\": return pc.red(status);\n case \"deprecated\": return pc.dim(status);\n default: return pc.dim(status); // draft\n }\n },\n};\n","import { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\n\nexport function registerTui(program: Command): void {\n program\n .command(\"tui\")\n .description(\"Interactive TUI dashboard — browse, filter, and manage memories in the terminal\")\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.command(\"index\").description(\"Build local indexes that help AIs read less code\");\n idx.action(() => idx.help());\n idx\n .command(\"code\")\n .description(\"Scan source files and write .ai/code-map.json (file → exports + 1-line description)\")\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","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { 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\nconst PROJECT_CONTEXT_TEMPLATE = `# Project context\n\n> Generated by \\`haive init\\`. Edit this file (or let your AI agent fill it via the upcoming MCP \\`bootstrap_project\\` tool).\n\n## Architecture\nTODO — high-level overview of the codebase.\n\n## Key modules\nTODO — list main modules and their purpose.\n\n## Conventions\nTODO — coding conventions, naming, patterns the team follows.\n\n## Glossary\nTODO — domain terms and what they mean here.\n\n## Gotchas\nTODO — known traps, surprising behavior, things newcomers stub their toes on.\n`;\n\nconst BRIDGE_BODY = `<!-- hAIve bridge file — do not edit by hand. -->\n<!-- This file points your AI tool at the shared hAIve project context. -->\n\nSee \\`.ai/project-context.md\\` for the full project context.\nMemories live under \\`.ai/memories/\\` (personal/team/module).\n\n## hAIve — mandatory rules for AI agents\n- **Before** marking a task as done (\"Done\", \"Finished\", \"C'est fait\"), call the MCP prompt \\`post_task\\`.\n- **Immediately** when an approach fails (wrong API, wrong pattern, wrong assumption), call \\`mem_tried\\` — do not wait until the end of the session.\n- When starting a new task, call \\`get_briefing\\` with the task description to load relevant memories and avoid repeating past mistakes.\n`;\n\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\nexport function registerInit(program: Command): void {\n program\n .command(\"init\")\n .description(\"Initialize a hAIve project (.ai/ structure + bridge files)\")\n .option(\"-d, --dir <dir>\", \"project root\", process.cwd())\n .option(\"--no-bridges\", \"do not generate CLAUDE.md / .cursorrules / copilot-instructions.md\")\n .option(\"--with-ci\", \"write a GitHub Actions workflow (.github/workflows/haive-sync.yml)\")\n .action(async (opts: { dir: string; bridges: boolean; withCi?: boolean }) => {\n const root = path.resolve(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (existsSync(paths.haiveDir)) {\n ui.warn(`.ai/ already exists at ${paths.haiveDir} — leaving existing files in place.`);\n }\n\n await mkdir(paths.personalDir, { recursive: true });\n await mkdir(paths.teamDir, { recursive: true });\n await mkdir(paths.moduleDir, { recursive: true });\n await mkdir(paths.modulesContextDir, { recursive: true });\n\n if (!existsSync(paths.projectContext)) {\n await writeFile(paths.projectContext, PROJECT_CONTEXT_TEMPLATE, \"utf8\");\n ui.success(`Created ${path.relative(root, paths.projectContext)}`);\n }\n\n if (opts.bridges) {\n await writeBridge(root, \"CLAUDE.md\");\n await writeBridge(root, \".cursorrules\");\n await writeBridge(root, path.join(\".github\", \"copilot-instructions.md\"));\n }\n\n if (opts.withCi) {\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 ui.success(`hAIve initialized at ${root}`);\n console.log();\n console.log(ui.bold(\"Next steps:\"));\n console.log(\n ui.dim(\" 1. Fill project context — let your AI agent do it:\"),\n );\n console.log(\n \" \" + ui.bold(\"In your AI client (Claude, Cursor…), invoke the MCP prompt: bootstrap_project\"),\n );\n console.log(\n ui.dim(\" This analyzes your codebase and writes .ai/project-context.md automatically.\"),\n );\n console.log(\n ui.dim(\" Without this step, get_briefing returns a blank template (little value).\"),\n );\n console.log();\n console.log(ui.dim(\" 2. Point your AI client at the MCP server:\"));\n console.log(\n ` haive-mcp --root ${root}`,\n );\n console.log();\n console.log(ui.dim(\" 3. Start every AI session with:\"));\n console.log(\" \" + ui.bold(\"get_briefing({ task: '…what you are about to do…' })\"));\n });\n}\n\nasync function writeBridge(root: string, relPath: string): Promise<void> {\n const target = path.join(root, relPath);\n if (existsSync(target)) {\n ui.info(`Bridge ${relPath} already exists — skipped`);\n return;\n }\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, BRIDGE_BODY, \"utf8\");\n ui.success(`Created bridge ${relPath}`);\n}\n\n","import { mkdir, writeFile, chmod, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface InstallHooksOptions {\n dir?: string;\n force?: boolean;\n}\n\nconst HOOK_MARKER = \"# hAIve auto-generated\";\n\nconst HOOK_BODY = `#!/bin/sh\n${HOOK_MARKER} — keep this block to allow upgrades. Hand-edit anything outside it.\n\n# After a merge or pull, refresh memory anchors and auto-promote eligible\n# memories so that everyone on this branch sees consistent confidence levels.\nif command -v haive >/dev/null 2>&1; then\n haive sync --quiet --since ORIG_HEAD || true\nelif [ -x ./node_modules/.bin/haive ]; then\n ./node_modules/.bin/haive sync --quiet --since ORIG_HEAD || true\nfi\n`;\n\nconst HOOKS = [\"post-merge\", \"post-rewrite\"] as const;\n\nexport function registerInstallHooks(program: Command): void {\n program\n .command(\"install-hooks\")\n .description(\"Install git hooks that run `haive sync` after pull/merge\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--force\", \"overwrite existing hooks\")\n .action(async (opts: InstallHooksOptions) => {\n const root = findProjectRoot(opts.dir);\n const gitDir = path.join(root, \".git\");\n if (!existsSync(gitDir)) {\n ui.error(`No .git directory at ${root}.`);\n process.exitCode = 1;\n return;\n }\n const hooksDir = path.join(gitDir, \"hooks\");\n await mkdir(hooksDir, { recursive: true });\n\n let installed = 0;\n let skipped = 0;\n for (const name of HOOKS) {\n const file = path.join(hooksDir, name);\n if (existsSync(file) && !opts.force) {\n const existing = await readFile(file, \"utf8\");\n if (!existing.includes(HOOK_MARKER)) {\n ui.warn(`${name} already exists and was not written by hAIve. Re-run with --force to overwrite.`);\n skipped++;\n continue;\n }\n }\n await writeFile(file, HOOK_BODY, \"utf8\");\n await chmod(file, 0o755);\n installed++;\n }\n ui.success(`Installed ${installed} hook(s) in .git/hooks/${skipped ? `, skipped ${skipped}` : \"\"}`);\n ui.info(\"Test with: git pull (or any merge), then check .ai/memories for status updates.\");\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport { findProjectRoot } from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\nconst require = createRequire(import.meta.url);\n\ninterface McpOptions {\n dir?: string;\n}\n\nexport function registerMcp(program: Command): void {\n program\n .command(\"mcp\")\n .description(\"Start the hAIve MCP server (stdio transport)\")\n .option(\"-d, --dir <dir>\", \"project root (defaults to nearest .ai/ or .git/)\")\n .action((opts: McpOptions) => {\n const root = findProjectRoot(opts.dir);\n const bin = locateMcpBin();\n if (!bin) {\n ui.error(\n \"@hiveai/mcp binary not found. Install @hiveai/mcp or run `pnpm build` in the monorepo.\",\n );\n process.exit(1);\n }\n const child = spawn(\"node\", [bin, \"--root\", root], {\n stdio: [\"inherit\", \"inherit\", \"inherit\"],\n env: process.env,\n });\n child.on(\"exit\", (code) => process.exit(code ?? 0));\n });\n}\n\nfunction locateMcpBin(): string | null {\n // 1. Resolve the @hiveai/mcp package and use its bin entry.\n try {\n const pkgPath = require.resolve(\"@hiveai/mcp/package.json\");\n const pkgDir = path.dirname(pkgPath);\n const candidate = path.join(pkgDir, \"dist\", \"index.js\");\n if (existsSync(candidate)) return candidate;\n } catch {\n // not installed — fall through\n }\n\n // 2. Fallback: look for sibling package in monorepo dev mode.\n const here = path.dirname(fileURLToPath(import.meta.url));\n const sibling = path.resolve(here, \"..\", \"..\", \"..\", \"mcp\", \"dist\", \"index.js\");\n if (existsSync(sibling)) return sibling;\n\n return null;\n}\n","import { spawnSync } from \"node:child_process\";\nimport { readFile, writeFile } 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 isDecaying,\n loadMemoriesFromDir,\n loadUsageIndex,\n resolveHaivePaths,\n serializeMemory,\n verifyAnchor,\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}\n\nexport function registerSync(program: Command): void {\n program\n .command(\"sync\")\n .description(\"Refresh memory state after a pull/merge: verify anchors, auto-promote, report changes\")\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 .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 let staleMarked = 0;\n let revalidated = 0;\n let promoted = 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 for (const { memory, filePath } of memories) {\n if (\n isAutoPromoteEligible(\n memory.frontmatter,\n getUsage(usage, memory.frontmatter.id),\n DEFAULT_AUTO_PROMOTE_RULE,\n )\n ) {\n await writeFile(\n filePath,\n serializeMemory({\n frontmatter: { ...memory.frontmatter, status: \"validated\" },\n body: memory.body,\n }),\n \"utf8\",\n );\n promoted++;\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 log(\n `${ui.dim(\"sync:\")} ${staleMarked} stale · ${revalidated} revalidated · ${promoted} promoted${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 // --embed: rebuild embeddings index after sync\n if (opts.embed) {\n try {\n const emb = await import(\"@hiveai/embeddings\");\n log(ui.dim(\"embed: rebuilding index…\"));\n const report = await emb.rebuildIndex(paths);\n log(ui.dim(`embed: index rebuilt (${report.added} added, ${report.updated} updated, ${report.removed} removed)`));\n } catch {\n ui.warn(\"--embed: @hiveai/embeddings not available or index build failed. Run `haive embeddings index` manually.\");\n }\n }\n });\n}\n\nasync function injectBridge(\n bridgeFile: string,\n memoriesDir: string,\n maxMemories: number,\n root: string,\n quiet?: boolean,\n): Promise<void> {\n if (!existsSync(memoriesDir)) return;\n\n const all = await loadMemoriesFromDir(memoriesDir);\n const top = all\n .filter(({ memory }) => {\n const s = memory.frontmatter.status;\n if (memory.frontmatter.type === \"session_recap\") return false;\n return s === \"validated\" || s === \"proposed\";\n })\n .sort((a, b) => {\n const score = (m: typeof a) => {\n const s = m.memory.frontmatter.status;\n return (s === \"validated\" ? 2 : 1);\n };\n return score(b) - score(a);\n })\n .slice(0, maxMemories);\n\n const block = top\n .map((m) => {\n const fm = m.memory.frontmatter;\n const unverified = fm.status === \"proposed\" ? \" [UNVERIFIED]\" : \"\";\n return `### ${fm.id} (${fm.scope}/${fm.type})${unverified}\\n${m.memory.body.trim()}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n const injected =\n `${BRIDGE_START}\\n` +\n `<!-- AUTO-GENERATED by haive sync --inject-bridge — do not edit between these markers -->\\n\\n` +\n block +\n `\\n\\n${BRIDGE_END}`;\n\n const fileExists = existsSync(bridgeFile);\n let existing = fileExists ? await readFile(bridgeFile, \"utf8\") : \"\";\n // Normalize line endings to avoid \\r\\n accumulation\n existing = existing.replace(/\\r\\n/g, \"\\n\");\n\n const startIdx = existing.indexOf(BRIDGE_START);\n const endIdx = existing.indexOf(BRIDGE_END);\n\n // Detect partial markers — safer to abort than silently corrupt the file\n if (startIdx !== -1 && endIdx === -1) {\n ui.warn(`${path.relative(root, bridgeFile)}: found ${BRIDGE_START} without ${BRIDGE_END}. Fix the file manually before running --inject-bridge.`);\n return;\n }\n if (startIdx === -1 && endIdx !== -1) {\n ui.warn(`${path.relative(root, bridgeFile)}: found ${BRIDGE_END} without ${BRIDGE_START}. Fix the file manually before running --inject-bridge.`);\n return;\n }\n\n let updated: string;\n if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {\n updated = existing.slice(0, startIdx) + injected + existing.slice(endIdx + BRIDGE_END.length);\n } else {\n if (!fileExists && !quiet) {\n ui.info(`Creating ${path.relative(root, bridgeFile)} with haive memory block.`);\n }\n updated = existing + (existing.endsWith(\"\\n\") ? \"\" : \"\\n\") + \"\\n\" + injected + \"\\n\";\n }\n\n await writeFile(bridgeFile, updated, \"utf8\");\n if (!quiet) {\n console.log(\n ui.dim(`bridge: injected ${top.length} memor${top.length === 1 ? \"y\" : \"ies\"} into ${path.relative(root, bridgeFile)}`),\n );\n }\n}\n\ninterface SinceReport {\n added: string[];\n modified: string[];\n removed: string[];\n}\n\nfunction collectSinceChanges(root: string, ref: string): SinceReport | null {\n const result = spawnSync(\n \"git\",\n [\"-C\", root, \"diff\", \"--name-status\", \"--diff-filter=AMD\", `${ref}...HEAD`, \"--\", \".ai/memories\"],\n { encoding: \"utf8\" },\n );\n if (result.status !== 0) return null;\n\n const report: SinceReport = { added: [], modified: [], removed: [] };\n for (const line of result.stdout.split(\"\\n\")) {\n const [status, ...rest] = line.split(\"\\t\");\n const file = rest.join(\"\\t\").trim();\n if (!file) continue;\n if (status === \"A\") report.added.push(file);\n else if (status === \"M\") report.modified.push(file);\n else if (status === \"D\") report.removed.push(file);\n }\n return report;\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n inferModulesFromPaths,\n loadMemoriesFromDir,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n type MemoryFrontmatter,\n type MemoryScope,\n type MemoryType,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface AddOptions {\n type: MemoryType;\n slug: string;\n title?: string;\n scope?: MemoryScope;\n module?: string;\n tags?: string;\n domain?: string;\n author?: string;\n paths?: string;\n symbols?: string;\n commit?: string;\n body?: string;\n bodyFile?: string;\n topic?: string;\n dir?: string;\n}\n\nexport function registerMemoryAdd(memory: Command): void {\n memory\n .command(\"add\")\n .description(\"Add a new memory (defaults to personal scope)\")\n .requiredOption(\"--type <type>\", \"convention | decision | gotcha | architecture | glossary | attempt\")\n .requiredOption(\"--slug <slug>\", \"short 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\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"--tags <csv>\", \"comma-separated tags\")\n .option(\"--domain <domain>\", \"domain (e.g. transactions)\")\n .option(\"--author <author>\", \"author email or handle\")\n .option(\"--paths <csv>\", \"anchor paths, comma-separated\")\n .option(\"--symbols <csv>\", \"anchor symbols, comma-separated\")\n .option(\"--commit <sha>\", \"anchor 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 — alternative to --body for long content\")\n .option(\"--no-auto-tag\", \"disable automatic tag suggestions inferred from anchor paths\")\n .option(\"--topic <key>\", \"stable key: if a memory with this topic+scope already exists it is updated 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 — negative knowledge to prevent repeated AI mistakes\",\n )\n .requiredOption(\"--what <text>\", \"what approach was tried\")\n .requiredOption(\"--why-failed <text>\", \"why it failed or should NOT be used\")\n .option(\"--instead <text>\", \"recommended alternative\")\n .option(\"--scope <scope>\", \"personal | team | module\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"--tags <csv>\", \"comma-separated tags\")\n .option(\"--paths <csv>\", \"anchor paths, comma-separated\")\n .option(\"--author <author>\", \"author email or handle\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: TriedOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const slug = opts.what\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .trim()\n .split(/\\s+/)\n .slice(0, 5)\n .join(\"-\");\n\n const baseFm = buildFrontmatter({\n type: \"attempt\",\n slug,\n scope: opts.scope,\n module: opts.module,\n tags: parseCsv(opts.tags),\n paths: parseCsv(opts.paths),\n author: opts.author,\n });\n // attempt memories are immediately validated — no review cycle needed\n const frontmatter = { ...baseFm, status: \"validated\" as const };\n\n const lines: string[] = [`# ${opts.what}`, \"\"];\n lines.push(`**Why it failed / do NOT use:** ${opts.whyFailed}`);\n if (opts.instead) {\n lines.push(\"\", `**Instead, use:** ${opts.instead}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n\n const file = memoryFilePath(paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n ui.error(`Memory already exists at ${file}`);\n process.exitCode = 1;\n return;\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n ui.success(`Recorded: ${path.relative(root, file)}`);\n ui.info(`id=${frontmatter.id} type=attempt status=validated (auto-approved)`);\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface PendingOptions {\n scope?: \"personal\" | \"team\" | \"module\";\n dir?: string;\n}\n\nexport function registerMemoryPending(memory: Command): void {\n memory\n .command(\"pending\")\n .description(\"List 'proposed' memories awaiting review (sorted by reads desc)\")\n .option(\"--scope <scope>\", \"filter by scope (personal | team | module)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: PendingOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const proposed = all.filter(({ memory: mem }) => {\n if (mem.frontmatter.status !== \"proposed\") return false;\n if (opts.scope && mem.frontmatter.scope !== opts.scope) return false;\n return true;\n });\n\n if (proposed.length === 0) {\n ui.info(\"No memories awaiting review.\");\n return;\n }\n\n proposed.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n const now = Date.now();\n for (const { memory: mem, filePath } of proposed) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const ageDays = Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000);\n const ageStr = ageDays === 0 ? \"today\" : `${ageDays}d`;\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.dim(`age=${ageStr} reads=${u.read_count} rejections=${u.rejected_count}`)}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n ui.info(`${proposed.length} pending`);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n extractSnippet,\n findProjectRoot,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n pickSnippetNeedle,\n resolveHaivePaths,\n tokenizeQuery,\n trackReads,\n type MemoryScope,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface QueryOptions {\n dir?: string;\n limit?: string;\n scope?: MemoryScope;\n status?: string;\n showRejected?: boolean;\n}\n\nexport function registerMemoryQuery(memory: Command): void {\n memory\n .command(\"query <text>\")\n .description(\"Search memories by id, tag, or substring (AND, OR fallback)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--limit <n>\", \"max results\", \"20\")\n .option(\"--scope <scope>\", \"personal | team | module\")\n .option(\"--status <csv>\", \"filter by status (draft,proposed,validated,stale,rejected)\")\n .option(\"--show-rejected\", \"include rejected memories (hidden by default)\")\n .action(async (text: string, opts: QueryOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No memories directory at ${paths.memoriesDir}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const tokens = tokenizeQuery(text);\n if (tokens.length === 0) {\n ui.warn(\"Empty query — use \\`haive memory list\\` to list all memories.\");\n return;\n }\n const statusFilter = opts.status ? opts.status.split(\",\").map((s) => s.trim()) : null;\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n\n const passesFilters = (mem: (typeof all)[number][\"memory\"]) => {\n const fm = mem.frontmatter;\n if (opts.scope && fm.scope !== opts.scope) return false;\n if (!opts.showRejected && !statusFilter && fm.status === \"rejected\") return false;\n if (statusFilter && !statusFilter.includes(fm.status)) return false;\n // session_recap surfaces in briefing as last_session, not in regular search\n if (fm.type === \"session_recap\") return false;\n return true;\n };\n\n const eligible = all.filter(({ memory: mem }) => passesFilters(mem));\n let matches = eligible.filter(({ memory: mem }) => literalMatchesAllTokens(mem, tokens));\n let fallback = false;\n if (matches.length === 0 && tokens.length > 1) {\n matches = eligible.filter(({ memory: mem }) => literalMatchesAnyToken(mem, tokens));\n fallback = true;\n }\n\n const limit = Math.max(1, Number(opts.limit ?? 20));\n const top = matches.slice(0, limit);\n\n if (top.length === 0) {\n ui.info(`No matches for \"${text}\".`);\n return;\n }\n if (fallback) {\n ui.info(`No exact match — showing partial results (OR fallback):`);\n }\n\n const snippetNeedle = pickSnippetNeedle(text);\n for (const { memory: mem, filePath } of top) {\n const fm = mem.frontmatter;\n const statusBadge = ui.statusBadge(fm.status);\n console.log(`${ui.bold(fm.id)} ${ui.dim(fm.scope)} ${statusBadge}`);\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n const snippet = extractSnippet(mem.body, snippetNeedle);\n if (snippet) console.log(` ${snippet}`);\n }\n console.log(\n ui.dim(`\\n${top.length} of ${matches.length} match${matches.length === 1 ? \"\" : \"es\"}`),\n );\n\n // Track reads for usage stats / decay / hot detection\n const ids = top.map(({ memory: mem }) => mem.frontmatter.id);\n if (ids.length > 0) {\n await trackReads(paths, ids).catch(() => { /* non-fatal */ });\n }\n });\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadUsageIndex,\n recordRejection,\n resolveHaivePaths,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface RejectOptions {\n reason?: string;\n dir?: string;\n}\n\nexport function registerMemoryReject(memory: Command): void {\n memory\n .command(\"reject <id>\")\n .description(\"Record a rejection (blocks auto-promotion and lowers confidence)\")\n .option(\"-r, --reason <reason>\", \"why this memory is being rejected\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: RejectOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const memories = await loadMemoriesFromDir(paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === id);\n if (!loaded) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: {\n ...loaded.memory.frontmatter,\n status: \"rejected\",\n stale_reason: opts.reason ?? loaded.memory.frontmatter.stale_reason ?? null,\n },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(paths);\n recordRejection(idx, id, opts.reason ?? null);\n await saveUsageIndex(paths, idx);\n const u = idx.by_id[id]!;\n ui.success(\n `Rejected ${id} (status=rejected, ${u.rejected_count} rejection${u.rejected_count === 1 ? \"\" : \"s\"})`,\n );\n if (opts.reason) ui.info(`reason: ${opts.reason}`);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadUsageIndex,\n resolveHaivePaths,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface RmOptions {\n yes?: boolean;\n keepUsage?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryRm(memory: Command): void {\n memory\n .command(\"rm <id>\")\n .description(\"Delete a memory file (and its usage entry by default)\")\n .option(\"-y, --yes\", \"skip the confirmation prompt\")\n .option(\"--keep-usage\", \"do not remove the usage.json entry\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: RmOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n const rel = path.relative(root, found.filePath);\n if (!opts.yes) {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = (await rl.question(`Delete ${rel}? [y/N] `)).trim().toLowerCase();\n rl.close();\n if (answer !== \"y\" && answer !== \"yes\") {\n ui.info(\"Aborted.\");\n return;\n }\n }\n\n await unlink(found.filePath);\n ui.success(`Deleted ${rel}`);\n\n if (!opts.keepUsage) {\n const idx = await loadUsageIndex(paths);\n if (idx.by_id[id]) {\n delete idx.by_id[id];\n await saveUsageIndex(paths, idx);\n ui.info(\"Removed usage entry\");\n }\n }\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface ShowOptions {\n raw?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryShow(memory: Command): void {\n memory\n .command(\"show <id>\")\n .description(\"Print a memory's frontmatter, body, and confidence/usage\")\n .option(\"--raw\", \"print the raw file contents instead of a summary\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, opts: ShowOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === id);\n if (!found) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\n }\n\n if (opts.raw) {\n console.log(await readFile(found.filePath, \"utf8\"));\n return;\n }\n\n const fm = found.memory.frontmatter;\n const usage = await loadUsageIndex(paths);\n const u = getUsage(usage, fm.id);\n const conf = deriveConfidence(fm, u);\n\n console.log(ui.bold(fm.id));\n console.log(`${ui.dim(\"scope:\")} ${fm.scope}${fm.module ? ` / ${fm.module}` : \"\"}`);\n console.log(`${ui.dim(\"type:\")} ${fm.type}`);\n console.log(`${ui.dim(\"status:\")} ${fm.status} ${ui.dim(\"→ confidence:\")} ${ui.bold(conf)}`);\n console.log(`${ui.dim(\"tags:\")} ${fm.tags.length ? fm.tags.join(\", \") : \"(none)\"}`);\n console.log(`${ui.dim(\"created:\")} ${fm.created_at}`);\n if (fm.verified_at) console.log(`${ui.dim(\"verified:\")} ${fm.verified_at}`);\n if (fm.stale_reason) console.log(`${ui.dim(\"stale:\")} ${fm.stale_reason}`);\n console.log(`${ui.dim(\"reads:\")} ${u.read_count} ${ui.dim(\"rejections:\")} ${u.rejected_count}`);\n console.log(`${ui.dim(\"file:\")} ${path.relative(root, found.filePath)}`);\n if (fm.anchor.paths.length || fm.anchor.symbols.length) {\n console.log(ui.dim(\"anchor:\"));\n if (fm.anchor.commit) console.log(` ${ui.dim(\"commit:\")} ${fm.anchor.commit}`);\n if (fm.anchor.paths.length)\n console.log(` ${ui.dim(\"paths:\")} ${fm.anchor.paths.join(\", \")}`);\n if (fm.anchor.symbols.length)\n console.log(` ${ui.dim(\"symbols:\")} ${fm.anchor.symbols.join(\", \")}`);\n }\n console.log();\n console.log(found.memory.body);\n });\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n deriveConfidence,\n findProjectRoot,\n getUsage,\n loadUsageIndex,\n resolveHaivePaths,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface StatsOptions {\n id?: string;\n dir?: string;\n}\n\nexport function registerMemoryStats(memory: Command): void {\n memory\n .command(\"stats\")\n .description(\"Show usage stats and confidence levels per memory\")\n .option(\"--id <id>\", \"show stats for a single memory id\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: StatsOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n if (!existsSync(paths.memoriesDir)) {\n ui.error(`No .ai/memories at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const all = await loadMemoriesFromDir(paths.memoriesDir);\n const usage = await loadUsageIndex(paths);\n const target = opts.id\n ? all.filter((m) => m.memory.frontmatter.id === opts.id)\n : all;\n\n if (target.length === 0) {\n ui.info(opts.id ? `No memory with id \"${opts.id}\".` : \"No memories.\");\n return;\n }\n\n // Sort by read_count desc to surface the popular ones.\n target.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n for (const { memory: mem, filePath } of target) {\n const fm = mem.frontmatter;\n const u = getUsage(usage, fm.id);\n const conf = deriveConfidence(fm, u);\n console.log(\n `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(conf)}`,\n );\n console.log(\n ` ${ui.dim(\"status:\")} ${fm.status} ${ui.dim(\"reads:\")} ${u.read_count} ${ui.dim(\"rejections:\")} ${u.rejected_count}`,\n );\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\n }\n });\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n resolveHaivePaths,\n serializeMemory,\n verifyAnchor,\n} from \"@hiveai/core\";\nimport { loadMemoriesFromDir } from \"../utils/fs.js\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface VerifyOptions {\n id?: string;\n all?: boolean;\n update?: boolean;\n dir?: string;\n}\n\nexport function registerMemoryVerify(memory: Command): void {\n memory\n .command(\"verify\")\n .description(\"Check memory anchors against current code, optionally marking stale ones\")\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 for re-freshed) 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 session end — save a structured end-of-session recap.\n *\n * Uses topic-upsert: one recap per scope is kept and updated in-place.\n * get_briefing automatically surfaces the latest recap at the next session start.\n */\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n buildFrontmatter,\n findProjectRoot,\n loadMemoriesFromDir,\n memoryFilePath,\n resolveHaivePaths,\n serializeMemory,\n type MemoryFrontmatter,\n type MemoryScope,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface SessionEndOptions {\n goal: string;\n accomplished: string;\n discoveries?: string;\n files?: string;\n next?: string;\n scope?: MemoryScope;\n module?: string;\n dir?: string;\n}\n\nfunction buildRecapBody(opts: SessionEndOptions): string {\n const lines: string[] = [];\n lines.push(`## Goal\\n${opts.goal}`);\n lines.push(`\\n## Accomplished\\n${opts.accomplished}`);\n if (opts.discoveries?.trim()) {\n lines.push(`\\n## Discoveries & surprises\\n${opts.discoveries}`);\n }\n const filesTouched = parseCsv(opts.files);\n if (filesTouched.length > 0) {\n lines.push(`\\n## Files touched\\n${filesTouched.map((f) => `- \\`${f}\\``).join(\"\\n\")}`);\n }\n if (opts.next?.trim()) {\n lines.push(`\\n## Next steps\\n${opts.next}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction recapTopic(scope: string, module?: string): string {\n return module ? `session-recap-${scope}-${module}` : `session-recap-${scope}`;\n}\n\nexport function registerSessionEnd(session: Command): void {\n session\n .command(\"end\")\n .description(\"Save a structured end-of-session recap (goal / accomplished / discoveries / next steps)\")\n .requiredOption(\"--goal <text>\", \"What you were trying to accomplish (1–2 sentences)\")\n .requiredOption(\"--accomplished <text>\", \"What was actually done (bullet list recommended)\")\n .option(\"--discoveries <text>\", \"Bugs, surprises, or inconsistencies found during this session\")\n .option(\"--files <csv>\", \"Key files touched, comma-separated\")\n .option(\"--next <text>\", \"What should happen next (for the next session or a teammate)\")\n .option(\"--scope <scope>\", \"personal | team | module\", \"personal\")\n .option(\"--module <name>\", \"module name (required when scope=module)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: SessionEndOptions) => {\n const root = findProjectRoot(opts.dir);\n const paths = resolveHaivePaths(root);\n\n if (!existsSync(paths.haiveDir)) {\n ui.error(`No .ai/ found at ${root}. Run \\`haive init\\` first.`);\n process.exitCode = 1;\n return;\n }\n\n const scope = opts.scope ?? \"personal\";\n const body = buildRecapBody(opts);\n const topic = recapTopic(scope, opts.module);\n const filesTouched = parseCsv(opts.files);\n\n // Warn about paths that don't exist in project\n const missingPaths = filesTouched.filter((p) => !existsSync(path.resolve(root, p)));\n if (missingPaths.length > 0) {\n ui.warn(`Anchor path${missingPaths.length > 1 ? \"s\" : \"\"} not found in project (will be stale):`);\n for (const p of missingPaths) ui.warn(` ✗ ${p}`);\n }\n\n // ── Topic upsert ────────────────────────────────────────────────\n if (existsSync(paths.memoriesDir)) {\n const existing = await loadMemoriesFromDir(paths.memoriesDir);\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === topic &&\n memory.frontmatter.scope === scope &&\n (!opts.module || memory.frontmatter.module === opts.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const revisionCount = (fm.revision_count ?? 0) + 1;\n const newFrontmatter: MemoryFrontmatter = {\n ...fm,\n revision_count: revisionCount,\n anchor: {\n ...fm.anchor,\n paths: filesTouched.length ? filesTouched : fm.anchor.paths,\n },\n };\n await writeFile(topicMatch.filePath, serializeMemory({ frontmatter: newFrontmatter, body }), \"utf8\");\n ui.success(`Session recap updated (revision #${revisionCount})`);\n ui.info(`id=${fm.id} file=${path.relative(root, topicMatch.filePath)}`);\n return;\n }\n }\n\n // ── Create first recap ──────────────────────────────────────────\n const frontmatter = buildFrontmatter({\n type: \"session_recap\",\n slug: \"recap\",\n scope,\n module: opts.module,\n tags: [\"session\", \"recap\"],\n paths: filesTouched,\n topic,\n status: \"validated\",\n });\n\n const file = memoryFilePath(paths, frontmatter.scope, frontmatter.id, frontmatter.module);\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n ui.success(`Session recap created`);\n ui.info(`id=${frontmatter.id} scope=${scope} file=${path.relative(root, file)}`);\n ui.info(\"Next session: call \\`get_briefing\\` — the recap will be surfaced automatically.\");\n });\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n"],"mappings":"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","names":["Command","program","findProjectRoot","program","existsSync","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","path","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","path","existsSync","path","resolveHaivePaths","program","path","resolveHaivePaths","existsSync","mkdir","writeFile","readFile","existsSync","path","findProjectRoot","program","findProjectRoot","path","existsSync","mkdir","readFile","writeFile","existsSync","path","findProjectRoot","require","program","findProjectRoot","path","existsSync","readFile","writeFile","existsSync","path","findProjectRoot","loadMemoriesFromDir","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memory","writeFile","path","readFile","mkdir","readFile","writeFile","existsSync","path","findProjectRoot","loadMemoriesFromDir","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","parseCsv","path","readFile","loadMemoriesFromDir","writeFile","serializeMemory","mkdir","existsSync","path","findProjectRoot","resolveHaivePaths","loadMemoriesFromDir","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","mkdir","writeFile","existsSync","path","findProjectRoot","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","memoryFilePath","mkdir","path","writeFile","serializeMemory","existsSync","writeFile","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","found","next","writeFile","serializeMemory","path","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","parseCsv","writeFile","serializeMemory","path","writeFile","existsSync","path","DEFAULT_AUTO_PROMOTE_RULE","findProjectRoot","getUsage","isAutoPromoteEligible","loadUsageIndex","resolveHaivePaths","serializeMemory","memory","DEFAULT_AUTO_PROMOTE_RULE","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","isAutoPromoteEligible","getUsage","path","writeFile","serializeMemory","spawn","existsSync","readFile","path","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","readFile","spawn","existsSync","path","findProjectRoot","getUsage","inferModulesFromPaths","loadUsageIndex","memoryMatchesAnchorPaths","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","inferModulesFromPaths","memoryMatchesAnchorPaths","getUsage","path","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","mkdir","writeFile","existsSync","path","buildFrontmatter","findProjectRoot","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","buildFrontmatter","parseCsv","memoryFilePath","mkdir","path","writeFile","serializeMemory","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","existsSync","path","findProjectRoot","literalMatchesAllTokens","literalMatchesAnyToken","resolveHaivePaths","tokenizeQuery","trackReads","memory","findProjectRoot","resolveHaivePaths","existsSync","tokenizeQuery","loadMemoriesFromDir","literalMatchesAllTokens","literalMatchesAnyToken","path","trackReads","writeFile","existsSync","findProjectRoot","loadUsageIndex","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","writeFile","serializeMemory","loadUsageIndex","existsSync","unlink","path","findProjectRoot","loadUsageIndex","resolveHaivePaths","saveUsageIndex","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","unlink","loadUsageIndex","saveUsageIndex","existsSync","readFile","path","deriveConfidence","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","readFile","loadUsageIndex","getUsage","deriveConfidence","path","existsSync","path","deriveConfidence","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","deriveConfidence","path","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","verifyAnchor","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","verifyAnchor","path","writeFile","serializeMemory","readFile","existsSync","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","readFile","writeFile","mkdir","existsSync","path","buildFrontmatter","findProjectRoot","loadMemoriesFromDir","memoryFilePath","resolveHaivePaths","serializeMemory","parseCsv","session","findProjectRoot","resolveHaivePaths","existsSync","path","loadMemoriesFromDir","memory","writeFile","serializeMemory","buildFrontmatter","memoryFilePath","mkdir","Command"]}
|