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,252 @@
1
+ #!/usr/bin/env python3
2
+ """Python port of scripts/build-wave-reconcile.sh (#612 / #572 Phase 3).
3
+
4
+ Serially merge a wave's completed slice branches into an integration branch,
5
+ then gate on the full suite before the next wave.
6
+
7
+ Order-independent: branches are merged in a deterministic (sorted) order.
8
+ Because same-wave slices touch disjoint files (build-wave.py's collision gate
9
+ guarantees it) the merged tree is identical regardless of the order slices
10
+ finished. If two branches unexpectedly touch the same file, the merge
11
+ conflicts — the script halts LOUDLY (exit 1, names the file) and **picks no
12
+ side** (it aborts the merge), starting no next-wave slice.
13
+
14
+ Usage:
15
+ build_wave_reconcile.py --into <branch> --base <ref> [--test-cmd CMD] <slice-branch>...
16
+
17
+ Stdlib-only. See docs/python-hook-contract.md.
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import argparse
23
+ import os
24
+ import re
25
+ import shlex
26
+ import subprocess
27
+ import sys
28
+ from collections.abc import Sequence
29
+
30
+ # Default hard ceiling for --test-cmd so a hung suite can never block the
31
+ # wave pipeline indefinitely. Override (test-only injection seam) via
32
+ # BUILD_WAVE_RECONCILE_TEST_CMD_TIMEOUT.
33
+ _DEFAULT_TEST_CMD_TIMEOUT_SECONDS = 1800.0
34
+
35
+ # Characters that require real shell interpretation (pipes, chaining,
36
+ # redirects, expansion, globs, backticks). A --test-cmd containing none of
37
+ # these is a plain word list and can run directly (no shell hop needed).
38
+ _SHELL_METACHARACTERS_RE = re.compile(r"[|&;<>$`*?~]")
39
+
40
+
41
+ def _test_cmd_timeout_seconds() -> float:
42
+ raw = os.environ.get("BUILD_WAVE_RECONCILE_TEST_CMD_TIMEOUT")
43
+ if raw:
44
+ try:
45
+ return float(raw)
46
+ except ValueError:
47
+ pass
48
+ return _DEFAULT_TEST_CMD_TIMEOUT_SECONDS
49
+
50
+
51
+ def _git(args: Sequence[str], capture: bool = True) -> subprocess.CompletedProcess:
52
+ """Run `git <args>` with stdout+stderr captured by default."""
53
+ return subprocess.run(
54
+ ["git", *args],
55
+ capture_output=capture,
56
+ text=True,
57
+ check=False,
58
+ )
59
+
60
+
61
+ def _branch_exists(name: str) -> bool:
62
+ r = _git(["rev-parse", "--verify", "--quiet", name])
63
+ return r.returncode == 0
64
+
65
+
66
+ def _checkout_existing(into: str) -> int:
67
+ r = _git(["checkout", into])
68
+ if r.returncode != 0:
69
+ print(
70
+ f"build-wave-reconcile: cannot check out existing integration "
71
+ f"branch '{into}'.",
72
+ file=sys.stderr,
73
+ )
74
+ return 2
75
+ return 0
76
+
77
+
78
+ def _create_from_base(into: str, base: str) -> int:
79
+ r = _git(["checkout", "-B", into, base])
80
+ if r.returncode != 0:
81
+ print(
82
+ f"build-wave-reconcile: cannot create integration branch '{into}' "
83
+ f"from '{base}'.",
84
+ file=sys.stderr,
85
+ )
86
+ return 2
87
+ return 0
88
+
89
+
90
+ def _merge_branch(branch: str) -> int:
91
+ r = _git(["merge", "--no-ff", "--no-edit", branch])
92
+ if r.returncode != 0:
93
+ # Capture conflicted paths BEFORE aborting.
94
+ diff = _git(["diff", "--name-only", "--diff-filter=U"])
95
+ conflicted = ", ".join(
96
+ line for line in diff.stdout.splitlines() if line.strip()
97
+ )
98
+ _git(["merge", "--abort"])
99
+ print(
100
+ f"build-wave-reconcile: CONFLICT — same-wave branches touch "
101
+ f"'{conflicted}'.",
102
+ file=sys.stderr,
103
+ )
104
+ print(
105
+ " No side was chosen (merge aborted). Halting; start no next-wave slice.",
106
+ file=sys.stderr,
107
+ )
108
+ return 1
109
+ return 0
110
+
111
+
112
+ def _run_test_cmd(cmd: str) -> int:
113
+ """Run the caller-supplied gate, bounded by a hard timeout so a hung
114
+ suite can never block the pipeline indefinitely.
115
+
116
+ Bash used `eval` with stdout+stderr silenced — mirror that exactly for
117
+ byte-parity of the diagnostic line. A command with no shell
118
+ metacharacters is a plain word list and runs directly (list-form,
119
+ shell=False); a command that chains, pipes, redirects, or expands
120
+ still needs the shell to interpret it (list-form can't express that
121
+ syntax), so it runs via shell=True as before.
122
+ """
123
+ timeout = _test_cmd_timeout_seconds()
124
+ use_shell = bool(_SHELL_METACHARACTERS_RE.search(cmd))
125
+ args: str | list[str] = cmd if use_shell else shlex.split(cmd)
126
+ try:
127
+ proc = subprocess.run(
128
+ args,
129
+ shell=use_shell,
130
+ capture_output=True,
131
+ check=False,
132
+ timeout=timeout,
133
+ )
134
+ except subprocess.TimeoutExpired:
135
+ print(
136
+ f"build-wave-reconcile: full-suite gate TIMED OUT after {timeout:g}s "
137
+ f"('{cmd}'). Halting before the next wave.",
138
+ file=sys.stderr,
139
+ )
140
+ return 1
141
+ except (OSError, ValueError) as e:
142
+ print(
143
+ f"build-wave-reconcile: full-suite gate FAILED ('{cmd}'): {e}. "
144
+ "Halting before the next wave.",
145
+ file=sys.stderr,
146
+ )
147
+ return 1
148
+ if proc.returncode != 0:
149
+ print(
150
+ f"build-wave-reconcile: full-suite gate FAILED ('{cmd}'). "
151
+ "Halting before the next wave.",
152
+ file=sys.stderr,
153
+ )
154
+ return 1
155
+ return 0
156
+
157
+
158
+ def _parse_argv(argv: list[str]) -> argparse.Namespace | int:
159
+ ap = argparse.ArgumentParser(add_help=False)
160
+ ap.add_argument("--into", default="")
161
+ ap.add_argument("--base", default="")
162
+ ap.add_argument("--test-cmd", dest="test_cmd", default="")
163
+ ap.add_argument("branches", nargs="*")
164
+ # Preserve the bash script's error contract: any unknown option or missing
165
+ # required flag exits 2 with the same usage line.
166
+ known: list[str] = []
167
+ branches: list[str] = []
168
+ i = 0
169
+ while i < len(argv):
170
+ tok = argv[i]
171
+ if tok in ("--into", "--base", "--test-cmd"):
172
+ if i + 1 >= len(argv):
173
+ _usage()
174
+ return 2
175
+ known.extend([tok, argv[i + 1]])
176
+ i += 2
177
+ elif tok.startswith("-"):
178
+ print(f"unknown option: {tok}", file=sys.stderr)
179
+ return 2
180
+ else:
181
+ branches.append(tok)
182
+ i += 1
183
+ parsed = ap.parse_args(known)
184
+ parsed.branches = branches
185
+ if not parsed.into or not parsed.base or not parsed.branches:
186
+ _usage()
187
+ return 2
188
+ return parsed
189
+
190
+
191
+ def _usage() -> None:
192
+ # Match the .sh's exact wording (name kept as `build-wave-reconcile.sh`)
193
+ # so bash and python emit byte-identical stderr on usage errors — the
194
+ # parity harness gates on this.
195
+ print(
196
+ "usage: build-wave-reconcile.sh --into <branch> --base <ref> "
197
+ "[--test-cmd CMD] <slice-branch>...",
198
+ file=sys.stderr,
199
+ )
200
+
201
+
202
+ def main(argv: list[str]) -> int:
203
+ parsed = _parse_argv(argv)
204
+ if isinstance(parsed, int):
205
+ return parsed
206
+
207
+ into: str = parsed.into
208
+ base: str = parsed.base
209
+ test_cmd: str = parsed.test_cmd
210
+ branches: list[str] = parsed.branches
211
+
212
+ # Deterministic merge order → reproducible tree regardless of caller order.
213
+ sorted_branches = sorted(branches)
214
+
215
+ # If $INTO exists, reconcile onto its current tip so caller WIP commits
216
+ # (spec/plan on the integration branch made before or between waves) stay
217
+ # in the ancestry. Only create $INTO fresh from $BASE when it does not
218
+ # exist yet — resetting an existing $INTO to $BASE would silently discard
219
+ # those WIP commits.
220
+ if _branch_exists(into):
221
+ rc = _checkout_existing(into)
222
+ else:
223
+ rc = _create_from_base(into, base)
224
+ if rc != 0:
225
+ return rc
226
+
227
+ for branch in sorted_branches:
228
+ rc = _merge_branch(branch)
229
+ if rc != 0:
230
+ return rc
231
+
232
+ if test_cmd:
233
+ rc = _run_test_cmd(test_cmd)
234
+ if rc != 0:
235
+ return rc
236
+
237
+ # Match the .sh's exact status suffix. Bash does:
238
+ # suite gate ${TESTCMD:+passed}${TESTCMD:-skipped}.
239
+ # Which expands to 'passed<TESTCMD>' when TESTCMD is set, and
240
+ # 'skipped' when it's not. That's a shell-substitution quirk in the
241
+ # .sh, not a spec — but byte-parity is the contract.
242
+ gate_status = f"passed{test_cmd}" if test_cmd else "skipped"
243
+
244
+ print(
245
+ f"build-wave-reconcile: merged {len(sorted_branches)} slice "
246
+ f"branch(es) into '{into}'; suite gate {gate_status}."
247
+ )
248
+ return 0
249
+
250
+
251
+ if __name__ == "__main__":
252
+ raise SystemExit(main(sys.argv[1:]))
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env python3
2
+ """Python port of scripts/build-worktree-baseref.sh (#587 / #572 Phase 2).
3
+
4
+ Detects the effective worktree.baseRef setting so /build can warn loudly
5
+ (never mutate) when it is not "head".
6
+
7
+ Issue #553 / plans/build-worktree-inherits-caller-head.md Slice 1.
8
+
9
+ Background: Claude Code's `worktree.baseRef: "head"` setting makes
10
+ isolation:"worktree" Agent-tool dispatch branch child worktrees from the
11
+ caller's local HEAD instead of origin/<default> ("fresh", the default).
12
+ docs/spikes/worktree-baseref-head-spike.md empirically confirmed this
13
+ setting is honored only at project (.claude/settings.json) and user
14
+ (~/.claude/settings.json) scope — NOT at project-local
15
+ (.claude/settings.local.json) or plugin (plugins/<name>/settings.json)
16
+ scope. This script's default search order reflects only the two scopes
17
+ that are actually honored.
18
+
19
+ Usage:
20
+ build_worktree_baseref.py detect
21
+
22
+ Prints exactly one token to stdout and always exits 0 (degrade-never-abort):
23
+ head — effective setting is "head"
24
+ fresh — effective setting is "fresh"
25
+ unset — no honored settings file sets worktree.baseRef
26
+ unknown — detection failed — treat as fail-safe
27
+
28
+ Env vars (TEST-ONLY injection seam):
29
+ BASEREF_SETTINGS_PATHS colon-separated list of settings files,
30
+ highest precedence first. Defaults to
31
+ ".claude/settings.json:$HOME/.claude/settings.json".
32
+
33
+ Stdlib-only (json/os/pathlib/sys). See ADR 0014.
34
+
35
+ Refs: #572, #577, #553.
36
+ """
37
+
38
+ from __future__ import annotations
39
+
40
+ import json
41
+ import os
42
+ import sys
43
+ from pathlib import Path
44
+
45
+
46
+ def _default_settings_paths() -> str:
47
+ home = os.environ.get("HOME", "")
48
+ return f".claude/settings.json:{home}/.claude/settings.json"
49
+
50
+
51
+ def _settings_paths() -> list[str]:
52
+ raw = os.environ.get("BASEREF_SETTINGS_PATHS")
53
+ if raw is None:
54
+ raw = _default_settings_paths()
55
+ # Preserve the .sh's colon-separated parsing including empty segments
56
+ # (the `[ -n "$f" ] || continue` guard skips them).
57
+ return [p for p in raw.split(":") if p]
58
+
59
+
60
+ def _load_worktree_baseref(path: Path) -> str | None:
61
+ """Return the .worktree.baseRef value from `path`, or None on any error.
62
+
63
+ None distinguishes 'file unreadable or malformed' (skip to next file)
64
+ from an empty string (parseable but no baseRef — also skip).
65
+ """
66
+ try:
67
+ with path.open("r", encoding="utf-8") as fh:
68
+ data = json.load(fh)
69
+ except (OSError, json.JSONDecodeError, ValueError):
70
+ return None
71
+ if not isinstance(data, dict):
72
+ return None
73
+ wt = data.get("worktree")
74
+ if not isinstance(wt, dict):
75
+ return None
76
+ value = wt.get("baseRef")
77
+ if not isinstance(value, str):
78
+ return None
79
+ return value
80
+
81
+
82
+ def _detect() -> str:
83
+ """Walk settings files in precedence order. First honored value wins.
84
+
85
+ Every file that fails to parse or lacks the key is skipped rather than
86
+ aborting the whole detection. The .sh also gates on `command -v jq`;
87
+ the .py has no such external dependency but keeps the 'unknown' exit
88
+ reserved for future contract expansion.
89
+ """
90
+ for raw in _settings_paths():
91
+ path = Path(raw)
92
+ if not path.is_file():
93
+ continue
94
+ value = _load_worktree_baseref(path)
95
+ if value == "head" or value == "fresh":
96
+ return value
97
+ return "unset"
98
+
99
+
100
+ def main(argv: list[str] | None = None) -> int:
101
+ args = sys.argv[1:] if argv is None else list(argv)
102
+ if not args or args[0] != "detect":
103
+ # Byte-parity with the .sh's usage message: name it after the .sh
104
+ # executable so operators searching for the exact string in logs
105
+ # find it regardless of which implementation ran.
106
+ sys.stderr.write("Usage: build-worktree-baseref.sh detect\n")
107
+ return 2
108
+ sys.stdout.write(_detect() + "\n")
109
+ return 0
110
+
111
+
112
+ if __name__ == "__main__": # pragma: no cover
113
+ sys.exit(main())
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env python3
2
+ """Validate that every review agent declares a body-level Scope: field.
3
+
4
+ ``Scope:`` is a body-level declaration, not frontmatter (issue #1333 — it is
5
+ not part of the official Claude Code sub-agent contract; see
6
+ plugins/marketplace-dev/knowledge/agent-contract.json).
7
+
8
+ Exit 0 if all review agents have a Scope: line in their body.
9
+ Exit 1 with a list of offending agents if any are missing.
10
+
11
+ Usage:
12
+ python3 check_agent_scope.py [--agents-dir <path>]
13
+
14
+ The agents directory defaults to plugins/dev-team/agents/ relative to the
15
+ repo root (inferred from this script's location).
16
+ """
17
+
18
+ # Keeps PEP 585 annotations (`list[str]`) as strings, so this module imports on
19
+ # the floor ADR 0014 sets for shipped code.
20
+ from __future__ import annotations
21
+
22
+ import argparse
23
+ import sys
24
+ from pathlib import Path
25
+
26
+ sys.path.insert(0, str(Path(__file__).resolve().parent / "lib"))
27
+ # The `agents/` directory root is the shared, resolved single source of
28
+ # truth in hooks/lib (#1904 item 3) — scripts/ -> hooks/lib/ is the correct
29
+ # dependency direction (see review_agent_registry.py's own docstring). This
30
+ # script globs all agents/*.md (not just *-review.md), so it uses only
31
+ # default_agents_dir() for the directory path — never
32
+ # registered_review_agent_names()/find_review_agent_files(), which are
33
+ # review-agent-specific.
34
+ sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "hooks" / "lib"))
35
+
36
+ # Review agents are the agents named in the Review Agents section of
37
+ # knowledge/agent-registry.md. Rather than parsing that file we check all
38
+ # agents/*.md files that contain a 'description:' frontmatter field and are
39
+ # not one of the well-known non-review agents. The exclusion set is shared
40
+ # with select_lenses.py (#1516) — see scripts/lib/review_roster.py.
41
+ from review_agent_registry import default_agents_dir
42
+ from review_roster import NON_REVIEW_AGENTS
43
+ from review_roster import SCOPE_LINE_RE as SCOPE_RE
44
+
45
+
46
+ def has_frontmatter(text: str) -> bool:
47
+ """True if the file opens with a YAML frontmatter block."""
48
+ return text.startswith("---") and "---" in text[3:]
49
+
50
+
51
+ def strip_frontmatter(text: str) -> str:
52
+ """Return the body (everything after the frontmatter block)."""
53
+ if not text.startswith("---"):
54
+ return text
55
+ end = text.find("\n---", 3)
56
+ if end == -1:
57
+ return text
58
+ after = text.find("\n", end + 1)
59
+ return text[after + 1:] if after != -1 else ""
60
+
61
+
62
+ def declares_scope(body: str) -> bool:
63
+ """True if the body contains a Scope: line (scalar or block-list)."""
64
+ return any(SCOPE_RE.match(line) for line in body.splitlines())
65
+
66
+
67
+ def main() -> int:
68
+ parser = argparse.ArgumentParser(description=__doc__)
69
+ parser.add_argument(
70
+ "--agents-dir",
71
+ type=Path,
72
+ default=None,
73
+ help="Path to the agents/ directory (default: auto-detect from script location)",
74
+ )
75
+ args = parser.parse_args()
76
+
77
+ if args.agents_dir is not None:
78
+ agents_dir = args.agents_dir
79
+ else:
80
+ agents_dir = default_agents_dir()
81
+
82
+ if not agents_dir.is_dir():
83
+ print(f"ERROR: agents directory not found: {agents_dir}", file=sys.stderr)
84
+ return 1
85
+
86
+ missing: list[str] = []
87
+ for agent_file in sorted(agents_dir.glob("*.md")):
88
+ name = agent_file.stem
89
+ if name in NON_REVIEW_AGENTS:
90
+ continue
91
+ text = agent_file.read_text(encoding="utf-8")
92
+ if not has_frontmatter(text):
93
+ # No frontmatter — skip (not an agent file)
94
+ continue
95
+ body = strip_frontmatter(text)
96
+ if not declares_scope(body):
97
+ missing.append(name)
98
+
99
+ if missing:
100
+ print("FAIL: the following review agents are missing a 'Scope:' body declaration:")
101
+ for name in missing:
102
+ print(f" - {name}")
103
+ print(
104
+ "\nAdd one of: 'Scope: always' (language-agnostic, every diff), a bullet list "
105
+ "of glob patterns (file-type-scoped), 'Scope: added-only' + globs (only newly-"
106
+ "added matching files), or 'Scope: on-demand' (never per-diff — dispatched by "
107
+ "name or by /repo-review). See plugins/dev-team/docs/developer-notes.md."
108
+ )
109
+ return 1
110
+
111
+ print(f"OK: all {len(list(agents_dir.glob('*.md'))) - len(NON_REVIEW_AGENTS)} "
112
+ f"review agents declare a Scope: field.")
113
+ return 0
114
+
115
+
116
+ if __name__ == "__main__":
117
+ sys.exit(main())
@@ -0,0 +1,213 @@
1
+ #!/usr/bin/env python3
2
+ """Validate the non-review agent→code-intelligence-tool mapping (#1108).
3
+
4
+ #1102 granted the 24 read-only ``*-review`` agents a fixed MCP tool set
5
+ (``check_review_agent_mcp_tools.py``). #1108 extends the grant to the non-review
6
+ team agents by **tier**:
7
+
8
+ - **narrow** — codegraph + the four Repowise tools (``BASE_MCP_TOOLS``):
9
+ ``software-engineer``, ``mutation-kill``, ``qa-engineer``, ``data-flow-tracer``.
10
+ ``data-flow-tracer`` additionally gets a scoped ``Bash(graphify *)`` grant (its
11
+ sole execution capability — it invokes the Graphify CLI for cross-layer traces).
12
+ - **rationale** — the narrow set plus ``get_why`` (code-existence rationale):
13
+ ``adr-author``, ``architect``, ``security-engineer``, ``platform-engineer``,
14
+ ``codebase-recon``.
15
+
16
+ Coverage is the **union** of two branches so a named target is always validated
17
+ even when it carries no persona marker, and a *new* team agent can't silently
18
+ escape the mapping:
19
+
20
+ - (a) every agent named in ``TIER_CONFIG`` — deterministic coverage of the known
21
+ targets (``codebase-recon`` is ``Enforcement: script``; ``mutation-kill`` carries
22
+ neither persona marker — branch (b) alone would miss both).
23
+ - (b) the structural sweep — team agents detected by a ``## Behavioral Guidelines``
24
+ section *or* an ``Enforcement: script`` body line (not frontmatter — issue
25
+ #1333), minus ``*-review.md``, minus the documented ``EXCLUSIONS``. A swept
26
+ agent in neither ``TIER_CONFIG`` nor ``EXCLUSIONS`` is *unclassified* and
27
+ fails — the self-extension net.
28
+
29
+ A granted MCP tool whose server is absent is inert at runtime; agents fall back to
30
+ Read/Grep/Glob.
31
+
32
+ Usage (repo-root-relative — this script mutates the agent files next to
33
+ wherever it itself resides, so it must run against the maintainer's own
34
+ checkout, never a `${CLAUDE_PLUGIN_ROOT}`-qualified installed-cache path):
35
+ python3 plugins/dev-team/scripts/check_agent_tool_mapping.py [--agents-dir <path>]
36
+ python3 plugins/dev-team/scripts/check_agent_tool_mapping.py --fix # append missing tier tools
37
+ python3 plugins/dev-team/scripts/check_agent_tool_mapping.py --json # machine-readable report
38
+ """
39
+
40
+ from __future__ import annotations
41
+
42
+ import argparse
43
+ import json
44
+ import re
45
+ import sys
46
+ from pathlib import Path
47
+
48
+ sys.path.insert(0, str(Path(__file__).parent / "lib"))
49
+ # The `agents/` directory root is the shared, resolved single source of
50
+ # truth in hooks/lib (#1904 item 3) — scripts/ -> hooks/lib/ is the correct
51
+ # dependency direction (see review_agent_registry.py's own docstring).
52
+ sys.path.insert(0, str(Path(__file__).parent.parent / "hooks" / "lib"))
53
+
54
+ from mcp_tool_grants import (
55
+ BASE_MCP_TOOLS,
56
+ GET_WHY,
57
+ build_json_report,
58
+ run_grants_check,
59
+ )
60
+ from review_agent_registry import default_agents_dir
61
+
62
+ # Tiers ---------------------------------------------------------------------
63
+ NARROW = list(BASE_MCP_TOOLS)
64
+ RATIONALE = BASE_MCP_TOOLS + [GET_WHY]
65
+ _GRAPHIFY_BASH = "Bash(graphify *)"
66
+
67
+ # The canonical non-review mapping. Each agent → the tool names its tier requires
68
+ # in `tools:` (merge target, never a replacement — existing grants are preserved).
69
+ TIER_CONFIG = {
70
+ "software-engineer": NARROW,
71
+ "mutation-kill": NARROW,
72
+ "qa-engineer": NARROW,
73
+ "data-flow-tracer": NARROW + [_GRAPHIFY_BASH],
74
+ "adr-author": RATIONALE,
75
+ "architect": RATIONALE,
76
+ "security-engineer": RATIONALE,
77
+ "platform-engineer": RATIONALE,
78
+ "codebase-recon": RATIONALE,
79
+ }
80
+
81
+ # Team agents the structural sweep surfaces but the mapping deliberately does NOT
82
+ # grant (dispatch-only, non-code-structure roles). Exactly the swept agents absent
83
+ # from TIER_CONFIG — no more, no less. `session-analysis` and `mutation-kill` carry
84
+ # neither marker, so the sweep never surfaces them (they need no exclusion entry;
85
+ # mutation-kill is covered via TIER_CONFIG).
86
+ EXCLUSIONS = {
87
+ "orchestrator",
88
+ "product-manager",
89
+ "ui-ux-designer",
90
+ "tech-writer",
91
+ "progress-guardian",
92
+ }
93
+
94
+ _BEHAVIORAL_RE = re.compile(r"^##\s+Behavioral Guidelines\s*$", re.MULTILINE)
95
+ _ENFORCEMENT_RE = re.compile(r"^Enforcement:\s*script\s*$", re.MULTILINE)
96
+
97
+
98
+ def is_team_agent(text: str) -> bool:
99
+ """True if the file is a team agent per agent-audit §2c's markers.
100
+
101
+ A team agent carries a ``## Behavioral Guidelines`` section OR declares
102
+ ``Enforcement: script`` (a body-level declaration, not frontmatter — issue
103
+ #1333 — marking a script-enforced prose spec: still a team agent for
104
+ coverage purposes, just persona-exempt).
105
+ """
106
+ return bool(_BEHAVIORAL_RE.search(text) or _ENFORCEMENT_RE.search(text))
107
+
108
+
109
+ def swept_agents(agents_dir: Path) -> list[str]:
110
+ """Structural sweep (branch b): team agents minus *-review, sorted by stem."""
111
+ out = []
112
+ for path in sorted(agents_dir.glob("*.md")):
113
+ if path.name.endswith("-review.md"):
114
+ continue
115
+ if is_team_agent(path.read_text(encoding="utf-8")):
116
+ out.append(path.stem)
117
+ return out
118
+
119
+
120
+ def _targets(agents_dir: Path) -> dict[str, tuple[Path, list[str]]]:
121
+ return {name: (agents_dir / f"{name}.md", required) for name, required in TIER_CONFIG.items()}
122
+
123
+
124
+ def _unclassified(covered: list[str]) -> list[str]:
125
+ return sorted(name for name in covered if name not in TIER_CONFIG and name not in EXCLUSIONS)
126
+
127
+
128
+ def evaluate(agents_dir: Path) -> dict:
129
+ """Return the mapping report: covered set, offenders, unclassified.
130
+
131
+ covered = union of TIER_CONFIG keys (branch a) and the sweep (branch b).
132
+ offenders = {agent: missing tools} for covered config agents under-granted.
133
+ unclassified = swept team agents in neither TIER_CONFIG nor EXCLUSIONS.
134
+ """
135
+ swept = swept_agents(agents_dir)
136
+ covered = sorted(set(TIER_CONFIG) | set(swept))
137
+ offenders, _fixed, _unfixable = run_grants_check(_targets(agents_dir))
138
+
139
+ return {
140
+ "covered": covered,
141
+ "swept": swept,
142
+ "offenders": offenders,
143
+ "unclassified": _unclassified(covered),
144
+ }
145
+
146
+
147
+ def apply_fixes(agents_dir: Path) -> dict[str, list[str]]:
148
+ """Append missing tier tools to each under-granted config agent. Returns fixed map.
149
+
150
+ Unclassified agents are not auto-fixed (they need a human classification
151
+ decision) — the caller reports them and exits non-zero.
152
+ """
153
+ _offenders, fixed, _unfixable = run_grants_check(_targets(agents_dir), apply_fix=True)
154
+ return fixed
155
+
156
+
157
+ def main(argv=None) -> int:
158
+ parser = argparse.ArgumentParser(description=__doc__)
159
+ parser.add_argument("--agents-dir", type=Path, default=None)
160
+ parser.add_argument("--fix", action="store_true", help="append missing tier tools")
161
+ parser.add_argument("--json", action="store_true", help="machine-readable output")
162
+ args = parser.parse_args(argv)
163
+
164
+ agents_dir = args.agents_dir or default_agents_dir()
165
+ if not agents_dir.is_dir():
166
+ print(f"ERROR: agents directory not found: {agents_dir}", file=sys.stderr)
167
+ return 1
168
+
169
+ swept = swept_agents(agents_dir)
170
+ covered = sorted(set(TIER_CONFIG) | set(swept))
171
+ offenders, fixed, unfixable = run_grants_check(_targets(agents_dir), apply_fix=args.fix)
172
+ unclassified = _unclassified(covered)
173
+ rc = 1 if (offenders or unclassified) else 0
174
+
175
+ if args.json:
176
+ # --json owns stdout: emit ONLY the JSON object.
177
+ report = build_json_report(
178
+ "agent-tool-mapping",
179
+ covered,
180
+ offenders,
181
+ ok=(rc == 0),
182
+ fixed=fixed,
183
+ unfixable=unfixable,
184
+ unclassified=unclassified,
185
+ notes={"swept": swept},
186
+ )
187
+ print(json.dumps(report, indent=2))
188
+ return rc
189
+
190
+ if args.fix:
191
+ if fixed:
192
+ for name, added in fixed.items():
193
+ print(f"FIXED: {name} — added {', '.join(added)}")
194
+ else:
195
+ print("OK: all mapped agents already grant their tier tools.")
196
+
197
+ if offenders:
198
+ print("FAIL: non-review agents missing their tier's code-intelligence tools:")
199
+ for name, missing in offenders.items():
200
+ print(f" - {name}: missing {', '.join(missing)}")
201
+ print("\nRun: python3 plugins/dev-team/scripts/check_agent_tool_mapping.py --fix")
202
+ if unclassified:
203
+ print("FAIL: team agents in neither the mapping nor the exclusion list "
204
+ "(classify each into TIER_CONFIG or EXCLUSIONS):")
205
+ for name in unclassified:
206
+ print(f" - {name}")
207
+ if rc == 0:
208
+ print(f"OK: all {len(covered)} covered agents match the tool mapping.")
209
+ return rc
210
+
211
+
212
+ if __name__ == "__main__":
213
+ sys.exit(main())