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,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local ledger — per-project state the daemon and the manual sync flow
|
|
3
|
+
* both depend on. Lives at `<project>/.ricord/ledger.json`.
|
|
4
|
+
*
|
|
5
|
+
* Shape:
|
|
6
|
+
* {
|
|
7
|
+
* project_id: "abc-123",
|
|
8
|
+
* repo: { remote_url, branch?, head_sha? },
|
|
9
|
+
* transcripts: { [absPath]: { bytes_seen, last_seen_at } },
|
|
10
|
+
* last_synced_at: number
|
|
11
|
+
* }
|
|
12
|
+
*
|
|
13
|
+
* Mutations are atomic: write to a temp file then rename. The file is
|
|
14
|
+
* gitignored in `.ricord/.gitignore` so it never leaks into a repo.
|
|
15
|
+
*/
|
|
16
|
+
export interface RicordLedger {
|
|
17
|
+
project_id?: string;
|
|
18
|
+
/** Team-space binding (2026-05-23). When set, `ricord push` writes pages
|
|
19
|
+
* into the (team_id, project_id) team space — every team member with
|
|
20
|
+
* role >= member can read + edit them. When absent, push lands in the
|
|
21
|
+
* caller's personal scope (team_id IS NULL). Mirrors the git-remote
|
|
22
|
+
* model: one ledger declares one owner. */
|
|
23
|
+
team_id?: string;
|
|
24
|
+
repo?: {
|
|
25
|
+
remote_url?: string;
|
|
26
|
+
branch?: string;
|
|
27
|
+
head_sha?: string;
|
|
28
|
+
};
|
|
29
|
+
transcripts: Record<string, {
|
|
30
|
+
bytes_seen: number;
|
|
31
|
+
last_seen_at: number;
|
|
32
|
+
}>;
|
|
33
|
+
last_synced_at?: number;
|
|
34
|
+
/** Tick 25 — last successful `ricord push` (ms). Files with mtime
|
|
35
|
+
* greater than this are sent on the next push. */
|
|
36
|
+
last_pushed_at?: number;
|
|
37
|
+
/** Tick 28 — last `ricord pull` (ms). `--merge` compares local mtime
|
|
38
|
+
* against this to detect conflicting edits. */
|
|
39
|
+
last_pulled_at?: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function ledgerDir(repoRoot: string): string;
|
|
42
|
+
export declare function ledgerPath(repoRoot: string): string;
|
|
43
|
+
export declare function readLedger(repoRoot: string): Promise<RicordLedger>;
|
|
44
|
+
export declare function writeLedger(repoRoot: string, next: RicordLedger): Promise<void>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local ledger — per-project state the daemon and the manual sync flow
|
|
3
|
+
* both depend on. Lives at `<project>/.ricord/ledger.json`.
|
|
4
|
+
*
|
|
5
|
+
* Shape:
|
|
6
|
+
* {
|
|
7
|
+
* project_id: "abc-123",
|
|
8
|
+
* repo: { remote_url, branch?, head_sha? },
|
|
9
|
+
* transcripts: { [absPath]: { bytes_seen, last_seen_at } },
|
|
10
|
+
* last_synced_at: number
|
|
11
|
+
* }
|
|
12
|
+
*
|
|
13
|
+
* Mutations are atomic: write to a temp file then rename. The file is
|
|
14
|
+
* gitignored in `.ricord/.gitignore` so it never leaks into a repo.
|
|
15
|
+
*/
|
|
16
|
+
import { readFile, writeFile, mkdir, rename } from "node:fs/promises";
|
|
17
|
+
import { existsSync } from "node:fs";
|
|
18
|
+
import { join, resolve } from "node:path";
|
|
19
|
+
const DEFAULT_LEDGER = { transcripts: {} };
|
|
20
|
+
export function ledgerDir(repoRoot) {
|
|
21
|
+
return join(resolve(repoRoot), ".ricord");
|
|
22
|
+
}
|
|
23
|
+
export function ledgerPath(repoRoot) {
|
|
24
|
+
return join(ledgerDir(repoRoot), "ledger.json");
|
|
25
|
+
}
|
|
26
|
+
export async function readLedger(repoRoot) {
|
|
27
|
+
const p = ledgerPath(repoRoot);
|
|
28
|
+
if (!existsSync(p))
|
|
29
|
+
return { ...DEFAULT_LEDGER };
|
|
30
|
+
try {
|
|
31
|
+
const raw = await readFile(p, "utf8");
|
|
32
|
+
const parsed = JSON.parse(raw);
|
|
33
|
+
return { ...DEFAULT_LEDGER, ...parsed, transcripts: parsed.transcripts ?? {} };
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return { ...DEFAULT_LEDGER };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function writeLedger(repoRoot, next) {
|
|
40
|
+
const dir = ledgerDir(repoRoot);
|
|
41
|
+
await mkdir(dir, { recursive: true });
|
|
42
|
+
const path = ledgerPath(repoRoot);
|
|
43
|
+
const tmp = `${path}.tmp.${process.pid}`;
|
|
44
|
+
await writeFile(tmp, JSON.stringify(next, null, 2) + "\n", "utf8");
|
|
45
|
+
await rename(tmp, path);
|
|
46
|
+
// Local-first .gitignore (G11 pivot): only the ledger + tmp files are
|
|
47
|
+
// per-machine; pages/ stays git-tracked as source of truth. Force-update
|
|
48
|
+
// a pre-pivot `*` ignore so existing repos flip to the new layout.
|
|
49
|
+
const gi = join(dir, ".gitignore");
|
|
50
|
+
const desired = [
|
|
51
|
+
"# Ricord — local-first layout",
|
|
52
|
+
"# Pages are the source of truth and SHOULD be committed.",
|
|
53
|
+
"# Ledger is per-machine sync state and should NOT be.",
|
|
54
|
+
"ledger.json",
|
|
55
|
+
"ledger.json.tmp.*",
|
|
56
|
+
"",
|
|
57
|
+
].join("\n");
|
|
58
|
+
if (!existsSync(gi)) {
|
|
59
|
+
await writeFile(gi, desired, "utf8");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const cur = await readFile(gi, "utf8").catch(() => "");
|
|
63
|
+
if (cur.trim() === "*") {
|
|
64
|
+
await writeFile(gi, desired, "utf8");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/cli/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyB1C,MAAM,cAAc,GAAiB,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAEzD,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAC;QACxD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,IAAkB;IACpE,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACnE,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,sEAAsE;IACtE,yEAAyE;IACzE,mEAAmE;IACnE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG;QACd,+BAA+B;QAC/B,0DAA0D;QAC1D,uDAAuD;QACvD,aAAa;QACb,mBAAmB;QACnB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACpB,MAAM,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-LLM helper — local `claude` CLI ONLY.
|
|
3
|
+
*
|
|
4
|
+
* Why no Gemini/OpenAI fallback: the user took an $8K paid-API bill
|
|
5
|
+
* last month from a script that did this exact pattern. The Max
|
|
6
|
+
* subscription covers Claude Code at flat rate, so any heavy work
|
|
7
|
+
* (whole-repo authoring, batch rollup, large-context calls) MUST
|
|
8
|
+
* run through the local CLI. There is no fallback path that hits a
|
|
9
|
+
* paid API — if `claude` isn't installed, the CLI errors out and the
|
|
10
|
+
* user fixes their setup. We do not silently bill them.
|
|
11
|
+
*
|
|
12
|
+
* See `_pinned_top_never_paid_api_for_heavy_work` memory note.
|
|
13
|
+
*/
|
|
14
|
+
type JsonSchema = Record<string, unknown>;
|
|
15
|
+
/**
|
|
16
|
+
* The ONLY LLM path. No fallbacks — Gemini/OpenAI calls would cost
|
|
17
|
+
* money, the user runs Claude Max, so heavy work always goes through
|
|
18
|
+
* the local CLI.
|
|
19
|
+
*/
|
|
20
|
+
export declare function callHostLLM(prompt: string, schema: JsonSchema): Promise<unknown>;
|
|
21
|
+
export {};
|
package/dist/cli/llm.js
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-LLM helper — local `claude` CLI ONLY.
|
|
3
|
+
*
|
|
4
|
+
* Why no Gemini/OpenAI fallback: the user took an $8K paid-API bill
|
|
5
|
+
* last month from a script that did this exact pattern. The Max
|
|
6
|
+
* subscription covers Claude Code at flat rate, so any heavy work
|
|
7
|
+
* (whole-repo authoring, batch rollup, large-context calls) MUST
|
|
8
|
+
* run through the local CLI. There is no fallback path that hits a
|
|
9
|
+
* paid API — if `claude` isn't installed, the CLI errors out and the
|
|
10
|
+
* user fixes their setup. We do not silently bill them.
|
|
11
|
+
*
|
|
12
|
+
* See `_pinned_top_never_paid_api_for_heavy_work` memory note.
|
|
13
|
+
*/
|
|
14
|
+
import { spawn } from "node:child_process";
|
|
15
|
+
/**
|
|
16
|
+
* Spawn the local `claude` CLI and feed it the prompt on stdin. Auth
|
|
17
|
+
* is whatever the user has configured (Max subscription via OAuth).
|
|
18
|
+
*
|
|
19
|
+
* `--output-format json` wraps the response as
|
|
20
|
+
* { type: "result", result: "<llm-text>", ... }
|
|
21
|
+
* so we extract `.result` then JSON.parse to satisfy the schema.
|
|
22
|
+
*/
|
|
23
|
+
async function callClaudeCli(prompt, schema) {
|
|
24
|
+
return await new Promise((resolveOk, reject) => {
|
|
25
|
+
// The prompt itself instructs the model to reply with JSON only;
|
|
26
|
+
// we extract via regex so we don't need --json-schema (which puts
|
|
27
|
+
// the CLI into an agentic validate/retry loop). Empty allow-list
|
|
28
|
+
// forces chat-only behavior (no Write, no Bash) so we get a single
|
|
29
|
+
// text turn with the JSON inline. Observed: this returns a clean
|
|
30
|
+
// {"pages":[…]} in 1 turn vs num_turns=2 with empty result when
|
|
31
|
+
// schema validation is enabled.
|
|
32
|
+
void schema;
|
|
33
|
+
const args = [
|
|
34
|
+
"-p",
|
|
35
|
+
"--output-format", "json",
|
|
36
|
+
"--dangerously-skip-permissions",
|
|
37
|
+
"--allowedTools", "",
|
|
38
|
+
];
|
|
39
|
+
const child = spawn("claude", args, { stdio: ["pipe", "pipe", "pipe"] });
|
|
40
|
+
let stdout = "";
|
|
41
|
+
let stderr = "";
|
|
42
|
+
child.stdout.on("data", (b) => { stdout += b.toString("utf8"); });
|
|
43
|
+
child.stderr.on("data", (b) => { stderr += b.toString("utf8"); });
|
|
44
|
+
child.on("error", (e) => {
|
|
45
|
+
const err = new Error(`claude cli spawn failed: ${e.message}. ` +
|
|
46
|
+
`Install Claude Code (https://claude.com/claude-code) — this CLI does not bill paid APIs as a fallback.`);
|
|
47
|
+
err.status = -1;
|
|
48
|
+
reject(err);
|
|
49
|
+
});
|
|
50
|
+
child.on("close", (code) => {
|
|
51
|
+
if (code !== 0) {
|
|
52
|
+
const err = new Error(`claude → exit ${code}: ${(stderr || stdout).slice(0, 300)}`);
|
|
53
|
+
err.status = code ?? -1;
|
|
54
|
+
return reject(err);
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const wrapper = JSON.parse(stdout);
|
|
58
|
+
if (wrapper.is_error || wrapper.subtype !== "success") {
|
|
59
|
+
return reject(new Error(`claude returned error: ${stdout.slice(0, 300)}`));
|
|
60
|
+
}
|
|
61
|
+
const inner = wrapper.result ?? "";
|
|
62
|
+
// Claude in -p mode sometimes prepends a chatty preamble or wraps
|
|
63
|
+
// the JSON in ```json … ```. Extract the JSON object robustly:
|
|
64
|
+
// 1) fenced block first, 2) first balanced {...} otherwise.
|
|
65
|
+
const fenced = inner.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
66
|
+
const jsonText = fenced ? fenced[1] : extractJsonObject(inner);
|
|
67
|
+
if (!jsonText) {
|
|
68
|
+
return reject(new Error(`claude returned no JSON object. raw head=${inner.slice(0, 300)}`));
|
|
69
|
+
}
|
|
70
|
+
resolveOk(JSON.parse(jsonText.trim()));
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
reject(new Error(`claude output parse failed: ${e.message}; raw head=${stdout.slice(0, 200)}`));
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
child.stdin.write(prompt, "utf8");
|
|
77
|
+
child.stdin.end();
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** Extract the first balanced top-level JSON object from a string. The
|
|
81
|
+
* scanner walks character-by-character tracking string state + brace
|
|
82
|
+
* depth so trivial preamble like "Here is the JSON: {...}" round-trips
|
|
83
|
+
* cleanly. Returns null if no balanced object found. */
|
|
84
|
+
function extractJsonObject(s) {
|
|
85
|
+
const start = s.indexOf("{");
|
|
86
|
+
if (start === -1)
|
|
87
|
+
return null;
|
|
88
|
+
let depth = 0;
|
|
89
|
+
let inStr = false;
|
|
90
|
+
let escape = false;
|
|
91
|
+
for (let i = start; i < s.length; i++) {
|
|
92
|
+
const c = s[i];
|
|
93
|
+
if (escape) {
|
|
94
|
+
escape = false;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (c === "\\") {
|
|
98
|
+
escape = true;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (c === '"') {
|
|
102
|
+
inStr = !inStr;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (inStr)
|
|
106
|
+
continue;
|
|
107
|
+
if (c === "{")
|
|
108
|
+
depth++;
|
|
109
|
+
else if (c === "}") {
|
|
110
|
+
depth--;
|
|
111
|
+
if (depth === 0)
|
|
112
|
+
return s.slice(start, i + 1);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
/** Detect whether the `claude` CLI is on PATH. If not, fail loudly. */
|
|
118
|
+
async function haveClaudeCli() {
|
|
119
|
+
return await new Promise((res) => {
|
|
120
|
+
const c = spawn("claude", ["--version"], { stdio: "ignore" });
|
|
121
|
+
c.on("error", () => res(false));
|
|
122
|
+
c.on("close", (code) => res(code === 0));
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The ONLY LLM path. No fallbacks — Gemini/OpenAI calls would cost
|
|
127
|
+
* money, the user runs Claude Max, so heavy work always goes through
|
|
128
|
+
* the local CLI.
|
|
129
|
+
*/
|
|
130
|
+
export async function callHostLLM(prompt, schema) {
|
|
131
|
+
const haveClaude = await haveClaudeCli();
|
|
132
|
+
if (!haveClaude) {
|
|
133
|
+
throw new Error("ricord requires the local `claude` CLI (Claude Code). Install: https://claude.com/claude-code. " +
|
|
134
|
+
"No paid-API fallback by design — we don't bill you to fill a wiki.");
|
|
135
|
+
}
|
|
136
|
+
return callClaudeCli(prompt, schema);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/cli/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { RepoFile } from "./walker.js";
|
|
2
|
+
export interface ParsedFile {
|
|
3
|
+
rel: string;
|
|
4
|
+
imports: string[];
|
|
5
|
+
exports: ExportSym[];
|
|
6
|
+
topComment: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ExportSym {
|
|
9
|
+
name: string;
|
|
10
|
+
kind: "function" | "class" | "interface" | "type" | "const" | "var" | "let" | "enum" | "default" | "reexport";
|
|
11
|
+
signature?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function parseFile(file: RepoFile): Promise<ParsedFile | null>;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
const TS_EXTS = new Set([".ts", ".tsx", ".js", ".jsx"]);
|
|
3
|
+
let _ts = null;
|
|
4
|
+
async function getTs() {
|
|
5
|
+
if (_ts)
|
|
6
|
+
return _ts;
|
|
7
|
+
_ts = (await import("typescript")).default ?? (await import("typescript"));
|
|
8
|
+
return _ts;
|
|
9
|
+
}
|
|
10
|
+
export async function parseFile(file) {
|
|
11
|
+
if (TS_EXTS.has(file.ext))
|
|
12
|
+
return parseTs(file);
|
|
13
|
+
if (file.ext === ".py")
|
|
14
|
+
return parsePy(file);
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
async function parseTs(file) {
|
|
18
|
+
let src;
|
|
19
|
+
try {
|
|
20
|
+
src = await fs.readFile(file.abs, "utf8");
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const ts = await getTs();
|
|
26
|
+
const sf = ts.createSourceFile(file.rel, src, ts.ScriptTarget.Latest, true, file.ext === ".tsx" ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
|
|
27
|
+
const imports = [];
|
|
28
|
+
const exports = [];
|
|
29
|
+
const visit = (node) => {
|
|
30
|
+
if (ts.isImportDeclaration(node)) {
|
|
31
|
+
const spec = node.moduleSpecifier;
|
|
32
|
+
if (ts.isStringLiteral(spec))
|
|
33
|
+
imports.push(spec.text);
|
|
34
|
+
}
|
|
35
|
+
if (ts.isExportDeclaration(node) && node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier)) {
|
|
36
|
+
imports.push(node.moduleSpecifier.text);
|
|
37
|
+
}
|
|
38
|
+
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "require") {
|
|
39
|
+
const arg = node.arguments[0];
|
|
40
|
+
if (arg && ts.isStringLiteral(arg))
|
|
41
|
+
imports.push(arg.text);
|
|
42
|
+
}
|
|
43
|
+
if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword) {
|
|
44
|
+
const arg = node.arguments[0];
|
|
45
|
+
if (arg && ts.isStringLiteral(arg))
|
|
46
|
+
imports.push(arg.text);
|
|
47
|
+
}
|
|
48
|
+
const mods = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;
|
|
49
|
+
const isExport = !!mods?.some(m => m.kind === ts.SyntaxKind.ExportKeyword);
|
|
50
|
+
const isDefault = !!mods?.some(m => m.kind === ts.SyntaxKind.DefaultKeyword);
|
|
51
|
+
if (isExport) {
|
|
52
|
+
if (ts.isFunctionDeclaration(node) && node.name) {
|
|
53
|
+
exports.push({ name: node.name.text, kind: "function", signature: shortFnSig(ts, node) });
|
|
54
|
+
}
|
|
55
|
+
else if (ts.isClassDeclaration(node) && node.name) {
|
|
56
|
+
exports.push({ name: node.name.text, kind: "class", signature: shortClassSig(node) });
|
|
57
|
+
}
|
|
58
|
+
else if (ts.isInterfaceDeclaration(node)) {
|
|
59
|
+
exports.push({ name: node.name.text, kind: "interface" });
|
|
60
|
+
}
|
|
61
|
+
else if (ts.isTypeAliasDeclaration(node)) {
|
|
62
|
+
exports.push({ name: node.name.text, kind: "type" });
|
|
63
|
+
}
|
|
64
|
+
else if (ts.isEnumDeclaration(node)) {
|
|
65
|
+
exports.push({ name: node.name.text, kind: "enum" });
|
|
66
|
+
}
|
|
67
|
+
else if (ts.isVariableStatement(node)) {
|
|
68
|
+
const kw = node.declarationList.flags & ts.NodeFlags.Const ? "const"
|
|
69
|
+
: node.declarationList.flags & ts.NodeFlags.Let ? "let"
|
|
70
|
+
: "var";
|
|
71
|
+
for (const d of node.declarationList.declarations) {
|
|
72
|
+
if (ts.isIdentifier(d.name))
|
|
73
|
+
exports.push({ name: d.name.text, kind: kw });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (isDefault)
|
|
77
|
+
exports.push({ name: "default", kind: "default" });
|
|
78
|
+
}
|
|
79
|
+
if (ts.isExportDeclaration(node) && !node.moduleSpecifier && node.exportClause && ts.isNamedExports(node.exportClause)) {
|
|
80
|
+
for (const e of node.exportClause.elements)
|
|
81
|
+
exports.push({ name: e.name.text, kind: "reexport" });
|
|
82
|
+
}
|
|
83
|
+
ts.forEachChild(node, visit);
|
|
84
|
+
};
|
|
85
|
+
visit(sf);
|
|
86
|
+
return {
|
|
87
|
+
rel: file.rel,
|
|
88
|
+
imports: dedupe(imports),
|
|
89
|
+
exports: dedupeExports(exports),
|
|
90
|
+
topComment: extractTopComment(src),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function shortFnSig(ts, node) {
|
|
94
|
+
const params = node.parameters.map(p => p.getText()).join(", ");
|
|
95
|
+
const ret = node.type ? `: ${node.type.getText()}` : "";
|
|
96
|
+
return `(${params})${ret}`;
|
|
97
|
+
}
|
|
98
|
+
function shortClassSig(node) {
|
|
99
|
+
const heritage = node.heritageClauses?.map(h => h.getText()).join(" ") ?? "";
|
|
100
|
+
return heritage;
|
|
101
|
+
}
|
|
102
|
+
async function parsePy(file) {
|
|
103
|
+
let src;
|
|
104
|
+
try {
|
|
105
|
+
src = await fs.readFile(file.abs, "utf8");
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
const imports = [];
|
|
111
|
+
const exports = [];
|
|
112
|
+
for (const lineRaw of src.split("\n")) {
|
|
113
|
+
const line = lineRaw.trim();
|
|
114
|
+
if (!line || line.startsWith("#"))
|
|
115
|
+
continue;
|
|
116
|
+
let m;
|
|
117
|
+
if ((m = line.match(/^import\s+([\w.]+)/)))
|
|
118
|
+
imports.push(m[1]);
|
|
119
|
+
else if ((m = line.match(/^from\s+([\w.]+)\s+import/)))
|
|
120
|
+
imports.push(m[1]);
|
|
121
|
+
else if ((m = line.match(/^from\s+(\.+[\w.]*)\s+import/)))
|
|
122
|
+
imports.push(m[1]);
|
|
123
|
+
if (lineRaw.startsWith("def ") && (m = line.match(/^def\s+(\w+)\s*\(([^)]*)\)/))) {
|
|
124
|
+
if (!m[1].startsWith("_"))
|
|
125
|
+
exports.push({ name: m[1], kind: "function", signature: `(${m[2]})` });
|
|
126
|
+
}
|
|
127
|
+
else if (lineRaw.startsWith("class ") && (m = line.match(/^class\s+(\w+)(?:\(([^)]*)\))?/))) {
|
|
128
|
+
if (!m[1].startsWith("_"))
|
|
129
|
+
exports.push({ name: m[1], kind: "class", signature: m[2] ? `extends ${m[2]}` : "" });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
rel: file.rel,
|
|
134
|
+
imports: dedupe(imports),
|
|
135
|
+
exports: dedupeExports(exports),
|
|
136
|
+
topComment: extractTopComment(src),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function dedupe(arr) { return [...new Set(arr)]; }
|
|
140
|
+
function dedupeExports(arr) {
|
|
141
|
+
const seen = new Set();
|
|
142
|
+
return arr.filter(e => {
|
|
143
|
+
const k = `${e.kind}:${e.name}`;
|
|
144
|
+
if (seen.has(k))
|
|
145
|
+
return false;
|
|
146
|
+
seen.add(k);
|
|
147
|
+
return true;
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
function extractTopComment(src) {
|
|
151
|
+
const trimmed = src.trimStart();
|
|
152
|
+
if (trimmed.startsWith("/**") || trimmed.startsWith("/*")) {
|
|
153
|
+
const end = trimmed.indexOf("*/");
|
|
154
|
+
if (end > 0)
|
|
155
|
+
return cleanComment(trimmed.slice(0, end + 2));
|
|
156
|
+
}
|
|
157
|
+
if (trimmed.startsWith('"""') || trimmed.startsWith("'''")) {
|
|
158
|
+
const q = trimmed.slice(0, 3);
|
|
159
|
+
const end = trimmed.indexOf(q, 3);
|
|
160
|
+
if (end > 0)
|
|
161
|
+
return cleanComment(trimmed.slice(0, end + 3));
|
|
162
|
+
}
|
|
163
|
+
if (trimmed.startsWith("//") || trimmed.startsWith("#")) {
|
|
164
|
+
const lines = trimmed.split("\n");
|
|
165
|
+
const block = [];
|
|
166
|
+
for (const ln of lines) {
|
|
167
|
+
const t = ln.trim();
|
|
168
|
+
if (t.startsWith("//") || t.startsWith("#"))
|
|
169
|
+
block.push(t);
|
|
170
|
+
else
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
return cleanComment(block.join("\n"));
|
|
174
|
+
}
|
|
175
|
+
return "";
|
|
176
|
+
}
|
|
177
|
+
function cleanComment(s) {
|
|
178
|
+
return s
|
|
179
|
+
.replace(/^\s*\/\*\*?/g, "").replace(/\*\/\s*$/g, "")
|
|
180
|
+
.replace(/^\s*"""/g, "").replace(/"""\s*$/g, "")
|
|
181
|
+
.replace(/^\s*'''/g, "").replace(/'''\s*$/g, "")
|
|
182
|
+
.split("\n")
|
|
183
|
+
.map(l => l.replace(/^\s*[\*#/]+\s?/, "").trimEnd())
|
|
184
|
+
.filter(l => l.length > 0)
|
|
185
|
+
.join("\n")
|
|
186
|
+
.slice(0, 800);
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/cli/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export interface ExploreOpts {
|
|
2
|
+
root: string;
|
|
3
|
+
apiBase: string;
|
|
4
|
+
ricordToken?: string;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
noIngest?: boolean;
|
|
7
|
+
emitBundles?: boolean;
|
|
8
|
+
summariesDir?: string;
|
|
9
|
+
limit?: number;
|
|
10
|
+
llmModel?: string;
|
|
11
|
+
llmKey?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ExploreResult {
|
|
14
|
+
ok: boolean;
|
|
15
|
+
errorReason?: string;
|
|
16
|
+
root: string;
|
|
17
|
+
bundlesFound: number;
|
|
18
|
+
meaningful: number;
|
|
19
|
+
processed: number;
|
|
20
|
+
cached: number;
|
|
21
|
+
failed: number;
|
|
22
|
+
ingested: number;
|
|
23
|
+
totalChars: number;
|
|
24
|
+
totalExports: number;
|
|
25
|
+
totalImports: number;
|
|
26
|
+
totalAnchors: number;
|
|
27
|
+
totalConnections: number;
|
|
28
|
+
totalTasks: number;
|
|
29
|
+
topDirsByUsedBy: Array<{
|
|
30
|
+
rel: string;
|
|
31
|
+
usedByCount: number;
|
|
32
|
+
}>;
|
|
33
|
+
summariesDir: string;
|
|
34
|
+
usage?: {
|
|
35
|
+
tier: string;
|
|
36
|
+
memoriesUsed: number;
|
|
37
|
+
memoriesCap: number;
|
|
38
|
+
};
|
|
39
|
+
llm?: {
|
|
40
|
+
provider: string;
|
|
41
|
+
model: string;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export type Logger = (line: string) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Walk a repo, summarize each meaningful directory mechanically, run client-
|
|
47
|
+
* side LLM extraction, and POST structured anchors/connections/tasks to
|
|
48
|
+
* /v1/ingest/extracted. Powers `ricord init`.
|
|
49
|
+
*
|
|
50
|
+
* Post-2026-05-12 the server runs zero generative LLM calls — extraction
|
|
51
|
+
* happens here. The caller must provide an LLM key (OPENAI_API_KEY or
|
|
52
|
+
* ANTHROPIC_API_KEY by default, or --llm-key/--llm-model overrides).
|
|
53
|
+
*
|
|
54
|
+
* Progress is streamed via the `log` callback so the CLI can write to stdout.
|
|
55
|
+
*/
|
|
56
|
+
export declare function runExplore(opts: ExploreOpts, log: Logger): Promise<ExploreResult>;
|