@hiveai/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 hAIve contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.js ADDED
@@ -0,0 +1,978 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/index.ts
4
+ import { Command as Command18 } from "commander";
5
+
6
+ // src/commands/embeddings.ts
7
+ import { existsSync } from "fs";
8
+ import path from "path";
9
+ import "commander";
10
+ import { findProjectRoot, resolveHaivePaths } from "@hiveai/core";
11
+
12
+ // src/utils/ui.ts
13
+ import pc from "picocolors";
14
+ var ui = {
15
+ info: (msg) => console.log(pc.cyan("\u2139"), msg),
16
+ success: (msg) => console.log(pc.green("\u2713"), msg),
17
+ warn: (msg) => console.log(pc.yellow("\u26A0"), msg),
18
+ error: (msg) => console.error(pc.red("\u2717"), msg),
19
+ dim: (msg) => pc.dim(msg),
20
+ bold: (msg) => pc.bold(msg)
21
+ };
22
+
23
+ // src/commands/embeddings.ts
24
+ function registerEmbeddings(program2) {
25
+ const embeddings = program2.command("embeddings").description("Manage local embeddings index for semantic search");
26
+ embeddings.command("index").description("Generate or refresh the embeddings index for all memories").option("-d, --dir <dir>", "project root").action(async (opts) => {
27
+ const root = findProjectRoot(opts.dir);
28
+ const paths = resolveHaivePaths(root);
29
+ if (!existsSync(paths.memoriesDir)) {
30
+ ui.error(`No .ai/memories at ${root}. Run \`haive init\` first.`);
31
+ process.exitCode = 1;
32
+ return;
33
+ }
34
+ const { Embedder, rebuildIndex } = await loadEmbeddings();
35
+ ui.info("Loading embedding model (first run downloads ~110MB)\u2026");
36
+ const embedder = await Embedder.create();
37
+ ui.info(`Model ready: ${embedder.model} (dim=${embedder.dimension}). Indexing memories\u2026`);
38
+ const { report } = await rebuildIndex(paths, embedder);
39
+ ui.success(
40
+ `Indexed ${report.total} memories \u2014 added=${report.added} updated=${report.updated} unchanged=${report.unchanged} removed=${report.removed}`
41
+ );
42
+ });
43
+ embeddings.command("query <text>").description("Run a semantic search against the local embeddings index").option("-d, --dir <dir>", "project root").option("--limit <n>", "max results", "10").option("--min-score <n>", "minimum cosine similarity (0-1)", "0").action(async (text, opts) => {
44
+ const root = findProjectRoot(opts.dir);
45
+ const paths = resolveHaivePaths(root);
46
+ const { semanticSearch } = await loadEmbeddings();
47
+ const result = await semanticSearch(paths, text, {
48
+ limit: Number(opts.limit ?? 10),
49
+ minScore: Number(opts.minScore ?? 0)
50
+ });
51
+ if (!result) {
52
+ ui.error("No embeddings index found. Run `haive embeddings index` first.");
53
+ process.exitCode = 1;
54
+ return;
55
+ }
56
+ if (result.hits.length === 0) {
57
+ ui.info("No semantic matches above the threshold.");
58
+ return;
59
+ }
60
+ for (const hit of result.hits) {
61
+ const score = hit.score.toFixed(3);
62
+ console.log(`${ui.bold(score)} ${hit.id}`);
63
+ console.log(` ${ui.dim(path.relative(root, hit.file_path))}`);
64
+ }
65
+ });
66
+ embeddings.command("status").description("Show the embeddings index status").option("-d, --dir <dir>", "project root").action(async (opts) => {
67
+ const root = findProjectRoot(opts.dir);
68
+ const paths = resolveHaivePaths(root);
69
+ const { indexStat } = await loadEmbeddings();
70
+ const stat = await indexStat(paths);
71
+ if (!stat.exists) {
72
+ ui.warn("No embeddings index. Run `haive embeddings index` to create one.");
73
+ return;
74
+ }
75
+ console.log(`${ui.bold("entries:")} ${stat.count}`);
76
+ console.log(`${ui.bold("model:")} ${stat.model}`);
77
+ console.log(`${ui.bold("updated_at:")} ${stat.updatedAt}`);
78
+ console.log(`${ui.bold("size:")} ${(stat.sizeBytes / 1024).toFixed(1)} KB`);
79
+ });
80
+ }
81
+ async function loadEmbeddings() {
82
+ try {
83
+ return await import("@hiveai/embeddings");
84
+ } catch (err) {
85
+ ui.error(
86
+ "Could not load @hiveai/embeddings. Install it or run `pnpm build` in the monorepo."
87
+ );
88
+ throw err;
89
+ }
90
+ }
91
+
92
+ // src/commands/init.ts
93
+ import { mkdir, writeFile } from "fs/promises";
94
+ import { existsSync as existsSync2 } from "fs";
95
+ import path2 from "path";
96
+ import "commander";
97
+ import { resolveHaivePaths as resolveHaivePaths2 } from "@hiveai/core";
98
+ var PROJECT_CONTEXT_TEMPLATE = `# Project context
99
+
100
+ > Generated by \`haive init\`. Edit this file (or let your AI agent fill it via the upcoming MCP \`bootstrap_project\` tool).
101
+
102
+ ## Architecture
103
+ TODO \u2014 high-level overview of the codebase.
104
+
105
+ ## Key modules
106
+ TODO \u2014 list main modules and their purpose.
107
+
108
+ ## Conventions
109
+ TODO \u2014 coding conventions, naming, patterns the team follows.
110
+
111
+ ## Glossary
112
+ TODO \u2014 domain terms and what they mean here.
113
+
114
+ ## Gotchas
115
+ TODO \u2014 known traps, surprising behavior, things newcomers stub their toes on.
116
+ `;
117
+ var BRIDGE_BODY = `<!-- hAIve bridge file \u2014 do not edit by hand. -->
118
+ <!-- This file points your AI tool at the shared hAIve project context. -->
119
+
120
+ See \`.ai/project-context.md\` for the full project context.
121
+ Memories live under \`.ai/memories/\` (personal/team/module).
122
+ `;
123
+ function registerInit(program2) {
124
+ 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").action(async (opts) => {
125
+ const root = path2.resolve(opts.dir);
126
+ const paths = resolveHaivePaths2(root);
127
+ if (existsSync2(paths.haiveDir)) {
128
+ ui.warn(`.ai/ already exists at ${paths.haiveDir} \u2014 leaving existing files in place.`);
129
+ }
130
+ await mkdir(paths.personalDir, { recursive: true });
131
+ await mkdir(paths.teamDir, { recursive: true });
132
+ await mkdir(paths.moduleDir, { recursive: true });
133
+ await mkdir(paths.modulesContextDir, { recursive: true });
134
+ if (!existsSync2(paths.projectContext)) {
135
+ await writeFile(paths.projectContext, PROJECT_CONTEXT_TEMPLATE, "utf8");
136
+ ui.success(`Created ${path2.relative(root, paths.projectContext)}`);
137
+ }
138
+ if (opts.bridges) {
139
+ await writeBridge(root, "CLAUDE.md");
140
+ await writeBridge(root, ".cursorrules");
141
+ await writeBridge(root, path2.join(".github", "copilot-instructions.md"));
142
+ }
143
+ ui.success(`hAIve initialized at ${root}`);
144
+ ui.info("Next: " + ui.bold("haive memory add --type convention --slug <name>"));
145
+ });
146
+ }
147
+ async function writeBridge(root, relPath) {
148
+ const target = path2.join(root, relPath);
149
+ if (existsSync2(target)) {
150
+ ui.info(`Bridge ${relPath} already exists \u2014 skipped`);
151
+ return;
152
+ }
153
+ await mkdir(path2.dirname(target), { recursive: true });
154
+ await writeFile(target, BRIDGE_BODY, "utf8");
155
+ ui.success(`Created bridge ${relPath}`);
156
+ }
157
+
158
+ // src/commands/mcp.ts
159
+ import { spawn } from "child_process";
160
+ import { existsSync as existsSync3 } from "fs";
161
+ import { createRequire } from "module";
162
+ import path3 from "path";
163
+ import { fileURLToPath } from "url";
164
+ import "commander";
165
+ import { findProjectRoot as findProjectRoot3 } from "@hiveai/core";
166
+ var require2 = createRequire(import.meta.url);
167
+ function registerMcp(program2) {
168
+ program2.command("mcp").description("Start the hAIve MCP server (stdio transport)").option("-d, --dir <dir>", "project root (defaults to nearest .ai/ or .git/)").action((opts) => {
169
+ const root = findProjectRoot3(opts.dir);
170
+ const bin = locateMcpBin();
171
+ if (!bin) {
172
+ ui.error(
173
+ "@hiveai/mcp binary not found. Install @hiveai/mcp or run `pnpm build` in the monorepo."
174
+ );
175
+ process.exit(1);
176
+ }
177
+ const child = spawn("node", [bin, "--root", root], {
178
+ stdio: ["inherit", "inherit", "inherit"],
179
+ env: process.env
180
+ });
181
+ child.on("exit", (code) => process.exit(code ?? 0));
182
+ });
183
+ }
184
+ function locateMcpBin() {
185
+ try {
186
+ const pkgPath = require2.resolve("@hiveai/mcp/package.json");
187
+ const pkgDir = path3.dirname(pkgPath);
188
+ const candidate = path3.join(pkgDir, "dist", "index.js");
189
+ if (existsSync3(candidate)) return candidate;
190
+ } catch {
191
+ }
192
+ const here = path3.dirname(fileURLToPath(import.meta.url));
193
+ const sibling = path3.resolve(here, "..", "..", "..", "mcp", "dist", "index.js");
194
+ if (existsSync3(sibling)) return sibling;
195
+ return null;
196
+ }
197
+
198
+ // src/commands/memory-add.ts
199
+ import { mkdir as mkdir2, writeFile as writeFile2 } from "fs/promises";
200
+ import { existsSync as existsSync4 } from "fs";
201
+ import path4 from "path";
202
+ import "commander";
203
+ import {
204
+ buildFrontmatter,
205
+ findProjectRoot as findProjectRoot4,
206
+ memoryFilePath,
207
+ resolveHaivePaths as resolveHaivePaths3,
208
+ serializeMemory
209
+ } from "@hiveai/core";
210
+ function registerMemoryAdd(memory2) {
211
+ memory2.command("add").description("Add a new memory (defaults to personal scope \u2014 v0.1 approach B)").requiredOption("--type <type>", "convention | decision | gotcha | architecture | glossary").requiredOption("--slug <slug>", "short identifier used in the file name").option("--scope <scope>", "personal | team | module", "personal").option("--module <name>", "module name (required when scope=module)").option("--tags <csv>", "comma-separated tags").option("--domain <domain>", "domain (e.g. transactions)").option("--author <author>", "author email or handle").option("--paths <csv>", "anchor paths, comma-separated").option("--symbols <csv>", "anchor symbols, comma-separated").option("--commit <sha>", "anchor commit SHA").option("--body <text>", "memory body content (Markdown)").option("-d, --dir <dir>", "project root").action(async (opts) => {
212
+ const root = findProjectRoot4(opts.dir);
213
+ const paths = resolveHaivePaths3(root);
214
+ if (!existsSync4(paths.haiveDir)) {
215
+ ui.error(`No .ai/ found at ${root}. Run \`haive init\` first.`);
216
+ process.exitCode = 1;
217
+ return;
218
+ }
219
+ const frontmatter = buildFrontmatter({
220
+ type: opts.type,
221
+ slug: opts.slug,
222
+ scope: opts.scope,
223
+ module: opts.module,
224
+ tags: parseCsv(opts.tags),
225
+ domain: opts.domain,
226
+ author: opts.author,
227
+ paths: parseCsv(opts.paths),
228
+ symbols: parseCsv(opts.symbols),
229
+ commit: opts.commit
230
+ });
231
+ const body = opts.body ?? `# ${opts.slug}
232
+
233
+ TODO \u2014 write the memory body.
234
+ `;
235
+ const file = memoryFilePath(paths, frontmatter.scope, frontmatter.id, frontmatter.module);
236
+ await mkdir2(path4.dirname(file), { recursive: true });
237
+ if (existsSync4(file)) {
238
+ ui.error(`Memory already exists at ${file}`);
239
+ process.exitCode = 1;
240
+ return;
241
+ }
242
+ await writeFile2(file, serializeMemory({ frontmatter, body }), "utf8");
243
+ ui.success(`Created ${path4.relative(root, file)}`);
244
+ ui.info(`scope=${frontmatter.scope} status=${frontmatter.status} id=${frontmatter.id}`);
245
+ });
246
+ }
247
+ function parseCsv(value) {
248
+ if (!value) return [];
249
+ return value.split(",").map((s) => s.trim()).filter(Boolean);
250
+ }
251
+
252
+ // src/commands/memory-list.ts
253
+ import { existsSync as existsSync5 } from "fs";
254
+ import path5 from "path";
255
+ import "commander";
256
+ import { findProjectRoot as findProjectRoot5, resolveHaivePaths as resolveHaivePaths4 } from "@hiveai/core";
257
+
258
+ // src/utils/fs.ts
259
+ import {
260
+ loadMemoriesFromDir,
261
+ loadMemory,
262
+ listMarkdownFilesRecursive
263
+ } from "@hiveai/core";
264
+
265
+ // src/commands/memory-list.ts
266
+ function registerMemoryList(memory2) {
267
+ memory2.command("list").description("List memories with optional filters").option("--scope <scope>", "personal | team | module").option("--type <type>", "filter by type").option("--tag <tag>", "filter by tag").option("--module <name>", "filter by module name").option("-d, --dir <dir>", "project root").action(async (opts) => {
268
+ const root = findProjectRoot5(opts.dir);
269
+ const paths = resolveHaivePaths4(root);
270
+ if (!existsSync5(paths.memoriesDir)) {
271
+ ui.error(`No memories directory at ${paths.memoriesDir}. Run \`haive init\` first.`);
272
+ process.exitCode = 1;
273
+ return;
274
+ }
275
+ const all = await loadMemoriesFromDir(paths.memoriesDir);
276
+ const filtered = all.filter((m) => matchesFilters(m, opts));
277
+ if (filtered.length === 0) {
278
+ ui.info("No memories match the filters.");
279
+ return;
280
+ }
281
+ for (const { memory: mem, filePath } of filtered) {
282
+ const fm = mem.frontmatter;
283
+ const tagStr = fm.tags.length ? ui.dim(` [${fm.tags.join(", ")}]`) : "";
284
+ const moduleStr = fm.module ? ui.dim(` (${fm.module})`) : "";
285
+ console.log(
286
+ `${ui.bold(fm.id)} ${ui.dim(fm.scope)}/${ui.dim(fm.type)}${moduleStr}${tagStr}`
287
+ );
288
+ console.log(` ${ui.dim(path5.relative(root, filePath))}`);
289
+ }
290
+ console.log(ui.dim(`
291
+ ${filtered.length} memor${filtered.length === 1 ? "y" : "ies"}`));
292
+ });
293
+ }
294
+ function matchesFilters(loaded, opts) {
295
+ const fm = loaded.memory.frontmatter;
296
+ if (opts.scope && fm.scope !== opts.scope) return false;
297
+ if (opts.type && fm.type !== opts.type) return false;
298
+ if (opts.tag && !fm.tags.includes(opts.tag)) return false;
299
+ if (opts.module && fm.module !== opts.module) return false;
300
+ return true;
301
+ }
302
+
303
+ // src/commands/memory-promote.ts
304
+ import { mkdir as mkdir3, unlink, writeFile as writeFile3 } from "fs/promises";
305
+ import { existsSync as existsSync6 } from "fs";
306
+ import path6 from "path";
307
+ import "commander";
308
+ import {
309
+ findProjectRoot as findProjectRoot6,
310
+ memoryFilePath as memoryFilePath2,
311
+ resolveHaivePaths as resolveHaivePaths5,
312
+ serializeMemory as serializeMemory2
313
+ } from "@hiveai/core";
314
+ function registerMemoryPromote(memory2) {
315
+ memory2.command("promote <id>").description("Promote a personal memory to team scope (status -> proposed)").option("-d, --dir <dir>", "project root").action(async (id, opts) => {
316
+ const root = findProjectRoot6(opts.dir);
317
+ const paths = resolveHaivePaths5(root);
318
+ if (!existsSync6(paths.memoriesDir)) {
319
+ ui.error(`No memories directory at ${paths.memoriesDir}. Run \`haive init\` first.`);
320
+ process.exitCode = 1;
321
+ return;
322
+ }
323
+ const all = await loadMemoriesFromDir(paths.personalDir);
324
+ const found = all.find((m) => m.memory.frontmatter.id === id);
325
+ if (!found) {
326
+ ui.error(`No personal memory with id "${id}". (Promotion only applies to personal scope.)`);
327
+ process.exitCode = 1;
328
+ return;
329
+ }
330
+ const updated = {
331
+ frontmatter: {
332
+ ...found.memory.frontmatter,
333
+ scope: "team",
334
+ status: "proposed"
335
+ },
336
+ body: found.memory.body
337
+ };
338
+ const newPath = memoryFilePath2(paths, "team", updated.frontmatter.id);
339
+ await mkdir3(path6.dirname(newPath), { recursive: true });
340
+ await writeFile3(newPath, serializeMemory2(updated), "utf8");
341
+ await unlink(found.filePath);
342
+ ui.success(`Promoted ${id} to team scope (status=proposed)`);
343
+ ui.info(`Now at ${path6.relative(root, newPath)}`);
344
+ });
345
+ }
346
+
347
+ // src/commands/memory-approve.ts
348
+ import { existsSync as existsSync7 } from "fs";
349
+ import { writeFile as writeFile4 } from "fs/promises";
350
+ import path7 from "path";
351
+ import "commander";
352
+ import {
353
+ findProjectRoot as findProjectRoot7,
354
+ resolveHaivePaths as resolveHaivePaths6,
355
+ serializeMemory as serializeMemory3
356
+ } from "@hiveai/core";
357
+ function registerMemoryApprove(memory2) {
358
+ memory2.command("approve <id>").description("Mark a 'proposed' memory as 'validated' immediately (explicit review)").option("-d, --dir <dir>", "project root").action(async (id, opts) => {
359
+ const root = findProjectRoot7(opts.dir);
360
+ const paths = resolveHaivePaths6(root);
361
+ if (!existsSync7(paths.memoriesDir)) {
362
+ ui.error(`No .ai/memories at ${root}.`);
363
+ process.exitCode = 1;
364
+ return;
365
+ }
366
+ const all = await loadMemoriesFromDir(paths.memoriesDir);
367
+ const found = all.find((m) => m.memory.frontmatter.id === id);
368
+ if (!found) {
369
+ ui.error(`No memory with id "${id}".`);
370
+ process.exitCode = 1;
371
+ return;
372
+ }
373
+ const current = found.memory.frontmatter.status;
374
+ if (current === "validated") {
375
+ ui.info(`${id} is already validated.`);
376
+ return;
377
+ }
378
+ if (current !== "proposed" && current !== "draft") {
379
+ ui.warn(`Memory has status "${current}"; approve still sets it to validated.`);
380
+ }
381
+ const next = {
382
+ frontmatter: { ...found.memory.frontmatter, status: "validated" },
383
+ body: found.memory.body
384
+ };
385
+ await writeFile4(found.filePath, serializeMemory3(next), "utf8");
386
+ ui.success(`Approved ${id} (status=validated)`);
387
+ ui.info(path7.relative(root, found.filePath));
388
+ });
389
+ }
390
+
391
+ // src/commands/memory-auto-promote.ts
392
+ import { writeFile as writeFile5 } from "fs/promises";
393
+ import { existsSync as existsSync8 } from "fs";
394
+ import path8 from "path";
395
+ import "commander";
396
+ import {
397
+ DEFAULT_AUTO_PROMOTE_RULE,
398
+ findProjectRoot as findProjectRoot8,
399
+ getUsage,
400
+ isAutoPromoteEligible,
401
+ loadUsageIndex,
402
+ resolveHaivePaths as resolveHaivePaths7,
403
+ serializeMemory as serializeMemory4
404
+ } from "@hiveai/core";
405
+ function registerMemoryAutoPromote(memory2) {
406
+ memory2.command("auto-promote").description("Promote eligible 'proposed' memories to 'validated' based on usage").option("--min-reads <n>", "minimum read_count to qualify", String(DEFAULT_AUTO_PROMOTE_RULE.minReads)).option(
407
+ "--max-rejections <n>",
408
+ "memories with more rejections than this are skipped",
409
+ String(DEFAULT_AUTO_PROMOTE_RULE.maxRejections)
410
+ ).option("--apply", "actually write status=validated to disk (default: dry-run)").option("-d, --dir <dir>", "project root").action(async (opts) => {
411
+ const root = findProjectRoot8(opts.dir);
412
+ const paths = resolveHaivePaths7(root);
413
+ if (!existsSync8(paths.memoriesDir)) {
414
+ ui.error(`No .ai/memories at ${root}.`);
415
+ process.exitCode = 1;
416
+ return;
417
+ }
418
+ const rule = {
419
+ minReads: Number(opts.minReads ?? DEFAULT_AUTO_PROMOTE_RULE.minReads),
420
+ maxRejections: Number(opts.maxRejections ?? DEFAULT_AUTO_PROMOTE_RULE.maxRejections)
421
+ };
422
+ const memories = await loadMemoriesFromDir(paths.memoriesDir);
423
+ const usage = await loadUsageIndex(paths);
424
+ const eligible = memories.filter(
425
+ ({ memory: memory3 }) => isAutoPromoteEligible(memory3.frontmatter, getUsage(usage, memory3.frontmatter.id), rule)
426
+ );
427
+ if (eligible.length === 0) {
428
+ ui.info(
429
+ `No memories eligible (minReads=${rule.minReads}, maxRejections=${rule.maxRejections}).`
430
+ );
431
+ return;
432
+ }
433
+ let written = 0;
434
+ for (const { memory: mem, filePath } of eligible) {
435
+ const u = getUsage(usage, mem.frontmatter.id);
436
+ console.log(
437
+ `${ui.bold(opts.apply ? "PROMOTE" : "would promote")} ${mem.frontmatter.id} ${ui.dim(`reads=${u.read_count} rejections=${u.rejected_count}`)}`
438
+ );
439
+ console.log(` ${ui.dim(path8.relative(root, filePath))}`);
440
+ if (opts.apply) {
441
+ const next = {
442
+ frontmatter: { ...mem.frontmatter, status: "validated" },
443
+ body: mem.body
444
+ };
445
+ await writeFile5(filePath, serializeMemory4(next), "utf8");
446
+ written++;
447
+ }
448
+ }
449
+ const summary = `${eligible.length} eligible`;
450
+ ui.info(opts.apply ? `${summary} \xB7 ${written} promoted` : `${summary} \xB7 dry-run (use --apply)`);
451
+ });
452
+ }
453
+
454
+ // src/commands/memory-edit.ts
455
+ import { spawn as spawn2 } from "child_process";
456
+ import { existsSync as existsSync9 } from "fs";
457
+ import { readFile } from "fs/promises";
458
+ import path9 from "path";
459
+ import "commander";
460
+ import {
461
+ findProjectRoot as findProjectRoot9,
462
+ parseMemory,
463
+ resolveHaivePaths as resolveHaivePaths8
464
+ } from "@hiveai/core";
465
+ function registerMemoryEdit(memory2) {
466
+ memory2.command("edit <id>").description("Open a memory in $EDITOR and re-validate when you save").option("-e, --editor <cmd>", "editor command (defaults to $EDITOR or 'vi')").option("-d, --dir <dir>", "project root").action(async (id, opts) => {
467
+ const root = findProjectRoot9(opts.dir);
468
+ const paths = resolveHaivePaths8(root);
469
+ if (!existsSync9(paths.memoriesDir)) {
470
+ ui.error(`No .ai/memories at ${root}.`);
471
+ process.exitCode = 1;
472
+ return;
473
+ }
474
+ const all = await loadMemoriesFromDir(paths.memoriesDir);
475
+ const found = all.find((m) => m.memory.frontmatter.id === id);
476
+ if (!found) {
477
+ ui.error(`No memory with id "${id}".`);
478
+ process.exitCode = 1;
479
+ return;
480
+ }
481
+ const editor = opts.editor ?? process.env.EDITOR ?? process.env.VISUAL ?? "vi";
482
+ ui.info(`Opening ${path9.relative(root, found.filePath)} with ${editor}\u2026`);
483
+ const code = await runEditor(editor, found.filePath);
484
+ if (code !== 0) {
485
+ ui.warn(`Editor exited with status ${code}.`);
486
+ }
487
+ try {
488
+ const fresh = await readFile(found.filePath, "utf8");
489
+ parseMemory(fresh);
490
+ ui.success("Memory still parses cleanly.");
491
+ } catch (err) {
492
+ ui.error(
493
+ `Memory no longer parses: ${err instanceof Error ? err.message : String(err)}`
494
+ );
495
+ ui.warn("File left as-is on disk; fix it and re-run a parse-aware command to confirm.");
496
+ process.exitCode = 1;
497
+ }
498
+ });
499
+ }
500
+ function runEditor(editor, file) {
501
+ return new Promise((resolve) => {
502
+ const child = spawn2(editor, [file], { stdio: "inherit" });
503
+ child.on("exit", (code) => resolve(code ?? 0));
504
+ child.on("error", () => resolve(127));
505
+ });
506
+ }
507
+
508
+ // src/commands/memory-for-files.ts
509
+ import { existsSync as existsSync10 } from "fs";
510
+ import path10 from "path";
511
+ import "commander";
512
+ import {
513
+ deriveConfidence,
514
+ findProjectRoot as findProjectRoot10,
515
+ getUsage as getUsage2,
516
+ inferModulesFromPaths,
517
+ loadUsageIndex as loadUsageIndex2,
518
+ memoryMatchesAnchorPaths,
519
+ resolveHaivePaths as resolveHaivePaths9
520
+ } from "@hiveai/core";
521
+ function registerMemoryForFiles(memory2) {
522
+ memory2.command("for-files <files...>").description("Show memories relevant to the given files (anchor overlap, module, domain)").option("-d, --dir <dir>", "project root").action(async (files, opts) => {
523
+ const root = findProjectRoot10(opts.dir);
524
+ const paths = resolveHaivePaths9(root);
525
+ if (!existsSync10(paths.memoriesDir)) {
526
+ ui.error(`No .ai/memories at ${root}.`);
527
+ process.exitCode = 1;
528
+ return;
529
+ }
530
+ const all = await loadMemoriesFromDir(paths.memoriesDir);
531
+ const usage = await loadUsageIndex2(paths);
532
+ const inferred = inferModulesFromPaths(files);
533
+ const byAnchor = [];
534
+ const byModule = [];
535
+ const byDomain = [];
536
+ const seen = /* @__PURE__ */ new Set();
537
+ for (const loaded of all) {
538
+ if (memoryMatchesAnchorPaths(loaded.memory, files)) {
539
+ byAnchor.push(loaded);
540
+ seen.add(loaded.memory.frontmatter.id);
541
+ }
542
+ }
543
+ for (const loaded of all) {
544
+ if (seen.has(loaded.memory.frontmatter.id)) continue;
545
+ const mod = loaded.memory.frontmatter.module;
546
+ if (mod && inferred.includes(mod)) {
547
+ byModule.push(loaded);
548
+ seen.add(loaded.memory.frontmatter.id);
549
+ }
550
+ }
551
+ for (const loaded of all) {
552
+ if (seen.has(loaded.memory.frontmatter.id)) continue;
553
+ const domain = loaded.memory.frontmatter.domain;
554
+ if (domain && inferred.includes(domain)) {
555
+ byDomain.push(loaded);
556
+ seen.add(loaded.memory.frontmatter.id);
557
+ }
558
+ }
559
+ console.log(ui.dim(`inferred modules: ${inferred.length ? inferred.join(", ") : "(none)"}`));
560
+ printGroup(root, "anchor overlap", byAnchor, usage);
561
+ printGroup(root, "module match", byModule, usage);
562
+ printGroup(root, "domain match", byDomain, usage);
563
+ const total = byAnchor.length + byModule.length + byDomain.length;
564
+ ui.info(
565
+ `${total} relevant memor${total === 1 ? "y" : "ies"} (${byAnchor.length} anchor \xB7 ${byModule.length} module \xB7 ${byDomain.length} domain)`
566
+ );
567
+ });
568
+ }
569
+ function printGroup(root, label, loaded, usage) {
570
+ if (loaded.length === 0) return;
571
+ console.log(ui.bold(`
572
+ \u2014 ${label} \u2014`));
573
+ for (const { memory: mem, filePath } of loaded) {
574
+ const fm = mem.frontmatter;
575
+ const u = getUsage2(usage, fm.id);
576
+ const conf = deriveConfidence(fm, u);
577
+ console.log(`${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(conf)}`);
578
+ console.log(` ${ui.dim(path10.relative(root, filePath))}`);
579
+ }
580
+ }
581
+
582
+ // src/commands/memory-pending.ts
583
+ import { existsSync as existsSync11 } from "fs";
584
+ import path11 from "path";
585
+ import "commander";
586
+ import {
587
+ findProjectRoot as findProjectRoot11,
588
+ getUsage as getUsage3,
589
+ loadUsageIndex as loadUsageIndex3,
590
+ resolveHaivePaths as resolveHaivePaths10
591
+ } from "@hiveai/core";
592
+ function registerMemoryPending(memory2) {
593
+ memory2.command("pending").description("List 'proposed' memories awaiting review (sorted by reads desc)").option("--scope <scope>", "filter by scope (personal | team | module)").option("-d, --dir <dir>", "project root").action(async (opts) => {
594
+ const root = findProjectRoot11(opts.dir);
595
+ const paths = resolveHaivePaths10(root);
596
+ if (!existsSync11(paths.memoriesDir)) {
597
+ ui.error(`No .ai/memories at ${root}.`);
598
+ process.exitCode = 1;
599
+ return;
600
+ }
601
+ const all = await loadMemoriesFromDir(paths.memoriesDir);
602
+ const usage = await loadUsageIndex3(paths);
603
+ const proposed = all.filter(({ memory: mem }) => {
604
+ if (mem.frontmatter.status !== "proposed") return false;
605
+ if (opts.scope && mem.frontmatter.scope !== opts.scope) return false;
606
+ return true;
607
+ });
608
+ if (proposed.length === 0) {
609
+ ui.info("No memories awaiting review.");
610
+ return;
611
+ }
612
+ proposed.sort(
613
+ (a, b) => getUsage3(usage, b.memory.frontmatter.id).read_count - getUsage3(usage, a.memory.frontmatter.id).read_count
614
+ );
615
+ const now = Date.now();
616
+ for (const { memory: mem, filePath } of proposed) {
617
+ const fm = mem.frontmatter;
618
+ const u = getUsage3(usage, fm.id);
619
+ const ageDays = Math.floor((now - new Date(fm.created_at).getTime()) / 864e5);
620
+ const ageStr = ageDays === 0 ? "today" : `${ageDays}d`;
621
+ console.log(
622
+ `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.dim(`age=${ageStr} reads=${u.read_count} rejections=${u.rejected_count}`)}`
623
+ );
624
+ console.log(` ${ui.dim(path11.relative(root, filePath))}`);
625
+ }
626
+ ui.info(`${proposed.length} pending`);
627
+ });
628
+ }
629
+
630
+ // src/commands/memory-query.ts
631
+ import { existsSync as existsSync12 } from "fs";
632
+ import path12 from "path";
633
+ import "commander";
634
+ import {
635
+ extractSnippet,
636
+ findProjectRoot as findProjectRoot12,
637
+ literalMatchesAllTokens,
638
+ pickSnippetNeedle,
639
+ resolveHaivePaths as resolveHaivePaths11,
640
+ tokenizeQuery
641
+ } from "@hiveai/core";
642
+ function registerMemoryQuery(memory2) {
643
+ memory2.command("query <text>").description("Search memories by id, tag, or substring (multi-word AND)").option("-d, --dir <dir>", "project root").option("--limit <n>", "max results", "20").action(async (text, opts) => {
644
+ const root = findProjectRoot12(opts.dir);
645
+ const paths = resolveHaivePaths11(root);
646
+ if (!existsSync12(paths.memoriesDir)) {
647
+ ui.error(`No memories directory at ${paths.memoriesDir}. Run \`haive init\` first.`);
648
+ process.exitCode = 1;
649
+ return;
650
+ }
651
+ const tokens = tokenizeQuery(text);
652
+ const all = await loadMemoriesFromDir(paths.memoriesDir);
653
+ const matches = all.filter(({ memory: mem }) => literalMatchesAllTokens(mem, tokens));
654
+ const limit = Math.max(1, Number(opts.limit ?? 20));
655
+ const top = matches.slice(0, limit);
656
+ if (top.length === 0) {
657
+ ui.info(`No matches for "${text}".`);
658
+ return;
659
+ }
660
+ const snippetNeedle = pickSnippetNeedle(text);
661
+ for (const { memory: mem, filePath } of top) {
662
+ const snippet = extractSnippet(mem.body, snippetNeedle);
663
+ console.log(`${ui.bold(mem.frontmatter.id)} ${ui.dim(mem.frontmatter.scope)}`);
664
+ console.log(` ${ui.dim(path12.relative(root, filePath))}`);
665
+ if (snippet) console.log(` ${snippet}`);
666
+ }
667
+ console.log(
668
+ ui.dim(`
669
+ ${top.length} of ${matches.length} match${matches.length === 1 ? "" : "es"}`)
670
+ );
671
+ });
672
+ }
673
+
674
+ // src/commands/memory-reject.ts
675
+ import { existsSync as existsSync13 } from "fs";
676
+ import "commander";
677
+ import {
678
+ findProjectRoot as findProjectRoot13,
679
+ loadUsageIndex as loadUsageIndex4,
680
+ recordRejection,
681
+ resolveHaivePaths as resolveHaivePaths12,
682
+ saveUsageIndex
683
+ } from "@hiveai/core";
684
+ function registerMemoryReject(memory2) {
685
+ memory2.command("reject <id>").description("Record a rejection (blocks auto-promotion and lowers confidence)").option("-r, --reason <reason>", "why this memory is being rejected").option("-d, --dir <dir>", "project root").action(async (id, opts) => {
686
+ const root = findProjectRoot13(opts.dir);
687
+ const paths = resolveHaivePaths12(root);
688
+ if (!existsSync13(paths.memoriesDir)) {
689
+ ui.error(`No .ai/memories at ${root}.`);
690
+ process.exitCode = 1;
691
+ return;
692
+ }
693
+ const memories = await loadMemoriesFromDir(paths.memoriesDir);
694
+ if (!memories.some((m) => m.memory.frontmatter.id === id)) {
695
+ ui.error(`No memory with id "${id}".`);
696
+ process.exitCode = 1;
697
+ return;
698
+ }
699
+ const idx = await loadUsageIndex4(paths);
700
+ recordRejection(idx, id, opts.reason ?? null);
701
+ await saveUsageIndex(paths, idx);
702
+ const u = idx.by_id[id];
703
+ ui.success(
704
+ `Recorded rejection for ${id} (now ${u.rejected_count} rejection${u.rejected_count === 1 ? "" : "s"})`
705
+ );
706
+ if (opts.reason) ui.info(`reason: ${opts.reason}`);
707
+ });
708
+ }
709
+
710
+ // src/commands/memory-rm.ts
711
+ import { existsSync as existsSync14 } from "fs";
712
+ import { unlink as unlink2 } from "fs/promises";
713
+ import path13 from "path";
714
+ import { createInterface } from "readline/promises";
715
+ import "commander";
716
+ import {
717
+ findProjectRoot as findProjectRoot14,
718
+ loadUsageIndex as loadUsageIndex5,
719
+ resolveHaivePaths as resolveHaivePaths13,
720
+ saveUsageIndex as saveUsageIndex2
721
+ } from "@hiveai/core";
722
+ function registerMemoryRm(memory2) {
723
+ memory2.command("rm <id>").description("Delete a memory file (and its usage entry by default)").option("-y, --yes", "skip the confirmation prompt").option("--keep-usage", "do not remove the usage.json entry").option("-d, --dir <dir>", "project root").action(async (id, opts) => {
724
+ const root = findProjectRoot14(opts.dir);
725
+ const paths = resolveHaivePaths13(root);
726
+ if (!existsSync14(paths.memoriesDir)) {
727
+ ui.error(`No .ai/memories at ${root}.`);
728
+ process.exitCode = 1;
729
+ return;
730
+ }
731
+ const all = await loadMemoriesFromDir(paths.memoriesDir);
732
+ const found = all.find((m) => m.memory.frontmatter.id === id);
733
+ if (!found) {
734
+ ui.error(`No memory with id "${id}".`);
735
+ process.exitCode = 1;
736
+ return;
737
+ }
738
+ const rel = path13.relative(root, found.filePath);
739
+ if (!opts.yes) {
740
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
741
+ const answer = (await rl.question(`Delete ${rel}? [y/N] `)).trim().toLowerCase();
742
+ rl.close();
743
+ if (answer !== "y" && answer !== "yes") {
744
+ ui.info("Aborted.");
745
+ return;
746
+ }
747
+ }
748
+ await unlink2(found.filePath);
749
+ ui.success(`Deleted ${rel}`);
750
+ if (!opts.keepUsage) {
751
+ const idx = await loadUsageIndex5(paths);
752
+ if (idx.by_id[id]) {
753
+ delete idx.by_id[id];
754
+ await saveUsageIndex2(paths, idx);
755
+ ui.info("Removed usage entry");
756
+ }
757
+ }
758
+ });
759
+ }
760
+
761
+ // src/commands/memory-show.ts
762
+ import { existsSync as existsSync15 } from "fs";
763
+ import { readFile as readFile2 } from "fs/promises";
764
+ import path14 from "path";
765
+ import "commander";
766
+ import {
767
+ deriveConfidence as deriveConfidence2,
768
+ findProjectRoot as findProjectRoot15,
769
+ getUsage as getUsage4,
770
+ loadUsageIndex as loadUsageIndex6,
771
+ resolveHaivePaths as resolveHaivePaths14
772
+ } from "@hiveai/core";
773
+ function registerMemoryShow(memory2) {
774
+ memory2.command("show <id>").description("Print a memory's frontmatter, body, and confidence/usage").option("--raw", "print the raw file contents instead of a summary").option("-d, --dir <dir>", "project root").action(async (id, opts) => {
775
+ const root = findProjectRoot15(opts.dir);
776
+ const paths = resolveHaivePaths14(root);
777
+ if (!existsSync15(paths.memoriesDir)) {
778
+ ui.error(`No .ai/memories at ${root}.`);
779
+ process.exitCode = 1;
780
+ return;
781
+ }
782
+ const all = await loadMemoriesFromDir(paths.memoriesDir);
783
+ const found = all.find((m) => m.memory.frontmatter.id === id);
784
+ if (!found) {
785
+ ui.error(`No memory with id "${id}".`);
786
+ process.exitCode = 1;
787
+ return;
788
+ }
789
+ if (opts.raw) {
790
+ console.log(await readFile2(found.filePath, "utf8"));
791
+ return;
792
+ }
793
+ const fm = found.memory.frontmatter;
794
+ const usage = await loadUsageIndex6(paths);
795
+ const u = getUsage4(usage, fm.id);
796
+ const conf = deriveConfidence2(fm, u);
797
+ console.log(ui.bold(fm.id));
798
+ console.log(`${ui.dim("scope:")} ${fm.scope}${fm.module ? ` / ${fm.module}` : ""}`);
799
+ console.log(`${ui.dim("type:")} ${fm.type}`);
800
+ console.log(`${ui.dim("status:")} ${fm.status} ${ui.dim("\u2192 confidence:")} ${ui.bold(conf)}`);
801
+ console.log(`${ui.dim("tags:")} ${fm.tags.length ? fm.tags.join(", ") : "(none)"}`);
802
+ console.log(`${ui.dim("created:")} ${fm.created_at}`);
803
+ if (fm.verified_at) console.log(`${ui.dim("verified:")} ${fm.verified_at}`);
804
+ if (fm.stale_reason) console.log(`${ui.dim("stale:")} ${fm.stale_reason}`);
805
+ console.log(`${ui.dim("reads:")} ${u.read_count} ${ui.dim("rejections:")} ${u.rejected_count}`);
806
+ console.log(`${ui.dim("file:")} ${path14.relative(root, found.filePath)}`);
807
+ if (fm.anchor.paths.length || fm.anchor.symbols.length) {
808
+ console.log(ui.dim("anchor:"));
809
+ if (fm.anchor.commit) console.log(` ${ui.dim("commit:")} ${fm.anchor.commit}`);
810
+ if (fm.anchor.paths.length)
811
+ console.log(` ${ui.dim("paths:")} ${fm.anchor.paths.join(", ")}`);
812
+ if (fm.anchor.symbols.length)
813
+ console.log(` ${ui.dim("symbols:")} ${fm.anchor.symbols.join(", ")}`);
814
+ }
815
+ console.log();
816
+ console.log(found.memory.body);
817
+ });
818
+ }
819
+
820
+ // src/commands/memory-stats.ts
821
+ import { existsSync as existsSync16 } from "fs";
822
+ import path15 from "path";
823
+ import "commander";
824
+ import {
825
+ deriveConfidence as deriveConfidence3,
826
+ findProjectRoot as findProjectRoot16,
827
+ getUsage as getUsage5,
828
+ loadUsageIndex as loadUsageIndex7,
829
+ resolveHaivePaths as resolveHaivePaths15
830
+ } from "@hiveai/core";
831
+ function registerMemoryStats(memory2) {
832
+ memory2.command("stats").description("Show usage stats and confidence levels per memory").option("--id <id>", "show stats for a single memory id").option("-d, --dir <dir>", "project root").action(async (opts) => {
833
+ const root = findProjectRoot16(opts.dir);
834
+ const paths = resolveHaivePaths15(root);
835
+ if (!existsSync16(paths.memoriesDir)) {
836
+ ui.error(`No .ai/memories at ${root}. Run \`haive init\` first.`);
837
+ process.exitCode = 1;
838
+ return;
839
+ }
840
+ const all = await loadMemoriesFromDir(paths.memoriesDir);
841
+ const usage = await loadUsageIndex7(paths);
842
+ const target = opts.id ? all.filter((m) => m.memory.frontmatter.id === opts.id) : all;
843
+ if (target.length === 0) {
844
+ ui.info(opts.id ? `No memory with id "${opts.id}".` : "No memories.");
845
+ return;
846
+ }
847
+ target.sort(
848
+ (a, b) => getUsage5(usage, b.memory.frontmatter.id).read_count - getUsage5(usage, a.memory.frontmatter.id).read_count
849
+ );
850
+ for (const { memory: mem, filePath } of target) {
851
+ const fm = mem.frontmatter;
852
+ const u = getUsage5(usage, fm.id);
853
+ const conf = deriveConfidence3(fm, u);
854
+ console.log(
855
+ `${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(conf)}`
856
+ );
857
+ console.log(
858
+ ` ${ui.dim("status:")} ${fm.status} ${ui.dim("reads:")} ${u.read_count} ${ui.dim("rejections:")} ${u.rejected_count}`
859
+ );
860
+ console.log(` ${ui.dim(path15.relative(root, filePath))}`);
861
+ }
862
+ });
863
+ }
864
+
865
+ // src/commands/memory-verify.ts
866
+ import { writeFile as writeFile6 } from "fs/promises";
867
+ import { existsSync as existsSync17 } from "fs";
868
+ import path16 from "path";
869
+ import "commander";
870
+ import {
871
+ findProjectRoot as findProjectRoot17,
872
+ resolveHaivePaths as resolveHaivePaths16,
873
+ serializeMemory as serializeMemory5,
874
+ verifyAnchor
875
+ } from "@hiveai/core";
876
+ function registerMemoryVerify(memory2) {
877
+ memory2.command("verify").description("Check memory anchors against current code, optionally marking stale ones").option("--id <id>", "verify a single memory by id").option("--all", "verify every memory (default if --id is omitted)").option("--update", "write status=stale (or status=validated for re-freshed) back to disk").option("-d, --dir <dir>", "project root").action(async (opts) => {
878
+ const root = findProjectRoot17(opts.dir);
879
+ const paths = resolveHaivePaths16(root);
880
+ if (!existsSync17(paths.memoriesDir)) {
881
+ ui.error(`No .ai/memories at ${root}. Run \`haive init\` first.`);
882
+ process.exitCode = 1;
883
+ return;
884
+ }
885
+ const all = await loadMemoriesFromDir(paths.memoriesDir);
886
+ const targets = opts.id ? all.filter((m) => m.memory.frontmatter.id === opts.id) : all;
887
+ if (opts.id && targets.length === 0) {
888
+ ui.error(`No memory with id "${opts.id}".`);
889
+ process.exitCode = 1;
890
+ return;
891
+ }
892
+ let staleCount = 0;
893
+ let freshCount = 0;
894
+ let anchorless = 0;
895
+ let updated = 0;
896
+ for (const { memory: mem, filePath } of targets) {
897
+ const result = await verifyAnchor(mem, { projectRoot: root });
898
+ const isAnchored = mem.frontmatter.anchor.paths.length > 0 || mem.frontmatter.anchor.symbols.length > 0;
899
+ if (!isAnchored) {
900
+ anchorless++;
901
+ continue;
902
+ }
903
+ const rel = path16.relative(root, filePath);
904
+ if (result.stale) {
905
+ staleCount++;
906
+ console.log(`${ui.bold("STALE")} ${mem.frontmatter.id}`);
907
+ console.log(` ${ui.dim(rel)}`);
908
+ console.log(` ${result.reason}`);
909
+ } else {
910
+ freshCount++;
911
+ console.log(`${ui.dim("fresh")} ${mem.frontmatter.id}`);
912
+ }
913
+ if (opts.update) {
914
+ const next = applyVerification(mem, result);
915
+ await writeFile6(filePath, serializeMemory5(next), "utf8");
916
+ updated++;
917
+ }
918
+ }
919
+ const summary = [
920
+ `${freshCount} fresh`,
921
+ `${staleCount} stale`,
922
+ `${anchorless} anchorless (skipped)`
923
+ ];
924
+ if (opts.update) summary.push(`${updated} updated on disk`);
925
+ ui.info(summary.join(" \xB7 "));
926
+ });
927
+ }
928
+ function applyVerification(mem, result) {
929
+ const verifiedAt = (/* @__PURE__ */ new Date()).toISOString();
930
+ if (result.stale) {
931
+ return {
932
+ frontmatter: {
933
+ ...mem.frontmatter,
934
+ status: "stale",
935
+ verified_at: verifiedAt,
936
+ stale_reason: result.reason
937
+ },
938
+ body: mem.body
939
+ };
940
+ }
941
+ const nextStatus = mem.frontmatter.status === "stale" || mem.frontmatter.status === "draft" ? "validated" : mem.frontmatter.status;
942
+ return {
943
+ frontmatter: {
944
+ ...mem.frontmatter,
945
+ status: nextStatus,
946
+ verified_at: verifiedAt,
947
+ stale_reason: null
948
+ },
949
+ body: mem.body
950
+ };
951
+ }
952
+
953
+ // src/index.ts
954
+ var program = new Command18();
955
+ program.name("haive").description("hAIve \u2014 team-first persistent memory layer for AI coding agents").version("0.1.0");
956
+ registerInit(program);
957
+ registerMcp(program);
958
+ registerEmbeddings(program);
959
+ var memory = program.command("memory").description("Manage memory entries");
960
+ registerMemoryAdd(memory);
961
+ registerMemoryList(memory);
962
+ registerMemoryQuery(memory);
963
+ registerMemoryPromote(memory);
964
+ registerMemoryVerify(memory);
965
+ registerMemoryStats(memory);
966
+ registerMemoryReject(memory);
967
+ registerMemoryAutoPromote(memory);
968
+ registerMemoryForFiles(memory);
969
+ registerMemoryShow(memory);
970
+ registerMemoryEdit(memory);
971
+ registerMemoryRm(memory);
972
+ registerMemoryPending(memory);
973
+ registerMemoryApprove(memory);
974
+ program.parseAsync(process.argv).catch((err) => {
975
+ console.error(err instanceof Error ? err.message : err);
976
+ process.exit(1);
977
+ });
978
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/embeddings.ts","../src/utils/ui.ts","../src/commands/init.ts","../src/commands/mcp.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-auto-promote.ts","../src/commands/memory-edit.ts","../src/commands/memory-for-files.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"],"sourcesContent":["import { Command } from \"commander\";\nimport { registerEmbeddings } from \"./commands/embeddings.js\";\nimport { registerInit } from \"./commands/init.js\";\nimport { registerMcp } from \"./commands/mcp.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 { registerMemoryAutoPromote } from \"./commands/memory-auto-promote.js\";\nimport { registerMemoryEdit } from \"./commands/memory-edit.js\";\nimport { registerMemoryForFiles } from \"./commands/memory-for-files.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\";\n\nconst program = new Command();\n\nprogram\n .name(\"haive\")\n .description(\"hAIve — team-first persistent memory layer for AI coding agents\")\n .version(\"0.1.0\");\n\nregisterInit(program);\nregisterMcp(program);\nregisterEmbeddings(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);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : err);\n process.exit(1);\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 (err) {\n ui.error(\n \"Could not load @hiveai/embeddings. Install it or run `pnpm build` in the monorepo.\",\n );\n throw err;\n }\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};\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\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 .action(async (opts: { dir: string; bridges: 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 ui.success(`hAIve initialized at ${root}`);\n ui.info(\"Next: \" + ui.bold(\"haive memory add --type convention --slug <name>\"));\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 { 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 { 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 type MemoryType,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface AddOptions {\n type: MemoryType;\n slug: 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 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 — v0.1 approach B)\")\n .requiredOption(\"--type <type>\", \"convention | decision | gotcha | architecture | glossary\")\n .requiredOption(\"--slug <slug>\", \"short identifier used in the file name\")\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)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (opts: AddOptions) => {\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 frontmatter = buildFrontmatter({\n type: opts.type,\n slug: opts.slug,\n scope: opts.scope,\n module: opts.module,\n tags: parseCsv(opts.tags),\n domain: opts.domain,\n author: opts.author,\n paths: parseCsv(opts.paths),\n symbols: parseCsv(opts.symbols),\n commit: opts.commit,\n });\n\n const body = opts.body ?? `# ${opts.slug}\\n\\nTODO — write the memory body.\\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(`Created ${path.relative(root, file)}`);\n ui.info(`scope=${frontmatter.scope} status=${frontmatter.status} id=${frontmatter.id}`);\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 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(\"-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 filtered = all.filter((m) => matchesFilters(m, opts));\n\n if (filtered.length === 0) {\n ui.info(\"No memories match the filters.\");\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 console.log(\n `${ui.bold(fm.id)} ${ui.dim(fm.scope)}/${ui.dim(fm.type)}${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}\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 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 });\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 dir?: string;\n}\n\nexport function registerMemoryApprove(memory: Command): void {\n memory\n .command(\"approve <id>\")\n .description(\"Mark a 'proposed' memory as 'validated' immediately (explicit review)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .action(async (id: string, 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 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 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 if (memoryMatchesAnchorPaths(loaded.memory, files)) {\n byAnchor.push(loaded);\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n const mod = loaded.memory.frontmatter.module;\n if (mod && inferred.includes(mod)) {\n byModule.push(loaded);\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) 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 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 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 pickSnippetNeedle,\n resolveHaivePaths,\n tokenizeQuery,\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}\n\nexport function registerMemoryQuery(memory: Command): void {\n memory\n .command(\"query <text>\")\n .description(\"Search memories by id, tag, or substring (multi-word AND)\")\n .option(\"-d, --dir <dir>\", \"project root\")\n .option(\"--limit <n>\", \"max results\", \"20\")\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 const all = await loadMemoriesFromDir(paths.memoriesDir);\n const matches = all.filter(({ memory: mem }) => literalMatchesAllTokens(mem, tokens));\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\n const snippetNeedle = pickSnippetNeedle(text);\n for (const { memory: mem, filePath } of top) {\n const snippet = extractSnippet(mem.body, snippetNeedle);\n console.log(`${ui.bold(mem.frontmatter.id)} ${ui.dim(mem.frontmatter.scope)}`);\n console.log(` ${ui.dim(path.relative(root, filePath))}`);\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}\n","import { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n findProjectRoot,\n loadUsageIndex,\n recordRejection,\n resolveHaivePaths,\n saveUsageIndex,\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 if (!memories.some((m) => m.memory.frontmatter.id === id)) {\n ui.error(`No memory with id \"${id}\".`);\n process.exitCode = 1;\n return;\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 `Recorded rejection for ${id} (now ${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 let anchorless = 0;\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 anchorless++;\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 } 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 `${anchorless} anchorless (skipped)`,\n ];\n if (opts.update) summary.push(`${updated} updated on disk`);\n ui.info(summary.join(\" · \"));\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"],"mappings":"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","names":["Command","program","existsSync","path","resolveHaivePaths","program","path","resolveHaivePaths","existsSync","existsSync","path","findProjectRoot","require","program","findProjectRoot","path","existsSync","mkdir","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","mkdir","path","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","path","mkdir","writeFile","existsSync","path","findProjectRoot","memoryFilePath","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","memoryFilePath","mkdir","path","writeFile","serializeMemory","existsSync","writeFile","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","writeFile","serializeMemory","path","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","path","writeFile","serializeMemory","spawn","existsSync","path","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","path","spawn","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadUsageIndex","getUsage","path","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadUsageIndex","getUsage","path","existsSync","path","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","path","existsSync","findProjectRoot","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadUsageIndex","existsSync","unlink","path","findProjectRoot","loadUsageIndex","resolveHaivePaths","saveUsageIndex","memory","findProjectRoot","resolveHaivePaths","existsSync","path","unlink","loadUsageIndex","saveUsageIndex","existsSync","readFile","path","deriveConfidence","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","readFile","loadUsageIndex","getUsage","deriveConfidence","path","existsSync","path","deriveConfidence","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadUsageIndex","getUsage","deriveConfidence","path","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","path","writeFile","serializeMemory","Command"]}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@hiveai/cli",
3
+ "version": "0.1.0",
4
+ "description": "hAIve CLI — manage shared AI memories from the terminal",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/Doucs91/hAIve.git",
9
+ "directory": "packages/cli"
10
+ },
11
+ "bugs": "https://github.com/Doucs91/hAIve/issues",
12
+ "homepage": "https://github.com/Doucs91/hAIve#readme",
13
+ "keywords": [
14
+ "ai",
15
+ "memory",
16
+ "mcp",
17
+ "haive",
18
+ "agent",
19
+ "team",
20
+ "cli"
21
+ ],
22
+ "type": "module",
23
+ "bin": {
24
+ "haive": "./dist/index.js"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "LICENSE"
29
+ ],
30
+ "dependencies": {
31
+ "commander": "^12.1.0",
32
+ "picocolors": "^1.1.1",
33
+ "@hiveai/mcp": "0.1.0",
34
+ "@hiveai/core": "0.1.0"
35
+ },
36
+ "optionalDependencies": {
37
+ "@hiveai/embeddings": "0.1.0"
38
+ },
39
+ "scripts": {
40
+ "build": "tsup",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest",
43
+ "typecheck": "tsc --noEmit",
44
+ "clean": "rm -rf dist .tsbuildinfo"
45
+ }
46
+ }