@vyuhlabs/dxkit 2.9.3 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/CHANGELOG.md +170 -0
  2. package/README.md +9 -0
  3. package/dist/allowlist/annotate.d.ts +71 -0
  4. package/dist/allowlist/annotate.d.ts.map +1 -0
  5. package/dist/allowlist/annotate.js +105 -0
  6. package/dist/allowlist/annotate.js.map +1 -0
  7. package/dist/allowlist/cli.d.ts +6 -0
  8. package/dist/allowlist/cli.d.ts.map +1 -1
  9. package/dist/allowlist/cli.js +70 -37
  10. package/dist/allowlist/cli.js.map +1 -1
  11. package/dist/analyzers/dashboard/index.d.ts.map +1 -1
  12. package/dist/analyzers/dashboard/index.js +6 -1
  13. package/dist/analyzers/dashboard/index.js.map +1 -1
  14. package/dist/analyzers/developer/gather.d.ts +16 -0
  15. package/dist/analyzers/developer/gather.d.ts.map +1 -1
  16. package/dist/analyzers/developer/gather.js +2 -0
  17. package/dist/analyzers/developer/gather.js.map +1 -1
  18. package/dist/analyzers/developer/ownership.d.ts +86 -0
  19. package/dist/analyzers/developer/ownership.d.ts.map +1 -0
  20. package/dist/analyzers/developer/ownership.js +180 -0
  21. package/dist/analyzers/developer/ownership.js.map +1 -0
  22. package/dist/analyzers/health.d.ts.map +1 -1
  23. package/dist/analyzers/health.js +17 -2
  24. package/dist/analyzers/health.js.map +1 -1
  25. package/dist/analyzers/quality/detailed.d.ts +5 -1
  26. package/dist/analyzers/quality/detailed.d.ts.map +1 -1
  27. package/dist/analyzers/quality/detailed.js +30 -29
  28. package/dist/analyzers/quality/detailed.js.map +1 -1
  29. package/dist/analyzers/security/actions.d.ts.map +1 -1
  30. package/dist/analyzers/security/actions.js +13 -0
  31. package/dist/analyzers/security/actions.js.map +1 -1
  32. package/dist/analyzers/security/aggregator.d.ts +18 -0
  33. package/dist/analyzers/security/aggregator.d.ts.map +1 -1
  34. package/dist/analyzers/security/aggregator.js +28 -0
  35. package/dist/analyzers/security/aggregator.js.map +1 -1
  36. package/dist/analyzers/security/detailed.d.ts +7 -1
  37. package/dist/analyzers/security/detailed.d.ts.map +1 -1
  38. package/dist/analyzers/security/detailed.js +31 -15
  39. package/dist/analyzers/security/detailed.js.map +1 -1
  40. package/dist/analyzers/security/gather.d.ts.map +1 -1
  41. package/dist/analyzers/security/gather.js +6 -0
  42. package/dist/analyzers/security/gather.js.map +1 -1
  43. package/dist/analyzers/security/index.d.ts.map +1 -1
  44. package/dist/analyzers/security/index.js +81 -2
  45. package/dist/analyzers/security/index.js.map +1 -1
  46. package/dist/analyzers/security/scanner-drift.d.ts +21 -0
  47. package/dist/analyzers/security/scanner-drift.d.ts.map +1 -0
  48. package/dist/analyzers/security/scanner-drift.js +113 -0
  49. package/dist/analyzers/security/scanner-drift.js.map +1 -0
  50. package/dist/analyzers/security/shallow.d.ts.map +1 -1
  51. package/dist/analyzers/security/shallow.js +24 -2
  52. package/dist/analyzers/security/shallow.js.map +1 -1
  53. package/dist/analyzers/security/types.d.ts +38 -0
  54. package/dist/analyzers/security/types.d.ts.map +1 -1
  55. package/dist/analyzers/tests/detailed.d.ts +5 -1
  56. package/dist/analyzers/tests/detailed.d.ts.map +1 -1
  57. package/dist/analyzers/tests/detailed.js +27 -20
  58. package/dist/analyzers/tests/detailed.js.map +1 -1
  59. package/dist/analyzers/tools/graphify.d.ts +11 -0
  60. package/dist/analyzers/tools/graphify.d.ts.map +1 -1
  61. package/dist/analyzers/tools/graphify.js +429 -413
  62. package/dist/analyzers/tools/graphify.js.map +1 -1
  63. package/dist/analyzers/tools/grep-secrets.d.ts.map +1 -1
  64. package/dist/analyzers/tools/grep-secrets.js +9 -0
  65. package/dist/analyzers/tools/grep-secrets.js.map +1 -1
  66. package/dist/analyzers/tools/osv-scanner-fix.d.ts.map +1 -1
  67. package/dist/analyzers/tools/osv-scanner-fix.js +12 -1
  68. package/dist/analyzers/tools/osv-scanner-fix.js.map +1 -1
  69. package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
  70. package/dist/analyzers/tools/tool-registry.js +78 -43
  71. package/dist/analyzers/tools/tool-registry.js.map +1 -1
  72. package/dist/analyzers/tools/walk-source-files.d.ts +10 -0
  73. package/dist/analyzers/tools/walk-source-files.d.ts.map +1 -1
  74. package/dist/analyzers/tools/walk-source-files.js +14 -0
  75. package/dist/analyzers/tools/walk-source-files.js.map +1 -1
  76. package/dist/analyzers/types.d.ts +9 -0
  77. package/dist/analyzers/types.d.ts.map +1 -1
  78. package/dist/attribution/attribute.d.ts +57 -0
  79. package/dist/attribution/attribute.d.ts.map +1 -0
  80. package/dist/attribution/attribute.js +149 -0
  81. package/dist/attribution/attribute.js.map +1 -0
  82. package/dist/baseline/entry-to-located.d.ts +12 -5
  83. package/dist/baseline/entry-to-located.d.ts.map +1 -1
  84. package/dist/baseline/entry-to-located.js +21 -7
  85. package/dist/baseline/entry-to-located.js.map +1 -1
  86. package/dist/baseline/git-aware-match.d.ts +7 -5
  87. package/dist/baseline/git-aware-match.d.ts.map +1 -1
  88. package/dist/baseline/git-aware-match.js +78 -5
  89. package/dist/baseline/git-aware-match.js.map +1 -1
  90. package/dist/cli.d.ts.map +1 -1
  91. package/dist/cli.js +53 -5
  92. package/dist/cli.js.map +1 -1
  93. package/dist/explore/context-hook.d.ts +49 -29
  94. package/dist/explore/context-hook.d.ts.map +1 -1
  95. package/dist/explore/context-hook.js +304 -29
  96. package/dist/explore/context-hook.js.map +1 -1
  97. package/dist/generator.d.ts.map +1 -1
  98. package/dist/generator.js +13 -7
  99. package/dist/generator.js.map +1 -1
  100. package/dist/ingest/snyk-policy.d.ts +22 -1
  101. package/dist/ingest/snyk-policy.d.ts.map +1 -1
  102. package/dist/ingest/snyk-policy.js +75 -18
  103. package/dist/ingest/snyk-policy.js.map +1 -1
  104. package/dist/languages/index.d.ts +28 -5
  105. package/dist/languages/index.d.ts.map +1 -1
  106. package/dist/languages/index.js +38 -7
  107. package/dist/languages/index.js.map +1 -1
  108. package/dist/languages/typescript.d.ts.map +1 -1
  109. package/dist/languages/typescript.js +19 -0
  110. package/dist/languages/typescript.js.map +1 -1
  111. package/dist/reviewers-cli.d.ts +57 -0
  112. package/dist/reviewers-cli.d.ts.map +1 -0
  113. package/dist/reviewers-cli.js +263 -0
  114. package/dist/reviewers-cli.js.map +1 -0
  115. package/dist/scoring/dimensions/security.d.ts +17 -0
  116. package/dist/scoring/dimensions/security.d.ts.map +1 -1
  117. package/dist/scoring/dimensions/security.js +12 -0
  118. package/dist/scoring/dimensions/security.js.map +1 -1
  119. package/package.json +1 -1
  120. package/templates/.claude/skills/dxkit-action/SKILL.md +13 -2
  121. package/templates/.claude/skills/dxkit-allowlist/SKILL.md +9 -0
  122. package/templates/.claude/skills/dxkit-onboard/SKILL.md +2 -2
  123. package/templates/.claude/skills/dxkit-pr/SKILL.md +22 -1
@@ -1,51 +1,139 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runContextHook = runContextHook;
37
+ exports.parsePayload = parsePayload;
38
+ exports.resolveHookTarget = resolveHookTarget;
39
+ exports.parseBashForTarget = parseBashForTarget;
40
+ exports.formatFileContext = formatFileContext;
41
+ exports.extractPattern = extractPattern;
42
+ exports.formatHookContext = formatHookContext;
2
43
  /**
3
44
  * `vyuh-dxkit context-hook` — the Claude Code PreToolUse hook that
4
45
  * delivers the token-reduction win passively. Wired into a scaffolded
5
- * repo's `.claude/settings.json` with a `Grep|Glob` matcher: when an
6
- * agent is about to search the codebase, this hook injects a slim
7
- * structural map as `additionalContext` so the agent needs fewer
8
- * follow-up whole-file reads.
46
+ * repo's `.claude/settings.json` so that when an agent reads or searches
47
+ * the codebase, this hook injects a slim structural map as
48
+ * `additionalContext`, so the agent needs fewer follow-up whole-file
49
+ * reads.
50
+ *
51
+ * Delivery surfaces:
52
+ * - **Read** — keyed on the FILE the agent is opening. Injects that
53
+ * file's structural summary (symbols + who calls it + what it calls).
54
+ * This is the highest-leverage surface: agents read files constantly,
55
+ * so the hook fires reliably and is useful regardless of search term.
56
+ * - **Bash** — parses `grep`/`rg`-style commands. When a concrete
57
+ * source file is named, delivers that file's summary; otherwise falls
58
+ * back to a symbol-name match on the search pattern. This is what lets
59
+ * the hook engage at all in a real fix workflow: agents search via the
60
+ * `Bash` tool (`grep -n …`), not the native `Grep` tool, so a
61
+ * Grep-only hook almost never fired.
62
+ * - **Grep / Glob** — the original surface, keyed on `tool_input.pattern`
63
+ * matched against graph symbol names.
64
+ *
65
+ * Pre-2.10 the hook fired ONLY on `Grep`/`Glob` and ONLY when the search
66
+ * pattern substring-matched a symbol name — which almost never happened
67
+ * in a real fix workflow (agents grep symptoms like `sendFile` via
68
+ * `Bash`, not enclosing symbol names via `Grep`). The file-keyed Read
69
+ * surface is the bridge from proven-deterministic graph value to
70
+ * realized-agentic delivery.
9
71
  *
10
72
  * THE CONTRACT IS FAIL-OPEN + ADDITIVE. This hook can only ever ADD
11
- * context; it never blocks the tool, never replaces grep output, and
73
+ * context; it never blocks the tool, never replaces tool output, and
12
74
  * stays a silent no-op (exit 0, no stdout) on ANY problem — missing
13
- * graph.json, parse error, no keyword match, unreadable stdin. So
14
- * Claude Code behaves exactly as it does today whenever the graph is
15
- * absent or unhelpful; the hook is pure upside.
75
+ * graph.json, parse error, no match, unreadable stdin. So Claude Code
76
+ * behaves exactly as it does today whenever the graph is absent or
77
+ * unhelpful; the hook is pure upside.
16
78
  *
17
79
  * Claude Code passes the tool call as JSON on stdin
18
- * (`{ tool_name, tool_input: { pattern, ... }, ... }`) and reads a
19
- * JSON object on stdout with `hookSpecificOutput.additionalContext`.
80
+ * (`{ tool_name, tool_input, session_id, cwd, ... }`) and reads a JSON
81
+ * object on stdout with `hookSpecificOutput.additionalContext`.
20
82
  */
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.runContextHook = runContextHook;
23
- exports.extractPattern = extractPattern;
24
- exports.formatHookContext = formatHookContext;
83
+ const fs = __importStar(require("fs"));
84
+ const os = __importStar(require("os"));
85
+ const path = __importStar(require("path"));
25
86
  const queries_1 = require("./queries");
26
87
  const load_1 = require("./load");
27
- /** Stingier than the manual CLI's 2000 — the hook fires on every grep. */
88
+ /** Stingier than the manual CLI's 2000 — the hook fires on every search/read. */
28
89
  const HOOK_BUDGET = 1500;
29
90
  /**
30
- * Entry point for `case 'context-hook'`. Reads stdin, runs the query,
31
- * writes the hook output. Wrapped so nothing it does can fail the
32
- * tool call: every failure path resolves to a silent no-op.
91
+ * Entry point for `case 'context-hook'`. Reads stdin, resolves the
92
+ * target, runs the query, writes the hook output. Wrapped so nothing it
93
+ * does can fail the tool call: every failure path resolves to a silent
94
+ * no-op.
33
95
  */
34
96
  async function runContextHook(cwd) {
35
97
  try {
36
98
  const raw = await readStdin();
37
99
  if (!raw.trim())
38
100
  return;
39
- const pattern = extractPattern(raw);
40
- if (!pattern)
101
+ const payload = parsePayload(raw);
102
+ if (!payload)
41
103
  return;
42
104
  const graph = (0, load_1.tryLoadGraph)(cwd);
43
105
  if (!graph)
44
106
  return;
45
- const result = (0, queries_1.contextQuery)(graph, pattern, { budget: HOOK_BUDGET, substring: true });
46
- if (!result.matched || result.selection.length === 0)
107
+ const target = resolveHookTarget(payload, graph, cwd);
108
+ if (!target)
109
+ return;
110
+ // Per-session, per-file dedup: a file's structural map is injected at
111
+ // most once per session, so an agent re-reading the same file doesn't
112
+ // pay the context cost repeatedly. Best-effort — a dedup-state failure
113
+ // falls through to injecting (the additive contract wins over the
114
+ // optimization).
115
+ if (target.kind === 'file' && payload.sessionId) {
116
+ if (alreadyInjected(payload.sessionId, target.file))
117
+ return;
118
+ }
119
+ let additionalContext;
120
+ if (target.kind === 'file') {
121
+ const summary = (0, queries_1.fileSummaryQuery)(graph, target.file);
122
+ if (!summary.found || summary.symbols.length === 0)
123
+ return;
124
+ additionalContext = formatFileContext(summary, graph);
125
+ }
126
+ else {
127
+ const result = (0, queries_1.contextQuery)(graph, target.pattern, { budget: HOOK_BUDGET, substring: true });
128
+ if (!result.matched || result.selection.length === 0)
129
+ return;
130
+ additionalContext = formatHookContext(result, graph);
131
+ }
132
+ if (!additionalContext)
47
133
  return;
48
- const additionalContext = formatHookContext(result, graph);
134
+ if (target.kind === 'file' && payload.sessionId) {
135
+ markInjected(payload.sessionId, target.file);
136
+ }
49
137
  process.stdout.write(JSON.stringify({
50
138
  hookSpecificOutput: {
51
139
  hookEventName: 'PreToolUse',
@@ -57,10 +145,197 @@ async function runContextHook(cwd) {
57
145
  // Fail-open: errors produce no output; the tool proceeds normally.
58
146
  }
59
147
  }
148
+ /** Parse the raw stdin JSON into the subset of fields the hook needs. */
149
+ function parsePayload(rawStdin) {
150
+ let parsed;
151
+ try {
152
+ parsed = JSON.parse(rawStdin);
153
+ }
154
+ catch {
155
+ return undefined;
156
+ }
157
+ if (!parsed || typeof parsed !== 'object')
158
+ return undefined;
159
+ const obj = parsed;
160
+ const toolInput = obj.tool_input && typeof obj.tool_input === 'object'
161
+ ? obj.tool_input
162
+ : {};
163
+ return {
164
+ toolName: typeof obj.tool_name === 'string' ? obj.tool_name : undefined,
165
+ toolInput,
166
+ sessionId: typeof obj.session_id === 'string' ? obj.session_id : undefined,
167
+ };
168
+ }
169
+ /**
170
+ * Decide what to inject context about, given the tool the agent invoked.
171
+ * Returns undefined (→ no-op) for tools/inputs we can't confidently map.
172
+ */
173
+ function resolveHookTarget(payload, graph, cwd) {
174
+ const tool = payload.toolName;
175
+ // Read / Edit / Write — keyed on the file being touched.
176
+ if (tool === 'Read' || tool === 'Edit' || tool === 'Write' || tool === 'NotebookEdit') {
177
+ const fp = payload.toolInput.file_path ?? payload.toolInput.notebook_path;
178
+ if (typeof fp !== 'string' || !fp.trim())
179
+ return undefined;
180
+ const rel = toRepoRelative(fp.trim(), cwd);
181
+ return graph.nodesByFile.has(rel) ? { kind: 'file', file: rel } : undefined;
182
+ }
183
+ // Bash — parse a grep/rg-style search command.
184
+ if (tool === 'Bash') {
185
+ const cmd = payload.toolInput.command;
186
+ if (typeof cmd !== 'string' || !cmd.trim())
187
+ return undefined;
188
+ return parseBashForTarget(cmd, graph, cwd);
189
+ }
190
+ // Grep / Glob (and anything else carrying a `pattern`) — symbol match.
191
+ const pattern = extractPattern(JSON.stringify({ tool_input: payload.toolInput }));
192
+ return pattern ? { kind: 'pattern', pattern } : undefined;
193
+ }
194
+ /**
195
+ * Extract a grep/rg target from a Bash command. Prefers a concrete
196
+ * source file named in the command (→ that file's structural summary);
197
+ * otherwise falls back to the search pattern (→ symbol-name match). Only
198
+ * fires for recognised search tools so an arbitrary Bash command is a
199
+ * clean no-op.
200
+ */
201
+ function parseBashForTarget(command, graph, cwd) {
202
+ if (!/\b(grep|egrep|fgrep|rg|ag|ack)\b/.test(command))
203
+ return undefined;
204
+ // First clause only — ignore everything past a pipe/`&&`/`;` so a
205
+ // downstream command's args don't masquerade as search paths.
206
+ const head = command.split(/\||&&|;/)[0];
207
+ const tokens = head.split(/\s+/).filter(Boolean).map(stripQuotes);
208
+ const binaries = new Set(['grep', 'egrep', 'fgrep', 'rg', 'ag', 'ack']);
209
+ // 1. A concrete file argument that exists in the graph wins — that's
210
+ // the file the agent is looking at, structural map is most useful.
211
+ for (const tok of tokens) {
212
+ if (tok.startsWith('-') || binaries.has(tok))
213
+ continue;
214
+ const rel = toRepoRelative(tok, cwd);
215
+ if (graph.nodesByFile.has(rel))
216
+ return { kind: 'file', file: rel };
217
+ }
218
+ // 2. Else the first plausible search term → symbol match. Skip flags,
219
+ // the binary, redirections, and path-ish/dir tokens.
220
+ for (const tok of tokens) {
221
+ if (tok.startsWith('-') || binaries.has(tok))
222
+ continue;
223
+ if (/[/<>|*]/.test(tok) || tok.includes('..'))
224
+ continue;
225
+ if (tok.length < 2)
226
+ continue;
227
+ return { kind: 'pattern', pattern: tok };
228
+ }
229
+ return undefined;
230
+ }
231
+ /** Strip a single layer of surrounding single/double quotes. */
232
+ function stripQuotes(s) {
233
+ if (s.length >= 2 && (s[0] === '"' || s[0] === "'") && s[s.length - 1] === s[0]) {
234
+ return s.slice(1, -1);
235
+ }
236
+ return s;
237
+ }
238
+ /** Convert an absolute or repo-relative path to the graph's key format
239
+ * (project-relative, forward slashes). */
240
+ function toRepoRelative(p, cwd) {
241
+ const rel = path.isAbsolute(p) ? path.relative(cwd, p) : p;
242
+ return rel.replace(/\\/g, '/');
243
+ }
244
+ /**
245
+ * Compact `additionalContext` body for a FILE target: the file's
246
+ * symbols, who depends on it (caller files), and what it reaches into
247
+ * (callee files). Terser than the CLI's markdown — the hook pays this on
248
+ * every read. Leads with provenance + a best-effort caveat so the agent
249
+ * calibrates trust.
250
+ */
251
+ function formatFileContext(summary, graph) {
252
+ const lines = [];
253
+ lines.push(`dxkit graph context for \`${summary.sourceFile}\` (from .dxkit/reports/graph.json, generated ${graph.meta.generatedAt.slice(0, 10)} — structural map, the file's actual contents remain authoritative):`);
254
+ const topSymbols = summary.symbols.slice(0, 12);
255
+ if (topSymbols.length > 0) {
256
+ lines.push(`- Symbols (${summary.symbols.length}):`);
257
+ for (const s of topSymbols) {
258
+ const where = s.line ? `:${s.line}` : '';
259
+ const flags = [s.exported ? 'exported' : '', s.callsIn > 0 ? `${s.callsIn} caller(s)` : '']
260
+ .filter(Boolean)
261
+ .join(', ');
262
+ lines.push(` ${s.label} (${s.kind}${where})${flags ? ` — ${flags}` : ''}`);
263
+ }
264
+ if (summary.symbols.length > topSymbols.length) {
265
+ lines.push(` (+${summary.symbols.length - topSymbols.length} more)`);
266
+ }
267
+ }
268
+ if (summary.callerFiles.length > 0) {
269
+ const top = summary.callerFiles.slice(0, 6);
270
+ lines.push(`- Depended on by ${summary.callerFiles.length} file(s):`);
271
+ for (const c of top)
272
+ lines.push(` ${c.sourceFile} (${c.count} call(s))`);
273
+ if (summary.callerFiles.length > top.length) {
274
+ lines.push(` (+${summary.callerFiles.length - top.length} more)`);
275
+ }
276
+ }
277
+ if (summary.calleeFiles.length > 0) {
278
+ const top = summary.calleeFiles.slice(0, 6);
279
+ lines.push(`- Calls into ${summary.calleeFiles.length} file(s):`);
280
+ for (const c of top)
281
+ lines.push(` ${c.sourceFile} (${c.count} call(s))`);
282
+ if (summary.calleeFiles.length > top.length) {
283
+ lines.push(` (+${summary.calleeFiles.length - top.length} more)`);
284
+ }
285
+ }
286
+ if (summary.communityLabel) {
287
+ lines.push(`- Module group: ${summary.communityLabel}`);
288
+ }
289
+ return lines.join('\n');
290
+ }
291
+ // ─── Per-session, per-file dedup state ───────────────────────────────────────
292
+ /** Where the per-session injected-file ledger lives. One file per
293
+ * session under the OS temp dir; small JSON array of repo-relative
294
+ * paths. Best-effort + self-evicting (temp dir is reclaimed by the OS). */
295
+ function dedupStatePath(sessionId) {
296
+ // Sanitize the session id to a safe filename component.
297
+ const safe = sessionId.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 128);
298
+ return path.join(os.tmpdir(), `dxkit-context-hook-${safe}.json`);
299
+ }
300
+ /** Has this file's context already been injected this session? Fail-open
301
+ * to `false` (inject) on any read/parse problem. */
302
+ function alreadyInjected(sessionId, file) {
303
+ try {
304
+ const raw = fs.readFileSync(dedupStatePath(sessionId), 'utf-8');
305
+ const seen = JSON.parse(raw);
306
+ return Array.isArray(seen) && seen.includes(file);
307
+ }
308
+ catch {
309
+ return false;
310
+ }
311
+ }
312
+ /** Record that this file's context was injected this session. Best-effort
313
+ * — a write failure simply means the file may be re-injected later. */
314
+ function markInjected(sessionId, file) {
315
+ try {
316
+ const p = dedupStatePath(sessionId);
317
+ let seen = [];
318
+ try {
319
+ const parsed = JSON.parse(fs.readFileSync(p, 'utf-8'));
320
+ if (Array.isArray(parsed))
321
+ seen = parsed.filter((x) => typeof x === 'string');
322
+ }
323
+ catch {
324
+ // no prior state → start fresh
325
+ }
326
+ if (!seen.includes(file)) {
327
+ seen.push(file);
328
+ fs.writeFileSync(p, JSON.stringify(seen));
329
+ }
330
+ }
331
+ catch {
332
+ // Fail-open: dedup is an optimization, not a correctness requirement.
333
+ }
334
+ }
60
335
  /**
61
- * Extract the search keyword from the PreToolUse payload. Both Grep
62
- * and Glob carry it on `tool_input.pattern`. Returns undefined for
63
- * anything we can't confidently read (→ no-op upstream).
336
+ * Extract the search keyword from a Grep/Glob-style payload. Both carry
337
+ * it on `tool_input.pattern`. Returns undefined for anything we can't
338
+ * confidently read (→ no-op upstream).
64
339
  */
65
340
  function extractPattern(rawStdin) {
66
341
  let parsed;
@@ -82,9 +357,9 @@ function extractPattern(rawStdin) {
82
357
  return trimmed.length > 0 ? trimmed : undefined;
83
358
  }
84
359
  /**
85
- * Compact `additionalContext` body. Terser than the CLI's markdown
86
- * (the hook pays this cost on every grep): an anchor line, blast
87
- * radius, and the top symbols grouped by their leading community.
360
+ * Compact `additionalContext` body for a PATTERN target. Terser than the
361
+ * CLI's markdown (the hook pays this cost on every grep): an anchor line,
362
+ * blast radius, and the top symbols grouped by their leading community.
88
363
  * Leads with a one-line provenance + best-effort caveat so the agent
89
364
  * calibrates trust.
90
365
  */
@@ -1 +1 @@
1
- {"version":3,"file":"context-hook.js","sourceRoot":"","sources":["../../src/explore/context-hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-hook.js","sourceRoot":"","sources":["../../src/explore/context-hook.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA,wCAmDC;AAUD,oCAkBC;AAMD,8CAyBC;AASD,gDA+BC;AAwBD,8CA4CC;AAmDD,wCAcC;AASD,8CAiCC;AAhYD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAiG;AACjG,iCAAsC;AAGtC,iFAAiF;AACjF,MAAM,WAAW,GAAG,IAAI,CAAC;AAKzB;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,OAAO;QAExB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,KAAK,GAAG,IAAA,mBAAY,EAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,sEAAsE;QACtE,sEAAsE;QACtE,uEAAuE;QACvE,kEAAkE;QAClE,iBAAiB;QACjB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAChD,IAAI,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC;gBAAE,OAAO;QAC9D,CAAC;QAED,IAAI,iBAAqC,CAAC;QAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAA,0BAAgB,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC3D,iBAAiB,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,IAAA,sBAAY,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7F,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC7D,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAE/B,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAChD,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC;YACb,kBAAkB,EAAE;gBAClB,aAAa,EAAE,YAAY;gBAC3B,iBAAiB;aAClB;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;AACH,CAAC;AASD,yEAAyE;AACzE,SAAgB,YAAY,CAAC,QAAgB;IAC3C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,SAAS,GACb,GAAG,CAAC,UAAU,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;QAClD,CAAC,CAAE,GAAG,CAAC,UAAsC;QAC7C,CAAC,CAAC,EAAE,CAAC;IACT,OAAO;QACL,QAAQ,EAAE,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACvE,SAAS;QACT,SAAS,EAAE,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;KAC3E,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAC/B,OAAoB,EACpB,KAAY,EACZ,GAAW;IAEX,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC;IAE9B,yDAAyD;IACzD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QACtF,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC;QAC1E,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QAC3D,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,CAAC;IAED,+CAA+C;IAC/C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;QACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QAC7D,OAAO,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,uEAAuE;IACvE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAClF,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAChC,OAAe,EACf,KAAY,EACZ,GAAW;IAEX,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAExE,kEAAkE;IAClE,8DAA8D;IAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAElE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAExE,qEAAqE;IACrE,sEAAsE;IACtE,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACvD,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACrE,CAAC;IAED,sEAAsE;IACtE,wDAAwD;IACxD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACvD,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QACxD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC7B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,gEAAgE;AAChE,SAAS,WAAW,CAAC,CAAS;IAC5B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;2CAC2C;AAC3C,SAAS,cAAc,CAAC,CAAS,EAAE,GAAW;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,OAAoB,EAAE,KAAY;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CACR,6BAA6B,OAAO,CAAC,UAAU,iDAAiD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,sEAAsE,CAC1M,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;iBACxF,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,WAAW,CAAC,MAAM,WAAW,CAAC,CAAC;QACtE,KAAK,MAAM,CAAC,IAAI,GAAG;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;QAC5E,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,WAAW,CAAC,MAAM,WAAW,CAAC,CAAC;QAClE,KAAK,MAAM,CAAC,IAAI,GAAG;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;QAC5E,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAEhF;;4EAE4E;AAC5E,SAAS,cAAc,CAAC,SAAiB;IACvC,wDAAwD;IACxD,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,sBAAsB,IAAI,OAAO,CAAC,CAAC;AACnE,CAAC;AAED;qDACqD;AACrD,SAAS,eAAe,CAAC,SAAiB,EAAE,IAAY;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;wEACwE;AACxE,SAAS,YAAY,CAAC,SAAiB,EAAE,IAAY;IACnD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,IAAI,GAAa,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC7F,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;IACxE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,QAAgB;IAC7C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,SAAS,GAAI,MAAmC,CAAC,UAAU,CAAC;IAClE,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,OAAO,GAAI,SAAmC,CAAC,OAAO,CAAC;IAC7D,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,MAAqB,EAAE,KAAY;IACnE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CACR,6BAA6B,MAAM,CAAC,KAAK,iDAAiD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,yDAAyD,CACvL,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,MAAM,OAAO,KAAK,kBAAkB,CAAC,CAAC,UAAU,YAAY,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CACR,mBAAmB,MAAM,CAAC,WAAW,CAAC,OAAO,qBAAqB,MAAM,CAAC,WAAW,CAAC,WAAW,WAAW,CAC5G,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;SAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;SACtD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,KAAK,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,YAAY,0CAA0C,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,0EAA0E;AAC1E,SAAS,SAAS;IAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,EAAE,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAoJnE,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,OAAO,EACd,OAAO,UAAQ,EACf,eAAe,UAAQ,GACtB,OAAO,CAAC,cAAc,CAAC,CAmHzB"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA0JnE,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,OAAO,EACd,OAAO,UAAQ,EACf,eAAe,UAAQ,GACtB,OAAO,CAAC,cAAc,CAAC,CAmHzB"}
package/dist/generator.js CHANGED
@@ -85,16 +85,22 @@ function buildSettingsJson(config) {
85
85
  allow: perms,
86
86
  deny: [],
87
87
  },
88
- // PreToolUse hook on code-search tools: injects a slim graph
89
- // subgraph as additional context so the agent needs fewer
90
- // follow-up whole-file reads (the navigation-layer token win).
91
- // ADDITIVE + FAIL-OPEN by construction `context-hook` only
92
- // ever adds context and silently no-ops when graph.json is
93
- // absent/stale, so the search tool always works normally.
88
+ // PreToolUse hook on the tools agents ACTUALLY use to navigate:
89
+ // Read/Edit (keyed on the file touched that file's structural
90
+ // map), Bash (parses grep/rg commands), and Grep/Glob (symbol
91
+ // match). Injects a slim graph slice as additional context so the
92
+ // agent needs fewer follow-up whole-file reads (the navigation-
93
+ // layer token win). Pre-2.10 only Grep/Glob were wired, and the
94
+ // hook almost never fired because real agents search via
95
+ // `Bash grep` and read files directly — the Read + Bash surfaces
96
+ // are what make the passive delivery actually engage.
97
+ // ADDITIVE + FAIL-OPEN by construction — `context-hook` only ever
98
+ // adds context and silently no-ops when graph.json is
99
+ // absent/stale, so the tool always works normally.
94
100
  hooks: {
95
101
  PreToolUse: [
96
102
  {
97
- matcher: 'Grep|Glob',
103
+ matcher: 'Read|Edit|Bash|Grep|Glob',
98
104
  hooks: [
99
105
  {
100
106
  type: 'command',
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,27 @@ export interface SnykIgnore {
44
44
  /** Snyk policy schema version dxkit emits. Matches the version Snyk's
45
45
  * own `snyk ignore` writes for the ignore/patch shape used here. */
46
46
  export declare const SNYK_POLICY_VERSION: "v1.25.0";
47
+ /**
48
+ * Convert `.dxkit-ignore` lines (gitignore syntax) into Snyk
49
+ * `exclude.global` glob patterns — the path-exclusion half of the
50
+ * dxkit ↔ Snyk sync, mirroring how allowlist entries become `.snyk`
51
+ * ignores. A directory dxkit skips for analysis should be a directory
52
+ * Snyk skips too, so the two tools agree on what's out of scope.
53
+ *
54
+ * Conversion (conservative — Snyk globs are path-relative):
55
+ * - `#` comments and blank lines are dropped.
56
+ * - Negations (`!pat`) are dropped: Snyk's exclude list has no
57
+ * re-include, and silently inverting one would be worse than
58
+ * omitting it.
59
+ * - A leading `/` (gitignore "anchored to root") is stripped.
60
+ * - A trailing `/` (explicit directory) → `dir/**`.
61
+ * - A bare name with no glob metacharacter (e.g. `vendor`,
62
+ * `generated`) is treated as a directory → `vendor/**`.
63
+ * - Anything already carrying a glob (`*.generated.ts`,
64
+ * `fixtures/**`) passes through unchanged.
65
+ * Results are de-duplicated, order-preserving.
66
+ */
67
+ export declare function dxkitIgnoreLinesToSnykExcludes(lines: ReadonlyArray<string>): string[];
47
68
  /**
48
69
  * Convert an allowlist entry's `expiresAt` (`YYYY-MM-DD`) into the ISO
49
70
  * datetime Snyk's policy file expects. Returns `undefined` for a
@@ -56,5 +77,5 @@ export declare function expiryToSnykDatetime(expiresAt: string | undefined): str
56
77
  * directives. Deterministic ordering (rules + paths sorted) so the
57
78
  * committed file has stable diffs across runs.
58
79
  */
59
- export declare function buildSnykPolicy(ignores: ReadonlyArray<SnykIgnore>): string;
80
+ export declare function buildSnykPolicy(ignores: ReadonlyArray<SnykIgnore>, excludes?: ReadonlyArray<string>): string;
60
81
  //# sourceMappingURL=snyk-policy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"snyk-policy.d.ts","sourceRoot":"","sources":["../../src/ingest/snyk-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,uEAAuE;AACvE,MAAM,WAAW,UAAU;IACzB,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;2EACuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;qEACqE;AACrE,eAAO,MAAM,mBAAmB,EAAG,SAAkB,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGtF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,MAAM,CAoC1E"}
1
+ {"version":3,"file":"snyk-policy.d.ts","sourceRoot":"","sources":["../../src/ingest/snyk-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,uEAAuE;AACvE,MAAM,WAAW,UAAU;IACzB,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;2EACuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;qEACqE;AACrE,eAAO,MAAM,mBAAmB,EAAG,SAAkB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAsBrF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGtF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,EAClC,QAAQ,GAAE,aAAa,CAAC,MAAM,CAAM,GACnC,MAAM,CA6CR"}
@@ -30,11 +30,58 @@
30
30
  */
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
32
  exports.SNYK_POLICY_VERSION = void 0;
33
+ exports.dxkitIgnoreLinesToSnykExcludes = dxkitIgnoreLinesToSnykExcludes;
33
34
  exports.expiryToSnykDatetime = expiryToSnykDatetime;
34
35
  exports.buildSnykPolicy = buildSnykPolicy;
35
36
  /** Snyk policy schema version dxkit emits. Matches the version Snyk's
36
37
  * own `snyk ignore` writes for the ignore/patch shape used here. */
37
38
  exports.SNYK_POLICY_VERSION = 'v1.25.0';
39
+ /**
40
+ * Convert `.dxkit-ignore` lines (gitignore syntax) into Snyk
41
+ * `exclude.global` glob patterns — the path-exclusion half of the
42
+ * dxkit ↔ Snyk sync, mirroring how allowlist entries become `.snyk`
43
+ * ignores. A directory dxkit skips for analysis should be a directory
44
+ * Snyk skips too, so the two tools agree on what's out of scope.
45
+ *
46
+ * Conversion (conservative — Snyk globs are path-relative):
47
+ * - `#` comments and blank lines are dropped.
48
+ * - Negations (`!pat`) are dropped: Snyk's exclude list has no
49
+ * re-include, and silently inverting one would be worse than
50
+ * omitting it.
51
+ * - A leading `/` (gitignore "anchored to root") is stripped.
52
+ * - A trailing `/` (explicit directory) → `dir/**`.
53
+ * - A bare name with no glob metacharacter (e.g. `vendor`,
54
+ * `generated`) is treated as a directory → `vendor/**`.
55
+ * - Anything already carrying a glob (`*.generated.ts`,
56
+ * `fixtures/**`) passes through unchanged.
57
+ * Results are de-duplicated, order-preserving.
58
+ */
59
+ function dxkitIgnoreLinesToSnykExcludes(lines) {
60
+ const out = [];
61
+ const seen = new Set();
62
+ for (const rawLine of lines) {
63
+ const line = rawLine.trim();
64
+ if (!line || line.startsWith('#') || line.startsWith('!'))
65
+ continue;
66
+ let pat = line.replace(/^\/+/, ''); // strip anchoring leading slash
67
+ if (!pat)
68
+ continue;
69
+ if (pat.endsWith('/')) {
70
+ pat = `${pat}**`;
71
+ }
72
+ else if (!/[*?[\]]/.test(pat)) {
73
+ // No glob metacharacter → a plain path. Treat as a directory so a
74
+ // bare `vendor` excludes its whole subtree (gitignore semantics),
75
+ // not just a single file named `vendor`.
76
+ pat = `${pat}/**`;
77
+ }
78
+ if (!seen.has(pat)) {
79
+ seen.add(pat);
80
+ out.push(pat);
81
+ }
82
+ }
83
+ return out;
84
+ }
38
85
  /**
39
86
  * Convert an allowlist entry's `expiresAt` (`YYYY-MM-DD`) into the ISO
40
87
  * datetime Snyk's policy file expects. Returns `undefined` for a
@@ -51,7 +98,7 @@ function expiryToSnykDatetime(expiresAt) {
51
98
  * directives. Deterministic ordering (rules + paths sorted) so the
52
99
  * committed file has stable diffs across runs.
53
100
  */
54
- function buildSnykPolicy(ignores) {
101
+ function buildSnykPolicy(ignores, excludes = []) {
55
102
  const byRule = new Map();
56
103
  for (const ig of ignores) {
57
104
  const list = byRule.get(ig.ruleId) ?? [];
@@ -64,27 +111,37 @@ function buildSnykPolicy(ignores) {
64
111
  ];
65
112
  if (byRule.size === 0) {
66
113
  lines.push('ignore: {}');
67
- lines.push('patch: {}');
68
- return lines.join('\n') + '\n';
69
114
  }
70
- lines.push('ignore:');
71
- for (const ruleId of [...byRule.keys()].sort()) {
72
- lines.push(` ${quoteKey(ruleId)}:`);
73
- const perPath = byRule.get(ruleId);
74
- // Stable order + one directive per unique path.
75
- const seen = new Set();
76
- for (const ig of perPath.slice().sort((a, b) => a.path.localeCompare(b.path))) {
77
- if (seen.has(ig.path))
78
- continue;
79
- seen.add(ig.path);
80
- lines.push(` - ${quoteKey(ig.path)}:`);
81
- lines.push(` reason: ${doubleQuote(ig.reason ?? '')}`);
82
- if (ig.expires)
83
- lines.push(` expires: ${ig.expires}`);
84
- lines.push(` created: ${ig.created}`);
115
+ else {
116
+ lines.push('ignore:');
117
+ for (const ruleId of [...byRule.keys()].sort()) {
118
+ lines.push(` ${quoteKey(ruleId)}:`);
119
+ const perPath = byRule.get(ruleId);
120
+ // Stable order + one directive per unique path.
121
+ const seen = new Set();
122
+ for (const ig of perPath.slice().sort((a, b) => a.path.localeCompare(b.path))) {
123
+ if (seen.has(ig.path))
124
+ continue;
125
+ seen.add(ig.path);
126
+ lines.push(` - ${quoteKey(ig.path)}:`);
127
+ lines.push(` reason: ${doubleQuote(ig.reason ?? '')}`);
128
+ if (ig.expires)
129
+ lines.push(` expires: ${ig.expires}`);
130
+ lines.push(` created: ${ig.created}`);
131
+ }
85
132
  }
86
133
  }
87
134
  lines.push('patch: {}');
135
+ // exclude.global — the path-exclusion half of the dxkit ↔ Snyk sync,
136
+ // sourced from `.dxkit-ignore`. Emitted only when present so an
137
+ // ignore-only export keeps its prior byte-for-byte shape.
138
+ if (excludes.length > 0) {
139
+ lines.push('exclude:');
140
+ lines.push(' global:');
141
+ for (const pat of excludes) {
142
+ lines.push(` - ${quoteKey(pat)}`);
143
+ }
144
+ }
88
145
  return lines.join('\n') + '\n';
89
146
  }
90
147
  // ─── Minimal scalar quoting ───────────────────────────────────────────────