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,239 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-improve
|
|
3
|
+
description: >-
|
|
4
|
+
Consolidated analyze-then-improve test orchestrator. Defaults to lightweight
|
|
5
|
+
ceremony; opts into heavier capabilities (Gherkin extraction, mutation
|
|
6
|
+
testing, refactor-for-testability) only when the operator asks. Always
|
|
7
|
+
baselines coverage (and mutation, when enabled) before any test change, runs
|
|
8
|
+
the end-of-phase review loop after Phases 5 and 7, and produces a stable
|
|
9
|
+
10-section executive-summary report. Use when the user says "improve our
|
|
10
|
+
tests", "modernize the test suite", "upgrade our tests", or runs
|
|
11
|
+
/test-improve.
|
|
12
|
+
argument-hint: "<repo-path> [--parent <url>] [--analyze-only] [--from-phase [<n>]] [--stack <id>]"
|
|
13
|
+
role: orchestrator
|
|
14
|
+
user-invocable: true
|
|
15
|
+
allowed-tools: Read, Grep, Glob, Bash(git diff *), Bash(python3 *), Bash(sh *), Skill, Agent
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Test Improve
|
|
19
|
+
|
|
20
|
+
Role: orchestrator. This command sequences existing skills and agents through a
|
|
21
|
+
ten-phase (0-9) analyze-then-improve workflow; it does **not** implement, audit, or
|
|
22
|
+
write tests itself. Each phase is **delegated** to the worker skill or agent
|
|
23
|
+
that owns it, and per-phase progress is persisted to
|
|
24
|
+
`.claude/memory/test-improve/<slug>/phase-<n>.md` so `/continue` (and `--from-phase`)
|
|
25
|
+
can resume.
|
|
26
|
+
|
|
27
|
+
You have been invoked with the `/test-improve` command.
|
|
28
|
+
|
|
29
|
+
## Orchestrator constraints
|
|
30
|
+
|
|
31
|
+
1. **Delegate every phase.** Call the owning skill or agent (`/test-health`,
|
|
32
|
+
`/gherkin-derive`, `/issues-from-assessment`, `/build`, `/coverage-baseline`,
|
|
33
|
+
`/coverage-delta`, `/mutation-testing`, `mutation-kill` agent,
|
|
34
|
+
`/quality-targets-converge`, `/test-design`, `/code-review`, `/apply-fixes`).
|
|
35
|
+
Never re-implement their logic here.
|
|
36
|
+
2. **Honor the human gates.** Do not advance past a gate without explicit
|
|
37
|
+
approval.
|
|
38
|
+
3. **Confirm the approach first.** Phase 0 owns the approach contract; do not
|
|
39
|
+
start work until it has completed and its answers are persisted.
|
|
40
|
+
4. **Baseline before changing anything.** Coverage (and mutation, when
|
|
41
|
+
enabled) must land directly in `.dev-team-reports/test-improve/<slug>/data/`
|
|
42
|
+
before any file under the stack's test directory is modified.
|
|
43
|
+
5. **Be concise.** Report each phase's outcome and the next gate, nothing
|
|
44
|
+
more.
|
|
45
|
+
|
|
46
|
+
## Parse Arguments
|
|
47
|
+
|
|
48
|
+
- Positional: `<repo-path>` (default: cwd).
|
|
49
|
+
- `--parent <url>` — optional tracker parent issue URL; the host selects the
|
|
50
|
+
CLI (ADO / GitHub / GitLab / Jira). Omit for **local-files mode** (the
|
|
51
|
+
default), which writes to `.dev-team-reports/test-improve/` and `.claude/plans/test-improve/`.
|
|
52
|
+
- `--analyze-only` — run Phase 0 then Phase 1 directly and **exit after Phase 1** with a
|
|
53
|
+
summary of the improvement plan (bypassing the default Baseline/Derive-Gherkin
|
|
54
|
+
ordering — see Phase 0's `--analyze-only` semantics). No baseline is
|
|
55
|
+
captured; no code changes.
|
|
56
|
+
- `--from-phase [<n>]` — skips completed phases and resumes at phase `n` when
|
|
57
|
+
`.claude/memory/test-improve/<slug>/phase-<n-1>.md` exists. **The number is
|
|
58
|
+
optional.** Passed with **no argument**, `/test-improve` **auto-detects** the
|
|
59
|
+
resume point from `.claude/memory/test-improve/<slug>/` (see
|
|
60
|
+
`references/phase-0-approach-contract.md`): it resumes at the phase after the highest completed
|
|
61
|
+
progress file and prints which phase it resolved to and why. An explicit
|
|
62
|
+
`<n>` **overrides** auto-detection. Either form does **not** re-prompt
|
|
63
|
+
Phase-0 inputs; to change them, delete
|
|
64
|
+
`.claude/memory/test-improve/<slug>/phase-0.md` and re-run from Phase 0.
|
|
65
|
+
- `--stack <id>` — force a stack profile (e.g. `js`, `dotnet`, `java`, `go`)
|
|
66
|
+
when manifest detection is ambiguous.
|
|
67
|
+
|
|
68
|
+
## Phase-start banner
|
|
69
|
+
|
|
70
|
+
At the start of every phase, print a two-line banner:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
Step <position>/<total> — Phase <N>: <phase name>
|
|
74
|
+
mutation: <off|kill-loop|baseline+kill-loop> · binding: <none|xunit-with-annotations|bdd-runner> · refactor: <no-refactor|refactor-allowed> · sink: <tracker|local>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`<N>` is the phase's stable identity number — unchanged by execution order
|
|
78
|
+
(Phase 1 is always Analyze, Phase 2 is always Baseline, etc.). `<position>`
|
|
79
|
+
is a **running count of phases printed so far this run, including this
|
|
80
|
+
one** — increment it by exactly 1 at each phase-start banner, never
|
|
81
|
+
computed from a fixed per-identity table. A bare `Phase N/9` counter would
|
|
82
|
+
print non-monotonically under this reordered execution sequence (`2/9` then
|
|
83
|
+
`3/9` then `1/9`), reading as a hung or looping run to an operator watching
|
|
84
|
+
stdout; a plain running count fixes this without renumbering any phase,
|
|
85
|
+
file, or `--from-phase` flag value, and — unlike a fixed per-identity
|
|
86
|
+
table — it stays correct regardless of which phases actually execute.
|
|
87
|
+
|
|
88
|
+
**`<total>` is not always 9 or 10 — compute it, never hardcode it.** Two
|
|
89
|
+
independent things vary the count: whether Phase 3 runs (known from Phase
|
|
90
|
+
0's BDD binding mode: skipped when `none`, so **-1**) and whether Phase 7
|
|
91
|
+
runs (Phase 6's decision — Phase 7 and Phase 8 are **not alternatives**;
|
|
92
|
+
when Phase 6 returns `[y]`, both Phase 7 *and* Phase 8 execute in sequence,
|
|
93
|
+
so entering Phase 7 is **+1**, not a shared slot). Concretely:
|
|
94
|
+
|
|
95
|
+
- Base count is **9** (Phases 0, 2, 3, 1, 4, 5, 6, 8, 9 — Phase 7 excluded
|
|
96
|
+
by default).
|
|
97
|
+
- **-1** when the Phase-0 BDD binding mode is `none` (Phase 3 never runs) —
|
|
98
|
+
known from Phase 0 onward, so this adjustment is baked into every
|
|
99
|
+
banner's `<total>` from the very first one.
|
|
100
|
+
- **+1** the moment Phase 6 resolves to `[y]` (entering Phase 7) — this is
|
|
101
|
+
**not** knowable before Phase 6 fires (an operator in `refactor-allowed`
|
|
102
|
+
mode can still pick `[b]`/`[q]` and skip Phase 7 despite the mode
|
|
103
|
+
permitting it), so `<total>` for Phases 0 through 6's banners uses the
|
|
104
|
+
**without-Phase-7** count; if Phase 6 then returns `[y]`, print one line
|
|
105
|
+
before Phase 7's banner — `Phase 7 entered — total phase count for this
|
|
106
|
+
run is now <new total> (was <old total>).` — and use the new total for
|
|
107
|
+
Phase 7, 8, and 9's banners. When `refactor-mode: no-refactor` (Phase 6
|
|
108
|
+
offers no `[y]` at all) or Phase 6 returns `[b]`/`[q]`, no adjustment ever
|
|
109
|
+
fires and `<total>` stays fixed for the whole run.
|
|
110
|
+
|
|
111
|
+
This keeps `<position>` strictly monotonic in every run shape, and
|
|
112
|
+
`<total>` honest at each point it's printed — correcting exactly once, with
|
|
113
|
+
a visible reason, only in the one case (entering Phase 7) that's genuinely
|
|
114
|
+
unknowable in advance.
|
|
115
|
+
|
|
116
|
+
The recap line reflects the still-active Phase-0 settings so an operator
|
|
117
|
+
resuming via `--from-phase` (or returning to a long-running session) sees the
|
|
118
|
+
current phase and active settings without scrollback archaeology.
|
|
119
|
+
|
|
120
|
+
## Steps
|
|
121
|
+
|
|
122
|
+
**Execution order.** Phases below are numbered by stable identity, not by
|
|
123
|
+
execution order — Phase 2 (Baseline) and Phase 3 (Derive Gherkin) execute
|
|
124
|
+
before Phase 1 (Analyze) so `/test-health` can use documented-but-untested
|
|
125
|
+
Gherkin scenarios as a coverage signal. **Document order below matches
|
|
126
|
+
execution order**: `0 → 2 → 3 → 1 → 4 → 5 → 6 → 7 → 8 → 9`, where Phase 7
|
|
127
|
+
runs only when Phase 6 returns `[y]` (see "Phase-start banner" above for how
|
|
128
|
+
this affects the banner's `<total>`) — Phase 7 and Phase 8 always run in
|
|
129
|
+
that sequence together, never as alternatives to each other. When the
|
|
130
|
+
Phase-0 BDD binding mode is `none`, Phase 3 is skipped and the executed
|
|
131
|
+
sequence becomes `0 → 2 → 1 → 4 → 5 → 6 → (7) → 8 → 9`.
|
|
132
|
+
|
|
133
|
+
## Phase Reference Files
|
|
134
|
+
|
|
135
|
+
Each phase's procedural detail lives in its own reference file, listed below.
|
|
136
|
+
|
|
137
|
+
| Phase | Name | Reference file |
|
|
138
|
+
| --- | --- | --- |
|
|
139
|
+
| 0 | Approach contract | `references/phase-0-approach-contract.md` |
|
|
140
|
+
| 1 | Analyze via /test-health | `references/phase-1-analyze.md` |
|
|
141
|
+
| 2 | Baseline | `references/phase-2-baseline.md` |
|
|
142
|
+
| 3 | Derive Gherkin | `references/phase-3-derive-gherkin.md` |
|
|
143
|
+
| 4 | Plan fixes | `references/phase-4-plan-fixes.md` |
|
|
144
|
+
| 5 | Improve without refactoring | `references/phase-5-improve.md` |
|
|
145
|
+
| 6 | Refactor decision | `references/phase-6-refactor-decision.md` |
|
|
146
|
+
| 7 | Refactor-for-testability | `references/phase-7-refactor.md` |
|
|
147
|
+
| 8 | Validate | `references/phase-8-validate.md` |
|
|
148
|
+
| 9 | Executive-summary report | `references/phase-9-report.md` |
|
|
149
|
+
|
|
150
|
+
The After-Phase-9 close-out prompt is not one of the ten numbered phases and deliberately has no row above; it is the separate `### After Phase 9` section further down, backed by `references/phase-9-close-out-prompt.md`.
|
|
151
|
+
|
|
152
|
+
Before executing a phase, read only that phase's reference file — never a
|
|
153
|
+
phase-specific reference file for a phase already completed in this run or a
|
|
154
|
+
prior resumed session. Shared implementation-detail reference files (e.g.
|
|
155
|
+
`references/review-loop.md`) are not phase-specific and may be read whenever
|
|
156
|
+
the phase you are executing points at them, regardless of whether another
|
|
157
|
+
phase also uses them.
|
|
158
|
+
|
|
159
|
+
This instruction is prose, not a hook-enforced gate — no mechanism in this
|
|
160
|
+
repo verifies at runtime that only the active phase's reference file was
|
|
161
|
+
read; compliance depends on the executing agent following the rule as
|
|
162
|
+
written.
|
|
163
|
+
|
|
164
|
+
### Phase 0 — Approach contract
|
|
165
|
+
|
|
166
|
+
<!-- include: references/phase-0-approach-contract.md -->
|
|
167
|
+
See `references/phase-0-approach-contract.md` for the full prompt battery and conflict-check mechanics.
|
|
168
|
+
|
|
169
|
+
### Phase 2 — Baseline (coverage + mutation)
|
|
170
|
+
|
|
171
|
+
<!-- include: references/phase-2-baseline.md -->
|
|
172
|
+
See `references/phase-2-baseline.md` for the full coverage-and-mutation baseline procedure, the coverage-gap ranking, and the ordering invariant.
|
|
173
|
+
|
|
174
|
+
### Phase 3 — Derive Gherkin (conditional)
|
|
175
|
+
|
|
176
|
+
<!-- include: references/phase-3-derive-gherkin.md -->
|
|
177
|
+
See `references/phase-3-derive-gherkin.md` for the full binding-mode
|
|
178
|
+
branches, persistence, human gate, and the bdd-runner pending-stub
|
|
179
|
+
interaction with Phase 5 — conditional on the Phase-0 BDD rubric answer.
|
|
180
|
+
|
|
181
|
+
### Phase 1 — Analyze via /test-health
|
|
182
|
+
|
|
183
|
+
<!-- include: references/phase-1-analyze.md -->
|
|
184
|
+
See `references/phase-1-analyze.md` for the full `/test-health` delegation,
|
|
185
|
+
the coverage-gap-ranking ordering rule and its `--analyze-only` no-ranking
|
|
186
|
+
case, the test-count-by-type snapshot and existing-snapshot guard, the human
|
|
187
|
+
gate, and the `/handoff` suggestion.
|
|
188
|
+
|
|
189
|
+
### Phase 4 — Plan fixes (partition findings by gap class)
|
|
190
|
+
|
|
191
|
+
<!-- include: references/phase-4-plan-fixes.md -->
|
|
192
|
+
See `references/phase-4-plan-fixes.md` for the full gap-class partitioning,
|
|
193
|
+
the coverage-gap-ranking Story order, the persistence path, and the human
|
|
194
|
+
gate blocking Phase 5.
|
|
195
|
+
|
|
196
|
+
### Phase 5 — Improve without refactoring (build + mutation-kill + review loop)
|
|
197
|
+
|
|
198
|
+
<!-- include: references/phase-5-improve.md -->
|
|
199
|
+
See `references/phase-5-improve.md` for the full per-Story build,
|
|
200
|
+
coverage-delta, and mutation-kill loop, the pending-stub gate, and the
|
|
201
|
+
end-of-phase review loop (which shares `references/review-loop.md` with
|
|
202
|
+
Phase 7).
|
|
203
|
+
|
|
204
|
+
### Phase 6 — Refactor decision (mode-gated)
|
|
205
|
+
|
|
206
|
+
<!-- include: references/phase-6-refactor-decision.md -->
|
|
207
|
+
See `references/phase-6-refactor-decision.md` for the full REFACTOR_REQUIRED
|
|
208
|
+
presentation, the `refactor-mode` branch, and the `[y/b/q]` decision prompt.
|
|
209
|
+
|
|
210
|
+
### Phase 7 — Refactor-for-testability (conditional)
|
|
211
|
+
|
|
212
|
+
<!-- include: references/phase-7-refactor.md -->
|
|
213
|
+
See `references/phase-7-refactor.md` for the full hard mode gate, the seam-only and
|
|
214
|
+
existing-tests-immutable constraints, the Phase-5 precondition check, and
|
|
215
|
+
the end-of-phase review loop (which shares `references/review-loop.md` with
|
|
216
|
+
Phase 5).
|
|
217
|
+
|
|
218
|
+
### Phase 8 — Validate (converge quality targets)
|
|
219
|
+
|
|
220
|
+
<!-- include: references/phase-8-validate.md -->
|
|
221
|
+
See `references/phase-8-validate.md` for the full mutation-target-per-mode
|
|
222
|
+
rules, the branch-scoped mutation validation, the coverage-<90%-in-no-refactor
|
|
223
|
+
re-run prompt, the evidence and test-count recount, and the `/handoff`
|
|
224
|
+
suggestion.
|
|
225
|
+
|
|
226
|
+
### Phase 9 — Executive-summary report
|
|
227
|
+
|
|
228
|
+
<!-- include: references/phase-9-report.md -->
|
|
229
|
+
See `references/phase-9-report.md` for the full executive-summary report
|
|
230
|
+
generation, the template source, output path, interpolation and
|
|
231
|
+
empty-section rules, the mutation row shape, the parent-issue/FEATURE.md
|
|
232
|
+
link update, and the regeneratable-from-tracked-data contract.
|
|
233
|
+
|
|
234
|
+
### After Phase 9 — Re-run-with-refactor close-out prompt
|
|
235
|
+
|
|
236
|
+
<!-- include: references/phase-9-close-out-prompt.md -->
|
|
237
|
+
See `references/phase-9-close-out-prompt.md` for the full re-run-with-refactor
|
|
238
|
+
close-out prompt: when it is suppressed, its `[y/n]` decision, and how it
|
|
239
|
+
differs from Phase 8's coverage-driven, mid-run prompt.
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
Resolve every ambiguous input in **one batch** before any work starts, then
|
|
2
|
+
persist the resolved inputs to `.claude/memory/test-improve/<slug>/phase-0.md`. The
|
|
3
|
+
file must exist **before Phase 1** runs.
|
|
4
|
+
|
|
5
|
+
**Detect language(s) and stack profile.** Inspect manifests for JS/TS
|
|
6
|
+
(`package.json`), Java (`pom.xml` / `build.gradle`), C# (`*.csproj`), and Go
|
|
7
|
+
(`go.mod`). If `--stack` was passed, honor it. Record the resolved stack in
|
|
8
|
+
`phase-0.md`.
|
|
9
|
+
|
|
10
|
+
**Go advisory (shown before the mutation prompt when Go is detected).**
|
|
11
|
+
|
|
12
|
+
> Mutation testing on Go uses **go-mutesting**, which is **alpha**-quality.
|
|
13
|
+
> Survivor count is **not a gate** on Go — treat it as advisory. For real
|
|
14
|
+
> confidence in Go tests, prefer `go test -fuzz` on the parts of the code
|
|
15
|
+
> that reward it. In `baseline+kill-loop` mode the orchestrator records
|
|
16
|
+
> baseline and delta numbers; in `kill-loop` it records only the final
|
|
17
|
+
> surviving-mutant count. Either way the Phase-8 mutation target is
|
|
18
|
+
> advisory-only for Go.
|
|
19
|
+
|
|
20
|
+
**Prompt battery (one batch, six knobs).** Each prompt displays its default in
|
|
21
|
+
`[brackets]`; pressing **Enter accepts every default in one keystroke** — with
|
|
22
|
+
**one deliberate exception**: knob 6 (code-lookup install) is **not** part of the
|
|
23
|
+
Enter-accepts-all gesture, because accepting it mutates the filesystem (and, for
|
|
24
|
+
Graphify, the repo's `CLAUDE.md`). Knob 6 is the **sole** exception; it requires an
|
|
25
|
+
explicit `y`/`n` and a blank response **re-prompts** rather than defaulting either
|
|
26
|
+
way. This is called out in the knob-6 prompt itself so the divergence is never a
|
|
27
|
+
silent surprise.
|
|
28
|
+
|
|
29
|
+
1. **Mutation mode** — `[kill-loop]`. A three-way choice; the value recorded in
|
|
30
|
+
`phase-0.md` and shown in the banner is the canonical token (`off` /
|
|
31
|
+
`kill-loop` / `baseline+kill-loop`), used verbatim in both places:
|
|
32
|
+
- `off` — no mutation testing (lightweight ceremony).
|
|
33
|
+
- `kill-loop` (**default**) — run the mutant-kill loop and produce a final
|
|
34
|
+
report of surviving mutants, **without** a separate baseline run first.
|
|
35
|
+
- `baseline+kill-loop` — run the mutation baseline first, then the mutant-kill
|
|
36
|
+
loop (a before/after mutation delta).
|
|
37
|
+
|
|
38
|
+
**Default change — mutation now runs by default.** The old knob defaulted to
|
|
39
|
+
`off` (no mutation work on Enter-through); under `kill-loop` an Enter-through
|
|
40
|
+
run **now performs the mutant-kill loop**. The prompt flags this so it is
|
|
41
|
+
never a silent surprise.
|
|
42
|
+
|
|
43
|
+
**Show the relative cost with the choice (#1965).** This knob is the
|
|
44
|
+
largest single cost multiplier in the workflow, and an operator pressing
|
|
45
|
+
Enter through the battery was accepting it without the price ever being
|
|
46
|
+
named. State it in the prompt — qualitatively, never as a fabricated dollar
|
|
47
|
+
figure (`/cost-report` is the instrument for actuals):
|
|
48
|
+
|
|
49
|
+
> Relative cost: `off` adds none. `kill-loop` adds roughly one
|
|
50
|
+
> opus-tier `mutation-kill` dispatch per module batch in Phase 5 (up to 3
|
|
51
|
+
> rounds each), plus the mutation tool's own runtime.
|
|
52
|
+
> `baseline+kill-loop` adds a full mutation baseline run on top of that.
|
|
53
|
+
|
|
54
|
+
This is disclosure, not a recommendation and not a default change: the
|
|
55
|
+
risk-mitigation trade each mode buys is the operator's call, and mutation
|
|
56
|
+
work is how assertion quality gets measured at all. Naming the price just
|
|
57
|
+
makes it an informed one.
|
|
58
|
+
2. **BDD rubric** — five yes/no questions from
|
|
59
|
+
`knowledge/references/bdd-value-guide.md`. **Default `none`** if the
|
|
60
|
+
operator declines to answer. Scoring: ≥3 yes → `bdd-runner` recommended;
|
|
61
|
+
1–2 yes → `xunit-with-annotations` recommended; 0 yes → `none`.
|
|
62
|
+
|
|
63
|
+
**Relative cost (#1965)**, stated with the choice for the same reason as
|
|
64
|
+
knob 1:
|
|
65
|
+
|
|
66
|
+
> `none` skips Phase 3 entirely. `xunit-with-annotations` adds scenario
|
|
67
|
+
> derivation and `.feature` authoring. `bdd-runner` adds those plus parser
|
|
68
|
+
> wiring, step-definition stub generation, and the Phase-5 pending-stub
|
|
69
|
+
> gate every stub must clear before the phase can close.
|
|
70
|
+
3. **Refactor mode** — `[no-refactor]`. Default is **`no-refactor`**. Choose
|
|
71
|
+
`refactor-allowed` to permit production-code changes in Phase 7 (seams
|
|
72
|
+
only; existing tests may not be modified or removed).
|
|
73
|
+
4. **Quality targets** — defaults: coverage ≥ 90% line + branch; surviving
|
|
74
|
+
mutants = 0 (only when mutation mode is not `off`); determinism = 100%; wall-clock =
|
|
75
|
+
fastest achievable. Any target can be overridden here; overrides land in
|
|
76
|
+
`phase-0.md` and flow into Phase 8.
|
|
77
|
+
5. **Sink** — `--parent <url>` selects a tracker (ADO / GitHub / GitLab /
|
|
78
|
+
Jira via the host CLI); missing CLI or omitted flag falls back to
|
|
79
|
+
**local-files** mode (writes under `.dev-team-reports/test-improve/` and
|
|
80
|
+
`.claude/plans/test-improve/`).
|
|
81
|
+
6. **Code-lookup tools (all-or-none install)** — offer to install the three
|
|
82
|
+
code-lookup tools (**CodeGraph**, **Repowise**, **Graphify**) so the review
|
|
83
|
+
and analysis agents read verified skeletons and resolved call graphs instead
|
|
84
|
+
of re-reading whole files. **Recommended: yes** when any of the three is
|
|
85
|
+
missing. This knob is an **explicit `y`/`n`** (see the Enter-accepts-all
|
|
86
|
+
exception above); a blank answer re-prompts. The prompt names the three tools
|
|
87
|
+
and discloses that Graphify writes a `## graphify` section into this repo's
|
|
88
|
+
`CLAUDE.md` and installs git hooks.
|
|
89
|
+
- **Idempotent / missing-subset.** Detect which of the three are already
|
|
90
|
+
present; offer only the **missing** subset. When all three are present,
|
|
91
|
+
do not prompt — record `code_lookup_tools: already present`.
|
|
92
|
+
- **Delegate the install — never reimplement it.** On `y`, delegate to
|
|
93
|
+
`/project-init`'s Step 4c graph-tools group (the canonical installer); do
|
|
94
|
+
not duplicate install commands or probes here.
|
|
95
|
+
- **Decline is visibly confirmed.** On `n`, install nothing and print
|
|
96
|
+
`Code-lookup tools: skipped — agents fall back to Read/Grep/Glob.`
|
|
97
|
+
- **Partial failure is recorded, not masked.** If the delegated install
|
|
98
|
+
partially fails, record per-tool success/failure in `phase-0.md` and do
|
|
99
|
+
not claim full install success.
|
|
100
|
+
|
|
101
|
+
**Coverage-target vs refactor-mode conflict check (issue #1787).** A stated
|
|
102
|
+
coverage percentage (**knob 4**) and `refactor-mode: no-refactor` (**knob 3**)
|
|
103
|
+
can be structurally incompatible, and Pass 1 held both at once without ever
|
|
104
|
+
saying so: mutation-kill work cannot raise line or branch coverage on code that
|
|
105
|
+
has no tests at all, and a layer at near-zero coverage generally needs a
|
|
106
|
+
production-code seam before any test can reach it. Resolve this **before** any
|
|
107
|
+
work starts — **never by waiving a gate later**, which is what happened when
|
|
108
|
+
branch-90 was quietly waived at a later gate while coverage-90 stayed a stated
|
|
109
|
+
goal to the end.
|
|
110
|
+
|
|
111
|
+
Run the check; do not judge it in prose:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
sh "${CLAUDE_PLUGIN_ROOT}/hooks/py.sh" "${CLAUDE_PLUGIN_ROOT}/scripts/coverage_gap_ranking.py" \
|
|
115
|
+
--report <existing coverage report> --repo-root <repo-path> \
|
|
116
|
+
--target-line-pct <line target> --target-branch-pct <branch target> --json
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
- **A coverage report is discoverable** — a prior run's
|
|
120
|
+
`.dev-team-reports/test-improve/<slug>/data/baseline-coverage.json`'s
|
|
121
|
+
`raw_report`, or a report artifact already on disk (`lcov.info`,
|
|
122
|
+
`coverage.json`, `cobertura.xml`, `jacoco.csv`, `coverage-summary.json`).
|
|
123
|
+
The script's `verdict` decides:
|
|
124
|
+
- **`unreachable_without_seams` (exit 3)** — the target cannot be reached even
|
|
125
|
+
if every module that already has a test seam went to 100%. Present the
|
|
126
|
+
explicit three-way choice **`[w] waive the target / [s] switch to
|
|
127
|
+
refactor-allowed / [c] continue as-is`** (shape `[w/s/c]`), naming the
|
|
128
|
+
script's own numbers — `lines_needed`, `reachable_uncovered_lines`, and the
|
|
129
|
+
top seam-blocked modules — so the operator sees the arithmetic, not an
|
|
130
|
+
opinion. `[w]` records the target as **waived at Phase 0** with this reason
|
|
131
|
+
(Phase 8 then reports it waived up front instead of discovering it); `[s]`
|
|
132
|
+
records `refactor-mode: refactor-allowed` (Phase 0 is still resolving its
|
|
133
|
+
own answers here, so this is not an immutability exception); `[c]` proceeds
|
|
134
|
+
with `coverage_target_conflict: acknowledged` recorded. A **non-interactive**
|
|
135
|
+
run **does not silently pick a stance** — it records
|
|
136
|
+
`coverage_target_conflict: unresolved`, prints the same three options, and
|
|
137
|
+
the conflict is restated at Phase 8 rather than resolved by default.
|
|
138
|
+
- **`reachable` / `already_met` (exit 0)** — record
|
|
139
|
+
`coverage_target_conflict: none` and continue.
|
|
140
|
+
- **No coverage report is discoverable** — do **not** fabricate a verdict from
|
|
141
|
+
no data. Record `coverage_target_conflict: deferred` and run this identical
|
|
142
|
+
check at Phase 2 against the freshly captured baseline, **before** Phase 1
|
|
143
|
+
consumes the ranking (see the coverage-gap ranking step in
|
|
144
|
+
`phase-2-baseline.md`). Deferred means
|
|
145
|
+
*checked one phase later against real numbers* — never dropped, and never
|
|
146
|
+
first surfaced in the Phase-9 report.
|
|
147
|
+
|
|
148
|
+
This check is skipped entirely when knob 4 left no coverage percentage target
|
|
149
|
+
active, or when knob 3 selected `refactor-allowed` (there is no mode conflict
|
|
150
|
+
to surface).
|
|
151
|
+
|
|
152
|
+
**Persistence.** Write the resolved inputs to `.claude/memory/test-improve/<slug>/phase-0.md` before Phase 1 runs — Phase 1 must not start until `phase-0.md` exists. This includes the knob-6 outcome (the operator's install choice, and for each tool whether it was already present, installed, declined, or failed).
|
|
153
|
+
|
|
154
|
+
**Immutability.** Phase-0 answers are **immutable** for the remainder of the
|
|
155
|
+
run. `--from-phase` does not re-prompt Phase-0 inputs. To change them, delete
|
|
156
|
+
`.claude/memory/test-improve/<slug>/phase-0.md` and re-run from Phase 0.
|
|
157
|
+
|
|
158
|
+
**`--analyze-only` semantics.** With `--analyze-only`, Phase 0 completes as
|
|
159
|
+
normal, Phase 1 (`/test-health`) runs, and the orchestrator **exits after Phase 1**
|
|
160
|
+
with a summary of the improvement plan. This is a deliberate carve-out:
|
|
161
|
+
Phase 1 runs **directly**, bypassing the default Baseline (Phase 2) / Derive
|
|
162
|
+
Gherkin (Phase 3) ordering (`0 → 2 → 3 → 1 → 4 → ...`) — not a contradiction
|
|
163
|
+
of it. No baseline is captured; no code changes.
|
|
164
|
+
|
|
165
|
+
**`--from-phase` semantics.** `--from-phase <n>` resumes **at** phase `n` and
|
|
166
|
+
skips every phase that precedes `n` in the **execution** sequence
|
|
167
|
+
`0, 2, 3, 1, 4, 5, 6, 7, 8, 9` (not identity order — e.g. `--from-phase 1`
|
|
168
|
+
skips Phases 0, 2, and 3, not just 0). Phase-0 inputs are read from
|
|
169
|
+
`phase-0.md` (never re-prompted). **An explicit `<n>` is not validated
|
|
170
|
+
against this sequence** beyond requiring `phase-0.md` to exist — e.g.
|
|
171
|
+
`--from-phase 1` does not check that Phase 2 (Baseline) has actually run
|
|
172
|
+
first, so an operator passing an out-of-sequence `<n>` by hand can skip a
|
|
173
|
+
phase whose output later phases depend on (Baseline before any test-file
|
|
174
|
+
change, in particular). Prefer `--from-phase` with no number
|
|
175
|
+
(auto-detect, below) unless there's a specific reason to name a phase
|
|
176
|
+
explicitly.
|
|
177
|
+
|
|
178
|
+
**`--from-phase` with no number — auto-detect the resume point.** When
|
|
179
|
+
`--from-phase` is passed **without** a number, resolve the resume phase by
|
|
180
|
+
calling the helper — do **not** infer it in prose:
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/test_improve_resume.py" <repo-path>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
The helper resolves the slug from `<repo-path>` (its last path segment), scans
|
|
187
|
+
**only** that slug's `.claude/memory/test-improve/<slug>/` directory for the
|
|
188
|
+
completed-phase progress files (`phase-0.md` … `phase-9.md`, excluding
|
|
189
|
+
`phase-3.md` — Phase 3 is conditional and tracked via `gherkin.md` instead,
|
|
190
|
+
never a numbered progress file), finds the highest completed phase in
|
|
191
|
+
**execution** order (`0, 2, 1, 4, 5, 6, 7, 8, 9` — Phase 3 excluded, matching
|
|
192
|
+
the progress-file scan above), and prints a JSON object whose
|
|
193
|
+
`resolved_phase` is the phase to resume at and whose `message` reads e.g.
|
|
194
|
+
`Resuming at Phase 8 (latest completed: phase-6.md).`. Print that `message`
|
|
195
|
+
so the operator can confirm before work starts, then resume at
|
|
196
|
+
`resolved_phase`. Resolution rules the helper encodes:
|
|
197
|
+
|
|
198
|
+
- A completed `phase-5.md` with **no** `phase-6.md` resumes at **Phase 6**;
|
|
199
|
+
a completed `phase-6.md` resumes at **Phase 8** (matching the `[b]`/`[q]`
|
|
200
|
+
skip-to-8 flow); a completed `phase-7.md` resumes at **Phase 8**.
|
|
201
|
+
- Only `phase-0.md` present resumes at **Phase 2** (Baseline — the phase that
|
|
202
|
+
now executes immediately after Phase 0).
|
|
203
|
+
- A completed `phase-2.md` with **no** `phase-1.md` resumes at **Phase 1**
|
|
204
|
+
(Phase 3 has no tracked progress file, so the auto-detect skips over it —
|
|
205
|
+
see `test_improve_resume.py`'s module docstring). A completed `phase-1.md`
|
|
206
|
+
resumes at **Phase 4**.
|
|
207
|
+
- **No memory dir / no phase files / `phase-0.md` missing** — the helper exits
|
|
208
|
+
non-zero; surface its error message (which points to running
|
|
209
|
+
`/test-improve <repo-path>` from Phase 0) and do **not** silently start at
|
|
210
|
+
Phase 0.
|
|
211
|
+
- A completed `phase-9.md` means the run is already complete (`complete:
|
|
212
|
+
true`) — report it; there is nothing to resume.
|
|
213
|
+
|
|
214
|
+
To resolve an **explicit** `<n>` (including validating that `phase-0.md`
|
|
215
|
+
exists) the skill may pass `--explicit <n>`; an explicit `<n>` **overrides**
|
|
216
|
+
auto-detection. Auto-detect and explicit alike read Phase-0 inputs from
|
|
217
|
+
`phase-0.md` and never re-prompt them.
|
|
218
|
+
|
|
219
|
+
**Phase-6 prompt letter.** The full Phase-6 refactor-decision prompt —
|
|
220
|
+
shown only in `refactor-allowed` mode — uses `[y/b/q]` (not `[r]`; see
|
|
221
|
+
`phase-6-refactor-decision.md` for why `r` was avoided). `[y]` advances to
|
|
222
|
+
Phase 7; `[b]` backlogs the REFACTOR_REQUIRED items and
|
|
223
|
+
skips to Phase 8; `[q]` quits before Phase 8. In `no-refactor` mode (the
|
|
224
|
+
default) Phase 6 is **informational only** — no `[y]` is offered, the
|
|
225
|
+
REFACTOR_REQUIRED items are auto-backlogged, and the run continues to Phase 8
|
|
226
|
+
(see `phase-6-refactor-decision.md` for the full branch mechanics
|
|
227
|
+
and `phase-7-refactor.md` for the hard-mode-gate backstop that
|
|
228
|
+
enforces this same `no-refactor` restriction if Phase 7 is somehow reached).
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
Delegate the entire analysis pass to **`/test-health`** — it is the **sole
|
|
2
|
+
worker** for Phase 1. Invoke it exactly once with the resolved repo path from
|
|
3
|
+
Phase 0. `/test-health` internally orchestrates whatever sub-skills it needs
|
|
4
|
+
(CD-alignment audit, test-design assessment, mutation-testing roll-up); the
|
|
5
|
+
orchestrator must **not** invoke `/cd-test-architecture`, `/test-design`, or
|
|
6
|
+
`/mutation-testing` separately here. Any prior workflow that reached those
|
|
7
|
+
skills directly is superseded by the single `/test-health` call.
|
|
8
|
+
|
|
9
|
+
**Mutation mode gates the mutation sub-run itself, not just the report
|
|
10
|
+
(#1961).** Read the mutation mode from `phase-0.md` and thread it into the
|
|
11
|
+
invocation:
|
|
12
|
+
|
|
13
|
+
- **Mutation mode `off` — the mutation section is omitted / "not enabled",
|
|
14
|
+
and the sub-run is skipped too.** Invoke `/test-health --no-mutation`, which
|
|
15
|
+
skips its Step-5 `mutation-testing` invocation outright rather than running
|
|
16
|
+
it and discarding the result. This used to be a report-time filter only: the
|
|
17
|
+
mutation tool ran, the roll-up was produced, and the output was then
|
|
18
|
+
suppressed — a measurement with no consumer, since `off` also means no
|
|
19
|
+
Phase-5 kill loop will consume survivor ordering. A skip is not a waiver and
|
|
20
|
+
not a coverage gap; the target was never in scope for this run.
|
|
21
|
+
- **Mutation mode `kill-loop` or `baseline+kill-loop`** — invoke
|
|
22
|
+
`/test-health` with no mutation flag. The mutation section is **present**,
|
|
23
|
+
and its ROI framing feeds the ordered plan as before.
|
|
24
|
+
|
|
25
|
+
**Order the plan by the coverage-gap ranking whenever a coverage percentage
|
|
26
|
+
is a stated goal (issue #1786).** Read
|
|
27
|
+
`.dev-team-reports/test-improve/<slug>/data/coverage-gap-ranking.json` —
|
|
28
|
+
written by Phase 2 (see `phase-2-baseline.md`) — and order the
|
|
29
|
+
coverage-driven items of `/test-health`'s ordered
|
|
30
|
+
improvement plan by that ranking's `modules` array (`rank` 1 first), not by
|
|
31
|
+
mutation survivor count and not by an ordering re-derived here. `/test-health`'s
|
|
32
|
+
own ordering stands only for items the ranking does not speak to (flakiness,
|
|
33
|
+
determinism, suite shape), and for a run where **no coverage percentage is a
|
|
34
|
+
stated goal** (Phase-0 knob 4 overrode the coverage targets away) the ranking
|
|
35
|
+
is **informational** rather than the ordering authority.
|
|
36
|
+
|
|
37
|
+
**Under `--analyze-only` there is no ranking to read.** That mode runs Phase 0
|
|
38
|
+
then Phase 1 directly and captures no baseline, so Phase 2 never wrote
|
|
39
|
+
`coverage-gap-ranking.json`. Do not fabricate one and do not silently fall back
|
|
40
|
+
to survivor ordering: present `/test-health`'s own ordering and state plainly
|
|
41
|
+
that the coverage-gap ranking was not computed for this run (a full run would
|
|
42
|
+
order the coverage-driven items by it). The same holds for a `--from-phase 1`
|
|
43
|
+
resume whose `data/` directory has no ranking file — say so rather than
|
|
44
|
+
proceeding as if the ordering were coverage-derived.
|
|
45
|
+
|
|
46
|
+
**Mutation survivors order work *within* an already-seamed module, never
|
|
47
|
+
across modules.** A module whose ranking entry reads `seam: established`
|
|
48
|
+
already has baseline coverage, so survivor counts are the right next signal
|
|
49
|
+
*there* — that is the ordering the `mutation-kill` agent applies inside Phase
|
|
50
|
+
5. A module whose entry reads `seam: absent` needs coverage before it needs
|
|
51
|
+
assertion quality, and is ordered by uncovered lines alone. Under
|
|
52
|
+
`refactor-mode: no-refactor` a top-ranked `seam: absent` module whose tests
|
|
53
|
+
need a production seam is still shown in the presented plan — labeled
|
|
54
|
+
**skipped-in-no-refactor** per the human gate below — so the operator sees the
|
|
55
|
+
coverage left on the table instead of a plan that quietly reorders around it.
|
|
56
|
+
|
|
57
|
+
**Output.** Persist the rolled-up analysis plus the ordered improvement plan to
|
|
58
|
+
`.claude/memory/test-improve/<slug>/phase-1.md`.
|
|
59
|
+
|
|
60
|
+
**Test-count-by-type snapshot.** Independent of the `/test-health` call
|
|
61
|
+
above (and of whether `/test-health`'s own trivial-suite short-circuit
|
|
62
|
+
fired for this run), perform a direct classification pass over the test
|
|
63
|
+
files under the `<repo-path>` Phase 0 resolved: apply
|
|
64
|
+
`knowledge/cd-test-architecture.md`'s
|
|
65
|
+
six-type criteria (Static analysis / Unit / Component / Contract /
|
|
66
|
+
Integration / End-to-end) directly to each test suite/file found. **One
|
|
67
|
+
test file counts as exactly one suite**, regardless of how many describe
|
|
68
|
+
blocks or test classes it contains. Tie-break rule for a file that doesn't
|
|
69
|
+
cleanly fit one type: classify by its dominant/highest-dependency type
|
|
70
|
+
(e.g. a suite exercising a real DB connection classifies as integration
|
|
71
|
+
even if most of its assertions read like unit-level checks); if dominance
|
|
72
|
+
is still tied, classify by the higher-fidelity type using this fixed
|
|
73
|
+
precedence: `end_to_end` > `integration` > `contract` > `component` >
|
|
74
|
+
`unit` (this precedence applies to test files only — `static_analysis` is
|
|
75
|
+
never a legitimate outcome of classifying a test file; see its own
|
|
76
|
+
counting rule below). Persist
|
|
77
|
+
`.dev-team-reports/test-improve/<slug>/data/test-counts-before.json` — written
|
|
78
|
+
**directly** to the git-tracked `data/` sibling (this file has no other
|
|
79
|
+
consumer, so no separate `.claude/memory/` copy is needed) — with the six
|
|
80
|
+
canonical snake_case keys, in this fixed order: `static_analysis`, `unit`,
|
|
81
|
+
`component`, `contract`, `integration`, `end_to_end` — each key present
|
|
82
|
+
even at zero, counting **test suites/files, not individual test cases or
|
|
83
|
+
assertions**. `static_analysis` counts configured linter/scanner tool
|
|
84
|
+
invocations (one per tool — e.g. ESLint, Semgrep, mypy) rather than
|
|
85
|
+
test-directory files, since static analysis runs over non-running code and
|
|
86
|
+
is rarely organized as a describe-block suite; when the repo has no
|
|
87
|
+
configured static-analysis tooling at all, the key is `0`, not omitted.
|
|
88
|
+
|
|
89
|
+
**Existing-snapshot guard.** Before persisting, check whether
|
|
90
|
+
`test-counts-before.json` already exists under
|
|
91
|
+
`.dev-team-reports/test-improve/<slug>/data/` for the resolved slug. This
|
|
92
|
+
guard is Phase 1's application of the shared existing-tracked-artifact
|
|
93
|
+
re-capture guard — the canonical definition and rationale live once in
|
|
94
|
+
`knowledge/decision-defaults.md`'s "Re-capture: keep vs. overwrite an existing
|
|
95
|
+
tracked artifact" axis; this step cites that axis for the *why* and spells out
|
|
96
|
+
the operational branches below so an executing agent doesn't need to open a
|
|
97
|
+
second file mid-task. **No existing file** → write the fresh snapshot
|
|
98
|
+
directly; no prompt is needed. **An existing file that is malformed or
|
|
99
|
+
corrupt** (fails to parse as JSON — e.g. left over from a prior interrupted
|
|
100
|
+
write) → treat it as absent, never as a snapshot to keep; emit a warning
|
|
101
|
+
naming why a fresh capture is happening, then write the fresh snapshot
|
|
102
|
+
directly (no prompt — there is nothing valid to keep). **An existing, readable
|
|
103
|
+
file**, interactive session → prompt: *"An existing
|
|
104
|
+
test-counts-before.json was found for `<slug>` — overwrite it (starts a fresh
|
|
105
|
+
before/after comparison) or keep it (reuse for this run)? `[keep/overwrite,
|
|
106
|
+
default: keep]`"* Answering `overwrite` replaces the existing file with a
|
|
107
|
+
fresh snapshot. Answering `keep` (or declining) leaves the existing file
|
|
108
|
+
untouched and Phase 1 reuses it for this run. An **unrecognized answer**
|
|
109
|
+
(anything other than `keep` or `overwrite`) re-prompts with the identical
|
|
110
|
+
text — it never silently falls back to the default. When the run is
|
|
111
|
+
**non-interactive** (no usable TTY / `DEV_TEAM_AUTO_APPROVE=1`), the prompt is
|
|
112
|
+
never shown; Phase 1 defaults to **keep existing** and logs the
|
|
113
|
+
auto-decision, mirroring `decision-defaults.md`'s non-interactive rule — never
|
|
114
|
+
a non-default stance (overwrite) with nobody present to confirm it. The
|
|
115
|
+
malformed-file branch above is the one exception to that keep-by-default
|
|
116
|
+
posture — an unreadable file is treated as absent in every mode, since there
|
|
117
|
+
is nothing valid to keep.
|
|
118
|
+
|
|
119
|
+
This pass does **not** invoke `/test-health` or `/cd-test-architecture`'s
|
|
120
|
+
full skill.
|
|
121
|
+
|
|
122
|
+
**Human gate.** After `/test-health` returns, present **the ordered improvement
|
|
123
|
+
plan** to the operator and wait for explicit approval. **Phase 4 does not run**
|
|
124
|
+
until the operator approves. This is the human gate for Phase 1; do not advance
|
|
125
|
+
past it without approval. When `phase-0.md` recorded
|
|
126
|
+
`refactor-mode: no-refactor`, any plan item that would require a production-code
|
|
127
|
+
refactor is labeled **skipped-in-no-refactor** (out of scope for this run) so
|
|
128
|
+
the operator sees the coverage/behavior left on the table — such items are never
|
|
129
|
+
presented as ordinary next steps that this run will execute.
|
|
130
|
+
|
|
131
|
+
**`/handoff` suggestion** (context-heavy analysis). Once the gate above resolves, print: `Phase 1 complete. Consider running /handoff to compress context before continuing. To resume: /test-improve <repo-path> --from-phase 4 (or --from-phase with no number to auto-detect the resume point)`
|