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,441 @@
1
+ #!/usr/bin/env python3
2
+ """Agent-readiness scanner — MVP (issue #117).
3
+
4
+ Scores a SINGLE LOCAL REPOSITORY against the Agent-Readiness Scorecard using
5
+ file-presence/heuristic analyzers only (no CI-platform APIs). Emits per-repo
6
+ JSON (with `evidence` strings and `manual_review_flags`) and a Markdown tier
7
+ summary. Weights and thresholds are externalized to scorecard.yaml.
8
+
9
+ Placement decision (recorded per the issue): shipped as an in-plugin skill
10
+ (`/agent-readiness`) that scores the current working repo locally. The org-scale
11
+ Azure DevOps / Jenkins scanner from the plan stays a deferred follow-up.
12
+
13
+ Usage:
14
+ python3 scanner.py [REPO_PATH] [--config scorecard.yaml]
15
+ [--json out.json] [--markdown out.md]
16
+ Defaults: REPO_PATH=., config=<this dir>/scorecard.yaml, reports to stdout.
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import argparse
22
+ import json
23
+ import sys
24
+ from pathlib import Path
25
+
26
+ HERE = Path(__file__).resolve().parent
27
+ # skills/agent-readiness -> skills -> dev-team -> hooks/lib (stdlib-only YAML
28
+ # subset parser; see ADR 0014/0015 — no third-party imports in shipped code).
29
+ sys.path.insert(0, str(HERE.parents[1] / "hooks" / "lib"))
30
+ from minimal_yaml import parse_yaml
31
+
32
+ sys.path.insert(0, str(HERE))
33
+ from ai_friendly_analyzers import (
34
+ AI_FRIENDLY_ANALYZERS,
35
+ INSTRUCTION_FILES,
36
+ reset_walk_cache,
37
+ walk_files,
38
+ )
39
+
40
+ # --------------------------------------------------------------------------
41
+ # Small filesystem helpers (all detection is file-presence/heuristic).
42
+ # --------------------------------------------------------------------------
43
+
44
+
45
+ def _exists(root: Path, *names: str) -> str | None:
46
+ for n in names:
47
+ if (root / n).exists():
48
+ return n
49
+ return None
50
+
51
+
52
+ def _glob_any(root: Path, *patterns: str) -> str | None:
53
+ for p in patterns:
54
+ for hit in root.glob(p):
55
+ return str(hit.relative_to(root))
56
+ return None
57
+
58
+
59
+ def _ci_files(root: Path) -> list[Path]:
60
+ out = []
61
+ for pat in (
62
+ ".github/workflows/*.yml",
63
+ ".github/workflows/*.yaml",
64
+ "Jenkinsfile",
65
+ ".gitlab-ci.yml",
66
+ "azure-pipelines.yml",
67
+ ".azure-pipelines.yml",
68
+ ):
69
+ out.extend(root.glob(pat))
70
+ return [p for p in out if p.is_file()]
71
+
72
+
73
+ def _ci_mentions(root: Path, *needles: str) -> bool:
74
+ for f in _ci_files(root):
75
+ try:
76
+ text = f.read_text(errors="ignore").lower()
77
+ except OSError:
78
+ continue
79
+ if any(n in text for n in needles):
80
+ return True
81
+ return False
82
+
83
+
84
+ def _score(n: int, evidence: str) -> dict:
85
+ return {"score": n, "max": 2, "evidence": evidence}
86
+
87
+
88
+ # --------------------------------------------------------------------------
89
+ # Analyzers — each returns {score, max, evidence}. MVP: file-presence only.
90
+ # --------------------------------------------------------------------------
91
+
92
+
93
+ def b2_reproducible_env(root: Path, cfg: dict) -> dict:
94
+ strong = _exists(
95
+ root,
96
+ ".devcontainer/devcontainer.json",
97
+ "flake.nix",
98
+ "docker-compose.yml",
99
+ "docker-compose.yaml",
100
+ "compose.yaml",
101
+ )
102
+ if strong:
103
+ return _score(2, f"{strong} present (full reproducible environment)")
104
+ if _exists(root, "Dockerfile"):
105
+ return _score(1, "Dockerfile only (no devcontainer/compose/nix)")
106
+ return _score(0, "no Dockerfile/devcontainer/compose/nix")
107
+
108
+
109
+ LOCK_FILES = [
110
+ "package-lock.json",
111
+ "yarn.lock",
112
+ "pnpm-lock.yaml",
113
+ "poetry.lock",
114
+ "Pipfile.lock",
115
+ "go.sum",
116
+ "Cargo.lock",
117
+ "composer.lock",
118
+ "uv.lock",
119
+ "Gemfile.lock",
120
+ ]
121
+
122
+
123
+ def b3_dependency_management(root: Path, cfg: dict) -> dict:
124
+ found = [f for f in LOCK_FILES if (root / f).exists()]
125
+ if not found:
126
+ return _score(0, "no lock file found")
127
+ gi = root / ".gitignore"
128
+ ignored = gi.exists() and any(f in gi.read_text(errors="ignore") for f in found)
129
+ if ignored:
130
+ return _score(1, f"lock file(s) {found} present but matched in .gitignore")
131
+ return _score(2, f"lock file(s) committed: {', '.join(found)}")
132
+
133
+
134
+ def c1_formatting(root: Path, cfg: dict) -> dict:
135
+ cfgfile = _glob_any(
136
+ root, ".prettierrc*", ".editorconfig", "rustfmt.toml"
137
+ ) or _pyproject_has(root, "[tool.black]", "[tool.ruff.format]")
138
+ if not cfgfile:
139
+ return _score(0, "no formatter config")
140
+ if _ci_mentions(root, "prettier", "format", "fmt", "ruff format"):
141
+ return _score(2, f"formatter config ({cfgfile}) + CI format step")
142
+ return _score(1, f"formatter config ({cfgfile}) but no CI enforcement found")
143
+
144
+
145
+ def c2_linting(root: Path, cfg: dict) -> dict:
146
+ cfgfile = _glob_any(
147
+ root,
148
+ ".eslintrc*",
149
+ "eslint.config.*",
150
+ "ruff.toml",
151
+ ".pylintrc",
152
+ "pylintrc",
153
+ ".golangci.yml",
154
+ ".golangci.yaml",
155
+ ) or _pyproject_has(root, "[tool.ruff]", "[tool.pylint]")
156
+ if not cfgfile:
157
+ return _score(0, "no linter config")
158
+ if _ci_mentions(root, "lint", "eslint", "ruff check", "golangci"):
159
+ return _score(2, f"linter config ({cfgfile}) + CI lint step")
160
+ return _score(1, f"linter config ({cfgfile}) but no CI enforcement found")
161
+
162
+
163
+ def c4_module_size(root: Path, cfg: dict) -> dict:
164
+ exts = set(cfg.get("source_extensions", []))
165
+ excl = set(cfg.get("exclude_dirs", []))
166
+ counts = []
167
+ for f in walk_files(root, excl):
168
+ if f.suffix not in exts:
169
+ continue
170
+ try:
171
+ counts.append(sum(1 for _ in f.open(errors="ignore")))
172
+ except OSError:
173
+ continue
174
+ if not counts:
175
+ return _score(0, "no source files detected for size analysis")
176
+ counts.sort()
177
+ p90 = counts[min(len(counts) - 1, round(0.9 * (len(counts) - 1)))]
178
+ th = cfg["thresholds"]
179
+ if p90 <= th["file_size_p90_small"]:
180
+ return _score(
181
+ 2, f"p90 source file = {p90} lines (<= {th['file_size_p90_small']})"
182
+ )
183
+ if p90 <= th["file_size_p90_large"]:
184
+ return _score(1, f"p90 source file = {p90} lines")
185
+ return _score(0, f"p90 source file = {p90} lines (> {th['file_size_p90_large']})")
186
+
187
+
188
+ def d1_readme(root: Path, cfg: dict) -> dict:
189
+ readme = _exists(root, "README.md", "README.rst", "README")
190
+ if not readme:
191
+ return _score(0, "no README")
192
+ text = (root / readme).read_text(errors="ignore")
193
+ words = len(text.split())
194
+ low = text.lower()
195
+ has_sections = (
196
+ all(k in low for k in ("setup",))
197
+ and any(k in low for k in ("build", "install"))
198
+ and "test" in low
199
+ )
200
+ min_words = cfg["thresholds"]["readme_min_words"]
201
+ if words >= min_words and has_sections:
202
+ return _score(2, f"README {words} words with setup/build/test sections")
203
+ if words > 0:
204
+ return _score(
205
+ 1, f"README present ({words} words) but thin or missing setup/build/test"
206
+ )
207
+ return _score(0, "README empty")
208
+
209
+
210
+ def d2_ai_instructions(root: Path, cfg: dict) -> dict:
211
+ f = _exists(root, *INSTRUCTION_FILES)
212
+ if not f:
213
+ return _score(
214
+ 0, "no AI-instructions file (CLAUDE.md/AGENTS.md/.cursorrules/...)"
215
+ )
216
+ words = len((root / f).read_text(errors="ignore").split())
217
+ if words >= cfg["thresholds"]["ai_instructions_min_words"]:
218
+ return _score(2, f"{f} present ({words} words, detailed)")
219
+ return _score(1, f"{f} present but brief ({words} words)")
220
+
221
+
222
+ def d3_architecture_docs(root: Path, cfg: dict) -> dict:
223
+ f = _glob_any(
224
+ root,
225
+ "docs/adr/*",
226
+ "docs/architecture*",
227
+ "docs/design*",
228
+ "ARCHITECTURE.md",
229
+ "docs/decisions/*",
230
+ )
231
+ if f:
232
+ return _score(2, f"architecture docs present ({f})")
233
+ return _score(0, "no architecture docs (docs/adr, ARCHITECTURE.md, ...)")
234
+
235
+
236
+ def v2_precommit_hooks(root: Path, cfg: dict) -> dict:
237
+ f = _exists(
238
+ root, ".pre-commit-config.yaml", ".husky", "lefthook.yml", "lefthook.yaml"
239
+ ) or _glob_any(root, ".lintstagedrc*")
240
+ if not f:
241
+ return _score(0, "no pre-commit hook config")
242
+ if _ci_mentions(root, "pre-commit") or f == ".pre-commit-config.yaml":
243
+ return _score(2, f"pre-commit hooks configured ({f})")
244
+ return _score(1, f"partial hook config ({f})")
245
+
246
+
247
+ def v3_commit_conventions(root: Path, cfg: dict) -> dict:
248
+ f = _glob_any(root, "commitlint.config.*", ".commitlintrc*")
249
+ if f:
250
+ enforced = _ci_mentions(root, "commitlint") or (root / ".husky").exists()
251
+ return _score(
252
+ 2 if enforced else 1,
253
+ f"commit-convention tooling ({f})"
254
+ + ("" if enforced else " but no CI/hook enforcement found"),
255
+ )
256
+ return _score(0, "no commit-convention tooling")
257
+
258
+
259
+ def v4_dependency_scanning(root: Path, cfg: dict) -> dict:
260
+ found = [
261
+ n
262
+ for n in (
263
+ ".github/dependabot.yml",
264
+ ".github/dependabot.yaml",
265
+ ".snyk",
266
+ "renovate.json",
267
+ ".renovaterc",
268
+ ".renovaterc.json",
269
+ )
270
+ if (root / n).exists()
271
+ ]
272
+ if not found:
273
+ return _score(0, "no dependency-scanning config")
274
+ return _score(
275
+ 2 if len(found) >= 1 else 1,
276
+ f"dependency scanning configured: {', '.join(found)}",
277
+ )
278
+
279
+
280
+ def _pyproject_has(root: Path, *sections: str) -> str | None:
281
+ p = root / "pyproject.toml"
282
+ if not p.exists():
283
+ return None
284
+ text = p.read_text(errors="ignore")
285
+ if any(s in text for s in sections):
286
+ return "pyproject.toml"
287
+ return None
288
+
289
+
290
+ ANALYZERS = {
291
+ "B2_reproducible_env": b2_reproducible_env,
292
+ "B3_dependency_management": b3_dependency_management,
293
+ "C1_formatting": c1_formatting,
294
+ "C2_linting": c2_linting,
295
+ "C4_module_size": c4_module_size,
296
+ "D1_readme": d1_readme,
297
+ "D2_ai_instructions": d2_ai_instructions,
298
+ "D3_architecture_docs": d3_architecture_docs,
299
+ "V2_precommit_hooks": v2_precommit_hooks,
300
+ "V3_commit_conventions": v3_commit_conventions,
301
+ "V4_dependency_scanning": v4_dependency_scanning,
302
+ }
303
+ ANALYZERS.update(AI_FRIENDLY_ANALYZERS)
304
+
305
+
306
+ # --------------------------------------------------------------------------
307
+ # Scorer.
308
+ # --------------------------------------------------------------------------
309
+
310
+
311
+ def scan(root: Path, cfg: dict) -> dict:
312
+ reset_walk_cache()
313
+ weights = cfg["weights"]
314
+ categories = {}
315
+ manual_flags = []
316
+
317
+ for cat, crits in cfg["criteria"].items():
318
+ scored, raw, mx = {}, 0, 0
319
+ for crit, meta in crits.items():
320
+ if meta.get("manual_review"):
321
+ manual_flags.append(
322
+ {"criterion": crit, "reason": "heuristic weak; needs human review"}
323
+ )
324
+ if not meta.get("mvp"):
325
+ continue
326
+ fn = ANALYZERS.get(crit)
327
+ if fn is None:
328
+ continue
329
+ res = fn(root, cfg)
330
+ scored[crit] = res
331
+ raw += res["score"]
332
+ mx += res["max"]
333
+ if mx == 0:
334
+ categories[cat] = {
335
+ "weight": weights.get(cat, 0),
336
+ "scored": False,
337
+ "reason": "no MVP criteria (deferred — needs CI API)",
338
+ "criteria": {},
339
+ }
340
+ else:
341
+ pct = round(raw / mx * 100, 1)
342
+ categories[cat] = {
343
+ "weight": weights.get(cat, 0),
344
+ "scored": True,
345
+ "score_pct": pct,
346
+ "criteria": scored,
347
+ }
348
+
349
+ # Renormalize weights across scored categories only.
350
+ scored_w = sum(c["weight"] for c in categories.values() if c["scored"])
351
+ overall = 0.0
352
+ for c in categories.values():
353
+ if c["scored"] and scored_w:
354
+ c["weighted_score"] = round(c["score_pct"] * (c["weight"] / scored_w), 2)
355
+ overall += c["weighted_score"]
356
+ overall = round(overall, 2)
357
+
358
+ t = cfg["tiers"]
359
+ tier = (
360
+ "Agent-Ready"
361
+ if overall >= t["agent_ready"]
362
+ else "Agent-Assisted"
363
+ if overall >= t["agent_assisted"]
364
+ else "Agent-Limited"
365
+ if overall >= t["agent_limited"]
366
+ else "Agent-Hostile"
367
+ )
368
+
369
+ return {
370
+ "repository": root.name,
371
+ "scanner_version": cfg.get("version", "unknown"),
372
+ "scope": "mvp-local-file-presence",
373
+ "overall_score": overall,
374
+ "overall_note": "renormalized over scored categories; deferred "
375
+ "categories excluded (need CI-platform APIs)",
376
+ "tier": tier,
377
+ "categories": categories,
378
+ "manual_review_flags": manual_flags,
379
+ }
380
+
381
+
382
+ def to_markdown(result: dict) -> str:
383
+ lines = [f"# Agent-Readiness Report — {result['repository']}", ""]
384
+ lines.append(f"**Overall: {result['overall_score']} / 100 — {result['tier']}** ")
385
+ lines.append(f"_{result['overall_note']}_")
386
+ lines.append("")
387
+ lines.append("| Category | Scored | % | Weighted |")
388
+ lines.append("| --- | --- | --- | --- |")
389
+ for cat, c in result["categories"].items():
390
+ if c["scored"]:
391
+ lines.append(
392
+ f"| {cat} | yes | {c['score_pct']}% | {c.get('weighted_score', 0)} |"
393
+ )
394
+ else:
395
+ lines.append(f"| {cat} | deferred | — | — |")
396
+ lines.append("")
397
+ lines.append("## Criteria")
398
+ lines.append("| Criterion | Score | Evidence |")
399
+ lines.append("| --- | --- | --- |")
400
+ for cat, c in result["categories"].items():
401
+ for crit, r in c.get("criteria", {}).items():
402
+ lines.append(f"| {crit} | {r['score']}/{r['max']} | {r['evidence']} |")
403
+ if result["manual_review_flags"]:
404
+ lines.append("")
405
+ lines.append("## Manual review flags")
406
+ for f in result["manual_review_flags"]:
407
+ lines.append(f"- **{f['criterion']}**: {f['reason']}")
408
+ return "\n".join(lines) + "\n"
409
+
410
+
411
+ def main(argv: list[str]) -> int:
412
+ ap = argparse.ArgumentParser(description=__doc__)
413
+ ap.add_argument("repo", nargs="?", default=".")
414
+ ap.add_argument("--config", default=str(HERE / "scorecard.yaml"))
415
+ ap.add_argument("--json", help="write JSON result to this path")
416
+ ap.add_argument("--markdown", help="write Markdown summary to this path")
417
+ args = ap.parse_args(argv)
418
+
419
+ root = Path(args.repo).resolve()
420
+ if not root.is_dir():
421
+ print(f"error: not a directory: {root}", file=sys.stderr)
422
+ return 2
423
+ cfg = parse_yaml(Path(args.config).read_text())
424
+
425
+ result = scan(root, cfg)
426
+ md = to_markdown(result)
427
+
428
+ if args.json:
429
+ Path(args.json).write_text(json.dumps(result, indent=2) + "\n")
430
+ if args.markdown:
431
+ Path(args.markdown).write_text(md)
432
+ if not args.json and not args.markdown:
433
+ print(json.dumps(result, indent=2))
434
+ print("\n" + md)
435
+ else:
436
+ print(f"{result['tier']} — {result['overall_score']}/100")
437
+ return 0
438
+
439
+
440
+ if __name__ == "__main__":
441
+ raise SystemExit(main(sys.argv[1:]))
@@ -0,0 +1,88 @@
1
+ # Agent-Readiness Scorecard — scoring config (issue #117 MVP).
2
+ #
3
+ # Externalizes weights, tier thresholds, and per-criterion thresholds so they
4
+ # can be tuned without code changes. The MVP scores a SINGLE LOCAL REPO using
5
+ # file-presence/heuristic analyzers only (criteria with `mvp: true`). Criteria
6
+ # that need CI-platform APIs (coverage, flaky rate, durations, branch policy)
7
+ # are marked `mvp: false` and deferred to a later phase; categories with no MVP
8
+ # criterion are reported as "not scored" and excluded from the renormalized
9
+ # overall (see scanner.py).
10
+ #
11
+ # Rubric source: the Agent-Readiness Scorecard (preserved in issue #117).
12
+ version: "1.1-mvp"
13
+
14
+ # Category weights (sum to 1.0). Overall score renormalizes across categories
15
+ # that have at least one MVP criterion.
16
+ weights:
17
+ test_infrastructure: 0.25
18
+ build_env: 0.20
19
+ code_quality: 0.20
20
+ type_safety: 0.15
21
+ documentation: 0.10
22
+ vcs_safety: 0.10
23
+
24
+ tiers:
25
+ agent_ready: 75
26
+ agent_assisted: 50
27
+ agent_limited: 25
28
+ # below agent_limited => agent_hostile
29
+
30
+ # Which criteria the MVP scores, by category. mvp:false = deferred (needs CI API).
31
+ criteria:
32
+ test_infrastructure:
33
+ T1_coverage: { mvp: false }
34
+ T2_reliability: { mvp: false }
35
+ T3_speed: { mvp: false }
36
+ T4_single_command: { mvp: false }
37
+ T5_test_types: { mvp: false }
38
+ build_env:
39
+ B1_single_command_build: { mvp: false }
40
+ B2_reproducible_env: { mvp: true }
41
+ B3_dependency_management: { mvp: true }
42
+ B4_ci_pipeline: { mvp: false }
43
+ B5_composite_check_command: { mvp: true } # #2178
44
+ code_quality:
45
+ C1_formatting: { mvp: true }
46
+ C2_linting: { mvp: true }
47
+ C3_architecture: { mvp: false, manual_review: true }
48
+ C4_module_size: { mvp: true }
49
+ C5_naming: { mvp: false }
50
+ type_safety:
51
+ S1_type_system: { mvp: false }
52
+ S2_api_contracts: { mvp: false }
53
+ S3_interface_design: { mvp: false, manual_review: true }
54
+ S4_db_schema: { mvp: false }
55
+ documentation:
56
+ D1_readme: { mvp: true }
57
+ D2_ai_instructions: { mvp: true }
58
+ D3_architecture_docs: { mvp: true }
59
+ D4_domain_context: { mvp: false, manual_review: true }
60
+ # AI-friendly repo criteria (#2178) — rubric: knowledge/ai-friendly-repo-guidelines.md
61
+ D5_claude_md_size: { mvp: true }
62
+ D6_layered_context: { mvp: true }
63
+ D7_reference_implementation: { mvp: false, manual_review: true }
64
+ vcs_safety:
65
+ V1_branch_protection: { mvp: false }
66
+ V2_precommit_hooks: { mvp: true }
67
+ V3_commit_conventions: { mvp: true }
68
+ V4_dependency_scanning: { mvp: true }
69
+
70
+ # Target names B5 accepts as a composite check command (Makefile/justfile/
71
+ # package.json/pyproject).
72
+ check_target_names: [check, verify, ci, all]
73
+
74
+ thresholds:
75
+ file_size_p90_small: 300 # source-file p90 line count <= this -> score 2
76
+ file_size_p90_large: 500 # <= this -> score 1; above -> score 0
77
+ readme_min_words: 200 # README word count >= this (with setup/build/test) -> 2
78
+ ai_instructions_min_words: 100
79
+ claude_md_max_lines: 200 # instructions file <= this -> score 2 (D5)
80
+ claude_md_hard_max_lines: 300 # <= this -> score 1; above -> score 0 (D5)
81
+
82
+ # File extensions counted as "source" for C4 line-count distribution.
83
+ source_extensions: [".py", ".js", ".ts", ".jsx", ".tsx", ".go", ".rs", ".java",
84
+ ".cs", ".rb", ".php", ".svelte", ".c", ".cpp", ".kt", ".scala"]
85
+ # Directory names excluded from C4 (generated/vendored).
86
+ exclude_dirs: [".git", "node_modules", "vendor", "dist", "build", "__pycache__",
87
+ ".venv", "venv", "target", "out", ".next", "coverage",
88
+ ".claude/worktrees", "graphify-out", ".cache", ".dev-team-reports"]
@@ -0,0 +1,115 @@
1
+ ---
2
+ name: api-design
3
+ description: Contract-first API design for stable, evolvable interfaces. Use whenever defining a new API endpoint, inter-service boundary, or modifying an existing contract. Includes backward compatibility checklist and error contract specification.
4
+ role: worker
5
+ user-invocable: true
6
+ ---
7
+
8
+ # API Design
9
+
10
+ ## Overview
11
+
12
+ Contract-first API design patterns for defining stable, evolvable interfaces between system components. Protocol-agnostic — applies to REST, gRPC, GraphQL, message-based, or any other interface style.
13
+
14
+ ## Constraints
15
+ - Define the contract before implementing it; implementation conforms to the contract
16
+ - Every endpoint must have an error contract; unspecified failure modes are not acceptable
17
+ - Never remove a field or endpoint without a deprecation period and migration path
18
+ - Do not expose internal domain models directly through API boundaries
19
+
20
+ ## Core Concepts
21
+
22
+ ### Contract-First Design
23
+
24
+ Define the interface before implementing it. The contract is the source of truth; implementation conforms to the contract, not the other way around. Contracts are versioned artifacts.
25
+
26
+ ### Resource Modeling
27
+
28
+ - **Entities** — individual resources with identity (e.g., `/orders/{id}`)
29
+ - **Collections** — groups of entities with filtering, pagination, sorting
30
+ - **Relationships** — links between resources expressed through references or embedding
31
+ - **Operations** — actions on resources (CRUD and domain-specific operations)
32
+
33
+ ### Versioning Strategies
34
+
35
+ | Strategy | Mechanism | Trade-offs |
36
+ | --- | --- | --- |
37
+ | URL path | `/v1/resources`, `/v2/resources` | Simple routing, but proliferates endpoints |
38
+ | Header | `Accept: application/vnd.api.v2+json` | Clean URLs, but harder to test and discover |
39
+ | Content negotiation | Media type with version parameter | Standards-compliant, but adds client complexity |
40
+
41
+ Choose one strategy per API boundary and apply it consistently. URL path versioning is the simplest default.
42
+
43
+ ### Error Contracts
44
+
45
+ Every API defines structured error responses:
46
+
47
+ | Field | Purpose |
48
+ | --- | --- |
49
+ | Error code | Machine-readable identifier (stable across versions) |
50
+ | Message | Human-readable description |
51
+ | Correlation ID | Trace identifier linking request to logs |
52
+ | Details | Optional structured context (field-level validation errors, etc.) |
53
+
54
+ Error contracts are part of the API contract — not an afterthought.
55
+
56
+ ## Patterns
57
+
58
+ ### API Design Procedure
59
+
60
+ 1. **Identify consumers** — who calls this API, what do they need, what are their constraints
61
+ 2. **Define resources** — model the domain entities and relationships exposed through the interface
62
+ 3. **Specify operations** — define actions on each resource with request/response shapes
63
+ 4. **Define error cases** — enumerate failure modes with error codes and response structures
64
+ 5. **Document constraints** — rate limits, pagination defaults, size limits, authentication requirements
65
+ 6. **Choose version strategy** — select and document the versioning approach
66
+
67
+ ### Backward Compatibility Checklist
68
+
69
+ | Change Type | Impact | Action |
70
+ | --- | --- | --- |
71
+ | Add optional field | Safe (additive) | No version bump needed |
72
+ | Add new endpoint | Safe (additive) | No version bump needed |
73
+ | Remove field | **Breaking** | Deprecate first, remove in next major version |
74
+ | Change field type | **Breaking** | New version required |
75
+ | Change endpoint URL | **Breaking** | Redirect old URL, new version |
76
+ | Tighten validation | **Breaking** | New version required |
77
+ | Loosen validation | Safe (relaxing) | No version bump, document change |
78
+
79
+ ### Contract Validation
80
+
81
+ Before implementation begins, verify the API contract against:
82
+
83
+ - [ ] BDD scenarios cover all operations and error cases
84
+ - [ ] Acceptance criteria include non-functional requirements (latency, throughput)
85
+ - [ ] Consumer needs are met without exposing internal implementation details
86
+ - [ ] Error codes are unique and documented
87
+ - [ ] Versioning strategy is declared and consistent
88
+
89
+ ## When to Apply
90
+
91
+ | Scenario | Apply? | Depth |
92
+ | --- | --- | --- |
93
+ | New external or public API | Yes | Full procedure |
94
+ | New inter-service boundary | Yes | Full procedure |
95
+ | Internal module boundary | Partially | Resource modeling and error contracts |
96
+ | Private helper functions | No | — |
97
+ | Modifying existing API contract | Yes | Backward compatibility checklist |
98
+
99
+ ## Guidelines
100
+
101
+ 1. **Design for consumers, not implementations.** The API shape reflects what callers need, not how the backend is structured.
102
+ 2. **Every endpoint has an error contract.** Callers must know what failures look like before they write integration code.
103
+ 3. **Deprecation before removal.** Never remove a field or endpoint without a deprecation period and migration path.
104
+ 4. **Contracts are versioned artifacts.** Treat API contracts with the same rigor as source code — reviewed, versioned, and tested.
105
+ 5. **Avoid leaking internal models.** Domain entities exposed through an API may need a separate representation (DTO/view model) to prevent tight coupling.
106
+ 6. **Pagination is not optional for collections.** Unbounded collection responses are a reliability risk.
107
+
108
+ ## Output
109
+ API contract document covering resources, operations, error cases, versioning strategy, and the backward compatibility checklist results. Be concise — use tables; skip narrative prose.
110
+
111
+ ## Integration
112
+
113
+ - **Agent-Assisted Specification** — API contracts emerge during the Architecture Specification stage; validate them as part of the consistency gate
114
+ - **Hexagonal Architecture** — API contracts define the ports; adapters implement the protocol-specific translation
115
+ - **Domain-Driven Design** — API boundaries often align with bounded context interfaces; use context maps to identify integration points