@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.
Files changed (108) hide show
  1. package/README.md +45 -15
  2. package/dist/ask/ask.js +1 -1
  3. package/dist/ask/ask.js.map +1 -1
  4. package/dist/claude/format.d.ts +40 -13
  5. package/dist/claude/format.d.ts.map +1 -1
  6. package/dist/claude/format.js +54 -15
  7. package/dist/claude/format.js.map +1 -1
  8. package/dist/claude/hooks.d.ts +15 -0
  9. package/dist/claude/hooks.d.ts.map +1 -1
  10. package/dist/claude/hooks.js +52 -3
  11. package/dist/claude/hooks.js.map +1 -1
  12. package/dist/claude/init.d.ts +17 -0
  13. package/dist/claude/init.d.ts.map +1 -1
  14. package/dist/claude/init.js +47 -21
  15. package/dist/claude/init.js.map +1 -1
  16. package/dist/claude/settings-merge.d.ts.map +1 -1
  17. package/dist/claude/settings-merge.js +19 -2
  18. package/dist/claude/settings-merge.js.map +1 -1
  19. package/dist/claude/skill-template.d.ts.map +1 -1
  20. package/dist/claude/skill-template.js +13 -5
  21. package/dist/claude/skill-template.js.map +1 -1
  22. package/dist/claude/state.d.ts +5 -20
  23. package/dist/claude/state.d.ts.map +1 -1
  24. package/dist/claude/state.js +10 -73
  25. package/dist/claude/state.js.map +1 -1
  26. package/dist/cli-picker.d.ts +60 -0
  27. package/dist/cli-picker.d.ts.map +1 -0
  28. package/dist/cli-picker.js +268 -0
  29. package/dist/cli-picker.js.map +1 -0
  30. package/dist/cli.js +101 -12
  31. package/dist/cli.js.map +1 -1
  32. package/dist/context/node-file.d.ts +21 -0
  33. package/dist/context/node-file.d.ts.map +1 -1
  34. package/dist/context/node-file.js +63 -1
  35. package/dist/context/node-file.js.map +1 -1
  36. package/dist/engine.d.ts +2 -0
  37. package/dist/engine.d.ts.map +1 -1
  38. package/dist/engine.js +1 -0
  39. package/dist/engine.js.map +1 -1
  40. package/dist/graph/build.d.ts +13 -2
  41. package/dist/graph/build.d.ts.map +1 -1
  42. package/dist/graph/build.js +98 -20
  43. package/dist/graph/build.js.map +1 -1
  44. package/dist/graph/cards.d.ts.map +1 -1
  45. package/dist/graph/cards.js +8 -0
  46. package/dist/graph/cards.js.map +1 -1
  47. package/dist/graph/extract-cache.d.ts +96 -0
  48. package/dist/graph/extract-cache.d.ts.map +1 -0
  49. package/dist/graph/extract-cache.js +199 -0
  50. package/dist/graph/extract-cache.js.map +1 -0
  51. package/dist/graph/fingerprint.d.ts +70 -0
  52. package/dist/graph/fingerprint.d.ts.map +1 -0
  53. package/dist/graph/fingerprint.js +147 -0
  54. package/dist/graph/fingerprint.js.map +1 -0
  55. package/dist/graph/load.d.ts +11 -0
  56. package/dist/graph/load.d.ts.map +1 -1
  57. package/dist/graph/load.js +14 -0
  58. package/dist/graph/load.js.map +1 -1
  59. package/dist/graph/refresh.d.ts +49 -0
  60. package/dist/graph/refresh.d.ts.map +1 -0
  61. package/dist/graph/refresh.js +202 -0
  62. package/dist/graph/refresh.js.map +1 -0
  63. package/dist/graph/source-files.d.ts +18 -0
  64. package/dist/graph/source-files.d.ts.map +1 -0
  65. package/dist/graph/source-files.js +36 -0
  66. package/dist/graph/source-files.js.map +1 -0
  67. package/dist/graph/traverse-cli.d.ts +1 -1
  68. package/dist/graph/traverse-cli.js +2 -2
  69. package/dist/graph/traverse.d.ts +2 -2
  70. package/dist/graph/traverse.js +1 -1
  71. package/dist/hosts/codex-hooks.d.ts +8 -0
  72. package/dist/hosts/codex-hooks.d.ts.map +1 -1
  73. package/dist/hosts/codex-hooks.js +27 -4
  74. package/dist/hosts/codex-hooks.js.map +1 -1
  75. package/dist/hosts/init.d.ts +2 -0
  76. package/dist/hosts/init.d.ts.map +1 -1
  77. package/dist/hosts/init.js +5 -2
  78. package/dist/hosts/init.js.map +1 -1
  79. package/dist/hosts/mcp-config.d.ts +29 -1
  80. package/dist/hosts/mcp-config.d.ts.map +1 -1
  81. package/dist/hosts/mcp-config.js +77 -10
  82. package/dist/hosts/mcp-config.js.map +1 -1
  83. package/dist/hosts/plan.d.ts +32 -0
  84. package/dist/hosts/plan.d.ts.map +1 -0
  85. package/dist/hosts/plan.js +67 -0
  86. package/dist/hosts/plan.js.map +1 -0
  87. package/dist/hosts/registry.d.ts.map +1 -1
  88. package/dist/hosts/registry.js +9 -0
  89. package/dist/hosts/registry.js.map +1 -1
  90. package/dist/mcp/instructions.d.ts +29 -0
  91. package/dist/mcp/instructions.d.ts.map +1 -0
  92. package/dist/mcp/instructions.js +55 -0
  93. package/dist/mcp/instructions.js.map +1 -0
  94. package/dist/mcp/server.d.ts +6 -1
  95. package/dist/mcp/server.d.ts.map +1 -1
  96. package/dist/mcp/server.js +15 -4
  97. package/dist/mcp/server.js.map +1 -1
  98. package/dist/mcp/tools.d.ts +4 -2
  99. package/dist/mcp/tools.d.ts.map +1 -1
  100. package/dist/mcp/tools.js +144 -104
  101. package/dist/mcp/tools.js.map +1 -1
  102. package/dist/search/grep-cli.js +1 -1
  103. package/dist/search/grep.js +1 -1
  104. package/dist/util/state.d.ts +45 -0
  105. package/dist/util/state.d.ts.map +1 -0
  106. package/dist/util/state.js +121 -0
  107. package/dist/util/state.js.map +1 -0
  108. package/package.json +1 -1
@@ -0,0 +1,202 @@
1
+ /**
2
+ * `ensureFreshGraph` — the pre-query gate that keeps retrieval honest.
3
+ *
4
+ * Freshness used to be someone else's job: the Claude Code `Stop` hook spawned a
5
+ * background `graft build` *after* the turn ended, so every query an agent made
6
+ * between its first edit and the end of the turn answered from a graph that no
7
+ * longer matched the file it had just changed. Worse, an edit made outside the
8
+ * agent (your editor, a branch switch, a stash) set no `dirty` flag at all, so
9
+ * nothing ever triggered a resync.
10
+ *
11
+ * So freshness moves into the query path: every retrieval call probes the working
12
+ * tree (`fingerprint.ts`, ~3ms) and, when something moved, rebuilds the structural
13
+ * graph before answering. Properties worth keeping:
14
+ *
15
+ * - **$0 and offline.** Tier-1 only — never a summarizer, never `--deep`. Same
16
+ * money guard `claude/sync-run.ts` carries: auto-anything must not spend money.
17
+ * - **Never fatal.** A failed refresh degrades to answering from the graph on
18
+ * disk. A query that works today must not start failing because a rebuild did.
19
+ * - **Never a stampede.** It takes the same `graft/.cache/.sync.lock` the
20
+ * background sync uses, so concurrent MCP calls and the Stop hook can't pile up
21
+ * rebuilds on top of each other.
22
+ * - **Writes only what a query reads** (`graphOnly`): the graph, the `ask` sidecar,
23
+ * the freshness record. Not the markdown cards, not `INDEX.md`, not `.gitignore`.
24
+ * Those belong to an explicit `graft build` — which the `Stop` hook already runs
25
+ * at the end of a turn — so retrieval stays cheap and a read stays a read. It
26
+ * also leaves `stats.json` alone, so that same `Stop` hook still sees `dirty` and
27
+ * still rebuilds the passive surface.
28
+ */
29
+ import { existsSync } from "node:fs";
30
+ import { join, resolve } from "node:path";
31
+ import { contextDirFor } from "../context/node-file.js";
32
+ import { acquireLockIn, releaseLockIn } from "../util/state.js";
33
+ import { CACHE_DIR } from "../context/node-file.js";
34
+ import { buildGraph } from "./build.js";
35
+ import { driftCount, isClean, probeDrift } from "./fingerprint.js";
36
+ import { invalidateGraphCaches } from "./load.js";
37
+ import { wiringPath } from "./write.js";
38
+ /** How long to wait for another process's in-flight rebuild before giving up and
39
+ * answering from the current graph. Long enough to ride out a small repo's build,
40
+ * short enough that a tool call never feels hung. */
41
+ const LOCK_WAIT_MS = 2000;
42
+ const LOCK_POLL_MS = 50;
43
+ const CLEAN = { refreshed: false };
44
+ /** Env kill switch, for CI or anyone who wants queries to never write. */
45
+ function envDisabled() {
46
+ const v = process.env.GRAFT_NO_REFRESH;
47
+ return v !== undefined && v !== "" && v !== "0" && v !== "false";
48
+ }
49
+ function sleep(ms) {
50
+ return new Promise((r) => setTimeout(r, ms));
51
+ }
52
+ /**
53
+ * Release the lock if this process is asked to die while holding it. Returns the
54
+ * un-hook.
55
+ *
56
+ * Not hypothetical: the Claude Code prompt hook runs `graft ask` with a timeout, and
57
+ * `execFileSync` enforces it with SIGTERM. Node's default disposition for SIGTERM is
58
+ * to exit without unwinding, so the `finally` below never runs and the lock outlives
59
+ * the process — after which the background sync is blocked and every query waits and
60
+ * then answers stale until the lock ages out. Ctrl-C on a CLI query is the same story
61
+ * with SIGINT.
62
+ *
63
+ * Adding a listener replaces that default disposition, so re-raise it explicitly
64
+ * afterwards: remove ourselves, then `process.kill(process.pid, sig)`, so the exit
65
+ * status still says "terminated by signal" for whoever is waiting on us.
66
+ */
67
+ export function releaseOnSignal(cache) {
68
+ const signals = ["SIGTERM", "SIGINT"];
69
+ const onSignal = (sig) => {
70
+ releaseLockIn(cache);
71
+ for (const s of signals)
72
+ process.removeListener(s, onSignal);
73
+ process.kill(process.pid, sig);
74
+ };
75
+ for (const s of signals)
76
+ process.once(s, onSignal);
77
+ return () => {
78
+ for (const s of signals)
79
+ process.removeListener(s, onSignal);
80
+ };
81
+ }
82
+ /** Wait out someone else's rebuild, then take the lock. False when we couldn't. */
83
+ async function waitForLock(cache) {
84
+ const deadline = Date.now() + LOCK_WAIT_MS;
85
+ for (;;) {
86
+ if (acquireLockIn(cache))
87
+ return true;
88
+ if (Date.now() >= deadline)
89
+ return false;
90
+ await sleep(LOCK_POLL_MS);
91
+ }
92
+ }
93
+ /**
94
+ * Rebuild `root`'s structural graph if the working tree has moved since the last
95
+ * build. Cheap and side-effect-free when nothing changed, which is the usual case.
96
+ *
97
+ * `root` is the repository root (the same value the query itself is given), not
98
+ * the context dir.
99
+ */
100
+ export async function ensureFreshGraph(root, opts = {}) {
101
+ if (opts.disabled || envDisabled())
102
+ return CLEAN;
103
+ try {
104
+ const dir = resolve(root);
105
+ const outDir = contextDirFor(dir, opts.contextDir);
106
+ // Nothing built yet: the caller's own "no graph — run graft build" message is
107
+ // the right answer. Auto-building a whole repo under a query is a surprise,
108
+ // and it's the one case where the user hasn't opted into graft at all yet.
109
+ if (!existsSync(wiringPath(outDir)))
110
+ return CLEAN;
111
+ // null = no fingerprint at all: a graph built before this mechanism existed,
112
+ // or by a different extractor build. Rebuild once — that lays the fingerprint
113
+ // down, so it costs exactly one build, not one per query.
114
+ const drift = probeDrift(dir, outDir);
115
+ if (drift && isClean(drift))
116
+ return CLEAN;
117
+ // On the default layout this is `<root>/graft/.cache/.sync.lock`, the very file
118
+ // the Claude Code hooks lock — so this refresh and the background sync can
119
+ // never rebuild at the same time.
120
+ const lockCache = join(outDir, CACHE_DIR);
121
+ if (!(await waitForLock(lockCache))) {
122
+ return {
123
+ refreshed: false,
124
+ drift: drift ?? undefined,
125
+ note: "a graph rebuild is already in flight — answering from the current graph",
126
+ };
127
+ }
128
+ const unhook = releaseOnSignal(lockCache);
129
+ try {
130
+ // We may have queued behind another process's rebuild for up to LOCK_WAIT_MS,
131
+ // and that rebuild very likely fixed the same drift we saw. Re-probe rather
132
+ // than rebuild on the strength of a stale observation: without this, four
133
+ // parallel MCP tool calls on one edited file produce four full rebuilds, three
134
+ // of them pure waste, and the last tool call pays for all of it. A null drift
135
+ // means "no fingerprint" and still has to build.
136
+ const now = drift ? probeDrift(dir, outDir) : null;
137
+ if (now && isClean(now)) {
138
+ invalidateGraphCaches(outDir);
139
+ return CLEAN;
140
+ }
141
+ // Tier-1 only: no summarizer, so no LLM call and no network, ever. And
142
+ // `graphOnly`: write the graph, the ask sidecar and the fingerprint, nothing
143
+ // else. The markdown projections under `graft/` stay the `Stop` hook's job —
144
+ // a query has no business rewriting the repo's `.gitignore` or churning every
145
+ // card's mtime, and skipping them is most of what keeps this cheap.
146
+ await buildGraph(dir, { contextDir: opts.contextDir, graphOnly: true });
147
+ invalidateGraphCaches(outDir);
148
+ return { refreshed: true, drift: drift ?? undefined };
149
+ }
150
+ finally {
151
+ unhook();
152
+ releaseLockIn(lockCache);
153
+ }
154
+ }
155
+ catch (err) {
156
+ // Answering from a slightly stale graph beats failing the query.
157
+ return { refreshed: false, note: `graph refresh skipped: ${err instanceof Error ? err.message : String(err)}` };
158
+ }
159
+ }
160
+ /**
161
+ * Workspace variant: refresh each child repo's own graph (a workspace parent holds
162
+ * an index, never nodes). Children are independent, but they're refreshed in
163
+ * sequence — a fan-out of concurrent tree-sitter builds would spike CPU on the
164
+ * very path that's supposed to feel free.
165
+ */
166
+ export async function ensureFreshChildren(root, children, opts = {}) {
167
+ if (opts.disabled || envDisabled())
168
+ return CLEAN;
169
+ const refreshedIn = [];
170
+ let files = 0;
171
+ for (const child of children) {
172
+ // Deliberately NOT `opts`: `contextDirFor` returns an override verbatim and
173
+ // ignores the root it's handed, so forwarding the parent's `--dir` would point
174
+ // every child at the *parent's* context dir — which holds a workspace index and
175
+ // no wiring.json, so every child would silently be skipped. (And if it did hold
176
+ // one, each child would build into that single shared dir in turn, the last
177
+ // clobbering the rest.) A child's graph always lives in its own `<child>/graft`,
178
+ // which is exactly how `loadWorkspaceGraphs` reads them back.
179
+ const r = await ensureFreshGraph(resolve(root, child), { disabled: opts.disabled });
180
+ if (!r.refreshed)
181
+ continue;
182
+ refreshedIn.push(child);
183
+ files += r.drift ? driftCount(r.drift) : 0;
184
+ }
185
+ if (!refreshedIn.length)
186
+ return CLEAN;
187
+ return {
188
+ refreshed: true,
189
+ note: `refreshed ${refreshedIn.join(", ")} (${files || "?"} file${files === 1 ? "" : "s"} changed) before answering`,
190
+ };
191
+ }
192
+ /** The one-line note a CLI/MCP surface prints when a refresh actually happened.
193
+ * Null when there's nothing to say (the overwhelmingly common case). */
194
+ export function refreshNote(r) {
195
+ if (r.note)
196
+ return `[graft] ${r.note}`;
197
+ if (!r.refreshed)
198
+ return null;
199
+ const n = r.drift ? driftCount(r.drift) : 0;
200
+ return `[graft] refreshed the graph (${n || "?"} file${n === 1 ? "" : "s"} changed) before answering`;
201
+ }
202
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/graph/refresh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAc,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;qDAEqD;AACrD,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,EAAE,CAAC;AAiBxB,MAAM,KAAK,GAAkB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAElD,0EAA0E;AAC1E,SAAS,WAAW;IAClB,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACvC,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,CAAC;AACnE,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,OAAO,GAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,CAAC,GAAmB,EAAE,EAAE;QACvC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,GAAG,EAAE;QACV,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,KAAK,UAAU,WAAW,CAAC,KAAa;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;IAC3C,SAAS,CAAC;QACR,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;YAAE,OAAO,KAAK,CAAC;QACzC,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAuB,EAAE;IAC5E,IAAI,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,8EAA8E;QAC9E,4EAA4E;QAC5E,2EAA2E;QAC3E,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAElD,6EAA6E;QAC7E,8EAA8E;QAC9E,0DAA0D;QAC1D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAE1C,gFAAgF;QAChF,2EAA2E;QAC3E,kCAAkC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACpC,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,KAAK,IAAI,SAAS;gBACzB,IAAI,EAAE,yEAAyE;aAChF,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,8EAA8E;YAC9E,4EAA4E;YAC5E,0EAA0E;YAC1E,+EAA+E;YAC/E,8EAA8E;YAC9E,iDAAiD;YACjD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACnD,IAAI,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,qBAAqB,CAAC,MAAM,CAAC,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,uEAAuE;YACvE,6EAA6E;YAC7E,6EAA6E;YAC7E,8EAA8E;YAC9E,oEAAoE;YACpE,MAAM,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAC9B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC;YACT,aAAa,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,iEAAiE;QACjE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IAClH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAY,EACZ,QAAkB,EAClB,OAAuB,EAAE;IAEzB,IAAI,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE;QAAE,OAAO,KAAK,CAAC;IACjD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,4EAA4E;QAC5E,+EAA+E;QAC/E,gFAAgF;QAChF,gFAAgF;QAChF,4EAA4E;QAC5E,iFAAiF;QACjF,8DAA8D;QAC9D,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,CAAC,CAAC,SAAS;YAAE,SAAS;QAC3B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO;QACL,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,aAAa,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,4BAA4B;KACrH,CAAC;AACJ,CAAC;AAED;wEACwE;AACxE,MAAM,UAAU,WAAW,CAAC,CAAgB;IAC1C,IAAI,CAAC,CAAC,IAAI;QAAE,OAAO,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,CAAC,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,gCAAgC,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,4BAA4B,CAAC;AACxG,CAAC"}
@@ -0,0 +1,18 @@
1
+ /** The source files a graph build parses: supported languages, minus the output dir. */
2
+ export declare function listSourceFiles(root: string, outDir: string): string[];
3
+ export interface SourceStat {
4
+ /** Absolute path. */
5
+ abs: string;
6
+ /** `relative(root, abs)` — exactly the form `buildGraph` uses for node ids and
7
+ * `checkGraph` diffs against, so cache keys and ids can never disagree. */
8
+ rel: string;
9
+ size: number;
10
+ mtimeMs: number;
11
+ }
12
+ /**
13
+ * {@link listSourceFiles} plus each file's `(size, mtimeMs)` — the currency of
14
+ * both the freshness probe and the extraction cache. Files that vanish between
15
+ * the walk and the stat are dropped (same fail-soft posture as `walkDir`).
16
+ */
17
+ export declare function listSourceStats(root: string, outDir: string): SourceStat[];
18
+ //# sourceMappingURL=source-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-files.d.ts","sourceRoot":"","sources":["../../src/graph/source-files.ts"],"names":[],"mappings":"AAaA,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAEtE;AAED,MAAM,WAAW,UAAU;IACzB,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ;+EAC2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAY1E"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The file set a graph build parses, and its stat metadata.
3
+ *
4
+ * Split out of `build.ts` so the freshness probe (`fingerprint.ts`) can enumerate
5
+ * exactly the same files without importing the builder (which would be an import
6
+ * cycle: build → fingerprint → build). `build.ts` re-exports
7
+ * {@link listSourceFiles} so its existing importers are unaffected.
8
+ */
9
+ import { statSync } from "node:fs";
10
+ import { relative } from "node:path";
11
+ import { walkDir } from "../ingest/fs.js";
12
+ import { languageOf } from "./extract.js";
13
+ /** The source files a graph build parses: supported languages, minus the output dir. */
14
+ export function listSourceFiles(root, outDir) {
15
+ return walkDir(root).filter((f) => !f.startsWith(outDir) && languageOf(f) !== null);
16
+ }
17
+ /**
18
+ * {@link listSourceFiles} plus each file's `(size, mtimeMs)` — the currency of
19
+ * both the freshness probe and the extraction cache. Files that vanish between
20
+ * the walk and the stat are dropped (same fail-soft posture as `walkDir`).
21
+ */
22
+ export function listSourceStats(root, outDir) {
23
+ const out = [];
24
+ for (const abs of listSourceFiles(root, outDir)) {
25
+ let s;
26
+ try {
27
+ s = statSync(abs);
28
+ }
29
+ catch {
30
+ continue;
31
+ }
32
+ out.push({ abs, rel: relative(root, abs), size: s.size, mtimeMs: s.mtimeMs });
33
+ }
34
+ return out;
35
+ }
36
+ //# sourceMappingURL=source-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-files.js","sourceRoot":"","sources":["../../src/graph/source-files.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wFAAwF;AACxF,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,MAAc;IAC1D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACtF,CAAC;AAYD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,MAAc;IAC1D,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAChD,IAAI,CAAoC,CAAC;QACzC,IAAI,CAAC;YACH,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -11,7 +11,7 @@ export interface CallersCliOptions {
11
11
  /** the top-level `--dir` override, so this command respects it like every other. */
12
12
  globalDir?: string;
13
13
  }
14
- /** Exported so the MCP `graft_callers` tool (`src/mcp/tools.ts`) can render the
14
+ /** Exported so the MCP `graft_trace_calls` tool (`src/mcp/tools.ts`) can render the
15
15
  * same human report format as the CLI, rather than re-implementing it — both
16
16
  * surfaces walk the same edges via the same `resolveSymbol` / `edgeWalk` core. */
17
17
  export declare function headerOf(n: NodeV1): string;
@@ -8,7 +8,7 @@
8
8
  * unit-testable without shelling out to the CLI on every case.
9
9
  *
10
10
  * `--direction out` subsumes the old `graft callees`; `--depth N` subsumes the
11
- * old `graft impact`. Exported formatters are reused by the MCP `graft_callers`
11
+ * old `graft impact`. Exported formatters are reused by the MCP `graft_trace_calls`
12
12
  * tool (`src/mcp/tools.ts`), so both surfaces render identical reports.
13
13
  */
14
14
  import { resolve } from "node:path";
@@ -18,7 +18,7 @@ import { loadGraphCached } from "./load.js";
18
18
  import { resolveSymbol, edgeWalk } from "./traverse.js";
19
19
  const ARROW = { in: "←", out: "→" };
20
20
  const DEFAULT_DEPTH = 1;
21
- /** Exported so the MCP `graft_callers` tool (`src/mcp/tools.ts`) can render the
21
+ /** Exported so the MCP `graft_trace_calls` tool (`src/mcp/tools.ts`) can render the
22
22
  * same human report format as the CLI, rather than re-implementing it — both
23
23
  * surfaces walk the same edges via the same `resolveSymbol` / `edgeWalk` core. */
24
24
  export function headerOf(n) {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Pure graph-traversal core shared by `graft callers` (its `--direction`/
3
- * `--depth` flags), the MCP `graft_callers` tool, and `ask`'s structural
3
+ * `--depth` flags), the MCP `graft_trace_calls` tool, and `ask`'s structural
4
4
  * intent path.
5
5
  *
6
6
  * Centralizes the symbol-resolution contract (bare name, qualified id-suffix,
@@ -94,7 +94,7 @@ export declare function impactOfMany(graph: GraphV1, seeds: NodeV1[], maxDepth?:
94
94
  */
95
95
  export declare function impactOfFile(graph: GraphV1, fileNode: NodeV1, maxDepth?: number, direction?: Direction): EdgeHit[];
96
96
  /**
97
- * The single entry point behind `graft callers` and the MCP `graft_callers`
97
+ * The single entry point behind `graft callers` and the MCP `graft_trace_calls`
98
98
  * tool, covering all of what were once three commands:
99
99
  * - `direction:in, depth:1` → callers (who calls/references this)
100
100
  * - `direction:out, depth:1` → callees (what this calls/references)
@@ -151,7 +151,7 @@ export function impactOfFile(graph, fileNode, maxDepth = 2, direction = "in") {
151
151
  return impactOfMany(graph, [fileNode, ...symbolsInFile(graph, fileNode)], maxDepth, direction);
152
152
  }
153
153
  /**
154
- * The single entry point behind `graft callers` and the MCP `graft_callers`
154
+ * The single entry point behind `graft callers` and the MCP `graft_trace_calls`
155
155
  * tool, covering all of what were once three commands:
156
156
  * - `direction:in, depth:1` → callers (who calls/references this)
157
157
  * - `direction:out, depth:1` → callees (what this calls/references)
@@ -1,7 +1,15 @@
1
+ import type { PlannedWrite } from './plan.js';
1
2
  export interface HookWrite {
2
3
  id: string;
3
4
  path: string;
4
5
  action: 'created' | 'updated' | 'unchanged' | 'skipped-unparseable';
5
6
  }
7
+ /**
8
+ * The files installing the Codex hook would touch — pure, no writes. Both live
9
+ * under `~/.codex`, so both are scoped 'global': the PostToolUse entry fires on
10
+ * every edit in every repo opened with Codex, not just this one. Empty when the
11
+ * CLI isn't installed, mirroring `installCodexHooks`' early return.
12
+ */
13
+ export declare function hookTargets(home: string): PlannedWrite[];
6
14
  export declare function installCodexHooks(home: string): HookWrite[];
7
15
  //# sourceMappingURL=codex-hooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-hooks.d.ts","sourceRoot":"","sources":["../../src/hosts/codex-hooks.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,qBAAqB,CAAC;CACrE;AAsBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAqC3D"}
1
+ {"version":3,"file":"codex-hooks.d.ts","sourceRoot":"","sources":["../../src/hosts/codex-hooks.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,qBAAqB,CAAC;CACrE;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAexD;AAkBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAqC3D"}
@@ -15,6 +15,29 @@ function dirExists(p) {
15
15
  return false;
16
16
  }
17
17
  }
18
+ /**
19
+ * The files installing the Codex hook would touch — pure, no writes. Both live
20
+ * under `~/.codex`, so both are scoped 'global': the PostToolUse entry fires on
21
+ * every edit in every repo opened with Codex, not just this one. Empty when the
22
+ * CLI isn't installed, mirroring `installCodexHooks`' early return.
23
+ */
24
+ export function hookTargets(home) {
25
+ const base = join(home, '.codex');
26
+ if (!dirExists(base))
27
+ return [];
28
+ return [
29
+ {
30
+ hostId: 'agents', id: 'codex-hook-shim',
31
+ path: join(base, 'hooks', 'graft', 'graft-hooks.cjs'),
32
+ scope: 'global', kind: 'hook', what: 'post-edit hook shim',
33
+ },
34
+ {
35
+ hostId: 'agents', id: 'codex-hooks',
36
+ path: join(base, 'hooks.json'),
37
+ scope: 'global', kind: 'hook', what: 'PostToolUse: Write|Edit|MultiEdit',
38
+ },
39
+ ];
40
+ }
18
41
  function writeOwned(id, path, content, mode) {
19
42
  const existed = existsSync(path);
20
43
  if (existed && readFileSync(path, 'utf8') === content) {
@@ -32,12 +55,12 @@ function isGraftEntry(entry) {
32
55
  return JSON.stringify(entry).includes('graft-hooks.cjs');
33
56
  }
34
57
  export function installCodexHooks(home) {
35
- const base = join(home, '.codex');
36
- if (!dirExists(base))
58
+ const targets = hookTargets(home);
59
+ if (targets.length === 0)
37
60
  return [];
38
- const shimPath = join(base, 'hooks', 'graft', 'graft-hooks.cjs');
61
+ const shimPath = targets[0].path;
39
62
  const shimWrite = writeOwned('codex-hook-shim', shimPath, hooksShim(claudeDistDir()), 0o755);
40
- const cfgPath = join(base, 'hooks.json');
63
+ const cfgPath = targets[1].path;
41
64
  let root = {};
42
65
  const existed = existsSync(cfgPath);
43
66
  if (existed) {
@@ -1 +1 @@
1
- {"version":3,"file":"codex-hooks.js","sourceRoot":"","sources":["../../src/hosts/codex-hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-hooks.js","sourceRoot":"","sources":["../../src/hosts/codex-hooks.ts"],"names":[],"mappings":"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"}
@@ -17,5 +17,7 @@ export declare function runHostsInit(repo: string, opts?: {
17
17
  home?: string;
18
18
  mcp?: boolean;
19
19
  hooks?: boolean;
20
+ /** false → skip every write outside the repo (the ~/.codex/ targets). */
21
+ global?: boolean;
20
22
  }): HostsInitResult;
21
23
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/hosts/init.ts"],"names":[],"mappings":"AAUA,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAiBD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7F,eAAe,CAgCjB"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/hosts/init.ts"],"names":[],"mappings":"AAUA,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAiBD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yEAAyE;IACzE,MAAM,CAAC,EAAE,OAAO,CAAC;CACb,GACL,eAAe,CAoCjB"}
@@ -54,8 +54,11 @@ export function runHostsInit(repo, opts = {}) {
54
54
  written.push({ id: host.id, path, action });
55
55
  }
56
56
  const skipped = HOSTS.filter((h) => !selected.includes(h)).map((h) => h.id);
57
- const mcp = opts.mcp === false ? [] : registerMcpConfigs(repo, selected.map((h) => h.id), { home });
58
- const hooks = opts.hooks === false || !selected.some((h) => h.id === 'agents')
57
+ const mcp = opts.mcp === false
58
+ ? []
59
+ : registerMcpConfigs(repo, selected.map((h) => h.id), { home, global: opts.global });
60
+ // Every hook target is user-level, so --no-global suppresses the lot.
61
+ const hooks = opts.hooks === false || opts.global === false || !selected.some((h) => h.id === 'agents')
59
62
  ? []
60
63
  : installCodexHooks(home);
61
64
  return { written, skipped, unknown, mcp, hooks };
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/hosts/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/hosts/init.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,42 @@
1
+ import type { PlannedWrite } from './plan.js';
1
2
  export interface McpWrite {
2
3
  id: string;
3
4
  path: string;
4
5
  action: 'created' | 'updated' | 'unchanged' | 'skipped-unparseable';
5
6
  }
6
- export declare const SERVER_ENTRY: {
7
+ /** A planned MCP write, plus the detail needed to actually perform it. */
8
+ export interface McpTarget extends PlannedWrite {
9
+ format: 'json' | 'toml';
10
+ /** JSON only: the top-level key holding the server map. */
11
+ topKey?: string;
12
+ /** JSON only: the server entry to merge in under `graft`. */
13
+ entry?: object;
14
+ }
15
+ /**
16
+ * JSON hosts: `{ command, args }`.
17
+ *
18
+ * `GRAFT_MCP_NPX=1` forces the `npx` form — the escape hatch for a machine whose
19
+ * global install is stale or shadowed, and what the tests set so their expectations
20
+ * don't depend on whether the machine running them happens to have graft installed.
21
+ * `opts.onPath` is the same override for direct unit tests of both branches.
22
+ */
23
+ export declare function serverEntry(opts?: {
24
+ onPath?: boolean;
25
+ }): {
7
26
  command: string;
8
27
  args: string[];
9
28
  };
10
29
  export declare function mergeJsonKey(id: string, path: string, topKey: string, entry: object): McpWrite;
30
+ /**
31
+ * The MCP config files selecting these hosts would touch — pure, no writes.
32
+ * Codex's target is the user-level `~/.codex/config.toml`, so it is scoped
33
+ * 'global': registering there affects every project on the machine.
34
+ */
35
+ export declare function mcpTargets(repo: string, ids: string[], opts?: {
36
+ home?: string;
37
+ }): McpTarget[];
11
38
  export declare function registerMcpConfigs(repo: string, ids: string[], opts?: {
12
39
  home?: string;
40
+ global?: boolean;
13
41
  }): McpWrite[];
14
42
  //# sourceMappingURL=mcp-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../src/hosts/mcp-config.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,qBAAqB,CAAC;CACrE;AAED,eAAO,MAAM,YAAY;;;CAA6D,CAAC;AAOvF,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAoB9F;AAaD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3B,QAAQ,EAAE,CA2BZ"}
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../src/hosts/mcp-config.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,qBAAqB,CAAC;CACrE;AAED,0EAA0E;AAC1E,MAAM,WAAW,SAAU,SAAQ,YAAY;IAC7C,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2BD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAIhG;AAYD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAoB9F;AA0BD;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3B,SAAS,EAAE,CAiCb;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7C,QAAQ,EAAE,CAQZ"}