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,1197 @@
1
+ ---
2
+ name: project-init
3
+ description: "Get a repository ready for the dev-team toolchain in one command — detect the tech stack (JS/TS, Python, C#, Java), inventory the static-analysis tools the project already has, confirm a plan, and install only what's missing, repo-level. This is the canonical source of truth for tech-stack detection and toolchain installation — NOT dev-team-specific config (CLAUDE.md generation, agent template activation, PostToolUse hooks, the generated `/pr` command all live in `/setup`, which invokes this skill first for the stack signal). Also installs the detection-gated capability tools other skills depend on — semgrep, Playwright + Chromium, adr, gh, and the docker scanners (hadolint/trivy/grype). For JavaScript it scaffolds a new project with ES modules, functional style, prettier, oxlint, editorconfig, vitest, and gitignore."
4
+ role: worker
5
+ user-invocable: true
6
+ argument-hint: "[--yes] [--force]"
7
+ ---
8
+
9
+ # Project Initializer
10
+
11
+ <!-- pi-port-notes -->
12
+ ## pi port notes (read first — these override the steps below)
13
+
14
+ - **MCP servers (Step 4c):** pi reads project MCP servers from `.pi/mcp.json` (user level: `~/.pi/agent/mcp.json`), not `.mcp.json`. Register CodeGraph/Repowise there, or with `pi mcp add -l <name> -- <command>`. Tell the user to run `/reload`.
15
+ - **Settings/hook guards (Step 4c, #1367):** there is no `.claude/settings.json` hook registration in pi; the settings.json guard reports `n/a (pi)`.
16
+ - **`CLAUDE.md` guard around `graphify install`:** apply the same guard to `AGENTS.md`.
17
+ - The `claude` CLI is not required; ignore checks for it.
18
+ <!-- pi-port-notes -->
19
+
20
+
21
+ One command to get a repository ready for the dev-team toolchain, whatever
22
+ the stack. Detect the project's language(s), inventory the static-analysis
23
+ tools already present, confirm a three-column plan, then install only the
24
+ missing tools — lane tools and Playwright always repo-level, never
25
+ user-level or global. It then installs the detection-gated **capability
26
+ tools** other skills depend on (semgrep, Playwright, adr, gh, docker
27
+ scanners — see Step 4b), which are user/system-level CLIs by nature.
28
+
29
+ Supported stacks: **JS/TS**, **Python**, **C#**, **Java** — the four lanes
30
+ registered in
31
+ `${CLAUDE_PLUGIN_ROOT}/skills/static-analysis-integration/references/tool-configs.md`
32
+ § Build-time lanes. Tool facts (choice, versions, install mechanism) follow
33
+ that registry; provider-binding semantics (capability slots, ordered
34
+ provider lists, bind-don't-replace, the qualification contract) follow
35
+ `${CLAUDE_PLUGIN_ROOT}/skills/build/references/static-self-heal.md`. The
36
+ manual commands stay documented in
37
+ `${CLAUDE_PLUGIN_ROOT}/skills/static-analysis-integration/references/language-setup.md`;
38
+ this skill automates them.
39
+
40
+ ## Arguments
41
+
42
+ Arguments: $ARGUMENTS
43
+
44
+ - `--yes`: Run unattended — auto-confirm each gate below with its **safe**
45
+ default and never wait for input. `/setup --yes` passes this through.
46
+ - `--force`: Bypass Step 0's idempotency short-circuit and force the full
47
+ Step 1-6 sequence even when `.claude/init-state.json` records a matching
48
+ `last_run` (#1778). Independent of `--yes` — combine them to force a full
49
+ unattended re-check.
50
+
51
+ ### `--yes` semantics
52
+
53
+ **Affirmative** (auto-confirm, no prompt):
54
+
55
+ - **Step 3 three-column plan** — proceed: install the "missing and will add"
56
+ column's defaults, repo-level. Existing configs are still never overwritten
57
+ (that is already the plan's contract, not a prompt).
58
+ - **Step 4b capability tools** — install every tool whose detection signal
59
+ fired and that is still missing. Tools whose signal did not fire are still
60
+ not installed.
61
+ - **Step 4c CodeGraph** — install if missing (its recommended default is
62
+ already yes, as part of the interactive keyless-pair prompt — see Step 4c).
63
+ CodeGraph never writes to the repo, so it stays in this bucket. Repowise,
64
+ offered alongside it in the same interactive prompt, does **not** stay
65
+ here — see the Conservative bucket below (#1690).
66
+
67
+ **Conservative** (skip with a printed note — never mutate the repo by
68
+ surprise):
69
+
70
+ - **Step 4c Graphify** — skipped for this run, because `graphify install
71
+ --project` writes PreToolUse hook entries embedding this machine's
72
+ absolute binary path into the shared, git-tracked `.claude/settings.json`
73
+ (see the settings.json absolute-path guard, #1367, in the Graphify
74
+ sub-section below) — a write that file cannot simply be gitignored out of
75
+ (unlike the generated git hooks themselves, which are). It also writes a
76
+ `## graphify` section into the tracked `.claude/CLAUDE.md`. Print
77
+ `Graphify: skipped under --yes (repo-writing; run /project-init without --yes to add it)`
78
+ and do **not** record a durable decline in `.claude/init-state.json`, so a
79
+ later interactive run still offers it.
80
+ - **Step 4c Repowise** — skipped for this run, because `repowise init` writes
81
+ a `## Codebase Intelligence for <project> (Repowise)` section into the
82
+ tracked `.claude/CLAUDE.md` (see the Repowise sub-section below) — the same
83
+ class of repo-level write Graphify is gated for above (#1670 item 3 made
84
+ this write explicit; #1690 is what moves Repowise to this bucket to match).
85
+ Repowise's own `.mcp.json` write also carries a machine-specific path, but
86
+ that file IS gitignored by the standing check below — it is the tracked
87
+ CLAUDE.md write, not the `.mcp.json` write, that puts Repowise here. Print
88
+ `Repowise: skipped under --yes (repo-writing; run /project-init without --yes to add it)`
89
+ and do **not** record a durable decline in `.claude/init-state.json`, so a
90
+ later interactive run still offers it as part of the keyless-pair prompt.
91
+ CodeGraph, the other half of that same prompt, is unaffected — it stays in
92
+ the Affirmative bucket above and installs under `--yes` regardless.
93
+ - **Step 1 zero/ambiguous stack** — never guess. Report the supported stacks
94
+ and exit gracefully without writing files or installing anything, exactly as
95
+ the interactive path's "something else" branch.
96
+ - **Greenfield JS/TS scaffold** — the confirm step proceeds with the documented
97
+ defaults (no customization prompt); it only writes into an empty/near-empty
98
+ directory, so nothing existing is overwritten.
99
+
100
+ ## Workflow
101
+
102
+ ### Step 0: Idempotency short-circuit (#1778)
103
+
104
+ `/project-init` is invoked far more often than it has anything new to do —
105
+ most re-invocations find every slot still bound and every capability tool
106
+ still resolved (installed or durably declined), and re-running the full
107
+ Steps 1-6 sequence for that outcome burns tokens presenting a three-column
108
+ plan whose answer never changed. This step does not skip detection — it
109
+ only skips Step 3's plan presentation and any install when detection itself
110
+ proves there is nothing to install.
111
+
112
+ 1. **Always run Step 1's stack detection, Step 2's tool inventory, Step
113
+ 4b's capability-tool detection signals, and Step 4c's "Detect which are
114
+ already present" probes first** — all cheap, deterministic,
115
+ filesystem/PATH-only signals with no network and no builds, so running
116
+ them here is not new work, only reordered. Their live result is
117
+ authoritative for step 2 below — never substitute a cached value for
118
+ what they just found, per this file's own stale-state override rule
119
+ (§ "Detect which are already present").
120
+ 2. **Short-circuit** only when `--force` was **not** passed AND the just-run
121
+ detection shows: the stack list matches `.claude/init-state.json`'s
122
+ `last_run.stack` (if the key is absent, this condition fails and step 3
123
+ below never fires — first run always takes the full path), Step 2's
124
+ fresh inventory has every lane's capability slot bound (Step 3's own
125
+ "missing and will add" column would be empty), and every Step 4b/4c
126
+ capability tool is installed or durably declined per its own
127
+ already-present/decline state (never "signal fired, decision still
128
+ open"). All three are re-derived from the live probes just run, not read
129
+ back from `last_run` — `last_run.stack` is the only field compared
130
+ against a recorded value, because the other two must reflect what the
131
+ filesystem shows *right now*, exactly as an uninstalled tool or a wiped
132
+ config file must be caught on this very run, not papered over by a
133
+ stale cache.
134
+ 3. **Before stopping, still run both of this file's standing checks** —
135
+ the `.mcp.json` machine-specific-path hygiene scan (§ "Standing check —
136
+ `.mcp.json` machine-specific-path hygiene") and Graphify's settings.json
137
+ absolute-path scan (§ "Standing check — run even when Graphify install
138
+ is skipped") — both are explicitly documented elsewhere in this file as
139
+ running "unconditionally, once per `/project-init` (and therefore
140
+ `/setup`) run," independent of every other branch, and a short-circuited
141
+ pass is not an exception to that. Fold their one-line outcomes into the
142
+ short-circuit's own report.
143
+ 4. Print exactly one line reporting both the short-circuit and the standing
144
+ checks' outcomes — e.g. `Project already initialized for <stack> —
145
+ nothing changed since the last run (.claude/init-state.json); .mcp.json
146
+ hygiene: <outcome>; Graphify path check: <outcome or "not applicable">.
147
+ Re-run with --force to re-check anyway.` — and stop. Do not proceed to
148
+ Step 3's plan presentation or any install step.
149
+ 5. **Otherwise** (first run, no `last_run` key, a changed stack, an unbound
150
+ slot, an unresolved capability tool, or `--force`), proceed to Step 3 as
151
+ normal with the detection/inventory results already in hand from step 1
152
+ above — do not re-run them a second time.
153
+ 6. **`--force`** always bypasses this short-circuit and forces the full
154
+ Step 1-6 sequence, exactly as if `last_run` were absent (already listed
155
+ in the Arguments section above).
156
+
157
+ On a normal, successful completion, Step 6 writes the `last_run` snapshot
158
+ into `.claude/init-state.json` — see its final bullet below. A run that
159
+ stops early (Step 1's zero/ambiguous-stack exit, an install failure) does
160
+ not write `last_run`, so the next invocation naturally re-checks from
161
+ scratch rather than caching a failed or incomplete state as "done."
162
+
163
+ ### Step 1: Detect the stack
164
+
165
+ Probe the working directory with cheap, deterministic filesystem signals —
166
+ no builds, no network:
167
+
168
+ | Signal | Stack |
169
+ |---|---|
170
+ | `package.json`, `tsconfig.json`, `*.js`/`*.jsx`/`*.ts`/`*.tsx` sources | JS/TS |
171
+ | `pyproject.toml`, `requirements*.txt`, `setup.cfg`/`setup.py`, `*.py` sources | Python |
172
+ | `*.sln`, `*.csproj`, `global.json` | C# |
173
+ | `pom.xml`, `build.gradle`/`build.gradle.kts`, `*.java` sources | Java |
174
+
175
+ - **Multiple stacks detected** → multi-stack setup: run every matched
176
+ language's inventory and install, mirroring the self-heal pass's
177
+ mixed-language lane dispatch.
178
+ - **Zero or ambiguous signals** (empty dir, README-only repo) → **ask the
179
+ user**: present the four supported stacks plus "something else".
180
+ "Something else" explains what's supported and exits gracefully — no
181
+ files written, nothing installed. **Under `--yes`, do not prompt** — never
182
+ guess a stack: report the supported stacks and exit gracefully, exactly as
183
+ the "something else" branch.
184
+
185
+ ### Step 2: Inventory the existing toolchain
186
+
187
+ Stack detection says which lanes apply; the inventory then establishes, per
188
+ capability slot (**autofix** / **diagnostic**, as the lane registry defines
189
+ them), which recognized provider — if any — the project already has. Three
190
+ signal classes, still cheap and deterministic — no builds, no network:
191
+
192
+ 1. **Config-file signals** — `eslint.config.js`/`.eslintrc*`, `biome.json`,
193
+ `[tool.ruff]`/`[tool.black]`/`[tool.mypy]` sections in `pyproject.toml`,
194
+ `.flake8`/`setup.cfg` sections, `.pylintrc`, `checkstyle.xml`, PMD
195
+ rulesets (`pmd-ruleset.xml`).
196
+ 2. **Dependency signals** — `package.json` devDependencies,
197
+ `requirements-dev.txt`/the `pyproject.toml` dev group, Maven/Gradle
198
+ plugin blocks.
199
+ 3. **Executable probes** — the lane registry's detection probes, run per
200
+ candidate provider down each slot's ordered provider list
201
+ (`tool-configs.md` § Build-time lanes; repo-local locations first,
202
+ then PATH).
203
+
204
+ Binding follows **bind-don't-replace**: an existing, configured tool that
205
+ passes the qualification contract is bound as its slot's provider, and the
206
+ plugin's default is never installed over it. A bound equivalent — black +
207
+ flake8 as a pair, biome, an ESLint kept under demotion, checkstyle —
208
+ satisfies its slot; nothing is installed for it.
209
+
210
+ ### Step 3: Confirm the three-column plan
211
+
212
+ Detection is always confirmed, never assumed. Present the stack + inventory
213
+ results as a three-column plan and wait for the user to confirm it
214
+ **before any file is written or any install runs** (**under `--yes`, print the
215
+ plan and proceed without waiting** — see the Arguments section):
216
+
217
+ 1. **Found and keeping** — providers the inventory bound. Nothing is
218
+ installed for these slots, and existing configs (`eslint.config.js`,
219
+ `pyproject.toml` sections, `.editorconfig`, …) are never overwritten —
220
+ this column doubles as the report of what already exists and is left
221
+ alone.
222
+ 2. **Missing and will add** — empty slots to be filled with the lane's
223
+ default tool. **Only this column installs anything.**
224
+ 3. **Found but can't participate** — a present tool that fails the
225
+ qualification contract (e.g. pyright before its adapter exists), with
226
+ the reason stated and the lane default offered alongside — never a
227
+ silent replacement.
228
+
229
+ The mode follows from what detection found:
230
+
231
+ - **Existing project** (sources present) → tools-only mode, driven entirely
232
+ by the three columns: bind, fill empty slots, surface non-conforming
233
+ tools. No existing config file is modified.
234
+ - **Greenfield JS/TS** (empty or near-empty dir) → the full scaffold below;
235
+ its defaults are presented as this plan's **missing and will add**
236
+ column.
237
+ - **Greenfield Python/C#/Java** → tools plus minimal config (full
238
+ config-scaffold parity with the JS path lands as per-language
239
+ follow-ups).
240
+
241
+ ### Step 4: Install missing tools (repo-level, per lane)
242
+
243
+ Every install lands in the project, versioned with it, reproducible for
244
+ every contributor and CI — never `pip install --user`, never a global
245
+ pipx install, never `npm install -g`.
246
+
247
+ - **JS/TS** — greenfield: the full scaffold below (oxlint as the default
248
+ linter, ESLint behind `lint:deep`). Existing project: fill the empty
249
+ autofix slot as a devDependency, leaving all configs alone:
250
+
251
+ ```bash
252
+ npm install --save-dev oxlint
253
+ ```
254
+
255
+ If this fails with `npm error code ERESOLVE`, the peer conflict is
256
+ pre-existing in the repo's tree (not with `oxlint`) — retry once with
257
+ `--legacy-peer-deps` and note to the user that you did so, rather than
258
+ aborting.
259
+
260
+ - **Python** — add `ruff` and `mypy` — plus `pytest` if no test runner is
261
+ present — to the project's own dev-dependency mechanism: the
262
+ `pyproject.toml` dev group or `requirements-dev.txt`, whichever the
263
+ project already uses; create `requirements-dev.txt` if neither exists.
264
+ - **C#** — nothing to install: both lane tools ship with the .NET SDK.
265
+ Verify the SDK is present — honoring a `global.json` pin when one
266
+ exists — and that `dotnet format --version` responds.
267
+ - **Java** — verify a JDK is present (`java` on PATH), then run the
268
+ plugin's pinned-PMD installer — the user never locates or invokes it by
269
+ hand:
270
+
271
+ ```bash
272
+ python3 "${CLAUDE_PLUGIN_ROOT}/scripts/install-java-static-analysis.py"
273
+ ```
274
+
275
+ It installs a pinned PMD distribution into the repo-local, gitignored
276
+ `.pmd/` directory (version pin single-sourced in the script; re-runs are
277
+ idempotent). Add the `.pmd/` entry to the project's `.gitignore` if it
278
+ is missing.
279
+
280
+ ### Step 4b: Install capability tools
281
+
282
+ Beyond the four static-analysis lanes, other skills and agents depend on a
283
+ set of **capability tools**. `references/capability-tools.md` is their single
284
+ source of truth — a registry of *tool | skills that need it | offer-when
285
+ signal | OS-aware install command | verify probe*. This step installs the
286
+ warranted ones so the "run `/project-init`" pointer those skills print is
287
+ honest.
288
+
289
+ **Run the detection signals** (cheap, deterministic — no builds, no network):
290
+
291
+ | Capability | Skills served | Offer-when signal |
292
+ |---|---|---|
293
+ | semgrep | `/semgrep-analyze`, security-assessment | any source lane detected (universal SAST) — always offer, opt-in |
294
+ | Playwright + Chromium | `/benchmark`, `/browse`, `/browser-testing`, `/performance-benchmark` | frontend signals (React/Svelte/Vue/Angular/Next/Nuxt/SvelteKit/Astro, or an `e2e/` dir, or `playwright.config.*`) in an existing project |
295
+ | adr | `/adr-tools`, adr-author | `docs/adr/`, `docs/decisions/`, or existing ADR `*.md` files present |
296
+ | gh | `/issues-from-assessment` and other issue/PR skills | git repo with a GitHub remote (`git remote -v` shows `github.com`) |
297
+ | docker scanners (hadolint, trivy, grype) | `/docker-image-audit` | a `Dockerfile`/`*.dockerfile`/`compose.y*ml` present |
298
+
299
+ **Present the warranted capability tools as their own group** in the Step 3
300
+ three-column plan — a "capability tools" block alongside the lane columns —
301
+ and **confirm before installing**, same gate as the lanes. **Under `--yes`,
302
+ install every warranted-and-missing tool without prompting** (see the
303
+ Arguments section). Install only the
304
+ tools whose signal fired *and* that the user confirmed *and* that are still
305
+ missing (skip any already on `PATH`). Use the OS-aware install command from
306
+ `references/capability-tools.md` for each — never inline a different command.
307
+
308
+ **Install-level honesty.** The "always repo-level, never user/system" rule
309
+ of the lanes applies to the lane tools **plus Playwright**. The other
310
+ capability tools are general-purpose CLIs that are **user/system-level by
311
+ nature** — there is no repo-local install for `gh`, `semgrep`, `adr`, or the
312
+ docker scanners, so they install via the OS package manager (or pipx / user
313
+ pip on Linux). **Playwright is the repo-level exception among capability
314
+ tools**: it installs as an `npm` devDependency (`@playwright/test`), versioned
315
+ with the project like a lane tool — only its Chromium download is machine-level.
316
+ State this explicitly to the user when the capability group installs. If the
317
+ Playwright `npm` install fails with `npm error code ERESOLVE`, the peer
318
+ conflict is pre-existing in the repo's tree (`@playwright/test` has no
319
+ framework peer relationship) — retry that install once with
320
+ `--legacy-peer-deps` and note to the user that you did so, rather than
321
+ aborting.
322
+
323
+ ### Step 4c: Offer the code-lookup tools (keyless group + keyless Graphify build)
324
+
325
+ Three optional, complementary code-intelligence tools — **CodeGraph**,
326
+ **Repowise**, and **Graphify** — let the review and analysis agents read
327
+ verified skeletons, resolved call graphs, modification risk, and decision
328
+ rationale instead of re-reading whole files. None is required.
329
+
330
+ They are offered by **cost profile**, so the operator never has to accept a
331
+ model/API-key cost to get the keyless tools (issue #1141, which relaxes the
332
+ single all-or-none group of #1108):
333
+
334
+ - **Keyless pair — CodeGraph + Repowise.** Both build a purely structural
335
+ index with **no model/API key** and are safe to build unattended. They are
336
+ offered as **one all-or-none group** — a single decision that gives the
337
+ agents a consistent, predictable lookup set (issue #1108). Accepting the
338
+ group both **installs and builds** every missing tool's index in this same
339
+ run — it is not a "print instructions and leave it to the user" step (issues
340
+ #1134, #1135). CodeGraph installs its CLI (`npm install -g
341
+ @colbymchenry/codegraph`) and runs `codegraph init .`; Repowise installs and
342
+ runs `repowise init . --no-prose -y` for a keyless index.
343
+ - **Graphify — full extraction is the target; `--code-only` is a degraded
344
+ fallback, not the goal.** `graphify extract .` is Graphify's documented
345
+ headless full extraction (**AST + semantic LLM pass**) — it is what indexes
346
+ this plugin's multi-modal target (code + docs + schemas + infra) into the
347
+ `graph.json` that `graphify query`/`path`/`explain` traverse. Only the
348
+ **AST pass** builds with **no model/API key**; the **semantic pass** is what
349
+ pulls docs and images into the graph at all — with no working backend, that
350
+ pass is skipped and `--code-only` must be used explicitly, which excludes
351
+ docs and images. Two further add-ons sit on top of a successful full
352
+ extraction and are also key-gated: inferred edges (`extract --mode deep`)
353
+ and human-readable community names (`graphify label`; without them
354
+ communities stay `Community N` placeholders). Graphify is offered as
355
+ **its own opt-in prompt after the keyless pair** — separate not because of a
356
+ key, but because its integration is **repo-level** (it writes PreToolUse
357
+ hook entries into this repo's tracked `.claude/settings.json` and a
358
+ `## graphify` CLAUDE.md section; the generated git hooks it also installs
359
+ are gitignored — see the sub-section below). On accept: with a
360
+ working backend, run full extraction, repairing the backend's dependencies
361
+ first if needed and never discarding a completed AST pass if the semantic
362
+ pass then fails; without one, build the **code-only** graph and say so
363
+ plainly — it is a degraded index, not the full one. When Graphify is absent
364
+ the agents that use it fall back gracefully (see
365
+ `knowledge/codegraph-vs-graphify.md`).
366
+
367
+ **Detect which are already present** (so re-runs are idempotent and each offer
368
+ scopes to the *missing* set):
369
+
370
+ - CodeGraph — `command -v codegraph` succeeds **and** `.codegraph/` exists.
371
+ - Repowise — the Repowise MCP server is registered / `.repowise/` exists.
372
+ - Graphify — `command -v graphify` succeeds, `graphify-out/graph.json` exists,
373
+ **and** it is not a degraded build waiting on a key that has since shown up:
374
+ if `.claude/init-state.json` has `graphify.code_only_build == true` **and** a
375
+ provider key is now present, treat Graphify as still in the missing set (so
376
+ the opt-in re-offers full extraction) rather than as already present — a
377
+ `--code-only` graph must not permanently block ever reaching the full index
378
+ (issue #1483). Otherwise, present.
379
+
380
+ Also read `.claude/init-state.json`: honor any prior **explicit decline**
381
+ (e.g. `codegraph.install_declined == true`) — a declined tool is excluded from
382
+ the "missing" set rather than silently re-offered, and the existing unstick
383
+ instruction still applies (`remove the <tool> key from .claude/init-state.json
384
+ to re-prompt`).
385
+
386
+ **The keyless group prompt.** Compute the *missing* set = the keyless tools
387
+ (CodeGraph, Repowise) that are neither already present nor previously declined.
388
+
389
+ - If the missing set is **empty**: print
390
+ `Code-lookup tools: keyless pair present (or previously declined) — nothing to install.`
391
+ and continue. No prompt.
392
+ - Otherwise, first show the user the "When to use which" section of
393
+ `${CLAUDE_PLUGIN_ROOT}/knowledge/codegraph-vs-graphify.md`, then prompt
394
+ **once**, listing the missing tools by name (this is an explicit `y`/`n`, and
395
+ the recommended default is **yes** when anything is missing):
396
+
397
+ ```
398
+ Install the code-lookup tools <missing list> to enable faster, verified
399
+ code navigation for the review and analysis agents? [Y/n]
400
+ - CodeGraph — personal, user-level MCP; nothing committed to the repo.
401
+ Keyless: `npm install -g @colbymchenry/codegraph` + `codegraph init .`.
402
+ - Repowise — local keyless index under .repowise/ (gitignored); MCP server.
403
+ Keyless: `init . --no-prose -y`, no API key requested. Also
404
+ adds a `## Codebase Intelligence for <project> (Repowise)`
405
+ section to the tracked .claude/CLAUDE.md documenting the
406
+ codebase — intended (confirmed by the repo owner, #1670
407
+ item 3), and committed along with the rest of this run's
408
+ changes, not reverted.
409
+ ```
410
+
411
+ **Under `--yes`, treat the keyless-pair prompt as yes for CodeGraph only.**
412
+ Repowise moved to the Conservative bucket (Arguments section, #1690) because
413
+ `repowise init` also writes a `## Codebase Intelligence for <project>
414
+ (Repowise)` section into the tracked `.claude/CLAUDE.md` — a repo-level write
415
+ gated the same way below. Install CodeGraph without waiting (its recommended
416
+ default is already yes); skip Repowise for this run, print `Repowise:
417
+ skipped under --yes (repo-writing; run /project-init without --yes to add
418
+ it)`, and do **not** record a durable decline in `.claude/init-state.json`,
419
+ so a later interactive run still offers it as part of this same prompt.
420
+
421
+ - On **yes** (interactive only — see the `--yes` split above): install
422
+ **every** tool in the missing set by running its sub-section below
423
+ (CodeGraph, Repowise), recording each tool's accept in
424
+ `.claude/init-state.json`.
425
+ - **Partial failure is surfaced, never hidden.** If one tool's install
426
+ errors after another already succeeded, print the failing tool's error,
427
+ record per-tool success/failure in `.claude/init-state.json`, and report
428
+ the group as *partially installed* — do not claim both succeeded.
429
+ - On **no** (or empty): install nothing, record the group decline for each
430
+ missing tool in `.claude/init-state.json`, and print a terminal-visible
431
+ confirmation so the operator knows the choice was durable and reversible:
432
+ `Code-lookup tools: skipped — agents fall back to Read/Grep/Glob (re-run /project-init to be offered again).`
433
+
434
+ **The Graphify opt-in.** After the keyless pair, offer Graphify whenever it is
435
+ in the missing set (regardless of key presence — its AST graph builds keyless):
436
+
437
+ 0. **Under `--yes`, skip Graphify for this run** — `graphify install
438
+ --project` writes a machine-specific absolute path into the tracked
439
+ `.claude/settings.json`, so it stays opt-in even unattended (see the
440
+ Arguments section's `--yes` semantics). Print the skip note from the
441
+ Arguments section and do not record a durable decline. Do not run the
442
+ prompt below.
443
+ 1. **Skip if already present or previously declined** — same missing-set rule
444
+ as above.
445
+ 2. **Prompt once** (recommended default **no**, because — unlike the keyless
446
+ pair — Graphify writes a machine-specific path into this repo's tracked
447
+ `.claude/settings.json`):
448
+
449
+ ```
450
+ Also install Graphify for architecture/onboarding-level code intelligence? (y/N)
451
+ - Graphify — repo-level: writes PreToolUse hook entries with this
452
+ machine's graphify path into the tracked
453
+ `.claude/settings.json` (relocated to settings.local.json
454
+ by the #1367 guard) and a `## graphify` section into this
455
+ repo's CLAUDE.md (guarded against the known over-delete
456
+ bug — see the Graphify sub-section). Also installs git
457
+ hooks, which are gitignored.
458
+ Its AST structural graph builds WITHOUT an API key; indexing
459
+ docs and images needs a working backend (see below).
460
+ ```
461
+
462
+ 3. **On yes:** run the Graphify sub-section below (install + guarded native
463
+ integration + build the graph — full extraction when a working backend is
464
+ available, `--code-only` fallback otherwise), recording the accept in
465
+ `.claude/init-state.json`.
466
+ 4. **Full extraction vs. `--code-only` fallback.** Detect a provider key —
467
+ `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, `GOOGLE_API_KEY`, `MOONSHOT_API_KEY`,
468
+ `OPENAI_API_KEY` (`GEMINI_API_KEY` and `GOOGLE_API_KEY` both select the
469
+ same backend — `.claude/skills/graphify/SKILL.md`'s own detection checks
470
+ either):
471
+ - **Key present:** run full extraction (`graphify extract .`), first
472
+ verifying/repairing the selected backend's dependency (the Graphify
473
+ sub-section's backend-repair step) so the semantic pass does not fail on
474
+ a missing extra. On success, merge `{"graphify": {"code_only_build":
475
+ false}}` — explicitly `false`, not omitted, so it overrides a `true` left
476
+ by an earlier degraded run. If the semantic pass still fails after the
477
+ AST pass succeeds, re-run `--code-only` to keep the completed AST work,
478
+ report the result as **degraded** — never as a full success — and merge
479
+ `{"graphify": {"code_only_build": true}}` so the next `/project-init` run
480
+ re-offers full extraction instead of treating this graph as done (issue
481
+ #1483; see the "Detect which are already present" rule above).
482
+ - **No key:** run `graphify extract . --code-only` directly and say so
483
+ plainly: `Graphify: no provider key — code-only graph built (docs/images
484
+ not indexed). Set a provider key (e.g. ANTHROPIC_API_KEY) and re-run
485
+ /project-init for the full index.` Merge
486
+ `{"graphify": {"enrichment_skipped_no_key": true, "code_only_build":
487
+ true}}` into `.claude/init-state.json` — the latter is what keeps this
488
+ run from being mistaken for a completed build once a key shows up.
489
+ 5. **Semantic enrichment (key-gated add-on, on top of a successful full
490
+ extraction).** `graphify label` (community naming) and
491
+ `extract . --mode deep` (inferred edges) are additional passes over an
492
+ already-fully-extracted graph — they do not gate whether docs/images are in
493
+ the graph at all (full extraction in step 4 does). Offer both when a
494
+ provider key is present and full extraction succeeded; both stay non-fatal
495
+ (partial-failure rule) if the key is rejected at build time. Skip entirely
496
+ when step 4 took the `--code-only` path.
497
+ 6. **On no:** install nothing, record `{"graphify": {"install_declined": true}}`.
498
+
499
+ The per-tool mechanics below are unchanged; Step 4c only decides *whether* each
500
+ runs. Each remains user-scoped/gitignored exactly as before, except Graphify's
501
+ documented repo-level native integration — which is written on any Graphify
502
+ accept (it does not require a key) — and the `.mcp.json` machine-specific-path
503
+ hygiene standing check (#1416, filed under Repowise's sub-section below),
504
+ which touches this repo's own `.gitignore`.
505
+
506
+ #### CodeGraph — strictly personal, never committed
507
+
508
+ CodeGraph (<https://github.com/colbymchenry/codegraph>) is a third-party
509
+ SQLite knowledge graph of every symbol, edge, and file in the workspace.
510
+ **It is user-level tooling only** — nothing it produces or registers is
511
+ ever written into a repo-tracked file. `.codegraph/codegraph.db` stays
512
+ gitignored and machine-local, exactly as it already does.
513
+
514
+ **Classify state** (run both, record results as `installed` and `initialized`):
515
+
516
+ ```bash
517
+ command -v codegraph > /dev/null 2>&1 && echo "installed" || echo "not-installed"
518
+ [ -d "${PWD}/.codegraph" ] && echo "initialized" || echo "not-initialized"
519
+ ```
520
+
521
+ Read `.claude/init-state.json` if it exists (top-level `codegraph` key holds
522
+ the four state booleans: `install_accepted`, `install_declined`,
523
+ `init_accepted`, `init_declined`).
524
+
525
+ **Branch on (installed, initialized):**
526
+
527
+ | installed | initialized | Action |
528
+ |-----------|-------------|--------|
529
+ | any | true | Print "CodeGraph: initialized ✓" and continue. State file untouched. |
530
+ | true | false | **Init prompt branch** (below). |
531
+ | false | false | **Install prompt branch** (below). |
532
+
533
+ **Stale-state override.** Before consulting the recorded state, apply these
534
+ rules: `install_declined` is ignored when `installed=true` (the user has
535
+ since installed CodeGraph); `init_declined` is ignored when
536
+ `initialized=true` (the project got initialized by other means). The live
537
+ filesystem/PATH check supersedes the recorded preference.
538
+
539
+ **Install prompt branch** (installed=false, initialized=false):
540
+
541
+ - If `.codegraph.install_declined == true`: print
542
+ `CodeGraph: previously declined install (remove the codegraph key from .claude/init-state.json to re-prompt)`
543
+ and continue.
544
+ - Otherwise prompt: `Install CodeGraph for code intelligence? (y/N)`
545
+ - On `y`/`Y`: install the CodeGraph CLI (machine-level, keyless — nothing is
546
+ committed to the repo):
547
+
548
+ ```bash
549
+ npm install -g @colbymchenry/codegraph
550
+ ```
551
+
552
+ - On success: merge `{"codegraph": {"install_accepted": true}}` into
553
+ `.claude/init-state.json` and **fall through to the init step below**
554
+ (`codegraph init .`) so the index is built in this same run — this is
555
+ what issue #1134 requires (install *and* build, not just instructions).
556
+ - **Non-fatal on failure** (npm missing, or the install errors): print
557
+ `CodeGraph install failed — install it manually: https://github.com/colbymchenry/codegraph#installation`,
558
+ merge `{"codegraph": {"install_failed": true}}`, and continue. Per the
559
+ group's partial-failure rule, report the tool as failed rather than
560
+ aborting the rest of setup.
561
+ - On any other response (including empty): merge
562
+ `{"codegraph": {"install_declined": true}}` and continue silently.
563
+
564
+ **Init prompt branch** (installed=true, initialized=false):
565
+
566
+ - If `.codegraph.init_declined == true`: print
567
+ `CodeGraph: previously declined init (remove the codegraph key from .claude/init-state.json to re-prompt)`
568
+ and continue.
569
+ - Otherwise prompt:
570
+ `CodeGraph is installed but not initialized in this project. Initialize now? (y/N)`
571
+ - On `y`/`Y`:
572
+ 1. Print: `Running 'codegraph init .' in this project...`
573
+ 2. Execute `codegraph init .` — **non-interactive** (no `-i`; issue #1134),
574
+ targeting the current working directory. Surface its stdout/stderr to
575
+ the user.
576
+ 3. On exit 0: print `CodeGraph: initialized ✓`, merge
577
+ `{"codegraph": {"init_accepted": true}}` into
578
+ `.claude/init-state.json`, then register the MCP server (below).
579
+ 4. On non-zero exit N: print
580
+ `CodeGraph init failed (exit code N). See output above. Continuing without CodeGraph.`
581
+ Do NOT modify `.claude/init-state.json`.
582
+ - On any other response: merge `{"codegraph": {"init_declined": true}}`
583
+ and continue silently.
584
+
585
+ **Register the MCP server at user scope (never a repo file).** After a
586
+ successful init, CodeGraph must be registered the same way any personal MCP
587
+ server is added for this Claude Code installation — **not** written into a
588
+ project's `.mcp.json`, and no `.codegraph/` directory is ever committed.
589
+ Print the manual command for the user to run themselves at user scope:
590
+
591
+ ```
592
+ claude mcp add codegraph -- codegraph serve --mcp
593
+ ```
594
+
595
+ Note the exact CLI flag for user-scope registration may vary by Claude Code
596
+ version — point the user at `claude mcp add --help` if the command above is
597
+ rejected. Do not attempt to write `.mcp.json` in the project root, and do
598
+ not run `git add`/`git commit` for anything under `.codegraph/`.
599
+
600
+ `.claude/init-state.json` uses a top-level `codegraph` key so future plugins
601
+ can claim sibling keys without collision. Always merge into existing JSON
602
+ rather than overwriting it.
603
+
604
+ #### Repowise — keyless local index, MCP server
605
+
606
+ Repowise (`repowise` on PyPI) is a codebase-documentation engine that indexes
607
+ the repo and exposes it as an MCP server
608
+ (`mcp__plugin_repowise_repowise__{get_context,get_symbol,search_codebase,get_risk,get_why}`).
609
+ It installs and indexes **without any LLM API key** and stores its index under
610
+ `.repowise/`.
611
+
612
+ Run this tool's install/index through the `repowise-setup` skill (or the
613
+ `index-codebase` skill), which handles the install (`uv`/`pipx`/`pip`), adds
614
+ `.repowise/` to git's **global** ignore so the index never clutters the repo,
615
+ and runs a **keyless** index (`repowise init . --no-prose -y`, no provider key
616
+ requested). There is no `--index-only` flag — `--no-prose` renders the whole
617
+ wiki from structure with no model/key, and `-y` skips the cost-confirmation
618
+ prompt so an unattended `--yes` run does not block on it. Budget for it: on a
619
+ ~1600-file repo this took ~5.5 minutes.
620
+
621
+ The install steps below run only when Step 4c's keyless-group opt-in accepts
622
+ and Repowise is in the missing set. **Under `--yes`, that acceptance never
623
+ happens for Repowise** — it is in the Conservative bucket (Arguments
624
+ section, #1690), so an unattended run skips these steps and prints the
625
+ `Repowise: skipped under --yes` note instead; only an interactive accept of
626
+ the keyless-pair prompt reaches this sub-section's install steps. **The one
627
+ exception is the `.mcp.json` standing check at the end of this sub-section
628
+ (#1416)**, which runs on every `/project-init` pass regardless of the
629
+ group's outcome — accept, decline, or already-present — the same carve-out
630
+ the Graphify sub-section's own Standing check (#1367) makes below.
631
+
632
+ **Install steps (executed only when the all-or-none group is accepted):**
633
+
634
+ 1. Install: prefer `uv tool install repowise`, else `pipx install repowise`,
635
+ else `python3 -m pip install --user repowise`.
636
+ 2. Index keyless: run `repowise init . --no-prose -y` so no API key is
637
+ requested; the index lands under `.repowise/` (gitignored). This step
638
+ (or an equivalent `repowise init` invocation) is known to write a
639
+ project-root `.mcp.json` registering the repowise MCP server, with an
640
+ `args` array baking in this machine's absolute filesystem path — the
641
+ **standing check below** (not gated behind this install branch) covers it
642
+ regardless of whether `.mcp.json` existed before this run. It also appends
643
+ a `## Codebase Intelligence for <project> (Repowise)` section to the
644
+ tracked `.claude/CLAUDE.md` — intended, expected behavior (confirmed by
645
+ the repo owner, issue #1670 item 3), not a bug to guard against: the
646
+ section documents the codebase for readers of `CLAUDE.md` and is
647
+ committed along with the rest of this run's changes, not reverted. It is
648
+ derived structurally (`--no-prose`, no model/key involved — see the
649
+ Repowise sub-section above), not free-form model-generated prose — a
650
+ lower-risk profile than fully model-authored text, though it is still
651
+ third-party-tool-generated content landing in an agent-loaded file, so
652
+ the normal PR review before merge is what actually vets it, not this
653
+ note alone.
654
+ 3. Register the MCP server for this Claude Code installation (user scope), the
655
+ same way any personal MCP server is added — point the user at
656
+ `claude mcp add --help` for the exact invocation. **Server-name caveat:**
657
+ the agents' grants assume the server name `plugin_repowise_repowise`; if a
658
+ different name is used the grants are inert and agents fall back to
659
+ `Read`/`Grep`/`Glob`.
660
+ 4. On success, merge `{"repowise": {"install_accepted": true}}` into
661
+ `.claude/init-state.json`. On failure, surface the error and merge
662
+ `{"repowise": {"install_failed": true}}` — do not claim the group fully
663
+ installed (see the partial-failure rule above).
664
+
665
+ **Detection probe** (used by the group's "already present" check and re-runs):
666
+
667
+ ```bash
668
+ command -v repowise > /dev/null 2>&1 && echo "installed" || echo "not-installed"
669
+ [ -d "${PWD}/.repowise" ] && echo "indexed" || echo "not-indexed"
670
+ ```
671
+
672
+ **Standing check — `.mcp.json` machine-specific-path hygiene, runs every pass
673
+ (issues #1376, #1416).** Unlike the install steps above, this check is **not**
674
+ gated behind the all-or-none group's accept/decline branch or the
675
+ "already present" skip — a repo can carry an ungitignored `.mcp.json` from a
676
+ Repowise install that predates this guard, and once Repowise shows as
677
+ already-present the accept-gated install steps above never re-run (the same
678
+ shape issue #1367's Graphify settings.json standing check, below, already
679
+ solves for a different pollution class). It is filed under the Repowise
680
+ sub-section because that install is the more common source of a project's
681
+ `.mcp.json`, but the check itself is repo-wide — it also covers a `.mcp.json`
682
+ written by `index-codebase` or a hand-registered MCP server. So run this scan
683
+ unconditionally, once per `/project-init` (and therefore `/setup`) run,
684
+ idempotently appending the same `.gitignore` marker block `/setup` applies
685
+ for its own downstream backstop check, so the two never duplicate an entry
686
+ regardless of which one runs first. The marker prefix (everything up to and
687
+ including `machine-specific MCP config`) must stay byte-identical between
688
+ the two blocks — `grep -qF` matches that prefix only, so the trailing
689
+ issue-number suffix may differ, but changing the prefix itself in only one
690
+ place breaks idempotency (`tests/skills/test_project_init_mcp_json_hygiene.py`
691
+ pins both copies):
692
+
693
+ ```bash
694
+ MCP_MARKER="# dev-team hygiene — machine-specific MCP config"
695
+ if ! grep -qF "$MCP_MARKER" .gitignore 2>/dev/null; then
696
+ printf '\n%s\n%s\n' \
697
+ "$MCP_MARKER (absolute-path pollution — issues #1376, #1416)" \
698
+ ".mcp.json" >> .gitignore
699
+ echo "mcp-json-gitignore-updated"
700
+ else
701
+ echo "mcp-json-gitignore-already-covered"
702
+ fi
703
+ ```
704
+
705
+ This check is intentionally **not** scoped to the downstream-only, Step 2
706
+ `in-repo`-skip case the way `/setup`'s own backstop check is — a
707
+ machine-specific path in `.mcp.json` breaks every clone or teammate
708
+ regardless of whether the repo is this plugin's own checkout or a downstream
709
+ project, so this standing check applies in both.
710
+
711
+ **If `.mcp.json` is already tracked by git** (`git ls-files --error-unmatch
712
+ .mcp.json` exits 0), gitignoring the whole file isn't viable — a team that
713
+ legitimately commits `.mcp.json` to distribute other MCP servers (e.g.
714
+ `codegraph`, an internal org server) would lose those too (#1731). Before
715
+ falling back to the operator, try the finer-grained fix (#1747):
716
+
717
+ ```bash
718
+ python3 "${CLAUDE_PLUGIN_ROOT}/hooks/lib/mcp_json_repowise.py" relocate --cwd .
719
+ ```
720
+
721
+ This strips only the `repowise` key from the tracked `.mcp.json`'s
722
+ `mcpServers` object — every other entry is left untouched — and re-registers
723
+ it at `local` scope (`claude mcp add repowise --scope local -- repowise mcp
724
+ "$(pwd)" --transport stdio`) instead, in that order (register succeeds
725
+ before the tracked entry is ever removed, so a failed registration never
726
+ leaves `.mcp.json` with no working entry at all). It prints one of
727
+ `not-tracked`, `no-repowise-entry`, `relocated`, or `relocate-failed`.
728
+ Record the outcome as `{"mcp_hygiene": {"repowise_relocated": "<that
729
+ string>"}}`.
730
+
731
+ **Residual fallback**: `relocate` only ever touches the `repowise` key. If
732
+ the printed outcome is `relocate-failed`, or `.mcp.json` is tracked for a
733
+ reason unrelated to Repowise, do not untrack it automatically — tell the
734
+ operator to run `git rm --cached .mcp.json` themselves, same posture as
735
+ #1376, and record that outcome too. Merge one of `{"mcp_hygiene":
736
+ {"gitignore": "added"}}`, `{"mcp_hygiene": {"gitignore":
737
+ "already-covered"}}`, or (when this residual fallback fires) `{"mcp_hygiene":
738
+ {"gitignore": "added-but-tracked"}}` into `.claude/init-state.json` — a
739
+ top-level key rather than nested under `repowise`, since this check runs
740
+ independently of Repowise's own install state. Report both outcomes as their
741
+ own lines in Step 6's summary below (and the caller's own report, when
742
+ `/setup` is the caller).
743
+
744
+ #### Graphify — native integration, opt-in, with corruption/pollution guards
745
+
746
+ Graphify (`graphifyy` on PyPI) is a multi-modal knowledge graph tool
747
+ (code + docs + schemas + infra + images/video). Unlike CodeGraph it is a
748
+ **repo-level native integration** — its installer writes a `/graphify`
749
+ skill, PreToolUse nudge hooks into `.claude/settings.json`, and a
750
+ `## graphify` section into the project's own `CLAUDE.md`.
751
+
752
+ This sub-section runs **only after the Graphify opt-in in Step 4c accepts** —
753
+ that is, the user said yes. Its integration is repo-level, so none of the file
754
+ writes below happen unless that opt-in was accepted; no model/API key is
755
+ required to reach or complete this sub-section — the AST build is keyless.
756
+ The one exception is the **Standing check** at the end of this sub-section
757
+ (#1367), which runs on every `/project-init` pass regardless of the opt-in
758
+ outcome — it audits `.claude/settings.json` for pollution left by a past
759
+ install, not this run's.
760
+
761
+ **Install (fallback chain):**
762
+
763
+ ```bash
764
+ command -v uv > /dev/null 2>&1 && uv tool install graphifyy \
765
+ || command -v pipx > /dev/null 2>&1 && pipx install graphifyy \
766
+ || python3 -m pip install --user graphifyy
767
+ ```
768
+
769
+ **Native integration, with the CLAUDE.md corruption guard.** Graphify's
770
+ `install --project` updater matches the literal `## graphify` header and
771
+ replaces everything between it and the next `##` heading — a known bug can
772
+ over-delete, taking unrelated pre-existing content with it. Guard every run:
773
+
774
+ 1. **Snapshot** the project's `CLAUDE.md` before installing — a plain file
775
+ copy (e.g. `cp CLAUDE.md /tmp/claude-md-pre-graphify.bak`, or a
776
+ project-local temp path), regardless of whether the repo is git-tracked.
777
+ `git stash` is unsafe mid-flow and must not be used.
778
+ 2. Run the installer:
779
+
780
+ ```bash
781
+ graphify install --project
782
+ graphify hook install
783
+ ```
784
+
785
+ 3. **Diff** the snapshot against the post-install `CLAUDE.md`. If any line
786
+ present in the snapshot is missing from the new file, treat it as the
787
+ known corruption bug. (`scripts/lib/claude_md_guard.py` implements this
788
+ snapshot/diff/restore logic in isolation and is unit-tested at
789
+ `tests/scripts/test_claude_md_guard.py` — reuse its
790
+ `run_install_with_guard` function rather than re-deriving the diff by
791
+ hand.)
792
+ 4. **On detected corruption:** restore the snapshot, then append the
793
+ canonical `## graphify` section text at EOF yourself. Source the
794
+ canonical text either by capturing graphify's own generated section from
795
+ a clean scratch-dir install first, or by reusing the fixed template that
796
+ matches this repo's own root `CLAUDE.md` `## graphify` section (see
797
+ `/home/user/agentic-dev-team/CLAUDE.md` for the canonical section this
798
+ repo already carries).
799
+ 5. **On no corruption detected:** leave the installer's output as-is —
800
+ nothing further to do.
801
+
802
+ **Native integration, with the settings.json absolute-path guard (#1367).**
803
+ The same `graphify install --project` call also writes PreToolUse hook
804
+ entries into the target repo's shared, git-tracked `.claude/settings.json`,
805
+ using the **absolute path to the graphify binary on this machine** (e.g.
806
+ `/Users/alice/.local/bin/graphify`, or `uv tool`/`pipx`/`--user pip`
807
+ equivalents that resolve differently per machine). If that file is
808
+ committed as-is, it bakes one developer's path into the repo and silently
809
+ breaks for every other clone/teammate whose graphify binary lives
810
+ elsewhere. Immediately after running the installer:
811
+
812
+ 1. **Scan** `.claude/settings.json`'s `hooks.PreToolUse` array for any entry
813
+ whose command invokes graphify via an absolute filesystem path (POSIX or
814
+ Windows) instead of a bare, PATH-resolved `graphify` — that is the known
815
+ pollution, regardless of whether it was just written by this install or
816
+ left over from a previous one. (`scripts/lib/settings_hook_guard.py`
817
+ implements this scan/relocate logic in isolation and is unit-tested at
818
+ `tests/scripts/test_settings_hook_guard.py` — reuse its
819
+ `run_install_with_guard` function, which runs the installer then applies
820
+ the scan, rather than re-deriving the check by hand.)
821
+ 2. **On detected pollution:** relocate the polluting entry out of
822
+ `.claude/settings.json` into `.claude/settings.local.json` (already
823
+ gitignored, personal-machine scope — the same treatment already given to
824
+ the `.husky/post-commit`/`post-checkout` hooks below). The shared file
825
+ keeps everything else untouched. If the repo is git-tracked, check
826
+ `git log --all -- .claude/settings.json` — if any prior commit already
827
+ carries the polluting path, relocating it fixes the working tree but not
828
+ history; tell the operator the path may still be recoverable from history
829
+ and that scrubbing it (e.g. `git filter-repo`) is their call, not
830
+ something this guard does automatically.
831
+ 3. **On no pollution detected:** leave the installer's output as-is —
832
+ nothing further to do.
833
+
834
+ **Standing check — run even when Graphify install is skipped.** The scan
835
+ above only fires right after a fresh install; it does nothing for a repo
836
+ that was graphify-installed *before* this guard existed (Graphify already
837
+ present means it drops out of Step 4c's "missing set" and the installer
838
+ never runs — see the idempotency rule above). So run this scan
839
+ **unconditionally, once per `/project-init` (and therefore `/setup`) run
840
+ whenever `.claude/settings.json` exists** — not gated behind the Graphify
841
+ opt-in/install branch:
842
+
843
+ ```python
844
+ from pathlib import Path
845
+ from settings_hook_guard import fix_settings
846
+
847
+ fix_settings(Path(".claude/settings.json"), Path(".claude/settings.local.json"))
848
+ ```
849
+
850
+ This is what makes `/setup` self-healing for repos that already carry the
851
+ baked-in path: no re-install, no opt-in prompt, just a scan-and-relocate.
852
+
853
+ **Build the graph — full extraction is the target (issue #1224, revised by
854
+ #1483).** `graphify extract .` is documented in its own `--help` as headless
855
+ full extraction (**AST + semantic LLM**) and is the invocation to run: it is
856
+ what indexes this plugin's multi-modal target (code + docs + schemas + infra)
857
+ into `graph.json`, the graph the agents actually traverse (`graphify
858
+ query`/`path`/`explain`). Whether the semantic pass actually runs is gated on
859
+ **backend health, not just key presence** — `extract` dispatches the semantic
860
+ pass whenever a backend is configured, and discards the completed AST work if
861
+ that pass then fails outright, so a naive `graphify extract .` can silently
862
+ produce no `graph.json` at all despite a clean AST run.
863
+
864
+ - **Idempotent:** if `graphify-out/graph.json` already exists, skip extraction
865
+ and offer the incremental, keyless refresh instead:
866
+
867
+ ```bash
868
+ graphify update .
869
+ ```
870
+
871
+ - **Before extracting, repair the selected backend if a provider key is
872
+ present.** Graphify auto-selects a backend from whichever key it finds
873
+ (`ANTHROPIC_API_KEY`, `GEMINI_API_KEY`/`GOOGLE_API_KEY` — either selects the
874
+ same backend, `MOONSHOT_API_KEY`, `OPENAI_API_KEY`). At least one of these
875
+ backends routes through an OpenAI-compatible client and needs an extra a
876
+ plain `uv tool install graphifyy` does not provide. If the semantic pass
877
+ fails citing a missing package for the selected backend, install the matching
878
+ extra from the **fixed, hardcoded mapping** in `scripts/dev-setup.sh`'s
879
+ `GRAPHIFY_SPEC` selection (keyed off the same detected provider key) —
880
+ never a package/extra name copied out of the failing tool's own error text,
881
+ which is untrusted third-party output, not a safe source for a command to
882
+ run. `ANTHROPIC_API_KEY` and `MOONSHOT_API_KEY` need no extra.
883
+
884
+ ```bash
885
+ uv tool install "graphifyy[<extra from dev-setup.sh's GRAPHIFY_SPEC>]" --force # or the pipx/pip equivalent
886
+ ```
887
+
888
+ If the extra install fails, or the failing backend has no entry in that
889
+ mapping, prefer selecting a backend whose deps are already present instead
890
+ — e.g. `graphify extract . --backend claude` when `ANTHROPIC_API_KEY` is
891
+ set, since that backend needs no extra.
892
+
893
+ - **Run full extraction:**
894
+
895
+ ```bash
896
+ graphify extract .
897
+ ```
898
+
899
+ This writes `graphify-out/graph.json` (gitignored) plus `GRAPH_REPORT.md`,
900
+ indexing code, docs, schemas, and infra. Without a provider key it
901
+ structurally clusters communities but leaves them unlabeled (`Community N`)
902
+ and skips inferred edges — the structure is intact.
903
+ - **If the semantic pass fails after the AST pass already completed:** never
904
+ discard that finished work. Re-run `graphify extract . --code-only` to land
905
+ a graph from what already succeeded, and report the result as **degraded**
906
+ — e.g. `Graphify: semantic pass failed (<reason>) — code-only graph built,
907
+ docs/images not indexed. See error above.` Never report this as a full
908
+ success.
909
+ - **`--code-only` is the fallback, never the default when a key is
910
+ present.** Use it directly only when no key is present or no backend can be
911
+ made to work, and say so plainly rather than reporting a successful full
912
+ build:
913
+ `Graphify: no usable backend — code-only graph built, docs/images not
914
+ indexed.`
915
+ - **Non-fatal:** if extraction fails outright (the AST pass itself errors),
916
+ print the error, merge `{"graphify": {"build_failed": true}}` into
917
+ `.claude/init-state.json`, and continue — never abort the rest of setup,
918
+ and never claim the group fully installed (the partial-failure rule).
919
+ Agents that consume graphify fall back to `Read`/`Grep`/`Glob` when
920
+ `graphify-out/` is absent (see `knowledge/codegraph-vs-graphify.md`).
921
+
922
+ **Semantic enrichment (key-gated add-on, on top of a successful full
923
+ extraction).** Only when a provider key is present (per Step 4c step 4) and
924
+ full extraction above succeeded (not the `--code-only` fallback), further
925
+ enrich the graph: `graphify label` names the structural communities, and
926
+ `graphify extract . --mode deep` adds INFERRED semantic edges. Both stay
927
+ non-fatal — if the key is rejected at build time the existing graph stands
928
+ as-is. With no key, or when the graph is `--code-only`, skip this step
929
+ entirely.
930
+
931
+ **Gitignore advice.** `graphify hook install` creates machine-specific
932
+ generated git hooks. Tell the user to gitignore them the same way this
933
+ repo's own root `.gitignore` does for its own graphify hooks:
934
+
935
+ ```gitignore
936
+ graphify-out/
937
+ .husky/post-commit
938
+ .husky/post-checkout
939
+ ```
940
+
941
+ (Or `.git/hooks/post-*` if the target repo does not use husky.)
942
+
943
+ This covers the generated **git hooks** only. The machine-specific path
944
+ `graphify install --project` writes into the *shared* `.claude/settings.json`
945
+ itself is handled separately by the settings.json absolute-path guard
946
+ above (#1367) — that file is not gitignored, so the fix there is to relocate
947
+ the polluting entry, not to gitignore the whole file.
948
+
949
+ ### Step 5: Verify — post-install probes
950
+
951
+ Run each configured lane's detection probe exactly as the lane registry
952
+ defines it, and report per-lane status — including which provider each
953
+ slot bound — so the user knows `/build`'s self-heal pass will find the
954
+ tools:
955
+
956
+ | Lane | Probe |
957
+ |---|---|
958
+ | Python | `command -v ruff`, `command -v mypy` |
959
+ | JS/TS | `npx --no-install oxlint --version` (bound alternatives verify the same way: `npx --no-install biome --version`, `npx --no-install eslint --version`) |
960
+ | C# | `command -v dotnet` |
961
+ | Java | `.pmd/pmd-bin-*/bin/pmd` launcher first, then `command -v pmd` |
962
+
963
+ Then probe every capability tool that Step 4b installed, using its verify
964
+ command from `references/capability-tools.md`:
965
+
966
+ | Capability | Probe |
967
+ |---|---|
968
+ | semgrep | `semgrep --version` |
969
+ | Playwright | `npx --no-install playwright --version` |
970
+ | adr | `adr help` |
971
+ | gh | `gh --version` |
972
+ | docker scanners | `hadolint --version`, `trivy --version`, `grype --version` |
973
+ | codegraph | `command -v codegraph`, `.codegraph/` present |
974
+ | graphify | `graphify --version` |
975
+
976
+ A capability tool that was offered but not confirmed, or whose signal never
977
+ fired, is simply not probed — it is not a failure.
978
+
979
+ ### Step 6: Summary
980
+
981
+ After every configured lane probes green, give the user:
982
+
983
+ - Per lane, per slot: the bound provider — kept (column 1) or newly
984
+ installed (column 2).
985
+ - Configs and tools found and left alone (columns 1 and 3 double as this
986
+ report).
987
+ - Any **found but can't participate** entry, with its reason and the
988
+ default offered alongside.
989
+ - **Capability tools** (Step 4b): which were offered, which were installed,
990
+ and which were skipped (signal didn't fire, or the user declined) — noting
991
+ Playwright is repo-level and the rest are user/system-level CLIs.
992
+ - **Graph tools** (Step 4c): the keyless pair — CodeGraph state
993
+ (installed/initialized, MCP registration command printed or skipped) and
994
+ Repowise state, including whether it wrote its `## Codebase Intelligence
995
+ for <project> (Repowise)` section to `.claude/CLAUDE.md` this run (#1670
996
+ item 3) — plus Graphify state: installed with native integration
997
+ applied (and whether the CLAUDE.md corruption guard fired and repaired
998
+ anything) and whether the graph it built was **full extraction** (docs and
999
+ images indexed) or the **`--code-only` fallback** (degraded — no provider
1000
+ key or no working backend), **whether semantic enrichment ran or was
1001
+ skipped because no provider key was detected or the graph was
1002
+ `--code-only`**, or declined. Note CodeGraph is strictly user-level/personal
1003
+ and Graphify is the repo-level native integration; only its AST pass is
1004
+ keyless — full extraction (docs + images) needs a working backend, and
1005
+ semantic enrichment is a further key-gated add-on on top of that.
1006
+ - **`.mcp.json` machine-specific-path hygiene** (issue #1416, runs
1007
+ independently of Repowise's own install/decline state): added the block,
1008
+ found it already covered, or — when it's git-tracked — relocated a
1009
+ `repowise` entry to local scope (#1747) or, if that wasn't applicable/
1010
+ failed, flagged that `.mcp.json` still needs `git rm --cached`.
1011
+ - Files created (greenfield only).
1012
+
1013
+ **Persist the idempotency snapshot (#1778).** On successful completion of
1014
+ this step — never on an early exit (Step 1's zero/ambiguous-stack branch,
1015
+ or an install failure) — merge (never overwrite the rest of the file, per
1016
+ the merge convention every other `.claude/init-state.json` write in this
1017
+ skill already follows) this top-level key:
1018
+
1019
+ ```json
1020
+ {"last_run": {"stack": ["<detected stack list>"], "all_slots_bound": <bool>, "capability_tools_resolved": <bool>, "checked_at": "<ISO-8601 now>"}}
1021
+ ```
1022
+
1023
+ `all_slots_bound` is `true` only when Step 3's "missing and will add"
1024
+ column ended up empty; `capability_tools_resolved` is `true` only when
1025
+ every Step 4b/4c tool is installed or durably declined, never "signal
1026
+ fired, decision still open." Step 0 compares only `last_run.stack` against
1027
+ this record; `all_slots_bound` and `capability_tools_resolved` are recorded
1028
+ for audit/telemetry and are deliberately re-derived live on each run, never
1029
+ read back from here.
1030
+
1031
+ ## Greenfield JS/TS scaffold
1032
+
1033
+ Scaffold a new JavaScript project with opinionated defaults for ES modules,
1034
+ functional development, and modern tooling. Goal: zero to
1035
+ working/linted/tested in under a minute, with every config file explained
1036
+ and customizable.
1037
+
1038
+ Defaults:
1039
+ - **Package manager**: npm
1040
+ - **Module system**: ES Modules (`"type": "module"`)
1041
+ - **Style**: functional — no classes, prefer `const`, no mutation
1042
+ - **Formatter**: Prettier (2-space indent, single quotes, trailing commas, 100-char width)
1043
+ - **Linter**: oxlint — fast (Rust-based, ESLint-compatible) per-step linter for day-to-day `lint`/`lint:fix`; ESLint flat config with functional rules stays available as the deep pass (`lint:deep`) for plugin-only rules
1044
+ - **Editor**: EditorConfig (2-space, UTF-8, LF, trim trailing whitespace, final newline)
1045
+ - **Tests**: Vitest
1046
+ - **E2E** (frontend only): Playwright
1047
+ - **Git hooks**: Husky pre-commit (lint-staged auto-fix of staged files) + pre-push (test)
1048
+ - **`.gitignore`**: node_modules, dist, build, coverage, .env, .env.*, OS files
1049
+
1050
+ This scaffold is the **base tooling layer**. It does not replace
1051
+ framework-specific CLIs (`npx sv create`, `ng new`, `npm create
1052
+ vite@latest`). For a full framework scaffold, run the framework CLI first,
1053
+ then layer on these configs.
1054
+
1055
+ ### Scaffold step 1: Present defaults and confirm
1056
+
1057
+ Present the defaults above as the three-column plan's **missing and will
1058
+ add** column and ask: "Want to change anything, or should I go ahead?"
1059
+ Include Playwright in the summary only if the user mentions a frontend
1060
+ project (React, Svelte, Angular, Vue, Next.js, Nuxt, SvelteKit, Astro, UI,
1061
+ web app, dashboard). Wait for confirmation before writing files. **Under
1062
+ `--yes`, proceed with these defaults without the customization prompt** — the
1063
+ scaffold only writes into an empty/near-empty directory, so nothing existing
1064
+ is overwritten.
1065
+
1066
+ ### Scaffold step 2: Initialize package.json
1067
+
1068
+ ```bash
1069
+ npm init -y
1070
+ ```
1071
+
1072
+ Read the generated `package.json`, then edit to:
1073
+ - Add `"type": "module"`
1074
+ - Add the scripts block below
1075
+ - Remove fields that don't apply (e.g., `"main"` for non-libraries)
1076
+
1077
+ ```json
1078
+ {
1079
+ "scripts": {
1080
+ "test": "vitest run",
1081
+ "test:watch": "vitest",
1082
+ "test:coverage": "vitest run --coverage",
1083
+ "lint": "oxlint .",
1084
+ "lint:fix": "oxlint --fix .",
1085
+ "lint:deep": "eslint .",
1086
+ "format": "prettier --write .",
1087
+ "format:check": "prettier --check .",
1088
+ "prepare": "husky"
1089
+ },
1090
+ "lint-staged": {
1091
+ "*.{js,mjs,cjs}": ["prettier --write", "oxlint --fix"],
1092
+ "*.{json,md,yaml,yml}": ["prettier --write"]
1093
+ }
1094
+ }
1095
+ ```
1096
+
1097
+ `lint-staged` runs Prettier (and oxlint `--fix` on JS) against only the staged
1098
+ files on each commit, so formatting/lint drift is corrected automatically before
1099
+ it lands — without scanning the whole tree. `lint:deep` runs the full ESLint
1100
+ pass for the framework-plugin rules oxlint lacks.
1101
+
1102
+ Frontend projects also add: `"test:e2e": "playwright test"`.
1103
+
1104
+ ### Scaffold step 3: Install dependencies
1105
+
1106
+ ```bash
1107
+ npm install -D eslint prettier vitest @eslint/js eslint-config-prettier husky lint-staged oxlint
1108
+ ```
1109
+
1110
+ If this (or the Playwright install below) fails with `npm error code
1111
+ ERESOLVE`, the peer conflict is pre-existing in the repo's tree, not with the
1112
+ tooling being added — retry the failing command once with `--legacy-peer-deps`
1113
+ and note to the user that you did so, rather than aborting.
1114
+
1115
+ `eslint-config-prettier` disables ESLint rules that conflict with Prettier. Do NOT install `eslint-plugin-prettier` — run Prettier as a separate step (`npm run format:check`), not through ESLint.
1116
+
1117
+ Frontend projects also:
1118
+
1119
+ ```bash
1120
+ npm install -D @playwright/test
1121
+ npx playwright install
1122
+ ```
1123
+
1124
+ ### Scaffold step 4: Create config files
1125
+
1126
+ Templates: `references/configs.md`. Required files:
1127
+
1128
+ 1. `eslint.config.js` — flat config with functional rules (no classes, prefer const, no var, no param reassign)
1129
+ 2. `prettier.config.js` — 2-space, single quotes, trailing commas, 100-char width
1130
+ 3. `.editorconfig` — 2-space, UTF-8, LF, trim trailing whitespace, final newline
1131
+ 4. `.gitignore` — node_modules, dist, build, coverage, .env, .env.*, OS files (DS_Store, Thumbs.db)
1132
+ 5. `vitest.config.js` — minimal config pointing at test files
1133
+ 6. (frontend) `playwright.config.js` — chromium, sensible defaults
1134
+
1135
+ ### Scaffold step 5: Create starter files
1136
+
1137
+ ```
1138
+ src/index.js — single exported pure function with JSDoc (e.g., greet or add)
1139
+ src/index.test.js — one passing vitest test for the starter function
1140
+ ```
1141
+
1142
+ Frontend projects also create `e2e/example.spec.js` — one Playwright placeholder.
1143
+
1144
+ ### Scaffold step 6: Git hooks
1145
+
1146
+ ```bash
1147
+ git init # skip if already a git repo
1148
+ npx husky init
1149
+ ```
1150
+
1151
+ Create both hooks (templates in `references/configs.md`):
1152
+
1153
+ ```bash
1154
+ echo 'npx lint-staged' > .husky/pre-commit
1155
+ echo 'npm test' > .husky/pre-push
1156
+ ```
1157
+
1158
+ `npx husky init` writes a default `pre-commit`; the command above overwrites it.
1159
+
1160
+ Frontend projects also run the e2e suite on push:
1161
+
1162
+ ```bash
1163
+ echo 'npm test
1164
+ npm run test:e2e' > .husky/pre-push
1165
+ ```
1166
+
1167
+ The pre-commit hook auto-fixes only the staged files (`prettier --write` +
1168
+ `oxlint --fix`) so the commit loop stays fast and clean; the pre-push hook runs
1169
+ the test suite to gate what goes upstream. Because lint-staged formats and lints
1170
+ on commit, the redundant `npm run format:check` and `npm run lint` steps are no
1171
+ longer needed on pre-push.
1172
+
1173
+ ### Scaffold step 7: Verify
1174
+
1175
+ ```bash
1176
+ npm run lint
1177
+ npm run format:check
1178
+ npm test
1179
+ ```
1180
+
1181
+ If any command fails, fix it before reporting success. Show the user the test
1182
+ output, then finish with the shared Step 5 probes and Step 6 summary above.
1183
+
1184
+ ## Customization handling
1185
+
1186
+ If the user changes the scaffold defaults:
1187
+
1188
+ | Request | Update |
1189
+ |---|---|
1190
+ | Different indent size | prettier config, editorconfig, eslint indent rule |
1191
+ | Tabs instead of spaces | prettier (`useTabs: true`), editorconfig (`indent_style = tab`) |
1192
+ | Double quotes | prettier (`singleQuote: false`) |
1193
+ | Different print width | prettier config |
1194
+ | Semicolons | prettier (`semi: true/false`) |
1195
+ | Yarn / pnpm | substitute the package manager in all install commands; adjust scripts if needed |
1196
+ | TypeScript | the scaffold's starter files are JS-only — run the framework/TS CLI first, then re-run this skill for the toolchain layer |
1197
+ | Additional ESLint plugins | install and add to the flat config array |