@nanonets/graft 0.8.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -15
- package/dist/ask/ask.js +1 -1
- package/dist/ask/ask.js.map +1 -1
- package/dist/claude/format.d.ts +40 -13
- package/dist/claude/format.d.ts.map +1 -1
- package/dist/claude/format.js +54 -15
- package/dist/claude/format.js.map +1 -1
- package/dist/claude/hooks.d.ts +15 -0
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +52 -3
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.d.ts +17 -0
- package/dist/claude/init.d.ts.map +1 -1
- package/dist/claude/init.js +47 -21
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/settings-merge.d.ts.map +1 -1
- package/dist/claude/settings-merge.js +19 -2
- package/dist/claude/settings-merge.js.map +1 -1
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +13 -5
- package/dist/claude/skill-template.js.map +1 -1
- package/dist/claude/state.d.ts +5 -20
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js +10 -73
- package/dist/claude/state.js.map +1 -1
- package/dist/cli-picker.d.ts +60 -0
- package/dist/cli-picker.d.ts.map +1 -0
- package/dist/cli-picker.js +268 -0
- package/dist/cli-picker.js.map +1 -0
- package/dist/cli.js +101 -12
- package/dist/cli.js.map +1 -1
- package/dist/context/node-file.d.ts +21 -0
- package/dist/context/node-file.d.ts.map +1 -1
- package/dist/context/node-file.js +63 -1
- package/dist/context/node-file.js.map +1 -1
- package/dist/engine.d.ts +2 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1 -0
- package/dist/engine.js.map +1 -1
- package/dist/graph/build.d.ts +13 -2
- package/dist/graph/build.d.ts.map +1 -1
- package/dist/graph/build.js +98 -20
- package/dist/graph/build.js.map +1 -1
- package/dist/graph/cards.d.ts.map +1 -1
- package/dist/graph/cards.js +8 -0
- package/dist/graph/cards.js.map +1 -1
- package/dist/graph/extract-cache.d.ts +96 -0
- package/dist/graph/extract-cache.d.ts.map +1 -0
- package/dist/graph/extract-cache.js +199 -0
- package/dist/graph/extract-cache.js.map +1 -0
- package/dist/graph/fingerprint.d.ts +70 -0
- package/dist/graph/fingerprint.d.ts.map +1 -0
- package/dist/graph/fingerprint.js +147 -0
- package/dist/graph/fingerprint.js.map +1 -0
- package/dist/graph/load.d.ts +11 -0
- package/dist/graph/load.d.ts.map +1 -1
- package/dist/graph/load.js +14 -0
- package/dist/graph/load.js.map +1 -1
- package/dist/graph/refresh.d.ts +49 -0
- package/dist/graph/refresh.d.ts.map +1 -0
- package/dist/graph/refresh.js +202 -0
- package/dist/graph/refresh.js.map +1 -0
- package/dist/graph/source-files.d.ts +18 -0
- package/dist/graph/source-files.d.ts.map +1 -0
- package/dist/graph/source-files.js +36 -0
- package/dist/graph/source-files.js.map +1 -0
- package/dist/graph/traverse-cli.d.ts +1 -1
- package/dist/graph/traverse-cli.js +2 -2
- package/dist/graph/traverse.d.ts +2 -2
- package/dist/graph/traverse.js +1 -1
- package/dist/hosts/codex-hooks.d.ts +8 -0
- package/dist/hosts/codex-hooks.d.ts.map +1 -1
- package/dist/hosts/codex-hooks.js +27 -4
- package/dist/hosts/codex-hooks.js.map +1 -1
- package/dist/hosts/init.d.ts +2 -0
- package/dist/hosts/init.d.ts.map +1 -1
- package/dist/hosts/init.js +5 -2
- package/dist/hosts/init.js.map +1 -1
- package/dist/hosts/mcp-config.d.ts +29 -1
- package/dist/hosts/mcp-config.d.ts.map +1 -1
- package/dist/hosts/mcp-config.js +77 -10
- package/dist/hosts/mcp-config.js.map +1 -1
- package/dist/hosts/plan.d.ts +32 -0
- package/dist/hosts/plan.d.ts.map +1 -0
- package/dist/hosts/plan.js +67 -0
- package/dist/hosts/plan.js.map +1 -0
- package/dist/hosts/registry.d.ts.map +1 -1
- package/dist/hosts/registry.js +9 -0
- package/dist/hosts/registry.js.map +1 -1
- package/dist/mcp/instructions.d.ts +29 -0
- package/dist/mcp/instructions.d.ts.map +1 -0
- package/dist/mcp/instructions.js +55 -0
- package/dist/mcp/instructions.js.map +1 -0
- package/dist/mcp/server.d.ts +6 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +15 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +4 -2
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +144 -104
- package/dist/mcp/tools.js.map +1 -1
- package/dist/search/grep-cli.js +1 -1
- package/dist/search/grep.js +1 -1
- package/dist/util/state.d.ts +45 -0
- package/dist/util/state.d.ts.map +1 -0
- package/dist/util/state.js +121 -0
- package/dist/util/state.js.map +1 -0
- package/package.json +1 -1
package/dist/claude/hooks.js
CHANGED
|
@@ -34,14 +34,63 @@ export function underGraft(dir, file) {
|
|
|
34
34
|
const rel = file.startsWith(dir) ? file.slice(dir.length) : file;
|
|
35
35
|
return rel.replace(/^[/\\]+/, '').replace(/\\/g, '/').startsWith('graft/');
|
|
36
36
|
}
|
|
37
|
-
|
|
37
|
+
/** Default budget for a graft child process invoked from a hook, matching the 8s
|
|
38
|
+
* the installed hook entries carry. */
|
|
39
|
+
const CHILD_TIMEOUT_MS = 8000;
|
|
40
|
+
/** Headroom left for the hook's own work (read stdin, score, write session, emit)
|
|
41
|
+
* after its `graft ask` child returns. */
|
|
42
|
+
const HOOK_OVERHEAD_MS = 2000;
|
|
43
|
+
/** Floor, so a hand-edited tiny timeout can't leave the child no time at all. */
|
|
44
|
+
const MIN_CHILD_TIMEOUT_MS = 4000;
|
|
45
|
+
/**
|
|
46
|
+
* How long the prompt hook may let `graft ask` run — derived from the budget that is
|
|
47
|
+
* *actually installed* in this repo's `.claude/settings.json`, not from what the
|
|
48
|
+
* current version of `settings-merge.ts` would install.
|
|
49
|
+
*
|
|
50
|
+
* A query now brings the graph up to date first, so `graft init` raises the
|
|
51
|
+
* UserPromptSubmit budget to 15s to cover the one cold rebuild after an upgrade. But
|
|
52
|
+
* `mergeGraftSettings` only runs during `graft init` — upgrading the npm package does
|
|
53
|
+
* not re-run it. So every repo wired before that change keeps `"timeout": 8000`, and
|
|
54
|
+
* hard-coding a 13s child there means Claude Code kills the hook first: `emit()` and
|
|
55
|
+
* `writeSession()` never run, the turn gets no retrieval pack at all, and the SIGKILLed
|
|
56
|
+
* child can't even release the build lock. Reading the installed number keeps the child
|
|
57
|
+
* strictly inside whatever budget this repo really has.
|
|
58
|
+
*/
|
|
59
|
+
export function promptAskTimeout(dir) {
|
|
60
|
+
const installed = installedHookTimeout(dir, 'UserPromptSubmit');
|
|
61
|
+
if (installed === null)
|
|
62
|
+
return CHILD_TIMEOUT_MS - HOOK_OVERHEAD_MS;
|
|
63
|
+
return Math.max(MIN_CHILD_TIMEOUT_MS, installed - HOOK_OVERHEAD_MS);
|
|
64
|
+
}
|
|
65
|
+
/** The timeout on this repo's graft hook entry for `event`, or null if it can't be
|
|
66
|
+
* read (no settings file, hand-edited shape, unparseable JSON). */
|
|
67
|
+
function installedHookTimeout(dir, event) {
|
|
68
|
+
try {
|
|
69
|
+
const settings = JSON.parse(readFileSync(join(dir, '.claude', 'settings.json'), 'utf8'));
|
|
70
|
+
const blocks = settings?.hooks?.[event];
|
|
71
|
+
if (!Array.isArray(blocks))
|
|
72
|
+
return null;
|
|
73
|
+
for (const block of blocks) {
|
|
74
|
+
for (const h of block?.hooks ?? []) {
|
|
75
|
+
if (typeof h?.command === 'string' && h.command.includes('graft-hooks.cjs') && typeof h.timeout === 'number') {
|
|
76
|
+
return h.timeout;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function graftJson(dir, args, timeout = CHILD_TIMEOUT_MS) {
|
|
38
87
|
try {
|
|
39
88
|
// GRAFT_TEST_CLI is a test seam (mirrors GRAFT_TEST_STDIN/GRAFT_TEST_SYNC_RUN) so
|
|
40
89
|
// tests can point the prompt hook's `graft ask`/`graft check` calls at a stub
|
|
41
90
|
// script and observe the exact args it was invoked with, instead of shelling
|
|
42
91
|
// out to the real CLI (which isn't built relative to the TS source under test).
|
|
43
92
|
const cliPath = process.env.GRAFT_TEST_CLI ?? graftCliPath();
|
|
44
|
-
const out = execFileSync(process.execPath, [cliPath, ...args], { cwd: dir, encoding: 'utf8', timeout
|
|
93
|
+
const out = execFileSync(process.execPath, [cliPath, ...args], { cwd: dir, encoding: 'utf8', timeout, stdio: ['ignore', 'pipe', 'ignore'] });
|
|
45
94
|
return JSON.parse(out);
|
|
46
95
|
}
|
|
47
96
|
catch (e) {
|
|
@@ -198,7 +247,7 @@ export async function main(event) {
|
|
|
198
247
|
const scopeHint = lastFileScopeHint(dir, readStats(dir)?.lastFile);
|
|
199
248
|
if (scopeHint)
|
|
200
249
|
askArgs.push('--in', scopeHint);
|
|
201
|
-
const ask = graftJson(dir, askArgs);
|
|
250
|
+
const ask = graftJson(dir, askArgs, promptAskTimeout(dir));
|
|
202
251
|
if (!ask)
|
|
203
252
|
return;
|
|
204
253
|
const id = input.session_id || 'default';
|
package/dist/claude/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/claude/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE5D;;sCAEsC;AACtC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACtD,CAAC;AACD,SAAS,WAAW,KAAa,IAAI,CAAC;IAAC,OAAO,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC;AAAC,CAAC,CAAC,CAAC;AAE/F,SAAS,UAAU,CAAC,KAAU;IAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AACtE,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,IAAY;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC7E,CAAC;AACD,SAAS,SAAS,CAAC,GAAW,EAAE,IAAc;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/claude/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/claude/init.d.ts
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
import { type McpWrite } from '../hosts/mcp-config.js';
|
|
2
|
+
import type { PlannedWrite } from '../hosts/plan.js';
|
|
3
|
+
/**
|
|
4
|
+
* The files `runInit` writes — pure, no writes, so `--dry-run` and the picker
|
|
5
|
+
* can report them up front. All repo-local: the Claude Code layer never writes
|
|
6
|
+
* outside the project.
|
|
7
|
+
*/
|
|
8
|
+
export declare function claudeTargets(dir: string): PlannedWrite[];
|
|
9
|
+
/**
|
|
10
|
+
* Build the graph if it isn't there yet. Not Claude-specific: the wiring for any
|
|
11
|
+
* host points at `graft/`, so `graft init` builds whichever hosts were selected —
|
|
12
|
+
* this lives beside `runInit` only because that's the caller that owns `built`.
|
|
13
|
+
* Best-effort; the user can always run `graft build` (the epilogue says so).
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildGraphIfMissing(dir: string, opts: {
|
|
16
|
+
build?: boolean;
|
|
17
|
+
cliPath?: string;
|
|
18
|
+
}): boolean;
|
|
2
19
|
export interface InitResult {
|
|
3
20
|
settingsPath: string;
|
|
4
21
|
shims: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/claude/init.ts"],"names":[],"mappings":"AAOA,OAAO,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/claude/init.ts"],"names":[],"mappings":"AAOA,OAAO,EAA6B,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAWzD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CASrG;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,GAAG,EAAE,QAAQ,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,UAAU,CA+BjG"}
|
package/dist/claude/init.js
CHANGED
|
@@ -1,15 +1,50 @@
|
|
|
1
1
|
import { mkdirSync, writeFileSync, readFileSync, existsSync, chmodSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
3
|
import { execFileSync } from 'node:child_process';
|
|
4
4
|
import { mergeGraftSettings } from './settings-merge.js';
|
|
5
5
|
import { statuslineShim, hooksShim } from './shim-template.js';
|
|
6
6
|
import { skillTemplate } from './skill-template.js';
|
|
7
7
|
import { claudeDistDir } from './paths.js';
|
|
8
|
-
import { mergeJsonKey,
|
|
8
|
+
import { mergeJsonKey, serverEntry } from '../hosts/mcp-config.js';
|
|
9
|
+
/**
|
|
10
|
+
* The files `runInit` writes — pure, no writes, so `--dry-run` and the picker
|
|
11
|
+
* can report them up front. All repo-local: the Claude Code layer never writes
|
|
12
|
+
* outside the project.
|
|
13
|
+
*/
|
|
14
|
+
export function claudeTargets(dir) {
|
|
15
|
+
const t = (path, what, kind = 'claude') => ({ hostId: 'claude', id: 'claude', path, scope: 'repo', kind, what });
|
|
16
|
+
return [
|
|
17
|
+
t(join(dir, '.claude', 'settings.json'), 'graft statusline + hook blocks'),
|
|
18
|
+
t(join(dir, '.claude', 'helpers', 'graft-statusline.cjs'), 'statusline shim'),
|
|
19
|
+
t(join(dir, '.claude', 'helpers', 'graft-hooks.cjs'), 'hooks shim'),
|
|
20
|
+
t(join(dir, '.claude', 'skills', 'graft', 'SKILL.md'), 'graft skill'),
|
|
21
|
+
// Tagged 'mcp' so the picker doesn't label Claude Code as having no MCP.
|
|
22
|
+
t(join(dir, '.mcp.json'), 'mcpServers.graft', 'mcp'),
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build the graph if it isn't there yet. Not Claude-specific: the wiring for any
|
|
27
|
+
* host points at `graft/`, so `graft init` builds whichever hosts were selected —
|
|
28
|
+
* this lives beside `runInit` only because that's the caller that owns `built`.
|
|
29
|
+
* Best-effort; the user can always run `graft build` (the epilogue says so).
|
|
30
|
+
*/
|
|
31
|
+
export function buildGraphIfMissing(dir, opts) {
|
|
32
|
+
const wiring = join(dir, 'graft', '.graph', 'wiring.json');
|
|
33
|
+
if (opts.build === false || !opts.cliPath || existsSync(wiring))
|
|
34
|
+
return false;
|
|
35
|
+
try {
|
|
36
|
+
execFileSync(process.execPath, [opts.cliPath, 'build', '.'], { cwd: dir, stdio: 'inherit', timeout: 300000 });
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
9
43
|
export function runInit(dir, opts = {}) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
44
|
+
// Same list `--dry-run` and the picker report, so the two can't drift apart.
|
|
45
|
+
const [settings, statusline, hooks, skill, mcpTarget] = claudeTargets(dir).map((t) => t.path);
|
|
46
|
+
mkdirSync(dirname(statusline), { recursive: true });
|
|
47
|
+
const settingsPath = settings;
|
|
13
48
|
let existing = {};
|
|
14
49
|
try {
|
|
15
50
|
existing = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
@@ -17,8 +52,8 @@ export function runInit(dir, opts = {}) {
|
|
|
17
52
|
catch { /* none/invalid → start fresh */ }
|
|
18
53
|
const { merged, warnings } = mergeGraftSettings(existing);
|
|
19
54
|
writeFileSync(settingsPath, `${JSON.stringify(merged, null, 2)}\n`);
|
|
20
|
-
const sl =
|
|
21
|
-
const hk =
|
|
55
|
+
const sl = statusline;
|
|
56
|
+
const hk = hooks;
|
|
22
57
|
const bakedDir = claudeDistDir(); // absolute <pkg>/dist/claude — the shims' primary resolution path
|
|
23
58
|
writeFileSync(sl, statuslineShim(bakedDir));
|
|
24
59
|
chmodSync(sl, 0o755);
|
|
@@ -26,23 +61,14 @@ export function runInit(dir, opts = {}) {
|
|
|
26
61
|
chmodSync(hk, 0o755);
|
|
27
62
|
// Install the graft skill — the piece that redirects the agent to graft/ before it
|
|
28
63
|
// greps source. Overwritten each run (graft owns this file), like the shims above.
|
|
29
|
-
const
|
|
30
|
-
mkdirSync(
|
|
31
|
-
const skillPath = join(skillDir, 'SKILL.md');
|
|
64
|
+
const skillPath = skill;
|
|
65
|
+
mkdirSync(dirname(skillPath), { recursive: true });
|
|
32
66
|
writeFileSync(skillPath, skillTemplate());
|
|
33
67
|
// Register the graft MCP server in the project's .mcp.json so Claude Code
|
|
34
|
-
// exposes
|
|
68
|
+
// exposes graft_find_code/graft_trace_calls/etc. as tools — the same keyed merge the
|
|
35
69
|
// other hosts use (existing servers preserved; unparseable files skipped).
|
|
36
|
-
const mcp = mergeJsonKey('claude',
|
|
37
|
-
|
|
38
|
-
const wiring = join(dir, 'graft', '.graph', 'wiring.json');
|
|
39
|
-
if (opts.build !== false && opts.cliPath && !existsSync(wiring)) {
|
|
40
|
-
try {
|
|
41
|
-
execFileSync(process.execPath, [opts.cliPath, 'build', '.'], { cwd: dir, stdio: 'inherit', timeout: 300000 });
|
|
42
|
-
built = true;
|
|
43
|
-
}
|
|
44
|
-
catch { /* build best-effort; user can run `graft build` manually */ }
|
|
45
|
-
}
|
|
70
|
+
const mcp = mergeJsonKey('claude', mcpTarget, 'mcpServers', serverEntry());
|
|
71
|
+
const built = buildGraphIfMissing(dir, opts);
|
|
46
72
|
return { settingsPath, shims: [sl, hk], skill: skillPath, mcp, warnings, built };
|
|
47
73
|
}
|
|
48
74
|
//# sourceMappingURL=init.js.map
|
package/dist/claude/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/claude/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/claude/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-merge.d.ts","sourceRoot":"","sources":["../../src/claude/settings-merge.ts"],"names":[],"mappings":"AAAA,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings-merge.d.ts","sourceRoot":"","sources":["../../src/claude/settings-merge.ts"],"names":[],"mappings":"AAAA,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AA6ChC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,IAAI,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAiCvF"}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
const SL_CMD = 'node "${CLAUDE_PROJECT_DIR:-.}/.claude/helpers/graft-statusline.cjs"';
|
|
2
2
|
const FOOTER = 'graft/[\\w./-]+\\.md';
|
|
3
|
-
|
|
3
|
+
// Every form graft is actually invoked as. 'graft:*' covers a global install;
|
|
4
|
+
// the other two cover a repo working on graft itself (or any consumer running it
|
|
5
|
+
// from a checkout), where the binary is not on PATH under that name. A retrieval
|
|
6
|
+
// call that raises a permission prompt loses to grep, which never does.
|
|
7
|
+
const ALLOW_ENTRIES = [
|
|
8
|
+
'Bash(graft:*)',
|
|
9
|
+
'Bash(npx graft:*)',
|
|
10
|
+
'Bash(graft-dev:*)',
|
|
11
|
+
'Bash(node dist/cli.js:*)',
|
|
12
|
+
];
|
|
4
13
|
function hookCmd(arg) {
|
|
5
14
|
return `node "\${CLAUDE_PROJECT_DIR:-.}/.claude/helpers/graft-hooks.cjs" ${arg}`;
|
|
6
15
|
}
|
|
@@ -14,7 +23,15 @@ function graftBlocks() {
|
|
|
14
23
|
// is actually present, so non-graft Bash calls cost only a stdin read.
|
|
15
24
|
{ matcher: 'Bash|mcp__graft__', hooks: [{ type: 'command', command: hookCmd('tool-savings'), timeout: 8000 }] },
|
|
16
25
|
],
|
|
17
|
-
|
|
26
|
+
// Longer budget than the other hooks: its `graft ask` is a real query, and a
|
|
27
|
+
// query now brings the graph up to date first (graph/refresh.ts) — usually
|
|
28
|
+
// milliseconds, but the first one after an upgrade re-parses the repo once.
|
|
29
|
+
// `hooks.ts` reads this number back out of the installed settings.json at
|
|
30
|
+
// runtime and caps its `graft ask` child just under it, so a repo wired before
|
|
31
|
+
// this bump (8s) keeps a child that fits inside 8s. Changing the number here is
|
|
32
|
+
// therefore safe on its own — but it only reaches an existing repo when someone
|
|
33
|
+
// re-runs `graft init`, since that is the only caller of this function.
|
|
34
|
+
UserPromptSubmit: [{ hooks: [{ type: 'command', command: hookCmd('prompt'), timeout: 15000 }] }],
|
|
18
35
|
SessionStart: [{ hooks: [{ type: 'command', command: hookCmd('session-start'), timeout: 8000 }] }],
|
|
19
36
|
Stop: [{ hooks: [{ type: 'command', command: hookCmd('stop'), timeout: 8000 }] }],
|
|
20
37
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-merge.js","sourceRoot":"","sources":["../../src/claude/settings-merge.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,sEAAsE,CAAC;AACtF,MAAM,MAAM,GAAG,sBAAsB,CAAC;AACtC,MAAM,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"settings-merge.js","sourceRoot":"","sources":["../../src/claude/settings-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-template.d.ts","sourceRoot":"","sources":["../../src/claude/skill-template.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"skill-template.d.ts","sourceRoot":"","sources":["../../src/claude/skill-template.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,IAAI,MAAM,CAkJtC"}
|
|
@@ -80,9 +80,17 @@ hotspots, straight from the wiring graph.
|
|
|
80
80
|
or ask your way through every subsystem it lists. \`--max-dirs N\` widens it.
|
|
81
81
|
|
|
82
82
|
### 6 · Lifecycle: \`graft build\` / \`graft check\`
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
Every tool above refreshes the graph itself before answering, so what those tools
|
|
84
|
+
return always describes the code as it is right now — including edits you just made
|
|
85
|
+
and have not committed. You do **not** need to run \`build\` after editing.
|
|
86
|
+
|
|
87
|
+
One caveat, if you \`grep\` the markdown under \`graft/\` directly: those cards are a
|
|
88
|
+
projection, rebuilt at the end of the turn rather than on each query, so after an edit
|
|
89
|
+
they can lag. The tools above never do — prefer them, and treat a card's spans as
|
|
90
|
+
stale if you have edited that file this turn.
|
|
91
|
+
|
|
92
|
+
\`build\` is for the LLM layer (\`--deep\` adds a concept map; skip unless asked);
|
|
93
|
+
\`check\` fails when \`graft/\` is stale, for CI.
|
|
86
94
|
|
|
87
95
|
## Scenarios: the shortest path through a coding task
|
|
88
96
|
|
|
@@ -137,8 +145,8 @@ This is the per-turn figure; the statusline carries the running session total.
|
|
|
137
145
|
exhaustive where it matters, so reach for them first.
|
|
138
146
|
|
|
139
147
|
When the graft MCP server is connected, these are exposed as tools too:
|
|
140
|
-
\`
|
|
141
|
-
\`direction\` / \`depth\`), \`
|
|
148
|
+
\`graft_find_code\`, \`graft_find_all\`, \`graft_file_api\`, \`graft_trace_calls\` (with
|
|
149
|
+
\`direction\` / \`depth\`), \`graft_repo_map\`, \`graft_check_freshness\`. Use whichever surface is
|
|
142
150
|
available; the guidance is identical.
|
|
143
151
|
`;
|
|
144
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-template.js","sourceRoot":"","sources":["../../src/claude/skill-template.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,yFAAyF;AACzF,uFAAuF;AACvF,uFAAuF;AACvF,oCAAoC;AACpC,MAAM,UAAU,aAAa;IAC3B,OAAO
|
|
1
|
+
{"version":3,"file":"skill-template.js","sourceRoot":"","sources":["../../src/claude/skill-template.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,yFAAyF;AACzF,uFAAuF;AACvF,uFAAuF;AACvF,oCAAoC;AACpC,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgJR,CAAC;AACF,CAAC"}
|
package/dist/claude/state.d.ts
CHANGED
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
edgeCount: number;
|
|
4
|
-
languages: string[];
|
|
5
|
-
totalCount: number;
|
|
6
|
-
readyCount: number;
|
|
7
|
-
staleCount: number;
|
|
8
|
-
dirty: boolean;
|
|
9
|
-
syncing: boolean;
|
|
10
|
-
syncedAt: string | null;
|
|
11
|
-
lastFile: string | null;
|
|
12
|
-
}
|
|
1
|
+
export { LOCK_STALE_MS, acquireLock, acquireLockIn, releaseLockIn, cacheDir, emptyStats, patchStats, readStats, releaseLock, writeJsonAtomic, writeStats, } from '../util/state.js';
|
|
2
|
+
export type { Stats } from '../util/state.js';
|
|
13
3
|
export interface SessionState {
|
|
14
4
|
lastQuery: string | null;
|
|
15
5
|
perAgentQuery: Record<string, string>;
|
|
@@ -21,15 +11,10 @@ export interface SessionState {
|
|
|
21
11
|
* a hit whose pointer was shown once is never re-injected). Optional so
|
|
22
12
|
* session files written before this field still parse. */
|
|
23
13
|
injectedPointers?: string[];
|
|
14
|
+
/** Weak-match nudges spent this session, capped so the line stays signal.
|
|
15
|
+
* Optional for the same backwards-compatibility reason as above. */
|
|
16
|
+
nudges?: number;
|
|
24
17
|
}
|
|
25
|
-
export declare const LOCK_STALE_MS = 300000;
|
|
26
|
-
export declare function emptyStats(): Stats;
|
|
27
|
-
export declare function cacheDir(projectDir: string): string;
|
|
28
|
-
export declare function readStats(d: string): Stats | null;
|
|
29
|
-
export declare function writeStats(d: string, s: Stats): void;
|
|
30
|
-
export declare function patchStats(d: string, patch: Partial<Stats>): Stats;
|
|
31
18
|
export declare function readSession(d: string, id: string): SessionState;
|
|
32
19
|
export declare function writeSession(d: string, id: string, s: SessionState): void;
|
|
33
|
-
export declare function acquireLock(d: string): boolean;
|
|
34
|
-
export declare function releaseLock(d: string): void;
|
|
35
20
|
//# sourceMappingURL=state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/claude/state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/claude/state.ts"],"names":[],"mappings":"AASA,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,eAAe,EACf,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IACxC,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;IACpB;;8DAE0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;wEACoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAE/D;AACD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAEzE"}
|
package/dist/claude/state.js
CHANGED
|
@@ -1,83 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code session state. The shared `graft/.cache/` pieces (the statusline's
|
|
3
|
+
* `Stats` snapshot and the build lock) live in `../util/state.js` so the graph's
|
|
4
|
+
* pre-query auto-refresh can take the same lock; they are re-exported here so
|
|
5
|
+
* every existing import path keeps working.
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { cacheDir, readJson, writeJsonAtomic } from '../util/state.js';
|
|
9
|
+
export { LOCK_STALE_MS, acquireLock, acquireLockIn, releaseLockIn, cacheDir, emptyStats, patchStats, readStats, releaseLock, writeJsonAtomic, writeStats, } from '../util/state.js';
|
|
8
10
|
function emptySession() {
|
|
9
|
-
return { lastQuery: null, perAgentQuery: {}, graftReads: 0, sourceReads: 0, savedTokens: 0, injectedPointers: [] };
|
|
11
|
+
return { lastQuery: null, perAgentQuery: {}, graftReads: 0, sourceReads: 0, savedTokens: 0, injectedPointers: [], nudges: 0 };
|
|
10
12
|
}
|
|
11
|
-
export function cacheDir(projectDir) { return join(projectDir, 'graft', '.cache'); }
|
|
12
|
-
function statsPath(d) { return join(cacheDir(d), 'stats.json'); }
|
|
13
13
|
function sessionPath(d, id) { return join(cacheDir(d), 'session', `${id}.json`); }
|
|
14
|
-
function lockPath(d) { return join(cacheDir(d), '.sync.lock'); }
|
|
15
|
-
function readJson(p) {
|
|
16
|
-
try {
|
|
17
|
-
return JSON.parse(readFileSync(p, 'utf8'));
|
|
18
|
-
}
|
|
19
|
-
catch {
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
function writeJsonAtomic(p, value) {
|
|
24
|
-
mkdirSync(dirname(p), { recursive: true });
|
|
25
|
-
const tmp = `${p}.${process.pid}.tmp`;
|
|
26
|
-
writeFileSync(tmp, JSON.stringify(value, null, 2));
|
|
27
|
-
renameSync(tmp, p);
|
|
28
|
-
}
|
|
29
|
-
export function readStats(d) { return readJson(statsPath(d)); }
|
|
30
|
-
export function writeStats(d, s) { writeJsonAtomic(statsPath(d), s); }
|
|
31
|
-
// Best-effort read-modify-write; not atomic across concurrent processes, but acceptable
|
|
32
|
-
// for episodic hook writes (worst case is a lost update, not corruption).
|
|
33
|
-
export function patchStats(d, patch) {
|
|
34
|
-
const next = { ...(readStats(d) ?? emptyStats()), ...patch };
|
|
35
|
-
writeStats(d, next);
|
|
36
|
-
return next;
|
|
37
|
-
}
|
|
38
14
|
export function readSession(d, id) {
|
|
39
15
|
return readJson(sessionPath(d, id)) ?? emptySession();
|
|
40
16
|
}
|
|
41
17
|
export function writeSession(d, id, s) {
|
|
42
18
|
writeJsonAtomic(sessionPath(d, id), s);
|
|
43
19
|
}
|
|
44
|
-
export function acquireLock(d) {
|
|
45
|
-
const p = lockPath(d);
|
|
46
|
-
mkdirSync(cacheDir(d), { recursive: true });
|
|
47
|
-
const payload = JSON.stringify({ pid: process.pid, at: new Date().toISOString() });
|
|
48
|
-
try {
|
|
49
|
-
writeFileSync(p, payload, { flag: 'wx' }); // atomic exclusive create
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
catch (e) {
|
|
53
|
-
if (e?.code !== 'EEXIST')
|
|
54
|
-
throw e;
|
|
55
|
-
let stale;
|
|
56
|
-
try {
|
|
57
|
-
stale = Date.now() - statSync(p).mtimeMs >= LOCK_STALE_MS;
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
stale = true;
|
|
61
|
-
}
|
|
62
|
-
if (!stale)
|
|
63
|
-
return false;
|
|
64
|
-
try {
|
|
65
|
-
rmSync(p);
|
|
66
|
-
}
|
|
67
|
-
catch { /* another process reclaimed it */ }
|
|
68
|
-
try {
|
|
69
|
-
writeFileSync(p, payload, { flag: 'wx' });
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
catch (e2) {
|
|
73
|
-
if (e2?.code === 'EEXIST')
|
|
74
|
-
return false;
|
|
75
|
-
throw e2;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
export function releaseLock(d) { try {
|
|
80
|
-
rmSync(lockPath(d));
|
|
81
|
-
}
|
|
82
|
-
catch { /* already gone */ } }
|
|
83
20
|
//# sourceMappingURL=state.js.map
|
package/dist/claude/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/claude/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/claude/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEvE,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,eAAe,EACf,UAAU,GACX,MAAM,kBAAkB,CAAC;AAkB1B,SAAS,YAAY;IACnB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAChI,CAAC;AAED,SAAS,WAAW,CAAC,CAAS,EAAE,EAAU,IAAY,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAE1G,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,EAAU;IAC/C,OAAO,QAAQ,CAAe,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC;AACtE,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,EAAU,EAAE,CAAe;IACjE,eAAe,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { HostPlan, PlannedWrite } from './hosts/plan.js';
|
|
2
|
+
/** `/Users/me/.codex/x` → `~/.codex/x`, for display only. */
|
|
3
|
+
export declare function tilde(path: string, home: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* One-line summary of what selecting a host writes: repo-relative paths, then
|
|
6
|
+
* a count for anything landing outside the repo — those are the writes users
|
|
7
|
+
* can't see in `git status`, so they get named explicitly.
|
|
8
|
+
*/
|
|
9
|
+
export declare function describeWrites(writes: PlannedWrite[], repo: string, home: string, maxShown?: number): string;
|
|
10
|
+
export interface PickerRow {
|
|
11
|
+
id: string;
|
|
12
|
+
detected: boolean;
|
|
13
|
+
summary: string;
|
|
14
|
+
/** True when selecting this host writes outside the repo. */
|
|
15
|
+
hasGlobal: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface PickerState {
|
|
18
|
+
rows: PickerRow[];
|
|
19
|
+
cursor: number;
|
|
20
|
+
checked: ReadonlySet<string>;
|
|
21
|
+
done: boolean;
|
|
22
|
+
aborted: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** Claude Code starts checked — it's the deep integration — everything else off. */
|
|
25
|
+
export declare function initialPickerState(plan: HostPlan[], repo: string, home: string): PickerState;
|
|
26
|
+
export type PickerKey = 'up' | 'down' | 'space' | 'all' | 'enter' | 'abort';
|
|
27
|
+
export declare const KEY_UP = "\u001B[A";
|
|
28
|
+
export declare const KEY_DOWN = "\u001B[B";
|
|
29
|
+
export declare const KEY_ESC = "\u001B";
|
|
30
|
+
export declare const KEY_CTRL_C = "\u0003";
|
|
31
|
+
/** A single keypress → the key we act on, or null to ignore. */
|
|
32
|
+
export declare function keyOf(chunk: string): PickerKey | null;
|
|
33
|
+
/**
|
|
34
|
+
* Split a raw stdin chunk into keypresses. A terminal is free to batch bytes —
|
|
35
|
+
* held keys, pasted input, or a pty replaying a script all arrive as one chunk —
|
|
36
|
+
* so a chunk is a sequence, never a single key. CSI sequences (ESC '[' final)
|
|
37
|
+
* are consumed whole so an arrow key never reads as a bare ESC (i.e. abort).
|
|
38
|
+
*/
|
|
39
|
+
export declare function keysOf(chunk: string): PickerKey[];
|
|
40
|
+
export declare function reducePicker(state: PickerState, key: PickerKey): PickerState;
|
|
41
|
+
export declare function renderPicker(state: PickerState, tty?: boolean): string;
|
|
42
|
+
/** Ids in plan order, so output ordering never depends on toggle order. */
|
|
43
|
+
export declare function pickedIds(state: PickerState): string[];
|
|
44
|
+
/**
|
|
45
|
+
* Drive the picker on a real terminal. Resolves the chosen ids, or null if the
|
|
46
|
+
* user cancelled — in which case the caller must write nothing.
|
|
47
|
+
*/
|
|
48
|
+
export declare function runPicker(plan: HostPlan[], repo: string, home: string): Promise<string[] | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Shown when there's no TTY to prompt on and no flag saying what to wire.
|
|
51
|
+
* Writing nothing is deliberate: a scripted run shouldn't get files for every
|
|
52
|
+
* agent the machine happens to have installed.
|
|
53
|
+
*/
|
|
54
|
+
export declare function formatNonInteractiveHelp(detectedIds: string[]): string;
|
|
55
|
+
/**
|
|
56
|
+
* `--dry-run` output: every path init would touch, repo writes first, then a
|
|
57
|
+
* separate section for anything outside the repo.
|
|
58
|
+
*/
|
|
59
|
+
export declare function formatPlan(plan: HostPlan[], ids: string[], repo: string, home: string, tty?: boolean): string;
|
|
60
|
+
//# sourceMappingURL=cli-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-picker.d.ts","sourceRoot":"","sources":["../src/cli-picker.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM9D,6DAA6D;AAC7D,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAWD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EAAE,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAI,GACX,MAAM,CAiBR;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAa5F;AAED,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;AAE5E,eAAO,MAAM,MAAM,aAAW,CAAC;AAC/B,eAAO,MAAM,QAAQ,aAAW,CAAC;AACjC,eAAO,MAAM,OAAO,WAAS,CAAC;AAC9B,eAAO,MAAM,UAAU,WAAS,CAAC;AAEjC,gEAAgE;AAChE,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAUrD;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAkBjD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,GAAG,WAAW,CAsB5E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,UAAO,GAAG,MAAM,CAqBnE;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CAEtD;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,QAAQ,EAAE,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAiD1B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAmBtE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,EAAE,EAChB,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,UAAgC,GAClC,MAAM,CA4BR"}
|