ricord 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +213 -0
  3. package/commands/ricord-flush.md +29 -0
  4. package/commands/ricord-init.md +129 -0
  5. package/commands/ricord-lint.md +64 -0
  6. package/commands/ricord-query.md +71 -0
  7. package/dist/cli/auth.d.ts +16 -0
  8. package/dist/cli/auth.js +42 -0
  9. package/dist/cli/auth.js.map +1 -0
  10. package/dist/cli/bundle.d.ts +25 -0
  11. package/dist/cli/bundle.js +179 -0
  12. package/dist/cli/bundle.js.map +1 -0
  13. package/dist/cli/cache.d.ts +18 -0
  14. package/dist/cli/cache.js +39 -0
  15. package/dist/cli/cache.js.map +1 -0
  16. package/dist/cli/cli.d.ts +21 -0
  17. package/dist/cli/cli.js +355 -0
  18. package/dist/cli/cli.js.map +1 -0
  19. package/dist/cli/client.d.ts +12 -0
  20. package/dist/cli/client.js +35 -0
  21. package/dist/cli/client.js.map +1 -0
  22. package/dist/cli/commands/build.d.ts +44 -0
  23. package/dist/cli/commands/build.js +437 -0
  24. package/dist/cli/commands/build.js.map +1 -0
  25. package/dist/cli/commands/curate.d.ts +32 -0
  26. package/dist/cli/commands/curate.js +154 -0
  27. package/dist/cli/commands/curate.js.map +1 -0
  28. package/dist/cli/commands/doctor.d.ts +16 -0
  29. package/dist/cli/commands/doctor.js +92 -0
  30. package/dist/cli/commands/doctor.js.map +1 -0
  31. package/dist/cli/commands/ingest.d.ts +25 -0
  32. package/dist/cli/commands/ingest.js +121 -0
  33. package/dist/cli/commands/ingest.js.map +1 -0
  34. package/dist/cli/commands/install.d.ts +16 -0
  35. package/dist/cli/commands/install.js +82 -0
  36. package/dist/cli/commands/install.js.map +1 -0
  37. package/dist/cli/commands/pull.d.ts +24 -0
  38. package/dist/cli/commands/pull.js +104 -0
  39. package/dist/cli/commands/pull.js.map +1 -0
  40. package/dist/cli/commands/push.d.ts +28 -0
  41. package/dist/cli/commands/push.js +164 -0
  42. package/dist/cli/commands/push.js.map +1 -0
  43. package/dist/cli/commands/rollup.d.ts +21 -0
  44. package/dist/cli/commands/rollup.js +118 -0
  45. package/dist/cli/commands/rollup.js.map +1 -0
  46. package/dist/cli/commands/setup.d.ts +7 -0
  47. package/dist/cli/commands/setup.js +43 -0
  48. package/dist/cli/commands/setup.js.map +1 -0
  49. package/dist/cli/commands/sync.d.ts +15 -0
  50. package/dist/cli/commands/sync.js +63 -0
  51. package/dist/cli/commands/sync.js.map +1 -0
  52. package/dist/cli/commands/watch.d.ts +17 -0
  53. package/dist/cli/commands/watch.js +87 -0
  54. package/dist/cli/commands/watch.js.map +1 -0
  55. package/dist/cli/config.d.ts +29 -0
  56. package/dist/cli/config.js +52 -0
  57. package/dist/cli/config.js.map +1 -0
  58. package/dist/cli/extract.d.ts +101 -0
  59. package/dist/cli/extract.js +216 -0
  60. package/dist/cli/extract.js.map +1 -0
  61. package/dist/cli/ingest.d.ts +48 -0
  62. package/dist/cli/ingest.js +74 -0
  63. package/dist/cli/ingest.js.map +1 -0
  64. package/dist/cli/ledger.d.ts +44 -0
  65. package/dist/cli/ledger.js +67 -0
  66. package/dist/cli/ledger.js.map +1 -0
  67. package/dist/cli/llm.d.ts +21 -0
  68. package/dist/cli/llm.js +138 -0
  69. package/dist/cli/llm.js.map +1 -0
  70. package/dist/cli/parse.d.ts +13 -0
  71. package/dist/cli/parse.js +188 -0
  72. package/dist/cli/parse.js.map +1 -0
  73. package/dist/cli/run-explore.d.ts +56 -0
  74. package/dist/cli/run-explore.js +229 -0
  75. package/dist/cli/run-explore.js.map +1 -0
  76. package/dist/cli/summarize.d.ts +15 -0
  77. package/dist/cli/summarize.js +49 -0
  78. package/dist/cli/summarize.js.map +1 -0
  79. package/dist/cli/uninstall.d.ts +6 -0
  80. package/dist/cli/uninstall.js +277 -0
  81. package/dist/cli/uninstall.js.map +1 -0
  82. package/dist/cli/walk.d.ts +13 -0
  83. package/dist/cli/walk.js +62 -0
  84. package/dist/cli/walk.js.map +1 -0
  85. package/dist/cli/walker.d.ts +14 -0
  86. package/dist/cli/walker.js +120 -0
  87. package/dist/cli/walker.js.map +1 -0
  88. package/dist/hooks/pre-compact.d.ts +15 -0
  89. package/dist/hooks/pre-compact.js +127 -0
  90. package/dist/hooks/pre-compact.js.map +1 -0
  91. package/dist/hooks/pre-tool-use.d.ts +15 -0
  92. package/dist/hooks/pre-tool-use.js +25 -0
  93. package/dist/hooks/pre-tool-use.js.map +1 -0
  94. package/dist/hooks/session-end.d.ts +21 -0
  95. package/dist/hooks/session-end.js +186 -0
  96. package/dist/hooks/session-end.js.map +1 -0
  97. package/dist/hooks/session-start.d.ts +15 -0
  98. package/dist/hooks/session-start.js +233 -0
  99. package/dist/hooks/session-start.js.map +1 -0
  100. package/dist/hooks/turn-end-post.d.ts +17 -0
  101. package/dist/hooks/turn-end-post.js +66 -0
  102. package/dist/hooks/turn-end-post.js.map +1 -0
  103. package/dist/hooks/turn-end.d.ts +29 -0
  104. package/dist/hooks/turn-end.js +295 -0
  105. package/dist/hooks/turn-end.js.map +1 -0
  106. package/dist/index.d.ts +24 -0
  107. package/dist/index.js +1547 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/init.d.ts +45 -0
  110. package/dist/init.js +839 -0
  111. package/dist/init.js.map +1 -0
  112. package/dist/lib/active-project.d.ts +14 -0
  113. package/dist/lib/active-project.js +65 -0
  114. package/dist/lib/active-project.js.map +1 -0
  115. package/dist/lib/buffer.d.ts +34 -0
  116. package/dist/lib/buffer.js +79 -0
  117. package/dist/lib/buffer.js.map +1 -0
  118. package/dist/scripts/compile.d.ts +25 -0
  119. package/dist/scripts/compile.js +185 -0
  120. package/dist/scripts/compile.js.map +1 -0
  121. package/dist/scripts/config.d.ts +30 -0
  122. package/dist/scripts/config.js +68 -0
  123. package/dist/scripts/config.js.map +1 -0
  124. package/dist/scripts/flush.d.ts +23 -0
  125. package/dist/scripts/flush.js +230 -0
  126. package/dist/scripts/flush.js.map +1 -0
  127. package/dist/scripts/lint.d.ts +21 -0
  128. package/dist/scripts/lint.js +242 -0
  129. package/dist/scripts/lint.js.map +1 -0
  130. package/dist/scripts/utils.d.ts +43 -0
  131. package/dist/scripts/utils.js +165 -0
  132. package/dist/scripts/utils.js.map +1 -0
  133. package/package.json +74 -0
  134. package/scripts/postinstall.mjs +56 -0
@@ -0,0 +1,179 @@
1
+ import path from "node:path";
2
+ import { promises as fs } from "node:fs";
3
+ import { isCode } from "./walker.js";
4
+ import { parseFile } from "./parse.js";
5
+ export async function buildBundle(group, root) {
6
+ const parsedFiles = [];
7
+ for (const f of group.files) {
8
+ if (!isCode(f))
9
+ continue;
10
+ const p = await parseFile(f);
11
+ if (p)
12
+ parsedFiles.push(p);
13
+ }
14
+ const readme = await loadReadme(group, root);
15
+ const fileTree = renderTree(group.files);
16
+ const { external, internal } = classifyImports(parsedFiles, group.rel, root);
17
+ return {
18
+ rel: group.rel,
19
+ fileTree,
20
+ readme,
21
+ parsedFiles,
22
+ externalDeps: external,
23
+ internalImports: internal,
24
+ usedBy: [],
25
+ };
26
+ }
27
+ async function loadReadme(group, root) {
28
+ const readmeNames = ["README.md", "readme.md", "README.MD"];
29
+ for (const f of group.files) {
30
+ if (readmeNames.includes(path.basename(f.rel))) {
31
+ try {
32
+ const txt = await fs.readFile(f.abs, "utf8");
33
+ return txt.slice(0, 3000);
34
+ }
35
+ catch { /* fall through */ }
36
+ }
37
+ }
38
+ return undefined;
39
+ }
40
+ function renderTree(files) {
41
+ const sorted = [...files].sort((a, b) => a.rel.localeCompare(b.rel));
42
+ return sorted
43
+ .map(f => ` ${path.basename(f.rel)} (${humanSize(f.size)})`)
44
+ .join("\n");
45
+ }
46
+ function humanSize(bytes) {
47
+ if (bytes < 1024)
48
+ return `${bytes}B`;
49
+ if (bytes < 1024 * 1024)
50
+ return `${(bytes / 1024).toFixed(1)}KB`;
51
+ return `${(bytes / 1024 / 1024).toFixed(1)}MB`;
52
+ }
53
+ /** Split imports into external (npm/pypi bare specifiers) vs internal (relative). */
54
+ function classifyImports(files, dirRel, root) {
55
+ const external = new Set();
56
+ const internal = new Set();
57
+ for (const pf of files) {
58
+ for (const spec of pf.imports) {
59
+ if (isRelative(spec)) {
60
+ const resolved = resolveRelative(pf.rel, spec);
61
+ // Strip filename → keep the dir.
62
+ const targetDir = path.dirname(resolved).split(path.sep).join("/");
63
+ if (targetDir && targetDir !== dirRel)
64
+ internal.add(targetDir);
65
+ }
66
+ else {
67
+ external.add(spec);
68
+ }
69
+ }
70
+ }
71
+ return {
72
+ external: [...external].sort(),
73
+ internal: [...internal].sort(),
74
+ };
75
+ }
76
+ function isRelative(spec) {
77
+ return spec.startsWith(".") || spec.startsWith("/");
78
+ }
79
+ function resolveRelative(fromFileRel, spec) {
80
+ const fromDir = path.dirname(fromFileRel);
81
+ return path.normalize(path.join(fromDir, spec)).split(path.sep).join("/");
82
+ }
83
+ /**
84
+ * After all bundles are built, populate `usedBy` on each by inverting the
85
+ * `internalImports` maps. This is the magic that gives the LLM ground-truth
86
+ * "Used by" instead of forcing it to guess.
87
+ */
88
+ export function invertUsedBy(bundles) {
89
+ const usedBy = new Map();
90
+ for (const b of bundles) {
91
+ for (const target of b.internalImports) {
92
+ // We may not have a bundle for the exact target dir (e.g. import resolves
93
+ // to a parent dir). Walk up until we find one that we DO have.
94
+ const match = findOwningBundle(target, bundles);
95
+ if (!match || match.rel === b.rel)
96
+ continue;
97
+ if (!usedBy.has(match.rel))
98
+ usedBy.set(match.rel, new Set());
99
+ usedBy.get(match.rel).add(b.rel);
100
+ }
101
+ }
102
+ for (const b of bundles) {
103
+ b.usedBy = [...(usedBy.get(b.rel) ?? [])].sort();
104
+ }
105
+ }
106
+ function findOwningBundle(target, bundles) {
107
+ // Exact match first.
108
+ let direct = bundles.find(b => b.rel === target);
109
+ if (direct)
110
+ return direct;
111
+ // Walk up.
112
+ let cur = target;
113
+ while (cur && cur !== "." && cur !== "") {
114
+ cur = path.dirname(cur).split(path.sep).join("/");
115
+ if (cur === ".")
116
+ break;
117
+ direct = bundles.find(b => b.rel === cur);
118
+ if (direct)
119
+ return direct;
120
+ }
121
+ return null;
122
+ }
123
+ /**
124
+ * Render a bundle to the prompt-ready text the summarizer LLM will see.
125
+ * This is the contract that defines summary quality — keep it tight.
126
+ */
127
+ export function renderBundleForPrompt(b, opts = {}) {
128
+ const maxChars = opts.maxChars ?? 24_000;
129
+ const parts = [];
130
+ parts.push(`# Directory: ${b.rel}`);
131
+ parts.push("");
132
+ parts.push("## File tree");
133
+ parts.push(b.fileTree || "(empty)");
134
+ parts.push("");
135
+ if (b.readme) {
136
+ parts.push("## README excerpt");
137
+ parts.push(b.readme);
138
+ parts.push("");
139
+ }
140
+ if (b.parsedFiles.length > 0) {
141
+ parts.push("## Parsed code surface");
142
+ for (const pf of b.parsedFiles) {
143
+ parts.push(`### ${pf.rel}`);
144
+ if (pf.topComment) {
145
+ parts.push("**Top-of-file comment / docstring:**");
146
+ parts.push(pf.topComment);
147
+ }
148
+ if (pf.exports.length > 0) {
149
+ parts.push("**Exported symbols:**");
150
+ for (const e of pf.exports.slice(0, 25)) {
151
+ const sig = e.signature ? ` ${e.signature}` : "";
152
+ parts.push(` - ${e.kind} \`${e.name}\`${sig}`);
153
+ }
154
+ }
155
+ parts.push("");
156
+ }
157
+ }
158
+ if (b.internalImports.length > 0) {
159
+ parts.push("## Imports from sibling dirs (resolved)");
160
+ parts.push(b.internalImports.map(d => ` - ${d}`).join("\n"));
161
+ parts.push("");
162
+ }
163
+ if (b.externalDeps.length > 0) {
164
+ parts.push("## External dependencies (npm / pypi)");
165
+ parts.push(b.externalDeps.slice(0, 40).map(d => ` - ${d}`).join("\n"));
166
+ parts.push("");
167
+ }
168
+ if (b.usedBy.length > 0) {
169
+ parts.push("## This directory is imported by (computed across the repo)");
170
+ parts.push(b.usedBy.map(d => ` - ${d}`).join("\n"));
171
+ parts.push("");
172
+ }
173
+ let out = parts.join("\n");
174
+ if (out.length > maxChars) {
175
+ out = out.slice(0, maxChars) + "\n\n[...truncated]";
176
+ }
177
+ return out;
178
+ }
179
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/cli/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAsB,MAAM,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAc,SAAS,EAAE,MAAM,YAAY,CAAC;AAYnD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAe,EACf,IAAY;IAEZ,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,SAAS;QACzB,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAE7E,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,QAAQ;QACR,MAAM;QACN,WAAW;QACX,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,QAAQ;QACzB,MAAM,EAAE,EAAE;KACX,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAAe,EAAE,IAAY;IACrD,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC7C,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB;IACnC,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SAC7D,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,qFAAqF;AACrF,SAAS,eAAe,CACtB,KAAmB,EACnB,MAAc,EACd,IAAY;IAEZ,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC/C,iCAAiC;gBACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnE,IAAI,SAAS,IAAI,SAAS,KAAK,MAAM;oBAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE;QAC9B,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,eAAe,CAAC,WAAmB,EAAE,IAAY;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAoB;IAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;YACvC,0EAA0E;YAC1E,+DAA+D;YAC/D,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG;gBAAE,SAAS;YAC5C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAC7D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc,EAAE,OAAoB;IAC5D,qBAAqB;IACrB,IAAI,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;IACjD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,WAAW;IACX,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACxC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,GAAG,KAAK,GAAG;YAAE,MAAM;QACvB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAC1C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,CAAY,EAAE,OAA8B,EAAE;IAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5B,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;gBACnD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBACpC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACxC,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC1B,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,oBAAoB,CAAC;IACtD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface CacheEntry {
2
+ bundleHash: string;
3
+ summary: string;
4
+ ingestedAt?: string;
5
+ sessionId?: string;
6
+ }
7
+ export declare class SummaryCache {
8
+ private dir;
9
+ private map;
10
+ private file;
11
+ constructor(rootDir: string);
12
+ load(): Promise<void>;
13
+ save(): Promise<void>;
14
+ hashBundle(bundleText: string): string;
15
+ get(dirRel: string): CacheEntry | undefined;
16
+ set(dirRel: string, entry: CacheEntry): void;
17
+ hasFresh(dirRel: string, bundleHash: string): boolean;
18
+ }
@@ -0,0 +1,39 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import crypto from "node:crypto";
4
+ export class SummaryCache {
5
+ dir;
6
+ map = {};
7
+ file;
8
+ constructor(rootDir) {
9
+ this.dir = path.join(rootDir, ".ricord-cache");
10
+ this.file = path.join(this.dir, "summaries.json");
11
+ }
12
+ async load() {
13
+ try {
14
+ const txt = await fs.readFile(this.file, "utf8");
15
+ this.map = JSON.parse(txt);
16
+ }
17
+ catch {
18
+ this.map = {};
19
+ }
20
+ }
21
+ async save() {
22
+ await fs.mkdir(this.dir, { recursive: true });
23
+ await fs.writeFile(this.file, JSON.stringify(this.map, null, 2), "utf8");
24
+ }
25
+ hashBundle(bundleText) {
26
+ return crypto.createHash("sha256").update(bundleText).digest("hex").slice(0, 16);
27
+ }
28
+ get(dirRel) {
29
+ return this.map[dirRel];
30
+ }
31
+ set(dirRel, entry) {
32
+ this.map[dirRel] = entry;
33
+ }
34
+ hasFresh(dirRel, bundleHash) {
35
+ const e = this.map[dirRel];
36
+ return !!e && e.bundleHash === bundleHash && !!e.summary;
37
+ }
38
+ }
39
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cli/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AASjC,MAAM,OAAO,YAAY;IACf,GAAG,CAAS;IACZ,GAAG,GAA+B,EAAE,CAAC;IACrC,IAAI,CAAS;IAErB,YAAY,OAAe;QACzB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,UAAU,CAAC,UAAkB;QAC3B,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,MAAc,EAAE,KAAiB;QACnC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,QAAQ,CAAC,MAAc,EAAE,UAAkB;QACzC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3D,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `ricord` CLI — unified entry for wiki authoring + MCP setup + auth.
4
+ *
5
+ * Wiki authoring (local-first):
6
+ * build, push, pull, sync, watch, curate, ingest, rollup, doctor
7
+ * Workspace setup is auto-handled by `ricord build` on first run; pass
8
+ * `--project <id>` or `--team <uuid>` to override.
9
+ *
10
+ * Conversation compiler (legacy ingest path): `ricord compile`
11
+ * Scans ~/.claude/projects/*.jsonl and ingests turns into the
12
+ * knowledge graph. Was `ricord init` in ricord-mcp <= 1.6.x — renamed
13
+ * because `init` now means workspace binding (handled by build).
14
+ *
15
+ * Auth + MCP config: login, logout, whoami, install, install-commands,
16
+ * uninstall — these delegate to the ricord-mcp server binary.
17
+ *
18
+ * Daemon: `ricord daemon install` / `ricord daemon uninstall` manages
19
+ * the optional macOS launchd auto-sync agent.
20
+ */
21
+ export {};
@@ -0,0 +1,355 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `ricord` CLI — unified entry for wiki authoring + MCP setup + auth.
4
+ *
5
+ * Wiki authoring (local-first):
6
+ * build, push, pull, sync, watch, curate, ingest, rollup, doctor
7
+ * Workspace setup is auto-handled by `ricord build` on first run; pass
8
+ * `--project <id>` or `--team <uuid>` to override.
9
+ *
10
+ * Conversation compiler (legacy ingest path): `ricord compile`
11
+ * Scans ~/.claude/projects/*.jsonl and ingests turns into the
12
+ * knowledge graph. Was `ricord init` in ricord-mcp <= 1.6.x — renamed
13
+ * because `init` now means workspace binding (handled by build).
14
+ *
15
+ * Auth + MCP config: login, logout, whoami, install, install-commands,
16
+ * uninstall — these delegate to the ricord-mcp server binary.
17
+ *
18
+ * Daemon: `ricord daemon install` / `ricord daemon uninstall` manages
19
+ * the optional macOS launchd auto-sync agent.
20
+ */
21
+ import path from "node:path";
22
+ import fs from "node:fs";
23
+ import os from "node:os";
24
+ import process from "node:process";
25
+ import { spawnSync } from "node:child_process";
26
+ import kleur from "kleur";
27
+ import { runExplore } from "./run-explore.js";
28
+ import { resolveToken, resolveApiBase, loadCredentials, maskKey } from "./auth.js";
29
+ import { runUninstall } from "./uninstall.js";
30
+ import { buildCommand } from "./commands/build.js";
31
+ import { ingestCommand } from "./commands/ingest.js";
32
+ import { syncCommand } from "./commands/sync.js";
33
+ import { pullCommand } from "./commands/pull.js";
34
+ import { pushCommand } from "./commands/push.js";
35
+ import { curateCommand } from "./commands/curate.js";
36
+ import { installCommand as daemonCommand } from "./commands/install.js";
37
+ import { rollupCommand } from "./commands/rollup.js";
38
+ import { watchCommand } from "./commands/watch.js";
39
+ import { doctorCommand } from "./commands/doctor.js";
40
+ function parseArgs(argv) {
41
+ const positional = [];
42
+ const flags = {};
43
+ for (let i = 0; i < argv.length; i++) {
44
+ const a = argv[i];
45
+ if (a.startsWith("--")) {
46
+ const eq = a.indexOf("=");
47
+ if (eq >= 0) {
48
+ flags[a.slice(2, eq)] = a.slice(eq + 1);
49
+ }
50
+ else {
51
+ const next = argv[i + 1];
52
+ if (next !== undefined && !next.startsWith("--")) {
53
+ flags[a.slice(2)] = next;
54
+ i++;
55
+ }
56
+ else {
57
+ flags[a.slice(2)] = true;
58
+ }
59
+ }
60
+ }
61
+ else {
62
+ positional.push(a);
63
+ }
64
+ }
65
+ return { positional, flags };
66
+ }
67
+ function stringFlag(flags, k) {
68
+ const v = flags[k];
69
+ return typeof v === "string" ? v : undefined;
70
+ }
71
+ function help() {
72
+ console.log(`${kleur.bold("ricord")} — knowledge wiki, auto-organized.
73
+
74
+ usage:
75
+ ricord <command> [options]
76
+
77
+ wiki authoring (local-first):
78
+ build [--project <id>] Spawn claude as an agent to walk the repo and
79
+ [--team <uuid>] write .ricord/pages/<slug>.md. Auto-inits the
80
+ [--push] workspace on first run (derives project_id from
81
+ [--max-turns N] git remote). --push also syncs to the cloud
82
+ [--safe] [--dry-run] mirror. --safe drops Bash from the toolset.
83
+ push [--from .ricord/pages/] Sync local markdown edits to the cloud.
84
+ [--all] --all re-pushes everything; default is diff-only.
85
+ pull [--out .ricord/pages/] Materialize cloud pages locally.
86
+ [--merge] [--force]
87
+ sync Incremental sync since last_synced_at.
88
+ watch [--from .ricord/pages/] Auto-push on save.
89
+ curate [--apply] [--local] Suggest moves/merges/archives.
90
+ ingest [--mode initial|sync] Walk repo + POST to /v1/ingest/repo.
91
+ [--paths a,b]
92
+ rollup [--limit N] Drain stub backlog → local .ricord/pages/*.md.
93
+ [--min-sources N]
94
+ doctor Readiness check (api key, project, llm, cloud).
95
+
96
+ conversation compiler (Claude Code memory ingest):
97
+ compile [--dry-run] [--limit N] Scan ~/.claude/projects/*.jsonl and ingest
98
+ [--no-ingest] turns into the knowledge graph. (Was \`ricord init\`
99
+ [--llm-model <m>] in ricord-mcp 1.6.x.) Extraction is client-side —
100
+ set OPENAI_API_KEY or ANTHROPIC_API_KEY in env.
101
+
102
+ auth + MCP server:
103
+ login Browser OAuth, saves credentials to
104
+ ~/.ricord/credentials.json (shared with MCP).
105
+ logout Remove saved credentials.
106
+ whoami Show the currently logged-in identity.
107
+ install <client> Configure Claude Code / Cursor / Windsurf /
108
+ VS Code MCP entry. Omit <client> to auto-detect.
109
+ install-commands Install /ricord-* slash commands into
110
+ ~/.claude/commands/.
111
+ uninstall Remove ricord from this system (MCP config,
112
+ hooks, slash commands, global install).
113
+
114
+ daemon (optional, macOS):
115
+ daemon install Install the launchd auto-sync agent
116
+ (ai.ricord.sync).
117
+ daemon uninstall Remove it.
118
+
119
+ global flags:
120
+ --project <id> Project to operate on (or auto-derived).
121
+ --team <team-uuid> Bind to a team space (every team member with
122
+ role >= member can read + edit).
123
+ --no-team Force personal scope on this run.
124
+ --dry-run Print intended actions, don't call the API.
125
+
126
+ docs: https://ricord.ai/docs
127
+ `);
128
+ }
129
+ /** Delegate auth + MCP-setup subcommands to the existing ricord-mcp binary,
130
+ * which owns the OAuth flow and the per-client MCP config writers. */
131
+ function delegateToMcp(subcmd, passthrough) {
132
+ const fallback = path.resolve(new URL(".", import.meta.url).pathname, "..", "index.js");
133
+ const candidates = ["ricord-mcp", process.execPath];
134
+ for (const cmd of candidates) {
135
+ const args = cmd === process.execPath
136
+ ? [fallback, subcmd, ...passthrough]
137
+ : [subcmd, ...passthrough];
138
+ const r = spawnSync(cmd, args, { stdio: "inherit" });
139
+ if (r.error && r.error.code === "ENOENT")
140
+ continue;
141
+ return r.status ?? 1;
142
+ }
143
+ console.error(`Could not locate ricord-mcp to handle '${subcmd}'.`);
144
+ return 127;
145
+ }
146
+ /** Copy bundled slash command markdown files to ~/.claude/commands/ so the
147
+ * Claude Code host picks them up. Idempotent — safe to re-run after upgrades. */
148
+ function installSlashCommands() {
149
+ const here = path.resolve(new URL(".", import.meta.url).pathname);
150
+ const candidates = [
151
+ path.resolve(here, "..", "..", "commands"),
152
+ path.resolve(here, "..", "commands"),
153
+ ];
154
+ const sourceDir = candidates.find(p => fs.existsSync(p));
155
+ if (!sourceDir) {
156
+ console.error(`ERROR: bundled commands/ dir not found. Looked in: ${candidates.join(", ")}`);
157
+ return 2;
158
+ }
159
+ const targetDir = path.join(os.homedir(), ".claude", "commands");
160
+ fs.mkdirSync(targetDir, { recursive: true });
161
+ const files = fs.readdirSync(sourceDir).filter(f => f.endsWith(".md"));
162
+ if (files.length === 0) {
163
+ console.error(`ERROR: no .md files in ${sourceDir}`);
164
+ return 2;
165
+ }
166
+ console.log(`▸ ricord install-commands`);
167
+ console.log(` source: ${sourceDir}`);
168
+ console.log(` target: ${targetDir}\n`);
169
+ let installed = 0;
170
+ let updated = 0;
171
+ for (const f of files) {
172
+ const src = path.join(sourceDir, f);
173
+ const dst = path.join(targetDir, f);
174
+ const newContent = fs.readFileSync(src, "utf8");
175
+ const existed = fs.existsSync(dst);
176
+ if (existed) {
177
+ const oldContent = fs.readFileSync(dst, "utf8");
178
+ if (oldContent === newContent) {
179
+ console.log(` ✓ ${f} (already up to date)`);
180
+ continue;
181
+ }
182
+ updated++;
183
+ }
184
+ else {
185
+ installed++;
186
+ }
187
+ fs.writeFileSync(dst, newContent, "utf8");
188
+ console.log(` ${existed ? "↻" : "+"} ${f}`);
189
+ }
190
+ console.log(`\nDone. ${installed} installed, ${updated} updated, ${files.length - installed - updated} unchanged.`);
191
+ console.log(`Restart Claude Code to pick up new commands.`);
192
+ return 0;
193
+ }
194
+ async function runCompile(positional, flags) {
195
+ const root = path.resolve(stringFlag(flags, "root") ?? process.cwd());
196
+ const apiBase = resolveApiBase(stringFlag(flags, "api"));
197
+ let token = resolveToken(stringFlag(flags, "token"));
198
+ const dryRun = flags["dry-run"] === true;
199
+ const noIngest = flags["no-ingest"] === true;
200
+ if (!token && !dryRun && !noIngest) {
201
+ const creds = loadCredentials();
202
+ if (creds) {
203
+ token = creds.api_key;
204
+ }
205
+ else {
206
+ console.error("ERROR: not logged in. Run 'ricord login' first, or pass --token.");
207
+ return 2;
208
+ }
209
+ }
210
+ console.log(`▸ ricord compile`);
211
+ console.log(` root: ${root}`);
212
+ console.log(` api: ${apiBase}`);
213
+ console.log(` auth: ${token ? maskKey(token) : "(none — dry-run only)"}`);
214
+ console.log(` dry-run: ${dryRun}`);
215
+ console.log(` no-ingest: ${noIngest}\n`);
216
+ const limitFlag = stringFlag(flags, "limit");
217
+ const result = await runExplore({
218
+ root,
219
+ apiBase,
220
+ ricordToken: token,
221
+ dryRun,
222
+ noIngest,
223
+ summariesDir: stringFlag(flags, "summaries-dir") ?? path.join(root, ".ricord-cache", "summaries"),
224
+ limit: limitFlag ? Number(limitFlag) : undefined,
225
+ emitBundles: flags["emit-bundles"] === true,
226
+ llmModel: stringFlag(flags, "llm-model"),
227
+ llmKey: stringFlag(flags, "llm-key"),
228
+ }, (line) => console.log(line));
229
+ return result.ok ? 0 : 2;
230
+ }
231
+ async function main(argv) {
232
+ const { positional, flags } = parseArgs(argv);
233
+ const cmd = positional[0];
234
+ const repoRoot = process.cwd();
235
+ const projectId = stringFlag(flags, "project");
236
+ const teamId = stringFlag(flags, "team");
237
+ const noTeam = flags["no-team"] === true;
238
+ const passthrough = argv.slice(1);
239
+ switch (cmd) {
240
+ case undefined:
241
+ case "help":
242
+ case "--help":
243
+ case "-h":
244
+ help();
245
+ return 0;
246
+ // ── wiki authoring ──────────────────────────────────────────────
247
+ case "build":
248
+ return buildCommand({
249
+ repoRoot,
250
+ projectId,
251
+ teamId,
252
+ noTeam,
253
+ dryRun: flags["dry-run"] === true,
254
+ safe: flags.safe === true,
255
+ maxTurns: Number(stringFlag(flags, "max-turns") ?? "200") || 200,
256
+ push: flags.push === true,
257
+ });
258
+ case "push":
259
+ return pushCommand({
260
+ repoRoot,
261
+ from: stringFlag(flags, "from") ?? ".ricord/pages",
262
+ all: flags.all === true,
263
+ projectId,
264
+ teamId,
265
+ noTeam,
266
+ dryRun: flags["dry-run"] === true,
267
+ });
268
+ case "pull":
269
+ return pullCommand({
270
+ repoRoot,
271
+ out: stringFlag(flags, "out") ?? ".ricord/pages",
272
+ projectId,
273
+ force: flags.force === true,
274
+ merge: flags.merge === true,
275
+ });
276
+ case "sync":
277
+ return syncCommand({ repoRoot, projectId });
278
+ case "watch":
279
+ return watchCommand({
280
+ repoRoot,
281
+ from: stringFlag(flags, "from") ?? ".ricord/pages",
282
+ projectId,
283
+ });
284
+ case "curate":
285
+ return curateCommand({
286
+ repoRoot,
287
+ projectId,
288
+ apply: flags.apply === true,
289
+ prepare: flags.prepare === true,
290
+ local: flags.local === true,
291
+ staleDays: Number(stringFlag(flags, "stale-days") ?? "90") || 90,
292
+ });
293
+ case "ingest": {
294
+ const mode = (stringFlag(flags, "mode") ?? "initial");
295
+ const paths = stringFlag(flags, "paths")?.split(",").map(s => s.trim()).filter(Boolean);
296
+ return ingestCommand({
297
+ repoRoot,
298
+ projectId,
299
+ mode,
300
+ paths,
301
+ prepare: flags.prepare === true,
302
+ dryRun: flags["dry-run"] === true,
303
+ });
304
+ }
305
+ case "rollup":
306
+ return rollupCommand({
307
+ repoRoot,
308
+ limit: Number(stringFlag(flags, "limit") ?? "20") || 20,
309
+ minSources: Number(stringFlag(flags, "min-sources") ?? "2") || 2,
310
+ push: flags.push === true,
311
+ });
312
+ case "doctor":
313
+ return doctorCommand({ repoRoot });
314
+ // ── conversation compiler (legacy) ──────────────────────────────
315
+ case "compile":
316
+ return runCompile(positional, flags);
317
+ // ── auth + MCP setup (delegated to ricord-mcp bin) ──────────────
318
+ case "login":
319
+ case "logout":
320
+ case "whoami":
321
+ case "install":
322
+ return delegateToMcp(cmd, passthrough);
323
+ case "install-commands":
324
+ return installSlashCommands();
325
+ case "uninstall":
326
+ return runUninstall({ root: repoRoot, dryRun: flags["dry-run"] === true });
327
+ // ── daemon (macOS launchd) ──────────────────────────────────────
328
+ case "daemon": {
329
+ const sub = positional[1] ?? "status";
330
+ if (sub === "install")
331
+ return daemonCommand({ uninstall: false });
332
+ if (sub === "uninstall")
333
+ return daemonCommand({ uninstall: true });
334
+ if (sub === "status") {
335
+ const r = spawnSync("launchctl", ["list", "ai.ricord.sync"], { encoding: "utf8" });
336
+ if (r.status === 0) {
337
+ console.log(kleur.green("✓ ai.ricord.sync loaded"));
338
+ console.log(kleur.dim(r.stdout.trim()));
339
+ }
340
+ else {
341
+ console.log(kleur.yellow("✗ ai.ricord.sync not loaded — run `ricord daemon install`"));
342
+ }
343
+ return 0;
344
+ }
345
+ console.error(kleur.red(`unknown subcommand: daemon ${sub}`));
346
+ return 2;
347
+ }
348
+ default:
349
+ console.error(kleur.red(`unknown command: ${cmd}`));
350
+ help();
351
+ return 2;
352
+ }
353
+ }
354
+ main(process.argv.slice(2)).then(code => process.exit(code), err => { console.error(err); process.exit(1); });
355
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Thin HTTP client for the Ricord API. Sends the API key as a Bearer
3
+ * token. The CLI doesn't ship Firebase auth — keys are the surface.
4
+ *
5
+ * `request` throws on non-2xx with a structured error message.
6
+ */
7
+ import type { ResolvedAuth } from "./config.js";
8
+ export interface ApiError extends Error {
9
+ status: number;
10
+ body: unknown;
11
+ }
12
+ export declare function request<T = unknown>(auth: ResolvedAuth, path: string, init?: RequestInit): Promise<T>;