@wrongstack/plugins 0.292.1 → 0.295.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/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 +31 -31
- package/dist/agent-handoff/index.d.ts +1 -1
- package/dist/agent-handoff/index.d.ts.map +1 -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-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 +2 -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 +9 -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/checkpoint/index.d.ts +1 -1
- package/dist/checkpoint/index.d.ts.map +1 -1
- package/dist/checkpoint.js +7 -8
- package/dist/code-metrics/index.d.ts +1 -1
- package/dist/code-metrics/index.d.ts.map +1 -1
- package/dist/code-metrics.js +29 -29
- package/dist/commit-validator/index.d.ts +1 -1
- package/dist/commit-validator/index.d.ts.map +1 -1
- 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/cost-tracker/index.d.ts +1 -1
- package/dist/cost-tracker/index.d.ts.map +1 -1
- package/dist/cost-tracker.js +9 -2
- package/dist/cron/index.d.ts +1 -1
- package/dist/cron/index.d.ts.map +1 -1
- 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 +26 -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 +34 -22
- package/dist/diff-summary/index.d.ts +1 -1
- package/dist/diff-summary/index.d.ts.map +1 -1
- package/dist/diff-summary.js +28 -29
- 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 +2 -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 +178 -67
- 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 +29 -29
- package/dist/file-watcher/index.d.ts +1 -1
- package/dist/file-watcher/index.d.ts.map +1 -1
- package/dist/format-on-save/index.d.ts +1 -1
- package/dist/format-on-save/index.d.ts.map +1 -1
- package/dist/format-on-save.js +2 -1
- 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 +2 -1
- package/dist/index.d.ts +4 -183
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17675 -17377
- 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 +29 -29
- package/dist/knowledge-graph/index.d.ts +1 -1
- package/dist/knowledge-graph/index.d.ts.map +1 -1
- 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 +10 -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 +10 -4
- 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 +2 -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/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/refactor-suggester/index.d.ts +1 -1
- package/dist/refactor-suggester/index.d.ts.map +1 -1
- package/dist/refactor-suggester.js +29 -29
- 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/index.d.ts +15 -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.js +43 -2
- 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 +2 -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 +7 -1
- 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 +26 -19
- package/dist/semantic-search-indexer/index.d.ts +1 -1
- package/dist/semantic-search-indexer/index.d.ts.map +1 -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 +78 -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 +4 -6
- 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 +29 -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 +2 -1
- package/dist/todo-listener/index.d.ts +1 -32
- package/dist/todo-listener/index.d.ts.map +1 -1
- package/dist/todo-tracker/index.d.ts +1 -1
- package/dist/todo-tracker/index.d.ts.map +1 -1
- 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/type-gate/index.d.ts +1 -1
- package/dist/type-gate/index.d.ts.map +1 -1
- package/dist/type-gate.js +11 -4
- package/package.json +80 -68
package/dist/checkpoint.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// src/checkpoint/index.ts
|
|
2
|
-
import {
|
|
3
|
-
import { readFile, stat } from "node:fs/promises";
|
|
2
|
+
import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
4
3
|
import { dirname, isAbsolute, relative, resolve } from "node:path";
|
|
5
4
|
var state = {
|
|
6
5
|
snapshots: [],
|
|
@@ -41,11 +40,11 @@ function hashContent(s) {
|
|
|
41
40
|
}
|
|
42
41
|
return h >>> 0;
|
|
43
42
|
}
|
|
44
|
-
function captureFile(path, maxBytes) {
|
|
43
|
+
async function captureFile(path, maxBytes) {
|
|
45
44
|
try {
|
|
46
|
-
const st =
|
|
45
|
+
const st = await stat(path);
|
|
47
46
|
if (st.size > maxBytes) return "too-large";
|
|
48
|
-
const content =
|
|
47
|
+
const content = await readFile(path, "utf-8");
|
|
49
48
|
return { path, content, bytes: st.size };
|
|
50
49
|
} catch {
|
|
51
50
|
return { path, content: null, bytes: 0 };
|
|
@@ -188,7 +187,7 @@ var plugin = {
|
|
|
188
187
|
rejectedOutsideProject.push(p);
|
|
189
188
|
continue;
|
|
190
189
|
}
|
|
191
|
-
const captured = captureFile(safePath, cfg.maxFileBytes);
|
|
190
|
+
const captured = await captureFile(safePath, cfg.maxFileBytes);
|
|
192
191
|
if (captured === "too-large") {
|
|
193
192
|
skipped += 1;
|
|
194
193
|
state.skippedLarge += 1;
|
|
@@ -298,8 +297,8 @@ var plugin = {
|
|
|
298
297
|
continue;
|
|
299
298
|
}
|
|
300
299
|
try {
|
|
301
|
-
|
|
302
|
-
|
|
300
|
+
await mkdir(dirname(f.path), { recursive: true });
|
|
301
|
+
await writeFile(f.path, f.content);
|
|
303
302
|
restored.push(f.path);
|
|
304
303
|
} catch (err) {
|
|
305
304
|
errors.push({ path: f.path, error: err instanceof Error ? err.message : String(err) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/code-metrics/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/code-metrics/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA6MrD,QAAA,MAAM,MAAM,EAAE,MAgMb,CAAC;eAEa,MAAM"}
|
package/dist/code-metrics.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// src/code-metrics/index.ts
|
|
2
|
-
import {
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
3
|
import { isAbsolute as isAbsolute2, relative as relative2, resolve as resolve2 } from "node:path";
|
|
4
4
|
|
|
5
5
|
// src/runtime/index.ts
|
|
6
|
-
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
7
6
|
import { basename, extname, isAbsolute, relative, resolve } from "node:path";
|
|
8
7
|
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
9
8
|
function hasLeadingDash(arg) {
|
|
@@ -17,44 +16,45 @@ function withinProjectPath(projectRoot, candidate) {
|
|
|
17
16
|
return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
|
|
18
17
|
}
|
|
19
18
|
function withinProject(p) {
|
|
20
|
-
|
|
19
|
+
const cwd = process.cwd();
|
|
20
|
+
return withinProjectPath(cwd, p) || relative(cwd, p) === ".";
|
|
21
21
|
}
|
|
22
22
|
var DEFAULT_EXCLUDE_DIRS = ["node_modules", "dist", ".git", "coverage"];
|
|
23
|
-
function
|
|
23
|
+
async function collectSourceFilesAsync(root, opts) {
|
|
24
|
+
const { readdir, stat } = await import("node:fs/promises");
|
|
24
25
|
const files = [];
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
try {
|
|
27
|
+
const s = await stat(root);
|
|
28
|
+
if (s.isFile()) {
|
|
29
|
+
if (matchesExtension(root, opts.extensions)) files.push(root);
|
|
30
|
+
return files;
|
|
31
|
+
}
|
|
32
|
+
if (!s.isDirectory()) return files;
|
|
33
|
+
} catch {
|
|
29
34
|
return files;
|
|
30
35
|
}
|
|
31
|
-
if (!s.isDirectory()) return files;
|
|
32
36
|
const exclude = opts.excludeDirs ?? DEFAULT_EXCLUDE_DIRS;
|
|
33
|
-
|
|
37
|
+
const excludeSet = new Set(exclude);
|
|
38
|
+
async function walk(dir, depth) {
|
|
34
39
|
if (opts.maxDepth !== void 0 && depth > opts.maxDepth) return;
|
|
35
40
|
let entries;
|
|
36
41
|
try {
|
|
37
|
-
entries =
|
|
42
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
38
43
|
} catch {
|
|
39
44
|
return;
|
|
40
45
|
}
|
|
46
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
41
47
|
for (const entry of entries) {
|
|
42
|
-
if (
|
|
43
|
-
const full = resolve(dir, entry);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
} catch {
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
if (st.isDirectory()) {
|
|
51
|
-
walk(full, depth + 1);
|
|
52
|
-
} else if (st.isFile() && matchesExtension(full, opts.extensions)) {
|
|
48
|
+
if (excludeSet.has(entry.name)) continue;
|
|
49
|
+
const full = resolve(dir, entry.name);
|
|
50
|
+
if (entry.isDirectory()) {
|
|
51
|
+
await walk(full, depth + 1);
|
|
52
|
+
} else if (entry.isFile() && matchesExtension(full, opts.extensions)) {
|
|
53
53
|
files.push(full);
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
walk(root, 0);
|
|
57
|
+
await walk(root, 0);
|
|
58
58
|
return files;
|
|
59
59
|
}
|
|
60
60
|
function matchesExtension(p, exts) {
|
|
@@ -166,16 +166,16 @@ function analyzeFile(filePath, content) {
|
|
|
166
166
|
complexity: countComplexity(content)
|
|
167
167
|
};
|
|
168
168
|
}
|
|
169
|
-
function measurePath(rawPath, cfg) {
|
|
169
|
+
async function measurePath(rawPath, cfg) {
|
|
170
170
|
const root = process.cwd();
|
|
171
171
|
const resolved = isAbsolute2(rawPath) ? resolve2(rawPath) : resolve2(root, rawPath);
|
|
172
172
|
const exts = normalizeExtensions(cfg.extensions);
|
|
173
|
-
const allFiles =
|
|
173
|
+
const allFiles = await collectSourceFilesAsync(resolved, { extensions: exts });
|
|
174
174
|
const files = allFiles.slice(0, cfg.maxFiles);
|
|
175
175
|
const metrics = [];
|
|
176
176
|
for (const p of files) {
|
|
177
177
|
try {
|
|
178
|
-
const content =
|
|
178
|
+
const content = await readFile(p, "utf-8");
|
|
179
179
|
metrics.push(analyzeFile(p, content));
|
|
180
180
|
} catch {
|
|
181
181
|
}
|
|
@@ -221,7 +221,7 @@ var plugin = {
|
|
|
221
221
|
state.hookUnregister = null;
|
|
222
222
|
}
|
|
223
223
|
const cfg = readConfig(api.config.extensions?.["code-metrics"]);
|
|
224
|
-
const hook = (input) => {
|
|
224
|
+
const hook = async (input) => {
|
|
225
225
|
if (!cfg.enabled) return;
|
|
226
226
|
if (input.toolResult?.isError) return;
|
|
227
227
|
const inp = input.toolInput ?? {};
|
|
@@ -234,7 +234,7 @@ var plugin = {
|
|
|
234
234
|
const resolved = resolve2(process.cwd(), sourcePath);
|
|
235
235
|
let content;
|
|
236
236
|
try {
|
|
237
|
-
content =
|
|
237
|
+
content = await readFile(resolved, "utf-8");
|
|
238
238
|
} catch {
|
|
239
239
|
state.errorCount += 1;
|
|
240
240
|
return;
|
|
@@ -267,7 +267,7 @@ var plugin = {
|
|
|
267
267
|
state.measureCount += 1;
|
|
268
268
|
let result;
|
|
269
269
|
try {
|
|
270
|
-
result = measurePath(rawPath, cfg);
|
|
270
|
+
result = await measurePath(rawPath, cfg);
|
|
271
271
|
} catch (err) {
|
|
272
272
|
state.errorCount += 1;
|
|
273
273
|
return { ok: false, error: String(err) };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commit-validator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commit-validator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAsPrD,QAAA,MAAM,MAAM,EAAE,MAgSb,CAAC;eAEa,MAAM"}
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
*
|
|
37
37
|
* @public
|
|
38
38
|
*/
|
|
39
|
-
import type { Plugin } from '@wrongstack/core';
|
|
39
|
+
import type { Plugin } from '@wrongstack/core/types';
|
|
40
40
|
export declare function validateJson(text: string, isJsonc: boolean, fileName: string): string[];
|
|
41
41
|
export declare function validateYaml(text: string): string[];
|
|
42
42
|
export declare function validateToml(text: string): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config-validator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config-validator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA0HrD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA2CvF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAuDnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAuCnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOjE;AAMD,QAAA,MAAM,MAAM,EAAE,MAqJb,CAAC;eAEa,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context-pins/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context-pins/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAMrD,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AA8GD,QAAA,MAAM,MAAM,EAAE,MA8Mb,CAAC;eAEa,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cost-tracker/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cost-tracker/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAKrD;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;CAChB;AAoLD,QAAA,MAAM,MAAM,EAAE,MAoab,CAAC;eAEa,MAAM"}
|
package/dist/cost-tracker.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/cost-tracker/index.ts
|
|
2
|
-
import { expectDefined } from "@wrongstack/core";
|
|
2
|
+
import { expectDefined } from "@wrongstack/core/utils";
|
|
3
3
|
var API_VERSION = "^0.1.10";
|
|
4
4
|
var PRICING = {
|
|
5
5
|
"gpt-4o": { input: 5, output: 15 },
|
|
@@ -28,8 +28,13 @@ function readCostTrackerConfig(raw) {
|
|
|
28
28
|
mailboxDigestTo: typeof digestTo === "string" && digestTo.length > 0 ? digestTo : "cost-tracker"
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
|
+
var modelKeyCache = /* @__PURE__ */ new Map();
|
|
31
32
|
function estimateCost(model, promptTokens, completionTokens) {
|
|
32
|
-
|
|
33
|
+
let key = modelKeyCache.get(model);
|
|
34
|
+
if (!key) {
|
|
35
|
+
key = model.toLowerCase();
|
|
36
|
+
modelKeyCache.set(model, key);
|
|
37
|
+
}
|
|
33
38
|
const pricing = pricingOverrides[key] ?? bundledFromRegistry[key] ?? PRICING[key] ?? DEFAULT_PRICING;
|
|
34
39
|
const inputCost = promptTokens / 1e6 * pricing.input;
|
|
35
40
|
const outputCost = completionTokens / 1e6 * pricing.output;
|
|
@@ -86,6 +91,7 @@ var plugin = {
|
|
|
86
91
|
for (const k of Object.keys(bundledFromRegistry)) {
|
|
87
92
|
delete bundledFromRegistry[k];
|
|
88
93
|
}
|
|
94
|
+
modelKeyCache.clear();
|
|
89
95
|
lastCost.usd = 0;
|
|
90
96
|
lastCost.model = null;
|
|
91
97
|
lastCost.at = null;
|
|
@@ -331,6 +337,7 @@ by model: ${top || "(none)"}`
|
|
|
331
337
|
for (const k of Object.keys(bundledFromRegistry)) {
|
|
332
338
|
delete bundledFromRegistry[k];
|
|
333
339
|
}
|
|
340
|
+
modelKeyCache.clear();
|
|
334
341
|
const finalLast = { ...lastCost };
|
|
335
342
|
lastCost.usd = 0;
|
|
336
343
|
lastCost.model = null;
|
package/dist/cron/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* - cron_list: List all scheduled jobs
|
|
7
7
|
* - cron_cancel: Cancel a scheduled job
|
|
8
8
|
*/
|
|
9
|
-
import type { Plugin } from '@wrongstack/core';
|
|
9
|
+
import type { Plugin } from '@wrongstack/core/types';
|
|
10
10
|
declare const plugin: Plugin;
|
|
11
11
|
export default plugin;
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cron/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cron/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cron/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA+FrD,QAAA,MAAM,MAAM,EAAE,MAqRb,CAAC;eAEa,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dead-code-detector/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dead-code-detector/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAiSrD,QAAA,MAAM,MAAM,EAAE,MAkOb,CAAC;eAEa,MAAM"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/dead-code-detector/index.ts
|
|
2
|
-
import {
|
|
2
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
3
3
|
import { extname as extname2, join, relative as relative2, resolve as resolve2 } from "node:path";
|
|
4
4
|
|
|
5
5
|
// src/runtime/index.ts
|
|
@@ -16,7 +16,8 @@ function withinProjectPath(projectRoot, candidate) {
|
|
|
16
16
|
return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
|
|
17
17
|
}
|
|
18
18
|
function withinProject(p) {
|
|
19
|
-
|
|
19
|
+
const cwd = process.cwd();
|
|
20
|
+
return withinProjectPath(cwd, p) || relative(cwd, p) === ".";
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
// src/dead-code-detector/index.ts
|
|
@@ -48,19 +49,21 @@ function readConfig(raw) {
|
|
|
48
49
|
excludeDirs: Array.isArray(r["excludeDirs"]) ? r["excludeDirs"].filter((x) => typeof x === "string") : DEFAULTS.excludeDirs
|
|
49
50
|
};
|
|
50
51
|
}
|
|
51
|
-
function gatherFiles(root, depth, cfg) {
|
|
52
|
+
async function gatherFiles(root, depth, cfg) {
|
|
52
53
|
const files = [];
|
|
53
|
-
|
|
54
|
+
const excludeSet = new Set(cfg.excludeDirs);
|
|
55
|
+
async function walk(dir, remaining) {
|
|
54
56
|
let entries;
|
|
55
57
|
try {
|
|
56
|
-
entries =
|
|
58
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
57
59
|
} catch {
|
|
58
60
|
return;
|
|
59
61
|
}
|
|
62
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
60
63
|
for (const entry of entries) {
|
|
61
64
|
if (entry.isDirectory()) {
|
|
62
|
-
if (remaining > 0 && !
|
|
63
|
-
walk(join(dir, entry.name), remaining - 1);
|
|
65
|
+
if (remaining > 0 && !excludeSet.has(entry.name)) {
|
|
66
|
+
await walk(join(dir, entry.name), remaining - 1);
|
|
64
67
|
}
|
|
65
68
|
} else if (entry.isFile()) {
|
|
66
69
|
const ext = extname2(entry.name).toLowerCase();
|
|
@@ -70,7 +73,7 @@ function gatherFiles(root, depth, cfg) {
|
|
|
70
73
|
}
|
|
71
74
|
}
|
|
72
75
|
}
|
|
73
|
-
walk(resolve2(root), depth);
|
|
76
|
+
await walk(resolve2(root), depth);
|
|
74
77
|
return files;
|
|
75
78
|
}
|
|
76
79
|
function stripNoise(content) {
|
|
@@ -139,24 +142,29 @@ function findUnusedSymbols(files) {
|
|
|
139
142
|
}
|
|
140
143
|
}
|
|
141
144
|
}
|
|
145
|
+
suspicious.sort((a, b) => {
|
|
146
|
+
const fileCompare = a.file.localeCompare(b.file);
|
|
147
|
+
if (fileCompare !== 0) return fileCompare;
|
|
148
|
+
return a.line - b.line;
|
|
149
|
+
});
|
|
142
150
|
return suspicious;
|
|
143
151
|
}
|
|
144
|
-
function scan(root, depth, cfg) {
|
|
145
|
-
const filePaths = gatherFiles(root, depth, cfg);
|
|
152
|
+
async function scan(root, depth, cfg) {
|
|
153
|
+
const filePaths = await gatherFiles(root, depth, cfg);
|
|
146
154
|
const files = [];
|
|
147
155
|
for (const p of filePaths) {
|
|
148
156
|
try {
|
|
149
|
-
const content =
|
|
157
|
+
const content = await readFile(p, "utf-8");
|
|
150
158
|
files.push({ path: p, content, stripped: stripNoise(content) });
|
|
151
159
|
} catch {
|
|
152
160
|
}
|
|
153
161
|
}
|
|
154
162
|
return { findings: findUnusedSymbols(files), scannedFiles: files.length };
|
|
155
163
|
}
|
|
156
|
-
function resolveScanRoot(rawPath) {
|
|
164
|
+
async function resolveScanRoot(rawPath) {
|
|
157
165
|
const resolved = resolve2(process.cwd(), rawPath);
|
|
158
166
|
try {
|
|
159
|
-
const stats =
|
|
167
|
+
const stats = await stat(resolved);
|
|
160
168
|
if (!stats.isDirectory()) {
|
|
161
169
|
return resolve2(resolved, "..");
|
|
162
170
|
}
|
|
@@ -221,7 +229,7 @@ var plugin = {
|
|
|
221
229
|
state.hookUnregister = null;
|
|
222
230
|
}
|
|
223
231
|
const cfg = readConfig(api.config.extensions?.["dead-code-detector"]);
|
|
224
|
-
const hook = (input) => {
|
|
232
|
+
const hook = async (input) => {
|
|
225
233
|
if (!cfg.enabled) return;
|
|
226
234
|
if (input.toolResult?.isError) return;
|
|
227
235
|
const inp = input.toolInput ?? {};
|
|
@@ -231,10 +239,10 @@ var plugin = {
|
|
|
231
239
|
const ext = sourcePath.includes(".") ? sourcePath.slice(sourcePath.lastIndexOf(".")).toLowerCase() : "";
|
|
232
240
|
if (!cfg.extensions.includes(ext)) return;
|
|
233
241
|
state.hookInvocationCount += 1;
|
|
234
|
-
const scanRoot = resolveScanRoot(sourcePath);
|
|
242
|
+
const scanRoot = await resolveScanRoot(sourcePath);
|
|
235
243
|
let result;
|
|
236
244
|
try {
|
|
237
|
-
result = scan(scanRoot, 1, cfg);
|
|
245
|
+
result = await scan(scanRoot, 1, cfg);
|
|
238
246
|
} catch {
|
|
239
247
|
state.errorCount += 1;
|
|
240
248
|
return;
|
|
@@ -289,10 +297,10 @@ Consider removing the export if it is not part of the public API.`;
|
|
|
289
297
|
return { ok: false, error: "scan path is outside the project root" };
|
|
290
298
|
}
|
|
291
299
|
state.scanCount += 1;
|
|
292
|
-
const scanRoot = resolveScanRoot(rawPath);
|
|
300
|
+
const scanRoot = await resolveScanRoot(rawPath);
|
|
293
301
|
let result;
|
|
294
302
|
try {
|
|
295
|
-
result = scan(scanRoot, depth, cfg);
|
|
303
|
+
result = await scan(scanRoot, depth, cfg);
|
|
296
304
|
} catch (err) {
|
|
297
305
|
state.errorCount += 1;
|
|
298
306
|
return { ok: false, error: String(err) };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dep-guard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dep-guard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAmFrD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAC3D;AAKD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAmCrE;AA0CD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAyBzD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOvD;AAMD,QAAA,MAAM,MAAM,EAAE,MAwPb,CAAC;eAEa,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dependency-vulnerability-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dependency-vulnerability-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAqPrD,QAAA,MAAM,MAAM,EAAE,MAwMb,CAAC;eAEa,MAAM"}
|
|
@@ -1,6 +1,6 @@
|
|
|
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
4
|
var API_VERSION = "^0.1.10";
|
|
5
5
|
var state = {
|
|
6
6
|
invocations: 0,
|
|
@@ -112,26 +112,38 @@ function isInstallCommand(input) {
|
|
|
112
112
|
const command = typeof ti["command"] === "string" ? ti["command"] : "";
|
|
113
113
|
return INSTALL_RE.test(command);
|
|
114
114
|
}
|
|
115
|
-
function detectManager() {
|
|
116
|
-
return existsSync("pnpm-lock.yaml") ? "pnpm" : "npm";
|
|
117
|
-
}
|
|
118
|
-
function runAudit(cfg) {
|
|
119
|
-
const manager = detectManager();
|
|
120
|
-
const start = Date.now();
|
|
121
|
-
let stdout = "";
|
|
115
|
+
async function detectManager() {
|
|
122
116
|
try {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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 ?? "";
|
|
117
|
+
await access("pnpm-lock.yaml");
|
|
118
|
+
return "pnpm";
|
|
119
|
+
} catch {
|
|
120
|
+
return "npm";
|
|
134
121
|
}
|
|
122
|
+
}
|
|
123
|
+
async function runAudit(cfg) {
|
|
124
|
+
const manager = await detectManager();
|
|
125
|
+
const start = Date.now();
|
|
126
|
+
const stdout = await new Promise((resolve) => {
|
|
127
|
+
execFile(
|
|
128
|
+
manager,
|
|
129
|
+
["audit", "--json"],
|
|
130
|
+
{
|
|
131
|
+
encoding: "utf8",
|
|
132
|
+
timeout: cfg.timeoutMs,
|
|
133
|
+
cwd: process.cwd(),
|
|
134
|
+
windowsHide: true,
|
|
135
|
+
maxBuffer: 10 * 1024 * 1024
|
|
136
|
+
},
|
|
137
|
+
(error, output) => {
|
|
138
|
+
if (error && error.killed) {
|
|
139
|
+
resolve(null);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
resolve(output);
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
if (stdout === null) return null;
|
|
135
147
|
const report = parseAuditJson(stdout);
|
|
136
148
|
if (!report) return null;
|
|
137
149
|
return { manager, report, durationMs: Date.now() - start };
|
|
@@ -186,14 +198,14 @@ var plugin = {
|
|
|
186
198
|
state.hookUnregister = null;
|
|
187
199
|
}
|
|
188
200
|
const cfg = readConfig(api.config.extensions?.["dependency-vulnerability-gate"]);
|
|
189
|
-
const hook = (input) => {
|
|
201
|
+
const hook = async (input) => {
|
|
190
202
|
if (!cfg.enabled) return;
|
|
191
203
|
state.invocations += 1;
|
|
192
204
|
if (input.toolResult?.isError) return;
|
|
193
205
|
if (!isInstallCommand(input)) return;
|
|
194
206
|
state.installsSeen += 1;
|
|
195
207
|
api.metrics.counter("installs_seen");
|
|
196
|
-
const result = runAudit(cfg);
|
|
208
|
+
const result = await runAudit(cfg);
|
|
197
209
|
if (!result) {
|
|
198
210
|
state.errors += 1;
|
|
199
211
|
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;AA2PrD,QAAA,MAAM,MAAM,EAAE,MA4Pb,CAAC;eAEa,MAAM"}
|