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,212 @@
1
+ #!/usr/bin/env python3
2
+ """security-review agent output -> unified-finding envelope adapter.
3
+
4
+ Reads the security-review agent's JSON output (see
5
+ plugins/dev-team/agents/security-review.md for the agent-output
6
+ schema) and emits one unified-finding envelope v1 (JSONL) per issue.
7
+
8
+ Rule_id lookup is driven by the canonical mapping at
9
+ plugins/dev-team/knowledge/security-review-rule-map.yaml. This
10
+ adapter contains NO inline rule_id literals beyond the
11
+ ``security-review.`` namespace prefix constant used for the
12
+ fallback path; the single-source-of-truth invariant is enforced by an
13
+ AST-level test in evals/security-review-adapter/tests/.
14
+
15
+ Contract, error semantics, and failure modes are documented in
16
+ plugins/dev-team/skills/static-analysis-integration/references/security-review-adapter.md.
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import argparse
22
+ import json
23
+ import os
24
+ import re
25
+ import sys
26
+ from typing import Any
27
+
28
+ # Resolved at startup; exposed via module-level for test inspection.
29
+ _SCHEMA_PATH = os.path.abspath(
30
+ os.path.join(
31
+ os.path.dirname(os.path.abspath(__file__)),
32
+ "..",
33
+ "..",
34
+ "..",
35
+ "knowledge",
36
+ "schemas",
37
+ "unified-finding-v1.json",
38
+ )
39
+ )
40
+
41
+ # Namespace prefix used when a well-formed category is not in the mapping YAML.
42
+ # This is the ONLY rule_id-shaped literal permitted in this source file;
43
+ # every other rule_id travels in from security-review-rule-map.yaml.
44
+ _FALLBACK_NAMESPACE = "security-review."
45
+
46
+ _CATEGORY_RE = re.compile(r"^A[0-9]{2}\.[a-z0-9-]+$")
47
+
48
+ # Default mapping path resolved relative to this file, so the adapter works
49
+ # from any cwd. The repo-relative path is also named in --help for operators.
50
+ _THIS_FILE = os.path.abspath(__file__)
51
+ _ADAPTER_DIR = os.path.dirname(_THIS_FILE)
52
+ # /plugins/dev-team/skills/static-analysis-integration/adapters -> /plugins/dev-team
53
+ _PLUGIN_ROOT = os.path.abspath(os.path.join(_ADAPTER_DIR, "..", "..", ".."))
54
+ _DEFAULT_MAPPING_ABS = os.path.join(
55
+ _PLUGIN_ROOT, "knowledge", "security-review-rule-map.yaml"
56
+ )
57
+ _DEFAULT_MAPPING_REL = "plugins/dev-team/knowledge/security-review-rule-map.yaml"
58
+
59
+ # Stdlib-only YAML subset parser (ADR 0014/0015 — no third-party imports in
60
+ # shipped plugins/dev-team/ code); lives at plugins/dev-team/hooks/lib/.
61
+ sys.path.insert(0, os.path.join(_PLUGIN_ROOT, "hooks", "lib"))
62
+
63
+
64
+ def _fail_mapping(path: str) -> None:
65
+ print(f"ERROR: mapping file at {path} is invalid", file=sys.stderr)
66
+ sys.exit(1)
67
+
68
+
69
+ def _load_mapping(path: str) -> dict[str, str]:
70
+ """Load the YAML mapping. Hard-fails with a specific ERROR on any issue."""
71
+ from minimal_yaml import YamlError, parse_yaml # local import; cheap, stdlib-only
72
+
73
+ try:
74
+ with open(path, "r", encoding="utf-8") as fh:
75
+ data = parse_yaml(fh.read())
76
+ except FileNotFoundError:
77
+ _fail_mapping(path)
78
+ except YamlError:
79
+ _fail_mapping(path)
80
+ if (
81
+ not isinstance(data, dict)
82
+ or "mappings" not in data
83
+ or not isinstance(data.get("mappings"), dict)
84
+ ):
85
+ _fail_mapping(path)
86
+ return {str(k): str(v) for k, v in data["mappings"].items()}
87
+
88
+
89
+ def resolve_rule_id(
90
+ category: str, mapping: dict[str, str], mapping_path: str
91
+ ) -> tuple[str, str | None]:
92
+ """Resolve a category to a rule_id.
93
+
94
+ Returns (rule_id, warning_or_none). The caller prints the warning to stderr
95
+ when it is not None.
96
+
97
+ - Malformed category (regex-violating): exits 1.
98
+ - Well-formed + mapped: upstream rule_id, no warning.
99
+ - Well-formed + unmapped: security-review.<lowercase> rule_id + WARN.
100
+ """
101
+ if not _CATEGORY_RE.fullmatch(category):
102
+ print(
103
+ f"ERROR: category {category!r} does not match required format A<NN>.<slug>",
104
+ file=sys.stderr,
105
+ )
106
+ sys.exit(1)
107
+ if category in mapping:
108
+ return mapping[category], None
109
+ minted = _FALLBACK_NAMESPACE + category.lower()
110
+ warning = (
111
+ f"WARN: category {category} not in mapping at {mapping_path}; minted {minted}"
112
+ )
113
+ return minted, warning
114
+
115
+
116
+ def _build_finding(issue: dict[str, Any], rule_id: str) -> dict[str, Any]:
117
+ """Map an agent issue to a unified-finding envelope."""
118
+ return {
119
+ "rule_id": rule_id,
120
+ "file": issue["file"],
121
+ "line": issue["line"],
122
+ "severity": issue["severity"],
123
+ "message": issue["message"],
124
+ "metadata": {
125
+ "source": "security-review",
126
+ "confidence": issue.get("confidence", "none"),
127
+ "source_ref": issue,
128
+ },
129
+ }
130
+
131
+
132
+ def _parse_args(argv):
133
+ parser = argparse.ArgumentParser(
134
+ prog="security-review-adapter.py",
135
+ description=(
136
+ "Normalize security-review agent JSON into unified-finding-v1 JSONL. "
137
+ f"Default mapping: {_DEFAULT_MAPPING_REL}."
138
+ ),
139
+ )
140
+ parser.add_argument("--input", required=True, help="Agent-output JSON file.")
141
+ parser.add_argument(
142
+ "--output",
143
+ required=True,
144
+ help="Destination JSONL path (one unified finding per line).",
145
+ )
146
+ parser.add_argument(
147
+ "--mapping",
148
+ default=_DEFAULT_MAPPING_ABS,
149
+ help=f"Mapping YAML path. Default: {_DEFAULT_MAPPING_REL}",
150
+ )
151
+ return parser.parse_args(argv)
152
+
153
+
154
+ def _load_validator():
155
+ """Load the unified-finding validator once at startup."""
156
+ try:
157
+ from jsonschema import Draft202012Validator
158
+ except ImportError as exc: # pragma: no cover
159
+ print(
160
+ f"ERROR: jsonschema not installed; install with 'pip install jsonschema' ({exc})",
161
+ file=sys.stderr,
162
+ )
163
+ sys.exit(1)
164
+ with open(_SCHEMA_PATH, "r", encoding="utf-8") as fh:
165
+ schema = json.load(fh)
166
+ return Draft202012Validator(schema)
167
+
168
+
169
+ def main(argv=None) -> int:
170
+ args = _parse_args(argv)
171
+ try:
172
+ with open(args.input, "r", encoding="utf-8") as fh:
173
+ agent = json.load(fh)
174
+ except (FileNotFoundError, json.JSONDecodeError) as exc:
175
+ print(f"ERROR: cannot read agent input {args.input!r}: {exc}", file=sys.stderr)
176
+ return 1
177
+
178
+ mapping = _load_mapping(args.mapping)
179
+ validator = _load_validator()
180
+ issues = agent.get("issues", []) or []
181
+
182
+ with open(args.output, "w", encoding="utf-8") as out:
183
+ for issue in issues:
184
+ if "category" not in issue:
185
+ print(
186
+ "ERROR: agent issue missing required 'category' field; "
187
+ "upgrade the agent output",
188
+ file=sys.stderr,
189
+ )
190
+ return 1
191
+ rule_id, warning = resolve_rule_id(issue["category"], mapping, args.mapping)
192
+ if warning:
193
+ print(warning, file=sys.stderr)
194
+ finding = _build_finding(issue, rule_id)
195
+ errors = list(validator.iter_errors(finding))
196
+ if errors:
197
+ detail = "; ".join(
198
+ f"{'.'.join(str(p) for p in e.path) or '<root>'}: {e.message}"
199
+ for e in errors
200
+ )
201
+ print(
202
+ "ERROR: emitted finding violates unified-finding-v1 schema "
203
+ f"({detail})",
204
+ file=sys.stderr,
205
+ )
206
+ return 1
207
+ out.write(json.dumps(finding, ensure_ascii=False) + "\n")
208
+ return 0
209
+
210
+
211
+ if __name__ == "__main__":
212
+ sys.exit(main())
@@ -0,0 +1,23 @@
1
+ # Static Analysis Integration — Maintenance Policies
2
+
3
+ These policies cover the lifecycle of adapters and rulesets shipped with this skill. They are read by maintainers, not by agents at runtime — the runtime skill is in `SKILL.md`.
4
+
5
+ ## Adapter Maintenance Policy
6
+
7
+ Adapters (SARIF wrappers, bespoke JSON adapters) have a lifecycle independent of the tools they wrap.
8
+
9
+ - **Owners**: the skill's `maintainers:` frontmatter list. Minimum 2 names.
10
+ - **Update trigger**: a tier-2 CI job (nightly) runs each adapter against the installed tool binary. Schema drift that breaks the adapter fails CI and opens an auto-issue tagged `adapter-drift`.
11
+ - **Escalation**: a tier-2 failure unassigned for > 14 days escalates to CODEOWNERS.
12
+ - **Deprecation**: an adapter failing CI for three consecutive releases AND upstream unmaintained for > 6 months is demoted to "deprecated" — still shipped, emits a warning on invocation, removed in the next MAJOR contract version.
13
+ - **Adding a tool**: requires (a) a fixture pair under `evals/static-analysis-tools/tier1-mocks/<tool>/` (mock output + expected unified finding), and (b) a SARIF adapter first; bespoke-JSON only if upstream genuinely has no SARIF plan.
14
+
15
+ ## Ruleset Maintenance Policy
16
+
17
+ Separate lifecycle from adapters — rulesets track evolving attack patterns, not tool schema drift.
18
+
19
+ - **Owners**: each custom ruleset (`knowledge/semgrep-rules/*.yaml`) has a `maintainers:` frontmatter block with ≥ 2 names.
20
+ - **Review cadence**: quarterly. Reviewers confirm patterns are still relevant, add new attack signatures, retire deprecated ones.
21
+ - **FP drift threshold**: if eval fixtures show > 20% false-positive noise on the tier-2 suite, the ruleset is paused and triaged within one release.
22
+ - **Community-PR intake**: PRs adding patterns require a positive fixture plus a negative fixture. Rejections must cite the policy.
23
+ - **Deprecation**: a ruleset with no review or change in two consecutive review cycles is demoted to "archived" unless a maintainer re-ups.
@@ -0,0 +1,228 @@
1
+ # Per-language static-analysis setup
2
+
3
+ User-facing configuration guide for the static-analysis integration: the
4
+ build-time self-heal pass that runs at `/build`'s review checkpoints and the
5
+ `/code-review` static pre-pass. One section per registered lane, below. This
6
+ guide is the single source of truth for the manual setup commands; the
7
+ registry of what runs (and how) lives in [`tool-configs.md`](tool-configs.md)
8
+ § Build-time lanes.
9
+
10
+ ## Opting out
11
+
12
+ Set `DEV_TEAM_STATIC_SELF_HEAL=off` to skip the entire build-time static
13
+ self-heal pass — no tool probe or invocation occurs, one info line notes the
14
+ skip, and review checkpoints proceed straight to semantic review. Any other
15
+ value (or unset) leaves the pass enabled. This mirrors the
16
+ `DEV_TEAM_REVIEW_VALUE=off` convention and does not affect `/code-review`'s
17
+ full-repo static pre-pass.
18
+
19
+ ## Per-lane section contract
20
+
21
+ Each language section below is added by the issue that registers its lane
22
+ and covers, in order:
23
+
24
+ 1. **Tools and roles** — which tools the lane uses and what each does
25
+ (autofix-capable vs diagnostic-only).
26
+ 2. **Repo-level install** — how to install them as project-local,
27
+ versioned-with-the-repo dependencies, never user-level/global, so the
28
+ toolchain is reproducible for every contributor and CI.
29
+ 3. **Configuration** — which config files the tools honor.
30
+ 4. **Verification** — the lane's detection probe commands, to confirm the
31
+ setup is detected.
32
+ 5. **Opt-out** — the `DEV_TEAM_STATIC_SELF_HEAL=off` toggle above.
33
+ 6. **Recognized equivalent providers** — the slot's ordered provider list
34
+ and each provider's qualification status.
35
+
36
+ Each section also carries a one-line pointer to `/project-init` as the
37
+ one-command path to the same repo-level install; this guide remains the
38
+ source of truth for the manual commands.
39
+
40
+ ## Python
41
+
42
+ 1. **Tools and roles** — **Ruff** (autofix-capable): lint plus mechanical
43
+ fixes; runs the lane's pre-fix (`ruff check --fix`) and verify
44
+ (`ruff check`). **mypy** (diagnostic-only): type checking; it has no
45
+ autofix — its findings are handed to the coding agent.
46
+ 2. **Repo-level install** — add both to the project's own dev-dependency
47
+ mechanism so the toolchain is versioned with the repo and reproducible
48
+ for every contributor and CI: `requirements-dev.txt`, a `pyproject.toml`
49
+ dev dependency group, or `python3 -m pip install ruff mypy` inside the
50
+ project venv. Never `pip install --user` or a global pipx install.
51
+ 3. **Configuration** — Ruff honors the project's `ruff.toml`/`pyproject.toml`
52
+ when present (Ruff's default config discovery — no override flags) and
53
+ falls back to Ruff's defaults; the plugin pins no curated rule set — the
54
+ project owns its quality bar. mypy honors `mypy.ini`/`pyproject.toml`
55
+ (`[tool.mypy]`). A plain `src/`-layout project (modules with no
56
+ `__init__.py`, no mypy package-base config) needs no manual setup
57
+ either — both mypy invocations auto-detect the layout and add
58
+ `--explicit-package-bases` for you; see the mypy Tier 3 entry in
59
+ `tool-configs.md`.
60
+ 4. **Verification** — the lane's detection probes are `command -v ruff` and
61
+ `command -v mypy`; run them (with the project venv active) to confirm
62
+ the setup will be detected.
63
+ 5. **Opt-out** — `DEV_TEAM_STATIC_SELF_HEAL=off` skips the build-time
64
+ static self-heal pass entirely (see [Opting out](#opting-out)).
65
+ 6. **Recognized equivalent providers** — autofix slot: ruff (default,
66
+ last-resort) → black + flake8, qualified only as a combined pair (black
67
+ is the format-autofix half, flake8 the lint-diagnostic half — a partial
68
+ mapping, not 1:1 with ruff's rule surface). Diagnostic slot: mypy
69
+ (default, last-resort) → pyright, gated: recognition requires a ≤ 40 LOC
70
+ Tier 3 adapter in `static-analysis-integration`, which does not exist
71
+ yet. A project arriving with black + flake8 (or pyright) present and
72
+ configured gets them bound; ruff/mypy are installed only into slots that
73
+ bind no recognized provider.
74
+
75
+ Run `/project-init` for the one-command path to the same repo-level
76
+ install; the commands above remain the source of truth for manual setup.
77
+
78
+ ## JS/TS
79
+
80
+ 1. **Tools and roles** — **oxlint** (pin >= 1.0.0; Rust-based,
81
+ ESLint-compatible) is the lane's autofix-capable tool: the mechanical
82
+ pre-fix (`npx oxlint --fix`) covers a subset of its rules — partial
83
+ autofix; findings it cannot fix are reported fast and handed to the coding
84
+ agent — and the verify pass runs oxlint in check mode. **ESLint** is the
85
+ optional deep pass for framework-plugin rules oxlint lacks; it is not part
86
+ of the fast per-step loop (see the provider list below for how an
87
+ ESLint-configured project binds).
88
+ 2. **Repo-level install**:
89
+
90
+ ```bash
91
+ npm install --save-dev oxlint
92
+ ```
93
+
94
+ A devDependency pins the oxlint version in `package.json`/the lockfile —
95
+ versioned with the repo and reproducible for every contributor and CI.
96
+ Never `npm install -g oxlint`. One-command alternative: run
97
+ `/project-init` — for a new project its greenfield scaffold installs
98
+ oxlint and wires it as the default linter; for an existing repo it
99
+ installs oxlint only when the slot binds no provider.
100
+ 3. **Configuration** — oxlint honors `.oxlintrc.json` (ESLint-v8-compatible
101
+ shape; oxlint runs with sensible defaults when no config exists). When
102
+ ESLint coexists as the deep pass, add
103
+ [`eslint-plugin-oxlint`](https://github.com/oxc-project/eslint-plugin-oxlint)
104
+ to the ESLint config to turn off rules oxlint already covers, so the
105
+ ESLint pass only pays for the plugin-only remainder.
106
+ 4. **Verification**:
107
+
108
+ ```bash
109
+ npx --no-install oxlint --version
110
+ ```
111
+
112
+ Prints the pinned version when the lane's probe will detect oxlint (the
113
+ probe resolves the project-local `node_modules/.bin` first). Projects
114
+ bound to another provider verify the same way:
115
+ `npx --no-install biome --version` / `npx --no-install eslint --version`.
116
+ 5. **Opt-out** — `DEV_TEAM_STATIC_SELF_HEAL=off` skips the build-time pass
117
+ (see [Opting out](#opting-out)).
118
+ 6. **Recognized equivalent providers** (autofix slot; provider semantics live
119
+ in the build skill's `static-self-heal.md`):
120
+ - **oxlint** — default and last-resort provider; full-speed.
121
+ - **biome** — full-speed provider (fast, machine-readable).
122
+ - **eslint** — bound with demotion to slice-boundary granularity only
123
+ (fails the per-step latency budget), with one info line telling the
124
+ user the fast default (oxlint) exists.
125
+
126
+ ## C#
127
+
128
+ The C# lane rides the .NET SDK — there is no separate linter binary to
129
+ install or configure.
130
+
131
+ 1. **Tools and roles**
132
+ - `dotnet format` — autofix-capable: Roslyn-analyzer-driven whitespace,
133
+ style, and analyzer code-fixes. The build-time lane's mechanical
134
+ pre-fix (`whitespace` + `style` at every checkpoint; `analyzers` at the
135
+ slice boundary).
136
+ - Roslyn **ErrorLog SARIF** — diagnostic-only: native SARIF exported by
137
+ the `dotnet build` the TDD loop already runs when passed
138
+ `/p:ErrorLog=results.sarif,version=2.1`. Also the lane's Tier 1
139
+ `/code-review` source.
140
+ 2. **Repo-level install** — nothing to install: both pieces ship with the
141
+ .NET SDK the project already requires (SDK ≥ 6 for built-in
142
+ `dotnet format`; .NET 5 SDK / Roslyn 3.8+ for the SARIF v2.1 export).
143
+ Where the SDK version matters, pin it repo-level with `global.json`
144
+ (`dotnet new globaljson --sdk-version <version>`) — never a
145
+ user-level/global toolchain assumption. `/project-init` is the
146
+ one-command path: it verifies SDK presence and honors an existing
147
+ `global.json` pin.
148
+ 3. **Configuration** — the tools honor the project's `.editorconfig`;
149
+ `dotnet format` runs against it at its default `--severity warn`.
150
+ Third-party Roslyn analyzers (StyleCop.Analyzers, SonarAnalyzer.CSharp,
151
+ …) are added as `PackageReference`s in the `.csproj` and automatically
152
+ ride the same ErrorLog SARIF.
153
+ 4. **Verification** — the lane's detection probe is `command -v dotnet`
154
+ (one SDK probe covers both tools). Confirm the pieces work:
155
+
156
+ ```bash
157
+ command -v dotnet
158
+ dotnet format --version
159
+ dotnet build /p:ErrorLog=results.sarif,version=2.1 # writes results.sarif
160
+ ```
161
+
162
+ 5. **Opt-out** — set `DEV_TEAM_STATIC_SELF_HEAL=off` to skip the build-time
163
+ self-heal pass entirely (see [Opting out](#opting-out) above).
164
+ 6. **Recognized equivalent providers** — none. `dotnet format` is
165
+ SDK-builtin, and analyzer alternatives join via the `.csproj`, not via
166
+ lane providers.
167
+
168
+ ## Java
169
+
170
+ Registered by #810.
171
+
172
+ ### Tools and roles
173
+
174
+ - **PMD** — **diagnostic-only** (no autofix tool exists for a tight
175
+ per-step loop in Java). Syntax-tree based, so it needs no compile step:
176
+ fast enough for build-time checkpoints, and its native SARIF renderer
177
+ makes it a zero-adapter `/code-review` source. Findings go to the coding
178
+ agent to fix; PMD re-runs to confirm convergence.
179
+
180
+ ### Repo-level install
181
+
182
+ From your project root (requires a JDK/JRE — `java` on PATH):
183
+
184
+ ```bash
185
+ python3 "${CLAUDE_PLUGIN_ROOT}/scripts/install-java-static-analysis.py"
186
+ ```
187
+
188
+ Installs a pinned PMD distribution into the repo-local **`.pmd/`**
189
+ directory (`PMD_INSTALL_DIR` overrides the target). Add `.pmd/` to your
190
+ project's `.gitignore` — the distribution is large and must never be
191
+ committed; the installer prints a reminder when the entry is missing. No
192
+ PATH change is needed, and never install user-level/global. Re-running is
193
+ idempotent: an existing install is detected and nothing is re-downloaded.
194
+
195
+ Or run `/project-init` — the one-command path to the same repo-level
196
+ install.
197
+
198
+ ### Configuration
199
+
200
+ - **Repo-root `pmd-ruleset.xml`**, when present, is used by both the
201
+ build-time lane and the `/code-review` pass. Carry your own
202
+ `<exclude-pattern>` entries in it (generated-output dirs like `target/`).
203
+ - Otherwise the plugin's quickstart-wrapping default ruleset applies —
204
+ PMD's quickstart rules plus excludes for `target/`, `build/`, `out/`,
205
+ and `.gradle/`. Test sources run the same rules as production code.
206
+
207
+ ### Verification
208
+
209
+ Confirm the setup is detected (repo-local probe first, then PATH):
210
+
211
+ ```bash
212
+ ls .pmd/pmd-bin-*/bin/pmd # repo-local launcher (checked first)
213
+ command -v pmd # PATH fallback
214
+ .pmd/pmd-bin-*/bin/pmd --version
215
+ ```
216
+
217
+ ### Opt-out
218
+
219
+ Set `DEV_TEAM_STATIC_SELF_HEAL=off` to skip the build-time pass entirely —
220
+ see [Opting out](#opting-out).
221
+
222
+ ### Recognized equivalent providers
223
+
224
+ Diagnostic slot, in order: **PMD** (default, last-resort) → **checkstyle**.
225
+ checkstyle qualifies as Tier 1 via native SARIF output (Checkstyle ≥ 10.3,
226
+ no adapter); a project arriving with a repo-root `checkstyle.xml` binds it
227
+ and PMD is not installed. SpotBugs is not a provider candidate — it needs
228
+ compiled bytecode and belongs at the end-of-build `/code-review` pass only.
@@ -0,0 +1,124 @@
1
+ # SARIF → Unified Finding Parser
2
+
3
+ Shared normalization layer for every SARIF-emitting tool in the static-analysis pre-pass. Reads a SARIF document, walks `runs[*].results[*]`, and emits unified-finding-v1 objects that validate against `plugins/dev-team/knowledge/schemas/unified-finding-v1.json`.
4
+
5
+ ## Field mapping
6
+
7
+ ### Required fields
8
+
9
+ | Unified finding field | SARIF source | Transform |
10
+ |---|---|---|
11
+ | `rule_id` | `runs[r].tool.driver.name` + `results[i].ruleId` | Format: `<driver_name_kebab>.<middle>.<ruleId_kebab>` — see **Rule id prefix conventions** below for what fills the middle segment |
12
+ | `file` | `results[i].locations[0].physicalLocation.artifactLocation.uri` | Strip `file://` prefix; resolve `uriBaseId` if present; ensure repo-relative POSIX path |
13
+ | `line` | `results[i].locations[0].physicalLocation.region.startLine` | Integer, 1-indexed |
14
+ | `severity` | `results[i].level` | Map: `error`→`error`, `warning`→`warning`, `note`→`suggestion`, `none` or absent→`info` |
15
+ | `message` | `results[i].message.text` | Truncate at 500 chars |
16
+ | `metadata.source` | `runs[r].tool.driver.name` | Lowercase; e.g. `"Semgrep"`→`"semgrep"` |
17
+ | `metadata.confidence` | `results[i].properties.confidence` | Default: `medium` |
18
+
19
+ ### Optional fields
20
+
21
+ | Unified finding field | SARIF source | Notes |
22
+ |---|---|---|
23
+ | `column` | `results[i].locations[0].physicalLocation.region.startColumn` | Omit if absent |
24
+ | `end_line` | `results[i].locations[0].physicalLocation.region.endLine` | Omit if absent |
25
+ | `end_column` | `results[i].locations[0].physicalLocation.region.endColumn` | Omit if absent |
26
+ | `cwe[]` | `runs[r].tool.driver.rules[ruleIndex].properties.cwe` | Wrap as `["CWE-N"]`; accept int or string |
27
+ | `cve[]` | `results[i].properties.cve` or rule `properties.cve` | Validate `CVE-YYYY-N` shape |
28
+ | `owasp[]` | `runs[r].tool.driver.rules[ruleIndex].properties.owasp` | Passthrough |
29
+ | `metadata.source_ref` | `results[i]` (the raw object) | Opaque pointer for debugging only; shape is NOT contract-stable |
30
+ | `metadata.exploitability` | `results[i].properties.exploitability` | Map to `demonstrated|plausible|theoretical|unknown`; default `unknown` if absent |
31
+
32
+ ## Rule id prefix conventions
33
+
34
+ Every unified rule_id follows the schema pattern `^[a-z0-9_-]+(\.[a-z0-9_-]+)+$` — at least two dot-separated segments. The parser applies the rules below depending on the shape of the raw SARIF ruleId.
35
+
36
+ The middle segment comes from the raw ruleId's own structure, its plugin, or the tool → tier map — **never** from `results[i].properties.language`. An earlier version of the field table above named that property as the source; no implementation ever read it, and the tier map is what every fixture and both consumers actually exercise.
37
+
38
+ **Raw ruleId contains dots (semgrep-style):** preserve the structure. Each segment is kebab-cased independently.
39
+
40
+ ```
41
+ raw: python.django.audit.sql-injection
42
+ out: semgrep.python.django.audit.sql-injection
43
+ ```
44
+
45
+ **Raw ruleId is `plugin(rule)`-shaped (oxlint):** the plugin becomes the tier segment, so the namespace survives.
46
+
47
+ ```
48
+ raw: jsx-a11y(alt-text) out: oxlint.jsx-a11y.alt-text
49
+ raw: eslint(no-magic-numbers) out: oxlint.eslint.no-magic-numbers
50
+ raw: react-perf(jsx-no-new-object-as-prop)
51
+ out: oxlint.react-perf.jsx-no-new-object-as-prop
52
+ ```
53
+
54
+ This branch is checked **before** the dotted and flat cases. Without it the
55
+ parentheses are hyphen-flattened by `kebab()` into a single segment
56
+ (`oxlint.js.jsx-a11y-alt-text`) — schema-valid, but it erases the boundary
57
+ that lets a consumer tell an accessibility finding from a performance one,
58
+ which is exactly what #1979's two oxlint concerns need. A malformed shape
59
+ (empty half, nested parentheses) falls through to the rules below rather than
60
+ producing a partial id.
61
+
62
+ **Raw ruleId is flat:** the parser inserts a capability-tier segment from its tool → tier map.
63
+
64
+ | Tool driver | Tier segment |
65
+ |---|---|
66
+ | semgrep | `sast` (rarely used — semgrep rules usually have dots) |
67
+ | gitleaks | `secrets` |
68
+ | trivy | `iac` for config findings; `cve` for CVE findings; `supply-chain` for vuln findings |
69
+ | hadolint | `dockerfile` |
70
+ | actionlint | `workflows` |
71
+ | ruff | `python` |
72
+ | oxlint | `js` (fallback only — a `plugin(rule)` id uses its plugin instead) |
73
+ | entropy-check | `secrets` (custom script — passphrase entropy + cross-env reuse) |
74
+ | model-hash-verify | `ml` (custom script — ML model integrity + provenance) |
75
+
76
+ `ruff` and `oxlint` were absent from this map until #1979, so every finding
77
+ from the two language linters was emitted under the `generic` fallback,
78
+ contradicting the ids their own entries in `tool-configs.md` advertise.
79
+
80
+ **Degenerate inputs still produce a valid id.** Two rules keep the output
81
+ inside the schema pattern no matter what a driver reports, because a rule id
82
+ that fails validation costs the whole finding — file, line, and message
83
+ included — even when those are perfectly usable:
84
+
85
+ - The **driver name is kebab-cased** into the first segment, so a tool
86
+ identifying itself as `Semgrep OSS` yields `semgrep-oss.…` rather than
87
+ embedding a space. A no-op for every tool wired up today.
88
+ - A **rule id that kebabs to nothing** (empty string, punctuation only, a
89
+ non-Latin script) becomes the literal segment `unknown` rather than an
90
+ empty trailing segment: `oxlint.js.unknown`, never `oxlint.js.`.
91
+
92
+ ```
93
+ raw: aws-access-key out: gitleaks.secrets.aws-access-key
94
+ raw: DS002 out: trivy.iac.ds002
95
+ raw: CVE-2024-1234 out: trivy.cve.cve-2024-1234
96
+ raw: DL3008 out: hadolint.dockerfile.dl3008
97
+ raw: shellcheck out: actionlint.workflows.shellcheck
98
+ ```
99
+
100
+ **Kebab-casing rule:** `[^a-z0-9]+` is replaced with a single hyphen, the string is lowercased, and leading/trailing hyphens are stripped.
101
+
102
+ ## Error handling
103
+
104
+ - A SARIF document missing `runs` or `runs[*].tool.driver.name` is an adapter bug; the parser fails the run with a named-tool error.
105
+ - A `result` missing `ruleId` OR `locations` OR `message.text` is discarded with a one-line log entry (`DROPPED: <tool> result missing required SARIF field(s)`). The rest of the run continues.
106
+ - A mapped finding that fails unified-finding-v1 schema validation fails the whole run (not silently discarded) — adapter bug.
107
+
108
+ ## Non-goals
109
+
110
+ - Does not convert SARIF fingerprint / taint-flow data into finding fields. Those remain in `metadata.source_ref` for tools that care.
111
+ - Does not enrich findings with exploitability, reachability, or CWE mappings beyond what SARIF carries. Those are downstream concerns (FP-reduction, compliance-mapping).
112
+ - Does not canonicalize file paths beyond stripping `file://` and applying `uriBaseId`. Path normalization (symlink resolution, case-folding) is the caller's responsibility.
113
+
114
+ ## Tests
115
+
116
+ Fixtures under `evals/static-analysis-tools/tier1-mocks/<tool>/` contain a pair of files per tool:
117
+
118
+ ```
119
+ <tool>/
120
+ mock.sarif # raw SARIF output from the tool (captured or synthesized)
121
+ expected-findings.json # array of unified findings the parser should emit
122
+ ```
123
+
124
+ The validator script at `evals/static-analysis-tools/validate.py` iterates every fixture pair, parses `mock.sarif` through the shared parser, and asserts the output equals `expected-findings.json` and validates against the unified-finding-v1 schema.