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,335 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: coverage-baseline
|
|
3
|
+
description: >-
|
|
4
|
+
Multi-workflow coverage baseline worker. Detects the repo's coverage tool
|
|
5
|
+
from its build manifest, runs it, records the resulting line+branch
|
|
6
|
+
percentages as the baseline, and posts the number to the parent issue (or
|
|
7
|
+
local `FEATURE.md`). This number is the floor every later phase must improve
|
|
8
|
+
on. Called by `/test-improve` (Phase 2) via `--workflow test-improve`.
|
|
9
|
+
argument-hint: "<repo-path> [--parent <issue-url>] [--repo-slug <slug>] [--workflow <name>]"
|
|
10
|
+
user-invocable: true
|
|
11
|
+
allowed-tools: Read, Glob, Grep, Bash, Write
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Coverage Baseline
|
|
15
|
+
|
|
16
|
+
Role: worker. Captures the true baseline coverage of the repo *after* cannot-fail tests have been disabled so the floor isn't inflated by tautologies.
|
|
17
|
+
|
|
18
|
+
You have been invoked with the `/coverage-baseline` command.
|
|
19
|
+
|
|
20
|
+
## Parse Arguments
|
|
21
|
+
|
|
22
|
+
Arguments: $ARGUMENTS
|
|
23
|
+
|
|
24
|
+
- Positional: `<repo-path>`.
|
|
25
|
+
- `--parent <issue-url>` — parent issue URL on the resolved tracker (or empty for local-files mode).
|
|
26
|
+
- `--repo-slug <slug>` — namespace under `.claude/memory/<workflow>/`.
|
|
27
|
+
- `--workflow <name>` — the workflow namespace under `.claude/memory/`. Defaults to `test-improve`. Orchestrators pass their own namespace (e.g. `/test-improve` passes `test-improve` for its Phase-2 baseline).
|
|
28
|
+
|
|
29
|
+
If `<repo-path>` is absent, ask the operator.
|
|
30
|
+
|
|
31
|
+
## Steps
|
|
32
|
+
|
|
33
|
+
### 1. Detect the coverage tool
|
|
34
|
+
|
|
35
|
+
Read the build manifest at the repo root and pick the appropriate command:
|
|
36
|
+
|
|
37
|
+
| Manifest | Default coverage command |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `package.json` (JS/TS) | `npm test -- --coverage` (or `pnpm test --coverage`, `yarn test --coverage`) — or, when a workspace signal is present (a root `workspaces` field, `pnpm-workspace.yaml`, or `lerna.json`), multi-project discovery (see [Step 1a](#1a-multi-project-discovery-net-solutions-jsts-workspaces--java-multi-module-builds)) |
|
|
40
|
+
| `pyproject.toml` / `setup.py` | `pytest --cov=. --cov-report=json` |
|
|
41
|
+
| `pom.xml` | `mvn test jacoco:report` — or, when the root `pom.xml` declares `<modules>`, multi-project discovery (see [Step 1a](#1a-multi-project-discovery-net-solutions-jsts-workspaces--java-multi-module-builds)) |
|
|
42
|
+
| `build.gradle*` | `./gradlew test jacocoTestReport` — or, when `settings.gradle`/`settings.gradle.kts` declares `include(...)`, multi-project discovery (see [Step 1a](#1a-multi-project-discovery-net-solutions-jsts-workspaces--java-multi-module-builds)) |
|
|
43
|
+
| `*.csproj` | `dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=json` — or, when a `.sln` is present at the repo root, multi-project discovery (see [Step 1a](#1a-multi-project-discovery-net-solutions-jsts-workspaces--java-multi-module-builds)) |
|
|
44
|
+
| `Cargo.toml` | `cargo llvm-cov --json` |
|
|
45
|
+
| `go.mod` | `go test -coverprofile=coverage.out ./...` + `go tool cover -func=coverage.out` |
|
|
46
|
+
|
|
47
|
+
If the repo has its own coverage script (e.g. `npm run coverage`, `make coverage`), prefer that — detect via `package.json#scripts.coverage`, the `Makefile`, or a documented run target in `README.md`. If detection is ambiguous, ask the operator for the exact command. This override does not apply to the `.sln`/`.csproj`, `pom.xml`, or `build.gradle*` rows above — each of those rows' discovery scripts always re-derives the project/module list itself, per-run, regardless of any repo-level coverage script.
|
|
48
|
+
|
|
49
|
+
### 1a. Multi-project discovery (.NET solutions, JS/TS workspaces & Java multi-module builds)
|
|
50
|
+
|
|
51
|
+
Replaces the single frozen coverage command above for a multi-project .NET
|
|
52
|
+
solution, JS/TS workspace, or Java multi-module build — closing the gap where
|
|
53
|
+
a hand-picked,
|
|
54
|
+
never-revisited inclusion list caused a real coverage delta to be
|
|
55
|
+
underreported (issue #1759). **Implementation detail** — the discovery,
|
|
56
|
+
bootstrap/drift-check, weighted-merge, and persist mechanics below:
|
|
57
|
+
[`references/multi-project-discovery.md`](references/multi-project-discovery.md),
|
|
58
|
+
mirroring the `../coverage-delta/references/mutation-gate.md` precedent. This
|
|
59
|
+
section pins the contract surface (script names, the hard-failure rule, and
|
|
60
|
+
the exact message templates) that reviewers and tests depend on; the
|
|
61
|
+
reference file holds the mechanics. `coverage-delta`'s own Step 2 links to
|
|
62
|
+
the same reference file rather than re-deriving this a third time.
|
|
63
|
+
|
|
64
|
+
**.NET** — when a `.sln` file exists at the repo root, run
|
|
65
|
+
`${CLAUDE_PLUGIN_ROOT}/scripts/coverage_discovery_dotnet.py`'s
|
|
66
|
+
`discover_dotnet_projects(repo_root)` instead of the single `dotnet test`
|
|
67
|
+
command above. It returns every project in the solution, each classified
|
|
68
|
+
`TEST`, `AMBIGUOUS`, or `NOT_TEST` (`coverage_config.TestClassification`).
|
|
69
|
+
|
|
70
|
+
**JS/TS** — when the root `package.json` declares a `workspaces` field, or a
|
|
71
|
+
`pnpm-workspace.yaml`/`lerna.json` is present, run
|
|
72
|
+
`${CLAUDE_PLUGIN_ROOT}/scripts/coverage_discovery_js.py`'s
|
|
73
|
+
`discover_js_packages(repo_root)` instead of the single `npm test --
|
|
74
|
+
--coverage` command above. It returns every resolved workspace package, each
|
|
75
|
+
classified `TEST` or `NOT_TEST`.
|
|
76
|
+
|
|
77
|
+
**Java** — when a root `pom.xml` declares `<modules>` (Maven), or a
|
|
78
|
+
`settings.gradle`/`settings.gradle.kts` declares `include(...)` (Gradle), run
|
|
79
|
+
`${CLAUDE_PLUGIN_ROOT}/scripts/coverage_discovery_java.py`'s
|
|
80
|
+
`discover_java_modules(repo_root)` instead of the single `mvn test
|
|
81
|
+
jacoco:report` / `./gradlew test jacocoTestReport` command above. Maven takes
|
|
82
|
+
precedence when both signals are present (no cross-merge). It returns every
|
|
83
|
+
module in the build graph — recursively through Maven aggregator modules —
|
|
84
|
+
each classified `TEST`, `AMBIGUOUS`, or `NOT_TEST`. `TEST` requires BOTH a
|
|
85
|
+
`src/test/java`/`src/test/kotlin` directory AND a JUnit/TestNG dependency
|
|
86
|
+
declared on a test configuration in the module's OWN build file; a test-source
|
|
87
|
+
directory whose framework dependency is only inherited (a parent POM, a Gradle
|
|
88
|
+
`subprojects {}` block, a convention plugin) is `AMBIGUOUS`, never silently
|
|
89
|
+
`NOT_TEST`.
|
|
90
|
+
|
|
91
|
+
Any of the three discovery functions can return `coverage_config.DISCOVERY_NOT_APPLICABLE`
|
|
92
|
+
(no `.sln` / no workspace signal / no multi-module signal — see Step 1b below: the repo is
|
|
93
|
+
single-project and unaffected by anything in this section) or
|
|
94
|
+
`coverage_config.discovery_error(...)` for a tooling/parsing failure — treat
|
|
95
|
+
a `discovery_error` exactly like an existing Step 3 coverage-run failure
|
|
96
|
+
(surface the error, write no baseline, stop). That is a genuine tool
|
|
97
|
+
failure, not the actionable config gap the hard-failure block below
|
|
98
|
+
describes, so it stays on Step 3's existing path rather than growing a
|
|
99
|
+
third failure shape.
|
|
100
|
+
|
|
101
|
+
**Config path.** `coverage-config.json` is read from and written to the exact
|
|
102
|
+
resolved path `.dev-team-reports/<workflow>/<slug>/data/coverage-config.json`
|
|
103
|
+
— the SAME path Step 5 below persists it to, and the SAME path `coverage-delta`'s
|
|
104
|
+
Step 2a reads it from. There is no ambiguity: both skills operate on the
|
|
105
|
+
identical file.
|
|
106
|
+
|
|
107
|
+
When discovery returns a real project/package list, call, in this order:
|
|
108
|
+
|
|
109
|
+
1. **Zero-real-test-project check** — if no discovered entry needs
|
|
110
|
+
accounting (`coverage_config.needs_accounting`) at all — every project
|
|
111
|
+
classifies `NOT_TEST` — stop immediately, before touching
|
|
112
|
+
`coverage-config.json` or `baseline-coverage.json`, with the exact
|
|
113
|
+
message: `"Coverage capture stopped: no real test project was discovered
|
|
114
|
+
in this <solution|workspace|multi-module build> — cannot establish a
|
|
115
|
+
coverage floor. If this repo has test projects, verify they reference
|
|
116
|
+
Microsoft.NET.Test.Sdk (for .NET), use jest/vitest/mocha+nyc/c8 (for
|
|
117
|
+
JS/TS), or declare a JUnit/TestNG dependency alongside a
|
|
118
|
+
src/test/java|kotlin directory (for Java) so discovery can recognize
|
|
119
|
+
them; otherwise there is no coverage floor to capture."`
|
|
120
|
+
(`<solution|workspace|multi-module build>` resolved to whichever stack
|
|
121
|
+
applies).
|
|
122
|
+
Write no baseline.
|
|
123
|
+
2. `coverage_config.load_or_bootstrap(config_path, discovered, now_iso)` —
|
|
124
|
+
loads `coverage-config.json` if present (verbatim, unmodified), or
|
|
125
|
+
bootstraps it (every accounted-for project `included`, zero `excluded`)
|
|
126
|
+
if absent. On bootstrap, print the returned `notice` verbatim before
|
|
127
|
+
proceeding — this call never touches any existing `baseline-coverage.json`.
|
|
128
|
+
3. `coverage_config.drift_check(config, discovered)`:
|
|
129
|
+
- If it raises `ValueError` (a malformed-but-parseable `included`/
|
|
130
|
+
`excluded` shape — e.g. present but not a list), print the
|
|
131
|
+
exception's message **verbatim, as its own named block**, and stop
|
|
132
|
+
without writing a baseline.
|
|
133
|
+
- On `hard_failure` (an unaccounted-for or conflicting project), print
|
|
134
|
+
`hard_failure_message` **verbatim, as its own distinct, named block**
|
|
135
|
+
headed `Coverage capture stopped:` — **never** folded into or reusing
|
|
136
|
+
Step 3's "Run coverage" failure wording (`Surface the first error.` /
|
|
137
|
+
`Do NOT write a baseline. The floor must be a true measurement.`).
|
|
138
|
+
This failure class has a concrete fix (edit `coverage-config.json` to
|
|
139
|
+
add the named project to `included` or `excluded`) that Step 3's
|
|
140
|
+
generic wording doesn't carry. Stop; write no baseline.
|
|
141
|
+
4. On success (`hard_failure` is `False`), run the stack's coverage command
|
|
142
|
+
**per included project** (never once per repo), parse each project's
|
|
143
|
+
report with `coverage_report_parse.parse(report_path)` (auto-detects the
|
|
144
|
+
format — lcov, cobertura, clover, jacoco-csv, istanbul-summary,
|
|
145
|
+
istanbul-final, coverage-py, or coverlet — and returns one
|
|
146
|
+
`CoverageRecord` per source file), sum each project's records with
|
|
147
|
+
`coverage_report_parse.aggregate(records)` into that project's single
|
|
148
|
+
`CoverageRecord`, and call
|
|
149
|
+
`coverage_config.weighted_merge(project_reports)` — passing the list of
|
|
150
|
+
per-project `CoverageRecord`s directly, no dict translation needed — to
|
|
151
|
+
produce the merged `line_pct`/`branch_pct` that Step 4/5 record as the
|
|
152
|
+
baseline. This same shared parser is what `coverage_gap_ranking.py` uses
|
|
153
|
+
for its per-module ranking, so there is one implementation of "what a
|
|
154
|
+
coverage report means," not a second copy re-derived per run.
|
|
155
|
+
|
|
156
|
+
**Check the result before using it.** `weighted_merge` returns either the
|
|
157
|
+
merged `{"line_pct": ..., "branch_pct": ...}` dict, or the shared
|
|
158
|
+
`discovery_error(...)` shape (`{"signal": "error", "message": ...}`) when
|
|
159
|
+
any per-project report is missing a required raw count field —
|
|
160
|
+
`weighted_merge` already validates report completeness internally, so
|
|
161
|
+
there is no separate pre-validation step for the caller. Discriminate
|
|
162
|
+
with `if "signal" in merged:` — on a hit, print `merged["message"]`
|
|
163
|
+
verbatim and stop without writing a baseline; only proceed to Step 4/5
|
|
164
|
+
when the `"signal"` key is absent.
|
|
165
|
+
|
|
166
|
+
### 1b. Single-project and mixed-stack repos are unaffected
|
|
167
|
+
|
|
168
|
+
A `.csproj` repo with no `.sln`, or a `package.json` with no workspace
|
|
169
|
+
signal (no `workspaces` field, no `pnpm-workspace.yaml`, no `lerna.json`),
|
|
170
|
+
takes the pre-existing single-command path from the table above completely
|
|
171
|
+
unchanged — no discovery call, and no `coverage-config.json` write, ever.
|
|
172
|
+
|
|
173
|
+
A repo containing **both** a `.sln` and a workspace-configured
|
|
174
|
+
`package.json` is explicitly **out of scope** for multi-project discovery:
|
|
175
|
+
the manifest table above already resolves to a single tool via first-match
|
|
176
|
+
order, unchanged by this feature — no new cross-stack merge behavior is
|
|
177
|
+
introduced, and neither discovery script runs for the other stack's files.
|
|
178
|
+
|
|
179
|
+
### 2. Existing-baseline guard
|
|
180
|
+
|
|
181
|
+
Check whether `.dev-team-reports/<workflow>/<slug>/data/baseline-coverage.json` already exists for the resolved slug. This existing-baseline guard is this worker's application of the shared existing-tracked-artifact re-capture guard — the canonical definition and rationale live once in `knowledge/decision-defaults.md`'s "Re-capture: keep vs. overwrite an existing tracked artifact" axis; this step cites that axis for the *why* and spells out the operational branches below so an executing agent doesn't need to open a second file mid-task to know what to do.
|
|
182
|
+
|
|
183
|
+
Applied here:
|
|
184
|
+
|
|
185
|
+
- **No existing file, or overwrite chosen** — proceed to Step 3 (Run coverage) and the rest of the normal flow.
|
|
186
|
+
- **Existing file, interactive session** — prompt keep/overwrite (default keep). An answer that is neither "keep" nor "overwrite" (case-insensitive) re-prompts with the identical choice — never falls back silently to either option, no retry limit, no timeout.
|
|
187
|
+
- **Existing file, non-interactive** (no usable TTY, or `DEV_TEAM_AUTO_APPROVE=1`) — keep the existing baseline automatically; both log the auto-decision and echo it to run output, not only record it to a file.
|
|
188
|
+
- **Existing file is malformed or corrupt** (fails to parse as JSON — e.g. left over from a prior interrupted write) — treat it as absent, never as a baseline to keep. Emit a warning naming why a fresh capture is happening, then proceed to Step 3.
|
|
189
|
+
- **On keep** — skip straight to Step 7 (Report). Reuse the existing file's `tool`, `line_pct`, and `branch_pct`, and report its `captured_at` instead of a freshly captured timestamp. Do not dispatch a coverage run.
|
|
190
|
+
|
|
191
|
+
### 3. Run coverage
|
|
192
|
+
|
|
193
|
+
Run the chosen command from `<repo-path>`. Capture stdout, stderr, and the exit code.
|
|
194
|
+
|
|
195
|
+
If the run fails:
|
|
196
|
+
|
|
197
|
+
- Surface the first error.
|
|
198
|
+
- Do NOT write a baseline. The floor must be a true measurement.
|
|
199
|
+
- Stop.
|
|
200
|
+
|
|
201
|
+
### 4. Parse line + branch percentages
|
|
202
|
+
|
|
203
|
+
**Only resolve the tool → report-file-path mapping by hand.** That part
|
|
204
|
+
genuinely needs human/agent judgment about where each tool writes its
|
|
205
|
+
output; the parsing itself does not — use the same shared parser Step 1a's
|
|
206
|
+
multi-project merge already calls, never a hand-rolled per-tool reader.
|
|
207
|
+
|
|
208
|
+
Resolve the report path for the detected tool:
|
|
209
|
+
|
|
210
|
+
- Istanbul / Jest / Vitest → `coverage/coverage-summary.json` (preferred).
|
|
211
|
+
**If absent** (the `json-summary` reporter wasn't enabled — see #1086), do
|
|
212
|
+
not abort. Fall back, in order, to whichever of these exists first:
|
|
213
|
+
`coverage/coverage-final.json`, `coverage/lcov.info`,
|
|
214
|
+
`coverage/clover.xml`. Note which report was used (`raw_report`) in the
|
|
215
|
+
persisted baseline, and recommend the operator run `/setup` (which now
|
|
216
|
+
checks coverage readiness) or add the `json-summary` reporter so future
|
|
217
|
+
runs use the canonical summary.
|
|
218
|
+
- pytest-cov → `coverage.json`.
|
|
219
|
+
- JaCoCo → `target/site/jacoco/jacoco.csv`.
|
|
220
|
+
- Coverlet → `coverage.json` (the assembly → file → class → method JSON reporter).
|
|
221
|
+
|
|
222
|
+
Then parse it with the shared parser — same call, same vocabulary, as
|
|
223
|
+
Step 1a:
|
|
224
|
+
|
|
225
|
+
```python
|
|
226
|
+
records = coverage_report_parse.parse(report_path) # auto-detects lcov,
|
|
227
|
+
# cobertura, clover,
|
|
228
|
+
# jacoco-csv,
|
|
229
|
+
# istanbul-summary,
|
|
230
|
+
# istanbul-final,
|
|
231
|
+
# coverage-py, or
|
|
232
|
+
# coverlet
|
|
233
|
+
total = coverage_report_parse.aggregate(records) # one CoverageRecord
|
|
234
|
+
line_pct = 100 * total.covered_statements / total.total_statements
|
|
235
|
+
branch_pct = (
|
|
236
|
+
100 * total.covered_branches / total.total_branches
|
|
237
|
+
if total.total_branches
|
|
238
|
+
else None
|
|
239
|
+
)
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
`coverage_report_parse.parse`/`aggregate` raise `ReportError` on an
|
|
243
|
+
unrecognized or unreadable report, and on a recognized format that parses to
|
|
244
|
+
zero records (a misdetected/malformed report, not a genuine 0% measurement)
|
|
245
|
+
— treat either exactly like an existing Step 3 coverage-run failure: surface
|
|
246
|
+
the error, write no baseline, stop.
|
|
247
|
+
|
|
248
|
+
**cargo-llvm-cov and Go are not covered by the shared parser** — both use
|
|
249
|
+
tool-specific output shapes (`cargo llvm-cov --json`'s own schema; `go tool
|
|
250
|
+
cover -func`'s plain-text summary) that `coverage_report_parse` does not
|
|
251
|
+
recognize, so these two keep their own hand-parsed rules rather than a
|
|
252
|
+
parser call that doesn't exist yet:
|
|
253
|
+
|
|
254
|
+
- cargo-llvm-cov → `--json` → `data[0].totals.lines.percent`, `…branches.percent`.
|
|
255
|
+
- Go → `go tool cover -func` → `total:` line; branch coverage isn't native, report `null` and flag.
|
|
256
|
+
|
|
257
|
+
### 5. Persist the baseline
|
|
258
|
+
|
|
259
|
+
Write `.dev-team-reports/<workflow>/<slug>/data/baseline-coverage.json` directly to tracked storage, via temp-file-then-rename (write to `<path>.tmp` then `mv -f <path>.tmp <path>`) — never a direct, non-atomic write. "Tracked" depends on the resolved `<workflow>` having a matching `.gitignore` re-include: today only `!/.dev-team-reports/test-improve/` exists, so this write is genuinely git-tracked for the `test-improve` caller; a future caller passing a different `--workflow` value would need its own `.gitignore` exception added first, or this write silently lands in ignored space despite the tracked-storage framing above.
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
BASELINE=".dev-team-reports/<workflow>/<slug>/data/baseline-coverage.json"
|
|
263
|
+
mkdir -p "$(dirname "$BASELINE")"
|
|
264
|
+
cat > "${BASELINE}.tmp" <<'JSON'
|
|
265
|
+
{
|
|
266
|
+
"phase": 2,
|
|
267
|
+
"captured_at": "<ISO-8601>",
|
|
268
|
+
"tool": "jest",
|
|
269
|
+
"line_pct": 41.2,
|
|
270
|
+
"branch_pct": 28.7,
|
|
271
|
+
"raw_report": "coverage/coverage-summary.json",
|
|
272
|
+
"disabled_test_count": 47
|
|
273
|
+
}
|
|
274
|
+
JSON
|
|
275
|
+
mv -f "${BASELINE}.tmp" "$BASELINE"
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
**Multi-project repos only** (Step 1a ran): additionally persist
|
|
279
|
+
`.dev-team-reports/<workflow>/<slug>/data/coverage-config.json` — the
|
|
280
|
+
`config` dict Step 1a's `load_or_bootstrap`/`drift_check` resolved (the
|
|
281
|
+
just-bootstrapped config on a first run, or the existing config read
|
|
282
|
+
verbatim on every later run) — via `coverage_config.atomic_write_json`, the
|
|
283
|
+
same temp-file-then-rename idiom as `baseline-coverage.json` above. This
|
|
284
|
+
step is skipped entirely for single-project repos (Step 1b) — no
|
|
285
|
+
`coverage-config.json` is written for them.
|
|
286
|
+
|
|
287
|
+
`disabled_test_count` is included **only** when `.claude/memory/<workflow>/<slug>/disabled-tests.json` exists (present when a caller ran `/test-audit-disable` first); omit the field otherwise. `phase` carries the calling workflow's phase number when it has one, and may be omitted for workflows without numbered phases.
|
|
288
|
+
|
|
289
|
+
Append a baseline summary to the workflow's baseline memory file (for `/test-improve`, `.claude/memory/<workflow>/<slug>/phase-2.md`; other workflows write to their own baseline phase file). Just the coverage block — auditing is a separate worker. This is process bookkeeping, distinct from the baseline data file above, and is unaffected by the atomic-write change.
|
|
290
|
+
|
|
291
|
+
### 6. Post to the parent
|
|
292
|
+
|
|
293
|
+
**Tracker mode** — append a markdown block to the parent issue's description (the resolved CLI was recorded in Phase 1):
|
|
294
|
+
|
|
295
|
+
```markdown
|
|
296
|
+
## Phase-2 baseline (captured <ISO-8601>)
|
|
297
|
+
- Coverage tool: <tool>
|
|
298
|
+
- Line: <pct>%
|
|
299
|
+
- Branch: <pct>% (or "not native — see notes")
|
|
300
|
+
- Cannot-fail tests disabled in Phase 3: <count> (omit this line when no `disabled-tests.json` exists for the workflow)
|
|
301
|
+
- Quality targets: line ≥ 90% · branch ≥ 90% · mutants = 0 · determinism = 100% · wall-clock = fastest achievable
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
Use the same CLI pattern Phase 1 resolved. Examples:
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
# GitHub
|
|
308
|
+
gh issue edit <parent-id> --body-file <(gh issue view <parent-id> --json body -q .body; echo; cat phase-2-block.md)
|
|
309
|
+
|
|
310
|
+
# Azure DevOps
|
|
311
|
+
az boards work-item update --id <parent-id> --description "$(az boards work-item show --id <parent-id> --query 'fields."System.Description"' -o tsv)<append>"
|
|
312
|
+
|
|
313
|
+
# GitLab
|
|
314
|
+
glab issue note add <parent-iid> --message "$(cat phase-2-block.md)"
|
|
315
|
+
|
|
316
|
+
# Jira
|
|
317
|
+
acli jira workitem comment add --key <parent-key> --body "$(cat phase-2-block.md)"
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**Local-files mode** — append the block to `.claude/plans/<workflow>/FEATURE.md` under a `## Metrics history` heading (create the heading if missing).
|
|
321
|
+
|
|
322
|
+
### 7. Report
|
|
323
|
+
|
|
324
|
+
Print:
|
|
325
|
+
|
|
326
|
+
- Line %, branch %.
|
|
327
|
+
- The path to `baseline-coverage.json`.
|
|
328
|
+
- The destination (parent issue URL or `FEATURE.md`).
|
|
329
|
+
- A reminder that the orchestrator's human gate runs next.
|
|
330
|
+
|
|
331
|
+
## Notes
|
|
332
|
+
|
|
333
|
+
- Coverage tools may legitimately differ by repo; never replace the repo's own script with a generic one unless detection fails. Operator override always wins for the coverage command/flags — but never for the `.sln`/`.csproj` row's discovered project set, which is always re-derived per run regardless of any operator-supplied command.
|
|
334
|
+
- The "fastest pre-merge wall-clock" target is not captured here — that's recorded by `/quality-targets-converge` once the full suite is in place. Baseline is line + branch only.
|
|
335
|
+
- For Go (and any tool without native branch coverage), `branch_pct` is `null` and `phase-2.md` flags the gap so the operator can decide whether to install an alternate coverage tool or waive the target.
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Multi-project coverage discovery — implementation detail
|
|
2
|
+
|
|
3
|
+
`coverage-baseline`'s Step 1a (.NET `.sln` / JS-TS workspace / Java
|
|
4
|
+
multi-module rows) and Step 5 (persist), and `coverage-delta`'s Step 2, are
|
|
5
|
+
the **contract surface**: when a `.sln` is present (.NET), a workspace signal
|
|
6
|
+
is present (JS/TS), or a multi-module signal is present (Java),
|
|
7
|
+
discovery runs fresh every call, bootstraps or drift-checks
|
|
8
|
+
`coverage-config.json` against it, and — on success — weighted-merges the
|
|
9
|
+
included projects'/packages' coverage into one number. The contract surface
|
|
10
|
+
owns the script names, the hard-failure rule, the schema keys, and the exact
|
|
11
|
+
message templates because that is what reviewers and tests depend on; this
|
|
12
|
+
file holds the mechanics — mirroring the
|
|
13
|
+
`../../coverage-delta/references/mutation-gate.md` precedent (issue #1759).
|
|
14
|
+
|
|
15
|
+
Every function named below lives in `${CLAUDE_PLUGIN_ROOT}/scripts/`:
|
|
16
|
+
`coverage_config.py` (shared: bootstrap, drift-check, weighted merge,
|
|
17
|
+
measurement-basis notice, and the `read_and_screen_xml` entity-expansion
|
|
18
|
+
screen every XML-parsing stack routes through), `coverage_discovery_dotnet.py`
|
|
19
|
+
(.NET), `coverage_discovery_js.py` (JS/TS), `coverage_discovery_java.py`
|
|
20
|
+
(Java: Maven + Gradle).
|
|
21
|
+
|
|
22
|
+
## 1. Discovery step (stack-specific; everything after this is shared)
|
|
23
|
+
|
|
24
|
+
| Stack | Trigger | Call |
|
|
25
|
+
| --- | --- | --- |
|
|
26
|
+
| .NET | a `.sln` file exists at the repo root | `${CLAUDE_PLUGIN_ROOT}/scripts/coverage_discovery_dotnet.py`'s `discover_dotnet_projects(repo_root)` |
|
|
27
|
+
| JS/TS | root `package.json#workspaces`, or `pnpm-workspace.yaml`, or `lerna.json` is present | `${CLAUDE_PLUGIN_ROOT}/scripts/coverage_discovery_js.py`'s `discover_js_packages(repo_root)` |
|
|
28
|
+
| Java | root `pom.xml` declares `<modules>` (Maven), or `settings.gradle`/`settings.gradle.kts` declares `include(...)` (Gradle). Maven wins when both are present — no cross-merge | `${CLAUDE_PLUGIN_ROOT}/scripts/coverage_discovery_java.py`'s `discover_java_modules(repo_root)` |
|
|
29
|
+
|
|
30
|
+
Both return one of three shapes:
|
|
31
|
+
|
|
32
|
+
- A list of `{"path": <opaque identity string>, "classification":
|
|
33
|
+
TestClassification}` entries on success. `path` is the exact,
|
|
34
|
+
unmodified string the discovery function produced — never
|
|
35
|
+
normalized, case-folded, or separator-translated when later matched
|
|
36
|
+
against `included`/`excluded` (`coverage_config`'s identity contract).
|
|
37
|
+
- `coverage_config.DISCOVERY_NOT_APPLICABLE` — no `.sln` / no workspace
|
|
38
|
+
signal / no multi-module signal. The repo is single-project for this stack; neither discovery nor
|
|
39
|
+
any of the steps below run. See `SKILL.md` Step 1b.
|
|
40
|
+
- `coverage_config.discovery_error(message)` — a tooling/parsing failure
|
|
41
|
+
(`dotnet` missing, a malformed `.csproj`, an unsupported
|
|
42
|
+
`pnpm-workspace.yaml` shape, etc.). Treat this exactly like an existing
|
|
43
|
+
Step 3 ("Run coverage") failure: surface `message`, write no baseline,
|
|
44
|
+
stop. This is a genuine tool failure, not the actionable config gap the
|
|
45
|
+
hard-failure block below describes — it deliberately reuses Step 3's
|
|
46
|
+
existing failure *behavior*, not a third failure shape.
|
|
47
|
+
|
|
48
|
+
## 2. Zero-real-test-project check
|
|
49
|
+
|
|
50
|
+
Before touching `coverage-config.json` at all, check whether **any**
|
|
51
|
+
discovered entry needs accounting:
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
any(coverage_config.needs_accounting(entry["classification"]) for entry in discovered)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
If this is `False` — every discovered project/package classified
|
|
58
|
+
`NOT_TEST` — stop immediately with the exact message (never write
|
|
59
|
+
`coverage-config.json` or `baseline-coverage.json` on this path):
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
Coverage capture stopped: no real test project was discovered in this <solution|workspace|multi-module build> — cannot establish a coverage floor. If this repo has test projects, verify they reference Microsoft.NET.Test.Sdk (for .NET), use jest/vitest/mocha+nyc/c8 (for JS/TS), or declare a JUnit/TestNG dependency alongside a src/test/java|kotlin directory (for Java) so discovery can recognize them; otherwise there is no coverage floor to capture.
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`<solution|workspace>` resolves to `solution` for .NET, `workspace` for
|
|
66
|
+
JS/TS. This is a diagnosable message, not a silent empty baseline: it names
|
|
67
|
+
the exact markers discovery recognizes for both stacks, so a repo whose
|
|
68
|
+
tests use an unrecognized runner gets an actionable next step instead of a
|
|
69
|
+
gap that looks like "no tests exist."
|
|
70
|
+
|
|
71
|
+
## 3. Bootstrap / drift-check step
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
config, notice = coverage_config.load_or_bootstrap(config_path, discovered, now_iso)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
- **Config absent (or malformed)** — bootstrapped fresh from `discovered`
|
|
78
|
+
(every accounted-for entry `included`, zero `excluded`, tagged
|
|
79
|
+
`bootstrapped_at`). Print `notice` verbatim. This call never touches any
|
|
80
|
+
existing `baseline-coverage.json` — the previously-captured value, if
|
|
81
|
+
any, is left exactly as it was.
|
|
82
|
+
- **Config present** — read back verbatim, unmodified. `notice` is `None`.
|
|
83
|
+
|
|
84
|
+
Then, always:
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
drift = coverage_config.drift_check(config, discovered)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
- `drift["hard_failure"]` `True` (an unaccounted-for or conflicting
|
|
91
|
+
project) — print `drift["hard_failure_message"]` **verbatim, as its own
|
|
92
|
+
distinct, named block** headed `Coverage capture stopped:`. **Never**
|
|
93
|
+
fold this into or reuse Step 3's "Run coverage" failure wording
|
|
94
|
+
(`Surface the first error.` / `Do NOT write a baseline. The floor must
|
|
95
|
+
be a true measurement.`) — this failure class has a concrete,
|
|
96
|
+
actionable fix (edit `coverage-config.json`) that Step 3's generic
|
|
97
|
+
wording doesn't carry, and the two message bodies are textually
|
|
98
|
+
distinct by construction (`drift_check`'s messages always open with
|
|
99
|
+
`Coverage capture stopped: <N> discovered project(s)...` or `...are
|
|
100
|
+
listed in both...`, never Step 3's phrasing). Stop; write no baseline.
|
|
101
|
+
- `drift["hard_failure"]` `False` — proceed to the merge step below.
|
|
102
|
+
`drift["stale_warning_message"]`, when non-`None`, is a non-blocking
|
|
103
|
+
signal (excluded entries that no longer match discovery) —
|
|
104
|
+
`coverage-baseline` does not print it (that is `coverage-delta`'s job,
|
|
105
|
+
which re-derives discovery on every later call and surfaces staleness
|
|
106
|
+
there); `coverage-baseline` only needs the `hard_failure` branch above.
|
|
107
|
+
|
|
108
|
+
## 4. Weighted-merge step
|
|
109
|
+
|
|
110
|
+
For each path in `config["included"]`, run the stack's coverage command
|
|
111
|
+
**per included project/package** (never once for the whole repo), then parse
|
|
112
|
+
its report with `${CLAUDE_PLUGIN_ROOT}/scripts/coverage_report_parse.py`'s
|
|
113
|
+
`parse(report_path)` — it auto-detects the format (lcov, cobertura,
|
|
114
|
+
jacoco-csv, istanbul-summary, istanbul-final, coverage-py, or **coverlet**)
|
|
115
|
+
and returns one `CoverageRecord` per source file, already in `weighted_merge`'s
|
|
116
|
+
`{covered_statements, total_statements, covered_branches, total_branches}`
|
|
117
|
+
vocabulary. Sum a project's records into its single per-project entry with
|
|
118
|
+
`aggregate(records)`. This is the same shared parser
|
|
119
|
+
`coverage_gap_ranking.py` uses for its per-module ranking (issue #1873) —
|
|
120
|
+
including Coverlet's nested assembly -> file -> class -> method JSON layout,
|
|
121
|
+
so multi-project .NET merge needs no operator-supplied wrapper.
|
|
122
|
+
|
|
123
|
+
Feed the collected per-project `CoverageRecord`s to `weighted_merge`
|
|
124
|
+
directly — no dict translation needed, since both already use the same
|
|
125
|
+
field names — then check its
|
|
126
|
+
result before using it — `weighted_merge` already validates report
|
|
127
|
+
completeness internally (a report missing a required raw count field returns
|
|
128
|
+
the shared `discovery_error(...)` shape rather than raising), so there is no
|
|
129
|
+
separate pre-validation step for the caller to duplicate:
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
merged = coverage_config.weighted_merge(project_reports)
|
|
133
|
+
if "signal" in merged:
|
|
134
|
+
# A per-project report was missing a required raw count field. merged is
|
|
135
|
+
# the shared discovery_error(...) shape: {"signal": "error", "message":
|
|
136
|
+
# ...}. Print merged["message"] verbatim and stop without writing a
|
|
137
|
+
# baseline — never proceed with a null/0 baseline.
|
|
138
|
+
...
|
|
139
|
+
# Otherwise merged is {"line_pct": <float|None>, "branch_pct": <float|None>}.
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`weighted_merge` sums covered/total across every included project **before**
|
|
143
|
+
dividing — never a per-project average — so a large, well-covered project
|
|
144
|
+
and a small, poorly-covered one merge to the size-weighted percentage, not
|
|
145
|
+
the midpoint of the two percentages. `merged` is Step 4/5's baseline
|
|
146
|
+
`line_pct`/`branch_pct`.
|
|
147
|
+
|
|
148
|
+
## 5. Persist step
|
|
149
|
+
|
|
150
|
+
`baseline-coverage.json` is written exactly as Step 5 already documents
|
|
151
|
+
(temp-file-then-rename), using `merged`'s `line_pct`/`branch_pct`.
|
|
152
|
+
|
|
153
|
+
Additionally, for a multi-project repo, persist
|
|
154
|
+
`.dev-team-reports/<workflow>/<slug>/data/coverage-config.json` — `config`
|
|
155
|
+
from step 3 above — via `coverage_config.atomic_write_json(config_path,
|
|
156
|
+
config)`, the identical temp-file-then-rename idiom. Single-project repos
|
|
157
|
+
(Step 1b) skip this write entirely — no `coverage_config.py` function is
|
|
158
|
+
ever called for them, and no `coverage-config.json` file appears in their
|
|
159
|
+
`data/` directory.
|
|
160
|
+
|
|
161
|
+
## Single-project and mixed-stack repos are unaffected
|
|
162
|
+
|
|
163
|
+
A `.csproj` repo with no `.sln`, or a `package.json` with no workspace
|
|
164
|
+
signal, never reaches any function in this file — Step 1's existing
|
|
165
|
+
single-command path runs exactly as it did before this feature existed.
|
|
166
|
+
|
|
167
|
+
A repo with **both** a `.sln` and a workspace-configured `package.json` is
|
|
168
|
+
out of scope: `coverage-baseline`'s existing manifest table resolves to a
|
|
169
|
+
single tool via first-match order, unchanged by this feature. No function
|
|
170
|
+
in this file is ever called for the losing stack, and no cross-stack merge
|
|
171
|
+
is introduced.
|
|
172
|
+
|
|
173
|
+
## Adding a fourth stack
|
|
174
|
+
|
|
175
|
+
Each stack gets its own `coverage_discovery_<stack>.py` implementing
|
|
176
|
+
`discover_<stack>_<units>(repo_root)` against the three return shapes in §1.
|
|
177
|
+
Deliberately **not** a strategy/registry abstraction: the stacks share only
|
|
178
|
+
leaf helpers (the result signals, `TestClassification`, the XML screen, the
|
|
179
|
+
containment predicate `is_within`, and the XML-namespace stripper
|
|
180
|
+
`local_name`), while enumeration, trigger precedence, the classification
|
|
181
|
+
predicate, and the identity string all differ per stack by design. A new
|
|
182
|
+
stack reuses the shared leaf helpers in `coverage_config.py` rather than
|
|
183
|
+
re-implementing them — the Java stack shipped its first revision without the
|
|
184
|
+
entity-expansion screen the .NET stack already had, and more than one stack
|
|
185
|
+
independently open-coded its own containment check and namespace stripper,
|
|
186
|
+
which is the drift a shared helper exists to prevent (issues #1839/#1848/#1851).
|
|
187
|
+
|
|
188
|
+
Two rules every stack follows, learned from #1759 and #1765:
|
|
189
|
+
|
|
190
|
+
- **A declared-but-unusable build graph is a `discovery_error`, never a
|
|
191
|
+
classification.** A missing module directory, a declared-but-empty module
|
|
192
|
+
list, or a settings file with no recognizable declaration must fail loudly:
|
|
193
|
+
classifying it `NOT_TEST` makes `needs_accounting` false and drops it from
|
|
194
|
+
operator accounting silently. (Stack-specific judgement still applies to what
|
|
195
|
+
counts as unusable — a Maven `<module>` with no POM is broken because `mvn`
|
|
196
|
+
itself fails on it, while a Gradle subproject directory with no build file is
|
|
197
|
+
a legitimate container project.)
|
|
198
|
+
- **An inherited or conditional marker is `AMBIGUOUS`, never `TEST` and never
|
|
199
|
+
`NOT_TEST`.** Discovery never evaluates inheritance (an MSBuild `Condition`,
|
|
200
|
+
a parent POM's `<dependencyManagement>`, a Gradle `subprojects {}` block, a
|
|
201
|
+
BOM version pin); it reports the ambiguity and lets `drift_check` force an
|
|
202
|
+
operator decision.
|