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.
- package/LICENSE +21 -0
- package/README.md +213 -0
- package/commands/ricord-flush.md +29 -0
- package/commands/ricord-init.md +129 -0
- package/commands/ricord-lint.md +64 -0
- package/commands/ricord-query.md +71 -0
- package/dist/cli/auth.d.ts +16 -0
- package/dist/cli/auth.js +42 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/bundle.d.ts +25 -0
- package/dist/cli/bundle.js +179 -0
- package/dist/cli/bundle.js.map +1 -0
- package/dist/cli/cache.d.ts +18 -0
- package/dist/cli/cache.js +39 -0
- package/dist/cli/cache.js.map +1 -0
- package/dist/cli/cli.d.ts +21 -0
- package/dist/cli/cli.js +355 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/client.d.ts +12 -0
- package/dist/cli/client.js +35 -0
- package/dist/cli/client.js.map +1 -0
- package/dist/cli/commands/build.d.ts +44 -0
- package/dist/cli/commands/build.js +437 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/curate.d.ts +32 -0
- package/dist/cli/commands/curate.js +154 -0
- package/dist/cli/commands/curate.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +16 -0
- package/dist/cli/commands/doctor.js +92 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/ingest.d.ts +25 -0
- package/dist/cli/commands/ingest.js +121 -0
- package/dist/cli/commands/ingest.js.map +1 -0
- package/dist/cli/commands/install.d.ts +16 -0
- package/dist/cli/commands/install.js +82 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/pull.d.ts +24 -0
- package/dist/cli/commands/pull.js +104 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/push.d.ts +28 -0
- package/dist/cli/commands/push.js +164 -0
- package/dist/cli/commands/push.js.map +1 -0
- package/dist/cli/commands/rollup.d.ts +21 -0
- package/dist/cli/commands/rollup.js +118 -0
- package/dist/cli/commands/rollup.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +7 -0
- package/dist/cli/commands/setup.js +43 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +15 -0
- package/dist/cli/commands/sync.js +63 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +17 -0
- package/dist/cli/commands/watch.js +87 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/config.d.ts +29 -0
- package/dist/cli/config.js +52 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/extract.d.ts +101 -0
- package/dist/cli/extract.js +216 -0
- package/dist/cli/extract.js.map +1 -0
- package/dist/cli/ingest.d.ts +48 -0
- package/dist/cli/ingest.js +74 -0
- package/dist/cli/ingest.js.map +1 -0
- package/dist/cli/ledger.d.ts +44 -0
- package/dist/cli/ledger.js +67 -0
- package/dist/cli/ledger.js.map +1 -0
- package/dist/cli/llm.d.ts +21 -0
- package/dist/cli/llm.js +138 -0
- package/dist/cli/llm.js.map +1 -0
- package/dist/cli/parse.d.ts +13 -0
- package/dist/cli/parse.js +188 -0
- package/dist/cli/parse.js.map +1 -0
- package/dist/cli/run-explore.d.ts +56 -0
- package/dist/cli/run-explore.js +229 -0
- package/dist/cli/run-explore.js.map +1 -0
- package/dist/cli/summarize.d.ts +15 -0
- package/dist/cli/summarize.js +49 -0
- package/dist/cli/summarize.js.map +1 -0
- package/dist/cli/uninstall.d.ts +6 -0
- package/dist/cli/uninstall.js +277 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/walk.d.ts +13 -0
- package/dist/cli/walk.js +62 -0
- package/dist/cli/walk.js.map +1 -0
- package/dist/cli/walker.d.ts +14 -0
- package/dist/cli/walker.js +120 -0
- package/dist/cli/walker.js.map +1 -0
- package/dist/hooks/pre-compact.d.ts +15 -0
- package/dist/hooks/pre-compact.js +127 -0
- package/dist/hooks/pre-compact.js.map +1 -0
- package/dist/hooks/pre-tool-use.d.ts +15 -0
- package/dist/hooks/pre-tool-use.js +25 -0
- package/dist/hooks/pre-tool-use.js.map +1 -0
- package/dist/hooks/session-end.d.ts +21 -0
- package/dist/hooks/session-end.js +186 -0
- package/dist/hooks/session-end.js.map +1 -0
- package/dist/hooks/session-start.d.ts +15 -0
- package/dist/hooks/session-start.js +233 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/hooks/turn-end-post.d.ts +17 -0
- package/dist/hooks/turn-end-post.js +66 -0
- package/dist/hooks/turn-end-post.js.map +1 -0
- package/dist/hooks/turn-end.d.ts +29 -0
- package/dist/hooks/turn-end.js +295 -0
- package/dist/hooks/turn-end.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +1547 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +45 -0
- package/dist/init.js +839 -0
- package/dist/init.js.map +1 -0
- package/dist/lib/active-project.d.ts +14 -0
- package/dist/lib/active-project.js +65 -0
- package/dist/lib/active-project.js.map +1 -0
- package/dist/lib/buffer.d.ts +34 -0
- package/dist/lib/buffer.js +79 -0
- package/dist/lib/buffer.js.map +1 -0
- package/dist/scripts/compile.d.ts +25 -0
- package/dist/scripts/compile.js +185 -0
- package/dist/scripts/compile.js.map +1 -0
- package/dist/scripts/config.d.ts +30 -0
- package/dist/scripts/config.js +68 -0
- package/dist/scripts/config.js.map +1 -0
- package/dist/scripts/flush.d.ts +23 -0
- package/dist/scripts/flush.js +230 -0
- package/dist/scripts/flush.js.map +1 -0
- package/dist/scripts/lint.d.ts +21 -0
- package/dist/scripts/lint.js +242 -0
- package/dist/scripts/lint.js.map +1 -0
- package/dist/scripts/utils.d.ts +43 -0
- package/dist/scripts/utils.js +165 -0
- package/dist/scripts/utils.js.map +1 -0
- package/package.json +74 -0
- 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":"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"}
|
|
@@ -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 {};
|
package/dist/cli/cli.js
ADDED
|
@@ -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>;
|