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,296 @@
1
+ #!/usr/bin/env python3
2
+ """verify_gherkin_quality_critic_isolation.py — runtime isolation check for
3
+ the two-instance `gherkin-quality-critic` dispatch (issue #1465).
4
+
5
+ `/gherkin-derive` and `/gherkin-public` both dispatch **two independent
6
+ instances** of the `gherkin-quality-critic` agent in parallel — the whole
7
+ point being ensemble/self-consistency corroboration on the same judgment
8
+ call (see `knowledge/gherkin-quality-review-dispatch.md`). That mutual
9
+ blindness — "one message, two calls, read neither result until both are
10
+ issued" — is currently asserted only in prose and in content-guards that
11
+ check the markdown *says* the right thing. Nothing runs two real dispatches
12
+ and checks the isolation property held at runtime; a future refactor could
13
+ accidentally thread one instance's output into the other's prompt and
14
+ nothing would catch it.
15
+
16
+ This script closes that gap with a cross-contamination canary: each
17
+ instance's `.feature` fixture carries a distinct, randomly-generated marker
18
+ string embedded in its own context (mirroring how a real dispatch's cited
19
+ source text could carry incidental detail). Two fully independent `claude
20
+ -p` subprocess calls dispatch the real `gherkin-quality-critic` agent (via
21
+ the `/review-agent` skill) against each fixture — no shared mutable state, no
22
+ piping one call's output into the other's input. If either transcript
23
+ contains the *other* instance's canary, isolation was broken somewhere in the
24
+ dispatch path and the script fails loudly.
25
+
26
+ This intentionally diverges from production's "identical input to both
27
+ instances" property (see the dispatch doc) — seeding a distinct marker per
28
+ instance is what makes contamination observable at all. It does not change
29
+ what the two instances are asked to review (the fixture's Gherkin content is
30
+ otherwise identical); only the throwaway canary comment differs.
31
+
32
+ **Opt-in, paid, fail-open.** Mirrors `evals/README.md`'s "CI gate (issue
33
+ #99)" live-gate convention: this script dispatches the real `claude` CLI, so
34
+ it costs tokens and must never block anyone without eval credentials. When
35
+ the `claude` CLI is missing or `ANTHROPIC_API_KEY` is unset, it prints a
36
+ skip message and exits 0 — never a failure. It is not wired into any CI
37
+ workflow by this change; see `knowledge/gherkin-quality-review-dispatch.md`
38
+ for how to run it locally (or gate it into CI the same way the existing live
39
+ eval gate is: a label + `ANTHROPIC_API_KEY`).
40
+
41
+ Stdlib only. (ADR 0014/0015).
42
+
43
+ Usage:
44
+ python3 verify_gherkin_quality_critic_isolation.py
45
+ python3 verify_gherkin_quality_critic_isolation.py --model <model-id> --timeout 300
46
+ """
47
+
48
+ from __future__ import annotations
49
+
50
+ import argparse
51
+ import os
52
+ import secrets
53
+ import shutil
54
+ import subprocess
55
+ import sys
56
+ import tempfile
57
+ import textwrap
58
+ from pathlib import Path
59
+
60
+ _DEFAULT_TIMEOUT_SECONDS = 300.0
61
+
62
+
63
+ def _default_timeout() -> float:
64
+ """Per-dispatch subprocess timeout, overridable for local tuning."""
65
+ raw = os.environ.get("VERIFY_GHERKIN_ISOLATION_TIMEOUT")
66
+ if raw:
67
+ try:
68
+ return float(raw)
69
+ except ValueError:
70
+ pass
71
+ return _DEFAULT_TIMEOUT_SECONDS
72
+
73
+
74
+ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
75
+ parser = argparse.ArgumentParser(description=__doc__)
76
+ parser.add_argument(
77
+ "--model",
78
+ default=None,
79
+ help="model id passed to `claude -p --model` (default: omitted, so "
80
+ "`claude -p` uses its own configured default model — this script "
81
+ "does not pin a snapshot; see ADR 0026)",
82
+ )
83
+ parser.add_argument(
84
+ "--timeout",
85
+ type=float,
86
+ default=_default_timeout(),
87
+ help="per-dispatch subprocess timeout in seconds "
88
+ "(default: $VERIFY_GHERKIN_ISOLATION_TIMEOUT or 300)",
89
+ )
90
+ return parser.parse_args(argv)
91
+
92
+
93
+ def check_prerequisites() -> list[str]:
94
+ """Return missing-prerequisite messages (empty == ready to dispatch)."""
95
+ missing: list[str] = []
96
+ if shutil.which("claude") is None:
97
+ missing.append(
98
+ "the `claude` CLI (npm install -g @anthropic-ai/claude-code)"
99
+ )
100
+ if not os.environ.get("ANTHROPIC_API_KEY"):
101
+ missing.append("ANTHROPIC_API_KEY (required to dispatch a live agent call)")
102
+ return missing
103
+
104
+
105
+ def build_fixture(canary: str) -> str:
106
+ """A minimal `.feature` file with one deliberate, known finding: two
107
+ success-path variants and no failure path at all — the exact
108
+ "unbalanced coverage" / "missing failure path" case
109
+ `gherkin-quality-critic` is documented to flag. `canary` is embedded as
110
+ a throwaway leading comment, not part of the scenario content."""
111
+ return textwrap.dedent(
112
+ f"""\
113
+ # isolation-canary: {canary}
114
+ Feature: Widget creation
115
+ As a user
116
+ I want to create a widget
117
+ So that I can use it later
118
+
119
+ Scenario: Create a widget with a valid name
120
+ Given I am authenticated
121
+ When I create a widget named "Anvil"
122
+ Then the widget is created successfully
123
+
124
+ Scenario: Create a widget with a valid name and a description
125
+ Given I am authenticated
126
+ When I create a widget named "Anvil" with description "Heavy"
127
+ Then the widget is created successfully
128
+ """
129
+ )
130
+
131
+
132
+ def build_prompt(feature_path: Path, canary: str) -> str:
133
+ """Prompt for one dispatch. Asks the CLI to run gherkin-quality-critic
134
+ via the shipped /review-agent skill against exactly one fixture file,
135
+ mirroring how .github/workflows/agent-eval.yml's live gate dispatches a
136
+ named agent through its skill wrapper rather than hand-rolling the Agent
137
+ tool call."""
138
+ return textwrap.dedent(
139
+ f"""
140
+ Use the /review-agent skill to run gherkin-quality-critic against
141
+ exactly this one file: {feature_path}
142
+
143
+ Pass --path {feature_path.parent} --json so stdout carries ONLY the
144
+ agent's raw JSON result (per gherkin-quality-critic's documented
145
+ output format in agents/gherkin-quality-critic.md) — no other prose.
146
+
147
+ Context marker for this dispatch only: {canary}
148
+ This marker appears in the .feature file's opening comment purely to
149
+ verify this dispatch's isolation from any other concurrent dispatch.
150
+ It is not part of the scenario content to review — do not mention it
151
+ as a finding.
152
+ """
153
+ ).strip()
154
+
155
+
156
+ def dispatch(prompt: str, model: str | None, timeout: float) -> str | None:
157
+ """Run one fully independent `claude -p` subprocess. Returns the raw
158
+ captured stdout (the "transcript"), or None on any infrastructure
159
+ problem (CLI crash, timeout, no output) — callers must treat None as
160
+ fail-open, never as a contamination finding. `model` is only appended to
161
+ the command when explicitly given — omitted, `claude -p` resolves its
162
+ own configured default rather than this script pinning a snapshot."""
163
+ cmd = [
164
+ "claude",
165
+ "-p",
166
+ prompt,
167
+ "--output-format",
168
+ "json",
169
+ "--max-turns",
170
+ "30",
171
+ "--allowedTools",
172
+ "Read",
173
+ "Glob",
174
+ "Grep",
175
+ "Skill(review-agent *)",
176
+ "Agent",
177
+ ]
178
+ if model:
179
+ cmd += ["--model", model]
180
+ try:
181
+ proc = subprocess.run(
182
+ cmd,
183
+ capture_output=True,
184
+ text=True,
185
+ timeout=timeout,
186
+ check=False,
187
+ )
188
+ except (OSError, subprocess.TimeoutExpired) as exc:
189
+ print(
190
+ f"SKIP: dispatch could not run ({exc}) — treating as an "
191
+ "infrastructure problem, not a contamination finding.",
192
+ file=sys.stderr,
193
+ )
194
+ return None
195
+ if not proc.stdout.strip():
196
+ print(
197
+ f"SKIP: dispatch produced no output (exit {proc.returncode}); "
198
+ f"stderr: {proc.stderr.strip()[:300]}",
199
+ file=sys.stderr,
200
+ )
201
+ return None
202
+ return proc.stdout
203
+
204
+
205
+ def check_cross_contamination(
206
+ transcript_a: str, transcript_b: str, canary_a: str, canary_b: str
207
+ ) -> list[str]:
208
+ """Return a list of contamination violations (empty == isolation held).
209
+
210
+ A violation is instance A's transcript containing instance B's canary
211
+ (or vice versa) — the marker seeded only into the OTHER instance's
212
+ fixture context. Either direction means output/context leaked across
213
+ the two supposedly-independent dispatches.
214
+ """
215
+ violations: list[str] = []
216
+ if canary_b in transcript_a:
217
+ violations.append(
218
+ f"instance A's transcript contains instance B's canary marker "
219
+ f"({canary_b}) — dispatch isolation broken"
220
+ )
221
+ if canary_a in transcript_b:
222
+ violations.append(
223
+ f"instance B's transcript contains instance A's canary marker "
224
+ f"({canary_a}) — dispatch isolation broken"
225
+ )
226
+ return violations
227
+
228
+
229
+ def main(argv: list[str] | None = None) -> int:
230
+ args = parse_args(argv)
231
+
232
+ missing = check_prerequisites()
233
+ if missing:
234
+ print(
235
+ "SKIP: gherkin-quality-critic isolation check requires a live "
236
+ "dispatch and cannot run here:"
237
+ )
238
+ for item in missing:
239
+ print(f" - {item}")
240
+ print(
241
+ "This is an opt-in, paid, live check (mirrors evals/README.md's "
242
+ "CI gate) — skipping, not failing."
243
+ )
244
+ return 0
245
+
246
+ canary_a = f"ISOLATION-CANARY-A-{secrets.token_hex(8)}"
247
+ canary_b = f"ISOLATION-CANARY-B-{secrets.token_hex(8)}"
248
+
249
+ with tempfile.TemporaryDirectory(prefix="gherkin-isolation-") as tmp:
250
+ tmp_path = Path(tmp)
251
+ dir_a = tmp_path / "instance_a"
252
+ dir_b = tmp_path / "instance_b"
253
+ dir_a.mkdir()
254
+ dir_b.mkdir()
255
+ feature_a = dir_a / "widget_creation.feature"
256
+ feature_b = dir_b / "widget_creation.feature"
257
+ feature_a.write_text(build_fixture(canary_a))
258
+ feature_b.write_text(build_fixture(canary_b))
259
+
260
+ prompt_a = build_prompt(feature_a, canary_a)
261
+ prompt_b = build_prompt(feature_b, canary_b)
262
+
263
+ # Two fully independent subprocess calls — no shared mutable state,
264
+ # no piping one call's output into the other's prompt.
265
+ transcript_a = dispatch(prompt_a, args.model, args.timeout)
266
+ transcript_b = dispatch(prompt_b, args.model, args.timeout)
267
+
268
+ if transcript_a is None or transcript_b is None:
269
+ print(
270
+ "SKIP: one or both dispatches did not produce usable output — "
271
+ "treating as an infrastructure problem, not a contamination "
272
+ "finding."
273
+ )
274
+ return 0
275
+
276
+ violations = check_cross_contamination(
277
+ transcript_a, transcript_b, canary_a, canary_b
278
+ )
279
+ if violations:
280
+ print(
281
+ "FAIL: cross-contamination detected between mutually-blind "
282
+ "gherkin-quality-critic dispatches:"
283
+ )
284
+ for v in violations:
285
+ print(f" - {v}")
286
+ return 1
287
+
288
+ print(
289
+ "OK: both gherkin-quality-critic dispatches completed with no "
290
+ "cross-contamination detected."
291
+ )
292
+ return 0
293
+
294
+
295
+ if __name__ == "__main__": # pragma: no cover
296
+ sys.exit(main())
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env python3
2
+ """Resolve a review agent's verification-mode model/effort tier (#1628).
3
+
4
+ When a fix loop re-dispatches an agent to CONFIRM a fix, the task is far
5
+ narrower than discovery — "here is the finding, here is the fix diff:
6
+ resolved or not?" — but the dispatch costs the same. An agent may opt in to a
7
+ cheaper tier for verification dispatches only, by declaring in its **body**:
8
+
9
+ Verify-model: haiku
10
+ Verify-effort: medium
11
+
12
+ Body declarations, not frontmatter: issue #1333 reserves agent frontmatter
13
+ for the official Claude Code sub-agent contract recorded in
14
+ `plugins/marketplace-dev/knowledge/agent-contract.json` (a dated snapshot of
15
+ upstream docs, not a schema this plugin may extend). `Scope:`, `Cites:`, and
16
+ `Enforcement:` follow the same rule. Claude Code silently ignores unknown
17
+ frontmatter keys, so a frontmatter typo would also have been invisible; a
18
+ body declaration this script parses is checkable.
19
+
20
+ **Declared, never inferred.** With no opt-in, the returned tier is the
21
+ agent's own discovery tier — unchanged. That default is deliberate: #1619
22
+ showed some confirmations genuinely need top-tier judgment (the ECMA-402
23
+ receiver-binding call), so tiering down is opt-in per agent, never a blanket
24
+ rule and never derived from a finding's severity.
25
+
26
+ Full contract: `knowledge/verification-mode.md`.
27
+
28
+ Usage:
29
+ python3 verify_tier.py --agent structure-review
30
+ python3 verify_tier.py --all
31
+
32
+ Stdlib-only. See docs/python-hook-contract.md.
33
+ """
34
+
35
+ from __future__ import annotations
36
+
37
+ import argparse
38
+ import json
39
+ import re
40
+ import sys
41
+ from pathlib import Path
42
+
43
+ # scripts/verify_tier.py -> scripts -> plugin root
44
+ _PLUGIN_ROOT = Path(__file__).resolve().parents[1]
45
+ _AGENTS_DIR = _PLUGIN_ROOT / "agents"
46
+
47
+ _VERIFY_MODEL_RE = re.compile(r"^\s*Verify-model\s*:\s*(\S+)\s*$", re.IGNORECASE)
48
+ _VERIFY_EFFORT_RE = re.compile(r"^\s*Verify-effort\s*:\s*(\S+)\s*$", re.IGNORECASE)
49
+ _FM_MODEL_RE = re.compile(r"^\s*model\s*:\s*(\S+)\s*$")
50
+ _FM_EFFORT_RE = re.compile(r"^\s*effort\s*:\s*(\S+)\s*$")
51
+
52
+ #: Same closed enums the official contract declares for `model:`/`effort:`
53
+ #: (agent-contract.json). A declaration outside these is a typo, not a new
54
+ #: tier — reported as an error rather than passed through to a dispatch that
55
+ #: would fail at runtime.
56
+ VALID_MODELS = frozenset({"sonnet", "opus", "haiku", "fable", "inherit"})
57
+ VALID_EFFORTS = frozenset({"low", "medium", "high", "xhigh", "max"})
58
+
59
+
60
+ def _split(text: str) -> tuple[str, str]:
61
+ """Return `(frontmatter, body)`. A file without frontmatter is all body."""
62
+ if not text.startswith("---"):
63
+ return "", text
64
+ end = text.find("\n---", 3)
65
+ if end == -1:
66
+ return "", text
67
+ after = text.find("\n", end + 1)
68
+ return text[3:end], (text[after + 1 :] if after != -1 else "")
69
+
70
+
71
+ def resolve(text: str, agent: str = "") -> dict:
72
+ """Resolve the verification tier from one agent file's contents.
73
+
74
+ Returns `{"agent", "model", "effort", "opted_in", "errors"}`. `model` and
75
+ `effort` are the values to dispatch this agent at in verification mode —
76
+ already falling back to the frontmatter (discovery) values when no opt-in
77
+ is declared, so a caller never needs its own fallback logic.
78
+
79
+ An invalid declared value is reported in `errors` and **ignored** for that
80
+ field, which falls back to the discovery tier. Failing closed to the more
81
+ expensive tier is the right direction: a typo must never silently make a
82
+ review cheaper than intended.
83
+ """
84
+ frontmatter, body = _split(text)
85
+ errors = []
86
+
87
+ discovery_model = _first(_FM_MODEL_RE, frontmatter) or "inherit"
88
+ discovery_effort = _first(_FM_EFFORT_RE, frontmatter) or "inherit"
89
+
90
+ verify_model = _first(_VERIFY_MODEL_RE, body)
91
+ verify_effort = _first(_VERIFY_EFFORT_RE, body)
92
+
93
+ if verify_model is not None and verify_model.lower() not in VALID_MODELS:
94
+ errors.append(
95
+ f"Verify-model: {verify_model!r} is not one of {sorted(VALID_MODELS)}"
96
+ )
97
+ verify_model = None
98
+ if verify_effort is not None and verify_effort.lower() not in VALID_EFFORTS:
99
+ errors.append(
100
+ f"Verify-effort: {verify_effort!r} is not one of {sorted(VALID_EFFORTS)}"
101
+ )
102
+ verify_effort = None
103
+
104
+ opted_in = verify_model is not None or verify_effort is not None
105
+ return {
106
+ "agent": agent,
107
+ "model": (verify_model or discovery_model).lower(),
108
+ "effort": (verify_effort or discovery_effort).lower(),
109
+ "opted_in": opted_in,
110
+ "errors": errors,
111
+ }
112
+
113
+
114
+ def _first(pattern, text: str):
115
+ for line in text.splitlines():
116
+ match = pattern.match(line)
117
+ if match:
118
+ return match.group(1)
119
+ return None
120
+
121
+
122
+ def resolve_agent(name: str, agents_dir: Path | None = None) -> dict:
123
+ path = (agents_dir or _AGENTS_DIR) / f"{name}.md"
124
+ if not path.is_file():
125
+ return {
126
+ "agent": name,
127
+ "model": "inherit",
128
+ "effort": "inherit",
129
+ "opted_in": False,
130
+ "errors": [f"no such agent file: {path}"],
131
+ }
132
+ return resolve(path.read_text(encoding="utf-8"), name)
133
+
134
+
135
+ def main(argv=None) -> int:
136
+ parser = argparse.ArgumentParser(description="Resolve verification-mode dispatch tiers.")
137
+ group = parser.add_mutually_exclusive_group(required=True)
138
+ group.add_argument("--agent", help="Agent name (without .md)")
139
+ group.add_argument("--all", action="store_true", help="Every review agent")
140
+ parser.add_argument("--agents-dir", type=Path, default=_AGENTS_DIR)
141
+ args = parser.parse_args(argv)
142
+
143
+ if args.agent:
144
+ result = resolve_agent(args.agent, args.agents_dir)
145
+ print(json.dumps(result, sort_keys=True))
146
+ return 1 if result["errors"] else 0
147
+
148
+ results = [
149
+ resolve_agent(path.stem, args.agents_dir)
150
+ for path in sorted(args.agents_dir.glob("*-review.md"))
151
+ ]
152
+ print(json.dumps({"agents": results}, sort_keys=True))
153
+ return 1 if any(r["errors"] for r in results) else 0
154
+
155
+
156
+ if __name__ == "__main__":
157
+ raise SystemExit(main(sys.argv[1:]))
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: adr-tools
3
+ description: Create and manage Architecture Decision Records using the npryce adr-tools CLI. Use when the user asks to "add an ADR", "record this decision", "create an ADR", "supersede ADR N", "link ADRs", "generate the ADR table of contents", or any request involving the `adr` command. Pairs with the adr-author agent — this skill is the mechanics (commands, files, links); adr-author is the decision framework (when an ADR is warranted) and the prose authoring.
4
+ role: worker
5
+ user-invocable: true
6
+ ---
7
+
8
+ # ADR Tools
9
+
10
+ Mechanics for working with [npryce/adr-tools](https://github.com/npryce/adr-tools) — the `adr` CLI that creates numbered Architecture Decision Records. Pairs with the [`adr-author`](../../agents/adr-author.md) agent: that agent decides *whether* an ADR is warranted and writes the prose; this skill drives the CLI correctly.
11
+
12
+ ## Pre-flight
13
+
14
+ ```bash
15
+ command -v adr || echo "adr-tools not installed — see https://github.com/npryce/adr-tools"
16
+ cat .adr-dir 2>/dev/null # project's configured ADR directory
17
+ ls "$(cat .adr-dir 2>/dev/null || echo docs/adr)/" 2>/dev/null | head -3
18
+ ```
19
+
20
+ If the pre-flight reports `adr` missing, run `/project-init` to set up this repo's tooling — it installs the `adr` CLI as a capability tool (see its `${CLAUDE_PLUGIN_ROOT}/skills/project-init/references/capability-tools.md`) — or install it directly: see [npryce/adr-tools](https://github.com/npryce/adr-tools) (the CLI link is the fallback).
21
+
22
+ Project convention is `docs/adr/`. `adr-tools` stores the directory in `.adr-dir` at the project root — `adr` reads that file to find the ADRs no matter what subdirectory you're in. If `.adr-dir` is missing, run `adr init docs/adr` once. Do not init silently into a different path — confirm with the user if existing ADRs live somewhere unexpected.
23
+
24
+ ## Editor caveat — the most common failure
25
+
26
+ `adr new` opens `$VISUAL` or `$EDITOR` (defaulting to `vi`). In a Claude Code shell this hangs the command and exits non-zero — the file is created but empty. Two workarounds:
27
+
28
+ 1. **Preferred — bypass the editor.** Run with a no-op editor, then write the body with the Write tool:
29
+
30
+ ```bash
31
+ EDITOR=true VISUAL=true adr new "<title>"
32
+ ```
33
+
34
+ The command prints the new file path to stdout. Read it, then replace the template Context/Decision/Consequences sections with the real content via Edit or Write.
35
+
36
+ 2. **Fallback — let it fail, then fill in.** `adr new "<title>"` will create the templated file and exit non-zero from the editor failure. Read the new file (it lives at `<adr-dir>/NNNN-<slugified-title>.md` — typically `docs/adr/`) and fill it in.
37
+
38
+ The skill always prefers workaround 1.
39
+
40
+ ## Workflows
41
+
42
+ ### Create a new ADR
43
+
44
+ ```bash
45
+ EDITOR=true VISUAL=true adr new "<title in plain words>"
46
+ ```
47
+
48
+ Then Edit the generated file to fill in:
49
+
50
+ - **Status** — `Accepted` (default) is fine for decisions already made. Use `Proposed` only if there is genuine open debate.
51
+ - **Context** — what forces drove this decision (constraints, alternatives considered, prior art)
52
+ - **Decision** — what we are doing (active voice, present tense: "Adopt X" not "We will adopt X")
53
+ - **Consequences** — easier / harder / risks. Be specific. If you cannot name a concrete trade-off, the decision probably did not need an ADR.
54
+
55
+ Commit the new ADR in the same commit (or PR) as the implementation it justifies.
56
+
57
+ ### Supersede an earlier ADR
58
+
59
+ ```bash
60
+ EDITOR=true VISUAL=true adr new -s <N> "<new title>"
61
+ ```
62
+
63
+ `adr-tools` automatically:
64
+
65
+ - Inserts a "Supersedes [ADR N](N-old-title.md)" link in the new ADR's Status section.
66
+ - Edits ADR N's Status to "Superseded by [ADR M](M-new-title.md)".
67
+
68
+ Do not delete the old ADR. Its history is the point.
69
+
70
+ ### Link two ADRs without superseding
71
+
72
+ ```bash
73
+ adr link <SOURCE> "<LINK>" <TARGET> "<REVERSE-LINK>"
74
+ ```
75
+
76
+ Example: `adr link 12 "Amends" 10 "Amended by"`. Use this for relationships like Amends/Refines/Constrains. Multiple links are normal.
77
+
78
+ ### List all ADRs
79
+
80
+ ```bash
81
+ adr list
82
+ ```
83
+
84
+ Returns sorted file paths. Pipe through `xargs head -1` for a quick title scan.
85
+
86
+ ### Generate the table of contents
87
+
88
+ ```bash
89
+ adr generate toc > docs/adr/README.md
90
+ ```
91
+
92
+ Run this after creating or superseding any ADR, then commit the regenerated TOC alongside the ADR change. Without this, the index drifts.
93
+
94
+ ### Generate the dependency graph
95
+
96
+ ```bash
97
+ adr generate graph | dot -Tpng > docs/adr/graph.png
98
+ ```
99
+
100
+ Optional but useful when supersede/link chains get deep. Requires Graphviz (`dot`).
101
+
102
+ ## Anti-patterns to refuse
103
+
104
+ - **Don't renumber ADRs.** `adr-tools` assigns sequential numbers; references in commits, PRs, and other ADRs depend on them being stable. If a number is wrong, supersede; never renumber.
105
+ - **Don't edit ADR status with a text editor when superseding.** Use `adr new -s <N>` so the bidirectional link is automatic and consistent.
106
+ - **Don't squash multiple decisions into one ADR.** One decision per file. If a "Decision" section has multiple bullets that are not facets of the same choice, split.
107
+ - **Don't write Decision in future tense.** "We will adopt X" reads as a proposal; "Adopt X" reads as a decision. Use the latter for `Accepted` status.
108
+ - **Don't omit Consequences.** An ADR without trade-offs is a note, not a decision record. If there genuinely are no consequences, the decision did not need an ADR — defer to the [`adr-author`](../../agents/adr-author.md) decision framework.
109
+
110
+ ## When to defer to adr-author
111
+
112
+ This skill handles the CLI mechanics. Use the [`adr-author`](../../agents/adr-author.md) agent when:
113
+
114
+ - It is unclear whether the change *warrants* an ADR (see its decision framework).
115
+ - The decision has policy or architectural implications and you want prose with the right scope.
116
+ - You need to maintain the ADR index README beyond what `adr generate toc` produces.
117
+
118
+ A typical flow: the user asks "should we ADR this?" → adr-author decides yes/no and drafts the body → this skill runs the `adr new` / `adr link` commands and regenerates the TOC.
@@ -0,0 +1,105 @@
1
+ ---
2
+ name: agent-readiness
3
+ description: >-
4
+ Score how ready the current repository is for AI-assisted development against
5
+ the Agent-Readiness Scorecard. Use when the user asks "how agent-ready is this
6
+ repo", "score this repo for agents", "agent readiness", or wants a tiered
7
+ readiness report. Scores YOUR project repo's readiness — not the dev-team
8
+ plugin's own review agents and routing (for that, use /harness-audit).
9
+ argument-hint: "[repo-path] [--json <file>] [--markdown <file>]"
10
+ user-invocable: true
11
+ allowed-tools: >-
12
+ Bash(python3 *), Read, Glob
13
+ ---
14
+
15
+ # Agent-Readiness Scanner (MVP)
16
+
17
+ Role: worker. Scores a **single local repository** against the Agent-Readiness
18
+ Scorecard and reports a tier (Agent-Ready / Assisted / Limited / Hostile) with
19
+ per-criterion evidence.
20
+
21
+ > **Not `/harness-audit`.** This scores the **subject repository** (your
22
+ > project's build, code quality, docs, and version-control hygiene) from a
23
+ > static checkout. `/harness-audit` audits the **dev-team plugin's own harness**
24
+ > (review-agent effectiveness, model tiers, orchestration) from accumulated
25
+ > runtime metrics. Different subject, different input, different output.
26
+
27
+ ## Scope (MVP — issue #117)
28
+
29
+ This MVP uses **file-presence/heuristic analyzers only** — no CI-platform APIs.
30
+ It scores the criteria that can be judged from a checkout:
31
+
32
+ - **Build & Env:** B2 reproducible env, B3 dependency lock files, B5 composite check command
33
+ - **Code Quality:** C1 formatting, C2 linting, C4 module size (p90 line count)
34
+ - **Documentation:** D1 README, D2 AI instructions, D3 architecture docs,
35
+ D5 CLAUDE.md size, D6 layered context
36
+ - **Version Control:** V2 pre-commit hooks, V3 commit conventions, V4 dep scanning
37
+
38
+ D5, D6, B5 (and the manual-review-only D7) implement the AI-friendly repository
39
+ rubric in [`knowledge/ai-friendly-repo-guidelines.md`](../../knowledge/ai-friendly-repo-guidelines.md),
40
+ the canonical source for the rationale; evidence strings link to its anchors.
41
+ Colocated-test and directory-depth criteria are a deferred follow-up.
42
+
43
+ **Score shift (scorecard 1.1-mvp).** Adding D5, D6 and B5 changes the
44
+ documentation and build_env category percentages, and so the renormalized
45
+ overall score, for repos scanned before this version. The shift is accepted;
46
+ tier thresholds are unchanged. Compare scores only within one scorecard
47
+ version (`scanner_version` in the JSON).
48
+
49
+ Criteria that need CI-platform data (coverage, flaky rate, durations, branch
50
+ policy — T1–T5, B1, B4, C5, S1–S4, V1) and the org-scale Azure DevOps / Jenkins
51
+ discovery from the original plan are **deferred** to follow-up phases.
52
+ Categories with no MVP criterion (test infrastructure, type safety) are reported
53
+ as `deferred` and excluded from the renormalized overall score.
54
+
55
+ ## Evidence table
56
+
57
+ Each scored criterion emits `score` (0-2), `max`, and an `evidence` string. The
58
+ new criteria use `found X; threshold Y; to fix: Z (see <guide>#anchor)`.
59
+ N/A results (`max` 0, e.g. D5 when no AI-instructions file exists; see D2) are
60
+ exempt: they carry a plain-text reason and add nothing to the category score.
61
+
62
+ | Criterion | Category | Scores on | Threshold (scorecard.yaml) |
63
+ | --- | --- | --- | --- |
64
+ | B2_reproducible_env | build_env | devcontainer/compose/nix/Dockerfile | presence |
65
+ | B3_dependency_management | build_env | committed lock files | presence |
66
+ | B5_composite_check_command | build_env | `check`/`verify`/`ci`/`all` target running lint and test | `check_target_names` |
67
+ | C1_formatting | code_quality | formatter config + CI step | presence |
68
+ | C2_linting | code_quality | linter config + CI step | presence |
69
+ | C4_module_size | code_quality | p90 source-file line count | `file_size_p90_*` |
70
+ | D1_readme | documentation | README words + setup/build/test | `readme_min_words` |
71
+ | D2_ai_instructions | documentation | AI-instructions file present and detailed | `ai_instructions_min_words` |
72
+ | D3_architecture_docs | documentation | ADRs / architecture docs | presence |
73
+ | D5_claude_md_size | documentation | instructions-file line count (N/A when none; see D2) | `claude_md_max_lines`, `claude_md_hard_max_lines` |
74
+ | D6_layered_context | documentation | non-empty nested CLAUDE.md or `.claude/rules/*.md` | presence |
75
+ | V2_precommit_hooks | vcs_safety | pre-commit hook config | presence |
76
+ | V3_commit_conventions | vcs_safety | commitlint tooling + enforcement | presence |
77
+ | V4_dependency_scanning | vcs_safety | dependabot/renovate/snyk config | presence |
78
+
79
+ Manual review only (never scored): C3, S3, D4, **D7_reference_implementation**
80
+ (is a canonical reference implementation named in CLAUDE.md, and well chosen?).
81
+
82
+ ## Run
83
+
84
+ ```bash
85
+ python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-readiness/scanner.py" [REPO_PATH] \
86
+ [--json out.json] [--markdown out.md]
87
+ ```
88
+
89
+ - `REPO_PATH` defaults to the current directory.
90
+ - With no `--json`/`--markdown`, prints the JSON result and a Markdown summary.
91
+ - Weights, tier thresholds, and per-criterion thresholds live in
92
+ `scorecard.yaml` next to the scanner — edit there to tune; no code change.
93
+
94
+ ## Steps
95
+
96
+ 1. Run the scanner against the target repo (default: current repo).
97
+ 2. Report the tier and overall score, then the per-criterion evidence table.
98
+ 3. Surface `manual_review_flags` (C3/S3/D4/D7 are heuristic-weak and need human
99
+ judgment) and the list of deferred categories, so the score is not
100
+ mistaken for a full assessment.
101
+ 4. If asked, suggest the highest-leverage improvements (lowest-scoring MVP
102
+ criteria first).
103
+
104
+ Do not invent scores — report exactly what the scanner emits, including its
105
+ evidence strings.