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,328 @@
1
+ """stub_extractors._common — shared lexical-scanning primitives, the two
2
+ structural-error sentinels, and the dataclasses every per-language extractor
3
+ in this package returns.
4
+
5
+ Hoisted out of a single `_stub_extractors.py` once that file grew past the
6
+ ~300-line size ceiling (plan-review structure finding) — one shared module
7
+ plus one file per language keeps each file's responsibility narrow, mirroring
8
+ how `_vendored_tree.py` and `_gherkin_text.py` were already extracted from
9
+ their own call sites once a second/third occurrence appeared.
10
+
11
+ Stdlib-only. (ADR 0014/0015).
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from dataclasses import dataclass
17
+
18
+ # The two structural-error sentinels every extractor (and gherkin_stub_merge.py
19
+ # itself) shares — named once so call sites and tests reference the constant,
20
+ # never a repeated raw literal.
21
+ ERROR_UNBALANCED_BRACES = "unbalanced-braces"
22
+ ERROR_DANGLING_ANNOTATION = "dangling-annotation"
23
+
24
+
25
+ @dataclass
26
+ class StepBinding:
27
+ """One parsed step-definition binding: its step-pattern text, the full
28
+ bounded verbatim source span (`text[start:end]`), and whether its body
29
+ contains a pending marker.
30
+
31
+ `decl_start`/`decl_text` are Go-only (`None` for JS/TS, Java, C#, where
32
+ the callback/method body is adjacent to the call/annotation, so
33
+ `text[start:end]` already captures everything). Go's registration
34
+ (`sc.Step(pattern, funcName)`) and the `funcName` function it references
35
+ are non-adjacent source regions — `decl_start` is where that referenced
36
+ function's own declaration begins, and `decl_text` is its full verbatim
37
+ source. Without these, reusing `text` as a new candidate's insertable
38
+ content silently drops the function declaration a Go step needs to
39
+ compile (bug caught by this module's own runtime CLI verification,
40
+ fixed here rather than shipped)."""
41
+
42
+ pattern: str
43
+ text: str
44
+ start: int # char offset into the parsed text, inclusive
45
+ end: int # char offset, exclusive — always a line boundary (see extend_to_line_end)
46
+ is_pending: bool
47
+ decl_start: int | None = None
48
+ decl_text: str | None = None
49
+
50
+
51
+ @dataclass
52
+ class ParseResult:
53
+ bindings: list | None
54
+ error: str | None
55
+
56
+
57
+ # ---------------------------------------------------------------------------
58
+ # Shared lexical scanning — string/char-literal/comment awareness so brace and
59
+ # paren counting never miscounts a bracket embedded in either.
60
+ # ---------------------------------------------------------------------------
61
+
62
+
63
+ def skip_quoted(text: str, i: int, quote: str) -> int:
64
+ """`text[i] == quote`. Return the index just past the matching unescaped
65
+ closing `quote` (backslash-escaping honored), or `len(text)` if the
66
+ string never closes before EOF."""
67
+ j = i + 1
68
+ n = len(text)
69
+ while j < n:
70
+ if text[j] == "\\":
71
+ j += 2
72
+ continue
73
+ if text[j] == quote:
74
+ return j + 1
75
+ j += 1
76
+ return n
77
+
78
+
79
+ def skip_verbatim_string(text: str, i: int) -> int:
80
+ """`text[i:i+2] == '@\"'` (a C# verbatim string). A doubled `\"\"` inside
81
+ is an escaped quote, not the terminator — distinct from `skip_quoted`'s
82
+ backslash-escaping rule."""
83
+ j = i + 2
84
+ n = len(text)
85
+ while j < n:
86
+ if text[j] == '"':
87
+ if j + 1 < n and text[j + 1] == '"':
88
+ j += 2
89
+ continue
90
+ return j + 1
91
+ j += 1
92
+ return n
93
+
94
+
95
+ def skip_regex_literal(text: str, i: int) -> int:
96
+ """`text[i] == '/'` starting a JS/TS regex literal (e.g.
97
+ `/^I have (\\d+) cukes$/`) — a real, common cucumber-js step-pattern
98
+ convention alongside a quoted string. Return the index just past the
99
+ matching unescaped closing `/` (backslash-escaping honored, mirroring
100
+ `skip_quoted`), or `len(text)` if it never closes. Only called from
101
+ `extract_first_string` at a pattern-argument position, where a leading
102
+ `/` unambiguously starts a regex literal (comments are `//`/`/*`,
103
+ already dispatched to `skip_lexical_token` before this is ever
104
+ reached)."""
105
+ j = i + 1
106
+ n = len(text)
107
+ while j < n:
108
+ if text[j] == "\\":
109
+ j += 2
110
+ continue
111
+ if text[j] == "/":
112
+ return j + 1
113
+ j += 1
114
+ return n
115
+
116
+
117
+ def skip_lexical_token(text: str, i: int, language: str) -> int | None:
118
+ """If a string/char literal or comment starts at `text[i]`, return the
119
+ index just past its end. Otherwise `None` — `text[i]` is ordinary code
120
+ and should be scanned normally."""
121
+ ch = text[i]
122
+ nxt = text[i + 1] if i + 1 < len(text) else ""
123
+
124
+ if ch == "/" and nxt == "/":
125
+ end = text.find("\n", i)
126
+ return len(text) if end == -1 else end
127
+ if ch == "/" and nxt == "*":
128
+ end = text.find("*/", i + 2)
129
+ return len(text) if end == -1 else end + 2
130
+ if language == "C#" and ch == "@" and nxt == '"':
131
+ return skip_verbatim_string(text, i)
132
+ if language == "Go" and ch == "`":
133
+ j = text.find("`", i + 1)
134
+ return len(text) if j == -1 else j + 1
135
+ if language == "JS/TS" and ch == "`":
136
+ return skip_quoted(text, i, "`")
137
+ if ch == '"':
138
+ return skip_quoted(text, i, '"')
139
+ if ch == "'":
140
+ return skip_quoted(text, i, "'")
141
+ return None
142
+
143
+
144
+ def scan_balanced(text: str, open_idx: int, open_ch: str, close_ch: str, language: str) -> int | None:
145
+ """`text[open_idx] == open_ch`. Scan forward tracking `open_ch`/`close_ch`
146
+ depth, skipping any lexical token (string/char literal/comment)
147
+ encountered along the way. Return the index just past the matching
148
+ `close_ch`, or `None` if depth never returns to zero before EOF —
149
+ the file's brackets don't lexically balance."""
150
+ depth = 0
151
+ i = open_idx
152
+ n = len(text)
153
+ while i < n:
154
+ skip_to = skip_lexical_token(text, i, language)
155
+ if skip_to is not None:
156
+ i = skip_to
157
+ continue
158
+ ch = text[i]
159
+ if ch == open_ch:
160
+ depth += 1
161
+ elif ch == close_ch:
162
+ depth -= 1
163
+ if depth == 0:
164
+ return i + 1
165
+ i += 1
166
+ return None
167
+
168
+
169
+ def find_next_brace(text: str, start: int, limit: int, language: str) -> int | None:
170
+ """Return the index of the next `{` in `text[start:limit]` that is not
171
+ inside a string/char literal or comment, or `None` if none precedes
172
+ `limit`."""
173
+ i = start
174
+ while i < limit:
175
+ skip_to = skip_lexical_token(text, i, language)
176
+ if skip_to is not None:
177
+ i = skip_to
178
+ continue
179
+ if text[i] == "{":
180
+ return i
181
+ i += 1
182
+ return None
183
+
184
+
185
+ def lexically_skip_to(text: str, pos: int, target: int, language: str) -> int:
186
+ """Scan forward from `pos` (assumed to be ordinary-code position) to
187
+ `target`, skipping any string/char literal/comment encountered. Returns
188
+ a position >= `target`; a result strictly greater than `target` means
189
+ `target` sat *inside* a skipped token — e.g. a marker-like substring
190
+ appearing in a string or comment, which must not be mistaken for a real
191
+ binding boundary."""
192
+ i = pos
193
+ while i < target:
194
+ skip_to = skip_lexical_token(text, i, language)
195
+ if skip_to is not None:
196
+ i = skip_to
197
+ continue
198
+ i += 1
199
+ return i
200
+
201
+
202
+ def extend_to_line_end(text: str, idx: int) -> int:
203
+ """Return an index >= `idx` landing just past the next newline at or
204
+ after `idx`, or `len(text)` if none remains — so a binding's span always
205
+ ends at a line boundary, giving `gherkin_stub_merge.py` a clean splice
206
+ point for appending new stubs."""
207
+ nl = text.find("\n", idx)
208
+ return len(text) if nl == -1 else nl + 1
209
+
210
+
211
+ def extract_first_string(text: str, start: int, limit: int, language: str) -> tuple:
212
+ """Scan `text[start:limit]` for the first string or (JS/TS only) regex
213
+ literal (skipping any comment encountered first) and return
214
+ `(pattern_text, end_index)` — the dequoted/de-slashed contents and the
215
+ index just past the closing delimiter. Returns `("", start)` if neither
216
+ is found before `limit`.
217
+
218
+ A JS/TS regex-literal pattern (`Given(/^I have (\\d+) cukes$/, ...)`,
219
+ a real cucumber-js convention) is not a quoted string at all — without
220
+ explicit recognition here it falls through to the `("", start)` no-match
221
+ case, recording an empty pattern. Since `merge_steps` dedups by exact
222
+ pattern-text match, an empty string can never match anything, so an
223
+ already-implemented regex-pattern step gets a duplicate pending stub
224
+ appended on every re-run (issue #1421 bug 4 — the clobber-equivalent
225
+ this module exists to prevent, for one pattern syntax)."""
226
+ i = start
227
+ while i < limit:
228
+ ch = text[i]
229
+ nxt = text[i + 1] if i + 1 < len(text) else ""
230
+ if ch == "/" and nxt in ("/", "*"):
231
+ skip_to = skip_lexical_token(text, i, language)
232
+ i = skip_to if skip_to is not None else i + 1
233
+ continue
234
+ is_verbatim = language == "C#" and ch == "@" and nxt == '"'
235
+ is_regex_literal = language == "JS/TS" and ch == "/"
236
+ is_string_start = (
237
+ is_verbatim
238
+ or is_regex_literal
239
+ or ch in ("'", '"')
240
+ or (ch == "`" and language in ("JS/TS", "Go"))
241
+ )
242
+ if is_string_start:
243
+ end = skip_regex_literal(text, i) if is_regex_literal else skip_lexical_token(text, i, language)
244
+ quote_len = 2 if is_verbatim else 1
245
+ return text[i + quote_len : end - 1], end
246
+ i += 1
247
+ return "", start
248
+
249
+
250
+ def extract_identifier(text: str, start: int, limit: int) -> str:
251
+ """Skip leading whitespace/commas from `start`, then read an
252
+ identifier (`[A-Za-z0-9_]+`). Returns `""` if none found immediately."""
253
+ i = start
254
+ while i < limit and text[i] in " \t\r\n,":
255
+ i += 1
256
+ j = i
257
+ while j < limit and (text[j].isalnum() or text[j] == "_"):
258
+ j += 1
259
+ return text[i:j]
260
+
261
+
262
+ def is_pending(body_text: str, markers: tuple) -> bool:
263
+ return any(marker in body_text for marker in markers)
264
+
265
+
266
+ def build_binding(
267
+ text: str, start: int, pattern: str, body_start: int, body_end: int, markers: tuple
268
+ ) -> tuple:
269
+ """Construct a `StepBinding` once a binding's brace-bounded body span
270
+ `[body_start, body_end)` has been located, and return `(binding,
271
+ next_pos)` — `next_pos` is where the caller's scan should resume.
272
+ Identical across all three parse functions (`jsts.py`, `parse_annotation_
273
+ style`, `go.py`), hoisted here rather than repeated three times."""
274
+ body_text = text[body_start:body_end]
275
+ end = extend_to_line_end(text, body_end)
276
+ binding = StepBinding(
277
+ pattern=pattern,
278
+ text=text[start:end],
279
+ start=start,
280
+ end=end,
281
+ is_pending=is_pending(body_text, markers),
282
+ )
283
+ return binding, end
284
+
285
+
286
+ def parse_annotation_style(text: str, markers: tuple, language: str, annotation_re) -> ParseResult:
287
+ """Shared control flow for Java's `@Given(`/`@When(`/`@Then(` annotation
288
+ and C#'s `[Given(`/`[When(`/`[Then(` attribute (`java.py`/`csharp.py`) —
289
+ both bind a step to the *next* method's brace-bounded body, differing
290
+ only in the marker syntax (`annotation_re`) and the per-language lexer
291
+ profile (`language`, for C#'s verbatim-string awareness). Factored out
292
+ once the two extractors turned out identical apart from that one regex
293
+ (structure-review: semantic, not just structural, duplication)."""
294
+ bindings = []
295
+ pos = 0
296
+ n = len(text)
297
+ while pos < n:
298
+ match = annotation_re.search(text, pos)
299
+ if match is None:
300
+ break
301
+ start = match.start()
302
+ landed = lexically_skip_to(text, pos, start, language)
303
+ if landed > start:
304
+ pos = landed
305
+ continue
306
+
307
+ ann_open = match.end() - 1
308
+ ann_close = scan_balanced(text, ann_open, "(", ")", language)
309
+ if ann_close is None:
310
+ return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
311
+
312
+ pattern, _pattern_end = extract_first_string(text, ann_open + 1, ann_close, language)
313
+
314
+ next_match = annotation_re.search(text, ann_close)
315
+ search_limit = next_match.start() if next_match else n
316
+ brace_open = find_next_brace(text, ann_close, search_limit, language)
317
+ if brace_open is None:
318
+ # No method body found before the next annotation (or EOF) — a
319
+ # dangling annotation, not an unbalanced count.
320
+ return ParseResult(bindings=None, error=ERROR_DANGLING_ANNOTATION)
321
+ brace_close = scan_balanced(text, brace_open, "{", "}", language)
322
+ if brace_close is None:
323
+ return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
324
+
325
+ binding, pos = build_binding(text, start, pattern, brace_open, brace_close, markers)
326
+ bindings.append(binding)
327
+
328
+ return ParseResult(bindings=bindings, error=None)
@@ -0,0 +1,19 @@
1
+ """stub_extractors.csharp — C# `[Given(`/`[When(`/`[Then(` attribute step
2
+ bindings, method body bounded by lexically-aware brace balance (including
3
+ C# verbatim `@"..."` string patterns, handled by the shared lexer). Thin
4
+ wrapper around `_common.parse_annotation_style`, the control flow it shares
5
+ byte-for-byte with Java's annotation-style bindings (`java.py`).
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import re
11
+
12
+ from ._common import ParseResult, parse_annotation_style
13
+
14
+ _LANGUAGE = "C#"
15
+ _ATTRIBUTE_RE = re.compile(r"\[(?:Given|When|Then)\s*\(")
16
+
17
+
18
+ def parse(text: str, markers: tuple) -> ParseResult:
19
+ return parse_annotation_style(text, markers, _LANGUAGE, _ATTRIBUTE_RE)
@@ -0,0 +1,173 @@
1
+ """stub_extractors.go — Go `sc.Step(` registration: a top-level-only,
2
+ one-registration-per-call convention, distinct from the brace-balance
3
+ boundary the other three languages use. The registration call itself has no
4
+ brace-bounded body (its second argument is a bare function reference); the
5
+ referenced top-level `func` declaration's own brace-bounded body is looked
6
+ up separately to check for a pending marker.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import re
12
+ from dataclasses import dataclass
13
+
14
+ from ._common import (
15
+ ERROR_DANGLING_ANNOTATION,
16
+ ERROR_UNBALANCED_BRACES,
17
+ ParseResult,
18
+ StepBinding,
19
+ extend_to_line_end,
20
+ extract_first_string,
21
+ extract_identifier,
22
+ find_next_brace,
23
+ is_pending,
24
+ lexically_skip_to,
25
+ scan_balanced,
26
+ )
27
+
28
+ _LANGUAGE = "Go"
29
+ _STEP_RE = re.compile(r"\bsc\.Step\s*\(")
30
+ _FUNC_DECL_RE = re.compile(r"\bfunc\s+([A-Za-z0-9_]+)\s*\(")
31
+
32
+
33
+ @dataclass
34
+ class _GoFuncBody:
35
+ decl_start: int # where 'func <name>(' itself begins — the declaration anchor
36
+ start: int # brace-bounded body start (for is_pending scanning)
37
+ end: int # brace-bounded body end, extended to its own line boundary
38
+ error: str | None
39
+
40
+
41
+ def _index_func_decls(text: str) -> dict:
42
+ """One-time pass over `text` collecting every top-level `func <name>(`
43
+ declaration, keyed by name, as `{name: (decl_start, params_open)}`.
44
+ Built once per `parse()` call so the per-binding lookup below is a dict
45
+ lookup instead of re-searching the whole file from offset 0 for every
46
+ `sc.Step(...)` registration found — the previous approach was
47
+ O(bindings * file size) on a large Go file (issue #1421 bug 7). The
48
+ first declaration of a given name wins; a duplicate is a Go compile
49
+ error regardless of which one this index picks."""
50
+ index: dict = {}
51
+ for match in _FUNC_DECL_RE.finditer(text):
52
+ name = match.group(1)
53
+ if name not in index:
54
+ index[name] = (match.start(), match.end() - 1)
55
+ return index
56
+
57
+
58
+ def _bound_func_body(text: str, decl_start: int, params_open: int) -> _GoFuncBody:
59
+ """Bound a known `func <name>(...) { ... }` declaration's parameter list
60
+ and body via paren/brace balance, given positions already located by
61
+ `_index_func_decls` (or a direct one-off regex search) — the balance-
62
+ scanning logic shared by both the indexed (`parse`) and single-name
63
+ (`find_scenario_initializer_body`) lookup paths."""
64
+ params_close = scan_balanced(text, params_open, "(", ")", _LANGUAGE)
65
+ if params_close is None:
66
+ return _GoFuncBody(decl_start=decl_start, start=0, end=0, error=ERROR_UNBALANCED_BRACES)
67
+
68
+ body_open = find_next_brace(text, params_close, len(text), _LANGUAGE)
69
+ if body_open is None:
70
+ return _GoFuncBody(decl_start=decl_start, start=0, end=0, error=ERROR_UNBALANCED_BRACES)
71
+ body_close = scan_balanced(text, body_open, "{", "}", _LANGUAGE)
72
+ if body_close is None:
73
+ return _GoFuncBody(decl_start=decl_start, start=0, end=0, error=ERROR_UNBALANCED_BRACES)
74
+
75
+ return _GoFuncBody(decl_start=decl_start, start=body_open, end=body_close, error=None)
76
+
77
+
78
+ def _find_func_body(text: str, func_name: str) -> _GoFuncBody | None:
79
+ """Locate the top-level `func <func_name>(...) { ... }` declaration via a
80
+ direct one-off regex search and return its brace-bounded body span plus
81
+ its own declaration start. `None` means no such function was ever
82
+ declared — the registration references nothing, i.e. dangling. Used
83
+ only by `find_scenario_initializer_body` below — a single standalone
84
+ lookup outside `parse()`'s main loop, where building a full index would
85
+ be pure overhead; `parse()` itself uses `_index_func_decls` +
86
+ `_bound_func_body` instead (issue #1421 bug 7)."""
87
+ func_re = re.compile(r"\bfunc\s+" + re.escape(func_name) + r"\s*\(")
88
+ match = func_re.search(text)
89
+ if match is None:
90
+ return None
91
+ return _bound_func_body(text, match.start(), match.end() - 1)
92
+
93
+
94
+ # The conventional godog `ScenarioInitializer` entry-point function name
95
+ # (see knowledge/test-stack-profiles/bdd-frameworks.md's Go section and
96
+ # godog.TestSuite.ScenarioInitializer) — this plugin's own stub template
97
+ # always names it this. Used only as a fallback anchor by
98
+ # `find_scenario_initializer_body` below, for the "existing Go file with
99
+ # zero sc.Step(...) bindings yet" case (issue #1421 bug 1); the main `parse`
100
+ # loop above never assumes this name.
101
+ SCENARIO_INITIALIZER_NAME = "InitializeScenario"
102
+
103
+
104
+ def find_scenario_initializer_body(text: str) -> _GoFuncBody | None:
105
+ """Public wrapper around `_find_func_body`, for callers outside this
106
+ module (`gherkin_stub_merge.py`) that need to anchor a splice against
107
+ the conventional `InitializeScenario(sc *godog.ScenarioContext)`
108
+ registration function directly, when there are no existing `sc.Step(...)`
109
+ bindings to anchor against instead."""
110
+ return _find_func_body(text, SCENARIO_INITIALIZER_NAME)
111
+
112
+
113
+ def parse(text: str, markers: tuple) -> ParseResult:
114
+ bindings = []
115
+ pos = 0
116
+ n = len(text)
117
+ func_index = _index_func_decls(text) # one pass, not one per binding (bug 7)
118
+ while pos < n:
119
+ match = _STEP_RE.search(text, pos)
120
+ if match is None:
121
+ break
122
+ start = match.start()
123
+ landed = lexically_skip_to(text, pos, start, _LANGUAGE)
124
+ if landed > start:
125
+ pos = landed
126
+ continue
127
+
128
+ call_open = match.end() - 1
129
+ call_end = scan_balanced(text, call_open, "(", ")", _LANGUAGE)
130
+ if call_end is None:
131
+ return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
132
+
133
+ pattern, pattern_end = extract_first_string(text, call_open + 1, call_end, _LANGUAGE)
134
+ func_name = extract_identifier(text, pattern_end, call_end)
135
+ if not func_name:
136
+ return ParseResult(bindings=None, error=ERROR_DANGLING_ANNOTATION)
137
+
138
+ func_entry = func_index.get(func_name)
139
+ if func_entry is None:
140
+ # The registration names a function that was never declared —
141
+ # a marker with no attached, boundable body.
142
+ return ParseResult(bindings=None, error=ERROR_DANGLING_ANNOTATION)
143
+ func_result = _bound_func_body(text, *func_entry)
144
+ if func_result.error is not None:
145
+ return ParseResult(bindings=None, error=func_result.error)
146
+
147
+ body_text = text[func_result.start : func_result.end]
148
+ end = call_end
149
+ if end < n and text[end] == ";":
150
+ end += 1
151
+ end = extend_to_line_end(text, end)
152
+
153
+ # The referenced function's own declaration lives at a different,
154
+ # non-adjacent position than the registration call (start:end) —
155
+ # captured separately so a caller reusing this binding as new
156
+ # candidate content (gherkin_stub_merge.merge_steps) can insert the
157
+ # declaration and the registration at their two correct positions
158
+ # instead of silently dropping the declaration.
159
+ decl_end_line = extend_to_line_end(text, func_result.end)
160
+ bindings.append(
161
+ StepBinding(
162
+ pattern=pattern,
163
+ text=text[start:end],
164
+ start=start,
165
+ end=end,
166
+ is_pending=is_pending(body_text, markers),
167
+ decl_start=func_result.decl_start,
168
+ decl_text=text[func_result.decl_start : decl_end_line],
169
+ )
170
+ )
171
+ pos = end
172
+
173
+ return ParseResult(bindings=bindings, error=None)
@@ -0,0 +1,18 @@
1
+ """stub_extractors.java — Java `@Given(`/`@When(`/`@Then(` annotation step
2
+ bindings, method body bounded by lexically-aware brace balance. Thin
3
+ wrapper around `_common.parse_annotation_style`, the control flow it shares
4
+ byte-for-byte with C#'s attribute-style bindings (`csharp.py`).
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import re
10
+
11
+ from ._common import ParseResult, parse_annotation_style
12
+
13
+ _LANGUAGE = "Java"
14
+ _ANNOTATION_RE = re.compile(r"@(?:Given|When|Then)\s*\(")
15
+
16
+
17
+ def parse(text: str, markers: tuple) -> ParseResult:
18
+ return parse_annotation_style(text, markers, _LANGUAGE, _ANNOTATION_RE)
@@ -0,0 +1,126 @@
1
+ """stub_extractors.jsts — JS/TS `Given(`/`When(`/`Then(` call-style step
2
+ bindings, callback body bounded by lexically-aware brace balance.
3
+
4
+ Known scope limitation (self-identified, correctness-review lens): this
5
+ extractor assumes the convention `gherkin-derive/SKILL.md` Step 4 and
6
+ `gherkin_stub_gate.py`'s own pending-marker table both assume — an inline
7
+ callback literal (`function () { ... }` or `() => { ... }`) as the second
8
+ argument. A step bound to a *named* function reference (`Given('x',
9
+ stepImpl);`, no inline braces) has no brace-bounded body for this extractor
10
+ to find, and is reported as `dangling-annotation` (a marker with no
11
+ attached, boundable body — the same sentinel `go.py` and
12
+ `_common.parse_annotation_style` use for their equivalent case), not
13
+ `unbalanced-braces` — the file's braces genuinely balance; there is simply
14
+ no callback to bound. Out of scope for this module's stated design
15
+ (brace-balance bounding), not silently mishandled — noted here rather than
16
+ guessed around.
17
+
18
+ The callback's own parameter list is always located and skipped via paren
19
+ balance *before* searching for its body brace, so a destructured parameter
20
+ (`({ page }) => { ... }`) is never mistaken for the body — the destructure's
21
+ own `{`/`}` pair sits inside the parameter list's parens, which paren
22
+ balance clears in one step regardless of what braces it contains
23
+ (issue #1421 bug 3).
24
+ """
25
+
26
+ from __future__ import annotations
27
+
28
+ import re
29
+
30
+ from ._common import (
31
+ ERROR_DANGLING_ANNOTATION,
32
+ ERROR_UNBALANCED_BRACES,
33
+ ParseResult,
34
+ build_binding,
35
+ extract_first_string,
36
+ find_next_brace,
37
+ lexically_skip_to,
38
+ scan_balanced,
39
+ skip_lexical_token,
40
+ )
41
+
42
+ _LANGUAGE = "JS/TS"
43
+ _KEYWORD_RE = re.compile(r"\b(?:Given|When|Then)\s*\(")
44
+
45
+
46
+ def _find_next_paren(text: str, start: int, limit: int, language: str) -> int | None:
47
+ """Return the index of the next `(` in `text[start:limit]` that is not
48
+ inside a string/char literal or comment, or `None` if none precedes
49
+ `limit`. Used to locate a callback's own parameter list — its opening
50
+ paren — so it can be fully skipped via paren balance (see `parse`
51
+ below) before searching for the callback's real body brace."""
52
+ i = start
53
+ while i < limit:
54
+ skip_to = skip_lexical_token(text, i, language)
55
+ if skip_to is not None:
56
+ i = skip_to
57
+ continue
58
+ if text[i] == "(":
59
+ return i
60
+ i += 1
61
+ return None
62
+
63
+
64
+ def parse(text: str, markers: tuple) -> ParseResult:
65
+ bindings = []
66
+ pos = 0
67
+ n = len(text)
68
+ while pos < n:
69
+ match = _KEYWORD_RE.search(text, pos)
70
+ if match is None:
71
+ break
72
+ start = match.start()
73
+ landed = lexically_skip_to(text, pos, start, _LANGUAGE)
74
+ if landed > start:
75
+ pos = landed
76
+ continue
77
+
78
+ call_open = match.end() - 1 # the '(' the regex matched up to
79
+ call_end = scan_balanced(text, call_open, "(", ")", _LANGUAGE)
80
+ if call_end is None:
81
+ return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
82
+
83
+ pattern, pattern_end = extract_first_string(text, call_open + 1, call_end, _LANGUAGE)
84
+
85
+ # Locate the callback's own parameter list first (its opening '(')
86
+ # and skip past it via paren balance before searching for the
87
+ # callback's real body brace. A destructured parameter
88
+ # (`({ page }) => { ... }`) has its own '{'/'}' pair *inside* that
89
+ # parameter list — searching for "the first '{' after the pattern"
90
+ # (the previous approach) finds the destructure's brace instead of
91
+ # the body, mis-binding the span onto a few characters of parameter
92
+ # syntax rather than the real callback (issue #1421 bug 3: a
93
+ # silent-corruption risk — a subsequent merge could splice a new
94
+ # stub into the middle of this existing callback body). Paren
95
+ # balance ignores nested braces entirely, so this correctly clears
96
+ # the whole parameter list — destructured or not — regardless of
97
+ # whether the callback is `function (...) { ... }` or an arrow.
98
+ param_open = _find_next_paren(text, pattern_end, call_end, _LANGUAGE)
99
+ if param_open is None:
100
+ # No callback signature at all between the pattern and the
101
+ # call's own closing paren — e.g. a named-function reference
102
+ # (`Given('x', stepImpl);`). The file's braces balance fine;
103
+ # there's simply no attached body to bound.
104
+ return ParseResult(bindings=None, error=ERROR_DANGLING_ANNOTATION)
105
+ param_close = scan_balanced(text, param_open, "(", ")", _LANGUAGE)
106
+ if param_close is None or param_close > call_end:
107
+ return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
108
+
109
+ brace_open = find_next_brace(text, param_close, call_end, _LANGUAGE)
110
+ if brace_open is None:
111
+ # No block body follows the callback's own parameter list —
112
+ # e.g. an expression-bodied arrow (`() => doSomething()`).
113
+ # Refuse to guess a span rather than risk mis-splicing.
114
+ return ParseResult(bindings=None, error=ERROR_DANGLING_ANNOTATION)
115
+ brace_close = scan_balanced(text, brace_open, "{", "}", _LANGUAGE)
116
+ if brace_close is None or brace_close > call_end:
117
+ return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
118
+
119
+ # build_binding extends to the next line boundary from brace_close,
120
+ # which already carries the call's own closing ')' and any trailing
121
+ # ';' along with it for the common single-line-close convention
122
+ # (`});`) — no separate call-tail handling needed.
123
+ binding, pos = build_binding(text, start, pattern, brace_open, brace_close, markers)
124
+ bindings.append(binding)
125
+
126
+ return ParseResult(bindings=bindings, error=None)