@hiveai/cli 0.2.1 → 0.2.2
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 +180 -98
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
|
-
import { Command as
|
|
4
|
+
import { Command as Command23 } from "commander";
|
|
5
5
|
|
|
6
6
|
// src/commands/embeddings.ts
|
|
7
7
|
import { existsSync } from "fs";
|
|
@@ -81,11 +81,11 @@ function registerEmbeddings(program2) {
|
|
|
81
81
|
async function loadEmbeddings() {
|
|
82
82
|
try {
|
|
83
83
|
return await import("@hiveai/embeddings");
|
|
84
|
-
} catch
|
|
84
|
+
} catch {
|
|
85
85
|
ui.error(
|
|
86
86
|
"Could not load @hiveai/embeddings. Run: npm install -g @hiveai/embeddings (or `pnpm build` in the monorepo)"
|
|
87
87
|
);
|
|
88
|
-
|
|
88
|
+
process.exit(1);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
|
|
@@ -630,19 +630,89 @@ function registerMemoryApprove(memory2) {
|
|
|
630
630
|
});
|
|
631
631
|
}
|
|
632
632
|
|
|
633
|
-
// src/commands/memory-
|
|
633
|
+
// src/commands/memory-update.ts
|
|
634
634
|
import { writeFile as writeFile7 } from "fs/promises";
|
|
635
635
|
import { existsSync as existsSync10 } from "fs";
|
|
636
636
|
import path11 from "path";
|
|
637
637
|
import "commander";
|
|
638
638
|
import {
|
|
639
|
-
DEFAULT_AUTO_PROMOTE_RULE as DEFAULT_AUTO_PROMOTE_RULE2,
|
|
640
639
|
findProjectRoot as findProjectRoot11,
|
|
640
|
+
resolveHaivePaths as resolveHaivePaths9,
|
|
641
|
+
serializeMemory as serializeMemory5
|
|
642
|
+
} from "@hiveai/core";
|
|
643
|
+
function registerMemoryUpdate(memory2) {
|
|
644
|
+
memory2.command("update <id>").description("Update body, tags, or anchor of an existing memory (preserves id and usage history)").option("--body <text>", "new Markdown body \u2014 replaces the existing body").option("--tags <csv>", "new tags, comma-separated \u2014 fully replaces existing tags").option("--paths <csv>", "new anchor paths, comma-separated").option("--symbols <csv>", "new anchor symbols, comma-separated").option("--commit <sha>", "new anchor commit SHA").option("--domain <domain>", "new domain label").option("--author <author>", "new author handle or email").option("-d, --dir <dir>", "project root").action(async (id, opts) => {
|
|
645
|
+
const root = findProjectRoot11(opts.dir);
|
|
646
|
+
const paths = resolveHaivePaths9(root);
|
|
647
|
+
if (!existsSync10(paths.memoriesDir)) {
|
|
648
|
+
ui.error(`No .ai/memories at ${root}. Run \`haive init\` first.`);
|
|
649
|
+
process.exitCode = 1;
|
|
650
|
+
return;
|
|
651
|
+
}
|
|
652
|
+
const memories = await loadMemoriesFromDir2(paths.memoriesDir);
|
|
653
|
+
const loaded = memories.find((m) => m.memory.frontmatter.id === id);
|
|
654
|
+
if (!loaded) {
|
|
655
|
+
ui.error(`No memory with id "${id}".`);
|
|
656
|
+
process.exitCode = 1;
|
|
657
|
+
return;
|
|
658
|
+
}
|
|
659
|
+
const updated = [];
|
|
660
|
+
const { frontmatter, body } = loaded.memory;
|
|
661
|
+
const newAnchor = { ...frontmatter.anchor };
|
|
662
|
+
if (opts.paths !== void 0) {
|
|
663
|
+
newAnchor.paths = parseCsv2(opts.paths);
|
|
664
|
+
updated.push("anchor.paths");
|
|
665
|
+
}
|
|
666
|
+
if (opts.symbols !== void 0) {
|
|
667
|
+
newAnchor.symbols = parseCsv2(opts.symbols);
|
|
668
|
+
updated.push("anchor.symbols");
|
|
669
|
+
}
|
|
670
|
+
if (opts.commit !== void 0) {
|
|
671
|
+
newAnchor.commit = opts.commit;
|
|
672
|
+
updated.push("anchor.commit");
|
|
673
|
+
}
|
|
674
|
+
const newFrontmatter = {
|
|
675
|
+
...frontmatter,
|
|
676
|
+
anchor: newAnchor,
|
|
677
|
+
...opts.tags !== void 0 ? { tags: parseCsv2(opts.tags) } : {},
|
|
678
|
+
...opts.domain !== void 0 ? { domain: opts.domain } : {},
|
|
679
|
+
...opts.author !== void 0 ? { author: opts.author } : {}
|
|
680
|
+
};
|
|
681
|
+
if (opts.tags !== void 0) updated.push("tags");
|
|
682
|
+
if (opts.domain !== void 0) updated.push("domain");
|
|
683
|
+
if (opts.author !== void 0) updated.push("author");
|
|
684
|
+
const newBody = opts.body !== void 0 ? opts.body : body;
|
|
685
|
+
if (opts.body !== void 0) updated.push("body");
|
|
686
|
+
if (updated.length === 0) {
|
|
687
|
+
ui.warn("Nothing to update \u2014 provide at least one option.");
|
|
688
|
+
return;
|
|
689
|
+
}
|
|
690
|
+
await writeFile7(
|
|
691
|
+
loaded.filePath,
|
|
692
|
+
serializeMemory5({ frontmatter: newFrontmatter, body: newBody }),
|
|
693
|
+
"utf8"
|
|
694
|
+
);
|
|
695
|
+
ui.success(`Updated ${path11.relative(root, loaded.filePath)}`);
|
|
696
|
+
ui.info(`fields: ${updated.join(", ")}`);
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
function parseCsv2(value) {
|
|
700
|
+
return value.split(",").map((s) => s.trim()).filter(Boolean);
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
// src/commands/memory-auto-promote.ts
|
|
704
|
+
import { writeFile as writeFile8 } from "fs/promises";
|
|
705
|
+
import { existsSync as existsSync11 } from "fs";
|
|
706
|
+
import path12 from "path";
|
|
707
|
+
import "commander";
|
|
708
|
+
import {
|
|
709
|
+
DEFAULT_AUTO_PROMOTE_RULE as DEFAULT_AUTO_PROMOTE_RULE2,
|
|
710
|
+
findProjectRoot as findProjectRoot12,
|
|
641
711
|
getUsage as getUsage2,
|
|
642
712
|
isAutoPromoteEligible as isAutoPromoteEligible2,
|
|
643
713
|
loadUsageIndex as loadUsageIndex2,
|
|
644
|
-
resolveHaivePaths as
|
|
645
|
-
serializeMemory as
|
|
714
|
+
resolveHaivePaths as resolveHaivePaths10,
|
|
715
|
+
serializeMemory as serializeMemory6
|
|
646
716
|
} from "@hiveai/core";
|
|
647
717
|
function registerMemoryAutoPromote(memory2) {
|
|
648
718
|
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_RULE2.minReads)).option(
|
|
@@ -650,9 +720,9 @@ function registerMemoryAutoPromote(memory2) {
|
|
|
650
720
|
"memories with more rejections than this are skipped",
|
|
651
721
|
String(DEFAULT_AUTO_PROMOTE_RULE2.maxRejections)
|
|
652
722
|
).option("--apply", "actually write status=validated to disk (default: dry-run)").option("-d, --dir <dir>", "project root").action(async (opts) => {
|
|
653
|
-
const root =
|
|
654
|
-
const paths =
|
|
655
|
-
if (!
|
|
723
|
+
const root = findProjectRoot12(opts.dir);
|
|
724
|
+
const paths = resolveHaivePaths10(root);
|
|
725
|
+
if (!existsSync11(paths.memoriesDir)) {
|
|
656
726
|
ui.error(`No .ai/memories at ${root}.`);
|
|
657
727
|
process.exitCode = 1;
|
|
658
728
|
return;
|
|
@@ -678,13 +748,13 @@ function registerMemoryAutoPromote(memory2) {
|
|
|
678
748
|
console.log(
|
|
679
749
|
`${ui.bold(opts.apply ? "PROMOTE" : "would promote")} ${mem.frontmatter.id} ${ui.dim(`reads=${u.read_count} rejections=${u.rejected_count}`)}`
|
|
680
750
|
);
|
|
681
|
-
console.log(` ${ui.dim(
|
|
751
|
+
console.log(` ${ui.dim(path12.relative(root, filePath))}`);
|
|
682
752
|
if (opts.apply) {
|
|
683
753
|
const next = {
|
|
684
754
|
frontmatter: { ...mem.frontmatter, status: "validated" },
|
|
685
755
|
body: mem.body
|
|
686
756
|
};
|
|
687
|
-
await
|
|
757
|
+
await writeFile8(filePath, serializeMemory6(next), "utf8");
|
|
688
758
|
written++;
|
|
689
759
|
}
|
|
690
760
|
}
|
|
@@ -695,20 +765,20 @@ function registerMemoryAutoPromote(memory2) {
|
|
|
695
765
|
|
|
696
766
|
// src/commands/memory-edit.ts
|
|
697
767
|
import { spawn as spawn2 } from "child_process";
|
|
698
|
-
import { existsSync as
|
|
768
|
+
import { existsSync as existsSync12 } from "fs";
|
|
699
769
|
import { readFile as readFile2 } from "fs/promises";
|
|
700
|
-
import
|
|
770
|
+
import path13 from "path";
|
|
701
771
|
import "commander";
|
|
702
772
|
import {
|
|
703
|
-
findProjectRoot as
|
|
773
|
+
findProjectRoot as findProjectRoot13,
|
|
704
774
|
parseMemory,
|
|
705
|
-
resolveHaivePaths as
|
|
775
|
+
resolveHaivePaths as resolveHaivePaths11
|
|
706
776
|
} from "@hiveai/core";
|
|
707
777
|
function registerMemoryEdit(memory2) {
|
|
708
778
|
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) => {
|
|
709
|
-
const root =
|
|
710
|
-
const paths =
|
|
711
|
-
if (!
|
|
779
|
+
const root = findProjectRoot13(opts.dir);
|
|
780
|
+
const paths = resolveHaivePaths11(root);
|
|
781
|
+
if (!existsSync12(paths.memoriesDir)) {
|
|
712
782
|
ui.error(`No .ai/memories at ${root}.`);
|
|
713
783
|
process.exitCode = 1;
|
|
714
784
|
return;
|
|
@@ -721,7 +791,7 @@ function registerMemoryEdit(memory2) {
|
|
|
721
791
|
return;
|
|
722
792
|
}
|
|
723
793
|
const editor = opts.editor ?? process.env.EDITOR ?? process.env.VISUAL ?? "vi";
|
|
724
|
-
ui.info(`Opening ${
|
|
794
|
+
ui.info(`Opening ${path13.relative(root, found.filePath)} with ${editor}\u2026`);
|
|
725
795
|
const code = await runEditor(editor, found.filePath);
|
|
726
796
|
if (code !== 0) {
|
|
727
797
|
ui.warn(`Editor exited with status ${code}.`);
|
|
@@ -748,23 +818,23 @@ function runEditor(editor, file) {
|
|
|
748
818
|
}
|
|
749
819
|
|
|
750
820
|
// src/commands/memory-for-files.ts
|
|
751
|
-
import { existsSync as
|
|
752
|
-
import
|
|
821
|
+
import { existsSync as existsSync13 } from "fs";
|
|
822
|
+
import path14 from "path";
|
|
753
823
|
import "commander";
|
|
754
824
|
import {
|
|
755
825
|
deriveConfidence,
|
|
756
|
-
findProjectRoot as
|
|
826
|
+
findProjectRoot as findProjectRoot14,
|
|
757
827
|
getUsage as getUsage3,
|
|
758
828
|
inferModulesFromPaths as inferModulesFromPaths2,
|
|
759
829
|
loadUsageIndex as loadUsageIndex3,
|
|
760
830
|
memoryMatchesAnchorPaths,
|
|
761
|
-
resolveHaivePaths as
|
|
831
|
+
resolveHaivePaths as resolveHaivePaths12
|
|
762
832
|
} from "@hiveai/core";
|
|
763
833
|
function registerMemoryForFiles(memory2) {
|
|
764
834
|
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) => {
|
|
765
|
-
const root =
|
|
766
|
-
const paths =
|
|
767
|
-
if (!
|
|
835
|
+
const root = findProjectRoot14(opts.dir);
|
|
836
|
+
const paths = resolveHaivePaths12(root);
|
|
837
|
+
if (!existsSync13(paths.memoriesDir)) {
|
|
768
838
|
ui.error(`No .ai/memories at ${root}.`);
|
|
769
839
|
process.exitCode = 1;
|
|
770
840
|
return;
|
|
@@ -817,25 +887,25 @@ function printGroup(root, label, loaded, usage) {
|
|
|
817
887
|
const u = getUsage3(usage, fm.id);
|
|
818
888
|
const conf = deriveConfidence(fm, u);
|
|
819
889
|
console.log(`${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(conf)}`);
|
|
820
|
-
console.log(` ${ui.dim(
|
|
890
|
+
console.log(` ${ui.dim(path14.relative(root, filePath))}`);
|
|
821
891
|
}
|
|
822
892
|
}
|
|
823
893
|
|
|
824
894
|
// src/commands/memory-hot.ts
|
|
825
|
-
import { existsSync as
|
|
826
|
-
import
|
|
895
|
+
import { existsSync as existsSync14 } from "fs";
|
|
896
|
+
import path15 from "path";
|
|
827
897
|
import "commander";
|
|
828
898
|
import {
|
|
829
|
-
findProjectRoot as
|
|
899
|
+
findProjectRoot as findProjectRoot15,
|
|
830
900
|
getUsage as getUsage4,
|
|
831
901
|
loadUsageIndex as loadUsageIndex4,
|
|
832
|
-
resolveHaivePaths as
|
|
902
|
+
resolveHaivePaths as resolveHaivePaths13
|
|
833
903
|
} from "@hiveai/core";
|
|
834
904
|
function registerMemoryHot(memory2) {
|
|
835
905
|
memory2.command("hot").description("List memories actively used but not yet validated (good promotion candidates)").option("--threshold <n>", "minimum read_count to qualify", "3").option("--status <status>", "limit to one status (default: draft + proposed)").option("-d, --dir <dir>", "project root").action(async (opts) => {
|
|
836
|
-
const root =
|
|
837
|
-
const paths =
|
|
838
|
-
if (!
|
|
906
|
+
const root = findProjectRoot15(opts.dir);
|
|
907
|
+
const paths = resolveHaivePaths13(root);
|
|
908
|
+
if (!existsSync14(paths.memoriesDir)) {
|
|
839
909
|
ui.error(`No .ai/memories at ${root}.`);
|
|
840
910
|
process.exitCode = 1;
|
|
841
911
|
return;
|
|
@@ -863,7 +933,7 @@ function registerMemoryHot(memory2) {
|
|
|
863
933
|
console.log(
|
|
864
934
|
`${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.bold(fm.status)} ${ui.dim(`reads=${u.read_count} rejections=${u.rejected_count}`)}`
|
|
865
935
|
);
|
|
866
|
-
console.log(` ${ui.dim(
|
|
936
|
+
console.log(` ${ui.dim(path15.relative(root, filePath))}`);
|
|
867
937
|
}
|
|
868
938
|
ui.info(
|
|
869
939
|
`${candidates.length} hot \u2014 promote drafts with \`haive memory promote <id>\`, then \`haive memory auto-promote --apply\`.`
|
|
@@ -872,20 +942,20 @@ function registerMemoryHot(memory2) {
|
|
|
872
942
|
}
|
|
873
943
|
|
|
874
944
|
// src/commands/memory-pending.ts
|
|
875
|
-
import { existsSync as
|
|
876
|
-
import
|
|
945
|
+
import { existsSync as existsSync15 } from "fs";
|
|
946
|
+
import path16 from "path";
|
|
877
947
|
import "commander";
|
|
878
948
|
import {
|
|
879
|
-
findProjectRoot as
|
|
949
|
+
findProjectRoot as findProjectRoot16,
|
|
880
950
|
getUsage as getUsage5,
|
|
881
951
|
loadUsageIndex as loadUsageIndex5,
|
|
882
|
-
resolveHaivePaths as
|
|
952
|
+
resolveHaivePaths as resolveHaivePaths14
|
|
883
953
|
} from "@hiveai/core";
|
|
884
954
|
function registerMemoryPending(memory2) {
|
|
885
955
|
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) => {
|
|
886
|
-
const root =
|
|
887
|
-
const paths =
|
|
888
|
-
if (!
|
|
956
|
+
const root = findProjectRoot16(opts.dir);
|
|
957
|
+
const paths = resolveHaivePaths14(root);
|
|
958
|
+
if (!existsSync15(paths.memoriesDir)) {
|
|
889
959
|
ui.error(`No .ai/memories at ${root}.`);
|
|
890
960
|
process.exitCode = 1;
|
|
891
961
|
return;
|
|
@@ -913,29 +983,29 @@ function registerMemoryPending(memory2) {
|
|
|
913
983
|
console.log(
|
|
914
984
|
`${ui.bold(fm.id)} ${ui.dim(`${fm.scope}/${fm.type}`)} ${ui.dim(`age=${ageStr} reads=${u.read_count} rejections=${u.rejected_count}`)}`
|
|
915
985
|
);
|
|
916
|
-
console.log(` ${ui.dim(
|
|
986
|
+
console.log(` ${ui.dim(path16.relative(root, filePath))}`);
|
|
917
987
|
}
|
|
918
988
|
ui.info(`${proposed.length} pending`);
|
|
919
989
|
});
|
|
920
990
|
}
|
|
921
991
|
|
|
922
992
|
// src/commands/memory-query.ts
|
|
923
|
-
import { existsSync as
|
|
924
|
-
import
|
|
993
|
+
import { existsSync as existsSync16 } from "fs";
|
|
994
|
+
import path17 from "path";
|
|
925
995
|
import "commander";
|
|
926
996
|
import {
|
|
927
997
|
extractSnippet,
|
|
928
|
-
findProjectRoot as
|
|
998
|
+
findProjectRoot as findProjectRoot17,
|
|
929
999
|
literalMatchesAllTokens,
|
|
930
1000
|
pickSnippetNeedle,
|
|
931
|
-
resolveHaivePaths as
|
|
1001
|
+
resolveHaivePaths as resolveHaivePaths15,
|
|
932
1002
|
tokenizeQuery
|
|
933
1003
|
} from "@hiveai/core";
|
|
934
1004
|
function registerMemoryQuery(memory2) {
|
|
935
1005
|
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) => {
|
|
936
|
-
const root =
|
|
937
|
-
const paths =
|
|
938
|
-
if (!
|
|
1006
|
+
const root = findProjectRoot17(opts.dir);
|
|
1007
|
+
const paths = resolveHaivePaths15(root);
|
|
1008
|
+
if (!existsSync16(paths.memoriesDir)) {
|
|
939
1009
|
ui.error(`No memories directory at ${paths.memoriesDir}. Run \`haive init\` first.`);
|
|
940
1010
|
process.exitCode = 1;
|
|
941
1011
|
return;
|
|
@@ -953,7 +1023,7 @@ function registerMemoryQuery(memory2) {
|
|
|
953
1023
|
for (const { memory: mem, filePath } of top) {
|
|
954
1024
|
const snippet = extractSnippet(mem.body, snippetNeedle);
|
|
955
1025
|
console.log(`${ui.bold(mem.frontmatter.id)} ${ui.dim(mem.frontmatter.scope)}`);
|
|
956
|
-
console.log(` ${ui.dim(
|
|
1026
|
+
console.log(` ${ui.dim(path17.relative(root, filePath))}`);
|
|
957
1027
|
if (snippet) console.log(` ${snippet}`);
|
|
958
1028
|
}
|
|
959
1029
|
console.log(
|
|
@@ -964,58 +1034,69 @@ ${top.length} of ${matches.length} match${matches.length === 1 ? "" : "es"}`)
|
|
|
964
1034
|
}
|
|
965
1035
|
|
|
966
1036
|
// src/commands/memory-reject.ts
|
|
967
|
-
import {
|
|
1037
|
+
import { writeFile as writeFile9 } from "fs/promises";
|
|
1038
|
+
import { existsSync as existsSync17 } from "fs";
|
|
968
1039
|
import "commander";
|
|
969
1040
|
import {
|
|
970
|
-
findProjectRoot as
|
|
1041
|
+
findProjectRoot as findProjectRoot18,
|
|
971
1042
|
loadUsageIndex as loadUsageIndex6,
|
|
972
1043
|
recordRejection,
|
|
973
|
-
resolveHaivePaths as
|
|
974
|
-
saveUsageIndex
|
|
1044
|
+
resolveHaivePaths as resolveHaivePaths16,
|
|
1045
|
+
saveUsageIndex,
|
|
1046
|
+
serializeMemory as serializeMemory7
|
|
975
1047
|
} from "@hiveai/core";
|
|
976
1048
|
function registerMemoryReject(memory2) {
|
|
977
1049
|
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) => {
|
|
978
|
-
const root =
|
|
979
|
-
const paths =
|
|
980
|
-
if (!
|
|
1050
|
+
const root = findProjectRoot18(opts.dir);
|
|
1051
|
+
const paths = resolveHaivePaths16(root);
|
|
1052
|
+
if (!existsSync17(paths.memoriesDir)) {
|
|
981
1053
|
ui.error(`No .ai/memories at ${root}.`);
|
|
982
1054
|
process.exitCode = 1;
|
|
983
1055
|
return;
|
|
984
1056
|
}
|
|
985
1057
|
const memories = await loadMemoriesFromDir2(paths.memoriesDir);
|
|
986
|
-
|
|
1058
|
+
const loaded = memories.find((m) => m.memory.frontmatter.id === id);
|
|
1059
|
+
if (!loaded) {
|
|
987
1060
|
ui.error(`No memory with id "${id}".`);
|
|
988
1061
|
process.exitCode = 1;
|
|
989
1062
|
return;
|
|
990
1063
|
}
|
|
1064
|
+
await writeFile9(
|
|
1065
|
+
loaded.filePath,
|
|
1066
|
+
serializeMemory7({
|
|
1067
|
+
frontmatter: { ...loaded.memory.frontmatter, status: "rejected" },
|
|
1068
|
+
body: loaded.memory.body
|
|
1069
|
+
}),
|
|
1070
|
+
"utf8"
|
|
1071
|
+
);
|
|
991
1072
|
const idx = await loadUsageIndex6(paths);
|
|
992
1073
|
recordRejection(idx, id, opts.reason ?? null);
|
|
993
1074
|
await saveUsageIndex(paths, idx);
|
|
994
1075
|
const u = idx.by_id[id];
|
|
995
1076
|
ui.success(
|
|
996
|
-
`
|
|
1077
|
+
`Rejected ${id} (status=rejected, ${u.rejected_count} rejection${u.rejected_count === 1 ? "" : "s"})`
|
|
997
1078
|
);
|
|
998
1079
|
if (opts.reason) ui.info(`reason: ${opts.reason}`);
|
|
999
1080
|
});
|
|
1000
1081
|
}
|
|
1001
1082
|
|
|
1002
1083
|
// src/commands/memory-rm.ts
|
|
1003
|
-
import { existsSync as
|
|
1084
|
+
import { existsSync as existsSync18 } from "fs";
|
|
1004
1085
|
import { unlink as unlink2 } from "fs/promises";
|
|
1005
|
-
import
|
|
1086
|
+
import path18 from "path";
|
|
1006
1087
|
import { createInterface } from "readline/promises";
|
|
1007
1088
|
import "commander";
|
|
1008
1089
|
import {
|
|
1009
|
-
findProjectRoot as
|
|
1090
|
+
findProjectRoot as findProjectRoot19,
|
|
1010
1091
|
loadUsageIndex as loadUsageIndex7,
|
|
1011
|
-
resolveHaivePaths as
|
|
1092
|
+
resolveHaivePaths as resolveHaivePaths17,
|
|
1012
1093
|
saveUsageIndex as saveUsageIndex2
|
|
1013
1094
|
} from "@hiveai/core";
|
|
1014
1095
|
function registerMemoryRm(memory2) {
|
|
1015
1096
|
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) => {
|
|
1016
|
-
const root =
|
|
1017
|
-
const paths =
|
|
1018
|
-
if (!
|
|
1097
|
+
const root = findProjectRoot19(opts.dir);
|
|
1098
|
+
const paths = resolveHaivePaths17(root);
|
|
1099
|
+
if (!existsSync18(paths.memoriesDir)) {
|
|
1019
1100
|
ui.error(`No .ai/memories at ${root}.`);
|
|
1020
1101
|
process.exitCode = 1;
|
|
1021
1102
|
return;
|
|
@@ -1027,7 +1108,7 @@ function registerMemoryRm(memory2) {
|
|
|
1027
1108
|
process.exitCode = 1;
|
|
1028
1109
|
return;
|
|
1029
1110
|
}
|
|
1030
|
-
const rel =
|
|
1111
|
+
const rel = path18.relative(root, found.filePath);
|
|
1031
1112
|
if (!opts.yes) {
|
|
1032
1113
|
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
1033
1114
|
const answer = (await rl.question(`Delete ${rel}? [y/N] `)).trim().toLowerCase();
|
|
@@ -1051,22 +1132,22 @@ function registerMemoryRm(memory2) {
|
|
|
1051
1132
|
}
|
|
1052
1133
|
|
|
1053
1134
|
// src/commands/memory-show.ts
|
|
1054
|
-
import { existsSync as
|
|
1135
|
+
import { existsSync as existsSync19 } from "fs";
|
|
1055
1136
|
import { readFile as readFile3 } from "fs/promises";
|
|
1056
|
-
import
|
|
1137
|
+
import path19 from "path";
|
|
1057
1138
|
import "commander";
|
|
1058
1139
|
import {
|
|
1059
1140
|
deriveConfidence as deriveConfidence2,
|
|
1060
|
-
findProjectRoot as
|
|
1141
|
+
findProjectRoot as findProjectRoot20,
|
|
1061
1142
|
getUsage as getUsage6,
|
|
1062
1143
|
loadUsageIndex as loadUsageIndex8,
|
|
1063
|
-
resolveHaivePaths as
|
|
1144
|
+
resolveHaivePaths as resolveHaivePaths18
|
|
1064
1145
|
} from "@hiveai/core";
|
|
1065
1146
|
function registerMemoryShow(memory2) {
|
|
1066
1147
|
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) => {
|
|
1067
|
-
const root =
|
|
1068
|
-
const paths =
|
|
1069
|
-
if (!
|
|
1148
|
+
const root = findProjectRoot20(opts.dir);
|
|
1149
|
+
const paths = resolveHaivePaths18(root);
|
|
1150
|
+
if (!existsSync19(paths.memoriesDir)) {
|
|
1070
1151
|
ui.error(`No .ai/memories at ${root}.`);
|
|
1071
1152
|
process.exitCode = 1;
|
|
1072
1153
|
return;
|
|
@@ -1095,7 +1176,7 @@ function registerMemoryShow(memory2) {
|
|
|
1095
1176
|
if (fm.verified_at) console.log(`${ui.dim("verified:")} ${fm.verified_at}`);
|
|
1096
1177
|
if (fm.stale_reason) console.log(`${ui.dim("stale:")} ${fm.stale_reason}`);
|
|
1097
1178
|
console.log(`${ui.dim("reads:")} ${u.read_count} ${ui.dim("rejections:")} ${u.rejected_count}`);
|
|
1098
|
-
console.log(`${ui.dim("file:")} ${
|
|
1179
|
+
console.log(`${ui.dim("file:")} ${path19.relative(root, found.filePath)}`);
|
|
1099
1180
|
if (fm.anchor.paths.length || fm.anchor.symbols.length) {
|
|
1100
1181
|
console.log(ui.dim("anchor:"));
|
|
1101
1182
|
if (fm.anchor.commit) console.log(` ${ui.dim("commit:")} ${fm.anchor.commit}`);
|
|
@@ -1110,21 +1191,21 @@ function registerMemoryShow(memory2) {
|
|
|
1110
1191
|
}
|
|
1111
1192
|
|
|
1112
1193
|
// src/commands/memory-stats.ts
|
|
1113
|
-
import { existsSync as
|
|
1114
|
-
import
|
|
1194
|
+
import { existsSync as existsSync20 } from "fs";
|
|
1195
|
+
import path20 from "path";
|
|
1115
1196
|
import "commander";
|
|
1116
1197
|
import {
|
|
1117
1198
|
deriveConfidence as deriveConfidence3,
|
|
1118
|
-
findProjectRoot as
|
|
1199
|
+
findProjectRoot as findProjectRoot21,
|
|
1119
1200
|
getUsage as getUsage7,
|
|
1120
1201
|
loadUsageIndex as loadUsageIndex9,
|
|
1121
|
-
resolveHaivePaths as
|
|
1202
|
+
resolveHaivePaths as resolveHaivePaths19
|
|
1122
1203
|
} from "@hiveai/core";
|
|
1123
1204
|
function registerMemoryStats(memory2) {
|
|
1124
1205
|
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) => {
|
|
1125
|
-
const root =
|
|
1126
|
-
const paths =
|
|
1127
|
-
if (!
|
|
1206
|
+
const root = findProjectRoot21(opts.dir);
|
|
1207
|
+
const paths = resolveHaivePaths19(root);
|
|
1208
|
+
if (!existsSync20(paths.memoriesDir)) {
|
|
1128
1209
|
ui.error(`No .ai/memories at ${root}. Run \`haive init\` first.`);
|
|
1129
1210
|
process.exitCode = 1;
|
|
1130
1211
|
return;
|
|
@@ -1149,27 +1230,27 @@ function registerMemoryStats(memory2) {
|
|
|
1149
1230
|
console.log(
|
|
1150
1231
|
` ${ui.dim("status:")} ${fm.status} ${ui.dim("reads:")} ${u.read_count} ${ui.dim("rejections:")} ${u.rejected_count}`
|
|
1151
1232
|
);
|
|
1152
|
-
console.log(` ${ui.dim(
|
|
1233
|
+
console.log(` ${ui.dim(path20.relative(root, filePath))}`);
|
|
1153
1234
|
}
|
|
1154
1235
|
});
|
|
1155
1236
|
}
|
|
1156
1237
|
|
|
1157
1238
|
// src/commands/memory-verify.ts
|
|
1158
|
-
import { writeFile as
|
|
1159
|
-
import { existsSync as
|
|
1160
|
-
import
|
|
1239
|
+
import { writeFile as writeFile10 } from "fs/promises";
|
|
1240
|
+
import { existsSync as existsSync21 } from "fs";
|
|
1241
|
+
import path21 from "path";
|
|
1161
1242
|
import "commander";
|
|
1162
1243
|
import {
|
|
1163
|
-
findProjectRoot as
|
|
1164
|
-
resolveHaivePaths as
|
|
1165
|
-
serializeMemory as
|
|
1244
|
+
findProjectRoot as findProjectRoot22,
|
|
1245
|
+
resolveHaivePaths as resolveHaivePaths20,
|
|
1246
|
+
serializeMemory as serializeMemory8,
|
|
1166
1247
|
verifyAnchor as verifyAnchor2
|
|
1167
1248
|
} from "@hiveai/core";
|
|
1168
1249
|
function registerMemoryVerify(memory2) {
|
|
1169
1250
|
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) => {
|
|
1170
|
-
const root =
|
|
1171
|
-
const paths =
|
|
1172
|
-
if (!
|
|
1251
|
+
const root = findProjectRoot22(opts.dir);
|
|
1252
|
+
const paths = resolveHaivePaths20(root);
|
|
1253
|
+
if (!existsSync21(paths.memoriesDir)) {
|
|
1173
1254
|
ui.error(`No .ai/memories at ${root}. Run \`haive init\` first.`);
|
|
1174
1255
|
process.exitCode = 1;
|
|
1175
1256
|
return;
|
|
@@ -1192,7 +1273,7 @@ function registerMemoryVerify(memory2) {
|
|
|
1192
1273
|
anchorless++;
|
|
1193
1274
|
continue;
|
|
1194
1275
|
}
|
|
1195
|
-
const rel =
|
|
1276
|
+
const rel = path21.relative(root, filePath);
|
|
1196
1277
|
if (result.stale) {
|
|
1197
1278
|
staleCount++;
|
|
1198
1279
|
console.log(`${ui.bold("STALE")} ${mem.frontmatter.id}`);
|
|
@@ -1204,7 +1285,7 @@ function registerMemoryVerify(memory2) {
|
|
|
1204
1285
|
}
|
|
1205
1286
|
if (opts.update) {
|
|
1206
1287
|
const next = applyVerification(mem, result);
|
|
1207
|
-
await
|
|
1288
|
+
await writeFile10(filePath, serializeMemory8(next), "utf8");
|
|
1208
1289
|
updated++;
|
|
1209
1290
|
}
|
|
1210
1291
|
}
|
|
@@ -1243,8 +1324,8 @@ function applyVerification(mem, result) {
|
|
|
1243
1324
|
}
|
|
1244
1325
|
|
|
1245
1326
|
// src/index.ts
|
|
1246
|
-
var program = new
|
|
1247
|
-
program.name("haive").description("hAIve \u2014 team-first persistent memory layer for AI coding agents").version("0.2.
|
|
1327
|
+
var program = new Command23();
|
|
1328
|
+
program.name("haive").description("hAIve \u2014 team-first persistent memory layer for AI coding agents").version("0.2.2");
|
|
1248
1329
|
registerInit(program);
|
|
1249
1330
|
registerMcp(program);
|
|
1250
1331
|
registerEmbeddings(program);
|
|
@@ -1266,6 +1347,7 @@ registerMemoryEdit(memory);
|
|
|
1266
1347
|
registerMemoryRm(memory);
|
|
1267
1348
|
registerMemoryPending(memory);
|
|
1268
1349
|
registerMemoryApprove(memory);
|
|
1350
|
+
registerMemoryUpdate(memory);
|
|
1269
1351
|
registerMemoryHot(memory);
|
|
1270
1352
|
program.parseAsync(process.argv).catch((err) => {
|
|
1271
1353
|
if (isZodError(err)) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/embeddings.ts","../src/utils/ui.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-auto-promote.ts","../src/commands/memory-edit.ts","../src/commands/memory-for-files.ts","../src/commands/memory-hot.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 { 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 { 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 { 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\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);\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);\nregisterMemoryHot(memory);\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 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. Run: npm install -g @hiveai/embeddings (or `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 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\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 { 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 { 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 loadMemoriesFromDir,\n loadUsageIndex,\n resolveHaivePaths,\n serializeMemory,\n verifyAnchor,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface SyncOptions {\n dir?: string;\n quiet?: boolean;\n since?: string;\n verify?: boolean;\n promote?: 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 .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 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 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\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}\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 { 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 inferModulesFromPaths,\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(\"--no-auto-tag\", \"disable automatic tag suggestions inferred from anchor paths\")\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 frontmatter = buildFrontmatter({\n type: opts.type,\n slug: opts.slug,\n scope: opts.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 });\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 if (inferredTags.length > 0) {\n ui.info(`auto-tagged: ${inferredTags.join(\", \")} (use --no-auto-tag to disable)`);\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 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 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 { 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","path","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","path","existsSync","path","resolveHaivePaths","program","path","resolveHaivePaths","existsSync","mkdir","writeFile","existsSync","path","findProjectRoot","program","findProjectRoot","path","existsSync","mkdir","writeFile","existsSync","path","findProjectRoot","require","program","findProjectRoot","path","existsSync","writeFile","existsSync","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","memory","writeFile","mkdir","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","mkdir","path","writeFile","serializeMemory","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","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","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","inferModulesFromPaths","getUsage","path","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","existsSync","path","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","existsSync","findProjectRoot","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","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","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/embeddings.ts","../src/utils/ui.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-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 { 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 { 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\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);\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);\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 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 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 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\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 { 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 { 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 loadMemoriesFromDir,\n loadUsageIndex,\n resolveHaivePaths,\n serializeMemory,\n verifyAnchor,\n} from \"@hiveai/core\";\nimport { ui } from \"../utils/ui.js\";\n\ninterface SyncOptions {\n dir?: string;\n quiet?: boolean;\n since?: string;\n verify?: boolean;\n promote?: 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 .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 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 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\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}\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 { 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 inferModulesFromPaths,\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(\"--no-auto-tag\", \"disable automatic tag suggestions inferred from anchor paths\")\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 frontmatter = buildFrontmatter({\n type: opts.type,\n slug: opts.slug,\n scope: opts.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 });\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 if (inferredTags.length > 0) {\n ui.info(`auto-tagged: ${inferredTags.join(\", \")} (use --no-auto-tag to disable)`);\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 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 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 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(\"--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 const newBody = opts.body !== undefined ? opts.body : body;\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 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 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 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 { 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 { 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: { ...loaded.memory.frontmatter, status: \"rejected\" },\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 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","path","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","path","existsSync","path","resolveHaivePaths","program","path","resolveHaivePaths","existsSync","mkdir","writeFile","existsSync","path","findProjectRoot","program","findProjectRoot","path","existsSync","mkdir","writeFile","existsSync","path","findProjectRoot","require","program","findProjectRoot","path","existsSync","writeFile","existsSync","findProjectRoot","resolveHaivePaths","program","findProjectRoot","resolveHaivePaths","existsSync","memory","writeFile","mkdir","writeFile","existsSync","path","findProjectRoot","resolveHaivePaths","serializeMemory","memory","findProjectRoot","resolveHaivePaths","existsSync","mkdir","path","writeFile","serializeMemory","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","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","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","inferModulesFromPaths","getUsage","path","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","existsSync","path","findProjectRoot","getUsage","loadUsageIndex","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","path","existsSync","path","findProjectRoot","resolveHaivePaths","memory","findProjectRoot","resolveHaivePaths","existsSync","loadMemoriesFromDir","path","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","Command"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hiveai/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "hAIve CLI — manage shared AI memories from the terminal",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"commander": "^12.1.0",
|
|
32
32
|
"picocolors": "^1.1.1",
|
|
33
|
-
"@hiveai/core": "0.2.
|
|
34
|
-
"@hiveai/mcp": "0.2.
|
|
33
|
+
"@hiveai/core": "0.2.2",
|
|
34
|
+
"@hiveai/mcp": "0.2.2"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
|
-
"@hiveai/embeddings": "^0.2.
|
|
37
|
+
"@hiveai/embeddings": "^0.2.2"
|
|
38
38
|
},
|
|
39
39
|
"peerDependenciesMeta": {
|
|
40
40
|
"@hiveai/embeddings": {
|