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.
- package/LICENSE +21 -0
- package/PORTING.md +134 -0
- package/README.md +207 -0
- package/UPSTREAM.json +64 -0
- package/agents/Explore.md +15 -0
- package/agents/a11y-review.md +118 -0
- package/agents/adr-author.md +70 -0
- package/agents/ai-provenance-review.md +120 -0
- package/agents/angular-reactivity-review.md +95 -0
- package/agents/arch-review.md +135 -0
- package/agents/architect.md +78 -0
- package/agents/autoship-batch-proposer.md +69 -0
- package/agents/claude-setup-review.md +136 -0
- package/agents/codebase-recon.md +184 -0
- package/agents/component-architecture-review.md +119 -0
- package/agents/concurrency-review.md +109 -0
- package/agents/correctness-review.md +290 -0
- package/agents/data-flow-tracer.md +120 -0
- package/agents/doc-review.md +165 -0
- package/agents/domain-review.md +136 -0
- package/agents/general-purpose.md +10 -0
- package/agents/gherkin-quality-critic.md +113 -0
- package/agents/js-fp-review.md +114 -0
- package/agents/mutation-kill.md +684 -0
- package/agents/naming-review.md +142 -0
- package/agents/orchestrator.md +339 -0
- package/agents/performance-review.md +105 -0
- package/agents/plan-review-acceptance.md +115 -0
- package/agents/plan-review-design.md +90 -0
- package/agents/plan-review-parallelization.md +84 -0
- package/agents/plan-review-strategic.md +96 -0
- package/agents/plan-review-ux.md +110 -0
- package/agents/platform-engineer.md +64 -0
- package/agents/product-manager.md +68 -0
- package/agents/progress-guardian.md +79 -0
- package/agents/qa-engineer.md +289 -0
- package/agents/quality-reviewer.md +132 -0
- package/agents/react-reactivity-review.md +102 -0
- package/agents/refactor-opportunity-review.md +128 -0
- package/agents/security-engineer.md +60 -0
- package/agents/security-review.md +218 -0
- package/agents/session-analysis.md +95 -0
- package/agents/software-engineer.md +105 -0
- package/agents/spec-compliance-review.md +100 -0
- package/agents/spec-reviewer.md +114 -0
- package/agents/structure-review.md +146 -0
- package/agents/tech-writer.md +84 -0
- package/agents/test-review.md +246 -0
- package/agents/test-smell-review.md +188 -0
- package/agents/token-efficiency-review.md +139 -0
- package/agents/ui-ux-designer.md +54 -0
- package/agents/vue-reactivity-review.md +95 -0
- package/bin/__pycache__/claudecpython-314.pyc +0 -0
- package/bin/claude +258 -0
- package/docs/upstream/.pages +1 -0
- package/docs/upstream/CHANGELOG.md +2586 -0
- package/docs/upstream/README.md +155 -0
- package/docs/upstream/agent-architecture.md +214 -0
- package/docs/upstream/agent_info.md +187 -0
- package/docs/upstream/artifact-migration.md +124 -0
- package/docs/upstream/code-intelligence-nudge.md +149 -0
- package/docs/upstream/code-review-process.md +294 -0
- package/docs/upstream/concurrent-use.md +73 -0
- package/docs/upstream/context-management.md +111 -0
- package/docs/upstream/developer-notes.md +280 -0
- package/docs/upstream/diagrams/architecture-overview.svg +101 -0
- package/docs/upstream/diagrams/review-dispatch.svg +139 -0
- package/docs/upstream/diagrams/team-agents.svg +128 -0
- package/docs/upstream/diagrams/test-improve-flow.svg +166 -0
- package/docs/upstream/diagrams/workflow-linear.svg +66 -0
- package/docs/upstream/diagrams/workflow-three-phase.svg +200 -0
- package/docs/upstream/eval-maintenance.md +95 -0
- package/docs/upstream/eval-running-guide.md +147 -0
- package/docs/upstream/eval-system.md +291 -0
- package/docs/upstream/session-review-oss-complements.md +75 -0
- package/docs/upstream/session-review.md +212 -0
- package/docs/upstream/skills.md +188 -0
- package/docs/upstream/team-structure.md +21 -0
- package/docs/upstream/telemetry-ci-access.md +129 -0
- package/docs/upstream/telemetry-repo-security.md +120 -0
- package/docs/upstream/test-evaluation.md +277 -0
- package/docs/upstream/test-improve.md +154 -0
- package/docs/upstream/triage-workflow.md +282 -0
- package/docs/upstream/workflows.md +289 -0
- package/extensions/dev-team/index.ts +539 -0
- package/extensions/dev-team/lib/agents.ts +272 -0
- package/extensions/dev-team/lib/ai-credits.ts +92 -0
- package/extensions/dev-team/lib/autocompact.ts +81 -0
- package/extensions/dev-team/lib/child-run.ts +102 -0
- package/extensions/dev-team/lib/config.ts +236 -0
- package/extensions/dev-team/lib/gh-command.ts +103 -0
- package/extensions/dev-team/lib/github-style.ts +307 -0
- package/extensions/dev-team/lib/hooks.ts +350 -0
- package/extensions/dev-team/lib/metrics.ts +115 -0
- package/extensions/dev-team/lib/safe-read.ts +49 -0
- package/extensions/dev-team/lib/session-files.ts +57 -0
- package/extensions/dev-team/lib/session-spend.ts +123 -0
- package/extensions/dev-team/lib/shell-scan.ts +205 -0
- package/extensions/dev-team/lib/skills.ts +213 -0
- package/extensions/dev-team/lib/subagent-render.ts +245 -0
- package/extensions/dev-team/lib/subagent-types.ts +164 -0
- package/extensions/dev-team/lib/subagent.ts +596 -0
- package/extensions/dev-team/lib/terminal-text.ts +54 -0
- package/extensions/dev-team/lib/tools-misc.ts +152 -0
- package/extensions/dev-team/lib/transcript.ts +110 -0
- package/extensions/dev-team/lib/trust.ts +52 -0
- package/extensions/dev-team/lib/usage-breakdown.ts +176 -0
- package/extensions/dev-team/lib/usage-chart.ts +153 -0
- package/extensions/dev-team/lib/usage-command.ts +107 -0
- package/extensions/dev-team/lib/usage-history.ts +203 -0
- package/extensions/dev-team/lib/usage-render.ts +225 -0
- package/extensions/dev-team/lib/usage-split-bar.ts +127 -0
- package/extensions/dev-team/lib/usage-state.ts +116 -0
- package/extensions/dev-team/lib/usage-text.ts +159 -0
- package/extensions/dev-team/lib/usage-view.ts +109 -0
- package/hooks/__pycache__/refactor_test_freeze_guard.cpython-314.pyc +0 -0
- package/hooks/agent_dispatch_ledger.py +190 -0
- package/hooks/autocompact_setup_nudge.py +99 -0
- package/hooks/bash_retry_guard.py +228 -0
- package/hooks/boundary_events_write_guard.py +352 -0
- package/hooks/code_intelligence_nudge.py +293 -0
- package/hooks/code_intelligence_turn_mark.py +317 -0
- package/hooks/codegraph_bootstrap.py +139 -0
- package/hooks/contract_version_guard.py +362 -0
- package/hooks/cost_meter.py +106 -0
- package/hooks/destructive-commands.json +62 -0
- package/hooks/destructive_guard.py +477 -0
- package/hooks/eval_compliance_check.py +440 -0
- package/hooks/guards.json +17 -0
- package/hooks/hooks.json +323 -0
- package/hooks/internal_double_gate.py +296 -0
- package/hooks/js_fp_review.py +212 -0
- package/hooks/knowledge_index.py +119 -0
- package/hooks/lib/__pycache__/artifact_paths.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/atomic_state.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/autocompact_config.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/boundary_events.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/doc_classification.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/gh_pr_create_detect.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/git_safe_diff.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/instrument_log.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/metrics_query.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/plugin_version.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/pre_commit_doc_classifier.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_agent_registry.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_gate_corroboration.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_gate_hash.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_verdicts.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/stdin_json.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/stryker_invocation.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/telemetry_consent.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/test_file_classify.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/token_efficiency_limits.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/verify_guard_state.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/xunit_v3_operator_gate.cpython-314.pyc +0 -0
- package/hooks/lib/agent_skill_hints.py +74 -0
- package/hooks/lib/artifact_paths.py +263 -0
- package/hooks/lib/atomic_state.py +557 -0
- package/hooks/lib/autocompact_config.py +103 -0
- package/hooks/lib/autoship_log.py +106 -0
- package/hooks/lib/banned_scripts_policy.py +51 -0
- package/hooks/lib/boundary_events.py +436 -0
- package/hooks/lib/build_knowledge_index.py +504 -0
- package/hooks/lib/build_skills_index.py +361 -0
- package/hooks/lib/build_state.py +116 -0
- package/hooks/lib/classify_ship_outcome.py +126 -0
- package/hooks/lib/config_changelog_schema.py +115 -0
- package/hooks/lib/cost_meter.py +955 -0
- package/hooks/lib/doc_classification.py +116 -0
- package/hooks/lib/gh_pr_create_detect.py +136 -0
- package/hooks/lib/git_safe_diff.py +123 -0
- package/hooks/lib/instrument_log.py +66 -0
- package/hooks/lib/iteration_journal_gate.py +197 -0
- package/hooks/lib/knowledge_index_paths.py +88 -0
- package/hooks/lib/mcp_json_repowise.py +177 -0
- package/hooks/lib/metrics_query.py +202 -0
- package/hooks/lib/minimal_yaml.py +434 -0
- package/hooks/lib/plugin_version.py +142 -0
- package/hooks/lib/pre_commit_detect.py +537 -0
- package/hooks/lib/pre_commit_doc_classifier.py +126 -0
- package/hooks/lib/pricing.py +118 -0
- package/hooks/lib/report_pdf.py +371 -0
- package/hooks/lib/review_agent_registry.py +142 -0
- package/hooks/lib/review_dispatch_ledger.py +101 -0
- package/hooks/lib/review_gate_corroboration.py +521 -0
- package/hooks/lib/review_gate_hash.py +252 -0
- package/hooks/lib/review_gate_normalized_hash.py +1115 -0
- package/hooks/lib/review_verdicts.py +301 -0
- package/hooks/lib/run_report.py +160 -0
- package/hooks/lib/skill_categories.yaml +125 -0
- package/hooks/lib/stdin_json.py +57 -0
- package/hooks/lib/stryker_invocation.py +102 -0
- package/hooks/lib/telemetry_consent.py +41 -0
- package/hooks/lib/telemetry_report.py +108 -0
- package/hooks/lib/test_file_classify.py +160 -0
- package/hooks/lib/token_efficiency_limits.py +51 -0
- package/hooks/lib/turn_identity.py +77 -0
- package/hooks/lib/verify_guard_state.py +110 -0
- package/hooks/lib/workflow_state.py +206 -0
- package/hooks/lib/xunit_v3_operator_gate.py +596 -0
- package/hooks/mcp_json_repowise_nudge.py +74 -0
- package/hooks/mutation_adapters/__init__.py +7 -0
- package/hooks/mutation_adapters/__pycache__/__init__.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/lib.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/mutmut.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/pitest.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/stryker.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/stryker_net.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/lib.py +478 -0
- package/hooks/mutation_adapters/mutmut.py +188 -0
- package/hooks/mutation_adapters/pitest.py +266 -0
- package/hooks/mutation_adapters/stryker.py +157 -0
- package/hooks/mutation_adapters/stryker_net.py +264 -0
- package/hooks/mutation_gate.py +193 -0
- package/hooks/mutation_testing_smoke_gate.py +371 -0
- package/hooks/pending_review_notify.py +121 -0
- package/hooks/phase_marker.py +138 -0
- package/hooks/post_compact_state_reinject.py +180 -0
- package/hooks/post_format.py +115 -0
- package/hooks/pre_commit_knowledge_index.py +128 -0
- package/hooks/pre_commit_review.py +66 -0
- package/hooks/pre_pr_review.py +694 -0
- package/hooks/pre_tool_guard.py +405 -0
- package/hooks/py.sh +73 -0
- package/hooks/refactor-bash-write-patterns.json +29 -0
- package/hooks/refactor_test_bash_guard.py +253 -0
- package/hooks/refactor_test_freeze_guard.py +139 -0
- package/hooks/refactor_test_revert_guard.py +186 -0
- package/hooks/repo_review_nudge.py +287 -0
- package/hooks/review_verdict_recorder.py +464 -0
- package/hooks/scan_bash_command_for_banned_scripts.py +428 -0
- package/hooks/scan_worktree_for_banned_scripts.py +238 -0
- package/hooks/session_learning_trigger.py +248 -0
- package/hooks/skills_index.py +126 -0
- package/hooks/stryker_xunit_shim_guard.py +571 -0
- package/hooks/subagent_completion_guard.py +309 -0
- package/hooks/subagent_skill_context.py +139 -0
- package/hooks/task_completion_metrics.py +216 -0
- package/hooks/tdd_guard.py +229 -0
- package/hooks/telemetry.py +341 -0
- package/hooks/token_efficiency_review.py +194 -0
- package/hooks/verify_guard.py +183 -0
- package/hooks/verify_guard_edit_marker.py +73 -0
- package/hooks/version_check.py +173 -0
- package/knowledge/accepted-risks-schema.md +98 -0
- package/knowledge/adr-decision-criteria.md +64 -0
- package/knowledge/adversarial-review-protocol.md +139 -0
- package/knowledge/agent-registry.md +228 -0
- package/knowledge/agent-review-methodology.md +80 -0
- package/knowledge/ai-friendly-repo-guidelines.md +67 -0
- package/knowledge/architecture-assessment.md +96 -0
- package/knowledge/artifact-lifecycle.md +57 -0
- package/knowledge/cd-maturity-model.md +82 -0
- package/knowledge/cd-test-architecture.md +190 -0
- package/knowledge/ci-cd-file-scope.md +24 -0
- package/knowledge/codegraph-vs-graphify.md +192 -0
- package/knowledge/component-test-patterns.md +139 -0
- package/knowledge/database-change-management.md +80 -0
- package/knowledge/database-test-patterns.md +79 -0
- package/knowledge/decision-defaults.md +88 -0
- package/knowledge/dependency-breaking-techniques.md +116 -0
- package/knowledge/deployment-pipeline.md +86 -0
- package/knowledge/design-smells.md +122 -0
- package/knowledge/directory-enumeration.md +38 -0
- package/knowledge/domain-modeling.md +123 -0
- package/knowledge/evidence-bundle.md +90 -0
- package/knowledge/exploratory-testing-field-guide.md +122 -0
- package/knowledge/failure-routing.md +28 -0
- package/knowledge/fixture-construction.md +56 -0
- package/knowledge/frontend-component-architecture.md +139 -0
- package/knowledge/gherkin-quality-review-dispatch.md +135 -0
- package/knowledge/index.json +6766 -0
- package/knowledge/internal-collaborator-doubling.md +101 -0
- package/knowledge/legacy-test-strategy.md +71 -0
- package/knowledge/long-run-waiting.md +66 -0
- package/knowledge/microservice-testing.md +71 -0
- package/knowledge/model-pricing.json +23 -0
- package/knowledge/mutation-score-formulas.md +60 -0
- package/knowledge/object-calisthenics.md +147 -0
- package/knowledge/oracle-provenance.md +94 -0
- package/knowledge/orchestrator-script-implementation.md +185 -0
- package/knowledge/owasp-detection.md +148 -0
- package/knowledge/plan-review-rubric.md +56 -0
- package/knowledge/proxy-connectivity.md +62 -0
- package/knowledge/reactive-effect-patterns.md +73 -0
- package/knowledge/recon-inventory-excludes.txt +32 -0
- package/knowledge/references/bdd-value-guide.md +61 -0
- package/knowledge/references/csharp-http-client-testing.md +264 -0
- package/knowledge/release-strategies.md +74 -0
- package/knowledge/report-output-location.md +117 -0
- package/knowledge/report-pdf-integration.md +63 -0
- package/knowledge/report-print.css +129 -0
- package/knowledge/report-template.md +114 -0
- package/knowledge/report-to-pdf.md +69 -0
- package/knowledge/request-processing-flow.md +63 -0
- package/knowledge/result-verification.md +52 -0
- package/knowledge/review-agent-output-contract.md +121 -0
- package/knowledge/review-lens-classification.md +113 -0
- package/knowledge/review-rubric.md +62 -0
- package/knowledge/review-template.md +104 -0
- package/knowledge/rule-fixtures/A02.insecure-random-js/negative.js +1 -0
- package/knowledge/rule-fixtures/A02.insecure-random-js/positive.js +1 -0
- package/knowledge/rule-fixtures/A02.weak-hashing-md5/negative.py +1 -0
- package/knowledge/rule-fixtures/A02.weak-hashing-md5/positive.py +1 -0
- package/knowledge/rule-fixtures/A03.command-injection/negative.js +1 -0
- package/knowledge/rule-fixtures/A03.command-injection/positive.js +1 -0
- package/knowledge/rule-fixtures/A03.sql-injection/negative.js +1 -0
- package/knowledge/rule-fixtures/A03.sql-injection/positive.js +1 -0
- package/knowledge/rule-fixtures/A03.xss-innerhtml/negative.js +1 -0
- package/knowledge/rule-fixtures/A03.xss-innerhtml/positive.js +1 -0
- package/knowledge/rule-fixtures/A05.cors-wildcard/negative.js +1 -0
- package/knowledge/rule-fixtures/A05.cors-wildcard/positive.js +1 -0
- package/knowledge/rule-fixtures/A05.default-credentials/negative.js +1 -0
- package/knowledge/rule-fixtures/A05.default-credentials/positive.js +1 -0
- package/knowledge/rule-fixtures/A07.jwt-alg-none/negative.js +1 -0
- package/knowledge/rule-fixtures/A07.jwt-alg-none/positive.js +1 -0
- package/knowledge/rule-fixtures/A08.binary-formatter/negative.cs +1 -0
- package/knowledge/rule-fixtures/A08.binary-formatter/positive.cs +1 -0
- package/knowledge/rule-fixtures/A08.js-eval/negative.js +1 -0
- package/knowledge/rule-fixtures/A08.js-eval/positive.js +1 -0
- package/knowledge/rule-fixtures/A08.object-input-stream/negative.java +1 -0
- package/knowledge/rule-fixtures/A08.object-input-stream/positive.java +1 -0
- package/knowledge/schemas/disposition-register-v1.json +65 -0
- package/knowledge/schemas/recon-envelope-v1.json +198 -0
- package/knowledge/schemas/unified-finding-v1.json +72 -0
- package/knowledge/security-primitives-contract.md +301 -0
- package/knowledge/security-review-rule-map.yaml +107 -0
- package/knowledge/skills-registry.md +72 -0
- package/knowledge/task-size-classifier.md +103 -0
- package/knowledge/telemetry-schema.md +881 -0
- package/knowledge/test-automation-maturity.md +56 -0
- package/knowledge/test-automation-principles.md +71 -0
- package/knowledge/test-cadence-tradeoffs.md +68 -0
- package/knowledge/test-doubles.md +105 -0
- package/knowledge/test-file-indicators.md +22 -0
- package/knowledge/test-layer-gates.md +35 -0
- package/knowledge/test-matrix-examples/django-batch.md +24 -0
- package/knowledge/test-matrix-examples/dotnet-grpc-fronting-api.md +90 -0
- package/knowledge/test-matrix-examples/dotnet-http-consumer.md +131 -0
- package/knowledge/test-matrix-examples/react-node-spa.md +24 -0
- package/knowledge/test-matrix-examples/spring-boot-service.md +25 -0
- package/knowledge/test-matrix-examples/ssr-htmx.md +24 -0
- package/knowledge/test-organization.md +70 -0
- package/knowledge/test-pyramid.md +84 -0
- package/knowledge/test-refactoring.md +67 -0
- package/knowledge/test-review-division-of-labor.md +85 -0
- package/knowledge/test-smells.md +80 -0
- package/knowledge/test-stack-profiles/bdd-frameworks.md +235 -0
- package/knowledge/test-stack-profiles/django.md +13 -0
- package/knowledge/test-stack-profiles/dotnet.md +18 -0
- package/knowledge/test-stack-profiles/go.md +16 -0
- package/knowledge/test-stack-profiles/node.md +16 -0
- package/knowledge/test-stack-profiles/react.md +12 -0
- package/knowledge/test-stack-profiles/spring-boot.md +16 -0
- package/knowledge/test-stack-profiles/ssr-htmx.md +14 -0
- package/knowledge/test-stack-profiles/vue.md +12 -0
- package/knowledge/test-strategy.md +70 -0
- package/knowledge/testability-patterns.md +240 -0
- package/knowledge/testing-quadrants.md +44 -0
- package/knowledge/testing-techniques/approval.md +15 -0
- package/knowledge/testing-techniques/chaos.md +17 -0
- package/knowledge/testing-techniques/fuzz.md +15 -0
- package/knowledge/testing-techniques/property-based.md +15 -0
- package/knowledge/testing-techniques/schema-validation.md +15 -0
- package/knowledge/testing-techniques/screenshot.md +15 -0
- package/knowledge/three-phase-workflow.md +198 -0
- package/knowledge/value-patterns.md +55 -0
- package/knowledge/verification-mode.md +116 -0
- package/knowledge/virtual-service-libraries.md +75 -0
- package/knowledge/wave-consolidation-guidance.md +21 -0
- package/overrides/agents/Explore.md +15 -0
- package/overrides/agents/general-purpose.md +10 -0
- package/overrides/notes/autoship.md +6 -0
- package/overrides/notes/issues-from-assessment.md +3 -0
- package/overrides/notes/issues-from-plan.md +3 -0
- package/overrides/notes/mutation-night-watch.md +3 -0
- package/overrides/notes/mutation-testing.md +3 -0
- package/overrides/notes/pr.md +7 -0
- package/overrides/notes/project-init.md +6 -0
- package/overrides/notes/setup.md +13 -0
- package/overrides/notes/specs.md +3 -0
- package/overrides/skills/headless-run/SKILL.md +45 -0
- package/overrides/skills/upgrade/SKILL.md +30 -0
- package/overrides/skills/version/SKILL.md +25 -0
- package/package.json +36 -0
- package/scripts/authoring_digest.py +93 -0
- package/scripts/autoship_discover.py +121 -0
- package/scripts/autoship_group.py +409 -0
- package/scripts/autoship_proposals.py +494 -0
- package/scripts/autoship_queue.py +291 -0
- package/scripts/autoship_reclaim.py +495 -0
- package/scripts/build_jobs.py +108 -0
- package/scripts/build_rollback_point.py +240 -0
- package/scripts/build_slice_scope.py +157 -0
- package/scripts/build_wave.py +109 -0
- package/scripts/build_wave_reconcile.py +252 -0
- package/scripts/build_worktree_baseref.py +113 -0
- package/scripts/check_agent_scope.py +117 -0
- package/scripts/check_agent_tool_mapping.py +213 -0
- package/scripts/check_review_agent_mcp_tools.py +317 -0
- package/scripts/check_security_assessment_mcp_tools.py +165 -0
- package/scripts/checkpoint_abort.py +502 -0
- package/scripts/claude_setup_review.py +438 -0
- package/scripts/codebase_recon.py +556 -0
- package/scripts/coverage_config.py +623 -0
- package/scripts/coverage_delta_steering.py +330 -0
- package/scripts/coverage_discovery_dotnet.py +315 -0
- package/scripts/coverage_discovery_java.py +742 -0
- package/scripts/coverage_discovery_js.py +546 -0
- package/scripts/coverage_gap_ranking.py +556 -0
- package/scripts/coverage_readiness.py +455 -0
- package/scripts/coverage_report_parse.py +521 -0
- package/scripts/detect_bdd_convention.py +252 -0
- package/scripts/eval_ablation.py +376 -0
- package/scripts/gherkin_analysis_coverage_gate.py +306 -0
- package/scripts/gherkin_cross_feature_duplicate_titles_gate.py +173 -0
- package/scripts/gherkin_effectiveness_rollup.py +238 -0
- package/scripts/gherkin_failure_path_gate.py +206 -0
- package/scripts/gherkin_feature_merge.py +720 -0
- package/scripts/gherkin_stub_gate.py +163 -0
- package/scripts/gherkin_stub_merge.py +479 -0
- package/scripts/git_origin_host.py +88 -0
- package/scripts/install-java-static-analysis.py +110 -0
- package/scripts/issue_deps.py +74 -0
- package/scripts/lib/_bdd_markers.py +28 -0
- package/scripts/lib/_gherkin_text.py +93 -0
- package/scripts/lib/_vendored_tree.py +70 -0
- package/scripts/lib/autoship_state.py +397 -0
- package/scripts/lib/claude_md_guard.py +226 -0
- package/scripts/lib/deterministic_recon.py +446 -0
- package/scripts/lib/mcp_tool_grants.py +211 -0
- package/scripts/lib/plan_parse.py +386 -0
- package/scripts/lib/review_result.py +84 -0
- package/scripts/lib/review_roster.py +86 -0
- package/scripts/lib/session_log/__init__.py +34 -0
- package/scripts/lib/session_log/__pycache__/__init__.cpython-314.pyc +0 -0
- package/scripts/lib/session_log/__pycache__/records.cpython-314.pyc +0 -0
- package/scripts/lib/session_log/classify.py +231 -0
- package/scripts/lib/session_log/corrections.py +194 -0
- package/scripts/lib/session_log/discovery.py +108 -0
- package/scripts/lib/session_log/records.py +218 -0
- package/scripts/lib/session_log/redact.py +76 -0
- package/scripts/lib/session_log/signals.py +373 -0
- package/scripts/lib/session_report_downstream.py +614 -0
- package/scripts/lib/session_report_maintainer.py +1273 -0
- package/scripts/lib/session_report_shared.py +262 -0
- package/scripts/lib/settings_hook_guard.py +157 -0
- package/scripts/lib/slug.py +33 -0
- package/scripts/lib/stub_extractors/__init__.py +82 -0
- package/scripts/lib/stub_extractors/_common.py +328 -0
- package/scripts/lib/stub_extractors/csharp.py +19 -0
- package/scripts/lib/stub_extractors/go.py +173 -0
- package/scripts/lib/stub_extractors/java.py +18 -0
- package/scripts/lib/stub_extractors/jsts.py +126 -0
- package/scripts/mutation_stack_sections.py +149 -0
- package/scripts/mutation_yield_steering.py +345 -0
- package/scripts/orchestrator.py +895 -0
- package/scripts/plan_gherkin_export.py +227 -0
- package/scripts/plan_waves.py +208 -0
- package/scripts/pr_close_keyword_lint.py +108 -0
- package/scripts/progress_guardian.py +888 -0
- package/scripts/recon_inventory.py +273 -0
- package/scripts/review_findings_log.py +93 -0
- package/scripts/run_invariants.py +124 -0
- package/scripts/select_lenses.py +640 -0
- package/scripts/session_report.py +486 -0
- package/scripts/set_autocompact_env.py +221 -0
- package/scripts/ship_resume_guard.py +135 -0
- package/scripts/ship_review_gate.py +63 -0
- package/scripts/specs_convention_marker.py +103 -0
- package/scripts/test_improve_resume.py +277 -0
- package/scripts/test_review_mechanics.py +958 -0
- package/scripts/token_efficiency_review.py +322 -0
- package/scripts/verdict_scope.py +285 -0
- package/scripts/verify_gherkin_quality_critic_isolation.py +296 -0
- package/scripts/verify_tier.py +157 -0
- package/skills/adr-tools/SKILL.md +118 -0
- package/skills/agent-readiness/SKILL.md +105 -0
- package/skills/agent-readiness/ai_friendly_analyzers.py +326 -0
- package/skills/agent-readiness/scanner.py +441 -0
- package/skills/agent-readiness/scorecard.yaml +88 -0
- package/skills/api-design/SKILL.md +115 -0
- package/skills/apply-fixes/SKILL.md +171 -0
- package/skills/apply-test-doubles/SKILL.md +321 -0
- package/skills/artifact-lifecycle/SKILL.md +127 -0
- package/skills/autoship/SKILL.md +1124 -0
- package/skills/benchmark/SKILL.md +105 -0
- package/skills/branch-workflow/SKILL.md +89 -0
- package/skills/browse/SKILL.md +184 -0
- package/skills/browser-testing/SKILL.md +62 -0
- package/skills/browser-testing/references/playwright-patterns.md +216 -0
- package/skills/build/SKILL.md +422 -0
- package/skills/build/references/static-self-heal.md +245 -0
- package/skills/careful/SKILL.md +72 -0
- package/skills/cd-test-architecture/SKILL.md +371 -0
- package/skills/ci-debugging/SKILL.md +105 -0
- package/skills/co-evolution-audit/SKILL.md +269 -0
- package/skills/code-review/SKILL.md +1015 -0
- package/skills/code-review/examples/aggregated-sample.json +56 -0
- package/skills/code-review/examples/sample-report.md +41 -0
- package/skills/code-review/output-format.md +478 -0
- package/skills/code-review/scripts/activation.py +86 -0
- package/skills/code-review/scripts/change_impact.py +357 -0
- package/skills/code-review/scripts/change_shape.py +372 -0
- package/skills/code-review/scripts/change_size.py +212 -0
- package/skills/code-review/scripts/changed_file_list.py +141 -0
- package/skills/code-review/scripts/closing_pass.py +187 -0
- package/skills/code-review/scripts/consolidate.py +277 -0
- package/skills/code-review/scripts/contract_failure_report.py +185 -0
- package/skills/code-review/scripts/dispatch_reconcile.py +66 -0
- package/skills/code-review/scripts/dispatch_waves.py +164 -0
- package/skills/code-review/scripts/finding_signature.py +446 -0
- package/skills/code-review/scripts/ledger.py +283 -0
- package/skills/code-review/scripts/partition.py +169 -0
- package/skills/code-review/scripts/render_tiered_findings.py +274 -0
- package/skills/code-review/scripts/repo_invariants.py +1066 -0
- package/skills/code-review/scripts/review_context_pack.py +306 -0
- package/skills/code-review/scripts/review_round_log.py +345 -0
- package/skills/code-review/scripts/review_value_coverage.py +297 -0
- package/skills/code-review/scripts/validate_review_output.py +467 -0
- package/skills/code-review/sliced-mode.md +205 -0
- package/skills/competitive-analysis/SKILL.md +191 -0
- package/skills/context-loading-protocol/SKILL.md +157 -0
- package/skills/continue/SKILL.md +90 -0
- package/skills/cost-report/SKILL.md +178 -0
- package/skills/coverage-baseline/SKILL.md +335 -0
- package/skills/coverage-baseline/references/multi-project-discovery.md +202 -0
- package/skills/coverage-delta/SKILL.md +181 -0
- package/skills/coverage-delta/references/mutation-gate.md +70 -0
- package/skills/design-doc/SKILL.md +95 -0
- package/skills/design-interrogation/SKILL.md +89 -0
- package/skills/design-it-twice/SKILL.md +91 -0
- package/skills/docker-image-audit/SKILL.md +108 -0
- package/skills/docker-image-audit/references/install-guide.md +64 -0
- package/skills/docker-image-audit/references/report-template.md +73 -0
- package/skills/docker-image-create/SKILL.md +185 -0
- package/skills/domain-analysis/SKILL.md +183 -0
- package/skills/domain-driven-design/SKILL.md +194 -0
- package/skills/exploratory-testing/SKILL.md +108 -0
- package/skills/explore/SKILL.md +51 -0
- package/skills/farley-score/SKILL.md +165 -0
- package/skills/feature-file-validation/SKILL.md +78 -0
- package/skills/feature-file-validation/references/validation-rules.md +115 -0
- package/skills/feedback-learning/SKILL.md +414 -0
- package/skills/fix/SKILL.md +450 -0
- package/skills/freeze/SKILL.md +68 -0
- package/skills/frontend-architecture/SKILL.md +113 -0
- package/skills/gherkin-derive/SKILL.md +630 -0
- package/skills/gherkin-public/SKILL.md +266 -0
- package/skills/governance-compliance/SKILL.md +150 -0
- package/skills/guard/SKILL.md +75 -0
- package/skills/handoff/SKILL.md +139 -0
- package/skills/handoff/references/summary-templates.md +242 -0
- package/skills/harness-audit/SKILL.md +751 -0
- package/skills/harness-audit/scripts/lesson_validate.py +386 -0
- package/skills/harness-audit/scripts/redundancy_criterion.py +188 -0
- package/skills/headless-run/SKILL.md +45 -0
- package/skills/headless-run/scripts/isolated_dispatch.py +381 -0
- package/skills/help/SKILL.md +72 -0
- package/skills/hexagonal-architecture/SKILL.md +85 -0
- package/skills/human-oversight-protocol/SKILL.md +224 -0
- package/skills/issues-from-assessment/SKILL.md +223 -0
- package/skills/issues-from-plan/SKILL.md +133 -0
- package/skills/legacy-code/SKILL.md +132 -0
- package/skills/mermaid-diagramming/SKILL.md +120 -0
- package/skills/mutation-night-watch/SKILL.md +154 -0
- package/skills/mutation-night-watch/references/scheduling.md +135 -0
- package/skills/mutation-testing/SKILL.md +396 -0
- package/skills/mutation-testing/references/languages/csharp-stryker-net.md +676 -0
- package/skills/mutation-testing/references/languages/go-go-mutesting.md +95 -0
- package/skills/mutation-testing/references/languages/java-pitest.md +77 -0
- package/skills/mutation-testing/references/languages/javascript-stryker.md +188 -0
- package/skills/mutation-testing/references/languages/python-mutmut.md +97 -0
- package/skills/mutation-testing/references/time-estimation.md +34 -0
- package/skills/mutation-testing/references/tool-detection.md +15 -0
- package/skills/mutation-testing/references/workflow-callers.md +23 -0
- package/skills/mutation-testing/scripts/__pycache__/xunit_v3_feature_detector.cpython-314.pyc +0 -0
- package/skills/mutation-testing/scripts/csharp_stryker_net_slice_runner.py +635 -0
- package/skills/mutation-testing/scripts/csharp_stryker_net_status_loop.py +525 -0
- package/skills/mutation-testing/scripts/csharp_stryker_net_wrapper.py +681 -0
- package/skills/mutation-testing/scripts/mutation_baseline_reuse.py +292 -0
- package/skills/mutation-testing/scripts/mutation_exclude_policy.py +268 -0
- package/skills/mutation-testing/scripts/mutation_feasibility_gate.py +463 -0
- package/skills/mutation-testing/scripts/mutation_kill_headless.py +331 -0
- package/skills/mutation-testing/scripts/mutation_kill_insert.py +199 -0
- package/skills/mutation-testing/scripts/mutation_kill_insert_python.py +150 -0
- package/skills/mutation-testing/scripts/mutation_kill_loop.py +869 -0
- package/skills/mutation-testing/scripts/mutation_kill_loop_python.py +949 -0
- package/skills/mutation-testing/scripts/mutation_kill_retry.py +592 -0
- package/skills/mutation-testing/scripts/mutation_kill_shared.py +620 -0
- package/skills/mutation-testing/scripts/mutation_nightwatch.py +462 -0
- package/skills/mutation-testing/scripts/mutation_nightwatch_stacks.py +425 -0
- package/skills/mutation-testing/scripts/mutation_report.py +743 -0
- package/skills/mutation-testing/scripts/mutation_report_cli.py +175 -0
- package/skills/mutation-testing/scripts/mutation_safety_gate.py +69 -0
- package/skills/mutation-testing/scripts/stryker_shard_pipeline.py +847 -0
- package/skills/mutation-testing/scripts/stryker_shard_setup.py +440 -0
- package/skills/mutation-testing/scripts/stryker_timeout_retry.py +142 -0
- package/skills/mutation-testing/scripts/xunit_v3_feature_detector.py +341 -0
- package/skills/performance-benchmark/SKILL.md +174 -0
- package/skills/performance-benchmark/examples/report-format.md +43 -0
- package/skills/performance-benchmark/references/benchmark-script.md +169 -0
- package/skills/performance-metrics/SKILL.md +265 -0
- package/skills/plan/SKILL.md +199 -0
- package/skills/plan/references/gherkin-persistence.md +43 -0
- package/skills/plan/references/plan-template.md +182 -0
- package/skills/pr/SKILL.md +289 -0
- package/skills/pr/scripts/gate_retry_state.py +368 -0
- package/skills/project-init/README.md +141 -0
- package/skills/project-init/SKILL.md +1197 -0
- package/skills/project-init/evals/evals.json +200 -0
- package/skills/project-init/references/capability-tools.md +55 -0
- package/skills/project-init/references/configs.md +221 -0
- package/skills/property-based-testing/SKILL.md +121 -0
- package/skills/property-based-testing/fixtures/invariant_fixture.py +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/README.md +42 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/LICENSE +21 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/README.md +263 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/fast-check.js +12147 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/package.json +3 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/types57/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/fast-check.js +12011 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/rolldown-runtime-D7D4PA-g.js +13 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/types57/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/package.json +94 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/LICENSE +21 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/README.md +168 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/RandomGenerator-DcXj09Ch.d.ts +14 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformBigInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformBigInt.js +38 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat32.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat32.js +18 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat64.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat64.js +22 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformInt.js +134 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/RandomGenerator-DcXj09Ch.d.ts +14 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformBigInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformBigInt.js +37 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat32.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat32.js +17 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat64.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat64.js +21 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformInt.js +133 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/congruential32.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/congruential32.js +44 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/mersenne.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/mersenne.js +90 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xoroshiro128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xoroshiro128plus.js +80 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xorshift128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xorshift128plus.js +78 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/package.json +3 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/JumpableRandomGenerator.d.ts +16 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/JumpableRandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/RandomGenerator.d.ts +2 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/RandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/generateN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/generateN.js +8 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/purify.d.ts +12 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/purify.js +9 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/skipN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/skipN.js +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/congruential32.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/congruential32.js +46 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/mersenne.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/mersenne.js +92 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xoroshiro128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xoroshiro128plus.js +82 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xorshift128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xorshift128plus.js +80 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/JumpableRandomGenerator.d.ts +16 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/JumpableRandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/RandomGenerator.d.ts +2 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/RandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/generateN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/generateN.js +9 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/purify.d.ts +12 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/purify.js +10 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/skipN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/skipN.js +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/package.json +133 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/package-lock.json +1179 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/package.json +14 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/roundtrip.js +29 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/roundtrip.properties.test.js +16 -0
- package/skills/property-based-testing/fixtures/no_property_fixture.py +10 -0
- package/skills/property-based-testing/fixtures/roundtrip_fixture.py +16 -0
- package/skills/property-based-testing/references/languages/javascript.md +54 -0
- package/skills/property-based-testing/scripts/detect_and_dispatch.py +80 -0
- package/skills/property-based-testing/scripts/hypothesis_scaffold.py +276 -0
- package/skills/proxy-resilience/SKILL.md +84 -0
- package/skills/quality-gate-pipeline/SKILL.md +184 -0
- package/skills/quality-targets-converge/SKILL.md +254 -0
- package/skills/repo-review/SKILL.md +159 -0
- package/skills/report-pdf/SKILL.md +66 -0
- package/skills/review/SKILL.md +47 -0
- package/skills/review-agent/SKILL.md +152 -0
- package/skills/review-summary/SKILL.md +73 -0
- package/skills/run-report/SKILL.md +70 -0
- package/skills/semantic-duplication-scan/SKILL.md +337 -0
- package/skills/semantic-scan/SKILL.md +53 -0
- package/skills/semgrep-analyze/SKILL.md +139 -0
- package/skills/setup/SKILL.md +1122 -0
- package/skills/ship/SKILL.md +240 -0
- package/skills/source-verification/SKILL.md +210 -0
- package/skills/source-verification/scripts/claim_extractor.py +155 -0
- package/skills/specs/.size-baseline.json +4 -0
- package/skills/specs/SKILL.md +243 -0
- package/skills/specs/references/completeness-checklist.md +83 -0
- package/skills/specs/references/extraction.md +58 -0
- package/skills/specs/references/glossary.md +59 -0
- package/skills/specs/references/persistence.md +115 -0
- package/skills/specs/references/predictability-check.md +77 -0
- package/skills/static-analysis-integration/SKILL.md +235 -0
- package/skills/static-analysis-integration/adapters/_envelope.py +26 -0
- package/skills/static-analysis-integration/adapters/jscpd-adapter.py +66 -0
- package/skills/static-analysis-integration/adapters/lizard-adapter.py +81 -0
- package/skills/static-analysis-integration/adapters/mypy-adapter.py +50 -0
- package/skills/static-analysis-integration/adapters/mypy-src-layout.py +93 -0
- package/skills/static-analysis-integration/adapters/security-review-adapter.py +212 -0
- package/skills/static-analysis-integration/maintenance.md +23 -0
- package/skills/static-analysis-integration/references/language-setup.md +228 -0
- package/skills/static-analysis-integration/references/sarif-parser.md +124 -0
- package/skills/static-analysis-integration/references/security-review-adapter.md +118 -0
- package/skills/static-analysis-integration/references/tool-configs.md +617 -0
- package/skills/static-analysis-integration/rulesets/pmd-quickstart.xml +24 -0
- package/skills/stryker-xunit-v2-shim/SKILL.md +274 -0
- package/skills/stryker-xunit-v2-shim/references/shim-howto.md +256 -0
- package/skills/stryker-xunit-v2-shim/scripts/generate_shim.py +143 -0
- package/skills/systematic-debugging/SKILL.md +130 -0
- package/skills/telemetry/SKILL.md +75 -0
- package/skills/test-audit-disable/SKILL.md +129 -0
- package/skills/test-design/SKILL.md +177 -0
- package/skills/test-design/scripts/__pycache__/internal_double_detector.cpython-314.pyc +0 -0
- package/skills/test-design/scripts/internal_double_detector.py +631 -0
- package/skills/test-design-advisor/SKILL.md +166 -0
- package/skills/test-driven-development/SKILL.md +169 -0
- package/skills/test-health/SKILL.md +262 -0
- package/skills/test-improve/SKILL.md +239 -0
- package/skills/test-improve/references/phase-0-approach-contract.md +228 -0
- package/skills/test-improve/references/phase-1-analyze.md +131 -0
- package/skills/test-improve/references/phase-2-baseline.md +121 -0
- package/skills/test-improve/references/phase-3-derive-gherkin.md +53 -0
- package/skills/test-improve/references/phase-4-plan-fixes.md +34 -0
- package/skills/test-improve/references/phase-5-improve.md +215 -0
- package/skills/test-improve/references/phase-6-refactor-decision.md +45 -0
- package/skills/test-improve/references/phase-7-refactor.md +44 -0
- package/skills/test-improve/references/phase-8-validate.md +66 -0
- package/skills/test-improve/references/phase-9-close-out-prompt.md +11 -0
- package/skills/test-improve/references/phase-9-report.md +62 -0
- package/skills/test-improve/references/review-loop.md +92 -0
- package/skills/test-improve/templates/executive-summary.md +123 -0
- package/skills/threat-modeling/SKILL.md +108 -0
- package/skills/triage/SKILL.md +211 -0
- package/skills/ubiquitous-language/SKILL.md +192 -0
- package/skills/ubiquitous-language/scripts/collect_domain_signals.py +300 -0
- package/skills/unfreeze/SKILL.md +37 -0
- package/skills/upgrade/SKILL.md +31 -0
- package/skills/upgrade/scripts/check_version_drift.py +113 -0
- package/skills/upgrade/scripts/enable_autoupdate.py +149 -0
- package/skills/version/SKILL.md +25 -0
- package/sync/__pycache__/sync_upstream.cpython-314.pyc +0 -0
- package/sync/sync_upstream.py +293 -0
- package/templates/ACCEPTED-RISKS.md.tmpl +46 -0
- package/templates/agents/agent-template.md +151 -0
- package/templates/agents/angular-testing.md +66 -0
- package/templates/agents/csharp-quality.md +63 -0
- package/templates/agents/esm-enforcer.md +52 -0
- package/templates/agents/front-end-testing.md +65 -0
- package/templates/agents/go-quality.md +65 -0
- package/templates/agents/python-quality.md +62 -0
- package/templates/agents/react-testing.md +61 -0
- package/templates/agents/ts-enforcer.md +60 -0
- package/templates/agents/twelve-factor-audit.md +49 -0
- package/tools/entropy-check.py +250 -0
- package/tools/model-hash-verify.py +213 -0
|
@@ -0,0 +1,1122 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup
|
|
3
|
+
description: >-
|
|
4
|
+
Provision a repo for the dev-team plugin end to end — install the plugin's
|
|
5
|
+
own prerequisites (jq, python3, per-language mutation tooling — Stryker,
|
|
6
|
+
pitest, Stryker.NET), then generate dev-team-specific project
|
|
7
|
+
configuration — project-level CLAUDE.md, the PostToolUse formatting hook,
|
|
8
|
+
language-specific agent template activation, and a generated `/pr`
|
|
9
|
+
command — from the stack signal `/dev-team:project-init` establishes. This
|
|
10
|
+
is NOT where toolchain detection/installation itself lives (that's
|
|
11
|
+
`/project-init`); `/setup` only consumes it. Use this when onboarding a
|
|
12
|
+
new project to the dev-team plugin, when the mutation gate reports a
|
|
13
|
+
missing tool, or when the user says "setup", "bootstrap", "configure this
|
|
14
|
+
project for dev-team", "install required tools for the dev-team plugin",
|
|
15
|
+
or "activate agent templates".
|
|
16
|
+
argument-hint: "[--yes] [--dry-run] [--autocompact-pct N] [--no-autocompact]"
|
|
17
|
+
user-invocable: true
|
|
18
|
+
allowed-tools: Read, Write, Edit, Glob, Grep, Bash
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Project Setup
|
|
22
|
+
|
|
23
|
+
<!-- pi-port-notes -->
|
|
24
|
+
## pi port notes (read first — these override the steps below)
|
|
25
|
+
|
|
26
|
+
This is the pi port of `/setup`. Follow the steps below with these substitutions:
|
|
27
|
+
|
|
28
|
+
- **Hard dependencies (Step 3):** the `claude` CLI is not required. `pi`, `python3`, `jq`, `git` and `gh` are.
|
|
29
|
+
- **Step 4:** run the `project-init` skill with the `skill` tool (`dev-team:project-init` and `project-init` are the same).
|
|
30
|
+
- **Step 7 (agent templates):** activate templates into `.claude/agents/` exactly as written. The pi `dev_team_subagent` tool loads project agents from `.pi/agents/` and `.claude/agents/`, and they take precedence over the package agents.
|
|
31
|
+
- **Step 8 / 8a (project CLAUDE.md):** pi loads context files from the project root and its ancestors (`AGENTS.md`, or `CLAUDE.md`), **not** from `.claude/CLAUDE.md`. Everywhere these steps say `.claude/CLAUDE.md`, use `AGENTS.md` at the repository root instead (if the repo already has a root `CLAUDE.md` and no `AGENTS.md`, use that `CLAUDE.md`). Same merge/skip and marker rules.
|
|
32
|
+
- **Step 9 (formatting hook):** do not write `.claude/settings.json`. Instead set `"autoFormat": true` in `.pi/dev-team.json` (create the file if missing, keep other keys). The pi extension then runs `hooks/post_format.py` (prettier / ruff / black, auto-detected) after every `write`/`edit`.
|
|
33
|
+
- **Step 9b (autocompact):** run `scripts/set_autocompact_env.py` exactly as written. It only merges `env.CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` into `.claude/settings.json` (the one write to that file this port allows); the pi extension reads that value and compacts the session at that percentage of the model's window. pi's own threshold is `contextWindow - reserveTokens`, so the "values above ~83% have no effect" caveat becomes "values above pi's own threshold have no effect".
|
|
34
|
+
- **Step 10 (/pr):** write the generated project command to `.claude/skills/pr/SKILL.md` as written. The pi port resolves project skills in `.pi/skills/` and `.claude/skills/` before the package's own.
|
|
35
|
+
- **Step 11:** also add `.pi/dev-team.local.json` to the `.gitignore` block.
|
|
36
|
+
- **Step 12 (report):** list `AGENTS.md` and `.pi/dev-team.json` instead of `.claude/CLAUDE.md`, and list `.claude/settings.json` only for the Step 9b `env.CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` key. Add a line recommending `/dev-team models` to map the opus/sonnet/haiku agent tiers to this user's models.
|
|
37
|
+
<!-- pi-port-notes -->
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
Role: orchestrator. See frontmatter description for scope; delegates all
|
|
41
|
+
stack detection and toolchain install/inventory to `/dev-team:project-init`,
|
|
42
|
+
which `/setup` never re-derives.
|
|
43
|
+
|
|
44
|
+
## Orchestrator constraints
|
|
45
|
+
|
|
46
|
+
1. Detect and scaffold; delegate generation, do not review code yourself.
|
|
47
|
+
2. Install prerequisites and write config only where the user confirms.
|
|
48
|
+
3. Do not overwrite existing project config without confirming.
|
|
49
|
+
4. Be OS-aware; do not assume a package manager.
|
|
50
|
+
5. **Be concise.** Report detected stack, installed prerequisites, and
|
|
51
|
+
generated artifacts — no narration.
|
|
52
|
+
|
|
53
|
+
## Parse Arguments
|
|
54
|
+
|
|
55
|
+
Arguments: $ARGUMENTS
|
|
56
|
+
|
|
57
|
+
- `--dry-run`: Report what would be created/installed without writing any
|
|
58
|
+
files or installing anything.
|
|
59
|
+
- `--yes`: Run unattended — auto-confirm every prompt with its **safe**
|
|
60
|
+
default and pass `--yes` through when invoking `/dev-team:project-init`
|
|
61
|
+
(Step 4). No step waits for input.
|
|
62
|
+
- `--autocompact-pct N`: write `N` (integer 1-100) as the repo's
|
|
63
|
+
`CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` (Step 9b) instead of the default `40`.
|
|
64
|
+
- `--no-autocompact`: skip Step 9b's settings write and silence the
|
|
65
|
+
SessionStart nudge that recommends running `/dev-team:setup`.
|
|
66
|
+
|
|
67
|
+
### `--yes` semantics (the unattended contract)
|
|
68
|
+
|
|
69
|
+
When `--yes` is set, take these actions without prompting. **Affirmative** —
|
|
70
|
+
auto-confirm and proceed:
|
|
71
|
+
|
|
72
|
+
- Per-language mutation tooling for the detected stack (Step 6). Already
|
|
73
|
+
non-interactive when the stack is definite; `--yes` additionally suppresses
|
|
74
|
+
the ambiguous-stack fallback below.
|
|
75
|
+
- Agent-template activation for the detected stack (Step 7).
|
|
76
|
+
- Project `CLAUDE.md` (Step 8) and `/pr` (Step 10) generation **when the file
|
|
77
|
+
is absent**; the downstream `.gitignore` append (Step 11).
|
|
78
|
+
- Everything `/dev-team:project-init` auto-confirms under its own `--yes`
|
|
79
|
+
(its three-column plan, capability tools whose signal fired, and the keyless
|
|
80
|
+
CodeGraph + Repowise pair — see that skill's Arguments section).
|
|
81
|
+
|
|
82
|
+
**Conservative** — never silently overwrite an existing file or mutate the
|
|
83
|
+
repo in a surprising way; take the skip default and print a one-line note:
|
|
84
|
+
|
|
85
|
+
- **Existing project `CLAUDE.md`** (Step 8) — never overwritten (orchestrator
|
|
86
|
+
constraint 3). Skip and note it, exactly as the interactive "merge or skip"
|
|
87
|
+
path's skip branch.
|
|
88
|
+
- **Coverage-config edits** (Step 6, JS/TS readiness) — `--yes` may install the
|
|
89
|
+
additive `@vitest/coverage-v8` devDependency, but does **not** run `--patch`
|
|
90
|
+
or hand-edit an existing `jest.config.js` / `vitest.config.*`. Report the
|
|
91
|
+
hints as it does interactively; the operator applies those edits.
|
|
92
|
+
- **Graphify** — declined for this run inside `/dev-team:project-init` (see
|
|
93
|
+
that skill); it writes to the repo, so it stays opt-in even under `--yes`.
|
|
94
|
+
- **Unrecognized / ambiguous stack** — `--yes` never guesses a toolchain. Do
|
|
95
|
+
the language-neutral steps and report what could not be set up.
|
|
96
|
+
- **Concise-response preference** (Step 8a) — `--yes` never guesses a
|
|
97
|
+
communication-style preference. Skip the prompt and the `CLAUDE.md`
|
|
98
|
+
append entirely; note `concise-preference-skipped-under-yes`. This is
|
|
99
|
+
the outcome only when Step 8a's own pre-check found the block absent —
|
|
100
|
+
when the block is already present, the pre-check reports
|
|
101
|
+
`concise-preference-already-covered` before `--yes` is ever consulted,
|
|
102
|
+
regardless of whether `--yes` was passed.
|
|
103
|
+
|
|
104
|
+
**Precedence.** If both `--yes` and `--dry-run` are passed, `--dry-run` wins:
|
|
105
|
+
report only, write and install nothing, and add "`--yes` ignored under
|
|
106
|
+
`--dry-run`" to the report.
|
|
107
|
+
|
|
108
|
+
## Steps
|
|
109
|
+
|
|
110
|
+
### 1. Detect OS
|
|
111
|
+
|
|
112
|
+
Run the following and record the result:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
uname -s
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
- `Darwin` → macOS (use `brew`)
|
|
119
|
+
- `Linux` → Linux (detect package manager below)
|
|
120
|
+
- `MINGW*` or `MSYS*` (e.g. `MINGW64_NT-10.0-22621`) → Windows running Git Bash
|
|
121
|
+
(detect Windows package manager below)
|
|
122
|
+
- Other → note the platform; provide manual instructions and continue
|
|
123
|
+
|
|
124
|
+
> **Windows note:** Claude Code on Windows runs in Git Bash (MINGW) or WSL.
|
|
125
|
+
> WSL reports `Linux` and is fully handled by the Linux steps. The Windows
|
|
126
|
+
> steps below apply to native Git Bash only. If you are using WSL, follow
|
|
127
|
+
> the Linux steps instead.
|
|
128
|
+
|
|
129
|
+
For Linux, detect the available package manager:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
command -v apt-get && echo apt
|
|
133
|
+
command -v dnf && echo dnf
|
|
134
|
+
command -v yum && echo yum
|
|
135
|
+
command -v pacman && echo pacman
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Use the first one found.
|
|
139
|
+
|
|
140
|
+
For Windows (Git Bash), detect the available package manager:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
command -v winget && echo winget
|
|
144
|
+
command -v choco && echo choco
|
|
145
|
+
command -v scoop && echo scoop
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Use the first one found. If none are found, tell the user:
|
|
149
|
+
"No Windows package manager detected. Install winget (built into Windows 10/11
|
|
150
|
+
via the App Installer), Chocolatey (<https://chocolatey.org>), or Scoop
|
|
151
|
+
(<https://scoop.sh>), then re-run `/setup`."
|
|
152
|
+
|
|
153
|
+
### 2. Detect the agentic-dev-team repo and delegate to dev-setup.sh
|
|
154
|
+
|
|
155
|
+
Before installing anything, check whether this invocation is running inside
|
|
156
|
+
the agentic-dev-team plugin-dev repo itself (as opposed to a downstream
|
|
157
|
+
project that merely has the plugin installed):
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
test -f requirements-dev.txt && test -f plugins/dev-team/.claude-plugin/plugin.json && echo "in-repo" || echo "downstream"
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
- **`in-repo`**: print "Detected the agentic-dev-team repo — running
|
|
164
|
+
scripts/dev-setup.sh to bootstrap the plugin-dev toolchain (shellcheck, jq,
|
|
165
|
+
python3, Python dev dependencies)." Then run:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
bash scripts/dev-setup.sh
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Surface its stdout/stderr to the user. `dev-setup.sh` is a separate,
|
|
172
|
+
intentionally-kept bash entry point — it works before Claude Code or the
|
|
173
|
+
plugin is installed, and is reused as a generic template by
|
|
174
|
+
`/new-marketplace` for other marketplace repos (see the note at the top of
|
|
175
|
+
`scripts/dev-setup.sh`). This skill calls it rather than reimplementing its
|
|
176
|
+
install logic. After it runs, still execute Step 3's jq/python3 checks below
|
|
177
|
+
— they are idempotent and confirm dev-setup.sh's work rather than
|
|
178
|
+
duplicating installation, so running both is a harmless double-check, not
|
|
179
|
+
redundant install logic.
|
|
180
|
+
- **`downstream`**: no plugin-dev repo detected — proceed exactly as before
|
|
181
|
+
with Step 3 (existing downstream-user behavior, unchanged).
|
|
182
|
+
|
|
183
|
+
### 3. Install hard dependencies (jq and python3)
|
|
184
|
+
|
|
185
|
+
These are required by the mutation gate regardless of language.
|
|
186
|
+
|
|
187
|
+
#### jq
|
|
188
|
+
|
|
189
|
+
Check if already installed:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
command -v jq && jq --version
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
If missing, install:
|
|
196
|
+
|
|
197
|
+
| OS | Command |
|
|
198
|
+
| ---- | --------- |
|
|
199
|
+
| macOS | `brew install jq` |
|
|
200
|
+
| Linux (apt) | `sudo apt-get install -y jq` |
|
|
201
|
+
| Linux (dnf/yum) | `sudo dnf install -y jq` or `sudo yum install -y jq` |
|
|
202
|
+
| Linux (pacman) | `sudo pacman -S --noconfirm jq` |
|
|
203
|
+
| Windows (winget) | `winget install jqlang.jq` |
|
|
204
|
+
| Windows (choco) | `choco install jq` |
|
|
205
|
+
| Windows (scoop) | `scoop install jq` |
|
|
206
|
+
| Unknown | Tell the user: "Install jq manually from <https://jqlang.github.io/jq/> and re-run `/setup`." |
|
|
207
|
+
|
|
208
|
+
#### python3
|
|
209
|
+
|
|
210
|
+
Check if already installed:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
command -v python3 && python3 --version
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
If missing, install:
|
|
217
|
+
|
|
218
|
+
| OS | Command |
|
|
219
|
+
| ---- | --------- |
|
|
220
|
+
| macOS | `brew install python3` |
|
|
221
|
+
| Linux (apt) | `sudo apt-get install -y python3` |
|
|
222
|
+
| Linux (dnf/yum) | `sudo dnf install -y python3` or `sudo yum install -y python3` |
|
|
223
|
+
| Linux (pacman) | `sudo pacman -S --noconfirm python` |
|
|
224
|
+
| Windows (winget) | `winget install Python.Python.3` |
|
|
225
|
+
| Windows (choco) | `choco install python` |
|
|
226
|
+
| Windows (scoop) | `scoop install python` |
|
|
227
|
+
| Unknown | Tell the user: "Install Python 3 manually from <https://python.org> and re-run `/setup`." |
|
|
228
|
+
|
|
229
|
+
> **Windows python3 alias:** Windows installers often register the binary as
|
|
230
|
+
> `python`, not `python3`. After installing, check:
|
|
231
|
+
>
|
|
232
|
+
> ```bash
|
|
233
|
+
> command -v python3 || python --version
|
|
234
|
+
> ```
|
|
235
|
+
>
|
|
236
|
+
> If only `python` is found, create a Git Bash alias so the mutation gate can
|
|
237
|
+
> find it:
|
|
238
|
+
>
|
|
239
|
+
> ```bash
|
|
240
|
+
> echo "alias python3='python'" >> ~/.bashrc && source ~/.bashrc
|
|
241
|
+
> ```
|
|
242
|
+
>
|
|
243
|
+
> Verify with `python3 --version` before proceeding.
|
|
244
|
+
|
|
245
|
+
If either installation fails, stop and tell the user: "Could not install
|
|
246
|
+
`<tool>`. Please install it manually and re-run `/setup`."
|
|
247
|
+
|
|
248
|
+
### 4. Invoke `/dev-team:project-init` for stack detection and toolchain
|
|
249
|
+
|
|
250
|
+
Run `/dev-team:project-init` and let it complete, including its confirmation
|
|
251
|
+
gate, before continuing. **Under `--yes`, invoke it as
|
|
252
|
+
`/dev-team:project-init --yes`** so its own gates auto-confirm with their safe
|
|
253
|
+
defaults rather than blocking (see that skill's Arguments section).
|
|
254
|
+
|
|
255
|
+
### 5. Record the stack signal for dev-team's own use
|
|
256
|
+
|
|
257
|
+
`/setup` still needs a small, cheap signal of its own to populate
|
|
258
|
+
`.claude/project-stack.json` and to drive Step 6's mutation-tool selection
|
|
259
|
+
and Step 7's template selection. `/dev-team:project-init` performs its own
|
|
260
|
+
detection in Step 4 but persists no machine-readable artifact for `/setup`
|
|
261
|
+
to consume, so this is a deliberate lightweight re-probe using the same
|
|
262
|
+
indicator conventions (`skills/project-init/SKILL.md` Step 1 and Step 2) —
|
|
263
|
+
`package.json`, `tsconfig.json`, `pyproject.toml`/`requirements*.txt`,
|
|
264
|
+
`*.csproj`/`*.sln`, `pom.xml`/`build.gradle*` — plus the handful of framework
|
|
265
|
+
dependency checks (`react`, `vue`, `svelte`, `@angular/core`, `next`,
|
|
266
|
+
`django`, `flask`, `fastapi`) that project-init's own stack table doesn't
|
|
267
|
+
record. It does not repeat project-init's heavier JS/TS ES-module/
|
|
268
|
+
TypeScript/require-scan checks or its formatter-selection logic (those stay
|
|
269
|
+
entirely project-init's job — its Step 4/Scaffold steps and Step 4b/4c) and
|
|
270
|
+
it does not install anything.
|
|
271
|
+
|
|
272
|
+
Write findings to `.claude/project-stack.json`:
|
|
273
|
+
|
|
274
|
+
```json
|
|
275
|
+
{
|
|
276
|
+
"detected": "2026-03-18",
|
|
277
|
+
"stacks": ["typescript", "node"],
|
|
278
|
+
"frameworks": ["react", "vitest"],
|
|
279
|
+
"packageManager": "npm|yarn|pnpm|bun",
|
|
280
|
+
"hasDocker": true,
|
|
281
|
+
"indicators": {
|
|
282
|
+
"package.json": true,
|
|
283
|
+
"tsconfig.json": true
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### 6. Install per-language mutation tooling
|
|
289
|
+
|
|
290
|
+
Mutation-tool installation is **strictly relative to the detected stack**.
|
|
291
|
+
Do not decide which language sections to run by hand — the mapping is a
|
|
292
|
+
deterministic helper, so the wrong-stack probe (e.g. `dotnet` on a JS repo)
|
|
293
|
+
cannot fire. Call it once:
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/mutation_stack_sections.py" .
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
It reads `.claude/project-stack.json`'s `stacks` array (recorded in Step 5)
|
|
300
|
+
and prints one JSON object:
|
|
301
|
+
|
|
302
|
+
```json
|
|
303
|
+
{ "sections": ["js"], "stacks": ["typescript", "node"], "ambiguous": false, "note": null }
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
- `sections` — the sections to run, from `js` (JS/TS — Stryker), `java`
|
|
307
|
+
(Java/Kotlin — pitest), `csharp` (C#/.NET — Stryker.NET), `python`
|
|
308
|
+
(Python — mutmut). The mapping is `typescript`/`node`/`javascript` → `js`,
|
|
309
|
+
`java`/`kotlin` → `java`, `csharp`/`dotnet` → `csharp`, `python` →
|
|
310
|
+
`python`. **Run every section in `sections` and no others.** More than one
|
|
311
|
+
may apply in a polyglot repo.
|
|
312
|
+
- `ambiguous` — `true` **only** when the stack signal is genuinely empty or
|
|
313
|
+
missing (no `.claude/project-stack.json`, unreadable/invalid, or an empty
|
|
314
|
+
`stacks` array). This is the **only** outcome that authorizes the
|
|
315
|
+
interactive fallback below.
|
|
316
|
+
- `note` — set when a definite stack matched no section (e.g. a Ruby or
|
|
317
|
+
Elixir repo — there is no mutation tool wired into this step for that
|
|
318
|
+
stack). When `note` is non-null, `sections` is empty and `ambiguous` is
|
|
319
|
+
`false`: install **nothing**, probe **nothing** (no `dotnet`, `node`,
|
|
320
|
+
`mvn`, or `pip`), print the `note` line verbatim, and skip the rest of
|
|
321
|
+
this step.
|
|
322
|
+
|
|
323
|
+
**Interactive fallback — only when `ambiguous` is `true`.** When a definite
|
|
324
|
+
stack was detected (`ambiguous` is `false`), never prompt; honor `sections`
|
|
325
|
+
exactly. **Under `--yes`, skip this fallback entirely even when `ambiguous`
|
|
326
|
+
is `true`** — never guess a stack: install no mutation tooling and print
|
|
327
|
+
`Mutation tooling skipped — no stack detected (run /setup without --yes to choose)`.
|
|
328
|
+
Otherwise, only when `ambiguous` is `true` (e.g. `--dry-run` scanning a repo
|
|
329
|
+
with no recognizable stack) fall back to asking:
|
|
330
|
+
|
|
331
|
+
> "Which languages do you need mutation testing for? (Select all that apply)"
|
|
332
|
+
>
|
|
333
|
+
> 1. **JS/TS** — Stryker (`@stryker-mutator/core`)
|
|
334
|
+
> 2. **Java / Kotlin** — pitest (`pitest-maven` or `info.solidsoft.gradle.pitest`)
|
|
335
|
+
> 3. **C# / .NET** — Stryker.NET (`dotnet-stryker`)
|
|
336
|
+
> 4. **Python** — mutmut
|
|
337
|
+
> 5. **All of the above**
|
|
338
|
+
> 6. **None — skip mutation tooling**
|
|
339
|
+
|
|
340
|
+
Parse the response. If they choose 5, treat it as selecting 1, 2, 3, and 4
|
|
341
|
+
(i.e. `sections` = `["js", "java", "csharp", "python"]`). If 6, skip the
|
|
342
|
+
rest of this step.
|
|
343
|
+
|
|
344
|
+
Each language subsection below **re-asserts its own gate as its literal
|
|
345
|
+
first step** — a section whose key is not in `sections` returns immediately,
|
|
346
|
+
before any `command -v` / tool probe. The guard is therefore robust even if
|
|
347
|
+
a section is reached out of order.
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
#### JS/TS — Stryker
|
|
352
|
+
|
|
353
|
+
**Stack gate (first step — hard precondition):** if `js` is not in the
|
|
354
|
+
Step 6 helper's `sections`, return immediately. Do **not** run the
|
|
355
|
+
prerequisites probe below. Only proceed when `js` is in `sections`.
|
|
356
|
+
|
|
357
|
+
**Prerequisites check:**
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
command -v node && node --version
|
|
361
|
+
command -v npm && npm --version
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
If `node` or `npm` is not found, tell the user:
|
|
365
|
+
"Node.js is required for Stryker. Install it from <https://nodejs.org> and
|
|
366
|
+
re-run `/setup`." Do not proceed with this language section.
|
|
367
|
+
|
|
368
|
+
**Bootstrap project if package.json is missing:**
|
|
369
|
+
|
|
370
|
+
Step 4 already ran `/dev-team:project-init` once this invocation, so this
|
|
371
|
+
should rarely trigger — it only fires when Step 5's signal maps to JS/TS but
|
|
372
|
+
the user's Step 4 selections didn't result in a scaffolded `package.json`
|
|
373
|
+
(e.g. they declined scaffolding, or picked a non-JS path there).
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
test -f package.json && echo "package.json found" || echo "no-package"
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
If the result is `no-package`:
|
|
380
|
+
|
|
381
|
+
1. Print: `No package.json found. Running /dev-team:project-init first to scaffold the project.`
|
|
382
|
+
2. Invoke the `/dev-team:project-init` skill. It will scaffold a
|
|
383
|
+
functional ES-module project with prettier, eslint, editorconfig, and
|
|
384
|
+
vitest (see the skill's own documentation for the full default set).
|
|
385
|
+
3. After the skill returns:
|
|
386
|
+
- If `package.json` now exists → proceed to "Check if already installed".
|
|
387
|
+
- If `package.json` still does not exist (user aborted project-init):
|
|
388
|
+
print `Stryker skipped — no package.json. Re-run /setup after scaffolding your JS project.`
|
|
389
|
+
and skip the rest of the JS/TS section.
|
|
390
|
+
- If the skill reported an explicit failure: print
|
|
391
|
+
`Stryker skipped — project-init failed. See errors above and re-run /setup after resolving them.`
|
|
392
|
+
and skip the rest of the JS/TS section.
|
|
393
|
+
|
|
394
|
+
If the result is `package.json found`, proceed directly to "Check if already installed".
|
|
395
|
+
|
|
396
|
+
**Check if already installed (project-local):**
|
|
397
|
+
|
|
398
|
+
```bash
|
|
399
|
+
test -f node_modules/.bin/stryker && echo "installed" || echo "not found"
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
**If not installed** (the check above reported `not found`)**, add Stryker as a
|
|
403
|
+
dev dependency** — skip this install when it reported `installed`:
|
|
404
|
+
|
|
405
|
+
```bash
|
|
406
|
+
npm install --save-dev @stryker-mutator/core
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**Detect the test runner and install its Stryker plugin — but only when that
|
|
410
|
+
plugin is not already present.** Run this independently of the core check
|
|
411
|
+
above: the core binary can be installed while its runner plugin is missing,
|
|
412
|
+
and an already-present runner plugin must never be reinstalled.
|
|
413
|
+
|
|
414
|
+
```bash
|
|
415
|
+
# Detect the runner from package.json
|
|
416
|
+
cat package.json 2>/dev/null | grep -E '"vitest"|"jest"|"mocha"|"jasmine"' | head -5
|
|
417
|
+
# Then, for the detected runner (substitute its name), check before installing:
|
|
418
|
+
test -d node_modules/@stryker-mutator/vitest-runner && echo "present" || echo "missing"
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
Install the plugin **only if the check above reported `missing`**
|
|
422
|
+
(`npm install --save-dev <package>`):
|
|
423
|
+
|
|
424
|
+
| Detected runner | Plugin package |
|
|
425
|
+
| ----------------- | ---------------- |
|
|
426
|
+
| vitest | `@stryker-mutator/vitest-runner` |
|
|
427
|
+
| jest | `@stryker-mutator/jest-runner` |
|
|
428
|
+
| mocha | `@stryker-mutator/mocha-runner` |
|
|
429
|
+
| jasmine | `@stryker-mutator/jasmine-runner` |
|
|
430
|
+
| none detected | `@stryker-mutator/vitest-runner` (default; note to the user they may need to swap this for their runner) |
|
|
431
|
+
|
|
432
|
+
**If any Stryker install above fails with `npm error code ERESOLVE`**, the
|
|
433
|
+
conflict is a peer-dependency clash already present in the repo's tree — not
|
|
434
|
+
between it and `@stryker-mutator/*`, which carries no such peer relationship.
|
|
435
|
+
Retry that command once with `--legacy-peer-deps` (e.g. `npm install
|
|
436
|
+
--save-dev @stryker-mutator/core --legacy-peer-deps`), and add a one-line note
|
|
437
|
+
to the user that you fell back to `--legacy-peer-deps` because of a
|
|
438
|
+
pre-existing peer conflict. Don't abort on the first ERESOLVE.
|
|
439
|
+
|
|
440
|
+
**Initialize Stryker config if not already present:**
|
|
441
|
+
|
|
442
|
+
```bash
|
|
443
|
+
test -f stryker.config.js -o -f stryker.config.mjs -o -f stryker.config.ts \
|
|
444
|
+
-o -f stryker.config.cjs -o -f .strykerrc.json && echo "config exists" || echo "no config"
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
If no config exists, **write `stryker.config.mjs` directly** — do not run
|
|
448
|
+
`npx stryker init`, which is interactive (it prompts for the test runner,
|
|
449
|
+
reporters, and package manager) and hangs a non-interactive `/setup` run.
|
|
450
|
+
You already detected the test runner above, so emit the config with
|
|
451
|
+
`testRunner` set to that runner. Write the file with this shape, substituting
|
|
452
|
+
the detected runner (`vitest` / `jest` / `mocha` / `jasmine`; use `vitest`
|
|
453
|
+
when none was detected):
|
|
454
|
+
|
|
455
|
+
```js
|
|
456
|
+
// stryker.config.mjs
|
|
457
|
+
export default {
|
|
458
|
+
packageManager: "npm",
|
|
459
|
+
testRunner: "jest", // <- the runner detected above
|
|
460
|
+
coverageAnalysis: "perTest",
|
|
461
|
+
reporters: ["html", "clear-text", "progress"],
|
|
462
|
+
mutate: ["src/**/*.{js,ts}", "!src/**/*.{test,spec}.{js,ts}"],
|
|
463
|
+
};
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
Runner-specific notes when substituting `testRunner`:
|
|
467
|
+
|
|
468
|
+
- **jest** — add a `jest` block so Stryker finds the project config, e.g.
|
|
469
|
+
`jest: { projectType: "custom", configFile: "jest.config.js" }` (point
|
|
470
|
+
`configFile` at the repo's actual Jest config). Angular repos also want
|
|
471
|
+
`"!src/**/*.module.ts"` appended to `mutate`.
|
|
472
|
+
- **vitest / mocha / jasmine** — no extra runner block is required; the
|
|
473
|
+
`testRunner` value alone wires up the installed runner plugin.
|
|
474
|
+
|
|
475
|
+
Keep `mutate` scoped to the repo's real source layout — adjust the globs if
|
|
476
|
+
sources live somewhere other than `src/`.
|
|
477
|
+
|
|
478
|
+
> If you'd rather configure interactively, `npx stryker init` walks through
|
|
479
|
+
> the same choices with prompts — but only run it in an interactive shell, not
|
|
480
|
+
> as part of an automated `/setup`.
|
|
481
|
+
|
|
482
|
+
**Verify:**
|
|
483
|
+
|
|
484
|
+
```bash
|
|
485
|
+
npx stryker --version
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
**Coverage baseline readiness (Jest/Vitest):**
|
|
489
|
+
|
|
490
|
+
`/coverage-baseline` (Phase 2 of `/test-improve`) parses
|
|
491
|
+
`coverage/coverage-summary.json` for `total.lines.pct` / `total.branches.pct`.
|
|
492
|
+
Jest and Vitest only emit that file when the **`json-summary`** reporter is
|
|
493
|
+
enabled, and the floor is only meaningful when coverage measures the whole
|
|
494
|
+
source tree (Jest `collectCoverageFrom` / Vitest `coverage.include`). Without
|
|
495
|
+
both, a repo that otherwise passes `/setup` still aborts `/test-improve`
|
|
496
|
+
Phase 2 (issue #1086). Probe and repair it now:
|
|
497
|
+
|
|
498
|
+
```bash
|
|
499
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/coverage_readiness.py" .
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
Read the JSON report. `ready` is the hard requirement (the summary can be
|
|
503
|
+
parsed **and**, for Vitest, a coverage provider is installed); `meaningful`
|
|
504
|
+
is whether the baseline reflects the whole tree.
|
|
505
|
+
|
|
506
|
+
- **Vitest with `has_provider` `false`** (no `@vitest/coverage-v8` or
|
|
507
|
+
`@vitest/coverage-istanbul` — Vitest emits no coverage at all without one,
|
|
508
|
+
unlike Jest's built-in Istanbul) → show `provider_hint` and, on
|
|
509
|
+
confirmation, install it as a devDependency:
|
|
510
|
+
|
|
511
|
+
```bash
|
|
512
|
+
npm install --save-dev @vitest/coverage-v8
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
Then re-run the probe. This is orthogonal to the reporter/scope checks
|
|
516
|
+
below — both must be satisfied for `ready` to flip to `true`.
|
|
517
|
+
- **`ready` is `true`** → record it for the Step 12 report and continue.
|
|
518
|
+
- **`ready` is `false` and `patchable` is `true`** (config lives in
|
|
519
|
+
`package.json`'s `jest` block or a `*.json` config) → tell the operator
|
|
520
|
+
exactly which reporter will be added, and on confirmation re-run with
|
|
521
|
+
`--patch`:
|
|
522
|
+
|
|
523
|
+
```bash
|
|
524
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/coverage_readiness.py" . --patch
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
The patch only appends `json-summary`, preserving existing reporters.
|
|
528
|
+
- **`ready` is `false` and `patchable` is `false`** (config is a JS/TS file
|
|
529
|
+
like `jest.config.js` or `vitest.config.ts` — the probe never rewrites
|
|
530
|
+
these) → show the operator `reporter_hint` and, on confirmation, apply that
|
|
531
|
+
one-line edit with the Edit tool. Re-run the probe (no `--patch`) to confirm
|
|
532
|
+
`ready` flipped to `true`.
|
|
533
|
+
- **`meaningful` is `false`** → show `scope_hint` and offer to add the
|
|
534
|
+
suggested `collectCoverageFrom`/`coverage.include` (confirm first; never
|
|
535
|
+
overwrite an existing scope). This is advisory — a missing scope doesn't
|
|
536
|
+
block the baseline, it just inflates it.
|
|
537
|
+
|
|
538
|
+
Never write or patch coverage config without operator confirmation. **Under
|
|
539
|
+
`--yes`, install only the additive `@vitest/coverage-v8` devDependency without
|
|
540
|
+
prompting; do not run `--patch` or hand-edit an existing config file** — leave
|
|
541
|
+
those edits to the operator and surface the hints in the report exactly as the
|
|
542
|
+
interactive path does. Record the final `ready`/`meaningful`/`patched` state
|
|
543
|
+
for the Step 12 report.
|
|
544
|
+
|
|
545
|
+
---
|
|
546
|
+
|
|
547
|
+
#### Java / Kotlin — pitest
|
|
548
|
+
|
|
549
|
+
**Stack gate (first step — hard precondition):** if `java` is not in the
|
|
550
|
+
Step 6 helper's `sections`, return immediately. Do **not** run the
|
|
551
|
+
prerequisites probe below. Only proceed when `java` is in `sections`.
|
|
552
|
+
|
|
553
|
+
**Prerequisites check:**
|
|
554
|
+
|
|
555
|
+
```bash
|
|
556
|
+
command -v mvn && echo "maven found"
|
|
557
|
+
command -v gradle && echo "gradle found"
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
If neither is found, tell the user:
|
|
561
|
+
"Maven or Gradle is required for pitest. Install one from
|
|
562
|
+
<https://maven.apache.org> or <https://gradle.org> and re-run `/setup`."
|
|
563
|
+
|
|
564
|
+
**Detect build tool:**
|
|
565
|
+
|
|
566
|
+
```bash
|
|
567
|
+
test -f pom.xml && echo "maven"
|
|
568
|
+
test -f build.gradle -o -f build.gradle.kts && echo "gradle"
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
**Maven — check if pitest-maven already configured:**
|
|
572
|
+
|
|
573
|
+
```bash
|
|
574
|
+
grep -q 'pitest-maven' pom.xml 2>/dev/null && echo "configured" || echo "not configured"
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
If not configured, add the pitest-maven plugin to `pom.xml`. Find the
|
|
578
|
+
`<build><plugins>` section and insert:
|
|
579
|
+
|
|
580
|
+
```xml
|
|
581
|
+
<plugin>
|
|
582
|
+
<groupId>org.pitest</groupId>
|
|
583
|
+
<artifactId>pitest-maven</artifactId>
|
|
584
|
+
<version>1.17.4</version>
|
|
585
|
+
<configuration>
|
|
586
|
+
<outputFormats>
|
|
587
|
+
<param>XML</param>
|
|
588
|
+
</outputFormats>
|
|
589
|
+
<timestampedReports>false</timestampedReports>
|
|
590
|
+
</configuration>
|
|
591
|
+
</plugin>
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
Tell the user: "Added pitest-maven plugin to `pom.xml`. Run
|
|
595
|
+
`mvn pitest:mutationCoverage` to verify."
|
|
596
|
+
|
|
597
|
+
**Gradle — check if pitest plugin already applied:**
|
|
598
|
+
|
|
599
|
+
```bash
|
|
600
|
+
grep -q 'pitest' build.gradle 2>/dev/null || grep -q 'pitest' build.gradle.kts 2>/dev/null \
|
|
601
|
+
&& echo "configured" || echo "not configured"
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
If not configured, tell the user to add the following to `build.gradle` or
|
|
605
|
+
`build.gradle.kts` manually (Gradle plugins cannot be added programmatically):
|
|
606
|
+
|
|
607
|
+
For `build.gradle`:
|
|
608
|
+
|
|
609
|
+
```groovy
|
|
610
|
+
plugins {
|
|
611
|
+
id 'info.solidsoft.pitest' version '1.15.0'
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
pitest {
|
|
615
|
+
outputFormats = ['XML']
|
|
616
|
+
timestampedReports = false
|
|
617
|
+
}
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
For `build.gradle.kts`:
|
|
621
|
+
|
|
622
|
+
```kotlin
|
|
623
|
+
plugins {
|
|
624
|
+
id("info.solidsoft.pitest") version "1.15.0"
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
configure<com.info.solidsoft.pitest.PitestPluginExtension> {
|
|
628
|
+
outputFormats.set(setOf("XML"))
|
|
629
|
+
timestampedReports.set(false)
|
|
630
|
+
}
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
**Verify (Maven only — Gradle requires manual add):**
|
|
634
|
+
|
|
635
|
+
```bash
|
|
636
|
+
mvn pitest:mutationCoverage -DtimestampedReports=false -DoutputFormats=XML --help 2>&1 | head -5
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
---
|
|
640
|
+
|
|
641
|
+
#### C# / .NET — Stryker.NET
|
|
642
|
+
|
|
643
|
+
**Stack gate (first step — hard precondition):** if `csharp` is not in the
|
|
644
|
+
Step 6 helper's `sections`, return immediately. Do **not** run the
|
|
645
|
+
prerequisites probe below (no `command -v dotnet`, no `dotnet tool list`).
|
|
646
|
+
Only proceed when `csharp` is in `sections`.
|
|
647
|
+
|
|
648
|
+
**Prerequisites check:**
|
|
649
|
+
|
|
650
|
+
```bash
|
|
651
|
+
command -v dotnet && dotnet --version
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
If `dotnet` is not found, tell the user:
|
|
655
|
+
".NET SDK is required for Stryker.NET. Install it from <https://dotnet.microsoft.com>
|
|
656
|
+
and re-run `/setup`."
|
|
657
|
+
|
|
658
|
+
**Check if dotnet-stryker is already installed as a project-local tool:**
|
|
659
|
+
|
|
660
|
+
```bash
|
|
661
|
+
dotnet tool list --local 2>/dev/null | grep stryker
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
Only the **local** (project-manifest) install satisfies this check. A
|
|
665
|
+
global `dotnet tool install --global dotnet-stryker` on this machine does
|
|
666
|
+
not — it doesn't propagate to teammates who clone the repo and run
|
|
667
|
+
`dotnet tool restore`, so it must never substitute for the local manifest
|
|
668
|
+
entry (issue #937).
|
|
669
|
+
|
|
670
|
+
**If not installed locally, install as a local tool:**
|
|
671
|
+
|
|
672
|
+
```bash
|
|
673
|
+
# If the file doesn't exist, create the tool manifest
|
|
674
|
+
test -f .config/dotnet-tools.json || dotnet new tool-manifest
|
|
675
|
+
|
|
676
|
+
# Install dotnet-stryker as a local tool, tracked in .config/dotnet-tools.json
|
|
677
|
+
dotnet tool install dotnet-stryker
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
If a global install is also detected, mention it informationally in the
|
|
681
|
+
summary (e.g. "also found globally installed") — it's harmless, just not a
|
|
682
|
+
substitute for the local manifest entry above.
|
|
683
|
+
|
|
684
|
+
**Verify:**
|
|
685
|
+
|
|
686
|
+
```bash
|
|
687
|
+
dotnet stryker --version 2>/dev/null || dotnet tool run dotnet-stryker --version
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
---
|
|
691
|
+
|
|
692
|
+
#### Python — mutmut
|
|
693
|
+
|
|
694
|
+
**Stack gate (first step — hard precondition):** if `python` is not in the
|
|
695
|
+
Step 6 helper's `sections`, return immediately. Do **not** run the
|
|
696
|
+
prerequisites probe below (no `command -v mutmut`, no `pip show mutmut`).
|
|
697
|
+
Only proceed when `python` is in `sections`.
|
|
698
|
+
|
|
699
|
+
**Prerequisites check:**
|
|
700
|
+
|
|
701
|
+
```bash
|
|
702
|
+
command -v python3 && python3 --version
|
|
703
|
+
python3 -m pip --version
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
If `python3` or `pip` is not found, tell the user: "Python 3 with pip is
|
|
707
|
+
required for mutmut. Install it from <https://www.python.org> and re-run
|
|
708
|
+
`/setup`."
|
|
709
|
+
|
|
710
|
+
**Check if mutmut is already installed:**
|
|
711
|
+
|
|
712
|
+
```bash
|
|
713
|
+
mutmut version 2>/dev/null || python3 -m mutmut version 2>/dev/null
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
Use the `version` **subcommand**, not `--version`. mutmut 2.x — the range this
|
|
717
|
+
step pins — has no `--version` flag and exits 2 on it, so a `--version` probe
|
|
718
|
+
reports "not installed" for a perfectly good install and this step reinstalls
|
|
719
|
+
on every run.
|
|
720
|
+
|
|
721
|
+
**If not installed, install it — isolated, never `--user` or system-wide** (that
|
|
722
|
+
puts mutmut in a location whose `PATH` presence depends on shell config, the
|
|
723
|
+
silent-failure trap this step exists to avoid). **Pin `mutmut<3`** — mutmut 3.x
|
|
724
|
+
ships an incompatible config/CLI contract (`source_paths` in a `[mutmut]`
|
|
725
|
+
setup.cfg section, no `--paths-to-mutate` flag) that the shipped adapter
|
|
726
|
+
(`hooks/mutation_adapters/mutmut.py`) does not speak.
|
|
727
|
+
|
|
728
|
+
**Prefer `uv`, because `pip` cannot build this pin on a current toolchain.**
|
|
729
|
+
mutmut 2.x depends on `glob2` 0.7, whose `setup.py` uses `install_layout` and
|
|
730
|
+
fails against setuptools >= 60 with `AttributeError: install_layout`, ending in
|
|
731
|
+
`Could not build wheels for mutmut, glob2`. That is not an edge case — it is
|
|
732
|
+
every machine with a modern setuptools. uv supplies a compatible setuptools
|
|
733
|
+
inside its own build isolation and succeeds where pip cannot:
|
|
734
|
+
|
|
735
|
+
```bash
|
|
736
|
+
uv tool install "mutmut<3"
|
|
737
|
+
```
|
|
738
|
+
|
|
739
|
+
uv installs the console script into an isolated environment and puts `mutmut`
|
|
740
|
+
on `PATH`, which is exactly what the adapter looks for: `_mutmut_argv()` in
|
|
741
|
+
`hooks/mutation_adapters/mutmut.py` resolves `shutil.which("mutmut")` first and
|
|
742
|
+
only falls back to `python3 -m mutmut`.
|
|
743
|
+
|
|
744
|
+
If `uv` is unavailable, fall back to pip **inside an activated virtualenv**
|
|
745
|
+
(never `--user`), accepting that it only succeeds on setuptools < 60:
|
|
746
|
+
|
|
747
|
+
```bash
|
|
748
|
+
python3 -m pip install "mutmut<3"
|
|
749
|
+
```
|
|
750
|
+
|
|
751
|
+
If the project declares dev dependencies in `pyproject.toml`
|
|
752
|
+
(`[project.optional-dependencies]` / `[tool.poetry.group.dev.dependencies]`),
|
|
753
|
+
prefer adding `mutmut<3` there and installing via the project's existing
|
|
754
|
+
dev-dependency flow instead of a bare `pip install`.
|
|
755
|
+
|
|
756
|
+
**Verify:**
|
|
757
|
+
|
|
758
|
+
```bash
|
|
759
|
+
mutmut version 2>/dev/null || python3 -m mutmut version
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
---
|
|
763
|
+
|
|
764
|
+
### 7. Select agent templates
|
|
765
|
+
|
|
766
|
+
Based on detected stack, select applicable templates from `templates/agents/`:
|
|
767
|
+
|
|
768
|
+
| Template | Condition |
|
|
769
|
+
| ---------- | ----------- |
|
|
770
|
+
| `ts-enforcer` | `tsconfig.json` exists or TypeScript in deps |
|
|
771
|
+
| `esm-enforcer` | Any JS/TS project (always-on) |
|
|
772
|
+
| ~~`functional-patterns`~~ | ~~Any JS/TS project~~ — **deprecated**, superseded by `js-fp-review` agent |
|
|
773
|
+
| `react-testing` | `react` or `react-dom` in deps |
|
|
774
|
+
| `front-end-testing` | Any frontend framework (React, Vue, Svelte, Angular) |
|
|
775
|
+
| `twelve-factor-audit` | Has Dockerfile, server entry point, or cloud config |
|
|
776
|
+
| `python-quality` | Python stack detected |
|
|
777
|
+
| `go-quality` | Go stack detected |
|
|
778
|
+
| `csharp-quality` | C#/.NET stack detected |
|
|
779
|
+
| `angular-testing` | `@angular/core` in deps |
|
|
780
|
+
|
|
781
|
+
Present the list to the user and ask for confirmation before scaffolding.
|
|
782
|
+
**Under `--yes`, activate the selected templates without prompting** and list
|
|
783
|
+
them in the Step 12 report.
|
|
784
|
+
|
|
785
|
+
### 8. Generate project-level CLAUDE.md
|
|
786
|
+
|
|
787
|
+
If `.claude/CLAUDE.md` does not already exist in the target project, generate one containing:
|
|
788
|
+
|
|
789
|
+
- Project name and detected stack summary
|
|
790
|
+
- Discovered conventions (formatter, linter, test runner)
|
|
791
|
+
- References to activated agent templates
|
|
792
|
+
- Build/test/lint commands detected from `package.json` scripts, `Makefile`, etc.
|
|
793
|
+
|
|
794
|
+
If `.claude/CLAUDE.md` already exists, ask whether to merge or skip. **Under
|
|
795
|
+
`--yes`, take the skip branch** — never overwrite existing project config
|
|
796
|
+
(orchestrator constraint 3) — and note `CLAUDE.md exists — left unchanged` in
|
|
797
|
+
the Step 12 report. This note describes only Step 8's own generate-or-skip
|
|
798
|
+
decision — Step 8a runs independently right after and may still append to
|
|
799
|
+
this same file, so "left unchanged" here and a `concise-preference-added`
|
|
800
|
+
outcome from Step 8a are not a contradiction in the Step 12 report.
|
|
801
|
+
|
|
802
|
+
### 8a. Ask about concise-response preference
|
|
803
|
+
|
|
804
|
+
**Check first, before prompting anyone.** If the marker is already present
|
|
805
|
+
in `.claude/CLAUDE.md`, the preference is already in place — do not ask
|
|
806
|
+
the operator at all, under any flag combination:
|
|
807
|
+
|
|
808
|
+
```bash
|
|
809
|
+
MARKER="<!-- dev-team: concise-response preference v1 -->"
|
|
810
|
+
grep -qF "$MARKER" .claude/CLAUDE.md 2>/dev/null && echo "concise-preference-already-covered" || echo "concise-preference-not-yet-covered"
|
|
811
|
+
```
|
|
812
|
+
|
|
813
|
+
If this reports `concise-preference-already-covered`, record that outcome
|
|
814
|
+
for the Step 12 report and skip the rest of this step entirely — no
|
|
815
|
+
prompt, no `--yes`/`--dry-run` branching, nothing else to do. Only when it
|
|
816
|
+
reports `concise-preference-not-yet-covered` does the rest of this step
|
|
817
|
+
run.
|
|
818
|
+
|
|
819
|
+
Ask the operator: "Would you like Claude to give concise responses by default in this repo? This appends a block to the project's committed `.claude/CLAUDE.md`, so it becomes a shared convention for every contributor, not just you." **Under `--yes`, skip this prompt entirely** — never
|
|
820
|
+
guess a communication-style preference — and note
|
|
821
|
+
`concise-preference-skipped-under-yes` (run /setup without --yes to choose)
|
|
822
|
+
in the Step 12 report. **Under `--dry-run`, report what would be appended
|
|
823
|
+
without writing** (same convention as Step 11's two idempotent blocks).
|
|
824
|
+
|
|
825
|
+
If the operator declines, note `concise-preference-declined` and move on —
|
|
826
|
+
do not write anything.
|
|
827
|
+
|
|
828
|
+
If the operator confirms, idempotently append the block below to the
|
|
829
|
+
project's `CLAUDE.md` (the same file Step 8 generated or left in place —
|
|
830
|
+
`.claude/CLAUDE.md`; this step creates `.claude/` and the file itself if
|
|
831
|
+
Step 8 somehow left them absent). The marker is a dedicated, content-free
|
|
832
|
+
comment — not a substring of the prose — so a future wording tweak to the
|
|
833
|
+
block below can never desync it from the idempotency check (the hazard
|
|
834
|
+
Step 11's own `.mcp.json` marker note, below, already calls out for its own
|
|
835
|
+
pair of blocks). Both `.claude` and `.claude/CLAUDE.md` are checked for
|
|
836
|
+
symlinks before any write, since a symlinked parent directory is an
|
|
837
|
+
equally valid escape route as a symlinked file:
|
|
838
|
+
|
|
839
|
+
```bash
|
|
840
|
+
MARKER="<!-- dev-team: concise-response preference v1 -->"
|
|
841
|
+
if [ -L .claude ] || [ -L .claude/CLAUDE.md ]; then
|
|
842
|
+
echo "concise-preference-skipped-symlink"
|
|
843
|
+
else
|
|
844
|
+
mkdir -p .claude
|
|
845
|
+
touch .claude/CLAUDE.md
|
|
846
|
+
if ! grep -qF "$MARKER" .claude/CLAUDE.md; then
|
|
847
|
+
{ printf '\n%s\n' "$MARKER"; cat <<'CONCISE_BLOCK'
|
|
848
|
+
## General
|
|
849
|
+
Unless asked to behave otherwise, always give concise responses and sacrifice grammar for the sake of concision. Ask clarifying questions when needed and offer your best guess at available interpretations/answers for those questions when possible.
|
|
850
|
+
|
|
851
|
+
### Be RUTHLESSLY concise — this is the rule I break most often
|
|
852
|
+
Default to a few sentences. If the answer is "yes", say "yes" and stop.
|
|
853
|
+
|
|
854
|
+
- **Answer the question asked. Nothing else.** No adjacent findings, no "while I was looking I noticed", no caveats I didn't ask for. Sit on it until I ask.
|
|
855
|
+
- **One thing at a time.** Never hand me a numbered list of 3+ considerations, options, or trade-offs unless I asked for options. Pick one, recommend it, move on.
|
|
856
|
+
- **No teaching.** Skip the mechanism, the background, the "why this matters". State the conclusion. I'll ask why if I care.
|
|
857
|
+
- **No tables, no headers, no bold-label paragraphs** for a simple answer. Prose or a couple of lines.
|
|
858
|
+
- **Cut every parenthetical, every "worth noting", every "the real finding is".**
|
|
859
|
+
- Corrections: one sentence, no post-mortem.
|
|
860
|
+
|
|
861
|
+
Length is the tell: if a reply is over ~10 lines and I didn't ask for depth, it's wrong. Detail I have to skim to find the answer is worse than no answer.
|
|
862
|
+
CONCISE_BLOCK
|
|
863
|
+
} >> .claude/CLAUDE.md && echo "concise-preference-added" || echo "concise-preference-write-failed"
|
|
864
|
+
else
|
|
865
|
+
echo "concise-preference-already-covered"
|
|
866
|
+
fi
|
|
867
|
+
fi
|
|
868
|
+
```
|
|
869
|
+
|
|
870
|
+
This always appends a fresh, self-contained `## General` heading rather
|
|
871
|
+
than trying to detect and merge into a pre-existing one — a prior version
|
|
872
|
+
of this step attempted that merge and introduced two bugs of its own (an
|
|
873
|
+
orphaned sub-heading when the file's last `##` section wasn't `General`,
|
|
874
|
+
and a `^## General$` anchor that silently missed CRLF line endings on
|
|
875
|
+
Windows). A file ending up with two `## General` headings is a cosmetic,
|
|
876
|
+
rare edge case; a script that silently corrupts document structure on a
|
|
877
|
+
supported platform is not an acceptable trade for avoiding it.
|
|
878
|
+
|
|
879
|
+
Record the outcome — `concise-preference-declined` /
|
|
880
|
+
`concise-preference-added` / `concise-preference-already-covered` /
|
|
881
|
+
`concise-preference-skipped-under-yes` / `concise-preference-skipped-symlink`
|
|
882
|
+
/ `concise-preference-write-failed` — for the Step 12 report, using these
|
|
883
|
+
exact tokens. `already-covered` has two possible sources — usually the
|
|
884
|
+
pre-check above (the normal path, before any prompt), or, on the rare
|
|
885
|
+
race where the file changes between the pre-check and confirmation, the
|
|
886
|
+
append script's own internal re-check — either way the token is the
|
|
887
|
+
same. The other three the append script can reach (`added` /
|
|
888
|
+
`skipped-symlink` / `write-failed`) are echoed verbatim from its own
|
|
889
|
+
output — `write-failed` covers a `mkdir`/`touch`/append that fails (e.g.
|
|
890
|
+
`.claude` exists as a non-directory, or the tree is read-only), so a
|
|
891
|
+
failed write is never misreported as `added`; the remaining two
|
|
892
|
+
(`declined` / `skipped-under-yes`) are recorded directly from the prose
|
|
893
|
+
branches below the pre-check,
|
|
894
|
+
since the script never runs on those paths.
|
|
895
|
+
|
|
896
|
+
### 9. Generate PostToolUse formatting hook
|
|
897
|
+
|
|
898
|
+
Wire a PostToolUse hook entry for the project's `.claude/settings.json` that
|
|
899
|
+
runs the formatter for the detected stack, mapped by extension (Node/TS →
|
|
900
|
+
prettier + eslint, Python → ruff, Go → gofmt, Rust → rustfmt, Ruby →
|
|
901
|
+
rubocop, Java/Kotlin → google-java-format/ktlint, C# → dotnet format). The
|
|
902
|
+
tool itself is `/project-init`'s responsibility to install — since Step 4
|
|
903
|
+
already ran it, the formatter should be present. Only if a formatter is
|
|
904
|
+
still missing (check e.g. `npx prettier --version`, `ruff --version`), warn
|
|
905
|
+
the user and re-point them at `/project-init` rather than installing it here.
|
|
906
|
+
|
|
907
|
+
### 9b. Configure harness autocompact (#2177)
|
|
908
|
+
|
|
909
|
+
Replaces the retired context-ceiling hook: the harness compacts the
|
|
910
|
+
conversation at a chosen percentage of its window. Merge the env var into the
|
|
911
|
+
project's `.claude/settings.json` — never overwrite the file:
|
|
912
|
+
|
|
913
|
+
```bash
|
|
914
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/set_autocompact_env.py" \
|
|
915
|
+
--project-dir "$PWD" [--yes] [--autocompact-pct N | --no-autocompact]
|
|
916
|
+
```
|
|
917
|
+
|
|
918
|
+
Forward `--yes` when `/setup` got it, and `--autocompact-pct`/`--no-autocompact`
|
|
919
|
+
when given. The script owns all prompt and `--yes` behavior: it writes
|
|
920
|
+
`CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` (default `40`) into the `env` block, keeps an
|
|
921
|
+
existing valid value unless `--autocompact-pct` is passed, and aborts without
|
|
922
|
+
touching the file when it is malformed or a symlink (report the stderr line
|
|
923
|
+
and continue with the next step). The harness can only **lower** its
|
|
924
|
+
threshold, so values above its default (~83%) have no effect. The script only
|
|
925
|
+
ever writes the project's `settings.json`; when it warns that a process-env or
|
|
926
|
+
`settings.local.json` entry takes precedence, relay that warning verbatim. Under
|
|
927
|
+
`--dry-run`, report what would be written and skip the script. Report line:
|
|
928
|
+
`Autocompact: <value>% (set | kept | replaced | skipped)`.
|
|
929
|
+
|
|
930
|
+
### 10. Generate /pr command
|
|
931
|
+
|
|
932
|
+
Create a project-specific `skills/pr/SKILL.md` if one doesn't exist, referencing the project's test/lint/typecheck commands.
|
|
933
|
+
|
|
934
|
+
### 11. Ensure `.gitignore` covers dev-team runtime artifacts
|
|
935
|
+
|
|
936
|
+
**Downstream projects only** — skip this step entirely when Step 2 detected
|
|
937
|
+
`in-repo` (the plugin-dev repo curates its own `.gitignore`, and it tracks
|
|
938
|
+
deliverables such as `.claude/memory/decisions.md` and bare `memory/` eval
|
|
939
|
+
fixtures that this blanket ignore would wrongly hide). One carve-out: the `.mcp.json`
|
|
940
|
+
standing check `project-init`'s Repowise sub-section runs (#1416) is
|
|
941
|
+
unconditional and reaches in-repo too, via this skill's own Step 4 — that one
|
|
942
|
+
`.gitignore` entry lands regardless of Step 2's result. See the `.mcp.json`
|
|
943
|
+
paragraph below.
|
|
944
|
+
|
|
945
|
+
`/test-improve`, `/build`, and the review workflows write per-run resume
|
|
946
|
+
state, progress bookkeeping, and metrics into `.claude/memory/`,
|
|
947
|
+
`.claude/metrics/`, and `.claude/plans/`; reports land in
|
|
948
|
+
`.dev-team-reports/` (the `.claude/`-scoped artifact migration and
|
|
949
|
+
reports-domain consolidation, #1406). `/code-review` additionally writes a
|
|
950
|
+
`.pr-review-passed` gate file to `.claude/memory/` (already covered by the
|
|
951
|
+
`.claude/memory/` line below), consumed and deleted by `hooks/pre_pr_review.py`
|
|
952
|
+
on the next matching `gh pr create` (#1886) — but left behind whenever that
|
|
953
|
+
PR is never opened (branch content changed since review, or
|
|
954
|
+
`PR_GATE_BYPASS_REASON`), cluttering `git status` and risking capture by a
|
|
955
|
+
stray `git add -A` (issue #1377). These
|
|
956
|
+
are regeneratable runtime artifacts, not deliverables — but `/build` commits
|
|
957
|
+
the working tree per completed step, so without an ignore rule they land in
|
|
958
|
+
the project's history (issue #1101).
|
|
959
|
+
|
|
960
|
+
In a downstream project, `.claude/memory/`, `.claude/metrics/`, and
|
|
961
|
+
`.claude/plans/` are exclusively dev-team runtime state, so each whole
|
|
962
|
+
folder is safe to ignore. `.dev-team-reports/` is **not** wholly safe to
|
|
963
|
+
ignore: `/test-improve` git-tracks a `<slug>/data/` sibling directory
|
|
964
|
+
under it (issue #1412) so its report is a pure function of tracked data and
|
|
965
|
+
regeneratable from a fresh checkout, so the rule anchors a deny-all and
|
|
966
|
+
re-includes that one tracked exception instead of ignoring the whole
|
|
967
|
+
folder — the identical shape this repo's own `.gitignore` and
|
|
968
|
+
`/project-init`'s JS-scaffold template use. The legacy bare `memory/`,
|
|
969
|
+
`reports/`, `metrics/`, `plans/` lines are appended alongside as a safety
|
|
970
|
+
net for any pre-#1406 content still landing at the old paths.
|
|
971
|
+
Idempotently append the block (create `.gitignore` if absent; do nothing if
|
|
972
|
+
the marker is already present):
|
|
973
|
+
|
|
974
|
+
```bash
|
|
975
|
+
MARKER="# dev-team workflow runtime artifacts (.claude/-scoped + .dev-team-reports/, #1406) v2"
|
|
976
|
+
if ! grep -qF "$MARKER" .gitignore 2>/dev/null; then
|
|
977
|
+
# Self-heal: a pre-#1412 run of this block (under the v1 marker) may have
|
|
978
|
+
# already appended the superseded blanket `.dev-team-reports/` line. Strip
|
|
979
|
+
# it before appending the anchored replacement below — git never
|
|
980
|
+
# re-includes a path whose parent directory is itself excluded, so leaving
|
|
981
|
+
# the old blanket line in place would silently shadow the new exception.
|
|
982
|
+
if [ -f .gitignore ]; then
|
|
983
|
+
grep -vxF '.dev-team-reports/' .gitignore > .gitignore.tmp && mv .gitignore.tmp .gitignore
|
|
984
|
+
fi
|
|
985
|
+
printf '\n%s\n%s\n' \
|
|
986
|
+
"$MARKER (regeneratable; not deliverables — issues #1101, #1377, #1406, #1412)" \
|
|
987
|
+
".claude/memory/
|
|
988
|
+
.claude/metrics/
|
|
989
|
+
.claude/plans/
|
|
990
|
+
/.dev-team-reports/*
|
|
991
|
+
!/.dev-team-reports/test-improve/
|
|
992
|
+
memory/
|
|
993
|
+
reports/
|
|
994
|
+
metrics/
|
|
995
|
+
plans/
|
|
996
|
+
.pr-review-passed" >> .gitignore
|
|
997
|
+
echo "gitignore-updated"
|
|
998
|
+
else
|
|
999
|
+
echo "gitignore-already-covered"
|
|
1000
|
+
fi
|
|
1001
|
+
```
|
|
1002
|
+
|
|
1003
|
+
`DEV_TEAM_TASK_METRICS` and `DEV_TEAM_REPORTS` do not override a directory
|
|
1004
|
+
path in code today — `DEV_TEAM_TASK_METRICS=off` is an on/off opt-out for the
|
|
1005
|
+
task-log writer only, and `DEV_TEAM_REPORTS` is not an environment variable
|
|
1006
|
+
at all (it names the legacy `DEV_TEAM_REPORTS/` directory folded into
|
|
1007
|
+
`.dev-team-reports/` above). There is no "relocated path" case to special-case
|
|
1008
|
+
here. Record whether the block was added for the Step 12 report. Under
|
|
1009
|
+
`--dry-run`, report what would be appended without writing.
|
|
1010
|
+
|
|
1011
|
+
**`.mcp.json` machine-specific-path hygiene (issues #1376, #1416).**
|
|
1012
|
+
Separately — still downstream-projects-only, same Step 2 `in-repo` skip — a
|
|
1013
|
+
project's `.mcp.json` (written by `index-codebase`, hand-registered MCP
|
|
1014
|
+
servers, or any other means) commonly bakes in the absolute filesystem path
|
|
1015
|
+
of the machine that wrote it (e.g. a CodeGraph server's `args` array). If
|
|
1016
|
+
committed, every other clone inherits a path that doesn't exist on their
|
|
1017
|
+
machine and the server fails to start. Idempotently append its own block
|
|
1018
|
+
(independent marker, so this check runs and self-heals even on a repo where
|
|
1019
|
+
the runtime-artifacts block above was already added by an older `/setup`):
|
|
1020
|
+
|
|
1021
|
+
```bash
|
|
1022
|
+
MCP_MARKER="# dev-team hygiene — machine-specific MCP config"
|
|
1023
|
+
if ! grep -qF "$MCP_MARKER" .gitignore 2>/dev/null; then
|
|
1024
|
+
printf '\n%s\n%s\n' \
|
|
1025
|
+
"$MCP_MARKER (absolute-path pollution — issue #1376)" \
|
|
1026
|
+
".mcp.json" >> .gitignore
|
|
1027
|
+
echo "mcp-json-gitignore-updated"
|
|
1028
|
+
else
|
|
1029
|
+
echo "mcp-json-gitignore-already-covered"
|
|
1030
|
+
fi
|
|
1031
|
+
```
|
|
1032
|
+
|
|
1033
|
+
This exact marker (including the em dash) is also emitted, unconditionally
|
|
1034
|
+
and regardless of in-repo/downstream, by the `.mcp.json` machine-specific-path
|
|
1035
|
+
hygiene standing check in `project-init`'s Repowise sub-section (issue #1416
|
|
1036
|
+
— Repowise's own install path is the more common source of a project's
|
|
1037
|
+
`.mcp.json`, and that check no longer waits for this downstream-only Step 11
|
|
1038
|
+
pass to cover it). The marker prefix (everything up to and including
|
|
1039
|
+
`machine-specific MCP config`) must stay byte-identical between the two
|
|
1040
|
+
blocks — `grep -qF` matches that prefix only, so the trailing issue-number
|
|
1041
|
+
suffix may differ, but changing the prefix itself in only one place breaks
|
|
1042
|
+
idempotency. This block remains a downstream-only, defense-in-depth backstop
|
|
1043
|
+
for `.mcp.json` files written by means other than Repowise (e.g.
|
|
1044
|
+
`index-codebase`, hand-registered MCP servers).
|
|
1045
|
+
|
|
1046
|
+
This ignores `.mcp.json` going forward regardless of whether it currently
|
|
1047
|
+
exists — the same "detect it whenever we write or see it" contract issue
|
|
1048
|
+
#1376 asks for. If `.mcp.json` is already tracked by git (`git ls-files
|
|
1049
|
+
--error-unmatch .mcp.json` exits 0), tell the operator to `git rm --cached
|
|
1050
|
+
.mcp.json` themselves rather than doing it automatically — untracking is a
|
|
1051
|
+
history-visible action `/setup` should not take silently. Record whether the
|
|
1052
|
+
block was added for the Step 12 report. Under `--dry-run`, report what would
|
|
1053
|
+
be appended without writing. Reached via `/setup` (Step 4 runs `/project-init`
|
|
1054
|
+
before this step), this block normally reports already-covered, since
|
|
1055
|
+
`/project-init`'s own standing check already ran first — the "added" outcome
|
|
1056
|
+
is what a direct, standalone `/project-init` invocation reports.
|
|
1057
|
+
|
|
1058
|
+
### 12. Report
|
|
1059
|
+
|
|
1060
|
+
Display a summary of everything installed and created:
|
|
1061
|
+
|
|
1062
|
+
```
|
|
1063
|
+
## Setup Complete
|
|
1064
|
+
|
|
1065
|
+
**Stack**: TypeScript, React, Vitest
|
|
1066
|
+
**Package manager**: pnpm
|
|
1067
|
+
|
|
1068
|
+
### Prerequisites
|
|
1069
|
+
- jq: ✓ <version>
|
|
1070
|
+
- python3: ✓ <version>
|
|
1071
|
+
- Mutation testing: ✓ <tool> <version> [or: ✗ skipped | ✗ failed]
|
|
1072
|
+
|
|
1073
|
+
Report a mutation-testing line **only for sections actually in scope** — the
|
|
1074
|
+
`sections` the Step 6 helper returned (Stryker for `js`, pitest for `java`,
|
|
1075
|
+
Stryker.NET for `csharp`, mutmut for `python`). Never list a tool for a
|
|
1076
|
+
stack that was not detected. When the helper's `note` was set (a detected
|
|
1077
|
+
stack with no mutation tool wired in, e.g. Ruby or Elixir), report that one
|
|
1078
|
+
line verbatim — `no mutation tooling for detected stack (<stacks>)` — and no
|
|
1079
|
+
tool line.
|
|
1080
|
+
|
|
1081
|
+
### Coverage baseline readiness (JS/TS only)
|
|
1082
|
+
- ✓ json-summary + coverage scope present [ready + meaningful]
|
|
1083
|
+
- ✓ patched (added json-summary reporter to <config>) [was not ready, now fixed]
|
|
1084
|
+
- ✓ installed @vitest/coverage-v8 [Vitest provider was missing, now present]
|
|
1085
|
+
- ⚠ manual action needed — <reporter_hint> [JS/TS config the operator declined or must edit]
|
|
1086
|
+
- ⚠ Vitest coverage provider missing — <provider_hint> [not ready]
|
|
1087
|
+
- ⚠ coverage scope unset — baseline will be inflated (<scope_hint>) [not meaningful]
|
|
1088
|
+
|
|
1089
|
+
### Code-intelligence indexes (project-init Step 4c — all-or-none group)
|
|
1090
|
+
- CodeGraph: ✓ installed + `.codegraph/` built (keyless) [or: ✗ declined | ✗ failed]
|
|
1091
|
+
- Repowise: ✓ installed + `.repowise/` indexed (keyless) [or: ✗ declined | ✗ failed]
|
|
1092
|
+
- `.mcp.json` gitignore: ✓ added [or: ✓ already covered | ⚠ tracked by git — run `git rm --cached .mcp.json` (#1416)]
|
|
1093
|
+
- Graphify: ✓ `graphify-out/` built (keyless AST; enrichment key-gated) [or: ✗ declined | ✗ failed]
|
|
1094
|
+
- settings.json guard: ✓ clean [or: ✓ relocated N machine-specific graphify hook(s) to settings.local.json (#1367)]
|
|
1095
|
+
|
|
1096
|
+
The separate "run index-codebase first" step is no longer required — accepting
|
|
1097
|
+
the group installs and builds all three indexes in the same run. The
|
|
1098
|
+
settings.json guard line reports project-init's standing check (#1367) — it
|
|
1099
|
+
runs on every pass, including one where Graphify install itself is skipped
|
|
1100
|
+
because it's already present, so a repo carrying a machine-specific path from
|
|
1101
|
+
an install predating this guard gets self-healed the next time `/setup` runs.
|
|
1102
|
+
The `.mcp.json` gitignore line reports project-init's own standing check
|
|
1103
|
+
(#1416) the same way — it runs on every pass, in-repo included, regardless of
|
|
1104
|
+
Repowise's own install/decline state for that run.
|
|
1105
|
+
|
|
1106
|
+
### Created
|
|
1107
|
+
- `.claude/project-stack.json` — stack detection results
|
|
1108
|
+
- `.claude/CLAUDE.md` — project conventions [Step 8a concise-response preference, independent of this line's created/left-unchanged status: concise-preference-added | concise-preference-already-covered | concise-preference-declined | concise-preference-skipped-under-yes | concise-preference-skipped-symlink | concise-preference-write-failed]
|
|
1109
|
+
- `.claude/settings.json` — PostToolUse formatting hook (prettier + eslint); `env.CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` (Step 9b)
|
|
1110
|
+
- `.gitignore` — dev-team runtime artifacts (.claude/memory/, .claude/metrics/, .claude/plans/, .dev-team-reports/, memory/, reports/, metrics/, plans/, .pr-review-passed) [downstream only; omit if already covered] plus `.mcp.json` machine-specific-path hygiene (#1376, #1416) [runs in-repo too, via project-init's Repowise standing check; omit if already covered]
|
|
1111
|
+
- Activated templates: ts-enforcer, esm-enforcer, react-testing
|
|
1112
|
+
|
|
1113
|
+
### Recommendations
|
|
1114
|
+
- Add `"type": "module"` to package.json
|
|
1115
|
+
- 3 files using `require()` — consider migrating to ES imports
|
|
1116
|
+
```
|
|
1117
|
+
|
|
1118
|
+
If any prerequisite step failed, add a "Next steps" section with the
|
|
1119
|
+
specific manual actions needed (mirroring the per-step failure messages
|
|
1120
|
+
above).
|
|
1121
|
+
|
|
1122
|
+
If `--dry-run` was specified, prefix the report with "**DRY RUN** — no files were written and nothing was installed." and skip all writes/installs. If `--yes` was also passed, add "`--yes` ignored under `--dry-run`" to that prefix.
|