pi-dev-team 0.2.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 (780) hide show
  1. package/LICENSE +21 -0
  2. package/PORTING.md +134 -0
  3. package/README.md +207 -0
  4. package/UPSTREAM.json +64 -0
  5. package/agents/Explore.md +15 -0
  6. package/agents/a11y-review.md +118 -0
  7. package/agents/adr-author.md +70 -0
  8. package/agents/ai-provenance-review.md +120 -0
  9. package/agents/angular-reactivity-review.md +95 -0
  10. package/agents/arch-review.md +135 -0
  11. package/agents/architect.md +78 -0
  12. package/agents/autoship-batch-proposer.md +69 -0
  13. package/agents/claude-setup-review.md +136 -0
  14. package/agents/codebase-recon.md +184 -0
  15. package/agents/component-architecture-review.md +119 -0
  16. package/agents/concurrency-review.md +109 -0
  17. package/agents/correctness-review.md +290 -0
  18. package/agents/data-flow-tracer.md +120 -0
  19. package/agents/doc-review.md +165 -0
  20. package/agents/domain-review.md +136 -0
  21. package/agents/general-purpose.md +10 -0
  22. package/agents/gherkin-quality-critic.md +113 -0
  23. package/agents/js-fp-review.md +114 -0
  24. package/agents/mutation-kill.md +684 -0
  25. package/agents/naming-review.md +142 -0
  26. package/agents/orchestrator.md +339 -0
  27. package/agents/performance-review.md +105 -0
  28. package/agents/plan-review-acceptance.md +115 -0
  29. package/agents/plan-review-design.md +90 -0
  30. package/agents/plan-review-parallelization.md +84 -0
  31. package/agents/plan-review-strategic.md +96 -0
  32. package/agents/plan-review-ux.md +110 -0
  33. package/agents/platform-engineer.md +64 -0
  34. package/agents/product-manager.md +68 -0
  35. package/agents/progress-guardian.md +79 -0
  36. package/agents/qa-engineer.md +289 -0
  37. package/agents/quality-reviewer.md +132 -0
  38. package/agents/react-reactivity-review.md +102 -0
  39. package/agents/refactor-opportunity-review.md +128 -0
  40. package/agents/security-engineer.md +60 -0
  41. package/agents/security-review.md +218 -0
  42. package/agents/session-analysis.md +95 -0
  43. package/agents/software-engineer.md +105 -0
  44. package/agents/spec-compliance-review.md +100 -0
  45. package/agents/spec-reviewer.md +114 -0
  46. package/agents/structure-review.md +146 -0
  47. package/agents/tech-writer.md +84 -0
  48. package/agents/test-review.md +246 -0
  49. package/agents/test-smell-review.md +188 -0
  50. package/agents/token-efficiency-review.md +139 -0
  51. package/agents/ui-ux-designer.md +54 -0
  52. package/agents/vue-reactivity-review.md +95 -0
  53. package/bin/__pycache__/claudecpython-314.pyc +0 -0
  54. package/bin/claude +258 -0
  55. package/docs/upstream/.pages +1 -0
  56. package/docs/upstream/CHANGELOG.md +2586 -0
  57. package/docs/upstream/README.md +155 -0
  58. package/docs/upstream/agent-architecture.md +214 -0
  59. package/docs/upstream/agent_info.md +187 -0
  60. package/docs/upstream/artifact-migration.md +124 -0
  61. package/docs/upstream/code-intelligence-nudge.md +149 -0
  62. package/docs/upstream/code-review-process.md +294 -0
  63. package/docs/upstream/concurrent-use.md +73 -0
  64. package/docs/upstream/context-management.md +111 -0
  65. package/docs/upstream/developer-notes.md +280 -0
  66. package/docs/upstream/diagrams/architecture-overview.svg +101 -0
  67. package/docs/upstream/diagrams/review-dispatch.svg +139 -0
  68. package/docs/upstream/diagrams/team-agents.svg +128 -0
  69. package/docs/upstream/diagrams/test-improve-flow.svg +166 -0
  70. package/docs/upstream/diagrams/workflow-linear.svg +66 -0
  71. package/docs/upstream/diagrams/workflow-three-phase.svg +200 -0
  72. package/docs/upstream/eval-maintenance.md +95 -0
  73. package/docs/upstream/eval-running-guide.md +147 -0
  74. package/docs/upstream/eval-system.md +291 -0
  75. package/docs/upstream/session-review-oss-complements.md +75 -0
  76. package/docs/upstream/session-review.md +212 -0
  77. package/docs/upstream/skills.md +188 -0
  78. package/docs/upstream/team-structure.md +21 -0
  79. package/docs/upstream/telemetry-ci-access.md +129 -0
  80. package/docs/upstream/telemetry-repo-security.md +120 -0
  81. package/docs/upstream/test-evaluation.md +277 -0
  82. package/docs/upstream/test-improve.md +154 -0
  83. package/docs/upstream/triage-workflow.md +282 -0
  84. package/docs/upstream/workflows.md +289 -0
  85. package/extensions/dev-team/index.ts +539 -0
  86. package/extensions/dev-team/lib/agents.ts +272 -0
  87. package/extensions/dev-team/lib/ai-credits.ts +92 -0
  88. package/extensions/dev-team/lib/autocompact.ts +81 -0
  89. package/extensions/dev-team/lib/child-run.ts +102 -0
  90. package/extensions/dev-team/lib/config.ts +236 -0
  91. package/extensions/dev-team/lib/gh-command.ts +103 -0
  92. package/extensions/dev-team/lib/github-style.ts +307 -0
  93. package/extensions/dev-team/lib/hooks.ts +350 -0
  94. package/extensions/dev-team/lib/metrics.ts +115 -0
  95. package/extensions/dev-team/lib/safe-read.ts +49 -0
  96. package/extensions/dev-team/lib/session-files.ts +57 -0
  97. package/extensions/dev-team/lib/session-spend.ts +123 -0
  98. package/extensions/dev-team/lib/shell-scan.ts +205 -0
  99. package/extensions/dev-team/lib/skills.ts +213 -0
  100. package/extensions/dev-team/lib/subagent-render.ts +245 -0
  101. package/extensions/dev-team/lib/subagent-types.ts +164 -0
  102. package/extensions/dev-team/lib/subagent.ts +596 -0
  103. package/extensions/dev-team/lib/terminal-text.ts +54 -0
  104. package/extensions/dev-team/lib/tools-misc.ts +152 -0
  105. package/extensions/dev-team/lib/transcript.ts +110 -0
  106. package/extensions/dev-team/lib/trust.ts +52 -0
  107. package/extensions/dev-team/lib/usage-breakdown.ts +176 -0
  108. package/extensions/dev-team/lib/usage-chart.ts +153 -0
  109. package/extensions/dev-team/lib/usage-command.ts +107 -0
  110. package/extensions/dev-team/lib/usage-history.ts +203 -0
  111. package/extensions/dev-team/lib/usage-render.ts +225 -0
  112. package/extensions/dev-team/lib/usage-split-bar.ts +127 -0
  113. package/extensions/dev-team/lib/usage-state.ts +116 -0
  114. package/extensions/dev-team/lib/usage-text.ts +159 -0
  115. package/extensions/dev-team/lib/usage-view.ts +109 -0
  116. package/hooks/__pycache__/refactor_test_freeze_guard.cpython-314.pyc +0 -0
  117. package/hooks/agent_dispatch_ledger.py +190 -0
  118. package/hooks/autocompact_setup_nudge.py +99 -0
  119. package/hooks/bash_retry_guard.py +228 -0
  120. package/hooks/boundary_events_write_guard.py +352 -0
  121. package/hooks/code_intelligence_nudge.py +293 -0
  122. package/hooks/code_intelligence_turn_mark.py +317 -0
  123. package/hooks/codegraph_bootstrap.py +139 -0
  124. package/hooks/contract_version_guard.py +362 -0
  125. package/hooks/cost_meter.py +106 -0
  126. package/hooks/destructive-commands.json +62 -0
  127. package/hooks/destructive_guard.py +477 -0
  128. package/hooks/eval_compliance_check.py +440 -0
  129. package/hooks/guards.json +17 -0
  130. package/hooks/hooks.json +323 -0
  131. package/hooks/internal_double_gate.py +296 -0
  132. package/hooks/js_fp_review.py +212 -0
  133. package/hooks/knowledge_index.py +119 -0
  134. package/hooks/lib/__pycache__/artifact_paths.cpython-314.pyc +0 -0
  135. package/hooks/lib/__pycache__/atomic_state.cpython-314.pyc +0 -0
  136. package/hooks/lib/__pycache__/autocompact_config.cpython-314.pyc +0 -0
  137. package/hooks/lib/__pycache__/boundary_events.cpython-314.pyc +0 -0
  138. package/hooks/lib/__pycache__/doc_classification.cpython-314.pyc +0 -0
  139. package/hooks/lib/__pycache__/gh_pr_create_detect.cpython-314.pyc +0 -0
  140. package/hooks/lib/__pycache__/git_safe_diff.cpython-314.pyc +0 -0
  141. package/hooks/lib/__pycache__/instrument_log.cpython-314.pyc +0 -0
  142. package/hooks/lib/__pycache__/metrics_query.cpython-314.pyc +0 -0
  143. package/hooks/lib/__pycache__/plugin_version.cpython-314.pyc +0 -0
  144. package/hooks/lib/__pycache__/pre_commit_doc_classifier.cpython-314.pyc +0 -0
  145. package/hooks/lib/__pycache__/review_agent_registry.cpython-314.pyc +0 -0
  146. package/hooks/lib/__pycache__/review_gate_corroboration.cpython-314.pyc +0 -0
  147. package/hooks/lib/__pycache__/review_gate_hash.cpython-314.pyc +0 -0
  148. package/hooks/lib/__pycache__/review_verdicts.cpython-314.pyc +0 -0
  149. package/hooks/lib/__pycache__/stdin_json.cpython-314.pyc +0 -0
  150. package/hooks/lib/__pycache__/stryker_invocation.cpython-314.pyc +0 -0
  151. package/hooks/lib/__pycache__/telemetry_consent.cpython-314.pyc +0 -0
  152. package/hooks/lib/__pycache__/test_file_classify.cpython-314.pyc +0 -0
  153. package/hooks/lib/__pycache__/token_efficiency_limits.cpython-314.pyc +0 -0
  154. package/hooks/lib/__pycache__/verify_guard_state.cpython-314.pyc +0 -0
  155. package/hooks/lib/__pycache__/xunit_v3_operator_gate.cpython-314.pyc +0 -0
  156. package/hooks/lib/agent_skill_hints.py +74 -0
  157. package/hooks/lib/artifact_paths.py +263 -0
  158. package/hooks/lib/atomic_state.py +557 -0
  159. package/hooks/lib/autocompact_config.py +103 -0
  160. package/hooks/lib/autoship_log.py +106 -0
  161. package/hooks/lib/banned_scripts_policy.py +51 -0
  162. package/hooks/lib/boundary_events.py +436 -0
  163. package/hooks/lib/build_knowledge_index.py +504 -0
  164. package/hooks/lib/build_skills_index.py +361 -0
  165. package/hooks/lib/build_state.py +116 -0
  166. package/hooks/lib/classify_ship_outcome.py +126 -0
  167. package/hooks/lib/config_changelog_schema.py +115 -0
  168. package/hooks/lib/cost_meter.py +955 -0
  169. package/hooks/lib/doc_classification.py +116 -0
  170. package/hooks/lib/gh_pr_create_detect.py +136 -0
  171. package/hooks/lib/git_safe_diff.py +123 -0
  172. package/hooks/lib/instrument_log.py +66 -0
  173. package/hooks/lib/iteration_journal_gate.py +197 -0
  174. package/hooks/lib/knowledge_index_paths.py +88 -0
  175. package/hooks/lib/mcp_json_repowise.py +177 -0
  176. package/hooks/lib/metrics_query.py +202 -0
  177. package/hooks/lib/minimal_yaml.py +434 -0
  178. package/hooks/lib/plugin_version.py +142 -0
  179. package/hooks/lib/pre_commit_detect.py +537 -0
  180. package/hooks/lib/pre_commit_doc_classifier.py +126 -0
  181. package/hooks/lib/pricing.py +118 -0
  182. package/hooks/lib/report_pdf.py +371 -0
  183. package/hooks/lib/review_agent_registry.py +142 -0
  184. package/hooks/lib/review_dispatch_ledger.py +101 -0
  185. package/hooks/lib/review_gate_corroboration.py +521 -0
  186. package/hooks/lib/review_gate_hash.py +252 -0
  187. package/hooks/lib/review_gate_normalized_hash.py +1115 -0
  188. package/hooks/lib/review_verdicts.py +301 -0
  189. package/hooks/lib/run_report.py +160 -0
  190. package/hooks/lib/skill_categories.yaml +125 -0
  191. package/hooks/lib/stdin_json.py +57 -0
  192. package/hooks/lib/stryker_invocation.py +102 -0
  193. package/hooks/lib/telemetry_consent.py +41 -0
  194. package/hooks/lib/telemetry_report.py +108 -0
  195. package/hooks/lib/test_file_classify.py +160 -0
  196. package/hooks/lib/token_efficiency_limits.py +51 -0
  197. package/hooks/lib/turn_identity.py +77 -0
  198. package/hooks/lib/verify_guard_state.py +110 -0
  199. package/hooks/lib/workflow_state.py +206 -0
  200. package/hooks/lib/xunit_v3_operator_gate.py +596 -0
  201. package/hooks/mcp_json_repowise_nudge.py +74 -0
  202. package/hooks/mutation_adapters/__init__.py +7 -0
  203. package/hooks/mutation_adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  204. package/hooks/mutation_adapters/__pycache__/lib.cpython-314.pyc +0 -0
  205. package/hooks/mutation_adapters/__pycache__/mutmut.cpython-314.pyc +0 -0
  206. package/hooks/mutation_adapters/__pycache__/pitest.cpython-314.pyc +0 -0
  207. package/hooks/mutation_adapters/__pycache__/stryker.cpython-314.pyc +0 -0
  208. package/hooks/mutation_adapters/__pycache__/stryker_net.cpython-314.pyc +0 -0
  209. package/hooks/mutation_adapters/lib.py +478 -0
  210. package/hooks/mutation_adapters/mutmut.py +188 -0
  211. package/hooks/mutation_adapters/pitest.py +266 -0
  212. package/hooks/mutation_adapters/stryker.py +157 -0
  213. package/hooks/mutation_adapters/stryker_net.py +264 -0
  214. package/hooks/mutation_gate.py +193 -0
  215. package/hooks/mutation_testing_smoke_gate.py +371 -0
  216. package/hooks/pending_review_notify.py +121 -0
  217. package/hooks/phase_marker.py +138 -0
  218. package/hooks/post_compact_state_reinject.py +180 -0
  219. package/hooks/post_format.py +115 -0
  220. package/hooks/pre_commit_knowledge_index.py +128 -0
  221. package/hooks/pre_commit_review.py +66 -0
  222. package/hooks/pre_pr_review.py +694 -0
  223. package/hooks/pre_tool_guard.py +405 -0
  224. package/hooks/py.sh +73 -0
  225. package/hooks/refactor-bash-write-patterns.json +29 -0
  226. package/hooks/refactor_test_bash_guard.py +253 -0
  227. package/hooks/refactor_test_freeze_guard.py +139 -0
  228. package/hooks/refactor_test_revert_guard.py +186 -0
  229. package/hooks/repo_review_nudge.py +287 -0
  230. package/hooks/review_verdict_recorder.py +464 -0
  231. package/hooks/scan_bash_command_for_banned_scripts.py +428 -0
  232. package/hooks/scan_worktree_for_banned_scripts.py +238 -0
  233. package/hooks/session_learning_trigger.py +248 -0
  234. package/hooks/skills_index.py +126 -0
  235. package/hooks/stryker_xunit_shim_guard.py +571 -0
  236. package/hooks/subagent_completion_guard.py +309 -0
  237. package/hooks/subagent_skill_context.py +139 -0
  238. package/hooks/task_completion_metrics.py +216 -0
  239. package/hooks/tdd_guard.py +229 -0
  240. package/hooks/telemetry.py +341 -0
  241. package/hooks/token_efficiency_review.py +194 -0
  242. package/hooks/verify_guard.py +183 -0
  243. package/hooks/verify_guard_edit_marker.py +73 -0
  244. package/hooks/version_check.py +173 -0
  245. package/knowledge/accepted-risks-schema.md +98 -0
  246. package/knowledge/adr-decision-criteria.md +64 -0
  247. package/knowledge/adversarial-review-protocol.md +139 -0
  248. package/knowledge/agent-registry.md +228 -0
  249. package/knowledge/agent-review-methodology.md +80 -0
  250. package/knowledge/ai-friendly-repo-guidelines.md +67 -0
  251. package/knowledge/architecture-assessment.md +96 -0
  252. package/knowledge/artifact-lifecycle.md +57 -0
  253. package/knowledge/cd-maturity-model.md +82 -0
  254. package/knowledge/cd-test-architecture.md +190 -0
  255. package/knowledge/ci-cd-file-scope.md +24 -0
  256. package/knowledge/codegraph-vs-graphify.md +192 -0
  257. package/knowledge/component-test-patterns.md +139 -0
  258. package/knowledge/database-change-management.md +80 -0
  259. package/knowledge/database-test-patterns.md +79 -0
  260. package/knowledge/decision-defaults.md +88 -0
  261. package/knowledge/dependency-breaking-techniques.md +116 -0
  262. package/knowledge/deployment-pipeline.md +86 -0
  263. package/knowledge/design-smells.md +122 -0
  264. package/knowledge/directory-enumeration.md +38 -0
  265. package/knowledge/domain-modeling.md +123 -0
  266. package/knowledge/evidence-bundle.md +90 -0
  267. package/knowledge/exploratory-testing-field-guide.md +122 -0
  268. package/knowledge/failure-routing.md +28 -0
  269. package/knowledge/fixture-construction.md +56 -0
  270. package/knowledge/frontend-component-architecture.md +139 -0
  271. package/knowledge/gherkin-quality-review-dispatch.md +135 -0
  272. package/knowledge/index.json +6766 -0
  273. package/knowledge/internal-collaborator-doubling.md +101 -0
  274. package/knowledge/legacy-test-strategy.md +71 -0
  275. package/knowledge/long-run-waiting.md +66 -0
  276. package/knowledge/microservice-testing.md +71 -0
  277. package/knowledge/model-pricing.json +23 -0
  278. package/knowledge/mutation-score-formulas.md +60 -0
  279. package/knowledge/object-calisthenics.md +147 -0
  280. package/knowledge/oracle-provenance.md +94 -0
  281. package/knowledge/orchestrator-script-implementation.md +185 -0
  282. package/knowledge/owasp-detection.md +148 -0
  283. package/knowledge/plan-review-rubric.md +56 -0
  284. package/knowledge/proxy-connectivity.md +62 -0
  285. package/knowledge/reactive-effect-patterns.md +73 -0
  286. package/knowledge/recon-inventory-excludes.txt +32 -0
  287. package/knowledge/references/bdd-value-guide.md +61 -0
  288. package/knowledge/references/csharp-http-client-testing.md +264 -0
  289. package/knowledge/release-strategies.md +74 -0
  290. package/knowledge/report-output-location.md +117 -0
  291. package/knowledge/report-pdf-integration.md +63 -0
  292. package/knowledge/report-print.css +129 -0
  293. package/knowledge/report-template.md +114 -0
  294. package/knowledge/report-to-pdf.md +69 -0
  295. package/knowledge/request-processing-flow.md +63 -0
  296. package/knowledge/result-verification.md +52 -0
  297. package/knowledge/review-agent-output-contract.md +121 -0
  298. package/knowledge/review-lens-classification.md +113 -0
  299. package/knowledge/review-rubric.md +62 -0
  300. package/knowledge/review-template.md +104 -0
  301. package/knowledge/rule-fixtures/A02.insecure-random-js/negative.js +1 -0
  302. package/knowledge/rule-fixtures/A02.insecure-random-js/positive.js +1 -0
  303. package/knowledge/rule-fixtures/A02.weak-hashing-md5/negative.py +1 -0
  304. package/knowledge/rule-fixtures/A02.weak-hashing-md5/positive.py +1 -0
  305. package/knowledge/rule-fixtures/A03.command-injection/negative.js +1 -0
  306. package/knowledge/rule-fixtures/A03.command-injection/positive.js +1 -0
  307. package/knowledge/rule-fixtures/A03.sql-injection/negative.js +1 -0
  308. package/knowledge/rule-fixtures/A03.sql-injection/positive.js +1 -0
  309. package/knowledge/rule-fixtures/A03.xss-innerhtml/negative.js +1 -0
  310. package/knowledge/rule-fixtures/A03.xss-innerhtml/positive.js +1 -0
  311. package/knowledge/rule-fixtures/A05.cors-wildcard/negative.js +1 -0
  312. package/knowledge/rule-fixtures/A05.cors-wildcard/positive.js +1 -0
  313. package/knowledge/rule-fixtures/A05.default-credentials/negative.js +1 -0
  314. package/knowledge/rule-fixtures/A05.default-credentials/positive.js +1 -0
  315. package/knowledge/rule-fixtures/A07.jwt-alg-none/negative.js +1 -0
  316. package/knowledge/rule-fixtures/A07.jwt-alg-none/positive.js +1 -0
  317. package/knowledge/rule-fixtures/A08.binary-formatter/negative.cs +1 -0
  318. package/knowledge/rule-fixtures/A08.binary-formatter/positive.cs +1 -0
  319. package/knowledge/rule-fixtures/A08.js-eval/negative.js +1 -0
  320. package/knowledge/rule-fixtures/A08.js-eval/positive.js +1 -0
  321. package/knowledge/rule-fixtures/A08.object-input-stream/negative.java +1 -0
  322. package/knowledge/rule-fixtures/A08.object-input-stream/positive.java +1 -0
  323. package/knowledge/schemas/disposition-register-v1.json +65 -0
  324. package/knowledge/schemas/recon-envelope-v1.json +198 -0
  325. package/knowledge/schemas/unified-finding-v1.json +72 -0
  326. package/knowledge/security-primitives-contract.md +301 -0
  327. package/knowledge/security-review-rule-map.yaml +107 -0
  328. package/knowledge/skills-registry.md +72 -0
  329. package/knowledge/task-size-classifier.md +103 -0
  330. package/knowledge/telemetry-schema.md +881 -0
  331. package/knowledge/test-automation-maturity.md +56 -0
  332. package/knowledge/test-automation-principles.md +71 -0
  333. package/knowledge/test-cadence-tradeoffs.md +68 -0
  334. package/knowledge/test-doubles.md +105 -0
  335. package/knowledge/test-file-indicators.md +22 -0
  336. package/knowledge/test-layer-gates.md +35 -0
  337. package/knowledge/test-matrix-examples/django-batch.md +24 -0
  338. package/knowledge/test-matrix-examples/dotnet-grpc-fronting-api.md +90 -0
  339. package/knowledge/test-matrix-examples/dotnet-http-consumer.md +131 -0
  340. package/knowledge/test-matrix-examples/react-node-spa.md +24 -0
  341. package/knowledge/test-matrix-examples/spring-boot-service.md +25 -0
  342. package/knowledge/test-matrix-examples/ssr-htmx.md +24 -0
  343. package/knowledge/test-organization.md +70 -0
  344. package/knowledge/test-pyramid.md +84 -0
  345. package/knowledge/test-refactoring.md +67 -0
  346. package/knowledge/test-review-division-of-labor.md +85 -0
  347. package/knowledge/test-smells.md +80 -0
  348. package/knowledge/test-stack-profiles/bdd-frameworks.md +235 -0
  349. package/knowledge/test-stack-profiles/django.md +13 -0
  350. package/knowledge/test-stack-profiles/dotnet.md +18 -0
  351. package/knowledge/test-stack-profiles/go.md +16 -0
  352. package/knowledge/test-stack-profiles/node.md +16 -0
  353. package/knowledge/test-stack-profiles/react.md +12 -0
  354. package/knowledge/test-stack-profiles/spring-boot.md +16 -0
  355. package/knowledge/test-stack-profiles/ssr-htmx.md +14 -0
  356. package/knowledge/test-stack-profiles/vue.md +12 -0
  357. package/knowledge/test-strategy.md +70 -0
  358. package/knowledge/testability-patterns.md +240 -0
  359. package/knowledge/testing-quadrants.md +44 -0
  360. package/knowledge/testing-techniques/approval.md +15 -0
  361. package/knowledge/testing-techniques/chaos.md +17 -0
  362. package/knowledge/testing-techniques/fuzz.md +15 -0
  363. package/knowledge/testing-techniques/property-based.md +15 -0
  364. package/knowledge/testing-techniques/schema-validation.md +15 -0
  365. package/knowledge/testing-techniques/screenshot.md +15 -0
  366. package/knowledge/three-phase-workflow.md +198 -0
  367. package/knowledge/value-patterns.md +55 -0
  368. package/knowledge/verification-mode.md +116 -0
  369. package/knowledge/virtual-service-libraries.md +75 -0
  370. package/knowledge/wave-consolidation-guidance.md +21 -0
  371. package/overrides/agents/Explore.md +15 -0
  372. package/overrides/agents/general-purpose.md +10 -0
  373. package/overrides/notes/autoship.md +6 -0
  374. package/overrides/notes/issues-from-assessment.md +3 -0
  375. package/overrides/notes/issues-from-plan.md +3 -0
  376. package/overrides/notes/mutation-night-watch.md +3 -0
  377. package/overrides/notes/mutation-testing.md +3 -0
  378. package/overrides/notes/pr.md +7 -0
  379. package/overrides/notes/project-init.md +6 -0
  380. package/overrides/notes/setup.md +13 -0
  381. package/overrides/notes/specs.md +3 -0
  382. package/overrides/skills/headless-run/SKILL.md +45 -0
  383. package/overrides/skills/upgrade/SKILL.md +30 -0
  384. package/overrides/skills/version/SKILL.md +25 -0
  385. package/package.json +36 -0
  386. package/scripts/authoring_digest.py +93 -0
  387. package/scripts/autoship_discover.py +121 -0
  388. package/scripts/autoship_group.py +409 -0
  389. package/scripts/autoship_proposals.py +494 -0
  390. package/scripts/autoship_queue.py +291 -0
  391. package/scripts/autoship_reclaim.py +495 -0
  392. package/scripts/build_jobs.py +108 -0
  393. package/scripts/build_rollback_point.py +240 -0
  394. package/scripts/build_slice_scope.py +157 -0
  395. package/scripts/build_wave.py +109 -0
  396. package/scripts/build_wave_reconcile.py +252 -0
  397. package/scripts/build_worktree_baseref.py +113 -0
  398. package/scripts/check_agent_scope.py +117 -0
  399. package/scripts/check_agent_tool_mapping.py +213 -0
  400. package/scripts/check_review_agent_mcp_tools.py +317 -0
  401. package/scripts/check_security_assessment_mcp_tools.py +165 -0
  402. package/scripts/checkpoint_abort.py +502 -0
  403. package/scripts/claude_setup_review.py +438 -0
  404. package/scripts/codebase_recon.py +556 -0
  405. package/scripts/coverage_config.py +623 -0
  406. package/scripts/coverage_delta_steering.py +330 -0
  407. package/scripts/coverage_discovery_dotnet.py +315 -0
  408. package/scripts/coverage_discovery_java.py +742 -0
  409. package/scripts/coverage_discovery_js.py +546 -0
  410. package/scripts/coverage_gap_ranking.py +556 -0
  411. package/scripts/coverage_readiness.py +455 -0
  412. package/scripts/coverage_report_parse.py +521 -0
  413. package/scripts/detect_bdd_convention.py +252 -0
  414. package/scripts/eval_ablation.py +376 -0
  415. package/scripts/gherkin_analysis_coverage_gate.py +306 -0
  416. package/scripts/gherkin_cross_feature_duplicate_titles_gate.py +173 -0
  417. package/scripts/gherkin_effectiveness_rollup.py +238 -0
  418. package/scripts/gherkin_failure_path_gate.py +206 -0
  419. package/scripts/gherkin_feature_merge.py +720 -0
  420. package/scripts/gherkin_stub_gate.py +163 -0
  421. package/scripts/gherkin_stub_merge.py +479 -0
  422. package/scripts/git_origin_host.py +88 -0
  423. package/scripts/install-java-static-analysis.py +110 -0
  424. package/scripts/issue_deps.py +74 -0
  425. package/scripts/lib/_bdd_markers.py +28 -0
  426. package/scripts/lib/_gherkin_text.py +93 -0
  427. package/scripts/lib/_vendored_tree.py +70 -0
  428. package/scripts/lib/autoship_state.py +397 -0
  429. package/scripts/lib/claude_md_guard.py +226 -0
  430. package/scripts/lib/deterministic_recon.py +446 -0
  431. package/scripts/lib/mcp_tool_grants.py +211 -0
  432. package/scripts/lib/plan_parse.py +386 -0
  433. package/scripts/lib/review_result.py +84 -0
  434. package/scripts/lib/review_roster.py +86 -0
  435. package/scripts/lib/session_log/__init__.py +34 -0
  436. package/scripts/lib/session_log/__pycache__/__init__.cpython-314.pyc +0 -0
  437. package/scripts/lib/session_log/__pycache__/records.cpython-314.pyc +0 -0
  438. package/scripts/lib/session_log/classify.py +231 -0
  439. package/scripts/lib/session_log/corrections.py +194 -0
  440. package/scripts/lib/session_log/discovery.py +108 -0
  441. package/scripts/lib/session_log/records.py +218 -0
  442. package/scripts/lib/session_log/redact.py +76 -0
  443. package/scripts/lib/session_log/signals.py +373 -0
  444. package/scripts/lib/session_report_downstream.py +614 -0
  445. package/scripts/lib/session_report_maintainer.py +1273 -0
  446. package/scripts/lib/session_report_shared.py +262 -0
  447. package/scripts/lib/settings_hook_guard.py +157 -0
  448. package/scripts/lib/slug.py +33 -0
  449. package/scripts/lib/stub_extractors/__init__.py +82 -0
  450. package/scripts/lib/stub_extractors/_common.py +328 -0
  451. package/scripts/lib/stub_extractors/csharp.py +19 -0
  452. package/scripts/lib/stub_extractors/go.py +173 -0
  453. package/scripts/lib/stub_extractors/java.py +18 -0
  454. package/scripts/lib/stub_extractors/jsts.py +126 -0
  455. package/scripts/mutation_stack_sections.py +149 -0
  456. package/scripts/mutation_yield_steering.py +345 -0
  457. package/scripts/orchestrator.py +895 -0
  458. package/scripts/plan_gherkin_export.py +227 -0
  459. package/scripts/plan_waves.py +208 -0
  460. package/scripts/pr_close_keyword_lint.py +108 -0
  461. package/scripts/progress_guardian.py +888 -0
  462. package/scripts/recon_inventory.py +273 -0
  463. package/scripts/review_findings_log.py +93 -0
  464. package/scripts/run_invariants.py +124 -0
  465. package/scripts/select_lenses.py +640 -0
  466. package/scripts/session_report.py +486 -0
  467. package/scripts/set_autocompact_env.py +221 -0
  468. package/scripts/ship_resume_guard.py +135 -0
  469. package/scripts/ship_review_gate.py +63 -0
  470. package/scripts/specs_convention_marker.py +103 -0
  471. package/scripts/test_improve_resume.py +277 -0
  472. package/scripts/test_review_mechanics.py +958 -0
  473. package/scripts/token_efficiency_review.py +322 -0
  474. package/scripts/verdict_scope.py +285 -0
  475. package/scripts/verify_gherkin_quality_critic_isolation.py +296 -0
  476. package/scripts/verify_tier.py +157 -0
  477. package/skills/adr-tools/SKILL.md +118 -0
  478. package/skills/agent-readiness/SKILL.md +105 -0
  479. package/skills/agent-readiness/ai_friendly_analyzers.py +326 -0
  480. package/skills/agent-readiness/scanner.py +441 -0
  481. package/skills/agent-readiness/scorecard.yaml +88 -0
  482. package/skills/api-design/SKILL.md +115 -0
  483. package/skills/apply-fixes/SKILL.md +171 -0
  484. package/skills/apply-test-doubles/SKILL.md +321 -0
  485. package/skills/artifact-lifecycle/SKILL.md +127 -0
  486. package/skills/autoship/SKILL.md +1124 -0
  487. package/skills/benchmark/SKILL.md +105 -0
  488. package/skills/branch-workflow/SKILL.md +89 -0
  489. package/skills/browse/SKILL.md +184 -0
  490. package/skills/browser-testing/SKILL.md +62 -0
  491. package/skills/browser-testing/references/playwright-patterns.md +216 -0
  492. package/skills/build/SKILL.md +422 -0
  493. package/skills/build/references/static-self-heal.md +245 -0
  494. package/skills/careful/SKILL.md +72 -0
  495. package/skills/cd-test-architecture/SKILL.md +371 -0
  496. package/skills/ci-debugging/SKILL.md +105 -0
  497. package/skills/co-evolution-audit/SKILL.md +269 -0
  498. package/skills/code-review/SKILL.md +1015 -0
  499. package/skills/code-review/examples/aggregated-sample.json +56 -0
  500. package/skills/code-review/examples/sample-report.md +41 -0
  501. package/skills/code-review/output-format.md +478 -0
  502. package/skills/code-review/scripts/activation.py +86 -0
  503. package/skills/code-review/scripts/change_impact.py +357 -0
  504. package/skills/code-review/scripts/change_shape.py +372 -0
  505. package/skills/code-review/scripts/change_size.py +212 -0
  506. package/skills/code-review/scripts/changed_file_list.py +141 -0
  507. package/skills/code-review/scripts/closing_pass.py +187 -0
  508. package/skills/code-review/scripts/consolidate.py +277 -0
  509. package/skills/code-review/scripts/contract_failure_report.py +185 -0
  510. package/skills/code-review/scripts/dispatch_reconcile.py +66 -0
  511. package/skills/code-review/scripts/dispatch_waves.py +164 -0
  512. package/skills/code-review/scripts/finding_signature.py +446 -0
  513. package/skills/code-review/scripts/ledger.py +283 -0
  514. package/skills/code-review/scripts/partition.py +169 -0
  515. package/skills/code-review/scripts/render_tiered_findings.py +274 -0
  516. package/skills/code-review/scripts/repo_invariants.py +1066 -0
  517. package/skills/code-review/scripts/review_context_pack.py +306 -0
  518. package/skills/code-review/scripts/review_round_log.py +345 -0
  519. package/skills/code-review/scripts/review_value_coverage.py +297 -0
  520. package/skills/code-review/scripts/validate_review_output.py +467 -0
  521. package/skills/code-review/sliced-mode.md +205 -0
  522. package/skills/competitive-analysis/SKILL.md +191 -0
  523. package/skills/context-loading-protocol/SKILL.md +157 -0
  524. package/skills/continue/SKILL.md +90 -0
  525. package/skills/cost-report/SKILL.md +178 -0
  526. package/skills/coverage-baseline/SKILL.md +335 -0
  527. package/skills/coverage-baseline/references/multi-project-discovery.md +202 -0
  528. package/skills/coverage-delta/SKILL.md +181 -0
  529. package/skills/coverage-delta/references/mutation-gate.md +70 -0
  530. package/skills/design-doc/SKILL.md +95 -0
  531. package/skills/design-interrogation/SKILL.md +89 -0
  532. package/skills/design-it-twice/SKILL.md +91 -0
  533. package/skills/docker-image-audit/SKILL.md +108 -0
  534. package/skills/docker-image-audit/references/install-guide.md +64 -0
  535. package/skills/docker-image-audit/references/report-template.md +73 -0
  536. package/skills/docker-image-create/SKILL.md +185 -0
  537. package/skills/domain-analysis/SKILL.md +183 -0
  538. package/skills/domain-driven-design/SKILL.md +194 -0
  539. package/skills/exploratory-testing/SKILL.md +108 -0
  540. package/skills/explore/SKILL.md +51 -0
  541. package/skills/farley-score/SKILL.md +165 -0
  542. package/skills/feature-file-validation/SKILL.md +78 -0
  543. package/skills/feature-file-validation/references/validation-rules.md +115 -0
  544. package/skills/feedback-learning/SKILL.md +414 -0
  545. package/skills/fix/SKILL.md +450 -0
  546. package/skills/freeze/SKILL.md +68 -0
  547. package/skills/frontend-architecture/SKILL.md +113 -0
  548. package/skills/gherkin-derive/SKILL.md +630 -0
  549. package/skills/gherkin-public/SKILL.md +266 -0
  550. package/skills/governance-compliance/SKILL.md +150 -0
  551. package/skills/guard/SKILL.md +75 -0
  552. package/skills/handoff/SKILL.md +139 -0
  553. package/skills/handoff/references/summary-templates.md +242 -0
  554. package/skills/harness-audit/SKILL.md +751 -0
  555. package/skills/harness-audit/scripts/lesson_validate.py +386 -0
  556. package/skills/harness-audit/scripts/redundancy_criterion.py +188 -0
  557. package/skills/headless-run/SKILL.md +45 -0
  558. package/skills/headless-run/scripts/isolated_dispatch.py +381 -0
  559. package/skills/help/SKILL.md +72 -0
  560. package/skills/hexagonal-architecture/SKILL.md +85 -0
  561. package/skills/human-oversight-protocol/SKILL.md +224 -0
  562. package/skills/issues-from-assessment/SKILL.md +223 -0
  563. package/skills/issues-from-plan/SKILL.md +133 -0
  564. package/skills/legacy-code/SKILL.md +132 -0
  565. package/skills/mermaid-diagramming/SKILL.md +120 -0
  566. package/skills/mutation-night-watch/SKILL.md +154 -0
  567. package/skills/mutation-night-watch/references/scheduling.md +135 -0
  568. package/skills/mutation-testing/SKILL.md +396 -0
  569. package/skills/mutation-testing/references/languages/csharp-stryker-net.md +676 -0
  570. package/skills/mutation-testing/references/languages/go-go-mutesting.md +95 -0
  571. package/skills/mutation-testing/references/languages/java-pitest.md +77 -0
  572. package/skills/mutation-testing/references/languages/javascript-stryker.md +188 -0
  573. package/skills/mutation-testing/references/languages/python-mutmut.md +97 -0
  574. package/skills/mutation-testing/references/time-estimation.md +34 -0
  575. package/skills/mutation-testing/references/tool-detection.md +15 -0
  576. package/skills/mutation-testing/references/workflow-callers.md +23 -0
  577. package/skills/mutation-testing/scripts/__pycache__/xunit_v3_feature_detector.cpython-314.pyc +0 -0
  578. package/skills/mutation-testing/scripts/csharp_stryker_net_slice_runner.py +635 -0
  579. package/skills/mutation-testing/scripts/csharp_stryker_net_status_loop.py +525 -0
  580. package/skills/mutation-testing/scripts/csharp_stryker_net_wrapper.py +681 -0
  581. package/skills/mutation-testing/scripts/mutation_baseline_reuse.py +292 -0
  582. package/skills/mutation-testing/scripts/mutation_exclude_policy.py +268 -0
  583. package/skills/mutation-testing/scripts/mutation_feasibility_gate.py +463 -0
  584. package/skills/mutation-testing/scripts/mutation_kill_headless.py +331 -0
  585. package/skills/mutation-testing/scripts/mutation_kill_insert.py +199 -0
  586. package/skills/mutation-testing/scripts/mutation_kill_insert_python.py +150 -0
  587. package/skills/mutation-testing/scripts/mutation_kill_loop.py +869 -0
  588. package/skills/mutation-testing/scripts/mutation_kill_loop_python.py +949 -0
  589. package/skills/mutation-testing/scripts/mutation_kill_retry.py +592 -0
  590. package/skills/mutation-testing/scripts/mutation_kill_shared.py +620 -0
  591. package/skills/mutation-testing/scripts/mutation_nightwatch.py +462 -0
  592. package/skills/mutation-testing/scripts/mutation_nightwatch_stacks.py +425 -0
  593. package/skills/mutation-testing/scripts/mutation_report.py +743 -0
  594. package/skills/mutation-testing/scripts/mutation_report_cli.py +175 -0
  595. package/skills/mutation-testing/scripts/mutation_safety_gate.py +69 -0
  596. package/skills/mutation-testing/scripts/stryker_shard_pipeline.py +847 -0
  597. package/skills/mutation-testing/scripts/stryker_shard_setup.py +440 -0
  598. package/skills/mutation-testing/scripts/stryker_timeout_retry.py +142 -0
  599. package/skills/mutation-testing/scripts/xunit_v3_feature_detector.py +341 -0
  600. package/skills/performance-benchmark/SKILL.md +174 -0
  601. package/skills/performance-benchmark/examples/report-format.md +43 -0
  602. package/skills/performance-benchmark/references/benchmark-script.md +169 -0
  603. package/skills/performance-metrics/SKILL.md +265 -0
  604. package/skills/plan/SKILL.md +199 -0
  605. package/skills/plan/references/gherkin-persistence.md +43 -0
  606. package/skills/plan/references/plan-template.md +182 -0
  607. package/skills/pr/SKILL.md +289 -0
  608. package/skills/pr/scripts/gate_retry_state.py +368 -0
  609. package/skills/project-init/README.md +141 -0
  610. package/skills/project-init/SKILL.md +1197 -0
  611. package/skills/project-init/evals/evals.json +200 -0
  612. package/skills/project-init/references/capability-tools.md +55 -0
  613. package/skills/project-init/references/configs.md +221 -0
  614. package/skills/property-based-testing/SKILL.md +121 -0
  615. package/skills/property-based-testing/fixtures/invariant_fixture.py +15 -0
  616. package/skills/property-based-testing/fixtures/js-roundtrip/README.md +42 -0
  617. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/LICENSE +21 -0
  618. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/README.md +263 -0
  619. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/fast-check.d.ts +5165 -0
  620. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/fast-check.js +12147 -0
  621. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/package.json +3 -0
  622. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/types57/fast-check.d.ts +5165 -0
  623. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/fast-check.d.ts +5165 -0
  624. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/fast-check.js +12011 -0
  625. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/rolldown-runtime-D7D4PA-g.js +13 -0
  626. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/types57/fast-check.d.ts +5165 -0
  627. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/package.json +94 -0
  628. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/LICENSE +21 -0
  629. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/README.md +168 -0
  630. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/RandomGenerator-DcXj09Ch.d.ts +14 -0
  631. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformBigInt.d.ts +15 -0
  632. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformBigInt.js +38 -0
  633. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat32.d.ts +15 -0
  634. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat32.js +18 -0
  635. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat64.d.ts +15 -0
  636. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat64.js +22 -0
  637. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformInt.d.ts +15 -0
  638. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformInt.js +134 -0
  639. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/RandomGenerator-DcXj09Ch.d.ts +14 -0
  640. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformBigInt.d.ts +15 -0
  641. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformBigInt.js +37 -0
  642. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat32.d.ts +15 -0
  643. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat32.js +17 -0
  644. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat64.d.ts +15 -0
  645. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat64.js +21 -0
  646. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformInt.d.ts +15 -0
  647. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformInt.js +133 -0
  648. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/congruential32.d.ts +7 -0
  649. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/congruential32.js +44 -0
  650. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/mersenne.d.ts +7 -0
  651. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/mersenne.js +90 -0
  652. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xoroshiro128plus.d.ts +7 -0
  653. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xoroshiro128plus.js +80 -0
  654. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xorshift128plus.d.ts +7 -0
  655. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xorshift128plus.js +78 -0
  656. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/package.json +3 -0
  657. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/JumpableRandomGenerator.d.ts +16 -0
  658. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/JumpableRandomGenerator.js +0 -0
  659. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/RandomGenerator.d.ts +2 -0
  660. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/RandomGenerator.js +0 -0
  661. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/generateN.d.ts +6 -0
  662. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/generateN.js +8 -0
  663. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/purify.d.ts +12 -0
  664. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/purify.js +9 -0
  665. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/skipN.d.ts +6 -0
  666. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/skipN.js +6 -0
  667. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/congruential32.d.ts +7 -0
  668. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/congruential32.js +46 -0
  669. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/mersenne.d.ts +7 -0
  670. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/mersenne.js +92 -0
  671. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xoroshiro128plus.d.ts +7 -0
  672. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xoroshiro128plus.js +82 -0
  673. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xorshift128plus.d.ts +7 -0
  674. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xorshift128plus.js +80 -0
  675. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/JumpableRandomGenerator.d.ts +16 -0
  676. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/JumpableRandomGenerator.js +0 -0
  677. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/RandomGenerator.d.ts +2 -0
  678. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/RandomGenerator.js +0 -0
  679. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/generateN.d.ts +6 -0
  680. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/generateN.js +9 -0
  681. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/purify.d.ts +12 -0
  682. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/purify.js +10 -0
  683. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/skipN.d.ts +6 -0
  684. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/skipN.js +7 -0
  685. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/package.json +133 -0
  686. package/skills/property-based-testing/fixtures/js-roundtrip/package-lock.json +1179 -0
  687. package/skills/property-based-testing/fixtures/js-roundtrip/package.json +14 -0
  688. package/skills/property-based-testing/fixtures/js-roundtrip/roundtrip.js +29 -0
  689. package/skills/property-based-testing/fixtures/js-roundtrip/roundtrip.properties.test.js +16 -0
  690. package/skills/property-based-testing/fixtures/no_property_fixture.py +10 -0
  691. package/skills/property-based-testing/fixtures/roundtrip_fixture.py +16 -0
  692. package/skills/property-based-testing/references/languages/javascript.md +54 -0
  693. package/skills/property-based-testing/scripts/detect_and_dispatch.py +80 -0
  694. package/skills/property-based-testing/scripts/hypothesis_scaffold.py +276 -0
  695. package/skills/proxy-resilience/SKILL.md +84 -0
  696. package/skills/quality-gate-pipeline/SKILL.md +184 -0
  697. package/skills/quality-targets-converge/SKILL.md +254 -0
  698. package/skills/repo-review/SKILL.md +159 -0
  699. package/skills/report-pdf/SKILL.md +66 -0
  700. package/skills/review/SKILL.md +47 -0
  701. package/skills/review-agent/SKILL.md +152 -0
  702. package/skills/review-summary/SKILL.md +73 -0
  703. package/skills/run-report/SKILL.md +70 -0
  704. package/skills/semantic-duplication-scan/SKILL.md +337 -0
  705. package/skills/semantic-scan/SKILL.md +53 -0
  706. package/skills/semgrep-analyze/SKILL.md +139 -0
  707. package/skills/setup/SKILL.md +1122 -0
  708. package/skills/ship/SKILL.md +240 -0
  709. package/skills/source-verification/SKILL.md +210 -0
  710. package/skills/source-verification/scripts/claim_extractor.py +155 -0
  711. package/skills/specs/.size-baseline.json +4 -0
  712. package/skills/specs/SKILL.md +243 -0
  713. package/skills/specs/references/completeness-checklist.md +83 -0
  714. package/skills/specs/references/extraction.md +58 -0
  715. package/skills/specs/references/glossary.md +59 -0
  716. package/skills/specs/references/persistence.md +115 -0
  717. package/skills/specs/references/predictability-check.md +77 -0
  718. package/skills/static-analysis-integration/SKILL.md +235 -0
  719. package/skills/static-analysis-integration/adapters/_envelope.py +26 -0
  720. package/skills/static-analysis-integration/adapters/jscpd-adapter.py +66 -0
  721. package/skills/static-analysis-integration/adapters/lizard-adapter.py +81 -0
  722. package/skills/static-analysis-integration/adapters/mypy-adapter.py +50 -0
  723. package/skills/static-analysis-integration/adapters/mypy-src-layout.py +93 -0
  724. package/skills/static-analysis-integration/adapters/security-review-adapter.py +212 -0
  725. package/skills/static-analysis-integration/maintenance.md +23 -0
  726. package/skills/static-analysis-integration/references/language-setup.md +228 -0
  727. package/skills/static-analysis-integration/references/sarif-parser.md +124 -0
  728. package/skills/static-analysis-integration/references/security-review-adapter.md +118 -0
  729. package/skills/static-analysis-integration/references/tool-configs.md +617 -0
  730. package/skills/static-analysis-integration/rulesets/pmd-quickstart.xml +24 -0
  731. package/skills/stryker-xunit-v2-shim/SKILL.md +274 -0
  732. package/skills/stryker-xunit-v2-shim/references/shim-howto.md +256 -0
  733. package/skills/stryker-xunit-v2-shim/scripts/generate_shim.py +143 -0
  734. package/skills/systematic-debugging/SKILL.md +130 -0
  735. package/skills/telemetry/SKILL.md +75 -0
  736. package/skills/test-audit-disable/SKILL.md +129 -0
  737. package/skills/test-design/SKILL.md +177 -0
  738. package/skills/test-design/scripts/__pycache__/internal_double_detector.cpython-314.pyc +0 -0
  739. package/skills/test-design/scripts/internal_double_detector.py +631 -0
  740. package/skills/test-design-advisor/SKILL.md +166 -0
  741. package/skills/test-driven-development/SKILL.md +169 -0
  742. package/skills/test-health/SKILL.md +262 -0
  743. package/skills/test-improve/SKILL.md +239 -0
  744. package/skills/test-improve/references/phase-0-approach-contract.md +228 -0
  745. package/skills/test-improve/references/phase-1-analyze.md +131 -0
  746. package/skills/test-improve/references/phase-2-baseline.md +121 -0
  747. package/skills/test-improve/references/phase-3-derive-gherkin.md +53 -0
  748. package/skills/test-improve/references/phase-4-plan-fixes.md +34 -0
  749. package/skills/test-improve/references/phase-5-improve.md +215 -0
  750. package/skills/test-improve/references/phase-6-refactor-decision.md +45 -0
  751. package/skills/test-improve/references/phase-7-refactor.md +44 -0
  752. package/skills/test-improve/references/phase-8-validate.md +66 -0
  753. package/skills/test-improve/references/phase-9-close-out-prompt.md +11 -0
  754. package/skills/test-improve/references/phase-9-report.md +62 -0
  755. package/skills/test-improve/references/review-loop.md +92 -0
  756. package/skills/test-improve/templates/executive-summary.md +123 -0
  757. package/skills/threat-modeling/SKILL.md +108 -0
  758. package/skills/triage/SKILL.md +211 -0
  759. package/skills/ubiquitous-language/SKILL.md +192 -0
  760. package/skills/ubiquitous-language/scripts/collect_domain_signals.py +300 -0
  761. package/skills/unfreeze/SKILL.md +37 -0
  762. package/skills/upgrade/SKILL.md +31 -0
  763. package/skills/upgrade/scripts/check_version_drift.py +113 -0
  764. package/skills/upgrade/scripts/enable_autoupdate.py +149 -0
  765. package/skills/version/SKILL.md +25 -0
  766. package/sync/__pycache__/sync_upstream.cpython-314.pyc +0 -0
  767. package/sync/sync_upstream.py +293 -0
  768. package/templates/ACCEPTED-RISKS.md.tmpl +46 -0
  769. package/templates/agents/agent-template.md +151 -0
  770. package/templates/agents/angular-testing.md +66 -0
  771. package/templates/agents/csharp-quality.md +63 -0
  772. package/templates/agents/esm-enforcer.md +52 -0
  773. package/templates/agents/front-end-testing.md +65 -0
  774. package/templates/agents/go-quality.md +65 -0
  775. package/templates/agents/python-quality.md +62 -0
  776. package/templates/agents/react-testing.md +61 -0
  777. package/templates/agents/ts-enforcer.md +60 -0
  778. package/templates/agents/twelve-factor-audit.md +49 -0
  779. package/tools/entropy-check.py +250 -0
  780. package/tools/model-hash-verify.py +213 -0
@@ -0,0 +1,617 @@
1
+ # Tool Configurations (SARIF-first)
2
+
3
+ Per-tool invocation commands, install hints, and adapter-specific notes. Organized by tier per the skill's `## Tool tiers` section.
4
+
5
+ ## Tier 1 — required baseline (SARIF native)
6
+
7
+ ### semgrep
8
+
9
+ ```bash
10
+ semgrep scan \
11
+ --sarif \
12
+ --config auto \
13
+ --quiet \
14
+ <target-paths>
15
+ ```
16
+
17
+ - **Install**: `pip install semgrep`
18
+ - **Install hint**: `semgrep — SAST. install: pip install semgrep`
19
+ - **Detection**: `command -v semgrep`
20
+ - **Capability tier**: SAST
21
+ - **Adapter**: none; consumed raw by the shared SARIF parser.
22
+
23
+ ### gitleaks
24
+
25
+ ```bash
26
+ gitleaks detect \
27
+ --report-format sarif \
28
+ --report-path - \
29
+ --no-verify \
30
+ --source <path>
31
+ ```
32
+
33
+ - **Install**: `brew install gitleaks` (macOS) / `docker run --rm -v "$PWD:/path" zricethezav/gitleaks:latest detect ...`
34
+ - **Install hint**: `gitleaks — secrets detection. install: brew install gitleaks`
35
+ - **Detection**: `command -v gitleaks`
36
+ - **Capability tier**: secrets
37
+ - **Offline posture**: `--no-verify` disables gitleaks' active-credential verification, which would otherwise make outbound API calls (e.g. to AWS/GitHub) to confirm a detected secret is live. Detection is purely pattern-based and runs with zero network egress. Always on — this flag carries no detection cost.
38
+ - **Adapter**: none.
39
+
40
+ ### trivy
41
+
42
+ ```bash
43
+ # IaC scanning
44
+ trivy config \
45
+ --format sarif \
46
+ --output /dev/stdout \
47
+ --skip-update \
48
+ --offline-scan \
49
+ <path>
50
+
51
+ # Filesystem / supply-chain scanning
52
+ trivy fs \
53
+ --format sarif \
54
+ --output /dev/stdout \
55
+ --scanners vuln,config,secret \
56
+ --skip-update \
57
+ --offline-scan \
58
+ <path>
59
+ ```
60
+
61
+ - **Install**: `brew install trivy`
62
+ - **Install hint**: `trivy — IaC + supply-chain scanning. install: brew install trivy`
63
+ - **Detection**: `command -v trivy`
64
+ - **Capability tier**: IaC + supply-chain
65
+ - **Offline posture**: both `trivy config` and `trivy fs` run with `--skip-update --offline-scan`. `--skip-update` pins trivy to the local vulnerability DB (no DB refresh over the network); `--offline-scan` suppresses the remote metadata lookups trivy otherwise performs for some package ecosystems. Run the **offline DB preflight** below before dispatch.
66
+ - **Offline DB preflight**: locate the local DB at trivy's cache path (`${TRIVY_CACHE_DIR:-$HOME/.cache/trivy}/db/trivy.db`) and check its `mtime`:
67
+ - **absent** → skip trivy, warn `trivy local DB missing — run: trivy image --download-db-only`
68
+ - **mtime age ≤ 7 days** → run normally (fresh)
69
+ - **mtime age > 7 days** → run anyway, warn `trivy DB is N days old — consider refreshing with: trivy image --download-db-only` (substitute `N` with the integer day count)
70
+
71
+ The 7-day boundary is inclusive: exactly 7 days old is still fresh; strictly greater than 7 days is stale. A missing or stale DB is never a hard pipeline failure.
72
+ - **Adapter**: none.
73
+
74
+ ### hadolint
75
+
76
+ ```bash
77
+ hadolint --format sarif <Dockerfile>
78
+ ```
79
+
80
+ - **Install**: `brew install hadolint`
81
+ - **Install hint**: `hadolint — Dockerfile linting. install: brew install hadolint`
82
+ - **Detection**: `command -v hadolint`
83
+ - **Capability tier**: IaC (Dockerfile)
84
+ - **Adapter**: none.
85
+
86
+ ### actionlint
87
+
88
+ actionlint does not emit SARIF directly as of its current stable release.
89
+ Invoke with JSON output and wrap with a thin adapter (≤ 15 LOC) that
90
+ produces SARIF-compliant results.
91
+
92
+ ```bash
93
+ actionlint -format '{{json .}}' <target-path>
94
+ ```
95
+
96
+ The adapter maps each actionlint finding:
97
+
98
+ | actionlint field | SARIF field |
99
+ |---|---|
100
+ | `.Filepath` | `results[*].locations[0].physicalLocation.artifactLocation.uri` |
101
+ | `.Line` | `results[*].locations[0].physicalLocation.region.startLine` |
102
+ | `.Column` | `results[*].locations[0].physicalLocation.region.startColumn` |
103
+ | `.Kind` | `results[*].ruleId` |
104
+ | `.Message` | `results[*].message.text` |
105
+
106
+ Severity: all actionlint findings map to `warning` by default; upgrade to
107
+ `error` if `.Kind` starts with `shellcheck` and message contains "error".
108
+
109
+ - **Install**: `brew install actionlint`
110
+ - **Install hint**: `actionlint — GitHub Actions linting. install: brew install actionlint`
111
+ - **Detection**: `command -v actionlint`
112
+ - **Capability tier**: CI-CD
113
+ - **Adapter**: thin JSON → SARIF wrapper (see `adapters/actionlint-to-sarif.sh` — created in P2 Step 3b alongside the optional adapters).
114
+
115
+ ### Roslyn ErrorLog (C#)
116
+
117
+ C#'s primary static analysis (Roslyn analyzers) is built into the compiler:
118
+ `dotnet build` exports native SARIF when passed the `ErrorLog` property — a
119
+ build-flag change on the build the pipeline already runs, not a separate tool
120
+ invocation.
121
+
122
+ ```bash
123
+ dotnet build /p:ErrorLog=results.sarif,version=2.1
124
+ ```
125
+
126
+ - **Install**: nothing beyond the .NET SDK a C# project already requires
127
+ (SDK ≥ 6 for built-in `dotnet format`; Roslyn 3.8+ / .NET 5 SDK or later for
128
+ the SARIF v2.1 export). Where the SDK version matters it is repo-pinned via
129
+ `global.json` — the .NET-native repo-level pin. No standalone install script.
130
+ - **Install hint**: `dotnet — .NET SDK (C# build, format, ErrorLog SARIF). install: https://dotnet.microsoft.com/download`
131
+ - **Detection**: `command -v dotnet` — **language-conditional**: probe and hint
132
+ only when `.cs` files are in the target set, so a non-C# repo never sees a
133
+ "dotnet missing" warning. A missing SDK degrades to `status: skip` with the
134
+ hint above — never a pipeline failure.
135
+ - **Capability tier**: SAST (C# compiler + analyzer diagnostics)
136
+ - **Adapter**: none; native SARIF v2.1, consumed raw by the shared SARIF parser.
137
+ - **Reuse rule (`/code-review`)**: the full-repo pass invokes
138
+ `dotnet build /p:ErrorLog=...` for any C# project in scope unless a SARIF
139
+ produced from the current HEAD commit already exists (e.g. a CI artifact) —
140
+ **same-commit** is the reuse test.
141
+ - **Incremental-build caveat**: the SARIF is rewritten only when the compiler
142
+ actually runs; an up-to-date incremental build skips compilation and leaves
143
+ the previous file in place (still valid for the code on disk). Pass the flag
144
+ on **every** build invocation. A *missing* SARIF (no compile has happened
145
+ yet) degrades to skip — never a pipeline failure.
146
+ - **Scope (v1): single-project builds.** `ErrorLog` is a per-project compiler
147
+ property: in a multi-project solution each project's compilation writes its
148
+ own log — a relative path resolves per project directory, and an absolute
149
+ path is overwritten by whichever project compiles last. Multi-project
150
+ solutions are a documented gap; the v2 plan of record is a per-project path
151
+ via `Directory.Build.props` with `$(MSBuildProjectName)` in the ErrorLog path
152
+ (e.g. `<ErrorLog>$(MSBuildProjectName).sarif,version=2.1</ErrorLog>` — one
153
+ SARIF per project, no overwrite risk) plus a glob-collect.
154
+ - **Dedup-chain placement**: none needed — the only cross-duplicating source is
155
+ semgrep, which already outranks all language-specific sources; revisit only
156
+ if a second Java/C# source is ever added.
157
+ - **Build-time (`/build`) consumption**: the same SARIF doubles as the C#
158
+ lane's diagnostic (verify) source — see the C# lane row under "Build-time
159
+ lanes" below.
160
+
161
+ ### pmd
162
+
163
+ ```bash
164
+ pmd check -d . -R <resolved-ruleset> -f sarif --no-progress
165
+ ```
166
+
167
+ - **Language-conditional**: dispatch pmd, and surface its missing-tool
168
+ install hint, only when `.java` files are in the target set — a non-Java
169
+ repo never sees a "pmd missing" warning (graceful-degradation constraint).
170
+ - **Install**: repo-level, `python3 ${CLAUDE_PLUGIN_ROOT}/scripts/install-java-static-analysis.py`
171
+ — installs the pinned PMD distribution into the target repo's gitignored
172
+ `.pmd/` directory (`PMD_INSTALL_DIR` overrides). Never user-level/global.
173
+ - **Install hint**: `pmd — Java code quality. install: python3 ${CLAUDE_PLUGIN_ROOT}/scripts/install-java-static-analysis.py` (surfaced only for Java target sets)
174
+ - **Detection**: repo-local first — the `.pmd/pmd-bin-*/bin/pmd` launcher
175
+ (`pmd.bat` on Windows) — then `command -v pmd`; verify with `pmd --version`.
176
+ - **Capability tier**: Java code quality
177
+ - **Exit codes**: `pmd check` exits 0 on clean and **4 when violations are
178
+ found** — 4 is findings, not a tool failure; treat only other non-zero
179
+ codes as tool errors.
180
+ - **Adapter**: none; SARIF renderer is native (PMD 6.36+; we pin 7.x) —
181
+ consumed raw by the shared SARIF parser.
182
+ - **Dedup**: no dedup-chain slot needed — the only cross-duplicating source
183
+ is semgrep, which already outranks all language-specific sources; revisit
184
+ only if a second Java/C# source is added.
185
+
186
+ #### Ruleset resolution (shared by both pmd invocations)
187
+
188
+ The `/code-review` invocation above and the build-time Java lane below
189
+ resolve `<resolved-ruleset>` identically, so the two layers never disagree
190
+ about what a violation is:
191
+
192
+ 1. **Repo-root `pmd-ruleset.xml`**, when present — the project override,
193
+ matching the repo-root convention (`ruff.toml`, `.editorconfig`) the
194
+ other lanes honor. A custom `pmd-ruleset.xml` carries its own
195
+ `<exclude-pattern>` entries.
196
+ 2. Otherwise the **plugin's quickstart-wrapping default**:
197
+ `${CLAUDE_PLUGIN_ROOT}/skills/static-analysis-integration/rulesets/pmd-quickstart.xml`,
198
+ which references PMD's documented quickstart set
199
+ (`rulesets/java/quickstart.xml`) and ships `<exclude-pattern>` entries
200
+ for generated-output directories — `target/`, `build/`, `out/`,
201
+ `.gradle/` — so the full-repo walk produces no duplicate/noise findings
202
+ on copied sources.
203
+
204
+ Test sources run the same ruleset as production code (recorded decision;
205
+ revisit with a documented exclusion list only if real-world noise shows up
206
+ on JUnit-style test classes).
207
+
208
+ ### ruff
209
+
210
+ ```bash
211
+ ruff check --output-format sarif .
212
+ ```
213
+
214
+ - **Minimum version**: 0.3.1 — the first release with the SARIF output format.
215
+ - **Install**: `python3 -m pip install ruff` (project venv / dev requirements — repo-level, versioned with the repo; never `pip install --user` or a global pipx install)
216
+ - **Install hint**: `ruff — Python lint + autofix. install: python3 -m pip install ruff (project venv / dev requirements)`
217
+ - **Detection**: `command -v ruff`
218
+ - **Capability tier**: Python lint + autofix
219
+ - **Presence**: language-conditional, never `[REQUIRED]` — dispatch ruff, and surface its missing-tool install hint, only when `.py` files are in the target set. A non-Python repo never sees a "ruff missing" warning, consistent with the skill's "absence is never a pipeline failure" constraint.
220
+ - **Config resolution**: the project's own `ruff.toml`/`pyproject.toml` wins when present (Ruff's default config discovery — no override flags); Ruff's defaults otherwise. The plugin pins no curated rule set — the project owns its **gating** bar. The convention probe below is a separate, non-gating invocation and does not change that.
221
+ - **Adapter**: none; consumed raw by the shared SARIF parser.
222
+
223
+ #### Convention probe (naming + magic values)
224
+
225
+ A **second, separate** ruff invocation whose only job is to give review agents
226
+ deterministic naming and magic-value findings (#1979). Kept apart from the
227
+ lane above on purpose: that one reflects the project's own quality bar, this
228
+ one adds review context and never gates.
229
+
230
+ ```bash
231
+ ruff check --select N,PLR2004 --output-format sarif .
232
+ ```
233
+
234
+ - **Displaces**: the mechanical half of `naming-review` — PEP 8 naming conventions (`N801`/`N802`/`N803`…) and magic values in comparisons (`PLR2004`), which that agent lists among its own checks and would otherwise re-derive by inference on every run. Intent-revealing-name judgment stays with the agent.
235
+ - **`--select`, not `--extend-select`** (verified on ruff 0.16.4): `--select` *replaces* the rule set for this invocation, so the probe emits only `N`/`PLR2004` findings and does not duplicate the main lane's output. `--extend-select` would re-report every rule the project already enables.
236
+ - **Project scoping is preserved.** Verified: the project's `exclude` (vendored directories stay unscanned), its `per-file-ignores`, and inline `# noqa: N802` comments are all still honored under `--select`. Only a blanket `ignore = ["N802"]` in project config is overridden — a deliberate trade, since suppressing a convention in CI is not the same as declining to hear about it in review. A project that disagrees suppresses these through the pre-pass's own mechanism, `ACCEPTED-RISKS.md` (SKILL.md step 5).
237
+ - **Thresholds need no tuning**: `PLR2004`'s defaults already ignore `0`, `1`, and `-1` (verified), so it flags unexplained domain constants — `if amount > 1000` — rather than every literal.
238
+ - **Rule ids**: `ruff.python.n802`, `ruff.python.plr2004`, … (see the `ruff` row of the tier map in `sarif-parser.md`).
239
+ - **Presence**: language-conditional and non-gating, exactly like the main ruff lane. No extra install — same binary.
240
+
241
+ ## Tier 2 — optional SARIF adapters (shipped in P2 Step 3b)
242
+
243
+ Placeholder for the remaining Step 3b tools: checkov, kube-linter, bandit, gosec, bearer, osv-scanner, grype, trufflehog.
244
+
245
+ ### oxlint
246
+
247
+ Primary JS/TS linter (Oxc project, Rust-based, ESLint-compatible) for `/code-review`'s full-repo pre-pass. Pin **oxlint >= 1.0.0**. Oxlint's CLI surface evolves quickly — verify the exact flag names (`--fix`, `--format sarif`) against the project's pinned version; verified against oxlint 1.72.0.
248
+
249
+ ```bash
250
+ npx oxlint --format sarif .
251
+ ```
252
+
253
+ - **Tier substitution**: #808 originally specified a Tier 3 bespoke JSON adapter (`--format json`, ≤ 40 LOC). At implementation time the pinned line had gained a native `sarif` output format (verified on 1.72.0), so per the issue's version-pin instruction oxlint lands as a SARIF-native entry instead — no adapter.
254
+ - **Install**: `npm install --save-dev oxlint` — a project devDependency pins the version in `package.json`/lockfile, versioned with the repo and reproducible for every contributor and CI. Never `npm install -g oxlint`.
255
+ - **Install hint**: `oxlint — JS/TS linting. install: npm install --save-dev oxlint`
256
+ - **Detection**: `npx --no-install oxlint --version` (or `node_modules/.bin/oxlint`) — oxlint is a project-local npm devDependency, not a global binary, so PATH probes (`command -v`) would miss it.
257
+ - **Capability tier**: JS/TS linting
258
+ - **Adapter**: none; consumed raw by the shared SARIF parser (`sarif-parser.md`). `runs[*].tool.driver.name` is `oxlint` — the string `TOOL_TIER_MAP` is keyed by, observed on oxlint 1.80.0 — and its SARIF `ruleId` values are `plugin(rule)`-shaped (`eslint(no-unused-vars)`, `jsx-a11y(alt-text)`, observed on the same version). The parser maps that shape to `oxlint.<plugin>.<rule>` — e.g. `oxlint.eslint.no-unused-vars`, `oxlint.jsx-a11y.alt-text`. A rule id with no parentheses falls back to the tool's tier segment, `oxlint.js.<rule-id>`. (Before #1979 the parser had neither branch: `oxlint` was missing from the tier map and the parentheses were hyphen-flattened, so findings were emitted as `oxlint.generic.jsx-a11y-alt-text`.)
259
+ - **Coexistence with legacy ESLint (Tier 4)**: this entry sits alongside the ESLint entry, not replacing it. When a project runs both, the same finding can arrive twice — the dedup chain (SKILL.md step 4) ranks oxlint ahead of the legacy JS tools. While both run, add [`eslint-plugin-oxlint`](https://github.com/oxc-project/eslint-plugin-oxlint) to the ESLint config to turn off ESLint rules oxlint already covers, so the ESLint pass only pays for the plugin-only remainder.
260
+
261
+ #### Frontend probe (accessibility + performance)
262
+
263
+ A **second, separate** oxlint invocation that turns on the plugins the main
264
+ lane leaves off, giving review agents deterministic accessibility and
265
+ performance findings (#1979). One invocation covers both concerns because
266
+ oxlint ships them natively — no `eslint-plugin-jsx-a11y` install, no config
267
+ file, no network.
268
+
269
+ ```bash
270
+ npx oxlint --jsx-a11y-plugin --react-plugin --react-perf-plugin -D perf --format sarif .
271
+ ```
272
+
273
+ - **Displaces**: the mechanical half of `a11y-review` (missing `alt`, invalid `href`, click handlers with no keyboard equivalent, static elements with handlers and no role) and feeds `performance-review` on the JS/TS side. Verified on oxlint 1.80.0 against a fixture component: 4 `jsx-a11y` findings and 2 `react-perf` findings, including `alt-text` and `jsx-no-new-function-as-prop`.
274
+ - **`-D perf` is the performance half**: it promotes oxlint's `perf` category, whose most valuable member for this panel is `no-await-in-loop` — the classic **N+1 / I/O-in-loop shape** the spike names. `--react-perf-plugin` adds the render-path rules (`jsx-no-new-object-as-prop`, `jsx-no-new-function-as-prop`).
275
+ - **Correctness overlap is expected and harmless**: this invocation also re-emits the default `correctness` category the main lane already reports. Those arrive with identical `rule_id`/`file`/`line` and are removed by the dedup step (SKILL.md step 4), so the net contribution is the a11y and perf findings.
276
+ - **`-D jsx-a11y` does NOT isolate the a11y rules** — `jsx-a11y` is a plugin, not a category, so `-A all -D jsx-a11y` yields zero findings (verified). That is why the two concerns share one invocation rather than running as two narrower ones.
277
+ - **Rule ids**: `oxlint.jsx-a11y.*` and `oxlint.react-perf.*` / `oxlint.eslint.no-await-in-loop`. The plugin segment is what lets a consumer separate the accessibility findings from the performance ones — see the `plugin(rule)` case in `sarif-parser.md`.
278
+ - **Presence**: dispatched only when the target set contains JS/TS/JSX files, and never `[REQUIRED]` — same posture as the main oxlint lane.
279
+
280
+ ##### Naming and magic numbers on the JS/TS side: project-configured, not forced
281
+
282
+ oxlint implements `eslint(no-magic-numbers)`, but it takes **no rule options
283
+ on the command line**, and the rule's unconfigured default flags `0` and `1`.
284
+ Measured over this repo's own 40 TS/JS eval files: 152 findings, **35% of them
285
+ the values `0`, `1`, `-1`, or `2`** — noise that would swamp the injection and
286
+ tell `naming-review` nothing it should act on. Python's `PLR2004` needs no
287
+ such care because its defaults already exclude those values, which is why the
288
+ ruff convention probe above runs unconditionally and this does not.
289
+
290
+ So the JS/TS naming and magic-value rules are an **opt-in the project owns**,
291
+ configured where the options actually live:
292
+
293
+ ```jsonc
294
+ // .oxlintrc.json
295
+ {
296
+ "rules": {
297
+ "no-magic-numbers": ["warn", { "ignore": [0, 1, -1], "ignoreArrayIndexes": true }],
298
+ "@typescript-eslint/naming-convention": "warn"
299
+ }
300
+ }
301
+ ```
302
+
303
+ With that in place the **main** oxlint lane reports them and they reach agents
304
+ through the normal path — no extra invocation, and the project keeps control
305
+ of the thresholds it has to live with.
306
+
307
+ #### When a project may drop ESLint entirely
308
+
309
+ Decidable checklist — a project drops ESLint only when **all three** hold:
310
+
311
+ 1. Every rule enabled in the project's ESLint config is either implemented by the pinned oxlint version (per oxlint's supported-rules list) or explicitly acknowledged in the project as not relied on.
312
+ 2. No framework plugin in the ESLint config (React/Vue/Svelte/etc.) contributes an enabled rule oxlint lacks.
313
+ 3. A one-time dual run over the repo shows ESLint reporting no finding that oxlint misses.
314
+
315
+ Otherwise run both, with `eslint-plugin-oxlint` suppressing the overlap. In the build-time lane's provider terms (§ Build-time lanes → JS/TS lane), this checklist is the decidable test for rebinding the autofix slot from eslint to oxlint.
316
+
317
+ ## Tier 3 — bespoke JSON adapters (shipped in P2 Step 3b)
318
+
319
+ Placeholder — populated by Step 3b. Expected tools: detect-secrets, depcheck, deptry, kube-score, govulncheck. Each adapter is ≤ 40 LOC.
320
+
321
+ ### mypy
322
+
323
+ ```bash
324
+ mypy $(python3 adapters/mypy-src-layout.py .) --output json . 2>&1 | python3 adapters/mypy-adapter.py
325
+ ```
326
+
327
+ - **Minimum version**: 1.11 — the first release with `--output json`. Older mypy rejects the flag; the adapter detects the rejection and degrades to a skip-with-warning (exit 0, zero findings) — never a pipeline failure.
328
+ - **Install**: `python3 -m pip install mypy` (project venv / dev requirements — repo-level, versioned with the repo; never `pip install --user` or a global pipx install)
329
+ - **Install hint**: `mypy — Python type checking. install: python3 -m pip install mypy (project venv / dev requirements)`
330
+ - **Detection**: `command -v mypy`
331
+ - **Capability tier**: Python type checking
332
+ - **Presence**: language-conditional, like ruff — dispatched only when `.py` files are in the target set.
333
+ - **src/-layout auto-detection**: `../adapters/mypy-src-layout.py` (invoked as `python3 adapters/mypy-src-layout.py <project-root>`) detects a plain `src/` layout — a `src/` directory holding `.py` modules with no `__init__.py` anywhere under it, and no project-level mypy package-base config (`mypy.ini`/`.mypy.ini` present, or a `[mypy]` section in `setup.cfg`/`tox.ini`, or a `[tool.mypy]` section in `pyproject.toml`) — and prints `--explicit-package-bases` (mypy >= 0.990) so mypy can resolve the layout without requiring `__init__.py` files or hand-written config. Prints nothing when the layout doesn't apply or the project already owns its mypy config ("bind, don't replace"). Without this, a project on this layout hits a stable, deterministic `mypy` failure — `Source file found twice under different module names: "calc" and "src.calc"` — the moment any checked file imports a `src/` module by its dotted `src.` path; degradation rung 4 then silently drops all mypy coverage for the run.
334
+ - **Adapter**: `../adapters/mypy-adapter.py` (≤ 40 LOC) maps mypy's JSONL diagnostics to the unified finding envelope:
335
+
336
+ | mypy JSON field | Unified finding field | Notes |
337
+ |---|---|---|
338
+ | `file` | `file` | |
339
+ | `line` | `line` | clamped to ≥ 1 |
340
+ | `column` | `column` | omitted when mypy reports no real column (`< 1`) |
341
+ | `code` | `rule_id` | Prefixed `mypy.python.<error-code>`; `mypy.python.note` when absent |
342
+ | `message` | `message` | truncated to 500 chars |
343
+ | `severity` | `severity` | `error`→`error`, `note`→`suggestion`, unknown→`info` |
344
+
345
+ ### lizard
346
+
347
+ ```bash
348
+ lizard --csv <target paths> | python3 adapters/lizard-adapter.py
349
+ ```
350
+
351
+ - **Capability tier**: complexity metrics
352
+ - **Install**: `python3 -m pip install lizard` (project venv / dev requirements)
353
+ - **Install hint**: `lizard — complexity metrics. install: python3 -m pip install lizard (project venv / dev requirements)`
354
+ - **Detection**: `command -v lizard`
355
+ - **Presence**: not language-conditional — lizard covers ~15 languages (C/C++, C#, Java, JS/TS, Python, Go, Ruby, PHP, Swift, Kotlin, Rust, Scala, Lua, Objective-C, TTCN-3), so it is probed on every target set.
356
+ - **Never pass `--warnings_only`**: it overrides `--csv` and emits clang-style text the adapter cannot parse (verified against lizard 1.24.0). Thresholds are applied by the adapter, not by lizard.
357
+ - **Exit codes**: plain `--csv` exits 0 even when functions are over threshold; a non-zero exit means lizard itself failed. (`--warnings_only`, which this lane does not use, exits 1 on any warning.)
358
+ - **Adapter**: `../adapters/lizard-adapter.py` (≤ 40 LOC) emits one finding per **threshold breach** (strictly greater than), so a clean tree produces none:
359
+
360
+ | lizard CSV column (0-indexed) | Threshold | `rule_id` | Notes |
361
+ |---|---|---|---|
362
+ | 1 — CCN | > 10 | `lizard.complexity.cyclomatic` | fires on 10.3% of this repo's functions |
363
+ | 4 — length | > 60 | `lizard.complexity.function-length` | function length in lines; 6.1% |
364
+ | 3 — PARAM | > 5 | `lizard.complexity.parameter-count` | 1.4% |
365
+ | 6 — file | — | `file` | absolute paths are relativized to cwd; run from the repo root |
366
+ | 9 / 10 — start / end | — | `line` / `end_line` | clamped to ≥ 1 |
367
+ | 7 — name | — | `message` prefix | the function name |
368
+
369
+ All findings carry `severity: warning` and `metadata.confidence: high` (a measurement, not a judgment), plus `metadata.metric`/`value`/`threshold` so a consumer can re-derive the comparison. Thresholds live in the adapter's `_CHECKS` table.
370
+
371
+ - **Thresholds are calibrated, not guessed.** Measured over this repo's own `hooks/` + `scripts/` tree (1,247 functions): CCN p50=3 / p90=11, length p50=14 / p95=67, param p50=1 / p99=6. Each threshold sits near that tail, so the lane flags outliers instead of describing the median. Re-measure before moving one.
372
+
373
+ - **Nesting depth is deliberately NOT covered here.** lizard's only nesting-ish metric is `-Ens`'s *nested-structure complexity*, and it is not max nesting depth: verified on lizard 1.24.0, a function with three sequential one-level `if`s scores **5** while a two-level nested one scores **2**. It is cumulative, so it scales with function size — over the same 1,247-function tree its median is **9**, and a threshold of 6 fired on **57%** of all functions. There is no fixed threshold that means "deeply nested", so the lane omits the metric rather than shipping a noisy one under a misleading name. **Max nesting depth is not a metric lizard exposes** — for JS/TS it is covered by ESLint's `max-depth` rule; elsewhere it remains a judgment call for `structure-review` (which absorbed `complexity-review`'s nesting-depth charter, #2093), which is part of why that lens keeps this judgment residue after this lane lands.
374
+
375
+ ### jscpd
376
+
377
+ ```bash
378
+ jscpd --reporters json --output <report-dir> --silent <target paths> \
379
+ && python3 adapters/jscpd-adapter.py < <report-dir>/jscpd-report.json
380
+ ```
381
+
382
+ - **Capability tier**: copy-paste duplication detection
383
+ - **Install**: `npm install -g jscpd`
384
+ - **Install hint**: `jscpd — copy-paste duplication detection. install: npm install -g jscpd`
385
+ - **Detection**: `command -v jscpd`
386
+ - **Presence**: not language-conditional — jscpd tokenizes ~150 formats.
387
+ - **The JSON reporter writes a FILE, never stdout** (`<output>/jscpd-report.json`, verified against jscpd 5.0.16), which is why the lane redirects the file into the adapter rather than piping the command. `--silent` suppresses the console reporter's own summary; it does not redirect the report.
388
+ - **Exit code** is 0 for a normal run regardless of clones found; it is non-zero only when a `--threshold` is configured and exceeded. Do not read a clone count from the exit status.
389
+ - **Adapter**: `../adapters/jscpd-adapter.py` (≤ 40 LOC) emits **one** finding per clone, anchored at `firstFile`, with `secondFile` named in the message — not two findings, so a clone pair is not double-counted:
390
+
391
+ | jscpd report field | Unified finding field | Notes |
392
+ |---|---|---|
393
+ | `duplicates[].firstFile.name` | `file` | relativized to cwd |
394
+ | `duplicates[].firstFile.start` / `.end` | `line` / `end_line` | clamped to ≥ 1 |
395
+ | `duplicates[].secondFile.*` | `message`, `metadata.duplicate_of` | the other location |
396
+ | `duplicates[].lines` / `.tokens` | `message` | clone size |
397
+ | `duplicates[].format` | `metadata.format` | |
398
+ | `duplicates[].fragment` | **dropped** | see below |
399
+
400
+ - **Shared helper**: both this adapter and lizard's normalize paths through `../adapters/_envelope.py`'s `rel()`. Adapters run as standalone scripts, so `sys.path[0]` is the adapters directory and a plain `import _envelope` resolves with no path manipulation. It exists because two byte-identical copies of that function were exactly the finding this duplication lane reports.
401
+ - **`fragment` is deliberately never copied into the finding.** It holds the duplicated source verbatim, and these findings are injected into every review agent's prompt — echoing both copies of every clone into that context is precisely the token cost this lane exists to remove.
402
+ - **Malformed input degrades to a skip**: a report that is not valid JSON produces a `WARN` on stderr, zero findings, and exit 0 — never a pipeline failure, per the skill's graceful-degradation constraint.
403
+
404
+ ## Tier 4 — legacy (pre-SARIF)
405
+
406
+ ### ESLint
407
+
408
+ ```bash
409
+ npx eslint -f json <target-js-ts-files>
410
+ ```
411
+
412
+ | ESLint JSON field | Unified finding field | Notes |
413
+ |---|---|---|
414
+ | `filePath` | `file` | |
415
+ | `messages[].line` | `line` | |
416
+ | `messages[].ruleId` | `rule_id` | Prefixed as `eslint.js.<rule-id>` |
417
+ | `messages[].message` | `message` | |
418
+ | `messages[].severity` (1=warn, 2=error) | `severity` | 1→`warning`, 2→`error` |
419
+
420
+ ### TypeScript compiler
421
+
422
+ ```bash
423
+ npx tsc --noEmit 2>&1
424
+ ```
425
+
426
+ Output is line-based diagnostics; the legacy adapter parses
427
+ `<file>(line,col): error TSNNNN: <message>` entries and maps to
428
+ `rule_id: tsc.ts.ts<NNNN>`.
429
+
430
+ Legacy adapters emit the same unified finding envelope as SARIF tools. Migrate to SARIF-native invocation when upstream support lands.
431
+
432
+ ## Build-time lanes
433
+
434
+ The registry for `/build`'s static self-heal pass: one subsection per
435
+ language lane, filled in by the issue that registers the lane with the lane's
436
+ file extensions, each capability slot's (**autofix** / **diagnostic**)
437
+ ordered provider list — default provider first; it doubles as the last-resort
438
+ provider named by install hints — and each provider's detection probe
439
+ (repo-local locations first, then PATH).
440
+
441
+ Everything else — what a lane is, scoping, the shared fix loop, the
442
+ 2-attempt cap, detection/provider binding, the provider qualification
443
+ contract, the degradation ladder, granularity, and ordering — is specified
444
+ once, in `${CLAUDE_PLUGIN_ROOT}/skills/build/references/static-self-heal.md`.
445
+ Rows registered here must satisfy that contract and must not restate the
446
+ mechanism. User-facing setup for each lane lives in
447
+ [`language-setup.md`](language-setup.md).
448
+
449
+ A language whose subsection still reads "No lane registered" is skipped by
450
+ the self-heal pass with one info line — never a failure.
451
+
452
+ ### Python lane
453
+
454
+ - **Extensions**: `.py`
455
+ - **Autofix slot** — ordered provider list:
456
+ 1. **ruff** (default, last-resort provider) — probe `command -v ruff`. Qualification: qualified.
457
+ - Fix (mechanical pre-fix): `ruff check --fix <scoped-files>`
458
+ - Verify (check mode): `ruff check <scoped-files>`
459
+ - Honors the project's `ruff.toml`/`pyproject.toml` when present; Ruff defaults otherwise — no plugin-curated rule set.
460
+ 2. **black + flake8** — qualifies only as a **combined pair**: black fills the format-autofix half (`black <scoped-files>`), flake8 the lint-diagnostic half (`flake8 <scoped-files>`). Probes `command -v black` **and** `command -v flake8`; both must be present for the pair to bind. Qualification: qualified as a pair, with a recorded caveat — a **partial mapping**, not 1:1 with ruff's rule surface; the binding info line must say so.
461
+ - **Diagnostic slot** — ordered provider list:
462
+ 1. **mypy** (default, last-resort provider) — probe `command -v mypy`. Qualification: qualified; diagnostic-only — no autofix, no mechanical pre-fix; findings go to the coding agent inside the shared fix loop.
463
+ - Verify: `mypy $(python3 adapters/mypy-src-layout.py <project-root>) --follow-imports=silent <scoped-files>`
464
+ - `--follow-imports=silent` keeps a scoped run honest: imported modules are still analyzed for type context, but errors are reported only in the scoped files — without it a scoped pass reports errors in unchanged followed modules, polluting the loop.
465
+ - The `$(...)` prefix is the src/-layout auto-detection documented in the mypy Tier 3 entry above (`../adapters/mypy-src-layout.py`) — prints `--explicit-package-bases` when the project needs it, nothing otherwise. Same detection, same script, for both the build-time lane and the `/code-review` backstop.
466
+ 2. **pyright** — Qualification: **gated** — machine-readable output qualifies it in principle, but recognition requires a ≤ 40 LOC Tier 3 adapter in this skill's `adapters/`, which does not exist yet; until that adapter lands, pyright binds nothing and is reported honestly with the mypy default offered alongside.
467
+ - **`/code-review` counterparts**: ruff is the Tier 1 native-SARIF source and mypy the Tier 3 JSON adapter documented above — same tools, full-repo invocations.
468
+
469
+ ### JS/TS lane
470
+
471
+ Registered by #808.
472
+
473
+ - **Extensions**: `*.js`, `*.jsx`, `*.ts`, `*.tsx`, `*.mjs`, `*.cjs`
474
+ - **Diagnostic slot**: none registered — the lane verifies with the bound autofix provider's own check mode (degradation-ladder rung 2 in `static-self-heal.md`).
475
+ - **Autofix slot** — ordered provider list (default first; it doubles as the last-resort provider named by install hints):
476
+
477
+ 1. **oxlint** — default, last-resort provider. Pin **>= 1.0.0**; verify the exact flag names (`--fix`, `--format sarif`) against the project's pinned version — verified against oxlint 1.72.0.
478
+ - Fix pass (mechanical pre-fix): `npx oxlint --fix <scoped-files>`
479
+ - Verify pass (check mode): `npx oxlint <scoped-files>`
480
+ - Detection probe: `npx --no-install oxlint --version` — resolves the project-local `node_modules/.bin` first; oxlint is a project devDependency, never a global binary
481
+ - Install hint (rung 3): `oxlint — JS/TS linting. install: npm install --save-dev oxlint`
482
+ - Partial autofix: oxlint autofixes a subset of its rules — residue surviving the pre-fix goes to the coding agent on the same attempt, per the shared fix loop.
483
+ 2. **biome** — full-speed provider: fast and machine-readable, meets all four qualification-contract items at per-step granularity.
484
+ - Fix pass: `npx biome check --write <scoped-files>`
485
+ - Verify pass: `npx biome check <scoped-files>`
486
+ - Detection probe: `npx --no-install biome --version`
487
+ 3. **eslint** — bound with demotion: meets contract items (a), (b), and (d) but fails the per-step latency budget (item c). A project that arrives configured for ESLint binds it with the lane demoted to slice-boundary granularity only, and one info line tells the user the fast default (oxlint) exists.
488
+ - Fix pass: `npx eslint --fix <scoped-files>`
489
+ - Verify pass: `npx eslint <scoped-files>`
490
+ - Detection probe: `npx --no-install eslint --version`
491
+
492
+ Rebinding the slot from eslint to oxlint (dropping ESLint) is decided by the checklist under the Tier 2 oxlint entry ("When a project may drop ESLint entirely"); while both tools run, `eslint-plugin-oxlint` suppresses the overlap.
493
+
494
+ ### C# lane
495
+
496
+ - **Extensions**: `.cs`
497
+ - **Autofix slot** (ordered provider list): `dotnet format` — the default and
498
+ only provider; SDK-builtin (.NET SDK ≥ 6), so the last-resort provider the
499
+ install hint names is the SDK itself.
500
+ - **Diagnostic slot**: the Roslyn ErrorLog SARIF exported by the
501
+ GREEN-confirming `dotnet build` (see the Tier 1 "Roslyn ErrorLog (C#)"
502
+ entry above for the flag and caveats) — not a separate scoped invocation.
503
+ Scoping is post-hoc filtering to the changed set and freshness is
504
+ build-then-filter, per the C# accommodation in
505
+ `${CLAUDE_PLUGIN_ROOT}/skills/build/references/static-self-heal.md` — not
506
+ restated here.
507
+ - **Detection probe** (one probe covers both slots): `command -v dotnet`.
508
+
509
+ `dotnet format` operates on an **MSBuild project or solution**, not on bare
510
+ file paths — `--include` is a filter of relative paths *within* that
511
+ project/solution, not the operand. When no project/solution argument is
512
+ given, the tool searches the working directory and errors on zero or multiple
513
+ candidates, so pass the project/solution explicitly whenever auto-discovery
514
+ is ambiguous.
515
+
516
+ **Fix pass** — scoped to the checkpoint's changed `.cs` files (paths relative
517
+ to the project/solution root); the `whitespace` and `style` subcommands run
518
+ at every checkpoint:
519
+
520
+ ```bash
521
+ dotnet format whitespace <project-or-solution> --include <changed .cs files>
522
+ dotnet format style <project-or-solution> --include <changed .cs files>
523
+ ```
524
+
525
+ At the slice-boundary checkpoint, additionally run the `analyzers`
526
+ subcommand, whose Roslyn workspace-load + implicit-restore cost amortizes
527
+ over the slice — no per-step analyzer visibility is lost, because the
528
+ ErrorLog SARIF from the GREEN-confirming build still surfaces analyzer
529
+ diagnostics at every step at zero cost:
530
+
531
+ ```bash
532
+ dotnet format analyzers <project-or-solution> --include <slice's changed .cs files>
533
+ ```
534
+
535
+ **Verify pass** — same subcommand split; `--verify-no-changes` formats
536
+ nothing and exits non-zero (with diagnostics; add `--report <path>` for a
537
+ JSON report) if any changes would have been made:
538
+
539
+ ```bash
540
+ dotnet format whitespace <project-or-solution> --verify-no-changes --include <same files>
541
+ dotnet format style <project-or-solution> --verify-no-changes --include <same files>
542
+ # slice boundary only:
543
+ dotnet format analyzers <project-or-solution> --verify-no-changes --include <same files>
544
+ ```
545
+
546
+ - **Severity threshold**: honor the project's `.editorconfig` at the tool's
547
+ default `--severity warn` — the project's own config is the contract,
548
+ consistent with how the other lanes' tools use project config.
549
+ - **Never invoke with an empty `--include` list** — per the CLI, an empty
550
+ include set means "format all files in the project/solution". The
551
+ mechanism's empty-partition guarantee (a lane with no matching changed
552
+ files is never dispatched) is load-bearing for this lane.
553
+ - **Division of labor**: `dotnet format` applies only the fixes it has
554
+ code-fixes for; diagnostics it can't fix surface via the ErrorLog SARIF
555
+ from the next `dotnet build` and reach the coding agent as the lane's
556
+ diagnostic findings on the same attempt — the two pieces are complementary,
557
+ not redundant.
558
+ - **Recognized equivalent providers**: none — `dotnet format` is SDK-builtin,
559
+ and third-party Roslyn analyzers (StyleCop.Analyzers etc.) automatically
560
+ ride the same ErrorLog SARIF once referenced in the project's `.csproj`.
561
+ C# equivalents join via the `.csproj`, not via lane providers.
562
+
563
+ ### Java lane
564
+
565
+ Registered by #810.
566
+
567
+ - **Extensions**: `*.java`
568
+ - **Autofix slot**: none — Java has no autofix tool fast enough for the
569
+ per-step loop. The lane is **diagnostic-only**: it runs the shared fix
570
+ loop minus the mechanical pre-fix (degradation rung 1 by construction).
571
+ - **Diagnostic slot** — ordered provider list: **PMD** (default,
572
+ last-resort) → **checkstyle**.
573
+
574
+ **PMD (default, last-resort provider)**
575
+
576
+ - **Detection probe**: repo-local `.pmd/pmd-bin-*/bin/pmd` launcher
577
+ (`pmd.bat` on Windows) first, then `command -v pmd`; verify with
578
+ `pmd --version`.
579
+ - **Invocation** (the mechanism resolves the changed-file set; write its
580
+ `.java` subset to a temp file — PMD's `-d` takes directories/paths, not a
581
+ shell-expanded word list, so `--file-list` is the robust scoped shape):
582
+
583
+ ```bash
584
+ pmd check --file-list "$TMP/pmd-files.txt" -R <resolved-ruleset> -f json --no-progress
585
+ ```
586
+
587
+ - **Wrapper contracts**:
588
+ - **Empty file set → skip the invocation entirely.** PMD errors when
589
+ given no input files; an empty changed-`.java` set means "nothing to
590
+ check", not a tool failure. The mechanism's empty-partition guarantee
591
+ (a lane with no matching files is never dispatched) is load-bearing
592
+ for this tool.
593
+ - **Exit code 4 = violations found, not tool breakage.** `pmd check`
594
+ exits 0 on clean, 4 when findings exist; treat only other non-zero
595
+ codes as tool errors (degradation rung 4).
596
+ - **Ruleset**: identical to the `/code-review` invocation — see
597
+ [Ruleset resolution](#ruleset-resolution-shared-by-both-pmd-invocations)
598
+ under the Tier 1 pmd entry.
599
+ - **Install**: repo-level, `python3 ${CLAUDE_PLUGIN_ROOT}/scripts/install-java-static-analysis.py`
600
+ (pinned PMD into the gitignored `.pmd/` dir; `PMD_INSTALL_DIR` overrides).
601
+
602
+ **checkstyle (recognized equivalent provider)**
603
+
604
+ - **Qualification**: Tier 1 via native SARIF output (Checkstyle ≥ 10.3), no
605
+ adapter; recognition still requires this registry row — the lists are
606
+ small and explicit.
607
+ - **Binding**: a project arriving with a repo-root `checkstyle.xml` binds
608
+ checkstyle (bind-don't-replace); PMD is installed only when the slot
609
+ binds no recognized provider.
610
+ - **Detection probe**: `command -v checkstyle`, configured by the repo-root
611
+ `checkstyle.xml`.
612
+ - **Invocation** (scoped): `checkstyle -f sarif -c checkstyle.xml <files>`.
613
+
614
+ **SpotBugs is not a provider candidate** for this slot: it requires
615
+ compiled bytecode, forcing a build step beyond what TDD's GREEN already
616
+ produces — it belongs at the end-of-build `/code-review` pass (opt-in deep
617
+ mode), tracked as a post-landing follow-up.
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ruleset name="dev-team-java-default"
3
+ xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
6
+
7
+ <description>
8
+ Default Java ruleset for the dev-team static-analysis integration: wraps
9
+ PMD's documented quickstart set and excludes generated-output directories
10
+ so the full-repo /code-review walk reports no duplicate or noise findings
11
+ on copied sources. Projects override this file entirely by placing a
12
+ pmd-ruleset.xml at their repo root; custom rulesets carry their own
13
+ exclude-pattern entries. Test sources deliberately run the same rules as
14
+ production code.
15
+ </description>
16
+
17
+ <exclude-pattern>.*/target/.*</exclude-pattern>
18
+ <exclude-pattern>.*/build/.*</exclude-pattern>
19
+ <exclude-pattern>.*/out/.*</exclude-pattern>
20
+ <exclude-pattern>.*/\.gradle/.*</exclude-pattern>
21
+
22
+ <rule ref="rulesets/java/quickstart.xml" />
23
+
24
+ </ruleset>