@wrongstack/plugins 0.293.0 → 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
@@ -7,7 +7,7 @@
7
7
  * - template_create: Save a named template to the plugin store
8
8
  * - template_list: List all saved templates
9
9
  */
10
- import type { Plugin } from '@wrongstack/core';
10
+ import type { Plugin } from '@wrongstack/core/types';
11
11
  declare const plugin: Plugin;
12
12
  export default plugin;
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/template-engine/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAqH/C,QAAA,MAAM,MAAM,EAAE,MA+Sb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/template-engine/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAsHrD,QAAA,MAAM,MAAM,EAAE,MA4Sb,CAAC;eAEa,MAAM"}
@@ -1,4 +1,5 @@
1
1
  // src/template-engine/index.ts
2
+ import { readFile, writeFile } from "node:fs/promises";
2
3
  import { isAbsolute } from "node:path";
3
4
  var API_VERSION = "^0.1.10";
4
5
  var templates = /* @__PURE__ */ new Map();
@@ -119,8 +120,7 @@ var plugin = {
119
120
  if (output_path) {
120
121
  const pathError = validateRelativeTemplatePath("output_path", output_path);
121
122
  if (pathError) return { ok: false, error: pathError };
122
- const { writeFileSync } = await import("node:fs");
123
- writeFileSync(output_path, result, "utf-8");
123
+ await writeFile(output_path, result, "utf-8");
124
124
  return {
125
125
  ok: true,
126
126
  output_path,
@@ -173,8 +173,7 @@ var plugin = {
173
173
  }
174
174
  let content;
175
175
  try {
176
- const { readFileSync } = await import("node:fs");
177
- content = readFileSync(template_path, "utf-8");
176
+ content = await readFile(template_path, "utf-8");
178
177
  } catch (err) {
179
178
  return { ok: false, error: `Could not read template file: ${err}` };
180
179
  }
@@ -187,8 +186,7 @@ var plugin = {
187
186
  if (output_path) {
188
187
  const pathError = validateRelativeTemplatePath("output_path", output_path);
189
188
  if (pathError) return { ok: false, error: pathError };
190
- const { writeFileSync } = await import("node:fs");
191
- writeFileSync(output_path, result, "utf-8");
189
+ await writeFile(output_path, result, "utf-8");
192
190
  return {
193
191
  ok: true,
194
192
  template_path,
@@ -29,7 +29,7 @@
29
29
  *
30
30
  * @public
31
31
  */
32
- import type { Plugin } from '@wrongstack/core';
32
+ import type { Plugin } from '@wrongstack/core/types';
33
33
  declare const plugin: Plugin;
34
34
  export default plugin;
35
35
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-coverage-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAkI/C,QAAA,MAAM,MAAM,EAAE,MAyOb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-coverage-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAwIrD,QAAA,MAAM,MAAM,EAAE,MA0Ob,CAAC;eAEa,MAAM"}
@@ -1,6 +1,25 @@
1
1
  // src/test-coverage-gate/index.ts
2
2
  import { readFileSync } from "node:fs";
3
- import { isAbsolute, relative, resolve } from "node:path";
3
+
4
+ // src/runtime/index.ts
5
+ import { basename, extname, isAbsolute, relative, resolve } from "node:path";
6
+ var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
7
+ function hasLeadingDash(arg) {
8
+ return arg.length > 0 && arg.startsWith("-");
9
+ }
10
+ function withinProjectPath(projectRoot, candidate) {
11
+ if (candidate.length === 0 || candidate.length > 4096) return false;
12
+ if (hasLeadingDash(candidate)) return false;
13
+ const resolved = isAbsolute(candidate) ? resolve(candidate) : resolve(projectRoot, candidate);
14
+ const rel = relative(projectRoot, resolved);
15
+ return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
16
+ }
17
+ function withinProject(p) {
18
+ const cwd = process.cwd();
19
+ return withinProjectPath(cwd, p) || relative(cwd, p) === ".";
20
+ }
21
+
22
+ // src/test-coverage-gate/index.ts
4
23
  var API_VERSION = "^0.1.10";
5
24
  var state = {
6
25
  invocationCount: 0,
@@ -21,28 +40,24 @@ var DEFAULTS = {
21
40
  deltaThreshold: 1,
22
41
  runOnChange: [".ts", ".tsx", ".js", ".jsx"]
23
42
  };
43
+ var runOnChangeSet = new Set(DEFAULTS.runOnChange);
24
44
  function readConfig(raw) {
25
- if (!raw || typeof raw !== "object") return { ...DEFAULTS };
45
+ if (!raw || typeof raw !== "object") {
46
+ runOnChangeSet = new Set(DEFAULTS.runOnChange);
47
+ return { ...DEFAULTS };
48
+ }
26
49
  const r = raw;
50
+ const runOnChange = Array.isArray(r["runOnChange"]) ? r["runOnChange"].filter((x) => typeof x === "string") : DEFAULTS.runOnChange;
51
+ runOnChangeSet = new Set(runOnChange);
27
52
  return {
28
53
  enabled: r["enabled"] !== false,
29
54
  coveragePath: typeof r["coveragePath"] === "string" ? r["coveragePath"] : DEFAULTS.coveragePath,
30
55
  threshold: typeof r["threshold"] === "number" && r["threshold"] >= 0 && r["threshold"] <= 100 ? r["threshold"] : DEFAULTS.threshold,
31
56
  mode: r["mode"] === "block" ? "block" : DEFAULTS.mode,
32
57
  deltaThreshold: typeof r["deltaThreshold"] === "number" && r["deltaThreshold"] >= 0 ? r["deltaThreshold"] : DEFAULTS.deltaThreshold,
33
- runOnChange: Array.isArray(r["runOnChange"]) ? r["runOnChange"].filter((x) => typeof x === "string") : DEFAULTS.runOnChange
58
+ runOnChange
34
59
  };
35
60
  }
36
- function withinProject(p) {
37
- if (typeof p !== "string" || p.length === 0 || p.length > 4096) return false;
38
- const root = process.cwd();
39
- const resolved = isAbsolute(p) ? resolve(p) : resolve(root, p);
40
- const rel = relative(root, resolved);
41
- if (rel === "" || rel === ".") return true;
42
- if (rel.startsWith("..")) return false;
43
- if (isAbsolute(rel)) return false;
44
- return true;
45
- }
46
61
  function readCoverageSummary(coveragePath) {
47
62
  try {
48
63
  const raw = readFileSync(coveragePath, "utf-8");
@@ -125,7 +140,7 @@ var plugin = {
125
140
  if (!sourcePath || typeof sourcePath !== "string") return;
126
141
  if (!withinProject(sourcePath)) return;
127
142
  const ext = sourcePath.includes(".") ? sourcePath.slice(sourcePath.lastIndexOf(".")).toLowerCase() : "";
128
- if (!cfg.runOnChange.includes(ext)) {
143
+ if (!runOnChangeSet.has(ext)) {
129
144
  state.skippedCount += 1;
130
145
  return;
131
146
  }
@@ -19,7 +19,7 @@
19
19
  *
20
20
  * @public
21
21
  */
22
- import type { Plugin } from '@wrongstack/core';
22
+ import type { Plugin } from '@wrongstack/core/types';
23
23
  declare const plugin: Plugin;
24
24
  export default plugin;
25
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-flake-detector/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AA2P/C,QAAA,MAAM,MAAM,EAAE,MA6Nb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-flake-detector/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAyQrD,QAAA,MAAM,MAAM,EAAE,MA6Nb,CAAC;eAEa,MAAM"}
@@ -1,5 +1,5 @@
1
1
  // src/test-flake-detector/index.ts
2
- import { execFileSync } from "node:child_process";
2
+ import { execFile } from "node:child_process";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { createRequire } from "node:module";
5
5
  import { dirname, isAbsolute, relative, resolve } from "node:path";
@@ -144,24 +144,35 @@ function resolveTestCommand(baseCommand, testPattern) {
144
144
  };
145
145
  }
146
146
  function runOnce(command, timeoutMs) {
147
- try {
148
- const output = execFileSync(command.cmd, command.args, {
149
- encoding: "utf-8",
150
- timeout: timeoutMs,
151
- cwd: process.cwd(),
152
- stdio: ["pipe", "pipe", "pipe"],
153
- shell: false
154
- });
155
- return { output };
156
- } catch (err) {
157
- const e = err;
158
- if (e.killed) {
159
- return { output: e.stdout ?? "", error: `timeout after ${timeoutMs}ms` };
160
- }
161
- const output = `${e.stdout ?? ""}
162
- ${e.stderr ?? ""}`.trim();
163
- return { output, error: e.message ?? "test command exited with non-zero code" };
164
- }
147
+ return new Promise((resolveRun) => {
148
+ execFile(
149
+ command.cmd,
150
+ command.args,
151
+ {
152
+ encoding: "utf8",
153
+ timeout: timeoutMs,
154
+ cwd: process.cwd(),
155
+ windowsHide: true,
156
+ maxBuffer: 10 * 1024 * 1024,
157
+ shell: false
158
+ },
159
+ (error, stdout, stderr) => {
160
+ if (!error) {
161
+ resolveRun({ output: stdout });
162
+ return;
163
+ }
164
+ if (error.killed) {
165
+ resolveRun({ output: stdout, error: `timeout after ${timeoutMs}ms` });
166
+ return;
167
+ }
168
+ resolveRun({
169
+ output: `${stdout}
170
+ ${stderr}`.trim(),
171
+ error: error.message || "test command exited with non-zero code"
172
+ });
173
+ }
174
+ );
175
+ });
165
176
  }
166
177
  var plugin = {
167
178
  name: "test-flake-detector",
@@ -251,7 +262,7 @@ var plugin = {
251
262
  let runsCompleted = 0;
252
263
  const runErrors = [];
253
264
  for (let run = 1; run <= requestedRuns; run += 1) {
254
- const { output, error } = runOnce(command, cfg.timeoutMs);
265
+ const { output, error } = await runOnce(command, cfg.timeoutMs);
255
266
  state.runCount += 1;
256
267
  if (error) {
257
268
  state.errorCount += 1;
@@ -22,7 +22,7 @@
22
22
  *
23
23
  * @public
24
24
  */
25
- import type { Plugin } from '@wrongstack/core';
25
+ import type { Plugin } from '@wrongstack/core/types';
26
26
  export interface DetectedExport {
27
27
  name: string;
28
28
  kind: 'function' | 'arrow' | 'class' | 'named';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-generator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAkG/C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CAChD;AAkLD,QAAA,MAAM,MAAM,EAAE,MAqLb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-generator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAkGrD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CAChD;AAkLD,QAAA,MAAM,MAAM,EAAE,MAqLb,CAAC;eAEa,MAAM"}
@@ -29,7 +29,7 @@
29
29
  *
30
30
  * @public
31
31
  */
32
- import type { Plugin } from '@wrongstack/core';
32
+ import type { Plugin } from '@wrongstack/core/types';
33
33
  declare const plugin: Plugin;
34
34
  export default plugin;
35
35
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-runner-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAsc/C,QAAA,MAAM,MAAM,EAAE,MA+Tb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-runner-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAscrD,QAAA,MAAM,MAAM,EAAE,MA+Tb,CAAC;eAEa,MAAM"}
@@ -17,7 +17,8 @@ function withinProjectPath(projectRoot, candidate) {
17
17
  return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
18
18
  }
19
19
  function withinProject(p) {
20
- return withinProjectPath(process.cwd(), p) || relative(process.cwd(), p) === ".";
20
+ const cwd = process.cwd();
21
+ return withinProjectPath(cwd, p) || relative(cwd, p) === ".";
21
22
  }
22
23
 
23
24
  // src/test-runner-gate/index.ts
@@ -1,35 +1,4 @@
1
- /**
2
- * todo-listener plugin — PostToolUse hook on the `todo` tool that
3
- * broadcasts a structured status update to the project mailbox.
4
- *
5
- * When the agent (or any plugin) calls the built-in `todo` tool, the
6
- * full todo list is replaced in `ctx.todos`. The hook fires after the
7
- * tool completes, reads the new state, and posts a compact summary
8
- * to the project mailbox so that other agents in the same project
9
- * (terminals, WebUIs, shadow agents) can see what this agent is
10
- * working on in real time.
11
- *
12
- * Use cases:
13
- * - Multi-agent fleets where a coordinator should know which
14
- * sub-agent is working on which item
15
- * - Long-running sessions where a user opens a second terminal and
16
- * wants to see the in-progress plan
17
- * - Shadow agents that audit progress across the project
18
- *
19
- * Config (`config.extensions['todo-listener']`):
20
- *
21
- * ```jsonc
22
- * {
23
- * "enabled": false,
24
- * "subjectPrefix": "todo: ",
25
- * "broadcastOnChange": true,
26
- * "cooldownMs": 30000
27
- * }
28
- * ```
29
- *
30
- * @public
31
- */
32
- import type { Plugin } from '@wrongstack/core';
1
+ import type { Plugin } from '@wrongstack/core/types';
33
2
  declare const plugin: Plugin;
34
3
  export default plugin;
35
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/todo-listener/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAY,MAAM,kBAAkB,CAAC;AAoGzD,QAAA,MAAM,MAAM,EAAE,MAqNb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/todo-listener/index.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAmGrD,QAAA,MAAM,MAAM,EAAE,MAqNb,CAAC;eAEa,MAAM"}
@@ -1,4 +1,4 @@
1
- import type { Plugin } from '@wrongstack/core';
1
+ import type { Plugin } from '@wrongstack/core/types';
2
2
  declare const plugin: Plugin;
3
3
  export default plugin;
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/todo-tracker/index.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAmK/C,QAAA,MAAM,MAAM,EAAE,MAsZb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/todo-tracker/index.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAmKrD,QAAA,MAAM,MAAM,EAAE,MAsZb,CAAC;eAEa,MAAM"}
@@ -32,7 +32,7 @@
32
32
  *
33
33
  * @public
34
34
  */
35
- import type { Plugin } from '@wrongstack/core';
35
+ import type { Plugin } from '@wrongstack/core/types';
36
36
  declare const plugin: Plugin;
37
37
  export default plugin;
38
38
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/token-budget/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAqF/C,QAAA,MAAM,MAAM,EAAE,MA8Qb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/token-budget/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAqFrD,QAAA,MAAM,MAAM,EAAE,MA8Qb,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 SpendEntry {
36
36
  at: number;
37
37
  tokens: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/token-throttle/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,kBAAkB,CAAC;AA8C1D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CAE5E;AAED,0CAA0C;AAC1C,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAEzD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,UAAU,EAAE,EACrB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,CAoBR;AA4CD,QAAA,MAAM,MAAM,EAAE,MAoKb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/token-throttle/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,wBAAwB,CAAC;AA8ChE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CAE5E;AAED,0CAA0C;AAC1C,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAEzD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,UAAU,EAAE,EACrB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,CAoBR;AA4CD,QAAA,MAAM,MAAM,EAAE,MAoKb,CAAC;eAEa,MAAM"}
@@ -29,7 +29,7 @@
29
29
  *
30
30
  * @public
31
31
  */
32
- import type { Plugin } from '@wrongstack/core';
32
+ import type { Plugin } from '@wrongstack/core/types';
33
33
  declare const plugin: Plugin;
34
34
  export default plugin;
35
35
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/type-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAuM/C,QAAA,MAAM,MAAM,EAAE,MAiOb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/type-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAuNrD,QAAA,MAAM,MAAM,EAAE,MAkOb,CAAC;eAEa,MAAM"}
package/dist/type-gate.js CHANGED
@@ -185,7 +185,8 @@ function runRunnerCommand(argv, options) {
185
185
  });
186
186
  }
187
187
  function withinProject(p) {
188
- return withinProjectPath(process.cwd(), p) || relative(process.cwd(), p) === ".";
188
+ const cwd = process.cwd();
189
+ return withinProjectPath(cwd, p) || relative(cwd, p) === ".";
189
190
  }
190
191
 
191
192
  // src/type-gate/index.ts
@@ -209,9 +210,15 @@ var DEFAULTS = {
209
210
  maxErrors: 5,
210
211
  runOnChange: [".ts", ".tsx", ".js", ".jsx", ".mts", ".cts"]
211
212
  };
213
+ var runOnChangeSet = new Set(DEFAULTS.runOnChange);
212
214
  function readConfig(raw) {
213
- if (!raw || typeof raw !== "object") return { ...DEFAULTS };
215
+ if (!raw || typeof raw !== "object") {
216
+ runOnChangeSet = new Set(DEFAULTS.runOnChange);
217
+ return { ...DEFAULTS };
218
+ }
214
219
  const r = raw;
220
+ const runOnChange = Array.isArray(r["runOnChange"]) ? r["runOnChange"].filter((x) => typeof x === "string") : DEFAULTS.runOnChange;
221
+ runOnChangeSet = new Set(runOnChange);
215
222
  return {
216
223
  enabled: r["enabled"] === true,
217
224
  command: typeof r["command"] === "string" ? r["command"] : DEFAULTS.command,
@@ -219,7 +226,7 @@ function readConfig(raw) {
219
226
  timeoutMs: typeof r["timeoutMs"] === "number" && r["timeoutMs"] > 0 ? r["timeoutMs"] : DEFAULTS.timeoutMs,
220
227
  failSeverity: r["failSeverity"] === "block" ? "block" : DEFAULTS.failSeverity,
221
228
  maxErrors: typeof r["maxErrors"] === "number" && r["maxErrors"] >= 1 && r["maxErrors"] <= 50 ? r["maxErrors"] : DEFAULTS.maxErrors,
222
- runOnChange: Array.isArray(r["runOnChange"]) ? r["runOnChange"].filter((x) => typeof x === "string") : DEFAULTS.runOnChange
229
+ runOnChange
223
230
  };
224
231
  }
225
232
  var TSC_RUNTIME = {
@@ -362,7 +369,7 @@ var plugin = {
362
369
  if (!sourcePath || typeof sourcePath !== "string") return;
363
370
  if (!withinProject(sourcePath)) return;
364
371
  const ext = sourcePath.includes(".") ? sourcePath.slice(sourcePath.lastIndexOf(".")).toLowerCase() : "";
365
- if (!cfg.runOnChange.includes(ext)) {
372
+ if (!runOnChangeSet.has(ext)) {
366
373
  state.skippedCount += 1;
367
374
  return;
368
375
  }