@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.
Files changed (189) hide show
  1. package/README.md +7 -71
  2. package/dist/accessibility-auditor/index.d.ts +1 -1
  3. package/dist/accessibility-auditor/index.d.ts.map +1 -1
  4. package/dist/accessibility-auditor.js +31 -31
  5. package/dist/agent-handoff/index.d.ts +1 -1
  6. package/dist/agent-handoff/index.d.ts.map +1 -1
  7. package/dist/api-compatibility-gate/index.d.ts +1 -1
  8. package/dist/api-compatibility-gate/index.d.ts.map +1 -1
  9. package/dist/api-compatibility-gate.js +21 -16
  10. package/dist/audit/index.d.ts +386 -0
  11. package/dist/audit/index.d.ts.map +1 -0
  12. package/dist/audit.d.ts +1 -0
  13. package/dist/audit.js +454 -0
  14. package/dist/auto-doc/index.d.ts +1 -1
  15. package/dist/auto-doc/index.d.ts.map +1 -1
  16. package/dist/auto-escalate/index.d.ts +1 -1
  17. package/dist/auto-escalate/index.d.ts.map +1 -1
  18. package/dist/auto-i18n-extractor/index.d.ts +1 -1
  19. package/dist/auto-i18n-extractor/index.d.ts.map +1 -1
  20. package/dist/auto-i18n-extractor.js +2 -1
  21. package/dist/branch-guard/index.d.ts +1 -1
  22. package/dist/branch-guard/index.d.ts.map +1 -1
  23. package/dist/branch-guard.js +9 -1
  24. package/dist/catalog.d.ts +5 -30
  25. package/dist/catalog.d.ts.map +1 -1
  26. package/dist/changelog-writer/index.d.ts +1 -1
  27. package/dist/changelog-writer/index.d.ts.map +1 -1
  28. package/dist/checkpoint/index.d.ts +1 -1
  29. package/dist/checkpoint/index.d.ts.map +1 -1
  30. package/dist/checkpoint.js +7 -8
  31. package/dist/code-metrics/index.d.ts +1 -1
  32. package/dist/code-metrics/index.d.ts.map +1 -1
  33. package/dist/code-metrics.js +29 -29
  34. package/dist/commit-validator/index.d.ts +1 -1
  35. package/dist/commit-validator/index.d.ts.map +1 -1
  36. package/dist/config-validator/index.d.ts +1 -1
  37. package/dist/config-validator/index.d.ts.map +1 -1
  38. package/dist/context-pins/index.d.ts +1 -1
  39. package/dist/context-pins/index.d.ts.map +1 -1
  40. package/dist/cost-tracker/index.d.ts +1 -1
  41. package/dist/cost-tracker/index.d.ts.map +1 -1
  42. package/dist/cost-tracker.js +9 -2
  43. package/dist/cron/index.d.ts +1 -1
  44. package/dist/cron/index.d.ts.map +1 -1
  45. package/dist/dead-code-detector/index.d.ts +1 -1
  46. package/dist/dead-code-detector/index.d.ts.map +1 -1
  47. package/dist/dead-code-detector.js +26 -18
  48. package/dist/dep-guard/index.d.ts +1 -1
  49. package/dist/dep-guard/index.d.ts.map +1 -1
  50. package/dist/dependency-vulnerability-gate/index.d.ts +1 -1
  51. package/dist/dependency-vulnerability-gate/index.d.ts.map +1 -1
  52. package/dist/dependency-vulnerability-gate.js +34 -22
  53. package/dist/diff-summary/index.d.ts +1 -1
  54. package/dist/diff-summary/index.d.ts.map +1 -1
  55. package/dist/diff-summary.js +28 -29
  56. package/dist/doc-sync-guard/index.d.ts +1 -1
  57. package/dist/doc-sync-guard/index.d.ts.map +1 -1
  58. package/dist/doc-sync-guard.js +2 -1
  59. package/dist/duplicate-code-detector/index.d.ts +26 -1
  60. package/dist/duplicate-code-detector/index.d.ts.map +1 -1
  61. package/dist/duplicate-code-detector.js +178 -67
  62. package/dist/error-lens/index.d.ts +1 -1
  63. package/dist/error-lens/index.d.ts.map +1 -1
  64. package/dist/factories/index.d.ts +4 -0
  65. package/dist/factories/index.d.ts.map +1 -0
  66. package/dist/factories.d.ts +1 -0
  67. package/dist/factories.js +74 -0
  68. package/dist/feature-flag-tracker/index.d.ts +1 -1
  69. package/dist/feature-flag-tracker/index.d.ts.map +1 -1
  70. package/dist/feature-flag-tracker.js +29 -29
  71. package/dist/file-watcher/index.d.ts +1 -1
  72. package/dist/file-watcher/index.d.ts.map +1 -1
  73. package/dist/format-on-save/index.d.ts +1 -1
  74. package/dist/format-on-save/index.d.ts.map +1 -1
  75. package/dist/format-on-save.js +2 -1
  76. package/dist/generated-plugin-exports.d.ts +65 -0
  77. package/dist/generated-plugin-exports.d.ts.map +1 -0
  78. package/dist/git-autocommit/index.d.ts +1 -1
  79. package/dist/git-autocommit/index.d.ts.map +1 -1
  80. package/dist/import-organizer/index.d.ts +1 -1
  81. package/dist/import-organizer/index.d.ts.map +1 -1
  82. package/dist/import-organizer.js +2 -1
  83. package/dist/index.d.ts +4 -183
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +17675 -17377
  86. package/dist/injection-shield/index.d.ts +1 -1
  87. package/dist/injection-shield/index.d.ts.map +1 -1
  88. package/dist/interface-contract-guard/index.d.ts +1 -1
  89. package/dist/interface-contract-guard/index.d.ts.map +1 -1
  90. package/dist/interface-contract-guard.js +29 -29
  91. package/dist/knowledge-graph/index.d.ts +1 -1
  92. package/dist/knowledge-graph/index.d.ts.map +1 -1
  93. package/dist/license-audit-gate/index.d.ts +1 -1
  94. package/dist/license-audit-gate/index.d.ts.map +1 -1
  95. package/dist/lint-gate/index.d.ts +1 -1
  96. package/dist/lint-gate/index.d.ts.map +1 -1
  97. package/dist/lint-gate.js +10 -1
  98. package/dist/llm-cache/index.d.ts +5 -1
  99. package/dist/llm-cache/index.d.ts.map +1 -1
  100. package/dist/llm-cache.js +16 -8
  101. package/dist/loop-breaker/index.d.ts +1 -1
  102. package/dist/loop-breaker/index.d.ts.map +1 -1
  103. package/dist/loop-breaker.js +10 -4
  104. package/dist/manifest/index.d.ts +16 -0
  105. package/dist/manifest/index.d.ts.map +1 -0
  106. package/dist/manifest.d.ts +1 -0
  107. package/dist/manifest.js +152 -0
  108. package/dist/migration-planner/index.d.ts +1 -1
  109. package/dist/migration-planner/index.d.ts.map +1 -1
  110. package/dist/migration-planner.js +2 -1
  111. package/dist/model-router/index.d.ts +1 -1
  112. package/dist/model-router/index.d.ts.map +1 -1
  113. package/dist/notify-hub/index.d.ts +1 -1
  114. package/dist/notify-hub/index.d.ts.map +1 -1
  115. package/dist/notify-hub/webhook-channel.d.ts +1 -1
  116. package/dist/notify-hub/webhook-channel.d.ts.map +1 -1
  117. package/dist/path-guard/index.d.ts +1 -1
  118. package/dist/path-guard/index.d.ts.map +1 -1
  119. package/dist/performance-regression-gate/index.d.ts +1 -1
  120. package/dist/performance-regression-gate/index.d.ts.map +1 -1
  121. package/dist/plugin-stack-observer/index.d.ts +1 -1
  122. package/dist/plugin-stack-observer/index.d.ts.map +1 -1
  123. package/dist/pr-drafter/index.d.ts +1 -1
  124. package/dist/pr-drafter/index.d.ts.map +1 -1
  125. package/dist/pr-drafter.js +28 -29
  126. package/dist/process-guard/index.d.ts +1 -1
  127. package/dist/process-guard/index.d.ts.map +1 -1
  128. package/dist/prompt-firewall/index.d.ts +1 -1
  129. package/dist/prompt-firewall/index.d.ts.map +1 -1
  130. package/dist/refactor-suggester/index.d.ts +1 -1
  131. package/dist/refactor-suggester/index.d.ts.map +1 -1
  132. package/dist/refactor-suggester.js +29 -29
  133. package/dist/release-notes-generator/index.d.ts +1 -1
  134. package/dist/release-notes-generator/index.d.ts.map +1 -1
  135. package/dist/release-notes-generator.js +29 -22
  136. package/dist/runtime/index.d.ts +15 -0
  137. package/dist/runtime/index.d.ts.map +1 -1
  138. package/dist/runtime/llm.d.ts +1 -1
  139. package/dist/runtime/llm.d.ts.map +1 -1
  140. package/dist/runtime.js +43 -2
  141. package/dist/schema-evolution-guard/index.d.ts +1 -1
  142. package/dist/schema-evolution-guard/index.d.ts.map +1 -1
  143. package/dist/schema-evolution-guard.js +2 -1
  144. package/dist/secret-scanner/index.d.ts +1 -1
  145. package/dist/secret-scanner/index.d.ts.map +1 -1
  146. package/dist/secret-scanner.js +7 -1
  147. package/dist/security-hotspot-scanner/index.d.ts +1 -1
  148. package/dist/security-hotspot-scanner/index.d.ts.map +1 -1
  149. package/dist/security-hotspot-scanner.js +26 -19
  150. package/dist/semantic-search-indexer/index.d.ts +1 -1
  151. package/dist/semantic-search-indexer/index.d.ts.map +1 -1
  152. package/dist/semver-bump/index.d.ts +1 -1
  153. package/dist/semver-bump/index.d.ts.map +1 -1
  154. package/dist/semver-bump.js +78 -43
  155. package/dist/session-recap/index.d.ts +1 -1
  156. package/dist/session-recap/index.d.ts.map +1 -1
  157. package/dist/shell-check/index.d.ts +1 -1
  158. package/dist/shell-check/index.d.ts.map +1 -1
  159. package/dist/smart-rename/index.d.ts +1 -1
  160. package/dist/smart-rename/index.d.ts.map +1 -1
  161. package/dist/spec-linker/index.d.ts +1 -1
  162. package/dist/spec-linker/index.d.ts.map +1 -1
  163. package/dist/spec-linker.js +222 -20772
  164. package/dist/template-engine/index.d.ts +1 -1
  165. package/dist/template-engine/index.d.ts.map +1 -1
  166. package/dist/template-engine.js +4 -6
  167. package/dist/test-coverage-gate/index.d.ts +1 -1
  168. package/dist/test-coverage-gate/index.d.ts.map +1 -1
  169. package/dist/test-coverage-gate.js +29 -14
  170. package/dist/test-flake-detector/index.d.ts +1 -1
  171. package/dist/test-flake-detector/index.d.ts.map +1 -1
  172. package/dist/test-flake-detector.js +31 -20
  173. package/dist/test-generator/index.d.ts +1 -1
  174. package/dist/test-generator/index.d.ts.map +1 -1
  175. package/dist/test-runner-gate/index.d.ts +1 -1
  176. package/dist/test-runner-gate/index.d.ts.map +1 -1
  177. package/dist/test-runner-gate.js +2 -1
  178. package/dist/todo-listener/index.d.ts +1 -32
  179. package/dist/todo-listener/index.d.ts.map +1 -1
  180. package/dist/todo-tracker/index.d.ts +1 -1
  181. package/dist/todo-tracker/index.d.ts.map +1 -1
  182. package/dist/token-budget/index.d.ts +1 -1
  183. package/dist/token-budget/index.d.ts.map +1 -1
  184. package/dist/token-throttle/index.d.ts +1 -1
  185. package/dist/token-throttle/index.d.ts.map +1 -1
  186. package/dist/type-gate/index.d.ts +1 -1
  187. package/dist/type-gate/index.d.ts.map +1 -1
  188. package/dist/type-gate.js +11 -4
  189. package/package.json +80 -68
@@ -1,6 +1,5 @@
1
1
  // src/checkpoint/index.ts
2
- import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
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 = statSync(path);
45
+ const st = await stat(path);
47
46
  if (st.size > maxBytes) return "too-large";
48
- const content = readFileSync(path, "utf-8");
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
- mkdirSync(dirname(f.path), { recursive: true });
302
- writeFileSync(f.path, f.content);
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) });
@@ -23,7 +23,7 @@
23
23
  *
24
24
  * @public
25
25
  */
26
- import type { Plugin } from '@wrongstack/core';
26
+ import type { Plugin } from '@wrongstack/core/types';
27
27
  declare const plugin: Plugin;
28
28
  export default plugin;
29
29
  //# sourceMappingURL=index.d.ts.map
@@ -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,kBAAkB,CAAC;AA0M/C,QAAA,MAAM,MAAM,EAAE,MAgMb,CAAC;eAEa,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"}
@@ -1,9 +1,8 @@
1
1
  // src/code-metrics/index.ts
2
- import { readFileSync } from "node:fs";
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
- return withinProjectPath(process.cwd(), p) || relative(process.cwd(), p) === ".";
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 collectSourceFiles(root, opts) {
23
+ async function collectSourceFilesAsync(root, opts) {
24
+ const { readdir, stat } = await import("node:fs/promises");
24
25
  const files = [];
25
- if (!existsSync(root)) return files;
26
- const s = statSync(root);
27
- if (s.isFile()) {
28
- if (matchesExtension(root, opts.extensions)) files.push(root);
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
- function walk(dir, depth) {
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 = readdirSync(dir);
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 (exclude.includes(entry)) continue;
43
- const full = resolve(dir, entry);
44
- let st;
45
- try {
46
- st = statSync(full);
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 = collectSourceFiles(resolved, { extensions: exts });
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 = readFileSync(p, "utf-8");
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 = readFileSync(resolved, "utf-8");
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) };
@@ -25,7 +25,7 @@
25
25
  *
26
26
  * @public
27
27
  */
28
- import type { Plugin } from '@wrongstack/core';
28
+ import type { Plugin } from '@wrongstack/core/types';
29
29
  declare const plugin: Plugin;
30
30
  export default plugin;
31
31
  //# sourceMappingURL=index.d.ts.map
@@ -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,kBAAkB,CAAC;AAsP/C,QAAA,MAAM,MAAM,EAAE,MAgSb,CAAC;eAEa,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,kBAAkB,CAAC;AA0H/C,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
+ {"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"}
@@ -31,7 +31,7 @@
31
31
  *
32
32
  * @public
33
33
  */
34
- import type { Plugin } from '@wrongstack/core';
34
+ import type { Plugin } from '@wrongstack/core/types';
35
35
  export interface Pin {
36
36
  id: string;
37
37
  label: string | null;
@@ -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,kBAAkB,CAAC;AAM/C,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
+ {"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"}
@@ -30,7 +30,7 @@
30
30
  *
31
31
  * @public
32
32
  */
33
- import type { Plugin } from '@wrongstack/core';
33
+ import type { Plugin } from '@wrongstack/core/types';
34
34
  /**
35
35
  * Per-model pricing in USD per 1 million tokens.
36
36
  *
@@ -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,kBAAkB,CAAC;AAK/C;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;CAChB;AAyKD,QAAA,MAAM,MAAM,EAAE,MA8Zb,CAAC;eAEa,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"}
@@ -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
- const key = model.toLowerCase();
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;
@@ -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
@@ -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,kBAAkB,CAAC;AA+F/C,QAAA,MAAM,MAAM,EAAE,MAqRb,CAAC;eAEa,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"}
@@ -26,7 +26,7 @@
26
26
  *
27
27
  * @public
28
28
  */
29
- import type { Plugin } from '@wrongstack/core';
29
+ import type { Plugin } from '@wrongstack/core/types';
30
30
  declare const plugin: Plugin;
31
31
  export default plugin;
32
32
  //# sourceMappingURL=index.d.ts.map
@@ -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,kBAAkB,CAAC;AAiQ/C,QAAA,MAAM,MAAM,EAAE,MAkOb,CAAC;eAEa,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 { readdirSync, readFileSync, statSync } from "node:fs";
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
- return withinProjectPath(process.cwd(), p) || relative(process.cwd(), p) === ".";
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
- function walk(dir, remaining) {
54
+ const excludeSet = new Set(cfg.excludeDirs);
55
+ async function walk(dir, remaining) {
54
56
  let entries;
55
57
  try {
56
- entries = readdirSync(dir, { withFileTypes: true });
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 && !cfg.excludeDirs.includes(entry.name)) {
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 = readFileSync(p, "utf-8");
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 = statSync(resolved);
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) };
@@ -35,7 +35,7 @@
35
35
  *
36
36
  * @public
37
37
  */
38
- import type { Plugin } from '@wrongstack/core';
38
+ import type { Plugin } from '@wrongstack/core/types';
39
39
  export interface ParsedInstall {
40
40
  manager: string;
41
41
  packages: Array<{
@@ -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,kBAAkB,CAAC;AAmF/C,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
+ {"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"}
@@ -27,7 +27,7 @@
27
27
  *
28
28
  * @public
29
29
  */
30
- import type { Plugin } from '@wrongstack/core';
30
+ import type { Plugin } from '@wrongstack/core/types';
31
31
  declare const plugin: Plugin;
32
32
  export default plugin;
33
33
  //# sourceMappingURL=index.d.ts.map
@@ -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,kBAAkB,CAAC;AAuO/C,QAAA,MAAM,MAAM,EAAE,MAwMb,CAAC;eAEa,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 { execFileSync } from "node:child_process";
3
- import { existsSync } from "node:fs";
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
- stdout = execFileSync(manager, ["audit", "--json"], {
124
- encoding: "utf-8",
125
- timeout: cfg.timeoutMs,
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 ?? "";
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;
@@ -28,7 +28,7 @@
28
28
  *
29
29
  * @public
30
30
  */
31
- import type { Plugin } from '@wrongstack/core';
31
+ import type { Plugin } from '@wrongstack/core/types';
32
32
  declare const plugin: Plugin;
33
33
  export default plugin;
34
34
  //# sourceMappingURL=index.d.ts.map
@@ -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,kBAAkB,CAAC;AAwP/C,QAAA,MAAM,MAAM,EAAE,MA4Pb,CAAC;eAEa,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"}