@geohar/pi-cribsheet 0.10.1 → 0.12.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/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -4
- package/dist/index.js.map +1 -1
- package/dist/pi.d.ts +20 -0
- package/dist/pi.d.ts.map +1 -1
- package/dist/plan-source.d.ts +72 -0
- package/dist/plan-source.d.ts.map +1 -0
- package/dist/plan-source.js +160 -0
- package/dist/plan-source.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +21 -4
- package/src/pi.ts +52 -10
- package/src/plan-source.ts +213 -0
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAER,YAAY,EAIf,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAER,YAAY,EAIf,MAAM,SAAS,CAAA;AA8GhB,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA2JxD"}
|
package/dist/index.js
CHANGED
|
@@ -28,6 +28,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
28
28
|
import { homedir } from "node:os";
|
|
29
29
|
import { dirname, join } from "node:path";
|
|
30
30
|
import { fileURLToPath } from "node:url";
|
|
31
|
+
import { installCribPlanSource } from "./plan-source.js";
|
|
31
32
|
import { resolveSharedserver } from "./sharedserver-resolve.js";
|
|
32
33
|
const DEFAULT_PORT = 7732;
|
|
33
34
|
const DEFAULT_HOST = "127.0.0.1";
|
|
@@ -114,7 +115,10 @@ function detach() {
|
|
|
114
115
|
return;
|
|
115
116
|
const { binary, name } = attachment;
|
|
116
117
|
attachment = null;
|
|
117
|
-
spawnSync(binary, ["unuse", name, "--pid", String(process.pid)], {
|
|
118
|
+
spawnSync(binary, ["unuse", name, "--pid", String(process.pid)], {
|
|
119
|
+
stdio: "ignore",
|
|
120
|
+
env: process.env,
|
|
121
|
+
});
|
|
118
122
|
}
|
|
119
123
|
// ── the extension ──────────────────────────────────────────────────
|
|
120
124
|
export default function cribsheet(pi) {
|
|
@@ -176,10 +180,19 @@ export default function cribsheet(pi) {
|
|
|
176
180
|
"back, say so plainly rather than guessing.\n\n" +
|
|
177
181
|
`Memory — semantic recall (crib note apropos):\n${memory}\n\n` +
|
|
178
182
|
`Code index — symbols by concept or name (crib code lookup):\n${code}`;
|
|
179
|
-
pi.sendMessage({
|
|
183
|
+
pi.sendMessage({
|
|
184
|
+
customType: "crib-recall",
|
|
185
|
+
content,
|
|
186
|
+
display: true,
|
|
187
|
+
details: { topic },
|
|
188
|
+
}, { triggerTurn: true, deliverAs: "steer" });
|
|
180
189
|
},
|
|
181
190
|
});
|
|
182
191
|
}
|
|
192
|
+
// The crib PLAN SOURCE emits `plan:snapshot` events for a plan sidebar. Independent of
|
|
193
|
+
// server management (it reads via the crib CLI over the in-process bus), so it runs
|
|
194
|
+
// whether or not this plugin launches the backend — register it before the early return.
|
|
195
|
+
installCribPlanSource(pi, { resolveCrib });
|
|
183
196
|
// Combiner-served or manage=false: nothing to launch (crib runs elsewhere). The
|
|
184
197
|
// directive + command above still apply.
|
|
185
198
|
if (served || !manage)
|
|
@@ -224,7 +237,10 @@ export default function cribsheet(pi) {
|
|
|
224
237
|
useArgs.push("--log-file", logFile);
|
|
225
238
|
useArgs.push("--", crib.cmd, ...crib.args, ...serve);
|
|
226
239
|
installProcessCleanup();
|
|
227
|
-
const result = spawnSync(binary, useArgs, {
|
|
240
|
+
const result = spawnSync(binary, useArgs, {
|
|
241
|
+
stdio: "pipe",
|
|
242
|
+
env: process.env,
|
|
243
|
+
});
|
|
228
244
|
if (result.error) {
|
|
229
245
|
log("error", `${name}: failed to spawn sharedserver (${result.error.message})`);
|
|
230
246
|
return;
|
|
@@ -325,7 +341,7 @@ function installConfig(ctx, pathArg) {
|
|
|
325
341
|
ctx.ui?.notify?.(`cribsheet: failed to write ${target} (${e})`, "error");
|
|
326
342
|
return;
|
|
327
343
|
}
|
|
328
|
-
const what =
|
|
344
|
+
const what = existed ? (changed ? "updated" : "already configured") : "added";
|
|
329
345
|
ctx.ui?.notify?.(`cribsheet: ${what} "${key}" in ${target}\n` +
|
|
330
346
|
`Sends "Authorization: Bearer $CRIBSHEET_AUTH_TOKEN" when that env var is set ` +
|
|
331
347
|
`(auth:"bearer" both sends the token and suppresses OAuth probing). ` +
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/pi.d.ts
CHANGED
|
@@ -14,6 +14,15 @@ export type BeforeAgentStartEvent = {
|
|
|
14
14
|
export type BeforeAgentStartResult = {
|
|
15
15
|
systemPrompt?: string;
|
|
16
16
|
} | void;
|
|
17
|
+
/** Fired after a tool finishes. We read only `toolName` (to spot crib plan mutations). */
|
|
18
|
+
export type ToolExecutionEndEvent = {
|
|
19
|
+
toolName: string;
|
|
20
|
+
args?: unknown;
|
|
21
|
+
result?: unknown;
|
|
22
|
+
isError?: boolean;
|
|
23
|
+
};
|
|
24
|
+
/** Fired at the end of an agent turn — our natural coalescing point for re-snapshots. */
|
|
25
|
+
export type TurnEndEvent = Record<string, never>;
|
|
17
26
|
export type ExtensionContext = {
|
|
18
27
|
cwd: string;
|
|
19
28
|
mode: "tui" | "rpc" | "json" | "print";
|
|
@@ -63,8 +72,19 @@ export interface ExtensionAPI {
|
|
|
63
72
|
on(event: "session_start", handler: (event: SessionStartEvent, ctx: ExtensionContext) => void | Promise<void>): void;
|
|
64
73
|
on(event: "session_shutdown", handler: (event: SessionShutdownEvent, ctx: ExtensionContext) => void | Promise<void>): void;
|
|
65
74
|
on(event: "before_agent_start", handler: (event: BeforeAgentStartEvent, ctx: ExtensionContext) => BeforeAgentStartResult | Promise<BeforeAgentStartResult>): void;
|
|
75
|
+
on(event: "tool_execution_end", handler: (event: ToolExecutionEndEvent, ctx: ExtensionContext) => void | Promise<void>): void;
|
|
76
|
+
on(event: "turn_end", handler: (event: TurnEndEvent, ctx: ExtensionContext) => void | Promise<void>): void;
|
|
66
77
|
registerCommand(name: string, spec: CommandSpec): void;
|
|
67
78
|
exec(command: string, args: string[], options?: ExecOptions): Promise<ExecResult>;
|
|
68
79
|
sendMessage(message: SendMessage, options?: SendMessageOptions): void;
|
|
80
|
+
/** Persist a custom session entry; emits `entry_appended` (forwarded over RPC, but NOT
|
|
81
|
+
* delivered to in-process extension `on` handlers). For RPC consumers (pi-acp). */
|
|
82
|
+
appendEntry(customType: string, data?: unknown): string;
|
|
83
|
+
/** Shared in-process pub/sub bus across all extensions (how `subagents:*` crosses
|
|
84
|
+
* extensions). The channel for in-process consumers like pi-plan's TUI. Not RPC-forwarded. */
|
|
85
|
+
events: {
|
|
86
|
+
on(channel: string, handler: (data: unknown) => void): () => void;
|
|
87
|
+
emit(channel: string, data?: unknown): void;
|
|
88
|
+
};
|
|
69
89
|
}
|
|
70
90
|
//# sourceMappingURL=pi.d.ts.map
|
package/dist/pi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../src/pi.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;AACjF,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;AAEjF,MAAM,MAAM,iBAAiB,GAAG;
|
|
1
|
+
{"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../src/pi.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;AACjF,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;AAEjF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,MAAM,EAAE,kBAAkB,CAAA;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AACD,MAAM,MAAM,oBAAoB,GAAG;IAC/B,MAAM,EAAE,qBAAqB,CAAA;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AACD,MAAM,MAAM,qBAAqB,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAA;AAC5D,MAAM,MAAM,sBAAsB,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAA;AAErE,0FAA0F;AAC1F,MAAM,MAAM,qBAAqB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AACD,yFAAyF;AACzF,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAEhD,MAAM,MAAM,gBAAgB,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;IACtC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,EAAE,CAAC,EAAE;QACD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,KAAK,IAAI,CAAA;KACxE,CAAA;CACJ,CAAA;AAED;6CAC6C;AAC7C,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,CAAA;AAEtD,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhE,MAAM,MAAM,UAAU,GAAG;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,CAAA;CAClB,CAAA;AACD,MAAM,MAAM,WAAW,GAAG;IACtB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAC1B,CAAA;AAED;mFACmF;AACnF,MAAM,MAAM,WAAW,GAAG;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACpC,CAAA;AACD,MAAM,MAAM,kBAAkB,GAAG;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,uBAAuB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7E,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,gBAAgB,EAAE,GAAG,IAAI,CAAA;CACzE,CAAA;AAED,MAAM,WAAW,YAAY;IACzB,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACpH,EAAE,CACE,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACtF,IAAI,CAAA;IACP,EAAE,CACE,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,CACL,KAAK,EAAE,qBAAqB,EAC5B,GAAG,EAAE,gBAAgB,KACpB,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,GAC9D,IAAI,CAAA;IACP,EAAE,CACE,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACvF,IAAI,CAAA;IACP,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC1G,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IACtD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACjF,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;IACrE;wFACoF;IACpF,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACvD;mGAC+F;IAC/F,MAAM,EAAE;QACJ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;QACjE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAC9C,CAAA;CACJ"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "./pi.js";
|
|
2
|
+
/** One item in the shared plan wire format. Rich fields (`kind`, `tainted`, `deps`) are
|
|
3
|
+
* populated by cribsheet; a simpler source may omit them. */
|
|
4
|
+
export interface PlanItem {
|
|
5
|
+
/** crib's namespaced id, `<kind>:<slug>` (already the wire id scheme). */
|
|
6
|
+
id: string;
|
|
7
|
+
/** display text (the wire field is `title`). */
|
|
8
|
+
title: string;
|
|
9
|
+
/** kind passed through verbatim from crib (plan|design|note). */
|
|
10
|
+
kind: string;
|
|
11
|
+
status: string | null;
|
|
12
|
+
/** must-precede refs (this item depends on these), by node id. */
|
|
13
|
+
deps: string[];
|
|
14
|
+
tainted?: boolean;
|
|
15
|
+
ulid?: string;
|
|
16
|
+
updated?: string;
|
|
17
|
+
}
|
|
18
|
+
/** A full-replace snapshot on the `plan:snapshot` channel. `ns` attributes the source;
|
|
19
|
+
* `seq` lets a consumer drop out-of-order arrivals. */
|
|
20
|
+
export interface PlanSnapshot {
|
|
21
|
+
ns: "cribsheet";
|
|
22
|
+
seq: number;
|
|
23
|
+
project?: string;
|
|
24
|
+
items: PlanItem[];
|
|
25
|
+
}
|
|
26
|
+
interface CribNode {
|
|
27
|
+
id: string;
|
|
28
|
+
ulid?: string;
|
|
29
|
+
name?: string;
|
|
30
|
+
kind?: string;
|
|
31
|
+
status?: string | null;
|
|
32
|
+
updated?: string;
|
|
33
|
+
tainted?: boolean;
|
|
34
|
+
}
|
|
35
|
+
interface CribEdge {
|
|
36
|
+
from: string;
|
|
37
|
+
to: string;
|
|
38
|
+
kind: string;
|
|
39
|
+
}
|
|
40
|
+
interface CribGraph {
|
|
41
|
+
project?: string;
|
|
42
|
+
nodes?: CribNode[];
|
|
43
|
+
edges?: CribEdge[];
|
|
44
|
+
}
|
|
45
|
+
/** Map a crib `plan graph` payload into a `source=plan` snapshot. Edge `from -> to`
|
|
46
|
+
* (kind `dep`) means `from` depends on `to`, so `to` lands in `from`'s `deps`. */
|
|
47
|
+
export declare function graphToSnapshot(graph: CribGraph, seq: number): PlanSnapshot;
|
|
48
|
+
/** A stable, volatile-field-free fingerprint of a snapshot's MEANINGFUL shape, so the
|
|
49
|
+
* source emits only when the plan actually changed — not on every turn that merely
|
|
50
|
+
* touches it (e.g. a re-status that bumps `updated`, or a no-op mutation). Excludes
|
|
51
|
+
* `seq`, `updated`, and `ulid`; sorts items and deps so order churn isn't a change. */
|
|
52
|
+
export declare function planDigest(snapshot: PlanSnapshot): string;
|
|
53
|
+
export declare function isCribPlanMutation(toolName: string): boolean;
|
|
54
|
+
/** How to invoke crib — mirrors index.ts's resolveCrib() shape. */
|
|
55
|
+
export type CribCommand = {
|
|
56
|
+
cmd: string;
|
|
57
|
+
args: string[];
|
|
58
|
+
};
|
|
59
|
+
export interface PlanSourceOptions {
|
|
60
|
+
/** Resolve the crib CLI (env command → `crib` on PATH → `uv run … crib`). */
|
|
61
|
+
resolveCrib: () => CribCommand | undefined;
|
|
62
|
+
/** Pull timeout in ms (default 15000). */
|
|
63
|
+
timeoutMs?: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Wire the crib plan source into the extension: prime on `session_start`, mark dirty when
|
|
67
|
+
* a crib plan-mutation tool completes, and re-snapshot at `turn_end` if dirty. Emits via
|
|
68
|
+
* `pi.events.emit("plan:snapshot", snapshot)` on the shared in-process bus (for pi-plan's TUI).
|
|
69
|
+
*/
|
|
70
|
+
export declare function installCribPlanSource(pi: ExtensionAPI, opts: PlanSourceOptions): void;
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=plan-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-source.d.ts","sourceRoot":"","sources":["../src/plan-source.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C;8DAC8D;AAC9D,MAAM,WAAW,QAAQ;IACrB,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAA;IACV,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,kEAAkE;IAClE,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;wDACwD;AACxD,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,WAAW,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAA;CACpB;AAGD,UAAU,QAAQ;IACd,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB;AACD,UAAU,QAAQ;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACf;AACD,UAAU,SAAS;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAA;CACrB;AAED;mFACmF;AACnF,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAqB3E;AAED;;;wFAGwF;AACxF,wBAAgB,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAYzD;AAiBD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAS5D;AAED,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAEzD,MAAM,WAAW,iBAAiB;IAC9B,6EAA6E;IAC7E,WAAW,EAAE,MAAM,WAAW,GAAG,SAAS,CAAA;IAC1C,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CA+DrF"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// The crib PLAN SOURCE: surfaces cribsheet's plan graph onto pi's in-process bus as
|
|
2
|
+
// `plan:snapshot` events, so a plan sidebar (pi-plan TUI, or the pi-acp ACP adapter over
|
|
3
|
+
// RPC) can render it. cribsheet is one PLAN source among many; it publishes the shared
|
|
4
|
+
// wire format with `ns:"cribsheet"` — only this plugin knows crib's CLI/schema.
|
|
5
|
+
//
|
|
6
|
+
// Snapshot-based (not delta): each emit carries the WHOLE current cribsheet plan; consumers
|
|
7
|
+
// replace their `cribsheet` slice. Prime on session_start; re-snapshot after a crib plan
|
|
8
|
+
// MUTATION tool completes (coalesced to turn_end). A missed trigger self-heals on the next
|
|
9
|
+
// snapshot — the trigger is a cache-invalidation ping, not the data.
|
|
10
|
+
//
|
|
11
|
+
// CHANNEL: emits on the shared in-process `pi.events` bus (`plan:snapshot`), which is how an
|
|
12
|
+
// in-process consumer (pi-plan's TUI) receives it. `appendEntry` is NOT used here: pi-acp
|
|
13
|
+
// runs its own bundled extension that re-emits this bus event as an `acp:plan` custom entry
|
|
14
|
+
// to cross RPC (entry_appended is forwarded over RPC, but is NOT delivered to in-process
|
|
15
|
+
// extension `on` handlers).
|
|
16
|
+
/** Map a crib `plan graph` payload into a `source=plan` snapshot. Edge `from -> to`
|
|
17
|
+
* (kind `dep`) means `from` depends on `to`, so `to` lands in `from`'s `deps`. */
|
|
18
|
+
export function graphToSnapshot(graph, seq) {
|
|
19
|
+
const depsByNode = new Map();
|
|
20
|
+
for (const e of graph.edges ?? []) {
|
|
21
|
+
if (!e || e.kind !== "dep" || typeof e.from !== "string" || typeof e.to !== "string")
|
|
22
|
+
continue;
|
|
23
|
+
const arr = depsByNode.get(e.from);
|
|
24
|
+
if (arr)
|
|
25
|
+
arr.push(e.to);
|
|
26
|
+
else
|
|
27
|
+
depsByNode.set(e.from, [e.to]);
|
|
28
|
+
}
|
|
29
|
+
const items = (graph.nodes ?? [])
|
|
30
|
+
.filter((n) => !!n && typeof n.id === "string")
|
|
31
|
+
.map((n) => ({
|
|
32
|
+
id: n.id,
|
|
33
|
+
title: typeof n.name === "string" ? n.name : n.id,
|
|
34
|
+
kind: typeof n.kind === "string" ? n.kind : "plan",
|
|
35
|
+
status: n.status ?? null,
|
|
36
|
+
deps: depsByNode.get(n.id) ?? [],
|
|
37
|
+
tainted: n.tainted,
|
|
38
|
+
ulid: n.ulid,
|
|
39
|
+
updated: n.updated,
|
|
40
|
+
}));
|
|
41
|
+
return { ns: "cribsheet", seq, project: graph.project, items };
|
|
42
|
+
}
|
|
43
|
+
/** A stable, volatile-field-free fingerprint of a snapshot's MEANINGFUL shape, so the
|
|
44
|
+
* source emits only when the plan actually changed — not on every turn that merely
|
|
45
|
+
* touches it (e.g. a re-status that bumps `updated`, or a no-op mutation). Excludes
|
|
46
|
+
* `seq`, `updated`, and `ulid`; sorts items and deps so order churn isn't a change. */
|
|
47
|
+
export function planDigest(snapshot) {
|
|
48
|
+
const items = snapshot.items
|
|
49
|
+
.map((i) => ({
|
|
50
|
+
id: i.id,
|
|
51
|
+
title: i.title,
|
|
52
|
+
kind: i.kind,
|
|
53
|
+
status: i.status ?? null,
|
|
54
|
+
tainted: i.tainted === true,
|
|
55
|
+
deps: [...i.deps].sort((a, b) => a.localeCompare(b)),
|
|
56
|
+
}))
|
|
57
|
+
.sort((a, b) => a.id.localeCompare(b.id));
|
|
58
|
+
return JSON.stringify({ project: snapshot.project ?? null, items });
|
|
59
|
+
}
|
|
60
|
+
// ── crib plan MUTATION tools (reads are ignored) ───────────────────
|
|
61
|
+
// Tools arrive combiner/client-PREFIXED (e.g. cribsheet_plan_add, or the longer
|
|
62
|
+
// mcp__…-combiner__cribsheet_plan_add), so match on the TAIL, with a separator
|
|
63
|
+
// boundary so `plan_add` can't spuriously match e.g. `explain_add`.
|
|
64
|
+
const CRIB_PLAN_MUTATION_VERBS = [
|
|
65
|
+
"plan_dep_remove",
|
|
66
|
+
"plan_dep_add",
|
|
67
|
+
"plan_reaffirm",
|
|
68
|
+
"plan_import",
|
|
69
|
+
"plan_status",
|
|
70
|
+
"plan_forget",
|
|
71
|
+
"plan_move",
|
|
72
|
+
"plan_add",
|
|
73
|
+
];
|
|
74
|
+
export function isCribPlanMutation(toolName) {
|
|
75
|
+
for (const verb of CRIB_PLAN_MUTATION_VERBS) {
|
|
76
|
+
if (toolName === verb)
|
|
77
|
+
return true;
|
|
78
|
+
if (toolName.endsWith(verb)) {
|
|
79
|
+
const boundary = toolName[toolName.length - verb.length - 1];
|
|
80
|
+
if (boundary === "_" || boundary === ":" || boundary === "/")
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Wire the crib plan source into the extension: prime on `session_start`, mark dirty when
|
|
88
|
+
* a crib plan-mutation tool completes, and re-snapshot at `turn_end` if dirty. Emits via
|
|
89
|
+
* `pi.events.emit("plan:snapshot", snapshot)` on the shared in-process bus (for pi-plan's TUI).
|
|
90
|
+
*/
|
|
91
|
+
export function installCribPlanSource(pi, opts) {
|
|
92
|
+
const timeout = opts.timeoutMs ?? 15_000;
|
|
93
|
+
let seq = 0;
|
|
94
|
+
let dirty = false;
|
|
95
|
+
let lastCwd;
|
|
96
|
+
// Fingerprint of the last EMITTED snapshot: a re-pull whose meaningful shape is
|
|
97
|
+
// unchanged does not re-emit (the trigger is dirty-tracking, but a mutation can
|
|
98
|
+
// land on the same content — a duplicate add, a re-status to the same value — and
|
|
99
|
+
// a stale slice self-heals on the next real change anyway).
|
|
100
|
+
let lastDigest;
|
|
101
|
+
// Guard against overlapping pulls (a burst of turn_end + a slow crib).
|
|
102
|
+
let pulling = false;
|
|
103
|
+
const pull = async (cwd, signal) => {
|
|
104
|
+
if (pulling)
|
|
105
|
+
return;
|
|
106
|
+
const crib = opts.resolveCrib();
|
|
107
|
+
if (!crib)
|
|
108
|
+
return;
|
|
109
|
+
pulling = true;
|
|
110
|
+
try {
|
|
111
|
+
// Global `--json` goes BEFORE the subcommand. Run crib IN the session cwd
|
|
112
|
+
// and select the project with `-P .` — the CLI resolves it to the absolute
|
|
113
|
+
// client path, so the daemon anchors on the right project (not `default`).
|
|
114
|
+
const res = await pi.exec(crib.cmd, [...crib.args, "--json", "plan", "graph", "-P", "."], {
|
|
115
|
+
signal,
|
|
116
|
+
timeout,
|
|
117
|
+
cwd,
|
|
118
|
+
});
|
|
119
|
+
if (res.code !== 0)
|
|
120
|
+
return;
|
|
121
|
+
let graph;
|
|
122
|
+
try {
|
|
123
|
+
graph = JSON.parse(res.stdout);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const snapshot = graphToSnapshot(graph, seq);
|
|
129
|
+
const digest = planDigest(snapshot);
|
|
130
|
+
if (digest === lastDigest)
|
|
131
|
+
return; // unchanged — don't re-emit the same plan
|
|
132
|
+
lastDigest = digest;
|
|
133
|
+
seq++;
|
|
134
|
+
pi.events.emit("plan:snapshot", snapshot);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// best effort; a dropped snapshot self-heals on the next trigger
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
pulling = false;
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
pi.on("session_start", (_event, ctx) => {
|
|
144
|
+
lastCwd = ctx.cwd;
|
|
145
|
+
// Prime: surface whatever plan already exists (incl. edits from before this session).
|
|
146
|
+
void pull(ctx.cwd, ctx.signal);
|
|
147
|
+
});
|
|
148
|
+
pi.on("tool_execution_end", (event) => {
|
|
149
|
+
if (isCribPlanMutation(event.toolName))
|
|
150
|
+
dirty = true;
|
|
151
|
+
});
|
|
152
|
+
// Coalesce a turn's worth of mutations into one re-snapshot after they've all landed.
|
|
153
|
+
pi.on("turn_end", (_event, ctx) => {
|
|
154
|
+
if (!dirty)
|
|
155
|
+
return;
|
|
156
|
+
dirty = false;
|
|
157
|
+
void pull(ctx.cwd ?? lastCwd ?? process.cwd(), ctx.signal);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=plan-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-source.js","sourceRoot":"","sources":["../src/plan-source.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geohar/pi-cribsheet",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Pi extension: run the crib (cribsheet) memory + code-index MCP server via sharedserver, inject the reach-for-crib directive, and ship the /crib recall command. Pairs with pi-mcp-adapter.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
package/src/index.ts
CHANGED
|
@@ -36,6 +36,7 @@ import type {
|
|
|
36
36
|
ExtensionContext,
|
|
37
37
|
SessionShutdownEvent,
|
|
38
38
|
} from "./pi.js"
|
|
39
|
+
import { installCribPlanSource } from "./plan-source.js"
|
|
39
40
|
import { resolveSharedserver } from "./sharedserver-resolve.js"
|
|
40
41
|
|
|
41
42
|
const DEFAULT_PORT = 7732
|
|
@@ -136,7 +137,10 @@ function detach() {
|
|
|
136
137
|
if (!attachment) return
|
|
137
138
|
const { binary, name } = attachment
|
|
138
139
|
attachment = null
|
|
139
|
-
spawnSync(binary, ["unuse", name, "--pid", String(process.pid)], {
|
|
140
|
+
spawnSync(binary, ["unuse", name, "--pid", String(process.pid)], {
|
|
141
|
+
stdio: "ignore",
|
|
142
|
+
env: process.env,
|
|
143
|
+
})
|
|
140
144
|
}
|
|
141
145
|
|
|
142
146
|
// ── the extension ──────────────────────────────────────────────────
|
|
@@ -202,13 +206,23 @@ export default function cribsheet(pi: ExtensionAPI): void {
|
|
|
202
206
|
`Memory — semantic recall (crib note apropos):\n${memory}\n\n` +
|
|
203
207
|
`Code index — symbols by concept or name (crib code lookup):\n${code}`
|
|
204
208
|
pi.sendMessage(
|
|
205
|
-
{
|
|
209
|
+
{
|
|
210
|
+
customType: "crib-recall",
|
|
211
|
+
content,
|
|
212
|
+
display: true,
|
|
213
|
+
details: { topic },
|
|
214
|
+
},
|
|
206
215
|
{ triggerTurn: true, deliverAs: "steer" },
|
|
207
216
|
)
|
|
208
217
|
},
|
|
209
218
|
})
|
|
210
219
|
}
|
|
211
220
|
|
|
221
|
+
// The crib PLAN SOURCE emits `plan:snapshot` events for a plan sidebar. Independent of
|
|
222
|
+
// server management (it reads via the crib CLI over the in-process bus), so it runs
|
|
223
|
+
// whether or not this plugin launches the backend — register it before the early return.
|
|
224
|
+
installCribPlanSource(pi, { resolveCrib })
|
|
225
|
+
|
|
212
226
|
// Combiner-served or manage=false: nothing to launch (crib runs elsewhere). The
|
|
213
227
|
// directive + command above still apply.
|
|
214
228
|
if (served || !manage) return
|
|
@@ -265,7 +279,10 @@ export default function cribsheet(pi: ExtensionAPI): void {
|
|
|
265
279
|
useArgs.push("--", crib.cmd, ...crib.args, ...serve)
|
|
266
280
|
|
|
267
281
|
installProcessCleanup()
|
|
268
|
-
const result = spawnSync(binary, useArgs, {
|
|
282
|
+
const result = spawnSync(binary, useArgs, {
|
|
283
|
+
stdio: "pipe",
|
|
284
|
+
env: process.env,
|
|
285
|
+
})
|
|
269
286
|
if (result.error) {
|
|
270
287
|
log("error", `${name}: failed to spawn sharedserver (${result.error.message})`)
|
|
271
288
|
return
|
|
@@ -372,7 +389,7 @@ function installConfig(ctx: ExtensionCommandContext, pathArg?: string): void {
|
|
|
372
389
|
return
|
|
373
390
|
}
|
|
374
391
|
|
|
375
|
-
const what =
|
|
392
|
+
const what = existed ? (changed ? "updated" : "already configured") : "added"
|
|
376
393
|
ctx.ui?.notify?.(
|
|
377
394
|
`cribsheet: ${what} "${key}" in ${target}\n` +
|
|
378
395
|
`Sends "Authorization: Bearer $CRIBSHEET_AUTH_TOKEN" when that env var is set ` +
|
package/src/pi.ts
CHANGED
|
@@ -10,17 +10,35 @@
|
|
|
10
10
|
export type SessionStartReason = "startup" | "reload" | "new" | "resume" | "fork"
|
|
11
11
|
export type SessionShutdownReason = "quit" | "reload" | "new" | "resume" | "fork"
|
|
12
12
|
|
|
13
|
-
export type SessionStartEvent = {
|
|
14
|
-
|
|
13
|
+
export type SessionStartEvent = {
|
|
14
|
+
reason: SessionStartReason
|
|
15
|
+
previousSessionFile?: string
|
|
16
|
+
}
|
|
17
|
+
export type SessionShutdownEvent = {
|
|
18
|
+
reason: SessionShutdownReason
|
|
19
|
+
targetSessionFile?: string
|
|
20
|
+
}
|
|
15
21
|
export type BeforeAgentStartEvent = { systemPrompt: string }
|
|
16
22
|
export type BeforeAgentStartResult = { systemPrompt?: string } | void
|
|
17
23
|
|
|
24
|
+
/** Fired after a tool finishes. We read only `toolName` (to spot crib plan mutations). */
|
|
25
|
+
export type ToolExecutionEndEvent = {
|
|
26
|
+
toolName: string
|
|
27
|
+
args?: unknown
|
|
28
|
+
result?: unknown
|
|
29
|
+
isError?: boolean
|
|
30
|
+
}
|
|
31
|
+
/** Fired at the end of an agent turn — our natural coalescing point for re-snapshots. */
|
|
32
|
+
export type TurnEndEvent = Record<string, never>
|
|
33
|
+
|
|
18
34
|
export type ExtensionContext = {
|
|
19
35
|
cwd: string
|
|
20
36
|
mode: "tui" | "rpc" | "json" | "print"
|
|
21
37
|
hasUI: boolean
|
|
22
38
|
signal?: AbortSignal
|
|
23
|
-
ui?: {
|
|
39
|
+
ui?: {
|
|
40
|
+
notify?: (message: string, level?: "info" | "warn" | "error") => void
|
|
41
|
+
}
|
|
24
42
|
}
|
|
25
43
|
|
|
26
44
|
/** Context handed to a command handler. Superset of ExtensionContext in practice; we
|
|
@@ -29,8 +47,18 @@ export type ExtensionCommandContext = ExtensionContext
|
|
|
29
47
|
|
|
30
48
|
export type AutocompleteItem = { value: string; label?: string }
|
|
31
49
|
|
|
32
|
-
export type ExecResult = {
|
|
33
|
-
|
|
50
|
+
export type ExecResult = {
|
|
51
|
+
stdout: string
|
|
52
|
+
stderr: string
|
|
53
|
+
code: number
|
|
54
|
+
killed: boolean
|
|
55
|
+
}
|
|
56
|
+
export type ExecOptions = {
|
|
57
|
+
signal?: AbortSignal
|
|
58
|
+
timeout?: number
|
|
59
|
+
cwd?: string
|
|
60
|
+
env?: NodeJS.ProcessEnv
|
|
61
|
+
}
|
|
34
62
|
|
|
35
63
|
/** An LLM-visible message injected from a command. `display:true` shows it in the TUI;
|
|
36
64
|
* `{triggerTurn:true, deliverAs:"steer"}` makes the model act on it this turn. */
|
|
@@ -40,7 +68,10 @@ export type SendMessage = {
|
|
|
40
68
|
display?: boolean
|
|
41
69
|
details?: Record<string, unknown>
|
|
42
70
|
}
|
|
43
|
-
export type SendMessageOptions = {
|
|
71
|
+
export type SendMessageOptions = {
|
|
72
|
+
triggerTurn?: boolean
|
|
73
|
+
deliverAs?: "steer" | "followUp"
|
|
74
|
+
}
|
|
44
75
|
|
|
45
76
|
export type CommandSpec = {
|
|
46
77
|
description: string
|
|
@@ -49,10 +80,7 @@ export type CommandSpec = {
|
|
|
49
80
|
}
|
|
50
81
|
|
|
51
82
|
export interface ExtensionAPI {
|
|
52
|
-
on(
|
|
53
|
-
event: "session_start",
|
|
54
|
-
handler: (event: SessionStartEvent, ctx: ExtensionContext) => void | Promise<void>,
|
|
55
|
-
): void
|
|
83
|
+
on(event: "session_start", handler: (event: SessionStartEvent, ctx: ExtensionContext) => void | Promise<void>): void
|
|
56
84
|
on(
|
|
57
85
|
event: "session_shutdown",
|
|
58
86
|
handler: (event: SessionShutdownEvent, ctx: ExtensionContext) => void | Promise<void>,
|
|
@@ -64,7 +92,21 @@ export interface ExtensionAPI {
|
|
|
64
92
|
ctx: ExtensionContext,
|
|
65
93
|
) => BeforeAgentStartResult | Promise<BeforeAgentStartResult>,
|
|
66
94
|
): void
|
|
95
|
+
on(
|
|
96
|
+
event: "tool_execution_end",
|
|
97
|
+
handler: (event: ToolExecutionEndEvent, ctx: ExtensionContext) => void | Promise<void>,
|
|
98
|
+
): void
|
|
99
|
+
on(event: "turn_end", handler: (event: TurnEndEvent, ctx: ExtensionContext) => void | Promise<void>): void
|
|
67
100
|
registerCommand(name: string, spec: CommandSpec): void
|
|
68
101
|
exec(command: string, args: string[], options?: ExecOptions): Promise<ExecResult>
|
|
69
102
|
sendMessage(message: SendMessage, options?: SendMessageOptions): void
|
|
103
|
+
/** Persist a custom session entry; emits `entry_appended` (forwarded over RPC, but NOT
|
|
104
|
+
* delivered to in-process extension `on` handlers). For RPC consumers (pi-acp). */
|
|
105
|
+
appendEntry(customType: string, data?: unknown): string
|
|
106
|
+
/** Shared in-process pub/sub bus across all extensions (how `subagents:*` crosses
|
|
107
|
+
* extensions). The channel for in-process consumers like pi-plan's TUI. Not RPC-forwarded. */
|
|
108
|
+
events: {
|
|
109
|
+
on(channel: string, handler: (data: unknown) => void): () => void
|
|
110
|
+
emit(channel: string, data?: unknown): void
|
|
111
|
+
}
|
|
70
112
|
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// The crib PLAN SOURCE: surfaces cribsheet's plan graph onto pi's in-process bus as
|
|
2
|
+
// `plan:snapshot` events, so a plan sidebar (pi-plan TUI, or the pi-acp ACP adapter over
|
|
3
|
+
// RPC) can render it. cribsheet is one PLAN source among many; it publishes the shared
|
|
4
|
+
// wire format with `ns:"cribsheet"` — only this plugin knows crib's CLI/schema.
|
|
5
|
+
//
|
|
6
|
+
// Snapshot-based (not delta): each emit carries the WHOLE current cribsheet plan; consumers
|
|
7
|
+
// replace their `cribsheet` slice. Prime on session_start; re-snapshot after a crib plan
|
|
8
|
+
// MUTATION tool completes (coalesced to turn_end). A missed trigger self-heals on the next
|
|
9
|
+
// snapshot — the trigger is a cache-invalidation ping, not the data.
|
|
10
|
+
//
|
|
11
|
+
// CHANNEL: emits on the shared in-process `pi.events` bus (`plan:snapshot`), which is how an
|
|
12
|
+
// in-process consumer (pi-plan's TUI) receives it. `appendEntry` is NOT used here: pi-acp
|
|
13
|
+
// runs its own bundled extension that re-emits this bus event as an `acp:plan` custom entry
|
|
14
|
+
// to cross RPC (entry_appended is forwarded over RPC, but is NOT delivered to in-process
|
|
15
|
+
// extension `on` handlers).
|
|
16
|
+
|
|
17
|
+
import type { ExtensionAPI } from "./pi.js"
|
|
18
|
+
|
|
19
|
+
/** One item in the shared plan wire format. Rich fields (`kind`, `tainted`, `deps`) are
|
|
20
|
+
* populated by cribsheet; a simpler source may omit them. */
|
|
21
|
+
export interface PlanItem {
|
|
22
|
+
/** crib's namespaced id, `<kind>:<slug>` (already the wire id scheme). */
|
|
23
|
+
id: string
|
|
24
|
+
/** display text (the wire field is `title`). */
|
|
25
|
+
title: string
|
|
26
|
+
/** kind passed through verbatim from crib (plan|design|note). */
|
|
27
|
+
kind: string
|
|
28
|
+
status: string | null
|
|
29
|
+
/** must-precede refs (this item depends on these), by node id. */
|
|
30
|
+
deps: string[]
|
|
31
|
+
tainted?: boolean
|
|
32
|
+
ulid?: string
|
|
33
|
+
updated?: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** A full-replace snapshot on the `plan:snapshot` channel. `ns` attributes the source;
|
|
37
|
+
* `seq` lets a consumer drop out-of-order arrivals. */
|
|
38
|
+
export interface PlanSnapshot {
|
|
39
|
+
ns: "cribsheet"
|
|
40
|
+
seq: number
|
|
41
|
+
project?: string
|
|
42
|
+
items: PlanItem[]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ── crib `plan graph --json` shapes ────────────────────────────────
|
|
46
|
+
interface CribNode {
|
|
47
|
+
id: string
|
|
48
|
+
ulid?: string
|
|
49
|
+
name?: string
|
|
50
|
+
kind?: string
|
|
51
|
+
status?: string | null
|
|
52
|
+
updated?: string
|
|
53
|
+
tainted?: boolean
|
|
54
|
+
}
|
|
55
|
+
interface CribEdge {
|
|
56
|
+
from: string
|
|
57
|
+
to: string
|
|
58
|
+
kind: string
|
|
59
|
+
}
|
|
60
|
+
interface CribGraph {
|
|
61
|
+
project?: string
|
|
62
|
+
nodes?: CribNode[]
|
|
63
|
+
edges?: CribEdge[]
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Map a crib `plan graph` payload into a `source=plan` snapshot. Edge `from -> to`
|
|
67
|
+
* (kind `dep`) means `from` depends on `to`, so `to` lands in `from`'s `deps`. */
|
|
68
|
+
export function graphToSnapshot(graph: CribGraph, seq: number): PlanSnapshot {
|
|
69
|
+
const depsByNode = new Map<string, string[]>()
|
|
70
|
+
for (const e of graph.edges ?? []) {
|
|
71
|
+
if (!e || e.kind !== "dep" || typeof e.from !== "string" || typeof e.to !== "string") continue
|
|
72
|
+
const arr = depsByNode.get(e.from)
|
|
73
|
+
if (arr) arr.push(e.to)
|
|
74
|
+
else depsByNode.set(e.from, [e.to])
|
|
75
|
+
}
|
|
76
|
+
const items: PlanItem[] = (graph.nodes ?? [])
|
|
77
|
+
.filter((n): n is CribNode => !!n && typeof n.id === "string")
|
|
78
|
+
.map((n) => ({
|
|
79
|
+
id: n.id,
|
|
80
|
+
title: typeof n.name === "string" ? n.name : n.id,
|
|
81
|
+
kind: typeof n.kind === "string" ? n.kind : "plan",
|
|
82
|
+
status: n.status ?? null,
|
|
83
|
+
deps: depsByNode.get(n.id) ?? [],
|
|
84
|
+
tainted: n.tainted,
|
|
85
|
+
ulid: n.ulid,
|
|
86
|
+
updated: n.updated,
|
|
87
|
+
}))
|
|
88
|
+
return { ns: "cribsheet", seq, project: graph.project, items }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** A stable, volatile-field-free fingerprint of a snapshot's MEANINGFUL shape, so the
|
|
92
|
+
* source emits only when the plan actually changed — not on every turn that merely
|
|
93
|
+
* touches it (e.g. a re-status that bumps `updated`, or a no-op mutation). Excludes
|
|
94
|
+
* `seq`, `updated`, and `ulid`; sorts items and deps so order churn isn't a change. */
|
|
95
|
+
export function planDigest(snapshot: PlanSnapshot): string {
|
|
96
|
+
const items = snapshot.items
|
|
97
|
+
.map((i) => ({
|
|
98
|
+
id: i.id,
|
|
99
|
+
title: i.title,
|
|
100
|
+
kind: i.kind,
|
|
101
|
+
status: i.status ?? null,
|
|
102
|
+
tainted: i.tainted === true,
|
|
103
|
+
deps: [...i.deps].sort((a, b) => a.localeCompare(b)),
|
|
104
|
+
}))
|
|
105
|
+
.sort((a, b) => a.id.localeCompare(b.id))
|
|
106
|
+
return JSON.stringify({ project: snapshot.project ?? null, items })
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ── crib plan MUTATION tools (reads are ignored) ───────────────────
|
|
110
|
+
// Tools arrive combiner/client-PREFIXED (e.g. cribsheet_plan_add, or the longer
|
|
111
|
+
// mcp__…-combiner__cribsheet_plan_add), so match on the TAIL, with a separator
|
|
112
|
+
// boundary so `plan_add` can't spuriously match e.g. `explain_add`.
|
|
113
|
+
const CRIB_PLAN_MUTATION_VERBS = [
|
|
114
|
+
"plan_dep_remove",
|
|
115
|
+
"plan_dep_add",
|
|
116
|
+
"plan_reaffirm",
|
|
117
|
+
"plan_import",
|
|
118
|
+
"plan_status",
|
|
119
|
+
"plan_forget",
|
|
120
|
+
"plan_move",
|
|
121
|
+
"plan_add",
|
|
122
|
+
] as const
|
|
123
|
+
|
|
124
|
+
export function isCribPlanMutation(toolName: string): boolean {
|
|
125
|
+
for (const verb of CRIB_PLAN_MUTATION_VERBS) {
|
|
126
|
+
if (toolName === verb) return true
|
|
127
|
+
if (toolName.endsWith(verb)) {
|
|
128
|
+
const boundary = toolName[toolName.length - verb.length - 1]
|
|
129
|
+
if (boundary === "_" || boundary === ":" || boundary === "/") return true
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return false
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** How to invoke crib — mirrors index.ts's resolveCrib() shape. */
|
|
136
|
+
export type CribCommand = { cmd: string; args: string[] }
|
|
137
|
+
|
|
138
|
+
export interface PlanSourceOptions {
|
|
139
|
+
/** Resolve the crib CLI (env command → `crib` on PATH → `uv run … crib`). */
|
|
140
|
+
resolveCrib: () => CribCommand | undefined
|
|
141
|
+
/** Pull timeout in ms (default 15000). */
|
|
142
|
+
timeoutMs?: number
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Wire the crib plan source into the extension: prime on `session_start`, mark dirty when
|
|
147
|
+
* a crib plan-mutation tool completes, and re-snapshot at `turn_end` if dirty. Emits via
|
|
148
|
+
* `pi.events.emit("plan:snapshot", snapshot)` on the shared in-process bus (for pi-plan's TUI).
|
|
149
|
+
*/
|
|
150
|
+
export function installCribPlanSource(pi: ExtensionAPI, opts: PlanSourceOptions): void {
|
|
151
|
+
const timeout = opts.timeoutMs ?? 15_000
|
|
152
|
+
let seq = 0
|
|
153
|
+
let dirty = false
|
|
154
|
+
let lastCwd: string | undefined
|
|
155
|
+
// Fingerprint of the last EMITTED snapshot: a re-pull whose meaningful shape is
|
|
156
|
+
// unchanged does not re-emit (the trigger is dirty-tracking, but a mutation can
|
|
157
|
+
// land on the same content — a duplicate add, a re-status to the same value — and
|
|
158
|
+
// a stale slice self-heals on the next real change anyway).
|
|
159
|
+
let lastDigest: string | undefined
|
|
160
|
+
// Guard against overlapping pulls (a burst of turn_end + a slow crib).
|
|
161
|
+
let pulling = false
|
|
162
|
+
|
|
163
|
+
const pull = async (cwd: string, signal?: AbortSignal): Promise<void> => {
|
|
164
|
+
if (pulling) return
|
|
165
|
+
const crib = opts.resolveCrib()
|
|
166
|
+
if (!crib) return
|
|
167
|
+
pulling = true
|
|
168
|
+
try {
|
|
169
|
+
// Global `--json` goes BEFORE the subcommand. Run crib IN the session cwd
|
|
170
|
+
// and select the project with `-P .` — the CLI resolves it to the absolute
|
|
171
|
+
// client path, so the daemon anchors on the right project (not `default`).
|
|
172
|
+
const res = await pi.exec(crib.cmd, [...crib.args, "--json", "plan", "graph", "-P", "."], {
|
|
173
|
+
signal,
|
|
174
|
+
timeout,
|
|
175
|
+
cwd,
|
|
176
|
+
})
|
|
177
|
+
if (res.code !== 0) return
|
|
178
|
+
let graph: CribGraph
|
|
179
|
+
try {
|
|
180
|
+
graph = JSON.parse(res.stdout) as CribGraph
|
|
181
|
+
} catch {
|
|
182
|
+
return
|
|
183
|
+
}
|
|
184
|
+
const snapshot = graphToSnapshot(graph, seq)
|
|
185
|
+
const digest = planDigest(snapshot)
|
|
186
|
+
if (digest === lastDigest) return // unchanged — don't re-emit the same plan
|
|
187
|
+
lastDigest = digest
|
|
188
|
+
seq++
|
|
189
|
+
pi.events.emit("plan:snapshot", snapshot)
|
|
190
|
+
} catch {
|
|
191
|
+
// best effort; a dropped snapshot self-heals on the next trigger
|
|
192
|
+
} finally {
|
|
193
|
+
pulling = false
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
pi.on("session_start", (_event, ctx) => {
|
|
198
|
+
lastCwd = ctx.cwd
|
|
199
|
+
// Prime: surface whatever plan already exists (incl. edits from before this session).
|
|
200
|
+
void pull(ctx.cwd, ctx.signal)
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
pi.on("tool_execution_end", (event) => {
|
|
204
|
+
if (isCribPlanMutation(event.toolName)) dirty = true
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
// Coalesce a turn's worth of mutations into one re-snapshot after they've all landed.
|
|
208
|
+
pi.on("turn_end", (_event, ctx) => {
|
|
209
|
+
if (!dirty) return
|
|
210
|
+
dirty = false
|
|
211
|
+
void pull(ctx.cwd ?? lastCwd ?? process.cwd(), ctx.signal)
|
|
212
|
+
})
|
|
213
|
+
}
|