@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.
Files changed (211) 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 +50 -33
  5. package/dist/agent-handoff/index.d.ts +1 -1
  6. package/dist/agent-handoff/index.d.ts.map +1 -1
  7. package/dist/agent-handoff.js +30 -1
  8. package/dist/api-compatibility-gate/index.d.ts +1 -1
  9. package/dist/api-compatibility-gate/index.d.ts.map +1 -1
  10. package/dist/api-compatibility-gate.js +21 -16
  11. package/dist/audit/index.d.ts +386 -0
  12. package/dist/audit/index.d.ts.map +1 -0
  13. package/dist/audit.d.ts +1 -0
  14. package/dist/audit.js +454 -0
  15. package/dist/auto-doc/index.d.ts +1 -1
  16. package/dist/auto-doc/index.d.ts.map +1 -1
  17. package/dist/auto-doc.js +3 -1
  18. package/dist/auto-escalate/index.d.ts +1 -1
  19. package/dist/auto-escalate/index.d.ts.map +1 -1
  20. package/dist/auto-i18n-extractor/index.d.ts +1 -1
  21. package/dist/auto-i18n-extractor/index.d.ts.map +1 -1
  22. package/dist/auto-i18n-extractor.js +7 -1
  23. package/dist/branch-guard/index.d.ts +1 -1
  24. package/dist/branch-guard/index.d.ts.map +1 -1
  25. package/dist/branch-guard.js +111 -1
  26. package/dist/catalog.d.ts +5 -30
  27. package/dist/catalog.d.ts.map +1 -1
  28. package/dist/changelog-writer/index.d.ts +1 -1
  29. package/dist/changelog-writer/index.d.ts.map +1 -1
  30. package/dist/changelog-writer.js +137 -3
  31. package/dist/checkpoint/index.d.ts +3 -1
  32. package/dist/checkpoint/index.d.ts.map +1 -1
  33. package/dist/checkpoint.js +41 -16
  34. package/dist/code-metrics/index.d.ts +1 -1
  35. package/dist/code-metrics/index.d.ts.map +1 -1
  36. package/dist/code-metrics.js +34 -29
  37. package/dist/commit-validator/index.d.ts +1 -1
  38. package/dist/commit-validator/index.d.ts.map +1 -1
  39. package/dist/commit-validator.js +17 -7
  40. package/dist/config-validator/index.d.ts +1 -1
  41. package/dist/config-validator/index.d.ts.map +1 -1
  42. package/dist/context-pins/index.d.ts +1 -1
  43. package/dist/context-pins/index.d.ts.map +1 -1
  44. package/dist/context-pins.js +6 -5
  45. package/dist/cost-tracker/index.d.ts +1 -1
  46. package/dist/cost-tracker/index.d.ts.map +1 -1
  47. package/dist/cost-tracker.js +109 -2
  48. package/dist/cron/index.d.ts +1 -1
  49. package/dist/cron/index.d.ts.map +1 -1
  50. package/dist/cron.js +1 -0
  51. package/dist/dead-code-detector/index.d.ts +1 -1
  52. package/dist/dead-code-detector/index.d.ts.map +1 -1
  53. package/dist/dead-code-detector.js +31 -18
  54. package/dist/dep-guard/index.d.ts +1 -1
  55. package/dist/dep-guard/index.d.ts.map +1 -1
  56. package/dist/dependency-vulnerability-gate/index.d.ts +1 -1
  57. package/dist/dependency-vulnerability-gate/index.d.ts.map +1 -1
  58. package/dist/dependency-vulnerability-gate.js +67 -20
  59. package/dist/diff-summary/index.d.ts +1 -1
  60. package/dist/diff-summary/index.d.ts.map +1 -1
  61. package/dist/diff-summary.js +128 -30
  62. package/dist/doc-sync-guard/index.d.ts +1 -1
  63. package/dist/doc-sync-guard/index.d.ts.map +1 -1
  64. package/dist/doc-sync-guard.js +7 -1
  65. package/dist/duplicate-code-detector/index.d.ts +26 -1
  66. package/dist/duplicate-code-detector/index.d.ts.map +1 -1
  67. package/dist/duplicate-code-detector.js +280 -69
  68. package/dist/error-lens/index.d.ts +1 -1
  69. package/dist/error-lens/index.d.ts.map +1 -1
  70. package/dist/factories/index.d.ts +4 -0
  71. package/dist/factories/index.d.ts.map +1 -0
  72. package/dist/factories.d.ts +1 -0
  73. package/dist/factories.js +74 -0
  74. package/dist/feature-flag-tracker/index.d.ts +1 -1
  75. package/dist/feature-flag-tracker/index.d.ts.map +1 -1
  76. package/dist/feature-flag-tracker.js +59 -33
  77. package/dist/file-watcher/index.d.ts +1 -1
  78. package/dist/file-watcher/index.d.ts.map +1 -1
  79. package/dist/file-watcher.js +6 -7
  80. package/dist/format-on-save/index.d.ts +3 -1
  81. package/dist/format-on-save/index.d.ts.map +1 -1
  82. package/dist/format-on-save.js +289 -59
  83. package/dist/generated-plugin-exports.d.ts +65 -0
  84. package/dist/generated-plugin-exports.d.ts.map +1 -0
  85. package/dist/git-autocommit/index.d.ts +1 -1
  86. package/dist/git-autocommit/index.d.ts.map +1 -1
  87. package/dist/import-organizer/index.d.ts +1 -1
  88. package/dist/import-organizer/index.d.ts.map +1 -1
  89. package/dist/import-organizer.js +141 -20
  90. package/dist/index.d.ts +4 -183
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +18298 -17279
  93. package/dist/injection-shield/index.d.ts +1 -1
  94. package/dist/injection-shield/index.d.ts.map +1 -1
  95. package/dist/interface-contract-guard/index.d.ts +1 -1
  96. package/dist/interface-contract-guard/index.d.ts.map +1 -1
  97. package/dist/interface-contract-guard.js +87 -53
  98. package/dist/knowledge-graph/index.d.ts +1 -1
  99. package/dist/knowledge-graph/index.d.ts.map +1 -1
  100. package/dist/knowledge-graph.js +7 -6
  101. package/dist/license-audit-gate/index.d.ts +1 -1
  102. package/dist/license-audit-gate/index.d.ts.map +1 -1
  103. package/dist/lint-gate/index.d.ts +1 -1
  104. package/dist/lint-gate/index.d.ts.map +1 -1
  105. package/dist/lint-gate.js +112 -1
  106. package/dist/llm-cache/index.d.ts +5 -1
  107. package/dist/llm-cache/index.d.ts.map +1 -1
  108. package/dist/llm-cache.js +16 -8
  109. package/dist/loop-breaker/index.d.ts +1 -1
  110. package/dist/loop-breaker/index.d.ts.map +1 -1
  111. package/dist/loop-breaker.js +25 -9
  112. package/dist/manifest/index.d.ts +16 -0
  113. package/dist/manifest/index.d.ts.map +1 -0
  114. package/dist/manifest.d.ts +1 -0
  115. package/dist/manifest.js +152 -0
  116. package/dist/migration-planner/index.d.ts +1 -1
  117. package/dist/migration-planner/index.d.ts.map +1 -1
  118. package/dist/migration-planner.js +5 -1
  119. package/dist/model-router/index.d.ts +1 -1
  120. package/dist/model-router/index.d.ts.map +1 -1
  121. package/dist/notify-hub/index.d.ts +1 -1
  122. package/dist/notify-hub/index.d.ts.map +1 -1
  123. package/dist/notify-hub/webhook-channel.d.ts +1 -1
  124. package/dist/notify-hub/webhook-channel.d.ts.map +1 -1
  125. package/dist/notify-hub.js +41 -4
  126. package/dist/path-guard/index.d.ts +1 -1
  127. package/dist/path-guard/index.d.ts.map +1 -1
  128. package/dist/performance-regression-gate/index.d.ts +1 -1
  129. package/dist/performance-regression-gate/index.d.ts.map +1 -1
  130. package/dist/plugin-stack-observer/index.d.ts +1 -1
  131. package/dist/plugin-stack-observer/index.d.ts.map +1 -1
  132. package/dist/pr-drafter/index.d.ts +1 -1
  133. package/dist/pr-drafter/index.d.ts.map +1 -1
  134. package/dist/pr-drafter.js +28 -29
  135. package/dist/process-guard/index.d.ts +1 -1
  136. package/dist/process-guard/index.d.ts.map +1 -1
  137. package/dist/prompt-firewall/index.d.ts +1 -1
  138. package/dist/prompt-firewall/index.d.ts.map +1 -1
  139. package/dist/prompt-firewall.js +140 -11
  140. package/dist/refactor-suggester/index.d.ts +1 -1
  141. package/dist/refactor-suggester/index.d.ts.map +1 -1
  142. package/dist/refactor-suggester.js +148 -33
  143. package/dist/release-notes-generator/index.d.ts +1 -1
  144. package/dist/release-notes-generator/index.d.ts.map +1 -1
  145. package/dist/release-notes-generator.js +29 -22
  146. package/dist/runtime/bounded-map.d.ts +86 -0
  147. package/dist/runtime/bounded-map.d.ts.map +1 -0
  148. package/dist/runtime/credential-patterns.d.ts +42 -0
  149. package/dist/runtime/credential-patterns.d.ts.map +1 -0
  150. package/dist/runtime/index.d.ts +18 -0
  151. package/dist/runtime/index.d.ts.map +1 -1
  152. package/dist/runtime/llm.d.ts +1 -1
  153. package/dist/runtime/llm.d.ts.map +1 -1
  154. package/dist/runtime/local-bin.d.ts +120 -0
  155. package/dist/runtime/local-bin.d.ts.map +1 -0
  156. package/dist/runtime/safe-json.d.ts +25 -0
  157. package/dist/runtime/safe-json.d.ts.map +1 -0
  158. package/dist/runtime.js +332 -22
  159. package/dist/schema-evolution-guard/index.d.ts +1 -1
  160. package/dist/schema-evolution-guard/index.d.ts.map +1 -1
  161. package/dist/schema-evolution-guard.js +7 -1
  162. package/dist/secret-scanner/index.d.ts +1 -1
  163. package/dist/secret-scanner/index.d.ts.map +1 -1
  164. package/dist/secret-scanner.js +181 -48
  165. package/dist/security-hotspot-scanner/index.d.ts +1 -1
  166. package/dist/security-hotspot-scanner/index.d.ts.map +1 -1
  167. package/dist/security-hotspot-scanner.js +158 -20
  168. package/dist/semantic-search-indexer/index.d.ts +1 -1
  169. package/dist/semantic-search-indexer/index.d.ts.map +1 -1
  170. package/dist/semantic-search-indexer.js +7 -1
  171. package/dist/semver-bump/index.d.ts +1 -1
  172. package/dist/semver-bump/index.d.ts.map +1 -1
  173. package/dist/semver-bump.js +97 -43
  174. package/dist/session-recap/index.d.ts +1 -1
  175. package/dist/session-recap/index.d.ts.map +1 -1
  176. package/dist/shell-check/index.d.ts +1 -1
  177. package/dist/shell-check/index.d.ts.map +1 -1
  178. package/dist/smart-rename/index.d.ts +1 -1
  179. package/dist/smart-rename/index.d.ts.map +1 -1
  180. package/dist/spec-linker/index.d.ts +1 -1
  181. package/dist/spec-linker/index.d.ts.map +1 -1
  182. package/dist/spec-linker.js +222 -20772
  183. package/dist/template-engine/index.d.ts +1 -1
  184. package/dist/template-engine/index.d.ts.map +1 -1
  185. package/dist/template-engine.js +34 -8
  186. package/dist/test-coverage-gate/index.d.ts +1 -1
  187. package/dist/test-coverage-gate/index.d.ts.map +1 -1
  188. package/dist/test-coverage-gate.js +34 -14
  189. package/dist/test-flake-detector/index.d.ts +1 -1
  190. package/dist/test-flake-detector/index.d.ts.map +1 -1
  191. package/dist/test-flake-detector.js +31 -20
  192. package/dist/test-generator/index.d.ts +1 -1
  193. package/dist/test-generator/index.d.ts.map +1 -1
  194. package/dist/test-runner-gate/index.d.ts +1 -1
  195. package/dist/test-runner-gate/index.d.ts.map +1 -1
  196. package/dist/test-runner-gate.js +132 -9
  197. package/dist/todo-listener/index.d.ts +1 -32
  198. package/dist/todo-listener/index.d.ts.map +1 -1
  199. package/dist/todo-listener.js +30 -1
  200. package/dist/todo-tracker/index.d.ts +1 -1
  201. package/dist/todo-tracker/index.d.ts.map +1 -1
  202. package/dist/todo-tracker.js +3 -4
  203. package/dist/token-budget/index.d.ts +1 -1
  204. package/dist/token-budget/index.d.ts.map +1 -1
  205. package/dist/token-throttle/index.d.ts +1 -1
  206. package/dist/token-throttle/index.d.ts.map +1 -1
  207. package/dist/token-throttle.js +17 -2
  208. package/dist/type-gate/index.d.ts +1 -1
  209. package/dist/type-gate/index.d.ts.map +1 -1
  210. package/dist/type-gate.js +106 -19
  211. package/package.json +80 -68
@@ -34,11 +34,17 @@ var DEFAULTS = {
34
34
  repeatedErrorBlockAfter: 3,
35
35
  ignoreTools: []
36
36
  };
37
+ var ignoreToolsSet = new Set(DEFAULTS.ignoreTools);
37
38
  function readConfig(raw) {
38
- if (!raw || typeof raw !== "object") return { ...DEFAULTS };
39
+ if (!raw || typeof raw !== "object") {
40
+ ignoreToolsSet = new Set(DEFAULTS.ignoreTools);
41
+ return { ...DEFAULTS };
42
+ }
39
43
  const r = raw;
40
44
  const warnAfter = typeof r["warnAfter"] === "number" && r["warnAfter"] >= 2 ? r["warnAfter"] : DEFAULTS.warnAfter;
41
45
  const blockAfter = typeof r["blockAfter"] === "number" && r["blockAfter"] > warnAfter ? r["blockAfter"] : Math.max(DEFAULTS.blockAfter, warnAfter + 1);
46
+ const ignoreTools = Array.isArray(r["ignoreTools"]) ? r["ignoreTools"].filter((t) => typeof t === "string") : [];
47
+ ignoreToolsSet = new Set(ignoreTools);
42
48
  return {
43
49
  enabled: r["enabled"] !== false,
44
50
  mode: r["mode"] === "warn" ? "warn" : "block",
@@ -50,7 +56,7 @@ function readConfig(raw) {
50
56
  noDiffBlockAfter: typeof r["noDiffBlockAfter"] === "number" && r["noDiffBlockAfter"] >= 0 ? Math.floor(r["noDiffBlockAfter"]) : DEFAULTS.noDiffBlockAfter,
51
57
  repeatedErrorWarnAfter: typeof r["repeatedErrorWarnAfter"] === "number" && r["repeatedErrorWarnAfter"] >= 1 ? Math.floor(r["repeatedErrorWarnAfter"]) : DEFAULTS.repeatedErrorWarnAfter,
52
58
  repeatedErrorBlockAfter: typeof r["repeatedErrorBlockAfter"] === "number" && r["repeatedErrorBlockAfter"] >= 0 ? Math.floor(r["repeatedErrorBlockAfter"]) : DEFAULTS.repeatedErrorBlockAfter,
53
- ignoreTools: Array.isArray(r["ignoreTools"]) ? r["ignoreTools"].filter((t) => typeof t === "string") : []
59
+ ignoreTools
54
60
  };
55
61
  }
56
62
  function canonicalize(value) {
@@ -60,16 +66,26 @@ function canonicalize(value) {
60
66
  return String(value);
61
67
  }
62
68
  }
63
- function sortKeys(value) {
64
- if (Array.isArray(value)) return value.map(sortKeys);
65
- if (value && typeof value === "object") {
69
+ var CANONICALIZE_MAX_DEPTH = 12;
70
+ function sortKeys(value, depth = 0, seen = /* @__PURE__ */ new Set()) {
71
+ if (value === null || typeof value !== "object") return value;
72
+ if (seen.has(value)) return "[circular]";
73
+ if (depth >= CANONICALIZE_MAX_DEPTH) {
74
+ return Array.isArray(value) ? `[array:${value.length}]` : "[deep-object]";
75
+ }
76
+ seen.add(value);
77
+ try {
78
+ if (Array.isArray(value)) {
79
+ return value.map((v) => sortKeys(v, depth + 1, seen));
80
+ }
66
81
  const out = {};
67
82
  for (const key of Object.keys(value).sort()) {
68
- out[key] = sortKeys(value[key]);
83
+ out[key] = sortKeys(value[key], depth + 1, seen);
69
84
  }
70
85
  return out;
86
+ } finally {
87
+ seen.delete(value);
71
88
  }
72
- return value;
73
89
  }
74
90
  function fingerprint(toolName, toolInput) {
75
91
  return `${toolName}\0${canonicalize(toolInput)}`;
@@ -228,7 +244,7 @@ var plugin = {
228
244
  const hook = (input) => {
229
245
  if (!cfg.enabled) return;
230
246
  const toolName = input.toolName ?? "unknown";
231
- if (cfg.ignoreTools.includes(toolName)) return;
247
+ if (ignoreToolsSet.has(toolName)) return;
232
248
  state.invocations += 1;
233
249
  if (state.pendingBlockReason && cfg.mode === "block") {
234
250
  const reason = state.pendingBlockReason;
@@ -289,7 +305,7 @@ var plugin = {
289
305
  const postHook = async (input, runtime = { signal: new AbortController().signal }) => {
290
306
  if (!cfg.enabled) return;
291
307
  const toolName = input.toolName ?? "unknown";
292
- if (cfg.ignoreTools.includes(toolName)) return;
308
+ if (ignoreToolsSet.has(toolName)) return;
293
309
  state.postInvocations += 1;
294
310
  if (input.toolResult?.isError) {
295
311
  const errorFingerprint = normalizeError(input.toolResult.content);
@@ -0,0 +1,16 @@
1
+ /** Metadata that can be consumed without importing plugin implementations. */
2
+ export interface OfficialPluginManifestEntry {
3
+ name: string;
4
+ exportName: string;
5
+ packageSubpath: string;
6
+ sourcePath: string;
7
+ importSpecifier: string;
8
+ audit: {
9
+ risk: 'low' | 'medium' | 'high';
10
+ defaultState: 'active' | 'inactive';
11
+ canDisable: true;
12
+ };
13
+ }
14
+ export declare const OFFICIAL_PLUGIN_MANIFEST: readonly OfficialPluginManifestEntry[];
15
+ export declare const OFFICIAL_PLUGIN_NAME_SET: ReadonlySet<string>;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE;QACL,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;QAChC,YAAY,EAAE,QAAQ,GAAG,UAAU,CAAC;QACpC,UAAU,EAAE,IAAI,CAAC;KAClB,CAAC;CACH;AA0ID,eAAO,MAAM,wBAAwB,EAAE,SAAS,2BAA2B,EAe1E,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAAkC,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './manifest/index.js';
@@ -0,0 +1,152 @@
1
+ // src/manifest/index.ts
2
+ var OFFICIAL_PLUGIN_NAMES = [
3
+ "agent-handoff",
4
+ "cost-tracker",
5
+ "file-watcher",
6
+ "git-autocommit",
7
+ "auto-doc",
8
+ "shell-check",
9
+ "cron",
10
+ "template-engine",
11
+ "semver-bump",
12
+ "secret-scanner",
13
+ "todo-tracker",
14
+ "token-budget",
15
+ "lint-gate",
16
+ "branch-guard",
17
+ "diff-summary",
18
+ "commit-validator",
19
+ "format-on-save",
20
+ "test-runner-gate",
21
+ "import-organizer",
22
+ "knowledge-graph",
23
+ "todo-listener",
24
+ "session-recap",
25
+ "spec-linker",
26
+ "loop-breaker",
27
+ "path-guard",
28
+ "process-guard",
29
+ "context-pins",
30
+ "checkpoint",
31
+ "error-lens",
32
+ "dep-guard",
33
+ "config-validator",
34
+ "notify-hub",
35
+ "changelog-writer",
36
+ "injection-shield",
37
+ "llm-cache",
38
+ "model-router",
39
+ "pr-drafter",
40
+ "prompt-firewall",
41
+ "auto-escalate",
42
+ "test-coverage-gate",
43
+ "type-gate",
44
+ "token-throttle",
45
+ "plugin-stack-observer",
46
+ "dead-code-detector",
47
+ "dependency-vulnerability-gate",
48
+ "migration-planner",
49
+ "semantic-search-indexer",
50
+ "auto-i18n-extractor",
51
+ "doc-sync-guard",
52
+ "api-compatibility-gate",
53
+ "performance-regression-gate",
54
+ "test-flake-detector",
55
+ "schema-evolution-guard",
56
+ "license-audit-gate",
57
+ "accessibility-auditor",
58
+ "security-hotspot-scanner",
59
+ "duplicate-code-detector",
60
+ "code-metrics",
61
+ "refactor-suggester",
62
+ "test-generator",
63
+ "release-notes-generator",
64
+ "smart-rename",
65
+ "feature-flag-tracker",
66
+ "interface-contract-guard"
67
+ ];
68
+ var MEDIUM_RISK_PLUGINS = /* @__PURE__ */ new Set([
69
+ "agent-handoff",
70
+ "auto-doc",
71
+ "accessibility-auditor",
72
+ "file-watcher",
73
+ "cron",
74
+ "template-engine",
75
+ "token-budget",
76
+ "lint-gate",
77
+ "commit-validator",
78
+ "format-on-save",
79
+ "test-runner-gate",
80
+ "import-organizer",
81
+ "path-guard",
82
+ "checkpoint",
83
+ "dep-guard",
84
+ "api-compatibility-gate",
85
+ "notify-hub",
86
+ "llm-cache",
87
+ "model-router",
88
+ "auto-escalate",
89
+ "token-throttle",
90
+ "test-coverage-gate",
91
+ "test-flake-detector",
92
+ "performance-regression-gate",
93
+ "type-gate",
94
+ "interface-contract-guard",
95
+ "smart-rename"
96
+ ]);
97
+ var HIGH_RISK_PLUGINS = /* @__PURE__ */ new Set([
98
+ "git-autocommit",
99
+ "semver-bump",
100
+ "secret-scanner",
101
+ "branch-guard",
102
+ "process-guard",
103
+ "dependency-vulnerability-gate",
104
+ "license-audit-gate",
105
+ "security-hotspot-scanner",
106
+ "schema-evolution-guard",
107
+ "prompt-firewall"
108
+ ]);
109
+ var DEFAULT_ACTIVE_PLUGINS = /* @__PURE__ */ new Set([
110
+ "cost-tracker",
111
+ "secret-scanner",
112
+ "todo-tracker",
113
+ "token-budget",
114
+ "diff-summary",
115
+ "knowledge-graph",
116
+ "loop-breaker",
117
+ "process-guard",
118
+ "context-pins",
119
+ "error-lens",
120
+ "dep-guard",
121
+ "config-validator",
122
+ "injection-shield"
123
+ ]);
124
+ function auditRisk(name) {
125
+ if (HIGH_RISK_PLUGINS.has(name)) return "high";
126
+ if (MEDIUM_RISK_PLUGINS.has(name)) return "medium";
127
+ return "low";
128
+ }
129
+ function exportName(name) {
130
+ return `${name.replace(/-([a-z0-9])/g, (_, char) => char.toUpperCase())}Plugin`;
131
+ }
132
+ var OFFICIAL_PLUGIN_MANIFEST = Object.freeze(
133
+ OFFICIAL_PLUGIN_NAMES.map(
134
+ (name) => Object.freeze({
135
+ name,
136
+ exportName: exportName(name),
137
+ packageSubpath: `./${name}`,
138
+ sourcePath: `./src/${name}`,
139
+ importSpecifier: `@wrongstack/plugins/${name}`,
140
+ audit: Object.freeze({
141
+ risk: auditRisk(name),
142
+ defaultState: DEFAULT_ACTIVE_PLUGINS.has(name) ? "active" : "inactive",
143
+ canDisable: true
144
+ })
145
+ })
146
+ )
147
+ );
148
+ var OFFICIAL_PLUGIN_NAME_SET = new Set(OFFICIAL_PLUGIN_NAMES);
149
+ export {
150
+ OFFICIAL_PLUGIN_MANIFEST,
151
+ OFFICIAL_PLUGIN_NAME_SET
152
+ };
@@ -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
  export interface MigrationAiAnalysis {
30
30
  summary: string;
31
31
  riskLevel: 'low' | 'medium' | 'high' | 'unknown';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migration-planner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAwP/C,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IACjD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAwED,QAAA,MAAM,MAAM,EAAE,MA+Sb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migration-planner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAwPrD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IACjD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAwED,QAAA,MAAM,MAAM,EAAE,MA+Sb,CAAC;eAEa,MAAM"}
@@ -50,6 +50,9 @@ async function runOptionalPluginLlm(request) {
50
50
  }
51
51
  }
52
52
 
53
+ // src/runtime/local-bin.ts
54
+ import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
55
+
53
56
  // src/runtime/index.ts
54
57
  var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
55
58
  function hasLeadingDash(arg) {
@@ -63,7 +66,8 @@ function withinProjectPath(projectRoot, candidate) {
63
66
  return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
64
67
  }
65
68
  function withinProject(p) {
66
- return withinProjectPath(process.cwd(), p) || relative(process.cwd(), p) === ".";
69
+ const cwd = process.cwd();
70
+ return withinProjectPath(cwd, p) || relative(cwd, p) === ".";
67
71
  }
68
72
 
69
73
  // src/migration-planner/index.ts
@@ -42,7 +42,7 @@
42
42
  *
43
43
  * @public
44
44
  */
45
- import type { Plugin } from '@wrongstack/core';
45
+ import type { Plugin } from '@wrongstack/core/types';
46
46
  interface RouteRule {
47
47
  /** Match when the request's total char size is <= this. */
48
48
  maxChars?: number | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model-router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,kBAAkB,CAAC;AAM1D,UAAU,SAAS;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;CACf;AA8DD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAgBxE;AAED,6DAA6D;AAC7D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAQ9F;AAMD,QAAA,MAAM,MAAM,EAAE,MAyKb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model-router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,wBAAwB,CAAC;AAMhE,UAAU,SAAS;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;CACf;AA8DD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAgBxE;AAED,6DAA6D;AAC7D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAQ9F;AAMD,QAAA,MAAM,MAAM,EAAE,MAyKb,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/notify-hub/index.ts"],"names":[],"mappings":"AAwDA,OAAO,KAAK,EAAmD,MAAM,EAAE,MAAM,kBAAkB,CAAC;AA8NhG,QAAA,MAAM,MAAM,EAAE,MAwRb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notify-hub/index.ts"],"names":[],"mappings":"AAyDA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAiP7D,QAAA,MAAM,MAAM,EAAE,MAwRb,CAAC;eAEa,MAAM"}
@@ -14,7 +14,7 @@
14
14
  * @module notify-hub
15
15
  * @public
16
16
  */
17
- import type { NotificationChannel, NotificationMessage, NotificationResult } from '@wrongstack/core';
17
+ import type { NotificationChannel, NotificationMessage, NotificationResult } from '@wrongstack/core/notifications';
18
18
  export interface WebhookChannelOptions {
19
19
  /** HTTP(S) endpoint that receives JSON POSTs. */
20
20
  readonly webhookUrl: string;
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-channel.d.ts","sourceRoot":"","sources":["../../src/notify-hub/webhook-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAmBrG,MAAM,WAAW,qBAAqB;IACpC,iDAAiD;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IAChE,iDAAiD;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtD;AAED,qBAAa,0BAA2B,YAAW,mBAAmB;;IACpE,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IAiBnC,YAAY,IAAI,EAAE,qBAAqB,EAMtC;IAMK,OAAO,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6DnE;IAEK,IAAI,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAYjE;IAMD,4DAA4D;IAC5D,YAAY,IAAI,IAAI,CAGnB;IAED,qCAAqC;IACrC,aAAa,IAAI;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAE9D;IAED,gDAAgD;IAChD,QAAQ,IAAI;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAOA;CACF"}
1
+ {"version":3,"file":"webhook-channel.d.ts","sourceRoot":"","sources":["../../src/notify-hub/webhook-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAmBnH,MAAM,WAAW,qBAAqB;IACpC,iDAAiD;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IAChE,iDAAiD;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtD;AAED,qBAAa,0BAA2B,YAAW,mBAAmB;;IACpE,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IAiBnC,YAAY,IAAI,EAAE,qBAAqB,EAMtC;IAMK,OAAO,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6DnE;IAEK,IAAI,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAYjE;IAMD,4DAA4D;IAC5D,YAAY,IAAI,IAAI,CAGnB;IAED,qCAAqC;IACrC,aAAa,IAAI;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAE9D;IAED,gDAAgD;IAChD,QAAQ,IAAI;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAOA;CACF"}
@@ -1,6 +1,35 @@
1
1
  // src/notify-hub/index.ts
2
2
  import { lookup } from "node:dns/promises";
3
3
 
4
+ // src/runtime/local-bin.ts
5
+ import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
6
+
7
+ // src/runtime/safe-json.ts
8
+ var UNSERIALIZABLE = "[unserializable]";
9
+ function safeJsonStringify(value, indent) {
10
+ try {
11
+ const stack = [];
12
+ const out = JSON.stringify(
13
+ value,
14
+ function replacer(_key, val) {
15
+ if (typeof val === "bigint") return `${val.toString()}n`;
16
+ if (val === null || typeof val !== "object") return val;
17
+ while (stack.length > 0 && stack[stack.length - 1] !== this) stack.pop();
18
+ if (stack.includes(val)) return "[circular]";
19
+ stack.push(val);
20
+ return val;
21
+ },
22
+ indent
23
+ );
24
+ return out ?? String(value);
25
+ } catch {
26
+ return UNSERIALIZABLE;
27
+ }
28
+ }
29
+
30
+ // src/runtime/index.ts
31
+ var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
32
+
4
33
  // src/notify-hub/webhook-channel.ts
5
34
  function freshCircuit() {
6
35
  return { open: false, consecutiveFailures: 0 };
@@ -202,13 +231,21 @@ async function deliver(event, payload) {
202
231
  }
203
232
  const result = await deliverViaChannel(ch, event, {
204
233
  title: typeof payload.title === "string" ? payload.title : event,
205
- body: typeof payload.message === "string" ? payload.message : typeof payload.error === "string" ? payload.error : JSON.stringify(payload),
234
+ body: typeof payload.message === "string" ? payload.message : typeof payload.error === "string" ? payload.error : safeJsonStringify(payload),
206
235
  level: event === "tool.error" || event === "budget.threshold" ? "warning" : "info",
207
236
  source: event,
208
237
  metadata: payload
209
238
  });
210
239
  return result.ok;
211
240
  }
241
+ function deliverDetached(event, payload) {
242
+ deliver(event, payload).catch((err) => {
243
+ _pluginLog?.warn("notify-hub: notification delivery failed", {
244
+ event,
245
+ error: err instanceof Error ? err.message : String(err)
246
+ });
247
+ });
248
+ }
212
249
  async function deliverViaChannel(ch, event, msg) {
213
250
  const result = await ch.deliver(msg);
214
251
  if (result.ok) {
@@ -317,7 +354,7 @@ var plugin = {
317
354
  }
318
355
  if (active && cfg.events.includes("session.stop")) {
319
356
  const stopHook = (input) => {
320
- void deliver("session.stop", {
357
+ deliverDetached("session.stop", {
321
358
  sessionId: input.sessionId ?? null,
322
359
  cwd: input.cwd ?? null
323
360
  });
@@ -328,7 +365,7 @@ var plugin = {
328
365
  const off = api.onPattern("tool.*", (eventName, payload) => {
329
366
  if (!/error|failed/.test(eventName)) return;
330
367
  const p = payload;
331
- void deliver("tool.error", {
368
+ deliverDetached("tool.error", {
332
369
  tool: p?.tool ?? p?.name ?? "unknown",
333
370
  busEvent: eventName,
334
371
  error: truncateText(
@@ -342,7 +379,7 @@ var plugin = {
342
379
  if (active && cfg.events.includes("budget.threshold")) {
343
380
  const off = api.onPattern("budget.*", (eventName, payload) => {
344
381
  if (!eventName.includes("threshold")) return;
345
- void deliver("budget.threshold", { busEvent: eventName, detail: payload });
382
+ deliverDetached("budget.threshold", { busEvent: eventName, detail: payload });
346
383
  });
347
384
  state.eventUnsubscribers.push(off);
348
385
  }
@@ -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
  /**
36
36
  * Compile a glob pattern to a RegExp. Supports `**` (any depth),
37
37
  * `*` (within one segment), and `?` (single char). Matching is done
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/path-guard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAwE/C;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAyBvD;AAWD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB5D;AAMD,QAAA,MAAM,MAAM,EAAE,MA8Kb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/path-guard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAwErD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAyBvD;AAWD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB5D;AAMD,QAAA,MAAM,MAAM,EAAE,MA8Kb,CAAC;eAEa,MAAM"}
@@ -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/performance-regression-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAwO/C,QAAA,MAAM,MAAM,EAAE,MA8Mb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/performance-regression-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAwOrD,QAAA,MAAM,MAAM,EAAE,MA8Mb,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/plugin-stack-observer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAqC/C,QAAA,MAAM,MAAM,EAAE,MAyIb,CAAC;eAoBa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin-stack-observer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAqCrD,QAAA,MAAM,MAAM,EAAE,MAyIb,CAAC;eAoBa,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/pr-drafter/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,kBAAkB,CAAC;AA4M1D,QAAA,MAAM,MAAM,EAAE,MAyNb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pr-drafter/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,wBAAwB,CAAC;AA4MhE,QAAA,MAAM,MAAM,EAAE,MAyNb,CAAC;eAEa,MAAM"}
@@ -1,6 +1,6 @@
1
1
  // src/pr-drafter/index.ts
2
- import { execFileSync } from "node:child_process";
3
- import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { execFile } from "node:child_process";
3
+ import { mkdir, writeFile } from "node:fs/promises";
4
4
  import { dirname, isAbsolute, relative, resolve } from "node:path";
5
5
  var API_VERSION = "^0.1.10";
6
6
  var state = {
@@ -46,34 +46,33 @@ function resolveProjectPath(rawPath, cwd = process.cwd()) {
46
46
  if (rel === "" || !rel.startsWith("..") && !isAbsolute(rel)) return resolved;
47
47
  return null;
48
48
  }
49
+ function runGit(args, timeout) {
50
+ return new Promise((resolveOutput) => {
51
+ execFile(
52
+ "git",
53
+ args,
54
+ {
55
+ encoding: "utf8",
56
+ cwd: process.cwd(),
57
+ windowsHide: true,
58
+ timeout,
59
+ maxBuffer: 5 * 1024 * 1024
60
+ },
61
+ (error, stdout) => resolveOutput(error ? null : stdout.trim())
62
+ );
63
+ });
64
+ }
49
65
  function gitBranch() {
50
- try {
51
- const out = execFileSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
52
- encoding: "utf-8",
53
- cwd: process.cwd(),
54
- stdio: ["pipe", "pipe", "ignore"],
55
- timeout: 5e3
56
- });
57
- return out.trim();
58
- } catch {
59
- return null;
60
- }
66
+ return runGit(["rev-parse", "--abbrev-ref", "HEAD"], 5e3);
61
67
  }
62
68
  function gitDiff() {
63
- try {
64
- return execFileSync("git", ["diff", "--stat"], {
65
- encoding: "utf-8",
66
- cwd: process.cwd(),
67
- stdio: ["pipe", "pipe", "ignore"],
68
- timeout: 1e4
69
- }).trim();
70
- } catch {
71
- return null;
72
- }
69
+ return runGit(["diff", "--stat"], 1e4);
73
70
  }
74
71
  async function buildDraft(cfg, llm) {
75
- const branch = gitBranch();
76
- const diffStat = cfg.includeDiff ? gitDiff() : null;
72
+ const [branch, diffStat] = await Promise.all([
73
+ gitBranch(),
74
+ cfg.includeDiff ? gitDiff() : Promise.resolve(null)
75
+ ]);
77
76
  const lines = [];
78
77
  lines.push("# PR Draft");
79
78
  if (branch) lines.push(`**Branch:** \`${branch}\``);
@@ -130,8 +129,8 @@ async function writeDraft(cfg, llm) {
130
129
  }
131
130
  const draft = await buildDraft(cfg, llm);
132
131
  try {
133
- mkdirSync(dirname(resolved), { recursive: true });
134
- writeFileSync(resolved, draft.body);
132
+ await mkdir(dirname(resolved), { recursive: true });
133
+ await writeFile(resolved, draft.body);
135
134
  state.draftsWritten += 1;
136
135
  } catch {
137
136
  state.draftErrors += 1;
@@ -257,8 +256,8 @@ var plugin = {
257
256
  const resolved = resolveProjectPath(cfg.outputPath);
258
257
  if (!resolved) return { ok: false, error: "outputPath resolves outside project" };
259
258
  try {
260
- mkdirSync(dirname(resolved), { recursive: true });
261
- writeFileSync(resolved, draft.body);
259
+ await mkdir(dirname(resolved), { recursive: true });
260
+ await writeFile(resolved, draft.body);
262
261
  state.draftsWritten += 1;
263
262
  return {
264
263
  ok: true,
@@ -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
  declare const plugin: Plugin;
40
40
  export default plugin;
41
41
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/process-guard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAiD/C,QAAA,MAAM,MAAM,EAAE,MAoKb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/process-guard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAiDrD,QAAA,MAAM,MAAM,EAAE,MAoKb,CAAC;eAEa,MAAM"}
@@ -38,7 +38,7 @@
38
38
  *
39
39
  * @public
40
40
  */
41
- import type { Plugin } from '@wrongstack/core';
41
+ import type { Plugin } from '@wrongstack/core/types';
42
42
  export interface Detection {
43
43
  kind: string;
44
44
  count: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompt-firewall/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,kBAAkB,CAAC;AA+B1D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAcxE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAWjG;AA0CD,KAAK,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhD,UAAU,oBAAoB;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CA0B7D;AAgCD,QAAA,MAAM,MAAM,EAAE,MAkNb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompt-firewall/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,wBAAwB,CAAC;AA2EhE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAcxE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAWjG;AA0CD,KAAK,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhD,UAAU,oBAAoB;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CA0B7D;AAgCD,QAAA,MAAM,MAAM,EAAE,MAkNb,CAAC;eAEa,MAAM"}