@nanonets/graft 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +93 -52
  2. package/dist/ai/llm/types.d.ts +2 -2
  3. package/dist/ai/llm/types.js +1 -1
  4. package/dist/ask/ask.d.ts +49 -1
  5. package/dist/ask/ask.d.ts.map +1 -1
  6. package/dist/ask/ask.js +270 -68
  7. package/dist/ask/ask.js.map +1 -1
  8. package/dist/ask/fuse.d.ts +59 -17
  9. package/dist/ask/fuse.d.ts.map +1 -1
  10. package/dist/ask/fuse.js +51 -25
  11. package/dist/ask/fuse.js.map +1 -1
  12. package/dist/ask/graphrank.d.ts +6 -0
  13. package/dist/ask/graphrank.d.ts.map +1 -1
  14. package/dist/ask/graphrank.js +5 -1
  15. package/dist/ask/graphrank.js.map +1 -1
  16. package/dist/claude/format.d.ts +0 -1
  17. package/dist/claude/format.d.ts.map +1 -1
  18. package/dist/claude/format.js +18 -21
  19. package/dist/claude/format.js.map +1 -1
  20. package/dist/claude/hooks.d.ts +16 -0
  21. package/dist/claude/hooks.d.ts.map +1 -1
  22. package/dist/claude/hooks.js +79 -2
  23. package/dist/claude/hooks.js.map +1 -1
  24. package/dist/claude/settings-merge.d.ts.map +1 -1
  25. package/dist/claude/settings-merge.js +13 -6
  26. package/dist/claude/settings-merge.js.map +1 -1
  27. package/dist/claude/skill-template.d.ts.map +1 -1
  28. package/dist/claude/skill-template.js +117 -76
  29. package/dist/claude/skill-template.js.map +1 -1
  30. package/dist/cli-epilogue.js +1 -1
  31. package/dist/cli-epilogue.js.map +1 -1
  32. package/dist/cli.d.ts +3 -15
  33. package/dist/cli.d.ts.map +1 -1
  34. package/dist/cli.js +79 -45
  35. package/dist/cli.js.map +1 -1
  36. package/dist/context/node-file.d.ts +10 -0
  37. package/dist/context/node-file.d.ts.map +1 -1
  38. package/dist/context/node-file.js +34 -1
  39. package/dist/context/node-file.js.map +1 -1
  40. package/dist/context/savings.d.ts +6 -0
  41. package/dist/context/savings.d.ts.map +1 -1
  42. package/dist/context/savings.js +9 -1
  43. package/dist/context/savings.js.map +1 -1
  44. package/dist/engine.d.ts +1 -0
  45. package/dist/engine.d.ts.map +1 -1
  46. package/dist/engine.js +7 -1
  47. package/dist/engine.js.map +1 -1
  48. package/dist/graph/build.d.ts.map +1 -1
  49. package/dist/graph/build.js +37 -1
  50. package/dist/graph/build.js.map +1 -1
  51. package/dist/graph/map.d.ts +34 -2
  52. package/dist/graph/map.d.ts.map +1 -1
  53. package/dist/graph/map.js +107 -23
  54. package/dist/graph/map.js.map +1 -1
  55. package/dist/graph/types.d.ts +12 -0
  56. package/dist/graph/types.d.ts.map +1 -1
  57. package/dist/graph/workspace-cli.d.ts +37 -0
  58. package/dist/graph/workspace-cli.d.ts.map +1 -0
  59. package/dist/graph/workspace-cli.js +74 -0
  60. package/dist/graph/workspace-cli.js.map +1 -0
  61. package/dist/graph/workspace.d.ts +116 -124
  62. package/dist/graph/workspace.d.ts.map +1 -1
  63. package/dist/graph/workspace.js +353 -297
  64. package/dist/graph/workspace.js.map +1 -1
  65. package/dist/hosts/instructions.d.ts.map +1 -1
  66. package/dist/hosts/instructions.js +3 -0
  67. package/dist/hosts/instructions.js.map +1 -1
  68. package/dist/mcp/tools.d.ts.map +1 -1
  69. package/dist/mcp/tools.js +61 -1
  70. package/dist/mcp/tools.js.map +1 -1
  71. package/package.json +1 -2
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/claude/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/claude/hooks.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;AAqBhC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,IAAI,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAiCvF"}
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;AA4BhC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,IAAI,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAiCvF"}
@@ -6,10 +6,17 @@ function hookCmd(arg) {
6
6
  }
7
7
  function graftBlocks() {
8
8
  return {
9
- PostToolUse: { matcher: 'Write|Edit|MultiEdit', hooks: [{ type: 'command', command: hookCmd('post-edit'), timeout: 10000 }] },
10
- UserPromptSubmit: { hooks: [{ type: 'command', command: hookCmd('prompt'), timeout: 8000 }] },
11
- SessionStart: { hooks: [{ type: 'command', command: hookCmd('session-start'), timeout: 8000 }] },
12
- Stop: { hooks: [{ type: 'command', command: hookCmd('stop'), timeout: 8000 }] },
9
+ PostToolUse: [
10
+ { matcher: 'Write|Edit|MultiEdit', hooks: [{ type: 'command', command: hookCmd('post-edit'), timeout: 10000 }] },
11
+ // A retrieval tool (CLI `graft …` via Bash, or the `graft_*` MCP tools) prints a
12
+ // `[graft] tokens saved ≈ N` footer; this hook sums it into the session total the
13
+ // statusline shows. Broad matcher, but the handler no-ops instantly unless a footer
14
+ // is actually present, so non-graft Bash calls cost only a stdin read.
15
+ { matcher: 'Bash|mcp__graft__', hooks: [{ type: 'command', command: hookCmd('tool-savings'), timeout: 8000 }] },
16
+ ],
17
+ UserPromptSubmit: [{ hooks: [{ type: 'command', command: hookCmd('prompt'), timeout: 8000 }] }],
18
+ SessionStart: [{ hooks: [{ type: 'command', command: hookCmd('session-start'), timeout: 8000 }] }],
19
+ Stop: [{ hooks: [{ type: 'command', command: hookCmd('stop'), timeout: 8000 }] }],
13
20
  };
14
21
  }
15
22
  function isGraftHookEntry(entry) {
@@ -27,10 +34,10 @@ export function mergeGraftSettings(existing) {
27
34
  else if (merged.subagentStatusLine.command !== SL_CMD)
28
35
  warnings.push('Existing subagentStatusLine left untouched.');
29
36
  merged.hooks = { ...(merged.hooks ?? {}) };
30
- for (const [event, block] of Object.entries(graftBlocks())) {
37
+ for (const [event, blocks] of Object.entries(graftBlocks())) {
31
38
  const prior = Array.isArray(merged.hooks[event]) ? merged.hooks[event] : [];
32
39
  const foreign = prior.filter((e) => !isGraftHookEntry(e)); // drop old Graft entries → idempotent
33
- merged.hooks[event] = [...foreign, block];
40
+ merged.hooks[event] = [...foreign, ...blocks];
34
41
  }
35
42
  const footer = Array.isArray(merged.footerLinksRegexes) ? [...merged.footerLinksRegexes] : [];
36
43
  if (!footer.includes(FOOTER))
@@ -1 +1 @@
1
- {"version":3,"file":"settings-merge.js","sourceRoot":"","sources":["../../src/claude/settings-merge.ts"],"names":[],"mappings":"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"}
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,CAkFtC"}
1
+ {"version":3,"file":"skill-template.d.ts","sourceRoot":"","sources":["../../src/claude/skill-template.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,IAAI,MAAM,CA2HtC"}
@@ -1,89 +1,130 @@
1
1
  // The graft Claude Code skill, bundled as a string so `graft init` can write it into a
2
- // consumer repo's .claude/skills/graft/SKILL.md — no network fetch, version-locked to the
3
- // installed graft. This is the single source of truth for the skill text; graft's own
2
+ // consumer repo's .claude/skills/graft/SKILL.md (no network fetch, version-locked to the
3
+ // installed graft). This is the single source of truth for the skill text; graft's own
4
4
  // repo copy is regenerated from here when `init` runs in this repo. Mirrors the `.cjs`
5
5
  // shim pattern in shim-template.ts.
6
6
  export function skillTemplate() {
7
7
  return `---
8
8
  name: graft
9
- description: This repo is indexed by graft/. For ANY task here — understanding
10
- how something works, finding where code lives, or scoping a change — get your
11
- context from graft before grepping or reading source files.
9
+ description: This repo is indexed by graft/. For ANY task here, whether
10
+ understanding how something works, finding where code lives, tracing what
11
+ calls a symbol or what a change breaks, or scoping an edit, get your context
12
+ from graft before grepping or reading source files.
12
13
  ---
13
14
 
14
15
  # graft
15
16
 
16
- This repo's code is summarised in \`graft/\` — small markdown nodes, each
17
- explaining one part in plain prose and naming the exact files and line-spans it
18
- covers. Reading a node costs a few hundred tokens; reading source to rebuild the
19
- same understanding costs thousands.
20
-
21
- **Choose the graft tool by task shape — pick the one that answers in a single call:**
22
-
23
- - **Locate / understand / "how does X work"** → \`graft ask "<task>" --source\` —
24
- ranked nodes with the code inlined (\`--source\` gives each hit's ≤8-line crux;
25
- add \`--full\` only if the crux isn't enough). For a genuinely multi-part
26
- question, ask once per distinct sub-aspect. **But if an ask returns few or
27
- weak hits, do NOT re-ask with reworded phrasings — switch tool** (below). The
28
- ask output tells you when to switch.
29
- - **Every occurrence / "all the X" / a symbol or literal everywhere** →
30
- \`graft grep "<literal>"\` — exhaustive, grouped by enclosing symbol. Ranked
31
- ask is top-N and WILL miss instances; grep is the tool for "find them all".
32
- - **A file's whole API surface** → \`graft skeleton <file>\` — every signature in
33
- ~200 tokens. One call beats several asks when you just need "what's in here".
34
- - **Who uses / what breaks if I change X** → \`graft callers <symbol>\` (add
35
- \`--depth N\` to walk transitively for the full blast radius); what X itself
36
- depends on → \`graft callers <symbol> --direction out\`. Run one before
37
- editing a symbol.
38
- - **First contact with an unfamiliar repo** → \`graft map\` — token-budgeted
39
- orientation (dir clusters, hubs, hotspots). Read the hub cards it names rather
40
- than asking per subsystem.
41
-
42
- You can also grep / ls / cat inside \`graft/\` directly (the nodes are plain
43
- markdown; \`graft/INDEX.md\` lists them) — but the commands above are faster and
44
- exhaustive where it matters, so reach for them first.
45
-
46
- **Match the tool to the task shape:**
47
-
48
- - **Understanding, explaining, locating where a change goes** — the node IS the
49
- answer. Cite files and functions straight from its \`covers:\` list — it gives
50
- the exact \`file:line\` for every symbol, so you can cite precisely without
51
- opening the source. The spans are generated from that source and are
52
- authoritative; don't re-open files just to "double-check" them.
53
- - **Editing:** run \`graft ask "<symbol>" --source\` to pull the exact span's
54
- code inline, and edit straight from that. Touch the file only to apply the
55
- change at the named \`file:line\` — never read the whole file to get oriented;
56
- the pack already oriented you.
57
- - **Exhaustive tasks — "every occurrence / every provider / every caller of
58
- this pattern":** ranked results are top-N, not a complete list. Run
59
- \`graft grep "<literal>"\` instead — it's exhaustive over every indexed file,
60
- grouped by enclosing symbol, and tells you what it couldn't see (unreadable
61
- or unindexed files). Fall back to raw \`grep -rn\` only for files graft
62
- doesn't index (docs, configs, new files). Ask alone will miss instances;
63
- that is expected, not a graft failure.
64
-
65
- **Precise graph modes** — for structural questions, skip ranking and go
66
- straight to precomputed edges. It's all one command, \`graft callers\`:
67
-
68
- - \`graft callers <symbol>\` — who calls/references this (exact edges, not text);
69
- structural phrasing inside ask ("who calls X") routes here too.
70
- - \`graft callers <symbol> --direction out\` — the reverse: what this symbol
71
- itself calls/depends on (the old \`callees\`).
72
- - \`graft callers <symbol> --depth N\` — walk transitively out to depth N for the
73
- full blast radius of a change (the old \`impact\`).
74
-
75
- When the graft MCP server is connected, the same operations are exposed as
76
- tools — \`graft_ask\`, \`graft_callers\` (with \`direction\`/\`depth\`),
77
- \`graft_grep\`, \`graft_skeleton\`, \`graft_map\` — prefer whichever surface is
78
- available.
79
-
80
- If a returned span is truncated ("+N more lines"), open the file at that exact
81
- range before finalizing.
82
-
83
- If a node genuinely lacks a detail you need, ask for a more specific node, and
84
- if it still lacks it, read the source — at the exact file:line the node points
85
- to, not the whole file. Reading whole source files to build understanding is
86
- the thing graft exists to replace.
17
+ \`graft/\` holds a graph of this repo: small markdown nodes that each explain one
18
+ part in prose and name the exact \`file:line\` spans they cover, plus a wiring
19
+ graph of who-calls-what. Querying a node costs a few hundred tokens; rebuilding
20
+ that understanding by reading source costs thousands, and misses the edges.
21
+
22
+ Every command below is \`$0\`, needs no API key, and returns in under a second.
23
+ There are six of them. **Pick the one that fits the task, run it, act on the
24
+ answer; don't chain tools hoping for more. Most tasks need one call.**
25
+
26
+ ## The tools
27
+
28
+ ### 1 · \`graft ask "<question>" --source\`: locate + understand (the default)
29
+ Ranked retrieval over the graph, routed automatically between prose nodes and
30
+ the wiring graph, returning the top hits with exact \`file:line\`.
31
+ - \`--source\` inlines the code at each hit, the ≤8-line **crux** of each
32
+ definition, so the result IS the code you need, no follow-up file read. Add
33
+ \`--full\` only when the crux is too small to act on.
34
+ - \`--in <path>\` narrows to a subtree before ranking; \`-n N\` caps results (default 8).
35
+ - **Use it when** the question is conceptual or locational: "how does auth
36
+ work", "where is rate-limiting handled", "what assembles the request pipeline".
37
+ - One ask usually answers. A genuinely multi-part question needs one ask per
38
+ distinct sub-aspect, never the same question reworded. Few or weak hits mean
39
+ switch tool (grep / skeleton / callers), don't re-ask.
40
+
41
+ ### 2 · \`graft grep "<pattern>"\`: exhaustive find
42
+ Regex (or \`--fixed\` for a literal) over every indexed file, hits **grouped by
43
+ enclosing symbol** and ranked by coupling; it also reports files it couldn't read.
44
+ - **Use it when** you need every occurrence: all call sites, all uses of a
45
+ constant, all providers. \`ask\` is ranked top-N and *will* miss instances;
46
+ grep won't. One grep replaces a spray of asks.
47
+ - \`-i\` case-insensitive; \`--in <path>\` scopes to a subtree. Fall back to raw
48
+ \`grep -rn\` only for files graft doesn't index (docs, configs, new files).
49
+
50
+ ### 3 · \`graft skeleton <file>\`: a file's API at a glance
51
+ Signatures-only view of one file (every function / method / type with its span)
52
+ in ~200 tokens, ~10x cheaper than reading the file.
53
+ - **Use it when** you need "what's in this file / what can I call here" before
54
+ editing or wiring into it. One skeleton is the whole answer for a file; don't
55
+ re-skeleton the same file, and don't skeleton every file \`map\` already named.
56
+
57
+ ### 4 · \`graft callers <symbol>\`: the exact edges
58
+ Precomputed call/reference edges, not a text search. Symbol can be bare
59
+ (\`Foo\`), qualified (\`Class.method\`), or package-qualified (\`pkg.Fn\`).
60
+ - default \`--direction in\`: **who calls/references** this; run before you
61
+ rename, delete, or change its signature.
62
+ - \`--direction out\`: **what this symbol itself calls/depends on** (the old \`callees\`).
63
+ - \`--depth N\`: walk transitively N hops for the **full blast radius** (the old
64
+ \`impact\`); \`--depth 2\` is the usual "what breaks if I touch this".
65
+
66
+ ### 5 · \`graft map\`: orientation for an unfamiliar repo or area
67
+ A token-budgeted tour: directory clusters, per-directory hubs, and global
68
+ hotspots, straight from the wiring graph.
69
+ - **Use it when** you land in a repo cold or are asked for "the architecture".
70
+ \`map\` alone is the answer: read the hub cards it names; do NOT then skeleton
71
+ or ask your way through every subsystem it lists. \`--max-dirs N\` widens it.
72
+
73
+ ### 6 · Lifecycle: \`graft build\` / \`graft check\`
74
+ \`build\` regenerates the graph after code changes (\`$0\`; \`--deep\` adds an LLM
75
+ concept map, skip unless asked). \`check\` fails when \`graft/\` is stale (for CI).
76
+ You rarely touch these mid-task; the graph is already built and committed.
77
+
78
+ ## Scenarios: the shortest path through a coding task
79
+
80
+ | When you're… | Reach for | Calls |
81
+ |---|---|---|
82
+ | Onboarding / "explain this codebase" | \`graft map\`, then read the named hub cards | 1 |
83
+ | Understanding a flow ("how does X work") | \`graft ask "<flow>" --source\` | 1 |
84
+ | Finding where a change belongs | \`graft ask "where is <behavior>" --source\` | 1 |
85
+ | Editing a known symbol | \`graft ask "<symbol>" --source\`, edit at the \`file:line\` | 1 |
86
+ | Renaming / deleting / changing a signature | \`graft callers <sym> --depth 2\` first | 1 |
87
+ | "What does this depend on?" | \`graft callers <sym> --direction out\` | 1 |
88
+ | Finding every occurrence of a pattern | \`graft grep "<literal>"\` | 1 |
89
+ | "What's the API of this file?" | \`graft skeleton <file>\` | 1 |
90
+ | Debugging a failure in area X | \`graft ask "<symptom>" --source\`, then \`callers\` on the suspect | 1–2 |
91
+ | Judging a diff's risk before merge | \`graft callers <changed sym> --depth 2\` | 1 / symbol |
92
+ | Working inside one repo of a monorepo | add \`--in <scope>/\` to ask / grep / callers | n/a |
93
+
94
+ In a multi-repo workspace, graft ranks fairly so the biggest repo can't drown
95
+ the rest, and every hit carries a \`[scope/]\` label naming its sub-project; when
96
+ you already know where you're working, narrow with \`graft ask "<task>" --in <scope>/\`.
97
+
98
+ ## Spend the fewest calls
99
+ - A node's \`covers:\` list already gives exact \`file:line\` for every symbol, so
100
+ cite straight from it. The spans are generated from source and authoritative;
101
+ don't re-open or re-grep files to "double-check".
102
+ - When editing, pull the span with \`graft ask "<symbol>" --source\` and edit at
103
+ that \`file:line\`; never read the whole file to orient, the pack did that.
104
+ - Trust the answer and act. Reach for a second tool only when the first genuinely
105
+ fell short: weak hits, a truncated span, or a need to be exhaustive.
106
+
107
+ ## Report what graft saved, every turn
108
+ Each retrieval tool ends its output with a \`[graft] tokens saved ≈ N\` line: the
109
+ estimated tokens that call saved versus reading the files it covers whole.
110
+ Whenever you used any graft tool in a turn, close your reply with a one-line
111
+ tally summing those numbers across every graft call you made, e.g.
112
+ \`🌱 graft saved ~12,400 tokens this turn (3 calls)\`. A call with no footer (tiny
113
+ files, where the pointers cost as much as the source) saved nothing, so skip it.
114
+ This is the per-turn figure; the statusline carries the running session total.
115
+
116
+ ## When graft isn't enough
117
+ - Span truncated ("+N more lines"): open the file at that exact range.
118
+ - A node lacks a detail: ask a more specific question; only then read source at
119
+ the exact \`file:line\`, never a whole file to rebuild understanding graft gives.
120
+ - You may also grep / ls / cat inside \`graft/\` directly (plain markdown;
121
+ \`graft/INDEX.md\` indexes the nodes), but the tools above are faster and
122
+ exhaustive where it matters, so reach for them first.
123
+
124
+ When the graft MCP server is connected, these are exposed as tools too:
125
+ \`graft_ask\`, \`graft_grep\`, \`graft_skeleton\`, \`graft_callers\` (with
126
+ \`direction\` / \`depth\`), \`graft_map\`, \`graft_check\`. Use whichever surface is
127
+ available; the guidance is identical.
87
128
  `;
88
129
  }
89
130
  //# sourceMappingURL=skill-template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-template.js","sourceRoot":"","sources":["../../src/claude/skill-template.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,0FAA0F;AAC1F,sFAAsF;AACtF,uFAAuF;AACvF,oCAAoC;AACpC,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFR,CAAC;AACF,CAAC"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyHR,CAAC;AACF,CAAC"}
@@ -55,7 +55,7 @@ export function formatInitEpilogue(opts) {
55
55
  stepLines.push(" ".repeat(columnWidth) + extra);
56
56
  }
57
57
  });
58
- const closing = `${indent}when it clicks: git add graft .claude && git commit — every teammate's agent gets the map`;
58
+ const closing = `${indent}share it: git add .claude && git commit — teammates run \`graft build\` for their own local graph`;
59
59
  return [...wordmark, "", ...stepLines, "", closing].join("\n");
60
60
  }
61
61
  //# sourceMappingURL=cli-epilogue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-epilogue.js","sourceRoot":"","sources":["../src/cli-epilogue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yEAAyE;AACzE,iDAAiD;AACjD,MAAM,cAAc,GAAG;IACrB,yBAAyB;IACzB,2BAA2B;IAC3B,4BAA4B;IAC5B,2BAA2B;IAC3B,+BAA+B;IAC/B,SAAS;CACV,CAAC;AACF,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,0EAA0E;AAC1E,2EAA2E;AAC3E,gDAAgD;AAChD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC;AACjE,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;AAkBzD;8DAC8D;AAC9D,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IAC1D,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,UAAU,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC;QAClG,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3D,CAAC;IAED,MAAM,KAAK,GAAW;QACpB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;QAC7E,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,4CAA4C,EAAE;QACtF;YACE,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,iDAAiD;YAC1D,KAAK,EAAE,CAAC,+BAA+B,CAAC;SACzC;QACD;YACE,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,qEAAqE;SAC/E;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,GAAG,GAAG,IAAI,CAAC;IACjB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC;IAE5D,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAC/C,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YAClC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,GAAG,MAAM,2FAA2F,CAAC;IAErH,OAAO,CAAC,GAAG,QAAQ,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC"}
1
+ {"version":3,"file":"cli-epilogue.js","sourceRoot":"","sources":["../src/cli-epilogue.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -1,20 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * `graft` CLI. Commands:
4
- *
5
- * build build graft/ from your code (structural graph; --deep adds LLM summaries).
6
- * ask query the graph ($0, no LLM).
7
- * check fail if graft/ has drifted from the code — for CI.
8
- * viz serve the interactive graph viewer.
9
- * mcp serve the graph over MCP (stdio) for coding agents.
10
- * callers precise graph traversal for a symbol ($0, no LLM); --direction out = callees, --depth N = blast radius.
11
- * skeleton signatures-only view of one file ($0, no LLM).
12
- * grep regex search over indexed files, grouped by enclosing symbol, ranked by coupling ($0, no LLM).
13
- * map token-budgeted repo orientation — dir clusters, hubs, hotspots ($0, no LLM).
14
- * init set up the Claude Code integration (.claude/ statusline + hooks + MCP) in this repo.
15
- *
16
- * Git is the sync: commit graft/ and anyone who clones the repo has the
17
- * graph, with no setup.
3
+ * `graft` CLI. Commands: build, ask, check, viz, mcp, callers, skeleton, grep,
4
+ * map, init. Git is the sync: commit graft/ and a clone has the graph. A
5
+ * workspace parent (≥2 git children) federates query commands across children.
18
6
  */
19
7
  import "dotenv/config";
20
8
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,eAAe,CAAC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,eAAe,CAAC"}
package/dist/cli.js CHANGED
@@ -1,20 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * `graft` CLI. Commands:
4
- *
5
- * build build graft/ from your code (structural graph; --deep adds LLM summaries).
6
- * ask query the graph ($0, no LLM).
7
- * check fail if graft/ has drifted from the code — for CI.
8
- * viz serve the interactive graph viewer.
9
- * mcp serve the graph over MCP (stdio) for coding agents.
10
- * callers precise graph traversal for a symbol ($0, no LLM); --direction out = callees, --depth N = blast radius.
11
- * skeleton signatures-only view of one file ($0, no LLM).
12
- * grep regex search over indexed files, grouped by enclosing symbol, ranked by coupling ($0, no LLM).
13
- * map token-budgeted repo orientation — dir clusters, hubs, hotspots ($0, no LLM).
14
- * init set up the Claude Code integration (.claude/ statusline + hooks + MCP) in this repo.
15
- *
16
- * Git is the sync: commit graft/ and anyone who clones the repo has the
17
- * graph, with no setup.
3
+ * `graft` CLI. Commands: build, ask, check, viz, mcp, callers, skeleton, grep,
4
+ * map, init. Git is the sync: commit graft/ and a clone has the graph. A
5
+ * workspace parent (≥2 git children) federates query commands across children.
18
6
  */
19
7
  import "dotenv/config";
20
8
  import { Command } from "commander";
@@ -29,6 +17,8 @@ import { runHostsInit } from "./hosts/init.js";
29
17
  import { hostIds } from "./hosts/registry.js";
30
18
  import { contextDirFor } from "./context/node-file.js";
31
19
  import { loadGraphCached } from "./graph/load.js";
20
+ import { isWorkspaceBuildRoot, readWorkspace } from "./graph/workspace.js";
21
+ import { runWorkspaceAsk, runWorkspaceBuild, runWorkspaceCallers, runWorkspaceCheck, runWorkspaceGrep, runWorkspaceMap, } from "./graph/workspace-cli.js";
32
22
  import { formatInitEpilogue } from "./cli-epilogue.js";
33
23
  import { formatUpgradeReport, formatVersionReport, getNpmViewVersion, readCurrentVersion, runUpgrade } from "./cli-meta.js";
34
24
  const program = new Command();
@@ -53,9 +43,7 @@ function cliConfig() {
53
43
  baseUrl: o.baseUrl,
54
44
  };
55
45
  }
56
- function engineFrom() {
57
- return new Graft(cliConfig());
58
- }
46
+ const engineFrom = () => new Graft(cliConfig());
59
47
  program
60
48
  .command("version")
61
49
  .description("Print the installed version and the latest published on npm")
@@ -91,8 +79,7 @@ program
91
79
  .sort((a, b) => b[1] - a[1])
92
80
  .map(([k, n]) => `${n} ${k}`)
93
81
  .join(", ");
94
- // --deep needs a key; without one, degrade to the $0 structural build
95
- // rather than failing — the wiring graph is still worth having.
82
+ // --deep needs a key; without one, degrade to the $0 structural build.
96
83
  let deep = opts.deep;
97
84
  const resolved = resolveConfig(cliConfig());
98
85
  if (deep && !resolved.apiKey) {
@@ -104,8 +91,20 @@ program
104
91
  if (deep && resolved.usedLegacyEnv) {
105
92
  console.error("⚠ using OPENROUTER_API_KEY (deprecated) — prefer GRAFT_API_KEY + GRAFT_BASE_URL.");
106
93
  }
107
- // --deep: concept nodes first (they're LLM prose; the wiring cards link up to
108
- // them), then the wiring graph rewrites the cards + INDEX with those up-links.
94
+ // Workspace parent: build each child into its OWN graft/ + a workspace index.
95
+ const buildRoot = resolve(dir);
96
+ const buildGlobalDir = program.opts().dir;
97
+ if (isWorkspaceBuildRoot(buildRoot, buildGlobalDir)) {
98
+ await runWorkspaceBuild(buildRoot, {
99
+ deep: !!deep,
100
+ extensions: opts.extensions,
101
+ concurrency,
102
+ childConfig: cliConfig(),
103
+ override: buildGlobalDir,
104
+ });
105
+ return;
106
+ }
107
+ // --deep: concept nodes first, then the wiring graph links cards up to them.
109
108
  if (deep) {
110
109
  const c = await engine.init(dir, {
111
110
  extensions: opts.extensions,
@@ -116,7 +115,7 @@ program
116
115
  for (const e of c.errors)
117
116
  console.error(`✗ ${e}`);
118
117
  }
119
- // Wiring graph (Tier-2 cards + Tier-3 wiring.json) — always. LLM meaning only with --deep.
118
+ // Wiring graph — always; LLM meaning only with --deep.
120
119
  const g = await engine.graph(dir, {
121
120
  llm: deep,
122
121
  concurrency,
@@ -132,7 +131,7 @@ program
132
131
  for (const e of g.errors)
133
132
  console.error(`✗ ${e}`);
134
133
  const rel = relative(process.cwd(), g.contextDir) || "graft";
135
- console.log(` commit it: git add ${rel} && git commit -m "update graft"`);
134
+ console.log(` ${rel}/ is git-ignored (added automatically) — a local cache; teammates run \`graft build\` to get their own.`);
136
135
  });
137
136
  program
138
137
  .command("ask")
@@ -142,10 +141,26 @@ program
142
141
  .option("-n, --limit <n>", "max results", "8")
143
142
  .option("--source", "inline the source at each file:line hit (retriever mode — the pack IS the answer, no need to re-open files)")
144
143
  .option("--full", "with --source: inline whole definition spans instead of the default ≤8-line crux excerpts")
144
+ .option("--in <path>", "narrow to nodes under this path prefix, filtered before scoring (segment-aware, like scopeOf)")
145
145
  .option("--json", "output the result as JSON")
146
146
  .action(async (query, dir, opts) => {
147
+ const askGlobalDir = program.opts().dir;
148
+ if (readWorkspace(resolve(dir), askGlobalDir)) {
149
+ runWorkspaceAsk(resolve(dir), askGlobalDir, query, {
150
+ limit: Number(opts.limit), source: opts.source, full: opts.full, in: opts.in, json: opts.json,
151
+ });
152
+ return;
153
+ }
147
154
  const engine = engineFrom();
148
- const r = engine.ask(dir, query, { limit: Number(opts.limit), source: opts.source, full: opts.full });
155
+ let r;
156
+ try {
157
+ r = engine.ask(dir, query, { limit: Number(opts.limit), source: opts.source, full: opts.full, in: opts.in });
158
+ }
159
+ catch (err) {
160
+ console.error(`✗ ${err instanceof Error ? err.message : String(err)}`);
161
+ process.exit(1);
162
+ return;
163
+ }
149
164
  if (opts.json) {
150
165
  console.log(JSON.stringify(r, null, 2));
151
166
  }
@@ -176,14 +191,17 @@ program
176
191
  .option("-e, --extensions <exts...>", "code extensions to include")
177
192
  .option("--json", "output the drift as JSON")
178
193
  .action((dir, opts) => {
194
+ const checkGlobalDir = program.opts().dir;
195
+ if (readWorkspace(resolve(dir), checkGlobalDir)) {
196
+ runWorkspaceCheck(resolve(dir), checkGlobalDir);
197
+ return;
198
+ }
179
199
  const engine = engineFrom();
180
200
  const r = engine.check(dir, { extensions: opts.extensions });
181
201
  const g = engine.checkGraph(dir); // graph.json is only judged when it exists
182
- // Neither layer has ever been built → nothing to check.
202
+ // A layer that IS present must be in sync; a never-built layer (keyless
203
+ // build skips the markdown layer) is informational, not a failure.
183
204
  const bothMissing = r.missing && g.missing;
184
- // A layer that IS present must be in sync; a layer that was never built
185
- // (keyless `graft build` skips the markdown/concept layer) is informational,
186
- // not a failure — the wiring graph stands on its own.
187
205
  const markdownFail = !r.missing && !r.ok;
188
206
  const wiringFail = !g.missing && !g.ok;
189
207
  if (opts.json) {
@@ -225,8 +243,7 @@ program
225
243
  console.error(`✗ no context graph at ${contextDir} — run \`graft build --deep\` first`);
226
244
  process.exit(1);
227
245
  }
228
- // dist/cli.js → dist/viewer/ (prebuilt at package build time)
229
- const viewerDir = fileURLToPath(new URL("./viewer/", import.meta.url));
246
+ const viewerDir = fileURLToPath(new URL("./viewer/", import.meta.url)); // prebuilt
230
247
  const srv = await startVizServer({
231
248
  contextDir,
232
249
  viewerDir,
@@ -259,8 +276,16 @@ program
259
276
  .option("--in <path>", "narrow matches to nodes whose path contains this substring")
260
277
  .option("--json", "output as JSON")
261
278
  .action(async (symbol, dir, opts) => {
262
- const { runCallersCommand } = await import("./graph/traverse-cli.js");
263
279
  const globalOpts = program.opts();
280
+ if (!opts.json && readWorkspace(resolve(dir), globalOpts.dir)) {
281
+ runWorkspaceCallers(resolve(dir), globalOpts.dir, symbol, {
282
+ direction: opts.direction === "out" ? "out" : "in",
283
+ depth: opts.depth ? Number(opts.depth) : undefined,
284
+ in: opts.in,
285
+ });
286
+ return;
287
+ }
288
+ const { runCallersCommand } = await import("./graph/traverse-cli.js");
264
289
  runCallersCommand(symbol, dir, {
265
290
  direction: opts.direction,
266
291
  depth: opts.depth,
@@ -279,8 +304,14 @@ program
279
304
  .option("--in <path>", "narrow to files whose path contains this substring")
280
305
  .option("--json", "output as JSON")
281
306
  .action(async (pattern, dir, opts) => {
282
- const { runGrepCommand } = await import("./search/grep-cli.js");
283
307
  const globalOpts = program.opts();
308
+ if (readWorkspace(resolve(dir), globalOpts.dir)) {
309
+ runWorkspaceGrep(resolve(dir), globalOpts.dir, pattern, {
310
+ ignoreCase: opts.ignoreCase, fixed: opts.fixed, json: opts.json,
311
+ });
312
+ return;
313
+ }
314
+ const { runGrepCommand } = await import("./search/grep-cli.js");
284
315
  runGrepCommand(pattern, dir, {
285
316
  ignoreCase: opts.ignoreCase,
286
317
  fixed: opts.fixed,
@@ -296,17 +327,9 @@ program
296
327
  .option("--max-dirs <n>", "max directory entries shown, rest counted into dropped (default 16)")
297
328
  .option("--json", "output as JSON")
298
329
  .action(async (dir, opts) => {
299
- const { buildRepoMap, formatRepoMap } = await import("./graph/map.js");
300
330
  const root = resolve(dir);
301
331
  const globalOpts = program.opts();
302
- const contextDir = contextDirFor(root, globalOpts.dir);
303
- const graph = loadGraphCached(contextDir);
304
- if (!graph) {
305
- console.error("✗ no graph — run graft build first");
306
- process.exit(1);
307
- return;
308
- }
309
- let maxDirs;
332
+ let maxDirsW;
310
333
  if (opts.maxDirs !== undefined) {
311
334
  const n = parseInt(opts.maxDirs, 10);
312
335
  if (!Number.isFinite(n) || n <= 0) {
@@ -314,9 +337,21 @@ program
314
337
  process.exit(1);
315
338
  return;
316
339
  }
317
- maxDirs = n;
340
+ maxDirsW = n;
341
+ }
342
+ if (!opts.json && readWorkspace(root, globalOpts.dir)) {
343
+ runWorkspaceMap(root, globalOpts.dir, { maxDirs: maxDirsW });
344
+ return;
345
+ }
346
+ const { buildRepoMap, formatRepoMap } = await import("./graph/map.js");
347
+ const contextDir = contextDirFor(root, globalOpts.dir);
348
+ const graph = loadGraphCached(contextDir);
349
+ if (!graph) {
350
+ console.error("✗ no graph — run graft build first");
351
+ process.exit(1);
352
+ return;
318
353
  }
319
- const map = buildRepoMap(graph, { maxDirs });
354
+ const map = buildRepoMap(graph, { maxDirs: maxDirsW });
320
355
  if (opts.json) {
321
356
  console.log(JSON.stringify(map, null, 2));
322
357
  return;
@@ -380,7 +415,6 @@ program
380
415
  console.error(`✓ ${w.id}: ${w.path} (${w.action})`);
381
416
  if (!explicit && !opts.allAgents && r.written.length === 0)
382
417
  console.error("· no other agents detected (see --list-agents / --all-agents)");
383
- // r.unknown is always empty here — ids are validated above, before any writes.
384
418
  for (const m of r.mcp)
385
419
  console.error(`✓ mcp ${m.id}: ${m.path} (${m.action})`);
386
420
  for (const h of r.hooks)