@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
package/dist/audit.js ADDED
@@ -0,0 +1,454 @@
1
+ // src/audit/index.ts
2
+ var OFFICIAL_PLUGIN_AUDIT_ENTRIES = [
3
+ {
4
+ name: "agent-handoff",
5
+ risk: "medium",
6
+ summary: "Listens for subagent.done events and posts structured handoff notes to the project mailbox",
7
+ defaultState: "inactive",
8
+ canDisable: true
9
+ },
10
+ {
11
+ name: "cost-tracker",
12
+ risk: "low",
13
+ summary: "Tracks LLM token usage and estimated cost per session with per-model breakdown",
14
+ defaultState: "active",
15
+ canDisable: true
16
+ },
17
+ {
18
+ name: "file-watcher",
19
+ risk: "medium",
20
+ summary: "Watches project files and emits events when changes occur (add, change, delete)",
21
+ defaultState: "inactive",
22
+ canDisable: true
23
+ },
24
+ {
25
+ name: "git-autocommit",
26
+ risk: "high",
27
+ summary: "AI-powered git staging and conventional commit message generation",
28
+ defaultState: "inactive",
29
+ canDisable: true
30
+ },
31
+ {
32
+ name: "auto-doc",
33
+ risk: "medium",
34
+ summary: "Auto-generates JSDoc/TSDoc comments for functions, classes, types, and interfaces",
35
+ defaultState: "inactive",
36
+ canDisable: true
37
+ },
38
+ {
39
+ name: "shell-check",
40
+ risk: "low",
41
+ summary: "Runs shellcheck analysis on bash/shell scripts and surfaces issues with severity levels",
42
+ defaultState: "inactive",
43
+ canDisable: true
44
+ },
45
+ {
46
+ name: "cron",
47
+ risk: "medium",
48
+ summary: "Schedules recurring tasks using beforeIteration/afterIteration extension hooks",
49
+ defaultState: "inactive",
50
+ canDisable: true
51
+ },
52
+ {
53
+ name: "template-engine",
54
+ risk: "medium",
55
+ summary: "Expands file templates with variable substitution, conditionals, and loops",
56
+ defaultState: "inactive",
57
+ canDisable: true
58
+ },
59
+ {
60
+ name: "semver-bump",
61
+ risk: "high",
62
+ summary: "Conventional-commit-driven semver version bumps with changelog generation",
63
+ defaultState: "inactive",
64
+ canDisable: true
65
+ },
66
+ {
67
+ name: "secret-scanner",
68
+ risk: "high",
69
+ summary: "Pre-tool hook that blocks (or optionally redacts) tools whose arguments contain plaintext credentials",
70
+ defaultState: "active",
71
+ canDisable: true
72
+ },
73
+ {
74
+ name: "todo-tracker",
75
+ risk: "low",
76
+ summary: "Persistent, project-scoped todo backlog that survives across sessions",
77
+ defaultState: "active",
78
+ canDisable: true
79
+ },
80
+ {
81
+ name: "token-budget",
82
+ risk: "medium",
83
+ summary: "Enforces a per-session token budget \u2014 warns at a threshold and stops the agent loop when the limit is hit",
84
+ defaultState: "active",
85
+ canDisable: true
86
+ },
87
+ {
88
+ name: "lint-gate",
89
+ risk: "medium",
90
+ summary: "Pre-tool hook that runs biome/eslint on would-be file content before write or edit commits",
91
+ defaultState: "inactive",
92
+ canDisable: true
93
+ },
94
+ {
95
+ name: "branch-guard",
96
+ risk: "high",
97
+ summary: "Pre-tool hook that blocks commits, pushes, and merges to protected branches (default: main, master)",
98
+ defaultState: "inactive",
99
+ canDisable: true
100
+ },
101
+ {
102
+ name: "diff-summary",
103
+ risk: "low",
104
+ summary: "PostToolUse hook that injects a compact git diff into the LLM context after every write or edit",
105
+ defaultState: "active",
106
+ canDisable: true
107
+ },
108
+ {
109
+ name: "commit-validator",
110
+ risk: "medium",
111
+ summary: "PreToolUse hook that validates conventional-commit format before git_autocommit or bash git commit runs",
112
+ defaultState: "inactive",
113
+ canDisable: true
114
+ },
115
+ {
116
+ name: "format-on-save",
117
+ risk: "medium",
118
+ summary: "PostToolUse hook that runs biome format --write on the file after every write or edit",
119
+ defaultState: "inactive",
120
+ canDisable: true
121
+ },
122
+ {
123
+ name: "test-runner-gate",
124
+ risk: "medium",
125
+ summary: "PostToolUse hook that runs the relevant test file after every write or edit to a source file",
126
+ defaultState: "inactive",
127
+ canDisable: true
128
+ },
129
+ {
130
+ name: "import-organizer",
131
+ risk: "medium",
132
+ summary: "PostToolUse hook that re-sorts and de-duplicates imports in a file after every write or edit",
133
+ defaultState: "inactive",
134
+ canDisable: true
135
+ },
136
+ {
137
+ name: "knowledge-graph",
138
+ risk: "low",
139
+ summary: "Accumulates structured (subject, relation, object) facts about the project and queries them across sessions",
140
+ defaultState: "active",
141
+ canDisable: true
142
+ },
143
+ {
144
+ name: "todo-listener",
145
+ risk: "low",
146
+ summary: "PostToolUse hook on `todo` tool \u2014 broadcasts a status update to the project mailbox so other agents can see what this one is working on",
147
+ defaultState: "inactive",
148
+ canDisable: true
149
+ },
150
+ {
151
+ name: "session-recap",
152
+ risk: "low",
153
+ summary: "Stop hook that posts a one-page session summary (tokens, tools, commits, last activity) to the project mailbox",
154
+ defaultState: "inactive",
155
+ canDisable: true
156
+ },
157
+ {
158
+ name: "spec-linker",
159
+ risk: "low",
160
+ summary: "Markdown link auditor for plugin references. PostToolUse surfaces unlinked references; PreToolUse on `write` (autoFix) wraps them in markdown links via modifiedInput.",
161
+ defaultState: "inactive",
162
+ canDisable: true
163
+ },
164
+ {
165
+ name: "loop-breaker",
166
+ risk: "low",
167
+ summary: "Detects runaway tool-call loops (identical repeats and A-B-A-B oscillation) \u2014 warns the model, then blocks",
168
+ defaultState: "active",
169
+ canDisable: true
170
+ },
171
+ {
172
+ name: "path-guard",
173
+ risk: "medium",
174
+ summary: "Blocks or warns about writes, edits, and destructive shell commands touching protected paths (lockfiles, .env, .git, migrations)",
175
+ defaultState: "inactive",
176
+ canDisable: true
177
+ },
178
+ {
179
+ name: "process-guard",
180
+ risk: "high",
181
+ summary: "Blocks kill commands (taskkill, Stop-Process, kill, pkill, wmic) that target active WrongStack processes or their host terminals.",
182
+ defaultState: "active",
183
+ canDisable: true
184
+ },
185
+ {
186
+ name: "context-pins",
187
+ risk: "low",
188
+ summary: "Pin durable facts into the system prompt (pin_add/pin_remove/pin_list) \u2014 pins survive compaction and persist across sessions",
189
+ defaultState: "active",
190
+ canDisable: true
191
+ },
192
+ {
193
+ name: "checkpoint",
194
+ risk: "medium",
195
+ summary: "In-session file snapshots: auto-captures content before every write/edit and restores any pre-edit state on demand",
196
+ defaultState: "inactive",
197
+ canDisable: true
198
+ },
199
+ {
200
+ name: "error-lens",
201
+ risk: "low",
202
+ summary: "Distills failed command output into a compact digest (error line + project stack frames) and flags repeated failures",
203
+ defaultState: "active",
204
+ canDisable: true
205
+ },
206
+ {
207
+ name: "dep-guard",
208
+ risk: "medium",
209
+ summary: "Supervises dependency installs: blocks deny-listed packages, flags typosquat lookalikes, and optionally warns on unpinned versions",
210
+ defaultState: "active",
211
+ canDisable: true
212
+ },
213
+ {
214
+ name: "config-validator",
215
+ risk: "low",
216
+ summary: "Validates JSON/JSONC/YAML/TOML files right after write/edit and reports syntax problems in the same turn",
217
+ defaultState: "active",
218
+ canDisable: true
219
+ },
220
+ {
221
+ name: "notify-hub",
222
+ risk: "medium",
223
+ summary: "POSTs session events (stop, tool errors, budget thresholds) and ad-hoc notify_send messages to a configurable webhook",
224
+ defaultState: "inactive",
225
+ canDisable: true
226
+ },
227
+ {
228
+ name: "changelog-writer",
229
+ risk: "low",
230
+ summary: "Collects session work (commits, edits, manual notes) and writes Keep-a-Changelog entries under [Unreleased] on demand",
231
+ defaultState: "inactive",
232
+ canDisable: true
233
+ },
234
+ {
235
+ name: "injection-shield",
236
+ risk: "low",
237
+ summary: "Scans tool output (fetched pages, files) for prompt-injection patterns and warns the model that content is data, not instructions",
238
+ defaultState: "active",
239
+ canDisable: true
240
+ },
241
+ {
242
+ name: "llm-cache",
243
+ risk: "medium",
244
+ summary: "Caches identical provider requests and short-circuits the provider call on a hit (wrapProviderRunner). Opt-in; deterministic-only by default.",
245
+ defaultState: "inactive",
246
+ canDisable: true
247
+ },
248
+ {
249
+ name: "model-router",
250
+ risk: "medium",
251
+ summary: "Routes each provider call to a different model by declarative size/tool rules (wrapProviderRunner). Opt-in; dry-run by default; routes within the active provider only.",
252
+ defaultState: "inactive",
253
+ canDisable: true
254
+ },
255
+ {
256
+ name: "pr-drafter",
257
+ risk: "low",
258
+ summary: "Collects session work (commits, edited files, diff) and drafts a pull-request description",
259
+ defaultState: "inactive",
260
+ canDisable: true
261
+ },
262
+ {
263
+ name: "prompt-firewall",
264
+ risk: "high",
265
+ summary: "Scans the provider wire for credential leaks before context reaches the LLM API (wrapProviderRunner); redact/warn/block. Opt-in; redact by default.",
266
+ defaultState: "inactive",
267
+ canDisable: true
268
+ },
269
+ {
270
+ name: "auto-escalate",
271
+ risk: "medium",
272
+ summary: "On retryable provider errors, retries the turn with the next model in an escalation ladder (onError). Opt-in; defers to default recovery otherwise.",
273
+ defaultState: "inactive",
274
+ canDisable: true
275
+ },
276
+ {
277
+ name: "test-coverage-gate",
278
+ risk: "medium",
279
+ summary: "PostToolUse hook that detects test coverage regressions after source-file edits",
280
+ defaultState: "inactive",
281
+ canDisable: true
282
+ },
283
+ {
284
+ name: "type-gate",
285
+ risk: "medium",
286
+ summary: "PostToolUse hook that runs TypeScript type-checking after every write or edit to a source file",
287
+ defaultState: "inactive",
288
+ canDisable: true
289
+ },
290
+ {
291
+ name: "token-throttle",
292
+ risk: "medium",
293
+ summary: "Rolling-window tokens/min budget that delays provider calls to stay under a rate limit (wrapProviderRunner). Opt-in; delay capped by maxDelayMs.",
294
+ defaultState: "inactive",
295
+ canDisable: true
296
+ },
297
+ {
298
+ name: "plugin-stack-observer",
299
+ risk: "low",
300
+ summary: "Observes the wrapProviderRunner stack and exposes it to operators (plugin_stack_status) and, optionally, to the LLM (system-prompt contributor).",
301
+ defaultState: "inactive",
302
+ canDisable: true
303
+ },
304
+ {
305
+ name: "dead-code-detector",
306
+ risk: "low",
307
+ summary: "Lightweight regex-based scan for exported identifiers that appear unused anywhere in the project",
308
+ defaultState: "inactive",
309
+ canDisable: true
310
+ },
311
+ {
312
+ name: "dependency-vulnerability-gate",
313
+ risk: "high",
314
+ summary: "PostToolUse hook that runs npm/pnpm audit after dependency installs and blocks or warns on vulnerabilities above a severity threshold",
315
+ defaultState: "inactive",
316
+ canDisable: true
317
+ },
318
+ {
319
+ name: "migration-planner",
320
+ risk: "low",
321
+ summary: "Builds evidence-backed migration checklists with optional host-routed LLM risk analysis",
322
+ defaultState: "inactive",
323
+ canDisable: true
324
+ },
325
+ {
326
+ name: "semantic-search-indexer",
327
+ risk: "low",
328
+ summary: "Builds an in-memory keyword index over project source files and answers ranked search queries",
329
+ defaultState: "inactive",
330
+ canDisable: true
331
+ },
332
+ {
333
+ name: "auto-i18n-extractor",
334
+ risk: "low",
335
+ summary: "Detects hardcoded user-facing strings in UI source files and suggests translation keys",
336
+ defaultState: "inactive",
337
+ canDisable: true
338
+ },
339
+ {
340
+ name: "doc-sync-guard",
341
+ risk: "low",
342
+ summary: "PostToolUse hook that tracks changed public source files and warns when README/docs edits omit them",
343
+ defaultState: "inactive",
344
+ canDisable: true
345
+ },
346
+ {
347
+ name: "api-compatibility-gate",
348
+ risk: "medium",
349
+ summary: "PostToolUse hook that detects breaking API changes (removed exports) in entry-point files after writes or edits",
350
+ defaultState: "inactive",
351
+ canDisable: true
352
+ },
353
+ {
354
+ name: "performance-regression-gate",
355
+ risk: "medium",
356
+ summary: "Compares benchmark results to detect performance regressions and reports metrics that increased beyond the configured threshold",
357
+ defaultState: "inactive",
358
+ canDisable: true
359
+ },
360
+ {
361
+ name: "test-flake-detector",
362
+ risk: "medium",
363
+ summary: "Runs a test command multiple times and reports tests that fail non-deterministically",
364
+ defaultState: "inactive",
365
+ canDisable: true
366
+ },
367
+ {
368
+ name: "schema-evolution-guard",
369
+ risk: "high",
370
+ summary: "PostToolUse hook that guards database/API schema changes by detecting destructive patterns in schema files",
371
+ defaultState: "inactive",
372
+ canDisable: true
373
+ },
374
+ {
375
+ name: "license-audit-gate",
376
+ risk: "high",
377
+ summary: "PostToolUse hook that audits dependency licenses after package-manager install/add commands and blocks disallowed licenses",
378
+ defaultState: "inactive",
379
+ canDisable: true
380
+ },
381
+ {
382
+ name: "accessibility-auditor",
383
+ risk: "medium",
384
+ summary: "Audits .tsx/.jsx/.html/.vue files for common accessibility issues and reports findings after writes/edits",
385
+ defaultState: "inactive",
386
+ canDisable: true
387
+ },
388
+ {
389
+ name: "security-hotspot-scanner",
390
+ risk: "high",
391
+ summary: "Scans source code for security anti-patterns and warns after writes/edits that introduce new hotspots",
392
+ defaultState: "inactive",
393
+ canDisable: true
394
+ },
395
+ {
396
+ name: "duplicate-code-detector",
397
+ risk: "low",
398
+ summary: "Finds duplicated code blocks across source files using normalized-line fingerprinting",
399
+ defaultState: "inactive",
400
+ canDisable: true
401
+ },
402
+ {
403
+ name: "code-metrics",
404
+ risk: "low",
405
+ summary: "Computes per-file line counts, function counts, and cyclomatic-complexity-like scores",
406
+ defaultState: "inactive",
407
+ canDisable: true
408
+ },
409
+ {
410
+ name: "refactor-suggester",
411
+ risk: "low",
412
+ summary: "Suggests refactoring opportunities using regex-based smell detection",
413
+ defaultState: "inactive",
414
+ canDisable: true
415
+ },
416
+ {
417
+ name: "test-generator",
418
+ risk: "low",
419
+ summary: "Generates framework-correct test skeletons with optional host-routed LLM test authoring",
420
+ defaultState: "inactive",
421
+ canDisable: true
422
+ },
423
+ {
424
+ name: "release-notes-generator",
425
+ risk: "low",
426
+ summary: "Generates traceable release notes from conventional commits with optional LLM polishing",
427
+ defaultState: "inactive",
428
+ canDisable: true
429
+ },
430
+ {
431
+ name: "smart-rename",
432
+ risk: "medium",
433
+ summary: "Whole-word identifier rename inside a single source file",
434
+ defaultState: "inactive",
435
+ canDisable: true
436
+ },
437
+ {
438
+ name: "feature-flag-tracker",
439
+ risk: "low",
440
+ summary: "Scans source files for feature-flag-like expressions and reports usages",
441
+ defaultState: "inactive",
442
+ canDisable: true
443
+ },
444
+ {
445
+ name: "interface-contract-guard",
446
+ risk: "medium",
447
+ summary: "Checks TypeScript interfaces for visible implementers and warns about contract drift",
448
+ defaultState: "inactive",
449
+ canDisable: true
450
+ }
451
+ ];
452
+ export {
453
+ OFFICIAL_PLUGIN_AUDIT_ENTRIES
454
+ };
@@ -14,7 +14,7 @@
14
14
  * the session default. Best-effort: any LLM failure (or a bad response)
15
15
  * falls back to the template for that entity — a doc comment always lands.
16
16
  */
17
- import type { Plugin } from '@wrongstack/core';
17
+ import type { Plugin } from '@wrongstack/core/types';
18
18
  declare const plugin: Plugin;
19
19
  export default plugin;
20
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auto-doc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,kBAAkB,CAAC;AA4W1D,QAAA,MAAM,MAAM,EAAE,MAqIb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auto-doc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,wBAAwB,CAAC;AA4WhE,QAAA,MAAM,MAAM,EAAE,MAqIb,CAAC;eAEa,MAAM"}
@@ -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 declare function errorText(err: unknown): string;
40
40
  export declare function isRetryable(text: string, patterns: RegExp[]): boolean;
41
41
  declare const plugin: Plugin;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auto-escalate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,kBAAkB,CAAC;AAgF1D,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQ9C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAErE;AAMD,QAAA,MAAM,MAAM,EAAE,MAkJb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auto-escalate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,wBAAwB,CAAC;AAgFhE,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQ9C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAErE;AAMD,QAAA,MAAM,MAAM,EAAE,MAkJb,CAAC;eAEa,MAAM"}
@@ -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/auto-i18n-extractor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAwK/C,QAAA,MAAM,MAAM,EAAE,MAsQb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auto-i18n-extractor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAwKrD,QAAA,MAAM,MAAM,EAAE,MAsQb,CAAC;eAEa,MAAM"}
@@ -15,7 +15,8 @@ function withinProjectPath(projectRoot, candidate) {
15
15
  return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
16
16
  }
17
17
  function withinProject(p) {
18
- return withinProjectPath(process.cwd(), p) || relative(process.cwd(), p) === ".";
18
+ const cwd = process.cwd();
19
+ return withinProjectPath(cwd, p) || relative(cwd, p) === ".";
19
20
  }
20
21
 
21
22
  // src/auto-i18n-extractor/index.ts
@@ -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/branch-guard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAuM/C,QAAA,MAAM,MAAM,EAAE,MAoPb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/branch-guard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAqNrD,QAAA,MAAM,MAAM,EAAE,MAuPb,CAAC;eAEa,MAAM"}
@@ -51,6 +51,7 @@ function hasDisabledPluginEntry(raw) {
51
51
  return name === "branch-guard" || name === "@wrongstack/plugins/branch-guard";
52
52
  });
53
53
  }
54
+ var branchCache = /* @__PURE__ */ new Map();
54
55
  function runGit(args, cwd, signal) {
55
56
  return new Promise((resolve, reject) => {
56
57
  execFile(
@@ -65,11 +66,17 @@ function runGit(args, cwd, signal) {
65
66
  });
66
67
  }
67
68
  async function getCurrentBranch(cwd, signal) {
69
+ const cacheKey = `${cwd ?? "undefined"}`;
70
+ const cached = branchCache.get(cacheKey);
71
+ if (cached !== void 0) return cached;
68
72
  try {
69
73
  const branch = (await runGit(["branch", "--show-current"], cwd, signal)).trim();
70
- return branch || null;
74
+ const result = branch || null;
75
+ branchCache.set(cacheKey, result);
76
+ return result;
71
77
  } catch (err) {
72
78
  if (signal.aborted) throw err;
79
+ branchCache.set(cacheKey, null);
73
80
  return null;
74
81
  }
75
82
  }
@@ -157,6 +164,7 @@ var plugin = {
157
164
  state.hookUnregister = null;
158
165
  state.configUnregister = null;
159
166
  state.lastBlock = null;
167
+ branchCache.clear();
160
168
  let cfg = readHostConfig(api.config);
161
169
  state.configUnregister = api.onConfigChange((next) => {
162
170
  cfg = readHostConfig(next);
package/dist/catalog.d.ts CHANGED
@@ -1,39 +1,14 @@
1
1
  /**
2
- * Plugin catalog single source of truth for plugin names and their
3
- * canonical source paths. Used by `spec-linker` to detect unlinked
4
- * plugin references in markdown files.
5
- *
6
- * The catalog is built at module load time by importing each plugin
7
- * source and reading its `name` field. This means the catalog is
8
- * always in sync with the actual plugins — adding a new plugin
9
- * (exporting it from `./index.ts` AND adding a row to the table
10
- * below) is enough for `spec-linker` to start detecting references
11
- * to it.
12
- *
13
- * To add a new plugin: see the table in `catalog.ts`. The `name`
14
- * must match the plugin's `name` field; the `path` is the
15
- * relative source directory under `packages/plugins/src/`.
16
- *
17
- * @public
2
+ * Catalog projections used by spec-linker and public discovery APIs.
3
+ * Plugin identity and source paths are owned by the typed manifest.
18
4
  */
19
- import type { Plugin } from '@wrongstack/core';
20
- interface CatalogEntry {
21
- /** The plugin's `name` field. */
5
+ import type { Plugin } from '@wrongstack/core/types';
6
+ export interface CatalogEntry {
22
7
  name: string;
23
- /** Relative path under `packages/plugins/src/`, e.g. `./src/auto-doc`. */
24
8
  path: string;
25
9
  }
26
- /**
27
- * Read-only view of the catalog as a Map from plugin name to its
28
- * source path. Frozen so consumers cannot mutate it.
29
- */
30
- export declare const PLUGIN_CATALOG: ReadonlyMap<string, string>;
31
- /**
32
- * The list of catalog entries, ordered by the table above. Used by
33
- * `spec-linker` to iterate names in a stable order for detection.
34
- */
35
10
  export declare const PLUGIN_CATALOG_ENTRIES: readonly CatalogEntry[];
36
- /** Convenience accessor: just the names, in declaration order. */
11
+ export declare const PLUGIN_CATALOG: ReadonlyMap<string, string>;
37
12
  export declare const PLUGIN_NAMES: readonly string[];
38
13
  export type { Plugin };
39
14
  //# sourceMappingURL=catalog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAwE/C,UAAU,YAAY;IACpB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;CACd;AAgGD;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAInD,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,YAAY,EAEzD,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAA8C,CAAC;AAIzF,YAAY,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGrD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,sBAAsB,EAAE,SAAS,YAAY,EAIzD,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAEtD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAEzC,CAAC;AAEF,YAAY,EAAE,MAAM,EAAE,CAAC"}
@@ -43,7 +43,7 @@
43
43
  *
44
44
  * @public
45
45
  */
46
- import type { Plugin } from '@wrongstack/core';
46
+ import type { Plugin } from '@wrongstack/core/types';
47
47
  type Section = 'Added' | 'Changed' | 'Fixed' | 'Removed' | 'Security' | 'Documentation' | 'Maintenance';
48
48
  export interface ChangelogEntry {
49
49
  section: Section;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/changelog-writer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM/C,KAAK,OAAO,GACR,OAAO,GACP,SAAS,GACT,OAAO,GACP,SAAS,GACT,UAAU,GACV,eAAe,GACf,aAAa,CAAC;AAElB,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAmGD,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAQjF;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOvE;AAeD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAiBvE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBjF;AAMD,QAAA,MAAM,MAAM,EAAE,MAqRb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/changelog-writer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAMrD,KAAK,OAAO,GACR,OAAO,GACP,SAAS,GACT,OAAO,GACP,SAAS,GACT,UAAU,GACV,eAAe,GACf,aAAa,CAAC;AAElB,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAmGD,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAQjF;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOvE;AAeD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAiBvE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBjF;AAMD,QAAA,MAAM,MAAM,EAAE,MAqRb,CAAC;eAEa,MAAM"}
@@ -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 Snapshot {
40
40
  id: string;
41
41
  createdAt: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checkpoint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM/C,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,iDAAiD;QACjD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AA+HD,QAAA,MAAM,MAAM,EAAE,MAwUb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checkpoint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAMrD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,iDAAiD;QACjD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAkID,QAAA,MAAM,MAAM,EAAE,MAwUb,CAAC;eAEa,MAAM"}