@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.
- package/CHANGELOG.md +170 -0
- package/README.md +9 -0
- package/dist/allowlist/annotate.d.ts +71 -0
- package/dist/allowlist/annotate.d.ts.map +1 -0
- package/dist/allowlist/annotate.js +105 -0
- package/dist/allowlist/annotate.js.map +1 -0
- package/dist/allowlist/cli.d.ts +6 -0
- package/dist/allowlist/cli.d.ts.map +1 -1
- package/dist/allowlist/cli.js +70 -37
- package/dist/allowlist/cli.js.map +1 -1
- package/dist/analyzers/dashboard/index.d.ts.map +1 -1
- package/dist/analyzers/dashboard/index.js +6 -1
- package/dist/analyzers/dashboard/index.js.map +1 -1
- package/dist/analyzers/developer/gather.d.ts +16 -0
- package/dist/analyzers/developer/gather.d.ts.map +1 -1
- package/dist/analyzers/developer/gather.js +2 -0
- package/dist/analyzers/developer/gather.js.map +1 -1
- package/dist/analyzers/developer/ownership.d.ts +86 -0
- package/dist/analyzers/developer/ownership.d.ts.map +1 -0
- package/dist/analyzers/developer/ownership.js +180 -0
- package/dist/analyzers/developer/ownership.js.map +1 -0
- package/dist/analyzers/health.d.ts.map +1 -1
- package/dist/analyzers/health.js +17 -2
- package/dist/analyzers/health.js.map +1 -1
- package/dist/analyzers/quality/detailed.d.ts +5 -1
- package/dist/analyzers/quality/detailed.d.ts.map +1 -1
- package/dist/analyzers/quality/detailed.js +30 -29
- package/dist/analyzers/quality/detailed.js.map +1 -1
- package/dist/analyzers/security/actions.d.ts.map +1 -1
- package/dist/analyzers/security/actions.js +13 -0
- package/dist/analyzers/security/actions.js.map +1 -1
- package/dist/analyzers/security/aggregator.d.ts +18 -0
- package/dist/analyzers/security/aggregator.d.ts.map +1 -1
- package/dist/analyzers/security/aggregator.js +28 -0
- package/dist/analyzers/security/aggregator.js.map +1 -1
- package/dist/analyzers/security/detailed.d.ts +7 -1
- package/dist/analyzers/security/detailed.d.ts.map +1 -1
- package/dist/analyzers/security/detailed.js +31 -15
- package/dist/analyzers/security/detailed.js.map +1 -1
- package/dist/analyzers/security/gather.d.ts.map +1 -1
- package/dist/analyzers/security/gather.js +6 -0
- package/dist/analyzers/security/gather.js.map +1 -1
- package/dist/analyzers/security/index.d.ts.map +1 -1
- package/dist/analyzers/security/index.js +81 -2
- package/dist/analyzers/security/index.js.map +1 -1
- package/dist/analyzers/security/scanner-drift.d.ts +21 -0
- package/dist/analyzers/security/scanner-drift.d.ts.map +1 -0
- package/dist/analyzers/security/scanner-drift.js +113 -0
- package/dist/analyzers/security/scanner-drift.js.map +1 -0
- package/dist/analyzers/security/shallow.d.ts.map +1 -1
- package/dist/analyzers/security/shallow.js +24 -2
- package/dist/analyzers/security/shallow.js.map +1 -1
- package/dist/analyzers/security/types.d.ts +38 -0
- package/dist/analyzers/security/types.d.ts.map +1 -1
- package/dist/analyzers/tests/detailed.d.ts +5 -1
- package/dist/analyzers/tests/detailed.d.ts.map +1 -1
- package/dist/analyzers/tests/detailed.js +27 -20
- package/dist/analyzers/tests/detailed.js.map +1 -1
- package/dist/analyzers/tools/graphify.d.ts +11 -0
- package/dist/analyzers/tools/graphify.d.ts.map +1 -1
- package/dist/analyzers/tools/graphify.js +429 -413
- package/dist/analyzers/tools/graphify.js.map +1 -1
- package/dist/analyzers/tools/grep-secrets.d.ts.map +1 -1
- package/dist/analyzers/tools/grep-secrets.js +9 -0
- package/dist/analyzers/tools/grep-secrets.js.map +1 -1
- package/dist/analyzers/tools/osv-scanner-fix.d.ts.map +1 -1
- package/dist/analyzers/tools/osv-scanner-fix.js +12 -1
- package/dist/analyzers/tools/osv-scanner-fix.js.map +1 -1
- package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
- package/dist/analyzers/tools/tool-registry.js +78 -43
- package/dist/analyzers/tools/tool-registry.js.map +1 -1
- package/dist/analyzers/tools/walk-source-files.d.ts +10 -0
- package/dist/analyzers/tools/walk-source-files.d.ts.map +1 -1
- package/dist/analyzers/tools/walk-source-files.js +14 -0
- package/dist/analyzers/tools/walk-source-files.js.map +1 -1
- package/dist/analyzers/types.d.ts +9 -0
- package/dist/analyzers/types.d.ts.map +1 -1
- package/dist/attribution/attribute.d.ts +57 -0
- package/dist/attribution/attribute.d.ts.map +1 -0
- package/dist/attribution/attribute.js +149 -0
- package/dist/attribution/attribute.js.map +1 -0
- package/dist/baseline/entry-to-located.d.ts +12 -5
- package/dist/baseline/entry-to-located.d.ts.map +1 -1
- package/dist/baseline/entry-to-located.js +21 -7
- package/dist/baseline/entry-to-located.js.map +1 -1
- package/dist/baseline/git-aware-match.d.ts +7 -5
- package/dist/baseline/git-aware-match.d.ts.map +1 -1
- package/dist/baseline/git-aware-match.js +78 -5
- package/dist/baseline/git-aware-match.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +53 -5
- package/dist/cli.js.map +1 -1
- package/dist/explore/context-hook.d.ts +49 -29
- package/dist/explore/context-hook.d.ts.map +1 -1
- package/dist/explore/context-hook.js +304 -29
- package/dist/explore/context-hook.js.map +1 -1
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +13 -7
- package/dist/generator.js.map +1 -1
- package/dist/ingest/snyk-policy.d.ts +22 -1
- package/dist/ingest/snyk-policy.d.ts.map +1 -1
- package/dist/ingest/snyk-policy.js +75 -18
- package/dist/ingest/snyk-policy.js.map +1 -1
- package/dist/languages/index.d.ts +28 -5
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +38 -7
- package/dist/languages/index.js.map +1 -1
- package/dist/languages/typescript.d.ts.map +1 -1
- package/dist/languages/typescript.js +19 -0
- package/dist/languages/typescript.js.map +1 -1
- package/dist/reviewers-cli.d.ts +57 -0
- package/dist/reviewers-cli.d.ts.map +1 -0
- package/dist/reviewers-cli.js +263 -0
- package/dist/reviewers-cli.js.map +1 -0
- package/dist/scoring/dimensions/security.d.ts +17 -0
- package/dist/scoring/dimensions/security.d.ts.map +1 -1
- package/dist/scoring/dimensions/security.js +12 -0
- package/dist/scoring/dimensions/security.js.map +1 -1
- package/package.json +1 -1
- package/templates/.claude/skills/dxkit-action/SKILL.md +13 -2
- package/templates/.claude/skills/dxkit-allowlist/SKILL.md +9 -0
- package/templates/.claude/skills/dxkit-onboard/SKILL.md +2 -2
- 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`
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
|
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
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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
|
|
19
|
-
*
|
|
80
|
+
* (`{ tool_name, tool_input, session_id, cwd, ... }`) and reads a JSON
|
|
81
|
+
* object on stdout with `hookSpecificOutput.additionalContext`.
|
|
20
82
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
|
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,
|
|
31
|
-
* writes the hook output. Wrapped so nothing it
|
|
32
|
-
* tool call: every failure path resolves to a silent
|
|
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
|
|
40
|
-
if (!
|
|
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
|
|
46
|
-
if (!
|
|
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
|
-
|
|
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
|
|
62
|
-
*
|
|
63
|
-
*
|
|
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
|
|
86
|
-
* (the hook pays this cost on every grep): an anchor line,
|
|
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":"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"}
|
package/dist/generator.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
//
|
|
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',
|
package/dist/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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,
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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 ───────────────────────────────────────────────
|