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,274 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stryker-xunit-v2-shim
|
|
3
|
+
description: Build a xunit.v2 Stryker shim so Stryker.NET produces a valid mutation score for a xunit.v3 test project. Stryker.NET cannot observe mutant kills through xunit.v3 (it runs on the Microsoft Testing Platform), so a normal run reports a false near-zero score with almost every mutant reported Survived. Use this BEFORE running Stryker whenever the target .NET test project references xunit.v3 — including when mutation is enabled via /test-improve or /mutation-testing, or you are about to run dotnet-stryker — and as a rescue when a run already reported ~0% or everything Survived or the user says the score looks suspiciously low. When Stryker and xunit.v3 both appear, build the shim first.
|
|
4
|
+
role: worker
|
|
5
|
+
user-invocable: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Stryker xunit.v2 Shim
|
|
9
|
+
|
|
10
|
+
Role: worker. Builds measurement scaffolding and does not modify the tests it
|
|
11
|
+
measures.
|
|
12
|
+
|
|
13
|
+
## Why this exists
|
|
14
|
+
|
|
15
|
+
Stryker.NET (through at least 4.15/4.16) **cannot observe mutant kills through
|
|
16
|
+
xunit.v3**. xunit.v3 runs on the Microsoft Testing Platform (MTP), and Stryker's
|
|
17
|
+
per-test coverage/kill mapping doesn't work across it (stryker-net issues 3237,
|
|
18
|
+
3629, 3094). The run completes and the initial test pass even succeeds, so the
|
|
19
|
+
failure is **silent** — the only symptom is the score: near-zero, with almost
|
|
20
|
+
every mutant reported *Survived* (e.g. `0.13% — 3 killed / 7,685 survived`). That
|
|
21
|
+
is the **observation-failure signature**, not a real result.
|
|
22
|
+
|
|
23
|
+
The fix is a **shim**: a second test project that recompiles the *same test source
|
|
24
|
+
files* under xunit.v2 (classic VSTest), which Stryker observes correctly. No test
|
|
25
|
+
is rewritten — the shim **links** the existing `.cs` files, so there is one source
|
|
26
|
+
of truth. Stryker is then run **from the shim directory** in project mode.
|
|
27
|
+
|
|
28
|
+
[`references/shim-howto.md`](references/shim-howto.md) has the full reference build
|
|
29
|
+
and any edge case not covered here.
|
|
30
|
+
|
|
31
|
+
## Version scope — this whole skill is a < 5.0.0 workaround
|
|
32
|
+
|
|
33
|
+
Everything below applies to **Stryker.NET < 5.0.0**. Starting at **5.0.0**
|
|
34
|
+
([stryker-net#3752](https://github.com/stryker-mutator/stryker-net/issues/3752)),
|
|
35
|
+
`-t mtp` + `coverage-analysis: perTest` observes mutant kills through xunit.v3
|
|
36
|
+
directly — no shim, no v3-only-construct porting, no operator gate. See
|
|
37
|
+
[`csharp-stryker-net.md`](../mutation-testing/references/languages/csharp-stryker-net.md)
|
|
38
|
+
for the >= 5.0.0 command and its `concurrency: 1` caveat
|
|
39
|
+
([stryker-net#3832](https://github.com/stryker-mutator/stryker-net/issues/3832),
|
|
40
|
+
tracked for removal in [#2192](https://github.com/bdfinst/agentic-dev-team/issues/2192)).
|
|
41
|
+
`stryker_xunit_shim_guard.py` detects the installed version
|
|
42
|
+
(`hooks/mutation_adapters/stryker_net.py::stryker_net_version()`) and
|
|
43
|
+
silent-passes on >= 5.0.0 — this skill's Step 1a operator gate is never
|
|
44
|
+
reached on a known >= 5.0.0 install. An undetermined version fails closed to
|
|
45
|
+
the < 5.0.0 behavior this skill documents.
|
|
46
|
+
|
|
47
|
+
## Scope — one path, not the only one
|
|
48
|
+
|
|
49
|
+
The shim is the path that keeps the **mutant-kill loop** viable on xunit.v3 **below 5.0.0**, because it restores per-test coverage (fast covering-subset per mutant). It is not mandatory for every xunit.v3 run. Within `mutation-kill` the shim-first feasibility gate ([#1158](https://github.com/bdfinst/agentic-dev-team/issues/1158)) decides per run: build the shim and probe under `perTest`; if per-test capture works and a round fits the budget, enter the loop; otherwise **degrade** to the no-shim floor — the real v3 suite via `-t mtp` + `coverage-analysis: off` (a real but slow, whole-suite-per-mutant single advisory pass; see [`csharp-stryker-net.md`](../mutation-testing/references/languages/csharp-stryker-net.md)). Before building, [`xunit_v3_feature_detector.py`](../mutation-testing/scripts/xunit_v3_feature_detector.py) classifies the shim-breaking v3-only constructs for the always-ask operator gate in Step 1a — enforced by the guard hook, which stays blocked until the operator's choice is recorded ([#1791](https://github.com/bdfinst/agentic-dev-team/issues/1791)). On `exclude`, the guard passes their selections to `generate_shim.py --compile-exclude` itself.
|
|
50
|
+
|
|
51
|
+
## When to build it
|
|
52
|
+
|
|
53
|
+
Detection is one check: a test `.csproj` contains `Include="xunit.v3"`. Build the
|
|
54
|
+
shim **proactively, before the first Stryker run** — because the failure is silent
|
|
55
|
+
(the run succeeds and the score is bogus), waiting for the symptom wastes a full,
|
|
56
|
+
possibly hours-long run. As a backstop the `stryker_xunit_shim_guard.py` PreToolUse
|
|
57
|
+
hook auto-scaffolds the shim (and reports what it wrote) when you run
|
|
58
|
+
`dotnet-stryker` against a xunit.v3 project whose sources are clean, then blocks so
|
|
59
|
+
you re-run from the shim dir; when the sources are **not** clean it presents the
|
|
60
|
+
Step 1a operator gate instead of scaffolding. Build proactively rather than relying
|
|
61
|
+
on the interception. (The guard **exempts** an explicit `-t mtp` run — the no-shim floor — so it is not forced into a shim; see the Scope section.) Within `mutation-kill` the feasibility gate may still degrade to that floor after the shim is built and probed.
|
|
62
|
+
|
|
63
|
+
One precondition decides whether the shim is cheap: source compatibility with
|
|
64
|
+
xunit.v2. `[Fact]`, `[Theory]`, `[InlineData]`, `TheoryData<>`, `MemberData`,
|
|
65
|
+
`ClassData`, and `Assert.*` are source-identical between v2 and v3, so a plain
|
|
66
|
+
suite ports in minutes. `AutoFixture.Xunit3` `[AutoData]`/`[InlineAutoData]` are
|
|
67
|
+
**not** v2-compatible. The Step 1 scope probe quantifies how much of that a suite
|
|
68
|
+
has; when there is any, Step 1a's operator gate decides what to do about it —
|
|
69
|
+
"say so and stop" is not yours to choose, it is one of four options the operator
|
|
70
|
+
picks between.
|
|
71
|
+
|
|
72
|
+
## Canonical invocations — copy these, don't improvise
|
|
73
|
+
|
|
74
|
+
Every command below is written to run **from the repository root** unless it says
|
|
75
|
+
otherwise. Guessing at the working directory or at a flag that doesn't exist is
|
|
76
|
+
the single biggest source of retried commands here ([#1777](https://github.com/bdfinst/agentic-dev-team/issues/1777)), so paste these and
|
|
77
|
+
substitute only `<TestProject>`.
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Detect (repo root) — a test .csproj referencing xunit.v3 is the whole check
|
|
81
|
+
git grep -l 'Include="xunit.v3"' -- '*.csproj'
|
|
82
|
+
|
|
83
|
+
# Scope probe (repo root) — every hit is a file the operator gate will ask about
|
|
84
|
+
git grep -n 'AutoFixture.Xunit3\|\[AutoData\|InlineAutoData\|AutoMoqData\|MemberAutoData' -- '*.cs'
|
|
85
|
+
git grep -n 'TestContext\|Assert.Skip\|Assert.Multiple\|Assert.Equivalent\|ValueTask InitializeAsync' -- '*.cs'
|
|
86
|
+
|
|
87
|
+
# Green baseline (repo root) — expect the SAME test count as the real project, 0 failed
|
|
88
|
+
dotnet build tests/<TestProject>.Mutation -c Release
|
|
89
|
+
dotnet test tests/<TestProject>.Mutation -c Release --no-build
|
|
90
|
+
|
|
91
|
+
# Mutation run — the ONLY correct form: from the shim dir, no arguments
|
|
92
|
+
cd tests/<TestProject>.Mutation
|
|
93
|
+
dotnet-stryker
|
|
94
|
+
|
|
95
|
+
# No-shim floor (from the REAL test project dir) — set "coverage-analysis": "off"
|
|
96
|
+
# in stryker-config.json first; it is config-file-only, there is no CLI flag
|
|
97
|
+
cd tests/<TestProject>
|
|
98
|
+
dotnet-stryker -t mtp
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Three invocations that look right, fail, and get retried:
|
|
102
|
+
|
|
103
|
+
| Don't | Do instead | Why |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| `dotnet-stryker` at the repo root | `cd tests/<TestProject>.Mutation && dotnet-stryker` | A root run auto-detects the `.sln`, enters solution mode, and binds to the real xunit.v3 project → false ~0% |
|
|
106
|
+
| `dotnet-stryker --solution ../../App.sln` (or a `SolutionPath` in the shim's config) | omit it entirely — `test-projects` in the shim's `stryker-config.json` is the selection | With both set Stryker enumerates the solution and prefers the v3 project over the shim (the SolutionPath trap, [#557](https://github.com/bdfinst/agentic-dev-team/issues/557)) |
|
|
107
|
+
| `dotnet-stryker --coverage-analysis off` | set `"coverage-analysis"` in `stryker-config.json` | `coverage-analysis` is **config-file-only** in Stryker.NET 4.15 — there is no CLI flag, so the run dies on an unknown option |
|
|
108
|
+
|
|
109
|
+
Shim *selection* is not a command-line argument at all: it is the cwd having no
|
|
110
|
+
`.sln` (project mode) plus the `test-projects` entry the generator wrote. If a
|
|
111
|
+
run reports the observation-failure signature from a shim directory, check those
|
|
112
|
+
two before reaching for a flag.
|
|
113
|
+
|
|
114
|
+
## Workflow
|
|
115
|
+
|
|
116
|
+
### Read before editing
|
|
117
|
+
|
|
118
|
+
Before editing an artifact this workflow has already produced, read it first — each of these only exists once the workflow has reached the step that creates it, so don't expect all three on the proactive, before-the-first-run path:
|
|
119
|
+
|
|
120
|
+
- the mutant-survivors report (`StrykerOutput/<timestamp>/reports/mutation-report.json`) — once a Stryker run has completed
|
|
121
|
+
- the shim config (`stryker-config.json`) — once Step 2 has created it
|
|
122
|
+
- the step files (the shim's linked test source files) — once they exist on disk
|
|
123
|
+
|
|
124
|
+
**Converged-state check.** Compare each file's current content against the
|
|
125
|
+
target state described in the step you're about to run before editing it.
|
|
126
|
+
If a file already matches its target state, skip re-editing it — do not
|
|
127
|
+
overwrite a file that has already converged.
|
|
128
|
+
|
|
129
|
+
### Step 1 — Scope probe (decide whether the shim is cheap)
|
|
130
|
+
|
|
131
|
+
Run against the branch under test to find v3-only usage that would need porting:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# v3-incompatible attribute usage in test sources
|
|
135
|
+
git grep -l "AutoFixture.Xunit3\|\[AutoData\|InlineAutoData\|AutoMoqData\|MemberAutoData" -- 'tests/**/*.cs'
|
|
136
|
+
# other v3-only APIs
|
|
137
|
+
git grep -l "TestContext\|Assert.Skip\|Assert.Multiple\|IAsyncLifetime\|Assert.Equivalent" -- 'tests/**/*.cs'
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Each hit is a file the operator gate below will ask about. **Zero hits → the shim
|
|
141
|
+
builds unattended, proceed to Step 2.** Any hits → Step 1a; do not decide for the
|
|
142
|
+
operator, and in particular do not quietly conclude the approach "isn't a good
|
|
143
|
+
fit" — that is one of four options, and it is theirs to pick.
|
|
144
|
+
|
|
145
|
+
### Step 1a — Operator gate (always-ask; you cannot skip it)
|
|
146
|
+
|
|
147
|
+
When the probe finds shim-breaking constructs, the operator chooses how to
|
|
148
|
+
proceed. This is enforced, not advisory: `stryker_xunit_shim_guard.py` blocks
|
|
149
|
+
every `dotnet-stryker` invocation against that project until a choice is
|
|
150
|
+
**recorded**, so paraphrasing the gate or picking on the operator's behalf does
|
|
151
|
+
not get the run through ([#1791](https://github.com/bdfinst/agentic-dev-team/issues/1791)).
|
|
152
|
+
|
|
153
|
+
The block body is the question, already assembled: the per-construct breakdown
|
|
154
|
+
from [`xunit_v3_feature_detector.py`](../mutation-testing/scripts/xunit_v3_feature_detector.py) (which construct, translatable or
|
|
155
|
+
not, coverage-bearing or neutral, with file and line), the four options with
|
|
156
|
+
their tradeoffs, and the exact `record` command carrying this blocker set's
|
|
157
|
+
fingerprint. Present the four options to the operator with `AskUserQuestion`,
|
|
158
|
+
then run the printed command verbatim — the fingerprint is per-blocker-set, so
|
|
159
|
+
don't reuse one from an earlier run.
|
|
160
|
+
|
|
161
|
+
| Choice | What happens next |
|
|
162
|
+
|---|---|
|
|
163
|
+
| `port` | Rewrite the flagged constructs to v2-compatible forms (Step 3). The guard auto-scaffolds once the sources are clean. |
|
|
164
|
+
| `exclude` | The guard scaffolds with `--compile-exclude` on the flagged files. They stay **unmeasured** — their mutants report as survivors. |
|
|
165
|
+
| `skip` | Deactivate just the offending tests, then re-run. Clears the gate **only** where the deactivation removes the construct itself (`[Fact(Explicit = true)]` → `[Fact(Skip = "…")]`); a construct in a test body or on a data attribute stays in the source the shim compiles, so those need `port` or `exclude`. Undo at teardown. |
|
|
166
|
+
| `degrade` | Skip the shim; run the no-shim floor (`-t mtp`, `coverage-analysis: off`) for one slow advisory pass. Only relevant below 5.0.0 — this whole gate is bypassed on a known >= 5.0.0 install (see Version scope above). |
|
|
167
|
+
|
|
168
|
+
The fingerprint is **mandatory** — it is what scopes a decision to the blockers
|
|
169
|
+
the operator actually saw. Add a new blocking file after they answered and the
|
|
170
|
+
gate **re-asks**. A reply matching none of the four is re-asked with the same
|
|
171
|
+
four; never default or guess.
|
|
172
|
+
|
|
173
|
+
### Step 2 — Scaffold the shim project
|
|
174
|
+
|
|
175
|
+
Use the bundled script — it reads the real test `.csproj` and writes the shim
|
|
176
|
+
`.csproj` (mirroring every non-xunit `PackageReference` verbatim, swapping in the
|
|
177
|
+
xunit.v2 stack, setting `RootNamespace`/`AssemblyName`, adding the linked-`Compile`
|
|
178
|
+
glob and the product `ProjectReference`) plus a `stryker-config.json`:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/skills/stryker-xunit-v2-shim/scripts/generate_shim.py" tests/<TestProject>/<TestProject>.csproj \
|
|
182
|
+
--mutate-exclude '**/gRPC/**/*.cs' --mutate-exclude '**/Caching/**/*.cs'
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
It creates `tests/<TestProject>.Mutation/` beside the real project. Pass
|
|
186
|
+
`--mutate-exclude` for each product folder that's genuinely out of mutation scope
|
|
187
|
+
(generated code, gRPC stubs, etc.); omit if none.
|
|
188
|
+
|
|
189
|
+
Why these choices matter, so you can fix the file by hand if the script's
|
|
190
|
+
heuristics miss something in an unusual `.csproj`:
|
|
191
|
+
|
|
192
|
+
- **`RootNamespace` must equal the real project's root namespace** — the linked
|
|
193
|
+
sources resolve the same types, so a mismatch breaks compilation.
|
|
194
|
+
- **`AssemblyName` must differ** (`.Mutation`) so both projects coexist.
|
|
195
|
+
- **Non-xunit package versions must match exactly** — a version drift causes
|
|
196
|
+
compile errors in the linked sources.
|
|
197
|
+
- **Keep the shim out of the `.sln`** (see Step 4 — this is what forces project
|
|
198
|
+
mode). Do not `dotnet sln add` it.
|
|
199
|
+
|
|
200
|
+
### Step 3 — Port v3-only constructs (only files Step 1 flagged)
|
|
201
|
+
|
|
202
|
+
Rewrite v3-only APIs to behavior-equivalent v2-compatible forms, **in the real
|
|
203
|
+
test project's sources** (the shim links those same files, so one edit satisfies
|
|
204
|
+
both). Verify each replacement still compiles under v3 too.
|
|
205
|
+
|
|
206
|
+
| v3-only | v2-compatible replacement |
|
|
207
|
+
|---|---|
|
|
208
|
+
| `TestContext.Current.CancellationToken` | `CancellationToken.None` (token was never cancelled for a passing test) |
|
|
209
|
+
| `[AutoData]` / `[InlineAutoData]` | manual `new Fixture()` in the body, or `[Theory]` + `[InlineData]` — heavier; avoid the shim if pervasive |
|
|
210
|
+
| `Assert.Skip(...)` | `[Fact(Skip="…")]` or a guard-and-return |
|
|
211
|
+
|
|
212
|
+
### Step 3a — Grant internals access
|
|
213
|
+
|
|
214
|
+
If the product exposes internals to the real test assembly via
|
|
215
|
+
`InternalsVisibleTo`, add the shim assembly too (its tests exercise `internal`
|
|
216
|
+
types):
|
|
217
|
+
|
|
218
|
+
```csharp
|
|
219
|
+
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("<TestProject>.Mutation")]
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Step 4 — Run Stryker FROM the shim directory (the critical part)
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
cd tests/<TestProject>.Mutation
|
|
226
|
+
dotnet-stryker
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**This directory choice is the whole game.** A bare `dotnet-stryker` at repo root
|
|
230
|
+
auto-detects the single `.sln`, enters **solution mode**, ignores test-project
|
|
231
|
+
selection, and binds to the real xunit.v3 project → false ~0%. Running from a
|
|
232
|
+
directory with **no `.sln`** forces **project mode**: Stryker uses the shim in the
|
|
233
|
+
cwd and finds the product through its `ProjectReference`. The `stryker-config.json`
|
|
234
|
+
the script wrote (with `coverage-analysis: perTest` and `additional-timeout:
|
|
235
|
+
30000`) lives beside the shim; perTest mode is required for kill observation and
|
|
236
|
+
the raised timeout keeps slow mutants from being scored as timeouts.
|
|
237
|
+
|
|
238
|
+
### Step 5 — Validate BEFORE the full run
|
|
239
|
+
|
|
240
|
+
A full run can take hours; a wrong harness wastes all of it. Two gates:
|
|
241
|
+
|
|
242
|
+
1. **Green baseline** — the shim builds and every test passes:
|
|
243
|
+
```bash
|
|
244
|
+
dotnet build tests/<TestProject>.Mutation -c Release
|
|
245
|
+
dotnet test tests/<TestProject>.Mutation -c Release --no-build
|
|
246
|
+
# expect the SAME test count as the real project, 0 failed
|
|
247
|
+
```
|
|
248
|
+
2. **Kills register** — temporarily scope `mutate` to one small, well-covered file
|
|
249
|
+
and run Stryker from the shim dir. Expect a **non-zero** score with real kills.
|
|
250
|
+
If this scoped run is still ~0%, the harness is wrong — **do not launch the full
|
|
251
|
+
run**; recheck the directory (Step 4) and the shim references.
|
|
252
|
+
|
|
253
|
+
### Step 6 — Launch the full run, then sanity-check
|
|
254
|
+
|
|
255
|
+
Widen `mutate` back to the full scope and launch. A full Stryker run is
|
|
256
|
+
long-running — start it in the background and watch it (a Monitor plus a periodic
|
|
257
|
+
status check), rather than blocking on it. If the periodic check is a scheduled
|
|
258
|
+
wake-up, follow the calling contract in
|
|
259
|
+
[`knowledge/long-run-waiting.md`](../../knowledge/long-run-waiting.md) — a
|
|
260
|
+
wake-up armed without its replay instruction schedules nothing.
|
|
261
|
+
|
|
262
|
+
Before recording any score, **reject the observation-failure signature**: a
|
|
263
|
+
near-zero score with almost everything *Survived* means it bound to the v3 project
|
|
264
|
+
again — rerun from the shim dir. A healthy run kills the majority of covered
|
|
265
|
+
mutants. Output lands at
|
|
266
|
+
`StrykerOutput/<timestamp>/reports/mutation-report.{html,json}`.
|
|
267
|
+
|
|
268
|
+
## Teardown
|
|
269
|
+
|
|
270
|
+
The shim, its `stryker-config.json`, the `InternalsVisibleTo` line, and any v3→v2
|
|
271
|
+
source ports are **measurement scaffolding**. If you were measuring a throwaway
|
|
272
|
+
branch/worktree, discard it. If the shim lives in the repo, keep it **out of the
|
|
273
|
+
`.sln` and out of CI test discovery** so it never runs as a normal suite and never
|
|
274
|
+
double-counts.
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# Building a xunit.v2 Stryker shim for a xunit.v3 test project
|
|
2
|
+
|
|
3
|
+
How to make Stryker.NET produce a valid mutation score for a project whose real
|
|
4
|
+
test suite is **xunit.v3**. This is the full reference behind the
|
|
5
|
+
`stryker-xunit-v2-shim` skill; read it when an edge case isn't covered by
|
|
6
|
+
`SKILL.md`.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. Why the shim exists
|
|
11
|
+
|
|
12
|
+
Stryker.NET (through at least 4.15/4.16) **cannot observe mutant kills through
|
|
13
|
+
xunit.v3.** xunit.v3 runs on the Microsoft Testing Platform (MTP), and Stryker's
|
|
14
|
+
per-test coverage/kill mapping does not work across it (stryker-net issues
|
|
15
|
+
3237, 3629, 3094). Symptom: the run completes but nearly every mutant is reported
|
|
16
|
+
*Survived*, e.g. **0.13% (3 killed / 7,685 survived)** — the *observation-failure
|
|
17
|
+
signature*. The initial test run passes and coverage filters even fire, so the
|
|
18
|
+
failure is silent unless you sanity-check the score.
|
|
19
|
+
|
|
20
|
+
The fix is a **shim**: a second test project that recompiles the *same test
|
|
21
|
+
source files* under **xunit.v2** (classic VSTest), which Stryker observes
|
|
22
|
+
correctly. No test is rewritten — the shim links the existing `.cs` files.
|
|
23
|
+
|
|
24
|
+
**Precondition that makes this cheap:** the test sources must be
|
|
25
|
+
source-compatible with xunit.v2. `[Fact]`, `[Theory]`, `[InlineData]`,
|
|
26
|
+
`TheoryData<>`, `MemberData`, `ClassData`, and `Assert.*` are all source-identical
|
|
27
|
+
between v2 and v3. Only genuinely v3-only constructs need porting (see step 4).
|
|
28
|
+
AutoFixture.Xunit3 `[AutoData]`/`[InlineAutoData]` attributes are **not**
|
|
29
|
+
v2-compatible; if the suite uses them heavily, this approach needs more work.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. When to build / use it
|
|
34
|
+
|
|
35
|
+
Trigger conditions (all true):
|
|
36
|
+
|
|
37
|
+
- The target test project references `xunit.v3` (check its `.csproj`).
|
|
38
|
+
- You need a Stryker mutation score for it.
|
|
39
|
+
- The test sources are mostly plain xunit (grep confirms few/no `[AutoData]`,
|
|
40
|
+
`AutoFixture.Xunit3`, `TestContext`, `Assert.Skip`, `Assert.Multiple`,
|
|
41
|
+
`IAsyncLifetime` usages).
|
|
42
|
+
|
|
43
|
+
Quick scope probe (run against the branch under test):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# v3-incompatible attribute usage in test .cs sources
|
|
47
|
+
git grep -l "AutoFixture.Xunit3\|\[AutoData\|InlineAutoData\|AutoMoqData\|MemberAutoData" -- 'tests/**/*.cs'
|
|
48
|
+
# other v3-only APIs
|
|
49
|
+
git grep -l "TestContext\|Assert.Skip\|Assert.Multiple\|IAsyncLifetime\|Assert.Equivalent" -- 'tests/**/*.cs'
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Each hit is a file the operator gate asks about. Zero hits → this is a ~10-minute
|
|
53
|
+
unattended job.
|
|
54
|
+
|
|
55
|
+
### 2a. The operator gate, recorded (#1791)
|
|
56
|
+
|
|
57
|
+
Any hit means the operator picks between `port`, `exclude`, `skip`, and
|
|
58
|
+
`degrade`, and `stryker_xunit_shim_guard.py` blocks every `dotnet-stryker` run
|
|
59
|
+
against that project until the choice is recorded. The guard's block body prints
|
|
60
|
+
the classified breakdown, the four tradeoffs, and the exact command to run —
|
|
61
|
+
including the fingerprint of *this* blocker set. Its shape:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
sh "$CLAUDE_PLUGIN_ROOT/hooks/py.sh" \
|
|
65
|
+
"$CLAUDE_PLUGIN_ROOT/hooks/lib/xunit_v3_operator_gate.py" record \
|
|
66
|
+
--project <TestProject> --choice exclude --fingerprint <from-the-block-body>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Prefer the command the guard printed (absolute paths, correct fingerprint) over
|
|
70
|
+
retyping this. `--fingerprint` is **required** — it is what scopes a decision to
|
|
71
|
+
the blockers the operator actually saw. Omitting it is rejected outright rather
|
|
72
|
+
than writing a blanket record that would silently cover blockers added later;
|
|
73
|
+
reuse a stale one and the gate re-asks. Add `--file <path>` per flagged file and
|
|
74
|
+
`--note "<why>"` to leave the rationale in the record. `check --project
|
|
75
|
+
<TestProject>` prints the stored decision and exits non-zero when there is none.
|
|
76
|
+
|
|
77
|
+
Recorded decisions live in `.claude/metrics/xunit-v3-shim-decisions.json` —
|
|
78
|
+
no path override (#1870 dropped `DEV_TEAM_XUNIT3_SHIM_DECISION_FILE`
|
|
79
|
+
entirely). Both the write and every later honor of a recorded decision emit a
|
|
80
|
+
`boundary-events.jsonl` entry, so a self-recorded choice stays visible in the
|
|
81
|
+
audit stream.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 3. Build the shim project
|
|
86
|
+
|
|
87
|
+
Create `tests/<TestProject>.Mutation/<TestProject>.Mutation.csproj` next to the
|
|
88
|
+
real test project. It has **no `.cs` of its own** — it links the real project's
|
|
89
|
+
sources. (The bundled [`generate_shim.py`](../scripts/generate_shim.py) writes this
|
|
90
|
+
for you; the template below is what it emits and what to hand-fix for an unusual
|
|
91
|
+
`.csproj`.)
|
|
92
|
+
|
|
93
|
+
```xml
|
|
94
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
95
|
+
|
|
96
|
+
<!-- xunit.v2 shim of <TestProject> for Stryker.NET.
|
|
97
|
+
Delete once stryker-net fixes MTP mutation observation
|
|
98
|
+
(issues 3237, 3629, 3094). -->
|
|
99
|
+
|
|
100
|
+
<PropertyGroup>
|
|
101
|
+
<TargetFramework>net10.0</TargetFramework> <!-- match the test project's TFM -->
|
|
102
|
+
<IsPackable>false</IsPackable>
|
|
103
|
+
<RootNamespace><TestProject></RootNamespace> <!-- SAME namespace as the real project -->
|
|
104
|
+
<AssemblyName><TestProject>.Mutation</AssemblyName> <!-- distinct assembly name -->
|
|
105
|
+
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
|
106
|
+
<NoWarn>$(NoWarn);IDE0028;RCS1163;CS8032;NU1701</NoWarn>
|
|
107
|
+
<GenerateProgramFile>true</GenerateProgramFile>
|
|
108
|
+
</PropertyGroup>
|
|
109
|
+
|
|
110
|
+
<ItemGroup>
|
|
111
|
+
<!-- Mirror EVERY non-xunit package from the real test project at the SAME
|
|
112
|
+
versions (AutoFixture, Moq, assertion lib, Grpc.Core.Testing, any
|
|
113
|
+
private/internal deps). Swap the xunit stack for v2: -->
|
|
114
|
+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
|
|
115
|
+
<PackageReference Include="xunit" Version="2.9.2" />
|
|
116
|
+
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
|
|
117
|
+
<PrivateAssets>all</PrivateAssets>
|
|
118
|
+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
119
|
+
</PackageReference>
|
|
120
|
+
<!-- Do NOT reference xunit.v3 or AutoFixture.Xunit3 here. -->
|
|
121
|
+
</ItemGroup>
|
|
122
|
+
|
|
123
|
+
<ItemGroup>
|
|
124
|
+
<ProjectReference Include="..\..\src\<Product>\<Product>.csproj" />
|
|
125
|
+
</ItemGroup>
|
|
126
|
+
|
|
127
|
+
<ItemGroup>
|
|
128
|
+
<!-- Link the real test project's sources; exclude build output. -->
|
|
129
|
+
<Compile Include="..\<TestProject>\**\*.cs"
|
|
130
|
+
Exclude="..\<TestProject>\obj\**\*.cs;..\<TestProject>\bin\**\*.cs">
|
|
131
|
+
<Link>Linked\%(RecursiveDir)%(FileName)%(Extension)</Link>
|
|
132
|
+
</Compile>
|
|
133
|
+
</ItemGroup>
|
|
134
|
+
|
|
135
|
+
</Project>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Key points:
|
|
139
|
+
|
|
140
|
+
- **`RootNamespace` must equal the real project's root namespace** so linked
|
|
141
|
+
sources resolve the same types.
|
|
142
|
+
- **`AssemblyName` must differ** (`.Mutation`) so both projects can coexist.
|
|
143
|
+
- **Mirror non-xunit package versions exactly** — a version drift causes compile
|
|
144
|
+
errors in the linked sources.
|
|
145
|
+
- Do **not** add the shim to the `.sln` (see step 5 for why).
|
|
146
|
+
|
|
147
|
+
### 3a. Grant internals access
|
|
148
|
+
|
|
149
|
+
If the product uses `InternalsVisibleTo` for the real test assembly, add the shim
|
|
150
|
+
assembly too (the shim tests exercise `internal` types):
|
|
151
|
+
|
|
152
|
+
```csharp
|
|
153
|
+
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("<TestProject>.Mutation")]
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 4. Port v3-only constructs (only the files step 2 flagged)
|
|
159
|
+
|
|
160
|
+
Rewrite v3-only APIs to v2-compatible, behavior-equivalent forms. Common cases:
|
|
161
|
+
|
|
162
|
+
| v3-only | v2-compatible replacement | Notes |
|
|
163
|
+
|---|---|---|
|
|
164
|
+
| `TestContext.Current.CancellationToken` | `CancellationToken.None` | Equivalent for passing tests; the token was never cancelled |
|
|
165
|
+
| `[AutoData]` / `[InlineAutoData]` (AutoFixture.Xunit3) | manual `new Fixture()` in the test body, or convert to `[Fact]`/`[Theory]+[InlineData]` | Heavier; avoid this shim if pervasive |
|
|
166
|
+
| `Assert.Skip(...)` | `[Fact(Skip="…")]` or guard-and-return | |
|
|
167
|
+
|
|
168
|
+
Port **in the real test project's source** — the shim links those same files, so
|
|
169
|
+
one edit satisfies both. Verify the replacement still compiles under v3 too
|
|
170
|
+
(`CancellationToken.None` does).
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 5. Invoke Stryker against the shim (the critical part)
|
|
175
|
+
|
|
176
|
+
**Run `dotnet-stryker` FROM the shim's project directory**, with a
|
|
177
|
+
`stryker-config.json` beside it:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
cd tests/<TestProject>.Mutation
|
|
181
|
+
dotnet-stryker
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Why this and not a bare run at repo root:
|
|
185
|
+
|
|
186
|
+
- The repo root has a single `.sln` that does **not** contain the shim. A bare
|
|
187
|
+
`dotnet-stryker` at root **auto-detects the `.sln`, enters solution mode,
|
|
188
|
+
ignores `test-projects`, and binds to the real xunit.v3 project** → false ~0%.
|
|
189
|
+
- Running from a directory with **no `.sln`** forces **project mode**: Stryker
|
|
190
|
+
uses the test project in the cwd (the shim) and finds the product via its
|
|
191
|
+
`ProjectReference`.
|
|
192
|
+
|
|
193
|
+
`stryker-config.json` (place in the shim directory):
|
|
194
|
+
|
|
195
|
+
```json
|
|
196
|
+
{
|
|
197
|
+
"stryker-config": {
|
|
198
|
+
"mutate": ["**/*.cs", "!obj/**/*.cs", "!**/gRPC/**/*.cs", "!**/Caching/**/*.cs"],
|
|
199
|
+
"mutation-level": "Standard",
|
|
200
|
+
"coverage-analysis": "perTest",
|
|
201
|
+
"additional-timeout": 30000,
|
|
202
|
+
"target-framework": "net10.0",
|
|
203
|
+
"reporters": ["html", "json", "progress"],
|
|
204
|
+
"thresholds": { "high": 80, "low": 60, "break": 0 }
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
(Adjust the `mutate` excludes to the product's own out-of-scope folders.)
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 6. Validate BEFORE the full run
|
|
214
|
+
|
|
215
|
+
A full run can take hours; a wrong harness wastes all of it. Two gates:
|
|
216
|
+
|
|
217
|
+
1. **Green baseline** — the shim must build and all tests pass:
|
|
218
|
+
```bash
|
|
219
|
+
dotnet build tests/<TestProject>.Mutation/<TestProject>.Mutation.csproj -c Release
|
|
220
|
+
dotnet test tests/<TestProject>.Mutation/<TestProject>.Mutation.csproj -c Release --no-build
|
|
221
|
+
# expect the same test count as the real project, 0 failed
|
|
222
|
+
```
|
|
223
|
+
2. **Kills register** — scope `mutate` to one small, well-covered file and run
|
|
224
|
+
Stryker from the shim dir. Expect a *non-zero* score with real kills:
|
|
225
|
+
```json
|
|
226
|
+
{ "stryker-config": { "mutate": ["**/Extensions/DecimalExtensions.cs"],
|
|
227
|
+
"coverage-analysis": "perTest", "reporters": ["json","progress"] } }
|
|
228
|
+
```
|
|
229
|
+
A healthy scoped run produces real kills (e.g. **5 killed / 4 survived →
|
|
230
|
+
55.56%**) — proof observation works. If this scoped run shows ~0%, the harness
|
|
231
|
+
is still wrong; do **not** launch the full run.
|
|
232
|
+
|
|
233
|
+
Then widen `mutate` to the full scope and launch the full run in the background,
|
|
234
|
+
with periodic status monitoring rather than blocking on it.
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 7. Sanity-check the result
|
|
239
|
+
|
|
240
|
+
Before recording any score, reject the observation-failure signature: a
|
|
241
|
+
near-zero score with almost everything *Survived* means the run bound to the v3
|
|
242
|
+
project — rerun from the shim dir. A healthy run kills the majority of covered
|
|
243
|
+
mutants (a real example from this technique: **57.44%**, 4,419 killed / 2,209
|
|
244
|
+
survived / 1 timeout of 6,629 tested).
|
|
245
|
+
|
|
246
|
+
Output lives at `StrykerOutput/<timestamp>/reports/mutation-report.{html,json}`.
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 8. Teardown
|
|
251
|
+
|
|
252
|
+
The shim, its `stryker-config.json`, the `InternalsVisibleTo` line, and any v3→v2
|
|
253
|
+
source ports are **measurement scaffolding**. If measuring a branch you won't
|
|
254
|
+
merge (e.g. a worktree baseline), discard the worktree. If the shim is meant to
|
|
255
|
+
live in the repo, keep it out of the `.sln` and out of CI test discovery so it
|
|
256
|
+
isn't run as a normal suite.
|