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,95 @@
|
|
|
1
|
+
# Mutation Testing — Go (go-mutesting, advisory only)
|
|
2
|
+
|
|
3
|
+
Tool: [go-mutesting](https://github.com/zimmski/go-mutesting). Detection: `go.mod` present; `command -v go-mutesting` resolves (installed to `$GOPATH/bin`).
|
|
4
|
+
|
|
5
|
+
**Advisory only.** go-mutesting is alpha quality — the surviving-mutant count is **not** a reliable gate. Always pair with Go's built-in fuzzing (production-quality) for boundary and edge-case discovery.
|
|
6
|
+
|
|
7
|
+
## Install / detect
|
|
8
|
+
|
|
9
|
+
`go install …@latest` writes the binary to `$GOPATH/bin` (typically `~/go/bin`), and `$GOPATH/bin` must be on `PATH` for `go-mutesting` to resolve. There is no project-scoped alternative — this is the one language path where the skill's "prefer local install" recommendation cannot be honored, so the `PATH` requirement is called out explicitly here rather than hidden.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
go install github.com/zimmski/go-mutesting/cmd/go-mutesting@latest
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Confirm the tool resolves before configuring a run:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
command -v go-mutesting || echo "go-mutesting not on PATH — check \$GOPATH/bin"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Run (scoped)
|
|
22
|
+
|
|
23
|
+
> When capturing run output to a log file, do **not** use a bare `go-mutesting ... 2>&1 | tee run.log` — the pipeline exit code is `tee`'s (always 0), so a tool failure is silently masked. Use `>run.log 2>&1` for one-shot runs or `set -o pipefail` for live tail. See [`SKILL.md` → Capturing run output safely](../../SKILL.md#capturing-run-output-safely).
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Whole module
|
|
27
|
+
go-mutesting ./...
|
|
28
|
+
|
|
29
|
+
# Single package
|
|
30
|
+
go-mutesting ./pkg/order
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Per-mutant timeout flag
|
|
34
|
+
|
|
35
|
+
go-mutesting has no reliable per-mutant flag. Wrap the process externally:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
timeout <seconds> go-mutesting ./... # macOS: gtimeout (from coreutils)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Default shipped: 60 s. Set the outer wrapper timeout to `timeout_seconds` (formula in [`SKILL.md`](../../SKILL.md) Step 1b).
|
|
42
|
+
|
|
43
|
+
## Native report → schema mapping
|
|
44
|
+
|
|
45
|
+
go-mutesting has no stable machine-readable report. Parse its stdout (each mutant prints `PASS`/`FAIL` with the mutated `file:line`) and map into the standard envelope, adding `"advisory": true` so callers warn instead of halt. The `equivalent` count is `0` unless triage reclassifies a survivor.
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"schema_version": 1,
|
|
50
|
+
"tool": "go-mutesting",
|
|
51
|
+
"advisory": true,
|
|
52
|
+
"scope": ["pkg/order/order.go"],
|
|
53
|
+
"captured_at": "2026-06-26T14:31:00Z",
|
|
54
|
+
"total": 40,
|
|
55
|
+
"killed": 31,
|
|
56
|
+
"survived": 9,
|
|
57
|
+
"equivalent": 0,
|
|
58
|
+
"survivors": [
|
|
59
|
+
{ "file": "pkg/order/order.go", "line": 22, "operator": "branch/condition", "status": "survived" }
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Because go-mutesting is advisory, downstream workflow callers MUST treat `advisory: true` as warn-not-block — a non-zero survivor count never fails the gate.
|
|
65
|
+
|
|
66
|
+
## Language-specific notes
|
|
67
|
+
|
|
68
|
+
### Advisory mode rationale
|
|
69
|
+
|
|
70
|
+
The orchestrated workflows (`/coverage-delta`, `/quality-targets-converge`) treat Go mutation results as **warn, do not block** — surface survivors as suggestions, never block on the count. Advisory mode is enforced by the `"advisory": true` flag on the schema envelope.
|
|
71
|
+
|
|
72
|
+
Never tell a Go project "no tool installed" without giving both:
|
|
73
|
+
|
|
74
|
+
1. The go-mutesting install path (above), and
|
|
75
|
+
2. The fuzz alternative (below).
|
|
76
|
+
|
|
77
|
+
### `go test -fuzz` complement (production-quality)
|
|
78
|
+
|
|
79
|
+
Native Go fuzzing (Go 1.18+) catches boundary/edge cases mutation testing can miss. The `-fuzz` flag takes a regexp matching a single `FuzzXxx` target and fuzzes **one package at a time** — it is **not** a package glob:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Run every fuzz target's seed corpus as ordinary tests (all packages)
|
|
83
|
+
go test ./...
|
|
84
|
+
|
|
85
|
+
# Actively fuzz one target (bounded for a pre-merge gate)
|
|
86
|
+
go test -fuzz=FuzzXxx -fuzztime=30s ./path/to/pkg
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Manage the fuzz corpus deliberately:
|
|
90
|
+
|
|
91
|
+
- Seed it from known edge cases.
|
|
92
|
+
- Commit interesting inputs under `testdata/fuzz/` so failures reproduce in CI.
|
|
93
|
+
- Run a bounded `-fuzztime` in the pre-merge gate while letting longer campaigns run out of band.
|
|
94
|
+
|
|
95
|
+
Pair the advisory go-mutesting result with `go test -fuzz` findings when reporting to the operator.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Mutation Testing — Java / Kotlin (pitest)
|
|
2
|
+
|
|
3
|
+
Tool: [pitest](https://pitest.org/). Detection: `pom.xml` or `build.gradle` has `pitest` plugin.
|
|
4
|
+
|
|
5
|
+
## Install / detect
|
|
6
|
+
|
|
7
|
+
Both install paths are **project-scoped by design** — the Maven `<plugin>` declaration and the Gradle `info.solidsoft.pitest` plugin resolve through the build tool's own dependency resolution, not through any user-configured `PATH`. There is no meaningful "global" alternative to pitest, so this language avoids the silent-failure trap the skill's "prefer local install" note is guarding against.
|
|
8
|
+
|
|
9
|
+
Maven:
|
|
10
|
+
|
|
11
|
+
```xml
|
|
12
|
+
<plugin>
|
|
13
|
+
<groupId>org.pitest</groupId>
|
|
14
|
+
<artifactId>pitest-maven</artifactId>
|
|
15
|
+
<version>1.17.4</version>
|
|
16
|
+
</plugin>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Gradle: add the `info.solidsoft.pitest` plugin.
|
|
20
|
+
|
|
21
|
+
Confirm the plugin resolves before configuring a run:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Maven: prints the help header for the mutationCoverage goal
|
|
25
|
+
./mvnw org.pitest:pitest-maven:help -Ddetail=true -Dgoal=mutationCoverage | head -1
|
|
26
|
+
|
|
27
|
+
# Gradle: lists the pitest tasks the plugin registers
|
|
28
|
+
./gradlew tasks --group=pitest
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Run (scoped)
|
|
32
|
+
|
|
33
|
+
> When capturing run output to a log file, do **not** use a bare `mvn pitest:mutationCoverage ... 2>&1 | tee run.log` — the pipeline exit code is `tee`'s (always 0), so a tool failure is silently masked. Use `>run.log 2>&1` for one-shot runs or `set -o pipefail` for live tail. See [`SKILL.md` → Capturing run output safely](../../SKILL.md#capturing-run-output-safely).
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# Specific class
|
|
37
|
+
mvn pitest:mutationCoverage -DtargetClasses="com.example.Calculator"
|
|
38
|
+
|
|
39
|
+
# With history (faster incremental runs)
|
|
40
|
+
mvn pitest:mutationCoverage -DwithHistory
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Per-mutant timeout flag
|
|
44
|
+
|
|
45
|
+
CLI:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
mvn pitest:mutationCoverage -DtimeoutConst=60 -DtimeoutFactor=2.5
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Default shipped: 60 s constant. Set `-DtimeoutConst` to `timeout_seconds` (formula in [`SKILL.md`](../../SKILL.md) Step 1b).
|
|
52
|
+
|
|
53
|
+
## Native report → schema mapping
|
|
54
|
+
|
|
55
|
+
Source: `target/pit-reports/<date>/mutations.xml`. Map `<mutation status="SURVIVED">` to `survived`; `<mutation status="NO_COVERAGE">` to `survived` (uncovered, but technically a survivor for downstream callers).
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"schema_version": 1,
|
|
60
|
+
"tool": "pitest",
|
|
61
|
+
"scope": ["src/main/java/com/example/Calculator.java"],
|
|
62
|
+
"captured_at": "2026-06-19T14:25:11Z",
|
|
63
|
+
"total": 36,
|
|
64
|
+
"killed": 30,
|
|
65
|
+
"survived": 4,
|
|
66
|
+
"equivalent": 2,
|
|
67
|
+
"survivors": [
|
|
68
|
+
{ "file": "src/main/java/com/example/Calculator.java", "line": 19, "operator": "CONDITIONALS_BOUNDARY", "status": "survived" }
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Language-specific notes
|
|
74
|
+
|
|
75
|
+
- **`withHistory`** — pitest skips mutants killed in prior runs when history is enabled. First run is slow; incremental runs are fast. Use it in CI for changed-file gates.
|
|
76
|
+
- The pitest HTML report under `target/pit-reports/` is the canonical triage view — note the path when reporting back.
|
|
77
|
+
- For multi-module Maven projects, run `pitest:mutationCoverage` from the aggregator POM and review each module's report individually.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Mutation Testing — JavaScript / TypeScript (Stryker)
|
|
2
|
+
|
|
3
|
+
Tool: [Stryker Mutator](https://stryker-mutator.io/). Detection: `package.json` has `@stryker-mutator/core` or `stryker.conf.json` exists.
|
|
4
|
+
|
|
5
|
+
## Install / detect
|
|
6
|
+
|
|
7
|
+
`--save-dev` is the **local** install path — the binary resolves via `node_modules/.bin` (which `npm run` / `npx` add to `PATH` scope-locally), so no global `PATH` edit is needed. Prefer this over `npm install -g @stryker-mutator/core`, which is the silent-failure trap called out in the skill's "prefer local install" note.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install --save-dev @stryker-mutator/core @stryker-mutator/vitest-runner # or jest-runner, karma-runner
|
|
11
|
+
npx stryker init
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Confirm the tool resolves before configuring a run:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npx stryker --version
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Run (scoped)
|
|
21
|
+
|
|
22
|
+
> When capturing run output to a log file, do **not** use a bare `npx stryker run ... 2>&1 | tee run.log` — the pipeline exit code is `tee`'s (always 0), so a tool failure is silently masked. Use `>run.log 2>&1` for one-shot runs or `set -o pipefail` for live tail. See [`SKILL.md` → Capturing run output safely](../../SKILL.md#capturing-run-output-safely).
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Specific files
|
|
26
|
+
npx stryker run --mutate "src/calculator.ts"
|
|
27
|
+
|
|
28
|
+
# Changed files only (CI mode)
|
|
29
|
+
npx stryker run --mutate "$(git diff --name-only HEAD~1 -- '*.ts' | grep -v test | tr '\n' ',')"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Static-mutant skip (`--skip-static-mutants`)
|
|
33
|
+
|
|
34
|
+
[`mutation-kill`](../../../../agents/mutation-kill.md#invocation)'s opt-in,
|
|
35
|
+
default-OFF `--skip-static-mutants` flag excludes mutants Stryker's
|
|
36
|
+
**native** `reports/mutation/mutation.json` report marks `"static": true`
|
|
37
|
+
from the survivor list handed to **the generation step only**, for that
|
|
38
|
+
round. The filter itself is computed by calling `survivors_by_mutator(...,
|
|
39
|
+
skip_static=True)` in `mutation_report.py` — invoke it through its CLI
|
|
40
|
+
wrapper,
|
|
41
|
+
`python3 "${CLAUDE_PLUGIN_ROOT}/skills/mutation-testing/scripts/mutation_report_cli.py"
|
|
42
|
+
--survivors-by-mutator --skip-static --report <path> --file <path>`, rather
|
|
43
|
+
than re-deriving it here or importing the library directly: the CLI is
|
|
44
|
+
where the inapplicable-skip notice below lives — a bare library call
|
|
45
|
+
computes the same filtered result but emits no diagnostic. A static mutant
|
|
46
|
+
sits in code that runs once at module-initialization time rather than
|
|
47
|
+
per-test, so `coverageAnalysis: "perTest"` cannot isolate it to the tests
|
|
48
|
+
covering it — Stryker must re-run the entire suite to verify one, which is
|
|
49
|
+
what "forcing a full-suite re-run" means in practice. (This field name and
|
|
50
|
+
execution behavior are Stryker's own; verify against the Stryker docs for
|
|
51
|
+
your installed version before relying on it in an automated pipeline.)
|
|
52
|
+
|
|
53
|
+
**What the trade-off actually buys.** The filter runs *after* Stryker has
|
|
54
|
+
already produced the report — it cannot make Stryker's own run faster, and
|
|
55
|
+
does not claim to. What it saves is the generation-and-verify **rounds**
|
|
56
|
+
`mutation-kill` would otherwise spend chasing mutants that are expensive to
|
|
57
|
+
confirm killed (each needs a full-suite re-run to verify), at the cost of
|
|
58
|
+
deferring each skipped static mutant rather than eliminating it: a skipped
|
|
59
|
+
static mutant that a full-suite run would have killed stays counted as an
|
|
60
|
+
unaddressed survivor for this pass, folded into the accepted-survivors
|
|
61
|
+
accounting below rather than dropped silently.
|
|
62
|
+
|
|
63
|
+
**Scoring and convergence stay unfiltered.** The `survivors == 0`
|
|
64
|
+
convergence exit, the no-improvement stop predicate, and the honest/reported
|
|
65
|
+
scores all read the report's full, unfiltered survivor count — a file whose
|
|
66
|
+
only remaining survivors are static must never be written as `status:
|
|
67
|
+
"converged"`.
|
|
68
|
+
|
|
69
|
+
**Line-clustering counts every survivor; only the mutator-grouped generation
|
|
70
|
+
list narrows (#1948, resolved as Option A).** `survivors_by_line()` DOES
|
|
71
|
+
accept a `skip_static` parameter now, but it is a deliberate **no-op** on
|
|
72
|
+
the returned clusters: a static-flagged survivor still counts toward its
|
|
73
|
+
line's cluster weight/ranking exactly as it would without the flag, because
|
|
74
|
+
it's still real evidence of that line's mutation density — only the
|
|
75
|
+
mutator-grouped generation input (`survivors_by_mutator(...,
|
|
76
|
+
skip_static=True)`) actually narrows which mutants get a test written. This
|
|
77
|
+
is a permanent design decision, not an open gap: clustering (the first step
|
|
78
|
+
of generation per [`mutation-kill.md`'s priority-order
|
|
79
|
+
guidance](../../../../agents/mutation-kill.md#target-mutation-types-in-priority-order))
|
|
80
|
+
and the mutator-grouped narrowing that follows it are intentionally
|
|
81
|
+
decoupled.
|
|
82
|
+
|
|
83
|
+
**Reconciling a clustered-but-unfiltered ranking with a filtered generation
|
|
84
|
+
list in practice.** When you pick a cluster to attack (highest
|
|
85
|
+
survivors-per-line first, per the priority-order guidance) and
|
|
86
|
+
`--skip-static-mutants` is active, don't assume every survivor in that
|
|
87
|
+
cluster is a generation candidate — check each survivor's own `static`
|
|
88
|
+
field (present on the raw mutant dict `survivors_by_line()` returns) before
|
|
89
|
+
writing a test for it:
|
|
90
|
+
|
|
91
|
+
- If the cluster has a **mix** of static and non-static survivors, write
|
|
92
|
+
the test(s) targeting the non-static ones as usual; the static ones stay
|
|
93
|
+
present in the cluster (contributing to its weight) but are not
|
|
94
|
+
individually targeted this round.
|
|
95
|
+
- If **every** survivor in the top cluster is static, that line has no
|
|
96
|
+
generation candidate this round even though it ranked first — move to the
|
|
97
|
+
next cluster with a non-static survivor rather than generating nothing
|
|
98
|
+
for the "top" line and stopping. The all-static cluster's survivors still
|
|
99
|
+
count toward the file's raw survivor total and (once folded via
|
|
100
|
+
`--accepted-static-survivors --skip-static`, below) the accepted-survivors
|
|
101
|
+
accounting — they are deferred, not lost.
|
|
102
|
+
|
|
103
|
+
**`adjusted_score` does account for static-skipped mutants.** After the
|
|
104
|
+
existing `--skip-static --survivors-by-mutator` generation call, also call
|
|
105
|
+
`mutation_report_cli.py --accepted-static-survivors --skip-static --report
|
|
106
|
+
<path> --file <path>` and fold each returned entry into the file's own
|
|
107
|
+
"Accepted Survivors (deferred)" table and `adjusted_score` computation,
|
|
108
|
+
exactly like any other `status: "accepted"` entry (see [mutation-kill.md's
|
|
109
|
+
Accepted survivors: raw vs adjusted
|
|
110
|
+
score](../../../../agents/mutation-kill.md#accepted-survivors-raw-vs-adjusted-score)).
|
|
111
|
+
`--skip-static` is required on this call: `accepted_static_survivors()`
|
|
112
|
+
returns `[]` unless its `skip_static_active` evidence is `True`, so calling
|
|
113
|
+
`--accepted-static-survivors` without `--skip-static` yields no accepted
|
|
114
|
+
entries at all, even when static survivors exist in the report. This is now
|
|
115
|
+
documented via the same accepted/reason mechanism used elsewhere in
|
|
116
|
+
`mutation-kill` — not the undocumented, adjusted-score-invisible over-count
|
|
117
|
+
the prior wording described. Clustering (`survivors_by_line()`) still counts
|
|
118
|
+
every survivor including static ones (see above) — it does not filter, so
|
|
119
|
+
there is nothing here for `--skip-static` to have "touched" in the first
|
|
120
|
+
place. **The prior "known overlap" caveat (#1948) is resolved**, not merely
|
|
121
|
+
narrowed: follow the reconciliation guidance above (check each survivor's
|
|
122
|
+
own `static` field before writing a test for it) and a static survivor
|
|
123
|
+
folded into this accepted table is never also independently targeted by
|
|
124
|
+
this same round's generation step — the two paths agree by construction, not
|
|
125
|
+
by coincidence.
|
|
126
|
+
|
|
127
|
+
**Fallback when the field is absent.** `mutation_report_cli.py --skip-static`
|
|
128
|
+
detects this itself and prints a one-line notice to stderr, distinguishing
|
|
129
|
+
two causes: no mutant in the matched file carries a `static` key at all (an
|
|
130
|
+
older Stryker version, or a report already normalized before the filter
|
|
131
|
+
runs), or the target file isn't present in the report at all. Either way,
|
|
132
|
+
skip is inapplicable; the agent's job is only to surface/relay that notice,
|
|
133
|
+
not re-detect the inapplicable case itself.
|
|
134
|
+
|
|
135
|
+
**Scope: interactive agent path only.** The `--skip-static-mutants`
|
|
136
|
+
*invocation* flag on `/mutation-kill` itself is agent-parsed prose, not an
|
|
137
|
+
argparse flag — there is no scripted JS/TS mutation-kill loop to add it to
|
|
138
|
+
(unlike the C#/Python loops' real `--headless`/`--model`/`--report` flags).
|
|
139
|
+
The underlying filter *computation* it drives is scripted, though: a real
|
|
140
|
+
argparse flag on `mutation_report_cli.py` (see above). Passed against a
|
|
141
|
+
non-JS/TS target in the interactive path, the invocation flag has no effect
|
|
142
|
+
and the agent prints a one-line ignored notice. It is **not** a flag on
|
|
143
|
+
`mutation_kill_loop.py`/`mutation_kill_loop_python.py`'s `--headless` CLI —
|
|
144
|
+
passing it there is an `unrecognized arguments` error, by design, the same
|
|
145
|
+
as any flag those scripts don't declare. Under `--all --parallel <n>`,
|
|
146
|
+
each spawned sub-agent's prompt must carry the flag explicitly; it does not
|
|
147
|
+
propagate automatically to Phase-4 fan-out sub-agents.
|
|
148
|
+
|
|
149
|
+
## Per-mutant timeout flag
|
|
150
|
+
|
|
151
|
+
Configure in `stryker.config.js`:
|
|
152
|
+
|
|
153
|
+
```js
|
|
154
|
+
{
|
|
155
|
+
timeoutMS: 60000, // hard wall-clock cap per mutant
|
|
156
|
+
timeoutFactor: 2.5, // multiplier over baseline test time
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Default shipped: 60 000 ms. Set `timeoutMS` to `timeout_seconds × 1000` (formula in [`SKILL.md`](../../SKILL.md) Step 1b).
|
|
161
|
+
|
|
162
|
+
## Native report → schema mapping
|
|
163
|
+
|
|
164
|
+
Source: `reports/mutation/mutation.json`. Map `metrics` to top-level totals and `files[*].mutants[]` to `survivors[]`.
|
|
165
|
+
|
|
166
|
+
```json
|
|
167
|
+
{
|
|
168
|
+
"schema_version": 1,
|
|
169
|
+
"tool": "stryker",
|
|
170
|
+
"scope": ["src/calculator.ts"],
|
|
171
|
+
"captured_at": "2026-06-19T14:22:08Z",
|
|
172
|
+
"total": 50,
|
|
173
|
+
"killed": 41,
|
|
174
|
+
"survived": 6,
|
|
175
|
+
"equivalent": 3,
|
|
176
|
+
"survivors": [
|
|
177
|
+
{ "file": "src/calculator.ts", "line": 42, "operator": "ConditionalBoundary", "status": "survived" },
|
|
178
|
+
{ "file": "src/calculator.ts", "line": 67, "operator": "ReturnValue", "status": "equivalent" }
|
|
179
|
+
]
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
`status: "equivalent"` is set when Stryker's `status` field is `NoCoverage` paired with an operator type the triage step (`SKILL.md` Step 4) classifies as equivalent; otherwise `survived`.
|
|
184
|
+
|
|
185
|
+
## Language-specific notes
|
|
186
|
+
|
|
187
|
+
- **`coverageAnalysis: "perTest"`** — set in `stryker.config.js` to run only tests covering the mutated line. This is the single biggest knob on per-mutant time; without it, per-mutant time ≈ full suite time.
|
|
188
|
+
- Stryker's HTML report (`reports/mutation/index.html`) is the most useful triage view — note the path when reporting back.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Mutation Testing — Python (mutmut)
|
|
2
|
+
|
|
3
|
+
Tool: [mutmut](https://mutmut.readthedocs.io/). Detection: `mutmut` in requirements or pyproject.
|
|
4
|
+
|
|
5
|
+
**Pin `mutmut<3`.** mutmut 3.x ships an incompatible config/CLI contract
|
|
6
|
+
(`source_paths` in a `[mutmut]` setup.cfg section, no `--paths-to-mutate`
|
|
7
|
+
flag, no `run`/`results`/`junitxml` subcommands in the same shape) that the
|
|
8
|
+
adapter and this reference below do not speak. `pip install mutmut`
|
|
9
|
+
unpinned resolves to 3.x today.
|
|
10
|
+
|
|
11
|
+
## Install / detect
|
|
12
|
+
|
|
13
|
+
Both install paths are **local** — scoped to the active virtual environment (`.venv/bin/mutmut`), not the system-wide `pip`. Pick one:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# (a) install directly into the active venv
|
|
17
|
+
pip install "mutmut<3"
|
|
18
|
+
|
|
19
|
+
# (b) declare it in pyproject.toml and let pip resolve it as a dev dep
|
|
20
|
+
# [project.optional-dependencies]
|
|
21
|
+
# dev = ["mutmut<3"]
|
|
22
|
+
pip install -e .[dev]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Never `pip install --user mutmut` or run `pip install` outside a venv for this — that puts mutmut in a location whose `PATH` presence depends on the user's shell config, which is the silent-failure trap the skill's "prefer local install" note is trying to avoid.
|
|
26
|
+
|
|
27
|
+
**The mutmut venv's own Python must be <= 3.12 — distinct from the `--runner`'s interpreter.** `mutmut<3` (2.5.1) crashes under Python 3.13+ with `TypeError: cannot pickle 'itertools.count' object` (a parso/pony-ORM deepcopy incompatibility inside mutmut's own line-caching layer) and produces a junitxml report with **zero testcases at all** — indistinguishable from a fully-converged file by survivor count alone (#1359). This is a version constraint on the interpreter mutmut *itself* runs under, not on the project: build the mutmut venv with `python3.12 -m venv <path>` (or any <=3.12 interpreter) even when the project's real Python is newer, and point `--runner` at the project's normal interpreter (e.g. `--runner "python3 -m pytest ..."`, which can be 3.13+) — only the mutmut process itself needs the older Python. `mutation_kill_loop_python.py`'s `run_for_file` treats a report with zero total mutants (`killed + survived + timeout + no_coverage == 0`) as a crash signal, not convergence, and stops without declaring `survivors == 0` — but avoiding the crash in the first place is cheaper than recovering from it every round.
|
|
28
|
+
|
|
29
|
+
Confirm the tool resolves in the active venv before configuring a run
|
|
30
|
+
(`version` is a subcommand — there is no `--version` flag):
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
mutmut version
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Run (scoped)
|
|
37
|
+
|
|
38
|
+
> When capturing run output to a log file, do **not** use a bare `mutmut run ... 2>&1 | tee run.log` — the pipeline exit code is `tee`'s (always 0), so a tool failure is silently masked. Use `>run.log 2>&1` for one-shot runs or `set -o pipefail` for live tail. See [`SKILL.md` → Capturing run output safely](../../SKILL.md#capturing-run-output-safely).
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
mutmut run --paths-to-mutate=src/calculator.py
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Per-mutant timeout
|
|
45
|
+
|
|
46
|
+
mutmut has no `--timeout <seconds>` flag. Its own per-mutant timeout is
|
|
47
|
+
`baseline_time * test_time_multiplier + test_time_base` (`-m`/`-b`,
|
|
48
|
+
defaults `2.0`/`0.0`) — a mutant whose test run exceeds that computed
|
|
49
|
+
budget is reported `TIMEOUT`. The shipped adapter
|
|
50
|
+
(`hooks/mutation_adapters/mutmut.py`) does not rely on this; it wraps the
|
|
51
|
+
whole `mutmut run` invocation in an external, OS-level timeout
|
|
52
|
+
(`ADAPTER_TIMEOUT`, from `MUTATION_GATE_TIMEOUT`, default 120s) so a
|
|
53
|
+
runaway run is killed regardless of mutmut's own per-mutant accounting.
|
|
54
|
+
|
|
55
|
+
## Native report → schema mapping
|
|
56
|
+
|
|
57
|
+
mutmut has no `--json` results output. Source: `mutmut junitxml` — a
|
|
58
|
+
`<testcase>` with a `<failure>` child is a survived mutant under the
|
|
59
|
+
default suspicious/untested policies (both `ignore`); one without is
|
|
60
|
+
killed. `name`, `file`, and `line` come from the `<testcase>` attributes:
|
|
61
|
+
|
|
62
|
+
```xml
|
|
63
|
+
<testcase name="Mutant #8" file="src/calculator.py" line="12">
|
|
64
|
+
<failure type="failure" message="bad_survived">--- diff ---</failure>
|
|
65
|
+
</testcase>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Map each `<failure>`-bearing `<testcase>` to a `survived` entry in the
|
|
69
|
+
normalized envelope below (`operator` has no mutmut equivalent — omit it
|
|
70
|
+
or leave `null`, unlike Stryker/pitest which name a mutator/operator per
|
|
71
|
+
survivor):
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"schema_version": 1,
|
|
76
|
+
"tool": "mutmut",
|
|
77
|
+
"scope": ["src/calculator.py"],
|
|
78
|
+
"captured_at": "2026-06-19T14:28:42Z",
|
|
79
|
+
"total": 28,
|
|
80
|
+
"killed": 22,
|
|
81
|
+
"survived": 5,
|
|
82
|
+
"equivalent": 1,
|
|
83
|
+
"survivors": [
|
|
84
|
+
{ "file": "src/calculator.py", "line": 12, "operator": null, "status": "survived" }
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
This normalized envelope is produced by the triaging agent reading the
|
|
90
|
+
native report (per this doc's mapping) — `mutation_report.py` and
|
|
91
|
+
`mutation_kill_loop.py` have no mutmut-specific parsing yet (see
|
|
92
|
+
[SKILL.md → Machine-readable output](../../SKILL.md#machine-readable-output)).
|
|
93
|
+
|
|
94
|
+
## Language-specific notes
|
|
95
|
+
|
|
96
|
+
- mutmut stores per-mutant state in `.mutmut-cache` — keep it out of version control but cache it between CI runs for incremental speed.
|
|
97
|
+
- For pytest-based suites, ensure the runner inherits the project's `PYTHONPATH` / virtualenv; mutmut shells out to the same `python` it was invoked with.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Mutation Testing: Time Estimation
|
|
2
|
+
|
|
3
|
+
Before running, estimate and present the expected duration to the user.
|
|
4
|
+
|
|
5
|
+
**Formula:** `mutation time ≈ (number of mutants) × (per-mutant test time)`
|
|
6
|
+
|
|
7
|
+
Tools optimize per-mutant time significantly:
|
|
8
|
+
|
|
9
|
+
- **Stryker** with `coverageAnalysis: "perTest"` runs only tests covering the mutated line, not the full suite. See [`languages/javascript-stryker.md`](languages/javascript-stryker.md).
|
|
10
|
+
- **pitest** with `withHistory` skips mutants killed in prior runs — first run is slow, incremental runs are fast. See [`languages/java-pitest.md`](languages/java-pitest.md).
|
|
11
|
+
|
|
12
|
+
**Rough heuristics (with per-test coverage analysis enabled):**
|
|
13
|
+
|
|
14
|
+
| Scope | LOC | Expected Duration |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Single small file | 50-200 | Seconds to ~1 min |
|
|
17
|
+
| Single medium file | 200-500 | 1-5 min |
|
|
18
|
+
| Multiple files / module | 500-1000 | 5-15 min |
|
|
19
|
+
| Full codebase | 1000+ | 10 min to hours |
|
|
20
|
+
|
|
21
|
+
The biggest variable is **test execution speed**, not mutant count. A project with slow integration tests will hurt far more than one with many mutants but fast unit tests.
|
|
22
|
+
|
|
23
|
+
**How to estimate for a specific project:**
|
|
24
|
+
|
|
25
|
+
1. Check how long the test suite takes: `time npm test` or `time mvn test`
|
|
26
|
+
2. Count approximate mutants: ~5-15 mutants per 100 LOC depending on code density
|
|
27
|
+
3. With per-test coverage: per-mutant time is typically 5-20% of full suite time
|
|
28
|
+
4. Without per-test coverage: per-mutant time ≈ full suite time (configure coverage analysis!)
|
|
29
|
+
|
|
30
|
+
**Present to user before running:**
|
|
31
|
+
|
|
32
|
+
> Mutation testing on `src/calculator.ts` (~150 LOC, ~20 mutants). Test suite runs in ~3s. Estimated time: under 1 minute. Proceed?
|
|
33
|
+
|
|
34
|
+
If the estimate exceeds 5 minutes, suggest scoping down or confirm the user is willing to wait.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Mutation Testing: Tool Detection
|
|
2
|
+
|
|
3
|
+
Detect the project's language and resolve to a mutation tool. Each row links to the language-specific knowledge file with install, run, timeout, and report-mapping detail.
|
|
4
|
+
|
|
5
|
+
| Ecosystem | Tool | Detection | Knowledge file |
|
|
6
|
+
| --- | --- | --- | --- |
|
|
7
|
+
| JS/TS | [Stryker](https://stryker-mutator.io/) | `package.json` has `@stryker-mutator/core` or `stryker.conf.json` exists | [`languages/javascript-stryker.md`](languages/javascript-stryker.md) |
|
|
8
|
+
| Java/Kotlin | [pitest](https://pitest.org/) | `pom.xml` or `build.gradle` has `pitest` plugin | [`languages/java-pitest.md`](languages/java-pitest.md) |
|
|
9
|
+
| Python | [mutmut](https://mutmut.readthedocs.io/) | `mutmut` in requirements or pyproject | [`languages/python-mutmut.md`](languages/python-mutmut.md) |
|
|
10
|
+
| C#/.NET | [Stryker.NET](https://stryker-mutator.io/docs/stryker-net/introduction/) | `dotnet-stryker` in tool manifest | [`languages/csharp-stryker-net.md`](languages/csharp-stryker-net.md) |
|
|
11
|
+
| Go | [go-mutesting](https://github.com/zimmski/go-mutesting) | `go.mod` present; `command -v go-mutesting` resolves (installed to `$GOPATH/bin`). **Advisory only.** | [`languages/go-go-mutesting.md`](languages/go-go-mutesting.md) |
|
|
12
|
+
|
|
13
|
+
**Do not proceed to mutation testing without a working tool.** If detection finds nothing, follow the install steps in the matching language file. If the user declines to install one, explain that the skill requires real test execution and cannot substitute estimation.
|
|
14
|
+
|
|
15
|
+
**Go is the one exception** where "no tool" still yields an actionable path: install go-mutesting in advisory mode, or fall back to `go test -fuzz`. Never report "no tool installed" to a Go project without giving both — see [`languages/go-go-mutesting.md`](languages/go-go-mutesting.md).
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# `--workflow-managed-approval` — approved caller registry
|
|
2
|
+
|
|
3
|
+
The `--workflow-managed-approval` flag on `/mutation-testing` bypasses the Step 0 confirmation prompt because the calling workflow captured operator approval at a higher boundary. The flag is **not** general-purpose; it is a narrow carve-out for orchestrated workflows whose Phase 0 (or equivalent) already obtained explicit operator consent for the run as a whole.
|
|
4
|
+
|
|
5
|
+
This file is the source of truth for the allowlist. `/mutation-testing` `## Constraints` references this file by path so a new caller only has to update one place.
|
|
6
|
+
|
|
7
|
+
## Allowed callers
|
|
8
|
+
|
|
9
|
+
| Caller skill | Workflow it belongs to | Where its approval is captured | Why the carve-out applies |
|
|
10
|
+
| --- | --- | --- | --- |
|
|
11
|
+
| [`/coverage-delta`](../../coverage-delta/SKILL.md) | `/test-improve` Phase 4 (per-Story coverage delta + optional mutation gate) | `/test-improve` Phase 0 ("Approach contract" — the mutation-mode knob (`off` / `kill-loop` / `baseline+kill-loop`) is the workflow-level approval point) | Phase 4 measures mutation per Story automatically when the mutation mode is not `off`; per-invocation prompts would block the workflow on every Story close. |
|
|
12
|
+
| [`/test-improve`](../../test-improve/SKILL.md) | `/test-improve` Phase 2 (baseline mutation, in `baseline+kill-loop` mode) | `/test-improve` Phase 0 (same mutation-mode knob) | Phase 2 measures the mutation baseline across the in-scope files once before any test change so later phases have a floor; a per-invocation prompt at that boundary would break the workflow-level-approval contract. |
|
|
13
|
+
| [`/quality-targets-converge`](../../quality-targets-converge/SKILL.md) | `/test-improve` Phase 6 (Validate convergence loop) | `/test-improve` Phase 0 (same mutation-mode knob) | Phase 6 runs the convergence loop under the `/test-improve` orchestrator; approval was captured once at Phase 0. `/test-improve` Phase 4 drives mutation via the `mutation-kill` agent (which wraps the tool directly and never sets this flag), so the flag enters only through this Phase-6 caller. |
|
|
14
|
+
|
|
15
|
+
## Adding a new caller
|
|
16
|
+
|
|
17
|
+
Any new caller must:
|
|
18
|
+
|
|
19
|
+
1. Document where its workflow-level operator approval is captured (a named Phase, gate, or skill that prompts once for the entire run).
|
|
20
|
+
2. Add a row to the table above naming the caller, the workflow, the approval-capture point, and why the carve-out is justified.
|
|
21
|
+
3. Land all three changes (the new caller, this row, and any cross-skill cross-reference) in the same PR so the auditor can see the full intent.
|
|
22
|
+
|
|
23
|
+
`/mutation-testing` `## Constraints` is the enforcement surface: it asserts the carve-out invariant but **does not enumerate callers inline**. Reviewers verify allowlist membership by reading this file. Bats tests in `tests/skills/mutation_testing_scoping_tests.bats` assert (a) the carve-out paragraph exists in `## Constraints`, (b) the named callers (`/coverage-delta`, `/quality-targets-converge`) appear in `## Constraints` for human-readable discoverability — once a third caller lands, that test can either be widened or replaced with an assertion that the constraint references this registry.
|