@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
package/dist/code-metrics.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
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";
|
|
7
|
+
|
|
8
|
+
// src/runtime/local-bin.ts
|
|
9
|
+
import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
|
|
10
|
+
|
|
11
|
+
// src/runtime/index.ts
|
|
8
12
|
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
9
13
|
function hasLeadingDash(arg) {
|
|
10
14
|
return arg.length > 0 && arg.startsWith("-");
|
|
@@ -17,44 +21,45 @@ function withinProjectPath(projectRoot, candidate) {
|
|
|
17
21
|
return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
|
|
18
22
|
}
|
|
19
23
|
function withinProject(p) {
|
|
20
|
-
|
|
24
|
+
const cwd = process.cwd();
|
|
25
|
+
return withinProjectPath(cwd, p) || relative(cwd, p) === ".";
|
|
21
26
|
}
|
|
22
27
|
var DEFAULT_EXCLUDE_DIRS = ["node_modules", "dist", ".git", "coverage"];
|
|
23
|
-
function
|
|
28
|
+
async function collectSourceFilesAsync(root, opts) {
|
|
29
|
+
const { readdir, stat } = await import("node:fs/promises");
|
|
24
30
|
const files = [];
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
try {
|
|
32
|
+
const s = await stat(root);
|
|
33
|
+
if (s.isFile()) {
|
|
34
|
+
if (matchesExtension(root, opts.extensions)) files.push(root);
|
|
35
|
+
return files;
|
|
36
|
+
}
|
|
37
|
+
if (!s.isDirectory()) return files;
|
|
38
|
+
} catch {
|
|
29
39
|
return files;
|
|
30
40
|
}
|
|
31
|
-
if (!s.isDirectory()) return files;
|
|
32
41
|
const exclude = opts.excludeDirs ?? DEFAULT_EXCLUDE_DIRS;
|
|
33
|
-
|
|
42
|
+
const excludeSet = new Set(exclude);
|
|
43
|
+
async function walk(dir, depth) {
|
|
34
44
|
if (opts.maxDepth !== void 0 && depth > opts.maxDepth) return;
|
|
35
45
|
let entries;
|
|
36
46
|
try {
|
|
37
|
-
entries =
|
|
47
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
38
48
|
} catch {
|
|
39
49
|
return;
|
|
40
50
|
}
|
|
51
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
41
52
|
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)) {
|
|
53
|
+
if (excludeSet.has(entry.name)) continue;
|
|
54
|
+
const full = resolve(dir, entry.name);
|
|
55
|
+
if (entry.isDirectory()) {
|
|
56
|
+
await walk(full, depth + 1);
|
|
57
|
+
} else if (entry.isFile() && matchesExtension(full, opts.extensions)) {
|
|
53
58
|
files.push(full);
|
|
54
59
|
}
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
|
-
walk(root, 0);
|
|
62
|
+
await walk(root, 0);
|
|
58
63
|
return files;
|
|
59
64
|
}
|
|
60
65
|
function matchesExtension(p, exts) {
|
|
@@ -166,16 +171,16 @@ function analyzeFile(filePath, content) {
|
|
|
166
171
|
complexity: countComplexity(content)
|
|
167
172
|
};
|
|
168
173
|
}
|
|
169
|
-
function measurePath(rawPath, cfg) {
|
|
174
|
+
async function measurePath(rawPath, cfg) {
|
|
170
175
|
const root = process.cwd();
|
|
171
176
|
const resolved = isAbsolute2(rawPath) ? resolve2(rawPath) : resolve2(root, rawPath);
|
|
172
177
|
const exts = normalizeExtensions(cfg.extensions);
|
|
173
|
-
const allFiles =
|
|
178
|
+
const allFiles = await collectSourceFilesAsync(resolved, { extensions: exts });
|
|
174
179
|
const files = allFiles.slice(0, cfg.maxFiles);
|
|
175
180
|
const metrics = [];
|
|
176
181
|
for (const p of files) {
|
|
177
182
|
try {
|
|
178
|
-
const content =
|
|
183
|
+
const content = await readFile(p, "utf-8");
|
|
179
184
|
metrics.push(analyzeFile(p, content));
|
|
180
185
|
} catch {
|
|
181
186
|
}
|
|
@@ -221,7 +226,7 @@ var plugin = {
|
|
|
221
226
|
state.hookUnregister = null;
|
|
222
227
|
}
|
|
223
228
|
const cfg = readConfig(api.config.extensions?.["code-metrics"]);
|
|
224
|
-
const hook = (input) => {
|
|
229
|
+
const hook = async (input) => {
|
|
225
230
|
if (!cfg.enabled) return;
|
|
226
231
|
if (input.toolResult?.isError) return;
|
|
227
232
|
const inp = input.toolInput ?? {};
|
|
@@ -234,7 +239,7 @@ var plugin = {
|
|
|
234
239
|
const resolved = resolve2(process.cwd(), sourcePath);
|
|
235
240
|
let content;
|
|
236
241
|
try {
|
|
237
|
-
content =
|
|
242
|
+
content = await readFile(resolved, "utf-8");
|
|
238
243
|
} catch {
|
|
239
244
|
state.errorCount += 1;
|
|
240
245
|
return;
|
|
@@ -267,7 +272,7 @@ var plugin = {
|
|
|
267
272
|
state.measureCount += 1;
|
|
268
273
|
let result;
|
|
269
274
|
try {
|
|
270
|
-
result = measurePath(rawPath, cfg);
|
|
275
|
+
result = await measurePath(rawPath, cfg);
|
|
271
276
|
} catch (err) {
|
|
272
277
|
state.errorCount += 1;
|
|
273
278
|
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;AAiRrD,QAAA,MAAM,MAAM,EAAE,MAgSb,CAAC;eAEa,MAAM"}
|
package/dist/commit-validator.js
CHANGED
|
@@ -116,14 +116,24 @@ function parseCommitMessage(message, cfg) {
|
|
|
116
116
|
errors
|
|
117
117
|
};
|
|
118
118
|
}
|
|
119
|
+
var GIT_MESSAGE_FLAG_RE = new RegExp(
|
|
120
|
+
[
|
|
121
|
+
// -m "…" | -m '…' | -m=… ; --message "…" | --message='…' | --message=…
|
|
122
|
+
String.raw`(?:^|\s)(?:-m|--message)(?:\s+|=)"([^"]*)"`,
|
|
123
|
+
String.raw`(?:^|\s)(?:-m|--message)(?:\s+|=)'([^']*)'`,
|
|
124
|
+
// Bare value: stops at whitespace or a shell separator.
|
|
125
|
+
String.raw`(?:^|\s)(?:-m|--message)(?:\s+|=)([^\s;&|"']+)`
|
|
126
|
+
].join("|"),
|
|
127
|
+
"g"
|
|
128
|
+
);
|
|
119
129
|
function extractMessageFromBash(command) {
|
|
120
|
-
const
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (
|
|
126
|
-
return
|
|
130
|
+
const parts = [];
|
|
131
|
+
for (const m of command.matchAll(GIT_MESSAGE_FLAG_RE)) {
|
|
132
|
+
const value = m[1] ?? m[2] ?? m[3];
|
|
133
|
+
if (value !== void 0) parts.push(value);
|
|
134
|
+
}
|
|
135
|
+
if (parts.length === 0) return null;
|
|
136
|
+
return parts.join("\n");
|
|
127
137
|
}
|
|
128
138
|
var plugin = {
|
|
129
139
|
name: "commit-validator",
|
|
@@ -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;AAOrD,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;AAoHD,QAAA,MAAM,MAAM,EAAE,MA8Mb,CAAC;eAEa,MAAM"}
|
package/dist/context-pins.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// src/context-pins/index.ts
|
|
2
2
|
import * as fs from "node:fs";
|
|
3
3
|
import { dirname, isAbsolute, relative, resolve } from "node:path";
|
|
4
|
+
import { atomicWrite, ensureDir } from "@wrongstack/core/utils";
|
|
4
5
|
var state = {
|
|
5
6
|
pins: [],
|
|
6
7
|
nextId: 1,
|
|
@@ -47,11 +48,11 @@ function loadPins(filePath) {
|
|
|
47
48
|
return { pins: [], nextId: 1 };
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
|
-
function persistPins(filePath) {
|
|
51
|
+
async function persistPins(filePath) {
|
|
51
52
|
if (!filePath) return true;
|
|
52
53
|
try {
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
await ensureDir(dirname(filePath));
|
|
55
|
+
await atomicWrite(filePath, JSON.stringify({ pins: state.pins, nextId: state.nextId }, null, 2));
|
|
55
56
|
return true;
|
|
56
57
|
} catch {
|
|
57
58
|
state.persistErrors += 1;
|
|
@@ -149,7 +150,7 @@ var plugin = {
|
|
|
149
150
|
state.pins.push(pin);
|
|
150
151
|
state.adds += 1;
|
|
151
152
|
api.metrics.counter("adds");
|
|
152
|
-
const persisted = persistPins(cfg.filePath);
|
|
153
|
+
const persisted = await persistPins(cfg.filePath);
|
|
153
154
|
return { ok: true, pin, persisted, totalPins: state.pins.length };
|
|
154
155
|
}
|
|
155
156
|
});
|
|
@@ -175,7 +176,7 @@ var plugin = {
|
|
|
175
176
|
if (removed === 0) return { ok: false, error: `no pin matches "${key}"` };
|
|
176
177
|
state.removals += removed;
|
|
177
178
|
api.metrics.counter("removals", removed);
|
|
178
|
-
const persisted = persistPins(cfg.filePath);
|
|
179
|
+
const persisted = await persistPins(cfg.filePath);
|
|
179
180
|
return { ok: true, removed, persisted, totalPins: state.pins.length };
|
|
180
181
|
}
|
|
181
182
|
});
|
|
@@ -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;AAMrD;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;CAChB;AAuLD,QAAA,MAAM,MAAM,EAAE,MAoab,CAAC;eAEa,MAAM"}
|
package/dist/cost-tracker.js
CHANGED
|
@@ -1,5 +1,105 @@
|
|
|
1
|
+
// src/runtime/local-bin.ts
|
|
2
|
+
import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
|
|
3
|
+
|
|
4
|
+
// src/runtime/bounded-map.ts
|
|
5
|
+
var BoundedMap = class {
|
|
6
|
+
map = /* @__PURE__ */ new Map();
|
|
7
|
+
max;
|
|
8
|
+
ttlMs;
|
|
9
|
+
now;
|
|
10
|
+
/** Entries dropped to stay under `max`. Surfaced by plugin health(). */
|
|
11
|
+
evictions = 0;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
const normalizedMax = Math.floor(options.max);
|
|
14
|
+
this.max = Number.isSafeInteger(normalizedMax) ? Math.max(1, normalizedMax) : 1;
|
|
15
|
+
this.ttlMs = options.ttlMs;
|
|
16
|
+
this.now = options.now ?? Date.now;
|
|
17
|
+
}
|
|
18
|
+
expired(entry) {
|
|
19
|
+
return this.ttlMs !== void 0 && this.now() - entry.storedAt > this.ttlMs;
|
|
20
|
+
}
|
|
21
|
+
get(key) {
|
|
22
|
+
const entry = this.map.get(key);
|
|
23
|
+
if (entry === void 0) return void 0;
|
|
24
|
+
if (this.expired(entry)) {
|
|
25
|
+
this.map.delete(key);
|
|
26
|
+
return void 0;
|
|
27
|
+
}
|
|
28
|
+
this.map.delete(key);
|
|
29
|
+
this.map.set(key, entry);
|
|
30
|
+
return entry.value;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Read without promoting the key to most-recently-used. Use for
|
|
34
|
+
* diagnostics that must not perturb the eviction order.
|
|
35
|
+
*/
|
|
36
|
+
peek(key) {
|
|
37
|
+
const entry = this.map.get(key);
|
|
38
|
+
if (entry === void 0 || this.expired(entry)) return void 0;
|
|
39
|
+
return entry.value;
|
|
40
|
+
}
|
|
41
|
+
has(key) {
|
|
42
|
+
const entry = this.map.get(key);
|
|
43
|
+
if (entry === void 0) return false;
|
|
44
|
+
if (this.expired(entry)) {
|
|
45
|
+
this.map.delete(key);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
set(key, value) {
|
|
51
|
+
this.map.delete(key);
|
|
52
|
+
this.map.set(key, { value, storedAt: this.now() });
|
|
53
|
+
while (this.map.size > this.max) {
|
|
54
|
+
const coldest = this.map.keys().next().value;
|
|
55
|
+
if (coldest === void 0) break;
|
|
56
|
+
this.map.delete(coldest);
|
|
57
|
+
this.evictions += 1;
|
|
58
|
+
}
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
delete(key) {
|
|
62
|
+
return this.map.delete(key);
|
|
63
|
+
}
|
|
64
|
+
clear() {
|
|
65
|
+
this.map.clear();
|
|
66
|
+
this.evictions = 0;
|
|
67
|
+
}
|
|
68
|
+
get size() {
|
|
69
|
+
return this.map.size;
|
|
70
|
+
}
|
|
71
|
+
/** How many entries have been dropped to respect `max`, since the last clear. */
|
|
72
|
+
get evictionCount() {
|
|
73
|
+
return this.evictions;
|
|
74
|
+
}
|
|
75
|
+
/** Drop every expired entry. Cheap enough to call from a status tool. */
|
|
76
|
+
prune() {
|
|
77
|
+
if (this.ttlMs === void 0) return 0;
|
|
78
|
+
let removed = 0;
|
|
79
|
+
for (const [key, entry] of this.map) {
|
|
80
|
+
if (this.expired(entry)) {
|
|
81
|
+
this.map.delete(key);
|
|
82
|
+
removed += 1;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return removed;
|
|
86
|
+
}
|
|
87
|
+
/** Live (non-expired) entries, coldest first. */
|
|
88
|
+
*entries() {
|
|
89
|
+
for (const [key, entry] of this.map) {
|
|
90
|
+
if (!this.expired(entry)) yield [key, entry.value];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
[Symbol.iterator]() {
|
|
94
|
+
return this.entries();
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
// src/runtime/index.ts
|
|
99
|
+
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
100
|
+
|
|
1
101
|
// src/cost-tracker/index.ts
|
|
2
|
-
import { expectDefined } from "@wrongstack/core";
|
|
102
|
+
import { expectDefined } from "@wrongstack/core/utils";
|
|
3
103
|
var API_VERSION = "^0.1.10";
|
|
4
104
|
var PRICING = {
|
|
5
105
|
"gpt-4o": { input: 5, output: 15 },
|
|
@@ -28,8 +128,13 @@ function readCostTrackerConfig(raw) {
|
|
|
28
128
|
mailboxDigestTo: typeof digestTo === "string" && digestTo.length > 0 ? digestTo : "cost-tracker"
|
|
29
129
|
};
|
|
30
130
|
}
|
|
131
|
+
var modelKeyCache = new BoundedMap({ max: 256 });
|
|
31
132
|
function estimateCost(model, promptTokens, completionTokens) {
|
|
32
|
-
|
|
133
|
+
let key = modelKeyCache.get(model);
|
|
134
|
+
if (!key) {
|
|
135
|
+
key = model.toLowerCase();
|
|
136
|
+
modelKeyCache.set(model, key);
|
|
137
|
+
}
|
|
33
138
|
const pricing = pricingOverrides[key] ?? bundledFromRegistry[key] ?? PRICING[key] ?? DEFAULT_PRICING;
|
|
34
139
|
const inputCost = promptTokens / 1e6 * pricing.input;
|
|
35
140
|
const outputCost = completionTokens / 1e6 * pricing.output;
|
|
@@ -86,6 +191,7 @@ var plugin = {
|
|
|
86
191
|
for (const k of Object.keys(bundledFromRegistry)) {
|
|
87
192
|
delete bundledFromRegistry[k];
|
|
88
193
|
}
|
|
194
|
+
modelKeyCache.clear();
|
|
89
195
|
lastCost.usd = 0;
|
|
90
196
|
lastCost.model = null;
|
|
91
197
|
lastCost.at = null;
|
|
@@ -331,6 +437,7 @@ by model: ${top || "(none)"}`
|
|
|
331
437
|
for (const k of Object.keys(bundledFromRegistry)) {
|
|
332
438
|
delete bundledFromRegistry[k];
|
|
333
439
|
}
|
|
440
|
+
modelKeyCache.clear();
|
|
334
441
|
const finalLast = { ...lastCost };
|
|
335
442
|
lastCost.usd = 0;
|
|
336
443
|
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,MA2Rb,CAAC;eAEa,MAAM"}
|
package/dist/cron.js
CHANGED
|
@@ -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,9 +1,14 @@
|
|
|
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
|
|
6
6
|
import { basename, extname, isAbsolute, relative, resolve } from "node:path";
|
|
7
|
+
|
|
8
|
+
// src/runtime/local-bin.ts
|
|
9
|
+
import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
|
|
10
|
+
|
|
11
|
+
// src/runtime/index.ts
|
|
7
12
|
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
8
13
|
function hasLeadingDash(arg) {
|
|
9
14
|
return arg.length > 0 && arg.startsWith("-");
|
|
@@ -16,7 +21,8 @@ function withinProjectPath(projectRoot, candidate) {
|
|
|
16
21
|
return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
|
|
17
22
|
}
|
|
18
23
|
function withinProject(p) {
|
|
19
|
-
|
|
24
|
+
const cwd = process.cwd();
|
|
25
|
+
return withinProjectPath(cwd, p) || relative(cwd, p) === ".";
|
|
20
26
|
}
|
|
21
27
|
|
|
22
28
|
// src/dead-code-detector/index.ts
|
|
@@ -48,19 +54,21 @@ function readConfig(raw) {
|
|
|
48
54
|
excludeDirs: Array.isArray(r["excludeDirs"]) ? r["excludeDirs"].filter((x) => typeof x === "string") : DEFAULTS.excludeDirs
|
|
49
55
|
};
|
|
50
56
|
}
|
|
51
|
-
function gatherFiles(root, depth, cfg) {
|
|
57
|
+
async function gatherFiles(root, depth, cfg) {
|
|
52
58
|
const files = [];
|
|
53
|
-
|
|
59
|
+
const excludeSet = new Set(cfg.excludeDirs);
|
|
60
|
+
async function walk(dir, remaining) {
|
|
54
61
|
let entries;
|
|
55
62
|
try {
|
|
56
|
-
entries =
|
|
63
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
57
64
|
} catch {
|
|
58
65
|
return;
|
|
59
66
|
}
|
|
67
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
60
68
|
for (const entry of entries) {
|
|
61
69
|
if (entry.isDirectory()) {
|
|
62
|
-
if (remaining > 0 && !
|
|
63
|
-
walk(join(dir, entry.name), remaining - 1);
|
|
70
|
+
if (remaining > 0 && !excludeSet.has(entry.name)) {
|
|
71
|
+
await walk(join(dir, entry.name), remaining - 1);
|
|
64
72
|
}
|
|
65
73
|
} else if (entry.isFile()) {
|
|
66
74
|
const ext = extname2(entry.name).toLowerCase();
|
|
@@ -70,7 +78,7 @@ function gatherFiles(root, depth, cfg) {
|
|
|
70
78
|
}
|
|
71
79
|
}
|
|
72
80
|
}
|
|
73
|
-
walk(resolve2(root), depth);
|
|
81
|
+
await walk(resolve2(root), depth);
|
|
74
82
|
return files;
|
|
75
83
|
}
|
|
76
84
|
function stripNoise(content) {
|
|
@@ -139,24 +147,29 @@ function findUnusedSymbols(files) {
|
|
|
139
147
|
}
|
|
140
148
|
}
|
|
141
149
|
}
|
|
150
|
+
suspicious.sort((a, b) => {
|
|
151
|
+
const fileCompare = a.file.localeCompare(b.file);
|
|
152
|
+
if (fileCompare !== 0) return fileCompare;
|
|
153
|
+
return a.line - b.line;
|
|
154
|
+
});
|
|
142
155
|
return suspicious;
|
|
143
156
|
}
|
|
144
|
-
function scan(root, depth, cfg) {
|
|
145
|
-
const filePaths = gatherFiles(root, depth, cfg);
|
|
157
|
+
async function scan(root, depth, cfg) {
|
|
158
|
+
const filePaths = await gatherFiles(root, depth, cfg);
|
|
146
159
|
const files = [];
|
|
147
160
|
for (const p of filePaths) {
|
|
148
161
|
try {
|
|
149
|
-
const content =
|
|
162
|
+
const content = await readFile(p, "utf-8");
|
|
150
163
|
files.push({ path: p, content, stripped: stripNoise(content) });
|
|
151
164
|
} catch {
|
|
152
165
|
}
|
|
153
166
|
}
|
|
154
167
|
return { findings: findUnusedSymbols(files), scannedFiles: files.length };
|
|
155
168
|
}
|
|
156
|
-
function resolveScanRoot(rawPath) {
|
|
169
|
+
async function resolveScanRoot(rawPath) {
|
|
157
170
|
const resolved = resolve2(process.cwd(), rawPath);
|
|
158
171
|
try {
|
|
159
|
-
const stats =
|
|
172
|
+
const stats = await stat(resolved);
|
|
160
173
|
if (!stats.isDirectory()) {
|
|
161
174
|
return resolve2(resolved, "..");
|
|
162
175
|
}
|
|
@@ -221,7 +234,7 @@ var plugin = {
|
|
|
221
234
|
state.hookUnregister = null;
|
|
222
235
|
}
|
|
223
236
|
const cfg = readConfig(api.config.extensions?.["dead-code-detector"]);
|
|
224
|
-
const hook = (input) => {
|
|
237
|
+
const hook = async (input) => {
|
|
225
238
|
if (!cfg.enabled) return;
|
|
226
239
|
if (input.toolResult?.isError) return;
|
|
227
240
|
const inp = input.toolInput ?? {};
|
|
@@ -231,10 +244,10 @@ var plugin = {
|
|
|
231
244
|
const ext = sourcePath.includes(".") ? sourcePath.slice(sourcePath.lastIndexOf(".")).toLowerCase() : "";
|
|
232
245
|
if (!cfg.extensions.includes(ext)) return;
|
|
233
246
|
state.hookInvocationCount += 1;
|
|
234
|
-
const scanRoot = resolveScanRoot(sourcePath);
|
|
247
|
+
const scanRoot = await resolveScanRoot(sourcePath);
|
|
235
248
|
let result;
|
|
236
249
|
try {
|
|
237
|
-
result = scan(scanRoot, 1, cfg);
|
|
250
|
+
result = await scan(scanRoot, 1, cfg);
|
|
238
251
|
} catch {
|
|
239
252
|
state.errorCount += 1;
|
|
240
253
|
return;
|
|
@@ -289,10 +302,10 @@ Consider removing the export if it is not part of the public API.`;
|
|
|
289
302
|
return { ok: false, error: "scan path is outside the project root" };
|
|
290
303
|
}
|
|
291
304
|
state.scanCount += 1;
|
|
292
|
-
const scanRoot = resolveScanRoot(rawPath);
|
|
305
|
+
const scanRoot = await resolveScanRoot(rawPath);
|
|
293
306
|
let result;
|
|
294
307
|
try {
|
|
295
|
-
result = scan(scanRoot, depth, cfg);
|
|
308
|
+
result = await scan(scanRoot, depth, cfg);
|
|
296
309
|
} catch (err) {
|
|
297
310
|
state.errorCount += 1;
|
|
298
311
|
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;AA2RrD,QAAA,MAAM,MAAM,EAAE,MAwMb,CAAC;eAEa,MAAM"}
|