@wrongstack/plugins 0.295.1 → 0.296.2

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 (44) hide show
  1. package/dist/accessibility-auditor.js +12 -1
  2. package/dist/branch-guard.js +13 -2
  3. package/dist/commit-validator/index.d.ts.map +1 -1
  4. package/dist/commit-validator.js +18 -1
  5. package/dist/dead-code-detector/index.d.ts.map +1 -1
  6. package/dist/dead-code-detector.js +4 -1
  7. package/dist/diff-summary.js +12 -1
  8. package/dist/doc-sync-guard.js +12 -1
  9. package/dist/git-autocommit/index.d.ts +12 -0
  10. package/dist/git-autocommit/index.d.ts.map +1 -1
  11. package/dist/git-autocommit.js +58 -4
  12. package/dist/import-organizer.js +12 -1
  13. package/dist/index.js +149 -47
  14. package/dist/injection-shield/index.d.ts +16 -0
  15. package/dist/injection-shield/index.d.ts.map +1 -1
  16. package/dist/injection-shield.js +12 -4
  17. package/dist/lint-gate.js +12 -1
  18. package/dist/migration-planner.js +12 -1
  19. package/dist/pr-drafter/index.d.ts.map +1 -1
  20. package/dist/pr-drafter.js +20 -1
  21. package/dist/runtime/handles.d.ts +46 -0
  22. package/dist/runtime/handles.d.ts.map +1 -0
  23. package/dist/runtime/index.d.ts +1 -0
  24. package/dist/runtime/index.d.ts.map +1 -1
  25. package/dist/runtime.js +18 -0
  26. package/dist/secret-scanner/index.d.ts.map +1 -1
  27. package/dist/secret-scanner.js +19 -2
  28. package/dist/session-recap/index.d.ts.map +1 -1
  29. package/dist/session-recap.js +18 -1
  30. package/dist/smart-rename/index.d.ts +2 -0
  31. package/dist/smart-rename/index.d.ts.map +1 -1
  32. package/dist/smart-rename.js +16 -2
  33. package/dist/spec-linker/index.d.ts.map +1 -1
  34. package/dist/spec-linker.js +19 -2
  35. package/dist/template-engine/index.d.ts.map +1 -1
  36. package/dist/template-engine.js +15 -1
  37. package/dist/test-coverage-gate.js +12 -1
  38. package/dist/test-runner-gate.js +12 -1
  39. package/dist/todo-listener.js +12 -1
  40. package/dist/token-budget/index.d.ts.map +1 -1
  41. package/dist/token-budget.js +31 -19
  42. package/dist/type-gate/index.d.ts.map +1 -1
  43. package/dist/type-gate.js +12 -1
  44. package/package.json +3 -3
package/dist/runtime.js CHANGED
@@ -292,6 +292,22 @@ function safeJsonStringify(value, indent) {
292
292
  }
293
293
  }
294
294
 
295
+ // src/runtime/handles.ts
296
+ function releaseHandle(off) {
297
+ if (off) {
298
+ try {
299
+ off();
300
+ } catch {
301
+ }
302
+ }
303
+ return null;
304
+ }
305
+ function releaseHandles(state, keys) {
306
+ for (const key of keys) {
307
+ state[key] = releaseHandle(state[key]);
308
+ }
309
+ }
310
+
295
311
  // src/runtime/index.ts
296
312
  var META_CHARS = /["'`;&|<>\r\n]/;
297
313
  var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
@@ -606,6 +622,8 @@ export {
606
622
  matchesExtension,
607
623
  parseLlmJsonObject,
608
624
  probeRunner,
625
+ releaseHandle,
626
+ releaseHandles,
609
627
  resolveExecInvocation,
610
628
  resolveFirstNodeBin,
611
629
  resolveNodeBin,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/secret-scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAwmBrD,QAAA,MAAM,MAAM,EAAE,MAgOb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/secret-scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAymBrD,QAAA,MAAM,MAAM,EAAE,MAgOb,CAAC;eAEa,MAAM"}
@@ -1,3 +1,20 @@
1
+ // src/runtime/local-bin.ts
2
+ import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
3
+
4
+ // src/runtime/handles.ts
5
+ function releaseHandle(off) {
6
+ if (off) {
7
+ try {
8
+ off();
9
+ } catch {
10
+ }
11
+ }
12
+ return null;
13
+ }
14
+
15
+ // src/runtime/index.ts
16
+ var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
17
+
1
18
  // src/runtime/credential-patterns.ts
2
19
  var CREDENTIAL_PATTERNS = [
3
20
  // LLM provider keys
@@ -435,8 +452,8 @@ var plugin = {
435
452
  state.leakCount = 0;
436
453
  state.lastBlock = null;
437
454
  state.lastLeak = null;
438
- state.hookUnregister = null;
439
- state.postHookUnregister = null;
455
+ state.hookUnregister = releaseHandle(state.hookUnregister);
456
+ state.postHookUnregister = releaseHandle(state.postHookUnregister);
440
457
  const cfg = readConfig(api.config.extensions?.["secret-scanner"]);
441
458
  PATTERNS = [...BASE_PATTERNS];
442
459
  for (const cp of cfg.customPatterns) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session-recap/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA4MrD,QAAA,MAAM,MAAM,EAAE,MA4Yb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session-recap/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA6MrD,QAAA,MAAM,MAAM,EAAE,MA4Yb,CAAC;eAEa,MAAM"}
@@ -1,3 +1,20 @@
1
+ // src/runtime/local-bin.ts
2
+ import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
3
+
4
+ // src/runtime/handles.ts
5
+ function releaseHandle(off) {
6
+ if (off) {
7
+ try {
8
+ off();
9
+ } catch {
10
+ }
11
+ }
12
+ return null;
13
+ }
14
+
15
+ // src/runtime/index.ts
16
+ var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
17
+
1
18
  // src/session-recap/index.ts
2
19
  var state = {
3
20
  recapsPublished: 0,
@@ -155,7 +172,7 @@ var plugin = {
155
172
  state.commitCount = 0;
156
173
  state.startedAt = null;
157
174
  state.lastActivityAt = null;
158
- state.stopHookUnregister = null;
175
+ state.stopHookUnregister = releaseHandle(state.stopHookUnregister);
159
176
  for (const off of state.eventUnsubscribers) {
160
177
  try {
161
178
  off();
@@ -19,6 +19,8 @@
19
19
  * @public
20
20
  */
21
21
  import type { Plugin } from '@wrongstack/core/types';
22
+ /** True when `name` is something this tool may safely substitute. */
23
+ export declare function isIdentifier(name: string): boolean;
22
24
  declare const plugin: Plugin;
23
25
  export default plugin;
24
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/smart-rename/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA0FrD,QAAA,MAAM,MAAM,EAAE,MAqIb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/smart-rename/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAkFrD,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAmCD,QAAA,MAAM,MAAM,EAAE,MAgJb,CAAC;eAEa,MAAM"}
@@ -38,8 +38,15 @@ function relativePath(p) {
38
38
  function escapeRegex(s) {
39
39
  return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
40
40
  }
41
+ var IDENTIFIER_RE = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
42
+ function isIdentifier(name) {
43
+ return IDENTIFIER_RE.test(name);
44
+ }
41
45
  function renameInContent(content, oldName, newName) {
42
- const re = new RegExp(`\\b${escapeRegex(oldName)}\\b`, "g");
46
+ const re = new RegExp(
47
+ `(?<![A-Za-z0-9_$])${escapeRegex(oldName)}(?![A-Za-z0-9_$])`,
48
+ "g"
49
+ );
43
50
  let replacements = 0;
44
51
  const preview = content.replace(re, () => {
45
52
  replacements++;
@@ -101,6 +108,12 @@ var plugin = {
101
108
  if (!newName || typeof newName !== "string" || newName.length === 0) {
102
109
  return { ok: false, error: "newName is required" };
103
110
  }
111
+ if (!isIdentifier(oldName)) {
112
+ return { ok: false, error: `oldName "${oldName}" is not a valid identifier` };
113
+ }
114
+ if (!isIdentifier(newName)) {
115
+ return { ok: false, error: `newName "${newName}" is not a valid identifier` };
116
+ }
104
117
  if (!withinProject(rawPath)) {
105
118
  return { ok: false, error: "path is outside the project root" };
106
119
  }
@@ -166,5 +179,6 @@ var plugin = {
166
179
  };
167
180
  var smart_rename_default = plugin;
168
181
  export {
169
- smart_rename_default as default
182
+ smart_rename_default as default,
183
+ isIdentifier
170
184
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spec-linker/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAwPrD,QAAA,MAAM,MAAM,EAAE,MAuOb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spec-linker/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAyPrD,QAAA,MAAM,MAAM,EAAE,MAuOb,CAAC;eAEa,MAAM"}
@@ -1,6 +1,23 @@
1
1
  // src/spec-linker/index.ts
2
2
  import * as fs from "node:fs/promises";
3
3
 
4
+ // src/runtime/local-bin.ts
5
+ import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
6
+
7
+ // src/runtime/handles.ts
8
+ function releaseHandle(off) {
9
+ if (off) {
10
+ try {
11
+ off();
12
+ } catch {
13
+ }
14
+ }
15
+ return null;
16
+ }
17
+
18
+ // src/runtime/index.ts
19
+ var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
20
+
4
21
  // src/manifest/index.ts
5
22
  var OFFICIAL_PLUGIN_NAMES = [
6
23
  "agent-handoff",
@@ -330,8 +347,8 @@ var plugin = {
330
347
  state.skippedNonMd = 0;
331
348
  state.readErrorCount = 0;
332
349
  state.autoFixApplied = 0;
333
- state.postHookUnregister = null;
334
- state.preHookUnregister = null;
350
+ state.postHookUnregister = releaseHandle(state.postHookUnregister);
351
+ state.preHookUnregister = releaseHandle(state.preHookUnregister);
335
352
  const cfg = readConfig(api.config.extensions?.["spec-linker"]);
336
353
  const postHook = async (input) => {
337
354
  if (!cfg.enabled) return;
@@ -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,wBAAwB,CAAC;AA+HrD,QAAA,MAAM,MAAM,EAAE,MA4Sb,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;AA0IrD,QAAA,MAAM,MAAM,EAAE,MA+Sb,CAAC;eAEa,MAAM"}
@@ -8,6 +8,17 @@ import { basename, extname, isAbsolute, relative, resolve } from "node:path";
8
8
  // src/runtime/local-bin.ts
9
9
  import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
10
10
 
11
+ // src/runtime/handles.ts
12
+ function releaseHandle(off) {
13
+ if (off) {
14
+ try {
15
+ off();
16
+ } catch {
17
+ }
18
+ }
19
+ return null;
20
+ }
21
+
11
22
  // src/runtime/index.ts
12
23
  var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
13
24
  function hasLeadingDash(arg) {
@@ -28,6 +39,7 @@ function withinProject(p) {
28
39
  // src/template-engine/index.ts
29
40
  var API_VERSION = "^0.1.10";
30
41
  var templates = /* @__PURE__ */ new Map();
42
+ var contributorUnregister = null;
31
43
  function expandTemplate(template, variables) {
32
44
  let result = template;
33
45
  result = result.replace(/\{\{(\w+)\}\}/g, (match, key) => {
@@ -300,7 +312,8 @@ var plugin = {
300
312
  };
301
313
  }
302
314
  });
303
- api.registerSystemPromptContributor(async () => [
315
+ contributorUnregister = releaseHandle(contributorUnregister);
316
+ contributorUnregister = api.registerSystemPromptContributor(async () => [
304
317
  {
305
318
  type: "text",
306
319
  text: `Template engine available:
@@ -315,6 +328,7 @@ var plugin = {
315
328
  teardown(api) {
316
329
  const count = templates.size;
317
330
  templates.clear();
331
+ contributorUnregister = releaseHandle(contributorUnregister);
318
332
  api.log.info("template-engine: teardown complete", { cleared: count });
319
333
  },
320
334
  async health() {
@@ -7,6 +7,17 @@ import { basename, extname, isAbsolute, relative, resolve } from "node:path";
7
7
  // src/runtime/local-bin.ts
8
8
  import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
9
9
 
10
+ // src/runtime/handles.ts
11
+ function releaseHandle(off) {
12
+ if (off) {
13
+ try {
14
+ off();
15
+ } catch {
16
+ }
17
+ }
18
+ return null;
19
+ }
20
+
10
21
  // src/runtime/index.ts
11
22
  var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
12
23
  function hasLeadingDash(arg) {
@@ -135,7 +146,7 @@ var plugin = {
135
146
  state.skippedCount = 0;
136
147
  state.lastOverallPct = null;
137
148
  state.lastResult = null;
138
- state.hookUnregister = null;
149
+ state.hookUnregister = releaseHandle(state.hookUnregister);
139
150
  const cfg = readConfig(api.config.extensions?.["test-coverage-gate"]);
140
151
  const hook = (input) => {
141
152
  if (!cfg.enabled) return;
@@ -104,6 +104,17 @@ var BoundedMap = class {
104
104
  }
105
105
  };
106
106
 
107
+ // src/runtime/handles.ts
108
+ function releaseHandle(off) {
109
+ if (off) {
110
+ try {
111
+ off();
112
+ } catch {
113
+ }
114
+ }
115
+ return null;
116
+ }
117
+
107
118
  // src/runtime/index.ts
108
119
  var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
109
120
  function hasLeadingDash(arg) {
@@ -451,7 +462,7 @@ var plugin = {
451
462
  state.errorCount = 0;
452
463
  state.extensionSkippedCount = 0;
453
464
  state.cachedSkipCount = 0;
454
- state.hookUnregister = null;
465
+ state.hookUnregister = releaseHandle(state.hookUnregister);
455
466
  state.lastResult = null;
456
467
  lastPassedHash.clear();
457
468
  const cfg = readConfig(api.config.extensions?.["test-runner-gate"]);
@@ -24,6 +24,17 @@ function safeJsonStringify(value, indent) {
24
24
  }
25
25
  }
26
26
 
27
+ // src/runtime/handles.ts
28
+ function releaseHandle(off) {
29
+ if (off) {
30
+ try {
31
+ off();
32
+ } catch {
33
+ }
34
+ }
35
+ return null;
36
+ }
37
+
27
38
  // src/runtime/index.ts
28
39
  var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
29
40
 
@@ -100,7 +111,7 @@ var plugin = {
100
111
  state.lastMessageId = null;
101
112
  state.lastPayloadHash = "";
102
113
  state.lastBroadcastAt = 0;
103
- state.hookUnregister = null;
114
+ state.hookUnregister = releaseHandle(state.hookUnregister);
104
115
  const cfg = readConfig(api.config.extensions?.["todo-listener"]);
105
116
  const mailbox = api.mailbox;
106
117
  const hook = async (input) => {
@@ -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,wBAAwB,CAAC;AAqFrD,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;AA8HrD,QAAA,MAAM,MAAM,EAAE,MAyQb,CAAC;eAEa,MAAM"}
@@ -34,16 +34,36 @@ function modelMatches(pattern, model) {
34
34
  }
35
35
  return model.toLowerCase() === pattern.toLowerCase();
36
36
  }
37
+ function readBoundedNumber(value, min, max, fallback) {
38
+ if (typeof value !== "number" || !Number.isFinite(value)) return fallback;
39
+ if (value < min || value > max) return fallback;
40
+ return value;
41
+ }
37
42
  function readConfig(raw) {
38
43
  if (!raw || typeof raw !== "object") return { ...DEFAULTS };
39
44
  const r = raw;
45
+ const warnPercent = readBoundedNumber(r["warnPercent"], 1, 100, DEFAULTS.warnPercent);
46
+ const stopPercent = readBoundedNumber(r["stopPercent"], 1, 100, DEFAULTS.stopPercent);
40
47
  return {
41
- limit: typeof r["limit"] === "number" ? r["limit"] : DEFAULTS.limit,
42
- warnPercent: typeof r["warnPercent"] === "number" ? r["warnPercent"] : DEFAULTS.warnPercent,
43
- stopPercent: typeof r["stopPercent"] === "number" ? r["stopPercent"] : DEFAULTS.stopPercent,
48
+ limit: readBoundedNumber(r["limit"], 0, Number.MAX_SAFE_INTEGER, DEFAULTS.limit),
49
+ warnPercent,
50
+ // A warn threshold above the stop threshold can never fire — the run
51
+ // stops first. Clamp so the pair always describes a reachable window.
52
+ stopPercent: Math.max(stopPercent, warnPercent),
44
53
  model: typeof r["model"] === "string" ? r["model"] : ""
45
54
  };
46
55
  }
56
+ function clearRegistrations() {
57
+ for (const key of ["hookUnregister", "postHookUnregister"]) {
58
+ const off = state[key];
59
+ if (!off) continue;
60
+ try {
61
+ off();
62
+ } catch {
63
+ }
64
+ state[key] = null;
65
+ }
66
+ }
47
67
  var plugin = {
48
68
  name: "token-budget",
49
69
  version: "0.1.0",
@@ -90,9 +110,8 @@ var plugin = {
90
110
  state.stopFired = false;
91
111
  state.warnContextInjected = false;
92
112
  state.stopContextInjected = false;
93
- state.hookUnregister = null;
94
- state.postHookUnregister = null;
95
113
  state.lastRequest = null;
114
+ clearRegistrations();
96
115
  const cfg = readConfig(api.config.extensions?.["token-budget"]);
97
116
  api.onEvent("provider.response", (payload) => {
98
117
  const p = payload;
@@ -189,6 +208,12 @@ var plugin = {
189
208
  remaining,
190
209
  percent,
191
210
  requestCount: state.requestCount,
211
+ // The EFFECTIVE thresholds, after out-of-range values fall back to
212
+ // the defaults and warn/stop are ordered. Without these the user
213
+ // cannot tell that a rejected or clamped setting is not in force.
214
+ warnPercent: cfg.warnPercent,
215
+ stopPercent: cfg.stopPercent,
216
+ model: cfg.model === "" ? null : cfg.model,
192
217
  breakdown: {
193
218
  prompt: state.totalPromptTokens,
194
219
  completion: state.totalCompletionTokens
@@ -207,20 +232,7 @@ var plugin = {
207
232
  });
208
233
  },
209
234
  teardown(api) {
210
- if (state.hookUnregister) {
211
- try {
212
- state.hookUnregister();
213
- } catch {
214
- }
215
- state.hookUnregister = null;
216
- }
217
- if (state.postHookUnregister) {
218
- try {
219
- state.postHookUnregister();
220
- } catch {
221
- }
222
- state.postHookUnregister = null;
223
- }
235
+ clearRegistrations();
224
236
  const final = {
225
237
  totalTokens: state.totalTokens,
226
238
  requestCount: state.requestCount,
@@ -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,wBAAwB,CAAC;AA+NrD,QAAA,MAAM,MAAM,EAAE,MAkOb,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;AAgOrD,QAAA,MAAM,MAAM,EAAE,MAkOb,CAAC;eAEa,MAAM"}
package/dist/type-gate.js CHANGED
@@ -65,6 +65,17 @@ function resolveNodeBin(packageName, binName, cwd, extraArgs = []) {
65
65
  return resolved === null ? null : { ...resolved, args: [resolved.entry, ...extraArgs] };
66
66
  }
67
67
 
68
+ // src/runtime/handles.ts
69
+ function releaseHandle(off) {
70
+ if (off) {
71
+ try {
72
+ off();
73
+ } catch {
74
+ }
75
+ }
76
+ return null;
77
+ }
78
+
68
79
  // src/runtime/index.ts
69
80
  var META_CHARS = /["'`;&|<>\r\n]/;
70
81
  var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
@@ -439,7 +450,7 @@ var plugin = {
439
450
  state.errorCount = 0;
440
451
  state.skippedCount = 0;
441
452
  state.lastResult = null;
442
- state.hookUnregister = null;
453
+ state.hookUnregister = releaseHandle(state.hookUnregister);
443
454
  const cfg = readConfig(api.config.extensions?.["type-gate"]);
444
455
  const hook = async (input) => {
445
456
  if (!cfg.enabled) return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wrongstack/plugins",
3
- "version": "0.295.1",
3
+ "version": "0.296.2",
4
4
  "description": "Official WrongStack collection of focused plugins for code quality, security, observability, planning, and agent coordination",
5
5
  "license": "MIT",
6
6
  "author": "ECOSTACK TECHNOLOGY OÜ",
@@ -294,8 +294,8 @@
294
294
  "vitest": "^4.1.10"
295
295
  },
296
296
  "dependencies": {
297
- "@wrongstack/core": "0.295.1",
298
- "@wrongstack/tools": "0.295.1"
297
+ "@wrongstack/core": "0.296.2",
298
+ "@wrongstack/tools": "0.296.2"
299
299
  },
300
300
  "scripts": {
301
301
  "build": "node ../../scripts/build-package.mjs",