@wrongstack/plugins 0.293.0 → 0.295.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -71
- package/dist/accessibility-auditor/index.d.ts +1 -1
- package/dist/accessibility-auditor/index.d.ts.map +1 -1
- package/dist/accessibility-auditor.js +50 -33
- package/dist/agent-handoff/index.d.ts +1 -1
- package/dist/agent-handoff/index.d.ts.map +1 -1
- package/dist/agent-handoff.js +30 -1
- package/dist/api-compatibility-gate/index.d.ts +1 -1
- package/dist/api-compatibility-gate/index.d.ts.map +1 -1
- package/dist/api-compatibility-gate.js +21 -16
- package/dist/audit/index.d.ts +386 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit.d.ts +1 -0
- package/dist/audit.js +454 -0
- package/dist/auto-doc/index.d.ts +1 -1
- package/dist/auto-doc/index.d.ts.map +1 -1
- package/dist/auto-doc.js +3 -1
- package/dist/auto-escalate/index.d.ts +1 -1
- package/dist/auto-escalate/index.d.ts.map +1 -1
- package/dist/auto-i18n-extractor/index.d.ts +1 -1
- package/dist/auto-i18n-extractor/index.d.ts.map +1 -1
- package/dist/auto-i18n-extractor.js +7 -1
- package/dist/branch-guard/index.d.ts +1 -1
- package/dist/branch-guard/index.d.ts.map +1 -1
- package/dist/branch-guard.js +111 -1
- package/dist/catalog.d.ts +5 -30
- package/dist/catalog.d.ts.map +1 -1
- package/dist/changelog-writer/index.d.ts +1 -1
- package/dist/changelog-writer/index.d.ts.map +1 -1
- package/dist/changelog-writer.js +137 -3
- package/dist/checkpoint/index.d.ts +3 -1
- package/dist/checkpoint/index.d.ts.map +1 -1
- package/dist/checkpoint.js +41 -16
- package/dist/code-metrics/index.d.ts +1 -1
- package/dist/code-metrics/index.d.ts.map +1 -1
- package/dist/code-metrics.js +34 -29
- package/dist/commit-validator/index.d.ts +1 -1
- package/dist/commit-validator/index.d.ts.map +1 -1
- package/dist/commit-validator.js +17 -7
- package/dist/config-validator/index.d.ts +1 -1
- package/dist/config-validator/index.d.ts.map +1 -1
- package/dist/context-pins/index.d.ts +1 -1
- package/dist/context-pins/index.d.ts.map +1 -1
- package/dist/context-pins.js +6 -5
- package/dist/cost-tracker/index.d.ts +1 -1
- package/dist/cost-tracker/index.d.ts.map +1 -1
- package/dist/cost-tracker.js +109 -2
- package/dist/cron/index.d.ts +1 -1
- package/dist/cron/index.d.ts.map +1 -1
- package/dist/cron.js +1 -0
- package/dist/dead-code-detector/index.d.ts +1 -1
- package/dist/dead-code-detector/index.d.ts.map +1 -1
- package/dist/dead-code-detector.js +31 -18
- package/dist/dep-guard/index.d.ts +1 -1
- package/dist/dep-guard/index.d.ts.map +1 -1
- package/dist/dependency-vulnerability-gate/index.d.ts +1 -1
- package/dist/dependency-vulnerability-gate/index.d.ts.map +1 -1
- package/dist/dependency-vulnerability-gate.js +67 -20
- package/dist/diff-summary/index.d.ts +1 -1
- package/dist/diff-summary/index.d.ts.map +1 -1
- package/dist/diff-summary.js +128 -30
- package/dist/doc-sync-guard/index.d.ts +1 -1
- package/dist/doc-sync-guard/index.d.ts.map +1 -1
- package/dist/doc-sync-guard.js +7 -1
- package/dist/duplicate-code-detector/index.d.ts +26 -1
- package/dist/duplicate-code-detector/index.d.ts.map +1 -1
- package/dist/duplicate-code-detector.js +280 -69
- package/dist/error-lens/index.d.ts +1 -1
- package/dist/error-lens/index.d.ts.map +1 -1
- package/dist/factories/index.d.ts +4 -0
- package/dist/factories/index.d.ts.map +1 -0
- package/dist/factories.d.ts +1 -0
- package/dist/factories.js +74 -0
- package/dist/feature-flag-tracker/index.d.ts +1 -1
- package/dist/feature-flag-tracker/index.d.ts.map +1 -1
- package/dist/feature-flag-tracker.js +59 -33
- package/dist/file-watcher/index.d.ts +1 -1
- package/dist/file-watcher/index.d.ts.map +1 -1
- package/dist/file-watcher.js +6 -7
- package/dist/format-on-save/index.d.ts +3 -1
- package/dist/format-on-save/index.d.ts.map +1 -1
- package/dist/format-on-save.js +289 -59
- package/dist/generated-plugin-exports.d.ts +65 -0
- package/dist/generated-plugin-exports.d.ts.map +1 -0
- package/dist/git-autocommit/index.d.ts +1 -1
- package/dist/git-autocommit/index.d.ts.map +1 -1
- package/dist/import-organizer/index.d.ts +1 -1
- package/dist/import-organizer/index.d.ts.map +1 -1
- package/dist/import-organizer.js +141 -20
- package/dist/index.d.ts +4 -183
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18298 -17279
- package/dist/injection-shield/index.d.ts +1 -1
- package/dist/injection-shield/index.d.ts.map +1 -1
- package/dist/interface-contract-guard/index.d.ts +1 -1
- package/dist/interface-contract-guard/index.d.ts.map +1 -1
- package/dist/interface-contract-guard.js +87 -53
- package/dist/knowledge-graph/index.d.ts +1 -1
- package/dist/knowledge-graph/index.d.ts.map +1 -1
- package/dist/knowledge-graph.js +7 -6
- package/dist/license-audit-gate/index.d.ts +1 -1
- package/dist/license-audit-gate/index.d.ts.map +1 -1
- package/dist/lint-gate/index.d.ts +1 -1
- package/dist/lint-gate/index.d.ts.map +1 -1
- package/dist/lint-gate.js +112 -1
- package/dist/llm-cache/index.d.ts +5 -1
- package/dist/llm-cache/index.d.ts.map +1 -1
- package/dist/llm-cache.js +16 -8
- package/dist/loop-breaker/index.d.ts +1 -1
- package/dist/loop-breaker/index.d.ts.map +1 -1
- package/dist/loop-breaker.js +25 -9
- package/dist/manifest/index.d.ts +16 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest.d.ts +1 -0
- package/dist/manifest.js +152 -0
- package/dist/migration-planner/index.d.ts +1 -1
- package/dist/migration-planner/index.d.ts.map +1 -1
- package/dist/migration-planner.js +5 -1
- package/dist/model-router/index.d.ts +1 -1
- package/dist/model-router/index.d.ts.map +1 -1
- package/dist/notify-hub/index.d.ts +1 -1
- package/dist/notify-hub/index.d.ts.map +1 -1
- package/dist/notify-hub/webhook-channel.d.ts +1 -1
- package/dist/notify-hub/webhook-channel.d.ts.map +1 -1
- package/dist/notify-hub.js +41 -4
- package/dist/path-guard/index.d.ts +1 -1
- package/dist/path-guard/index.d.ts.map +1 -1
- package/dist/performance-regression-gate/index.d.ts +1 -1
- package/dist/performance-regression-gate/index.d.ts.map +1 -1
- package/dist/plugin-stack-observer/index.d.ts +1 -1
- package/dist/plugin-stack-observer/index.d.ts.map +1 -1
- package/dist/pr-drafter/index.d.ts +1 -1
- package/dist/pr-drafter/index.d.ts.map +1 -1
- package/dist/pr-drafter.js +28 -29
- package/dist/process-guard/index.d.ts +1 -1
- package/dist/process-guard/index.d.ts.map +1 -1
- package/dist/prompt-firewall/index.d.ts +1 -1
- package/dist/prompt-firewall/index.d.ts.map +1 -1
- package/dist/prompt-firewall.js +140 -11
- package/dist/refactor-suggester/index.d.ts +1 -1
- package/dist/refactor-suggester/index.d.ts.map +1 -1
- package/dist/refactor-suggester.js +148 -33
- package/dist/release-notes-generator/index.d.ts +1 -1
- package/dist/release-notes-generator/index.d.ts.map +1 -1
- package/dist/release-notes-generator.js +29 -22
- package/dist/runtime/bounded-map.d.ts +86 -0
- package/dist/runtime/bounded-map.d.ts.map +1 -0
- package/dist/runtime/credential-patterns.d.ts +42 -0
- package/dist/runtime/credential-patterns.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +18 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/llm.d.ts +1 -1
- package/dist/runtime/llm.d.ts.map +1 -1
- package/dist/runtime/local-bin.d.ts +120 -0
- package/dist/runtime/local-bin.d.ts.map +1 -0
- package/dist/runtime/safe-json.d.ts +25 -0
- package/dist/runtime/safe-json.d.ts.map +1 -0
- package/dist/runtime.js +332 -22
- package/dist/schema-evolution-guard/index.d.ts +1 -1
- package/dist/schema-evolution-guard/index.d.ts.map +1 -1
- package/dist/schema-evolution-guard.js +7 -1
- package/dist/secret-scanner/index.d.ts +1 -1
- package/dist/secret-scanner/index.d.ts.map +1 -1
- package/dist/secret-scanner.js +181 -48
- package/dist/security-hotspot-scanner/index.d.ts +1 -1
- package/dist/security-hotspot-scanner/index.d.ts.map +1 -1
- package/dist/security-hotspot-scanner.js +158 -20
- package/dist/semantic-search-indexer/index.d.ts +1 -1
- package/dist/semantic-search-indexer/index.d.ts.map +1 -1
- package/dist/semantic-search-indexer.js +7 -1
- package/dist/semver-bump/index.d.ts +1 -1
- package/dist/semver-bump/index.d.ts.map +1 -1
- package/dist/semver-bump.js +97 -43
- package/dist/session-recap/index.d.ts +1 -1
- package/dist/session-recap/index.d.ts.map +1 -1
- package/dist/shell-check/index.d.ts +1 -1
- package/dist/shell-check/index.d.ts.map +1 -1
- package/dist/smart-rename/index.d.ts +1 -1
- package/dist/smart-rename/index.d.ts.map +1 -1
- package/dist/spec-linker/index.d.ts +1 -1
- package/dist/spec-linker/index.d.ts.map +1 -1
- package/dist/spec-linker.js +222 -20772
- package/dist/template-engine/index.d.ts +1 -1
- package/dist/template-engine/index.d.ts.map +1 -1
- package/dist/template-engine.js +34 -8
- package/dist/test-coverage-gate/index.d.ts +1 -1
- package/dist/test-coverage-gate/index.d.ts.map +1 -1
- package/dist/test-coverage-gate.js +34 -14
- package/dist/test-flake-detector/index.d.ts +1 -1
- package/dist/test-flake-detector/index.d.ts.map +1 -1
- package/dist/test-flake-detector.js +31 -20
- package/dist/test-generator/index.d.ts +1 -1
- package/dist/test-generator/index.d.ts.map +1 -1
- package/dist/test-runner-gate/index.d.ts +1 -1
- package/dist/test-runner-gate/index.d.ts.map +1 -1
- package/dist/test-runner-gate.js +132 -9
- package/dist/todo-listener/index.d.ts +1 -32
- package/dist/todo-listener/index.d.ts.map +1 -1
- package/dist/todo-listener.js +30 -1
- package/dist/todo-tracker/index.d.ts +1 -1
- package/dist/todo-tracker/index.d.ts.map +1 -1
- package/dist/todo-tracker.js +3 -4
- package/dist/token-budget/index.d.ts +1 -1
- package/dist/token-budget/index.d.ts.map +1 -1
- package/dist/token-throttle/index.d.ts +1 -1
- package/dist/token-throttle/index.d.ts.map +1 -1
- package/dist/token-throttle.js +17 -2
- package/dist/type-gate/index.d.ts +1 -1
- package/dist/type-gate/index.d.ts.map +1 -1
- package/dist/type-gate.js +106 -19
- package/package.json +80 -68
|
@@ -1,6 +1,24 @@
|
|
|
1
1
|
// src/dependency-vulnerability-gate/index.ts
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { execFile } from "node:child_process";
|
|
3
|
+
import { access } from "node:fs/promises";
|
|
4
|
+
|
|
5
|
+
// src/runtime/local-bin.ts
|
|
6
|
+
import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
|
|
7
|
+
function resolveExecInvocation(command, args = []) {
|
|
8
|
+
const resolved = resolveWin32Command(command);
|
|
9
|
+
const normalizedResolved = resolved.toLowerCase();
|
|
10
|
+
const needsShell = process.platform === "win32" && (normalizedResolved.endsWith(".cmd") || normalizedResolved.endsWith(".bat"));
|
|
11
|
+
if (needsShell) {
|
|
12
|
+
const shim = buildWin32CmdShimInvocation(resolved, args);
|
|
13
|
+
return { cmd: shim.command, args: shim.args, windowsVerbatimArguments: true };
|
|
14
|
+
}
|
|
15
|
+
return { cmd: resolved, args: [...args], windowsVerbatimArguments: false };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// src/runtime/index.ts
|
|
19
|
+
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
20
|
+
|
|
21
|
+
// src/dependency-vulnerability-gate/index.ts
|
|
4
22
|
var API_VERSION = "^0.1.10";
|
|
5
23
|
var state = {
|
|
6
24
|
invocations: 0,
|
|
@@ -112,26 +130,55 @@ function isInstallCommand(input) {
|
|
|
112
130
|
const command = typeof ti["command"] === "string" ? ti["command"] : "";
|
|
113
131
|
return INSTALL_RE.test(command);
|
|
114
132
|
}
|
|
115
|
-
|
|
116
|
-
|
|
133
|
+
var LOCKFILE_MANAGERS = [
|
|
134
|
+
{ file: "pnpm-lock.yaml", manager: "pnpm" },
|
|
135
|
+
{ file: "bun.lockb", manager: "bun" },
|
|
136
|
+
{ file: "bun.lock", manager: "bun" },
|
|
137
|
+
{ file: "yarn.lock", manager: "yarn" },
|
|
138
|
+
{ file: "package-lock.json", manager: "npm" }
|
|
139
|
+
];
|
|
140
|
+
async function detectManager() {
|
|
141
|
+
for (const { file, manager } of LOCKFILE_MANAGERS) {
|
|
142
|
+
try {
|
|
143
|
+
await access(file);
|
|
144
|
+
return manager;
|
|
145
|
+
} catch {
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return "npm";
|
|
117
149
|
}
|
|
118
|
-
function runAudit(cfg) {
|
|
119
|
-
const manager = detectManager();
|
|
150
|
+
async function runAudit(cfg) {
|
|
151
|
+
const manager = await detectManager();
|
|
120
152
|
const start = Date.now();
|
|
121
|
-
let
|
|
153
|
+
let invocation;
|
|
122
154
|
try {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
cwd: process.cwd(),
|
|
127
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
128
|
-
shell: false
|
|
129
|
-
});
|
|
130
|
-
} catch (err) {
|
|
131
|
-
const e = err;
|
|
132
|
-
if (e.killed) return null;
|
|
133
|
-
stdout = e.stdout ?? "";
|
|
155
|
+
invocation = resolveExecInvocation(manager, ["audit", "--json"]);
|
|
156
|
+
} catch {
|
|
157
|
+
return null;
|
|
134
158
|
}
|
|
159
|
+
const stdout = await new Promise((resolve) => {
|
|
160
|
+
execFile(
|
|
161
|
+
invocation.cmd,
|
|
162
|
+
invocation.args,
|
|
163
|
+
{
|
|
164
|
+
encoding: "utf8",
|
|
165
|
+
timeout: cfg.timeoutMs,
|
|
166
|
+
cwd: process.cwd(),
|
|
167
|
+
windowsHide: true,
|
|
168
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
169
|
+
shell: false,
|
|
170
|
+
...invocation.windowsVerbatimArguments ? { windowsVerbatimArguments: true } : {}
|
|
171
|
+
},
|
|
172
|
+
(error, output) => {
|
|
173
|
+
if (error && error.killed) {
|
|
174
|
+
resolve(null);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
resolve(output);
|
|
178
|
+
}
|
|
179
|
+
);
|
|
180
|
+
});
|
|
181
|
+
if (stdout === null) return null;
|
|
135
182
|
const report = parseAuditJson(stdout);
|
|
136
183
|
if (!report) return null;
|
|
137
184
|
return { manager, report, durationMs: Date.now() - start };
|
|
@@ -186,14 +233,14 @@ var plugin = {
|
|
|
186
233
|
state.hookUnregister = null;
|
|
187
234
|
}
|
|
188
235
|
const cfg = readConfig(api.config.extensions?.["dependency-vulnerability-gate"]);
|
|
189
|
-
const hook = (input) => {
|
|
236
|
+
const hook = async (input) => {
|
|
190
237
|
if (!cfg.enabled) return;
|
|
191
238
|
state.invocations += 1;
|
|
192
239
|
if (input.toolResult?.isError) return;
|
|
193
240
|
if (!isInstallCommand(input)) return;
|
|
194
241
|
state.installsSeen += 1;
|
|
195
242
|
api.metrics.counter("installs_seen");
|
|
196
|
-
const result = runAudit(cfg);
|
|
243
|
+
const result = await runAudit(cfg);
|
|
197
244
|
if (!result) {
|
|
198
245
|
state.errors += 1;
|
|
199
246
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/diff-summary/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/diff-summary/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA+PrD,QAAA,MAAM,MAAM,EAAE,MA4Pb,CAAC;eAEa,MAAM"}
|
package/dist/diff-summary.js
CHANGED
|
@@ -1,8 +1,107 @@
|
|
|
1
1
|
// src/diff-summary/index.ts
|
|
2
|
-
import {
|
|
2
|
+
import { execFile } from "node:child_process";
|
|
3
3
|
|
|
4
4
|
// src/runtime/index.ts
|
|
5
5
|
import { basename, extname, isAbsolute, relative, resolve } from "node:path";
|
|
6
|
+
|
|
7
|
+
// src/runtime/local-bin.ts
|
|
8
|
+
import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
|
|
9
|
+
|
|
10
|
+
// src/runtime/bounded-map.ts
|
|
11
|
+
var BoundedMap = class {
|
|
12
|
+
map = /* @__PURE__ */ new Map();
|
|
13
|
+
max;
|
|
14
|
+
ttlMs;
|
|
15
|
+
now;
|
|
16
|
+
/** Entries dropped to stay under `max`. Surfaced by plugin health(). */
|
|
17
|
+
evictions = 0;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
const normalizedMax = Math.floor(options.max);
|
|
20
|
+
this.max = Number.isSafeInteger(normalizedMax) ? Math.max(1, normalizedMax) : 1;
|
|
21
|
+
this.ttlMs = options.ttlMs;
|
|
22
|
+
this.now = options.now ?? Date.now;
|
|
23
|
+
}
|
|
24
|
+
expired(entry) {
|
|
25
|
+
return this.ttlMs !== void 0 && this.now() - entry.storedAt > this.ttlMs;
|
|
26
|
+
}
|
|
27
|
+
get(key) {
|
|
28
|
+
const entry = this.map.get(key);
|
|
29
|
+
if (entry === void 0) return void 0;
|
|
30
|
+
if (this.expired(entry)) {
|
|
31
|
+
this.map.delete(key);
|
|
32
|
+
return void 0;
|
|
33
|
+
}
|
|
34
|
+
this.map.delete(key);
|
|
35
|
+
this.map.set(key, entry);
|
|
36
|
+
return entry.value;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Read without promoting the key to most-recently-used. Use for
|
|
40
|
+
* diagnostics that must not perturb the eviction order.
|
|
41
|
+
*/
|
|
42
|
+
peek(key) {
|
|
43
|
+
const entry = this.map.get(key);
|
|
44
|
+
if (entry === void 0 || this.expired(entry)) return void 0;
|
|
45
|
+
return entry.value;
|
|
46
|
+
}
|
|
47
|
+
has(key) {
|
|
48
|
+
const entry = this.map.get(key);
|
|
49
|
+
if (entry === void 0) return false;
|
|
50
|
+
if (this.expired(entry)) {
|
|
51
|
+
this.map.delete(key);
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
set(key, value) {
|
|
57
|
+
this.map.delete(key);
|
|
58
|
+
this.map.set(key, { value, storedAt: this.now() });
|
|
59
|
+
while (this.map.size > this.max) {
|
|
60
|
+
const coldest = this.map.keys().next().value;
|
|
61
|
+
if (coldest === void 0) break;
|
|
62
|
+
this.map.delete(coldest);
|
|
63
|
+
this.evictions += 1;
|
|
64
|
+
}
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
delete(key) {
|
|
68
|
+
return this.map.delete(key);
|
|
69
|
+
}
|
|
70
|
+
clear() {
|
|
71
|
+
this.map.clear();
|
|
72
|
+
this.evictions = 0;
|
|
73
|
+
}
|
|
74
|
+
get size() {
|
|
75
|
+
return this.map.size;
|
|
76
|
+
}
|
|
77
|
+
/** How many entries have been dropped to respect `max`, since the last clear. */
|
|
78
|
+
get evictionCount() {
|
|
79
|
+
return this.evictions;
|
|
80
|
+
}
|
|
81
|
+
/** Drop every expired entry. Cheap enough to call from a status tool. */
|
|
82
|
+
prune() {
|
|
83
|
+
if (this.ttlMs === void 0) return 0;
|
|
84
|
+
let removed = 0;
|
|
85
|
+
for (const [key, entry] of this.map) {
|
|
86
|
+
if (this.expired(entry)) {
|
|
87
|
+
this.map.delete(key);
|
|
88
|
+
removed += 1;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return removed;
|
|
92
|
+
}
|
|
93
|
+
/** Live (non-expired) entries, coldest first. */
|
|
94
|
+
*entries() {
|
|
95
|
+
for (const [key, entry] of this.map) {
|
|
96
|
+
if (!this.expired(entry)) yield [key, entry.value];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
[Symbol.iterator]() {
|
|
100
|
+
return this.entries();
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// src/runtime/index.ts
|
|
6
105
|
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
7
106
|
function hasLeadingDash(arg) {
|
|
8
107
|
return arg.length > 0 && arg.startsWith("-");
|
|
@@ -15,7 +114,8 @@ function withinProjectPath(projectRoot, candidate) {
|
|
|
15
114
|
return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
|
|
16
115
|
}
|
|
17
116
|
function withinProject(p) {
|
|
18
|
-
|
|
117
|
+
const cwd = process.cwd();
|
|
118
|
+
return withinProjectPath(cwd, p) || relative(cwd, p) === ".";
|
|
19
119
|
}
|
|
20
120
|
|
|
21
121
|
// src/diff-summary/index.ts
|
|
@@ -63,37 +163,35 @@ function contentHash(s) {
|
|
|
63
163
|
}
|
|
64
164
|
return h >>> 0;
|
|
65
165
|
}
|
|
66
|
-
var pathMemo =
|
|
67
|
-
function
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
166
|
+
var pathMemo = new BoundedMap({ max: 512 });
|
|
167
|
+
function runGit(args, cwd) {
|
|
168
|
+
return new Promise((resolveCommand) => {
|
|
169
|
+
execFile(
|
|
170
|
+
"git",
|
|
171
|
+
args,
|
|
172
|
+
{
|
|
173
|
+
encoding: "utf8",
|
|
174
|
+
timeout: 3e3,
|
|
175
|
+
cwd,
|
|
176
|
+
windowsHide: true,
|
|
177
|
+
maxBuffer: 5 * 1024 * 1024
|
|
178
|
+
},
|
|
179
|
+
(error, stdout) => resolveCommand({ ok: !error, stdout })
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
async function getGitDiff(filePath, contextLines, cwd) {
|
|
184
|
+
const tracked = await runGit(["ls-files", "--error-unmatch", "--", filePath], cwd);
|
|
185
|
+
const isTracked = tracked.ok;
|
|
81
186
|
try {
|
|
82
187
|
let rawDiff;
|
|
83
188
|
const contextFlag = `-U${contextLines}`;
|
|
84
189
|
if (isTracked) {
|
|
85
|
-
|
|
190
|
+
const result = await runGit(["diff", contextFlag, "--", filePath], cwd);
|
|
191
|
+
if (!result.ok) return null;
|
|
192
|
+
rawDiff = result.stdout;
|
|
86
193
|
} else {
|
|
87
|
-
|
|
88
|
-
rawDiff = execFileSync(
|
|
89
|
-
"git",
|
|
90
|
-
["diff", "--no-index", contextFlag, "/dev/null", filePath],
|
|
91
|
-
opts
|
|
92
|
-
);
|
|
93
|
-
} catch (err) {
|
|
94
|
-
const e = err;
|
|
95
|
-
rawDiff = e.stdout ?? "";
|
|
96
|
-
}
|
|
194
|
+
rawDiff = (await runGit(["diff", "--no-index", contextFlag, "/dev/null", filePath], cwd)).stdout;
|
|
97
195
|
}
|
|
98
196
|
if (!rawDiff.trim()) {
|
|
99
197
|
return { diff: "", added: 0, removed: 0, isNewFile: !isTracked };
|
|
@@ -185,7 +283,7 @@ var plugin = {
|
|
|
185
283
|
pathMemo.clear();
|
|
186
284
|
const cfg = readConfig(api.config.extensions?.["diff-summary"]);
|
|
187
285
|
const cwd = typeof process.cwd === "function" ? process.cwd() : void 0;
|
|
188
|
-
const hook = (input) => {
|
|
286
|
+
const hook = async (input) => {
|
|
189
287
|
if (cfg.mode === "off") return;
|
|
190
288
|
if (input.toolResult?.isError) return;
|
|
191
289
|
const toolName = input.toolName ?? "";
|
|
@@ -212,7 +310,7 @@ var plugin = {
|
|
|
212
310
|
return;
|
|
213
311
|
}
|
|
214
312
|
}
|
|
215
|
-
const result = getGitDiff(filePath, cfg.includeContext, cwd);
|
|
313
|
+
const result = await getGitDiff(filePath, cfg.includeContext, cwd);
|
|
216
314
|
if (!result) {
|
|
217
315
|
state.fallbackCount += 1;
|
|
218
316
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/doc-sync-guard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/doc-sync-guard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA0IrD,QAAA,MAAM,MAAM,EAAE,MAuJb,CAAC;eAEa,MAAM"}
|
package/dist/doc-sync-guard.js
CHANGED
|
@@ -3,6 +3,11 @@ import { basename as basename2, extname as extname2 } from "node:path";
|
|
|
3
3
|
|
|
4
4
|
// src/runtime/index.ts
|
|
5
5
|
import { basename, extname, isAbsolute, relative, resolve } from "node:path";
|
|
6
|
+
|
|
7
|
+
// src/runtime/local-bin.ts
|
|
8
|
+
import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
|
|
9
|
+
|
|
10
|
+
// src/runtime/index.ts
|
|
6
11
|
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
7
12
|
function hasLeadingDash(arg) {
|
|
8
13
|
return arg.length > 0 && arg.startsWith("-");
|
|
@@ -15,7 +20,8 @@ function withinProjectPath(projectRoot, candidate) {
|
|
|
15
20
|
return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
|
|
16
21
|
}
|
|
17
22
|
function withinProject(p) {
|
|
18
|
-
|
|
23
|
+
const cwd = process.cwd();
|
|
24
|
+
return withinProjectPath(cwd, p) || relative(cwd, p) === ".";
|
|
19
25
|
}
|
|
20
26
|
|
|
21
27
|
// src/doc-sync-guard/index.ts
|
|
@@ -25,7 +25,32 @@
|
|
|
25
25
|
*
|
|
26
26
|
* @public
|
|
27
27
|
*/
|
|
28
|
-
import type { Plugin } from '@wrongstack/core';
|
|
28
|
+
import type { Plugin } from '@wrongstack/core/types';
|
|
29
|
+
/**
|
|
30
|
+
* Tunable budgets that bound the hook fingerprint index. Keeping the defaults
|
|
31
|
+
* together makes the file, fingerprint, and byte limits explicit.
|
|
32
|
+
*/
|
|
33
|
+
export declare const hookIndexBudgets: {
|
|
34
|
+
/** Max number of files retained in the hook fingerprint index (LRU-evicted). */
|
|
35
|
+
maxFiles: number;
|
|
36
|
+
/** Max total fingerprints across the whole index (running-sum enforced, LRU-evicted). */
|
|
37
|
+
maxFingerprints: number;
|
|
38
|
+
/**
|
|
39
|
+
* Max candidate windows hashed and cached per file by the advisory hook. The
|
|
40
|
+
* on-demand detect_duplicate_code tool intentionally scans every window.
|
|
41
|
+
*/
|
|
42
|
+
maxFingerprintsPerFile: number;
|
|
43
|
+
/** Files larger than this are skipped entirely by the hook (never read/extracted/cached). */
|
|
44
|
+
maxFileBytes: number;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Compact 53-bit hash of a fingerprint string. The hook index can retain up to
|
|
48
|
+
* 300k fingerprints, where a 32-bit hash has a material birthday-collision risk
|
|
49
|
+
* and can emit a false duplicate warning. The result remains a JS-safe integer,
|
|
50
|
+
* so the index keeps the compact `Set<number>` representation instead of storing
|
|
51
|
+
* raw fingerprint text.
|
|
52
|
+
*/
|
|
53
|
+
export declare function hashFingerprint(fp: string): number;
|
|
29
54
|
declare const plugin: Plugin;
|
|
30
55
|
export default plugin;
|
|
31
56
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/duplicate-code-detector/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/duplicate-code-detector/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA8FrD;;;GAGG;AACH,eAAO,MAAM,gBAAgB;IAC3B,gFAAgF;IAChF,QAAQ;IACR,yFAAyF;IACzF,eAAe;IACf;;;OAGG;IACH,sBAAsB;IACtB,6FAA6F;IAC7F,YAAY;CACb,CAAC;AAyGF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAelD;AA4HD,QAAA,MAAM,MAAM,EAAE,MA4Wb,CAAC;eAEa,MAAM"}
|