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,235 @@
|
|
|
1
|
+
# BDD Frameworks — per-language wire-in
|
|
2
|
+
|
|
3
|
+
The minimal steps to wire a BDD runner into a project, one section per supported
|
|
4
|
+
language. Use this **after** `../references/bdd-value-guide.md` recommends
|
|
5
|
+
`bdd-runner` mode — this file is the mechanics, not the decision.
|
|
6
|
+
|
|
7
|
+
Every runner here outputs JUnit-XML (or an equivalent the CI already understands),
|
|
8
|
+
so the BDD suite plugs into the existing pipeline without new reporting.
|
|
9
|
+
|
|
10
|
+
**Directory naming (issue #1462).** Every canonical destination named below —
|
|
11
|
+
`features/`, `Features/`, `src/test/resources/features/` — ends in a name
|
|
12
|
+
`scripts/detect_bdd_convention.py`'s `_CONVENTIONAL_FEATURE_DIR_NAMES`
|
|
13
|
+
allowlist recognizes (`features`, `feature`, `specs`, `spec`, `bdd`,
|
|
14
|
+
`acceptance`, case-insensitive). That script's feature-file scan only
|
|
15
|
+
signals a project's existing `.feature` directory as "the" convention when
|
|
16
|
+
at least one path component matches this allowlist — an incidental
|
|
17
|
+
`.feature` root elsewhere in the repo, under an unrelated directory name,
|
|
18
|
+
is not treated as evidence of a repo-wide convention. Adding a new stack
|
|
19
|
+
below with a differently-named destination requires adding that name to the
|
|
20
|
+
allowlist too (`tests/scripts/test_detect_bdd_convention.py::TestConventionalNameAllowlistSync`
|
|
21
|
+
enforces the two tables stay in sync).
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## JS/TS — Cucumber.js
|
|
26
|
+
|
|
27
|
+
- **Framework:** [@cucumber/cucumber](https://github.com/cucumber/cucumber-js) (v11+).
|
|
28
|
+
- **Install:** `npm install --save-dev @cucumber/cucumber`
|
|
29
|
+
- **Directory layout:**
|
|
30
|
+
- `features/` — `.feature` files.
|
|
31
|
+
- `features/support/` — step definitions and world/hooks.
|
|
32
|
+
- **Runner config** — `cucumber.yaml` (or `cucumber.js`) at repo root:
|
|
33
|
+
|
|
34
|
+
```yaml
|
|
35
|
+
default:
|
|
36
|
+
require:
|
|
37
|
+
- features/support/**/*.js
|
|
38
|
+
format:
|
|
39
|
+
- "junit:reports/cucumber-junit.xml"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- **Step stub (pending):**
|
|
43
|
+
|
|
44
|
+
```js
|
|
45
|
+
import { Given } from "@cucumber/cucumber";
|
|
46
|
+
Given("a precondition", function () {
|
|
47
|
+
return this.pending(); // marks the step (and scenario) pending
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- **Run:** `npx cucumber-js`
|
|
52
|
+
- **CI note:** the `junit` formatter writes `reports/cucumber-junit.xml`; point the existing JUnit reporter at it. Cucumber.js runs alongside Vitest/Jest — they are complementary, not alternatives.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Java / Maven — Cucumber-JVM
|
|
57
|
+
|
|
58
|
+
- **Framework:** [Cucumber-JVM](https://github.com/cucumber/cucumber-jvm) on the JUnit 5 platform.
|
|
59
|
+
- **Install** — add to `pom.xml`:
|
|
60
|
+
|
|
61
|
+
```xml
|
|
62
|
+
<dependency>
|
|
63
|
+
<groupId>io.cucumber</groupId>
|
|
64
|
+
<artifactId>cucumber-java</artifactId>
|
|
65
|
+
<version>7.18.1</version>
|
|
66
|
+
<scope>test</scope>
|
|
67
|
+
</dependency>
|
|
68
|
+
<dependency>
|
|
69
|
+
<groupId>io.cucumber</groupId>
|
|
70
|
+
<artifactId>cucumber-junit-platform-engine</artifactId>
|
|
71
|
+
<version>7.18.1</version>
|
|
72
|
+
<scope>test</scope>
|
|
73
|
+
</dependency>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- **Directory layout:**
|
|
77
|
+
- `src/test/resources/features/` — `.feature` files.
|
|
78
|
+
- `src/test/java/.../steps/` — step-definition classes.
|
|
79
|
+
- **Runner config** — a suite entry point:
|
|
80
|
+
|
|
81
|
+
```java
|
|
82
|
+
import org.junit.platform.suite.api.*;
|
|
83
|
+
|
|
84
|
+
@Suite
|
|
85
|
+
@IncludeEngines("cucumber")
|
|
86
|
+
@SelectClasspathResource("features")
|
|
87
|
+
public class RunCucumberTest {}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
(add `import static io.cucumber.junit.platform.engine.Constants.*;` only if you also set `@ConfigurationParameter` options such as the `pretty` plugin.)
|
|
91
|
+
- **Step stub (pending):**
|
|
92
|
+
|
|
93
|
+
```java
|
|
94
|
+
import io.cucumber.java.en.Given;
|
|
95
|
+
import io.cucumber.java.PendingException;
|
|
96
|
+
|
|
97
|
+
public class Steps {
|
|
98
|
+
@Given("a precondition")
|
|
99
|
+
public void a_precondition() { throw new io.cucumber.java.PendingException(); }
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
- **Run:** `mvn test` (Surefire discovers the JUnit 5 suite automatically).
|
|
104
|
+
- **CI note:** Surefire emits JUnit XML under `target/surefire-reports/` — no extra config.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Java / Gradle — Cucumber-JVM
|
|
109
|
+
|
|
110
|
+
Same engine as Maven; only the wiring differs.
|
|
111
|
+
|
|
112
|
+
- **Install** — add to `build.gradle`:
|
|
113
|
+
|
|
114
|
+
```groovy
|
|
115
|
+
testImplementation 'io.cucumber:cucumber-java:7.18.1'
|
|
116
|
+
testImplementation 'io.cucumber:cucumber-junit-platform-engine:7.18.1'
|
|
117
|
+
testImplementation 'org.junit.platform:junit-platform-suite:1.10.2'
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
- **Runner config** — ensure the `test` task uses the JUnit Platform and sees the feature resources:
|
|
121
|
+
|
|
122
|
+
```groovy
|
|
123
|
+
test {
|
|
124
|
+
useJUnitPlatform()
|
|
125
|
+
systemProperty 'cucumber.junit-platform.naming-strategy', 'long'
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Keep `.feature` files under `src/test/resources/features/` (same suite class as Maven).
|
|
130
|
+
- **Step stub:** identical to Maven (`io.cucumber.java.PendingException`).
|
|
131
|
+
- **Run:** `./gradlew test`
|
|
132
|
+
- **CI note:** Gradle writes JUnit XML under `build/test-results/test/`.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## C# — Reqnroll
|
|
137
|
+
|
|
138
|
+
- **Framework:** [Reqnroll](https://reqnroll.net/) — the actively-maintained, MIT-licensed successor to SpecFlow. **Prefer Reqnroll over SpecFlow:** identical API, but SpecFlow requires a commercial license for teams larger than one, while Reqnroll is free.
|
|
139
|
+
- **Install:** `dotnet add package Reqnroll.xUnit` (or `Reqnroll.NUnit` / `Reqnroll.MsTest` to match the project's test runner) **and** `dotnet add package Reqnroll.Tools.MsBuild.Generation`. The second package is required, not optional — it's the `.feature` → C# code generator; the runtime-bindings package alone leaves `.feature` files silently uncompiled (`dotnet test` reports "No test is available," with no error at all).
|
|
140
|
+
- **Directory layout:**
|
|
141
|
+
- `Features/` — `.feature` files. The default MSBuild wildcard include only reaches `.feature` files under the test project's own directory tree. To reference files living outside it (e.g. a shared `features/` convention dir consumed by multiple projects), add them explicitly as `ReqnrollFeatureFile` items — **not** `AdditionalFiles` (that's a Roslyn-source-generator convention; MSBuild-based Reqnroll codegen doesn't key on it):
|
|
142
|
+
|
|
143
|
+
```xml
|
|
144
|
+
<ItemGroup>
|
|
145
|
+
<ReqnrollFeatureFile Include="..\..\features\*.feature" Link="Features\%(Filename)%(Extension)" />
|
|
146
|
+
</ItemGroup>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
- `StepDefinitions/` — `[Binding]` step classes.
|
|
150
|
+
- **Runner config** — `reqnroll.json` at the project root:
|
|
151
|
+
|
|
152
|
+
```json
|
|
153
|
+
{ "language": { "feature": "en" } }
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
- **Step stub (pending):** throw `PendingStepException` directly — this is Reqnroll's own auto-suggested stub for an undefined step. (`ScenarioContext.StepIsPending()` is deprecated as of Reqnroll 3.3.4 and will be removed in v4; it is also a **static** method, not an instance method, despite older examples showing it called via constructor-injected `ScenarioContext`.)
|
|
157
|
+
|
|
158
|
+
```csharp
|
|
159
|
+
using Reqnroll;
|
|
160
|
+
|
|
161
|
+
[Binding]
|
|
162
|
+
public class Steps {
|
|
163
|
+
[Given("a precondition")]
|
|
164
|
+
public void GivenAPrecondition() => throw new PendingStepException();
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
- **Run:** `dotnet test`
|
|
169
|
+
- **CI note:** `dotnet test --logger "junit;LogFilePath=reports/reqnroll-junit.xml"` (via the JUnit test logger) produces JUnit XML for the pipeline.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Python — pytest-bdd / behave
|
|
174
|
+
|
|
175
|
+
- **Framework:** [pytest-bdd](https://github.com/pytest-dev/pytest-bdd) (scenarios run as ordinary pytest tests — preferred when pytest is already the runner) or [behave](https://github.com/behave/behave) (standalone Gherkin runner).
|
|
176
|
+
- **Install:** `pip install pytest-bdd` or `pip install behave` (declare in `pyproject.toml` or `requirements*.txt`).
|
|
177
|
+
- **Directory layout:**
|
|
178
|
+
- `features/` — `.feature` files (both tools' convention).
|
|
179
|
+
- pytest-bdd: step definitions in `tests/step_defs/test_*.py`, bound with `scenarios("../../features")`.
|
|
180
|
+
- behave: step definitions in `features/steps/*.py`.
|
|
181
|
+
- **Step stub (pending):**
|
|
182
|
+
|
|
183
|
+
```python
|
|
184
|
+
# pytest-bdd
|
|
185
|
+
import pytest
|
|
186
|
+
from pytest_bdd import given
|
|
187
|
+
|
|
188
|
+
@given("a precondition")
|
|
189
|
+
def a_precondition():
|
|
190
|
+
pytest.skip("pending") # marks the step (and scenario) pending
|
|
191
|
+
|
|
192
|
+
# behave
|
|
193
|
+
from behave import given
|
|
194
|
+
|
|
195
|
+
@given("a precondition")
|
|
196
|
+
def step_a_precondition(context):
|
|
197
|
+
raise NotImplementedError("pending")
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
- **Run:** `pytest` (pytest-bdd) or `behave --junit --junit-directory reports/` (behave).
|
|
201
|
+
- **CI note:** pytest-bdd scenarios surface through the existing pytest JUnit reporter (`--junitxml`); behave's `--junit` flag writes per-feature JUnit XML the pipeline can pick up directly.
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Go — Godog
|
|
206
|
+
|
|
207
|
+
- **Framework:** [Godog](https://github.com/cucumber/godog) — the official Cucumber implementation for Go.
|
|
208
|
+
- **Install:** `go get github.com/cucumber/godog/cmd/godog@latest` (the library is pulled in transitively; the CLI is optional).
|
|
209
|
+
- **Directory layout:**
|
|
210
|
+
- `features/` — `.feature` files.
|
|
211
|
+
- step definitions live in a `*_test.go` file beside the suite entry point.
|
|
212
|
+
- **Runner config** — a suite entry point in `*_test.go` so Godog runs inside `go test` (no separate binary):
|
|
213
|
+
|
|
214
|
+
```go
|
|
215
|
+
func TestFeatures(t *testing.T) {
|
|
216
|
+
suite := godog.TestSuite{
|
|
217
|
+
ScenarioInitializer: InitializeScenario,
|
|
218
|
+
Options: &godog.Options{Format: "junit", Paths: []string{"features"}, TestingT: t},
|
|
219
|
+
}
|
|
220
|
+
if suite.Run() != 0 { t.Fatal("non-zero status returned, failed to run feature tests") }
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
- **Step stub (pending):**
|
|
225
|
+
|
|
226
|
+
```go
|
|
227
|
+
func aPrecondition() error { return godog.ErrPending }
|
|
228
|
+
|
|
229
|
+
func InitializeScenario(sc *godog.ScenarioContext) {
|
|
230
|
+
sc.Step(`^a precondition$`, aPrecondition)
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
- **Run:** `go test ./...` (the suite runs as an ordinary Go test).
|
|
235
|
+
- **CI note:** with the `TestingT` option set (above), scenario failures surface as normal `go test` results, so the existing pipeline already sees them. For a separate JUnit-XML artifact, point `Options.Output` at a file writer (e.g. `f, _ := os.Create("reports/godog-junit.xml"); opts.Output = f`) with `Format: "junit"`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Stack profile — Django / Python
|
|
2
|
+
|
|
3
|
+
Resolves `test-design-advisor`'s abstract layer (`test-pyramid.md`) to the canonical Django/Python tool.
|
|
4
|
+
|
|
5
|
+
| Layer | Tool | How to assert |
|
|
6
|
+
|-------|------|---------------|
|
|
7
|
+
| Unit | pytest (or `unittest`); `unittest.mock` only for a blocker collaborator (`internal-collaborator-doubling.md`) | call functions/methods directly; no DB |
|
|
8
|
+
| Component / Service | `pytest-django` + DRF `APIClient` / Django `Client` | drive the view/endpoint in-process; double outbound deps |
|
|
9
|
+
| Integration | `pytest-django` with the real test DB (transactional fixtures) | models, migrations, ORM queries, serializers against a real DB |
|
|
10
|
+
| Contract | Pact (Python) or `schemathesis` against the OpenAPI spec | provider/consumer agreement (`microservice-testing.md`) |
|
|
11
|
+
| E2E | Playwright (Python) / Selenium | critical journeys only |
|
|
12
|
+
|
|
13
|
+
**Notes.** `freezegun` (or inject a clock) for time; **VCR.py** (`vcrpy`) for outbound HTTP — the preferred record-and-replay tool — double the **owned adapter**, not the third-party SDK; `responses`/`httpx` mock remains a documented fallback alternative for teams already depending on it. See `../virtual-service-libraries.md` for the full preferred/backup catalog. Use `pytest.mark.django_db` deliberately; a test that doesn't need the DB shouldn't take it (speed). For Flask/FastAPI substitute the app's test client (`app.test_client()` / `TestClient`) at the component layer — the layer mapping is identical.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Stack profile — .NET (C#)
|
|
2
|
+
|
|
3
|
+
Resolves `test-design-advisor`'s abstract layer (`test-pyramid.md`) to the canonical .NET tool.
|
|
4
|
+
|
|
5
|
+
| Layer | Tool | How to assert |
|
|
6
|
+
|-------|------|---------------|
|
|
7
|
+
| Unit | xUnit (or NUnit) + FluentAssertions; Moq / NSubstitute only for a blocker collaborator (`internal-collaborator-doubling.md`) | call the class directly; inject collaborators |
|
|
8
|
+
| Component / Service (API Provider — inbound HTTP) | `WebApplicationFactory<TEntryPoint>` (in-memory `TestServer`) + `HttpClient` | drive the API in-process; replace externals in the test host's DI |
|
|
9
|
+
| Component / Service (API Consumer — outbound HTTP) | Stub `HttpMessageHandler` + `IHttpClientFactory` (`ConfigurePrimaryHttpMessageHandler`) + Polly bound to `FakeTimeProvider` | drive the adapter; assert request shape captured by the stub + the resilience policy under doubled failures (`../references/csharp-http-client-testing.md`) |
|
|
10
|
+
| Integration | Testcontainers-dotnet (real DB/broker) or `EF Core` against a real provider | repository/EF mappings/SQL against a real dependency |
|
|
11
|
+
| Contract (HTTP — request/response shape) | Stub `HttpMessageHandler` driving the owned adapter | structural deserialization of captured request + canned response; queue retry sequences (`../references/csharp-http-client-testing.md`) |
|
|
12
|
+
| Contract (consumer↔provider agreement) | PactNet | consumer-driven contracts across owned service boundaries (`microservice-testing.md`) |
|
|
13
|
+
| E2E | Playwright for .NET | critical journeys only |
|
|
14
|
+
| BDD (optional) | Reqnroll — Unit + Component scenarios | `[Binding]` step classes bound to `.feature` files; runs on xUnit/NUnit/MSTest |
|
|
15
|
+
|
|
16
|
+
**Notes.** Override services in `WebApplicationFactory.WithWebHostBuilder(...ConfigureTestServices)` to double outbound dependencies pre-merge without config. Inject `TimeProvider` (or an `IClock`) for time determinism; never `DateTime.Now` in logic — pair with Polly v8 bound to the same `TimeProvider` so retry/backoff/circuit-breaker policies advance virtual time deterministically. For the **API Consumer** side (your service calling out), the canonical pre-merge seam is `HttpMessageHandler` — not `WebApplicationFactory`, not Kestrel on a port — wrapped behind a thin owned adapter; WireMock.Net is the preferred implementation of that seam when installed — the same `IHttpClientFactory`/`ConfigurePrimaryHttpMessageHandler` configuration point is used to point the client at WireMock.Net's server URL, but the resulting call is a real loopback HTTP request, not an in-memory interception — with the hand-rolled `StubHttpMessageHandler` kept as backup; see `../references/csharp-http-client-testing.md` for the full pattern (`StubHttpMessageHandler`, request-shape assertions, retry sequencing, off-the-shelf alternatives, smells, and the WireMock.Net preferred/backup detail, including the loopback-socket reconciliation). Avoid the in-memory EF provider for anything relational — it hides SQL bugs; use Testcontainers or SQLite-in-memory deliberately and know its limits.
|
|
17
|
+
|
|
18
|
+
**BDD.** Use Reqnroll when non-technical stakeholders need to read or co-author scenarios (see `../references/bdd-value-guide.md` for the decision rubric) — BDD scenarios typically sit at the Unit and Component boundaries. **Prefer Reqnroll over SpecFlow:** identical API, but SpecFlow requires a commercial license for teams larger than one, while Reqnroll is the MIT-licensed, actively-maintained fork. Install (`dotnet add package Reqnroll.xUnit` / `.NUnit` / `.MsTest`) and the `ScenarioContext.StepIsPending()` stub: `bdd-frameworks.md`.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Stack profile — Go
|
|
2
|
+
|
|
3
|
+
Resolves `test-design-advisor`'s abstract layer (`test-pyramid.md`) to the canonical Go tool. Go's standard `testing` package covers most layers; reach for libraries sparingly.
|
|
4
|
+
|
|
5
|
+
| Layer | Tool | How to assert |
|
|
6
|
+
|-------|------|---------------|
|
|
7
|
+
| Unit | `testing` + table-driven tests; interfaces only for a blocker collaborator (`internal-collaborator-doubling.md`) | call the function; stdlib `if got != want` or testify/assert |
|
|
8
|
+
| Component / Service | `net/http/httptest` (`httptest.NewServer` / `ResponseRecorder`) | drive the handler in-process; double outbound deps via interfaces |
|
|
9
|
+
| Integration | Testcontainers-go (real DB/broker) | repository/SQL/driver against a real dependency |
|
|
10
|
+
| Contract | Pact-go | consumer↔provider agreement (`microservice-testing.md`) |
|
|
11
|
+
| E2E | `rod` / `chromedp`, or `go test` driving the built binary | critical journeys only |
|
|
12
|
+
| BDD (optional) | Godog — component/service + E2E scenarios | `godog.TestSuite{}.Run(t)` inside `go test`; steps drive the same in-process handlers |
|
|
13
|
+
|
|
14
|
+
**Notes.** Define narrow interfaces at the consumer and substitute them only when the collaborator matches a blocker (`internal-collaborator-doubling.md`) — idiomatic Go doubling, no mock framework needed (generate with `moq`/`mockgen` only when hand-writing is tedious). For outbound HTTP, **`go-vcr`** is the preferred record-and-replay tool for that adapter — see `../virtual-service-libraries.md` for the full preferred/backup catalog. Inject a clock (`func() time.Time`) rather than calling `time.Now()` in logic. Use the race detector (`go test -race`) on concurrency-bearing code. Fuzzing is built in (`func FuzzX(f *testing.F)`) — see `../testing-techniques/fuzz.md`.
|
|
15
|
+
|
|
16
|
+
**BDD.** Use Godog when non-technical stakeholders need to read or co-author scenarios (see `../references/bdd-value-guide.md` for the decision rubric). Godog wires directly into `go test` via `godog.TestSuite{}.Run(t)` — no separate test binary required. Install steps and the `godog.ErrPending` stub: `bdd-frameworks.md`.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Stack profile — Node.js backend (Express/Fastify/Nest)
|
|
2
|
+
|
|
3
|
+
Resolves `test-design-advisor`'s abstract layer (`test-pyramid.md`) to the canonical Node tool. For the browser/UI side see `react.md` / `vue.md` / `ssr-htmx.md`.
|
|
4
|
+
|
|
5
|
+
| Layer | Tool | How to assert |
|
|
6
|
+
|-------|------|---------------|
|
|
7
|
+
| Unit | Vitest or Jest (or `node:test`); doubles only for a blocker collaborator (`internal-collaborator-doubling.md`) | call the module directly; fake timers for time |
|
|
8
|
+
| Component / Service | supertest against the app instance (no live port) + Nock for outbound HTTP (MSW as fallback) | drive the route in-process; double the service's externals |
|
|
9
|
+
| Integration | Testcontainers (real DB/broker) or an ephemeral DB | the repository/driver/SQL/serialization actually works |
|
|
10
|
+
| Contract | Pact (JS) or `openapi`-driven checks | consumer↔provider agreement (`microservice-testing.md`) |
|
|
11
|
+
| E2E | Playwright | critical journeys only |
|
|
12
|
+
| BDD (optional) | Cucumber.js — component/service scenarios | `.feature` files with step defs in `features/support/`; drives the public surface via supertest |
|
|
13
|
+
|
|
14
|
+
**Notes.** `supertest(app)` exercises the full middleware/routing stack in-process — the workhorse component test. Mock outbound HTTP with **Nock** — the preferred record-and-replay tool (request-level) — rather than stubbing the HTTP client, so serialization is real; **MSW** remains a documented fallback alternative for teams already depending on it. See `../virtual-service-libraries.md` for the full preferred/backup catalog. Fake timers (`vi.useFakeTimers()` / `jest.useFakeTimers()`) and inject a clock for determinism. Nest: use `Test.createTestingModule(...)` to assemble the component, doubling only a provider that matches a blocker (`internal-collaborator-doubling.md`).
|
|
15
|
+
|
|
16
|
+
**BDD.** Use Cucumber.js when non-technical stakeholders need to read or co-author scenarios (see `../references/bdd-value-guide.md` for the decision rubric). Wire Cucumber.js **alongside** your existing Vitest/Jest suite — they are complementary, not alternatives: Cucumber drives the public surface (typically through supertest), xUnit drives internals. Install (`@cucumber/cucumber`) and the `this.pending()` stub: `bdd-frameworks.md`.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Stack profile — React (CSR / SPA)
|
|
2
|
+
|
|
3
|
+
Resolves `test-design-advisor`'s abstract layer (`test-pyramid.md`) for a client-side React app. Backend layers live in `node.md` (or the API's own profile).
|
|
4
|
+
|
|
5
|
+
| Layer | Tool | How to assert |
|
|
6
|
+
|-------|------|---------------|
|
|
7
|
+
| Unit | Vitest/Jest | pure hooks/reducers/utils called directly — no render |
|
|
8
|
+
| Component | React Testing Library + **MSW** for network | render, interact via role/label queries, assert on the DOM the user sees; API mocked at the network |
|
|
9
|
+
| Integration (UI↔API) | RTL + MSW with realistic handlers, or a running test API | data fetching, cache, error/loading states |
|
|
10
|
+
| E2E | Playwright / Cypress against the running app | critical journeys only |
|
|
11
|
+
|
|
12
|
+
**Notes.** Query by **accessible role/label/text**, not test-ids or class names (resilient + doubles as an a11y check) — see `a11y-review`. Mock the network with **MSW**, not by stubbing `fetch`/`axios`, so serialization and request shape stay real. Don't snapshot whole component trees as a correctness crutch (brittle); for genuine visual fidelity use `../testing-techniques/screenshot.md`. Test behavior (what the user does/sees), never internal state or implementation details.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Stack profile — Spring Boot (Java/Kotlin)
|
|
2
|
+
|
|
3
|
+
Resolves `test-design-advisor`'s abstract layer (`test-pyramid.md`) to the canonical Spring tool. Names tools by role; pick the team's actual assertion library.
|
|
4
|
+
|
|
5
|
+
| Layer | Tool | How to assert |
|
|
6
|
+
|-------|------|---------------|
|
|
7
|
+
| Unit | JUnit 5 + AssertJ; Mockito only for a blocker collaborator (`internal-collaborator-doubling.md`) | call the class directly, **no Spring context** — keep it fast |
|
|
8
|
+
| Component / Service | `@WebMvcTest` + MockMvc (web slice) or `@SpringBootTest(webEnvironment=RANDOM_PORT)` + TestRestTemplate | drive the endpoint in-process; double the service's own externals |
|
|
9
|
+
| Integration | Testcontainers (real DB/broker) + `@DataJpaTest` / `@SpringBootTest` | assert the adapter/SQL/serialization against a real dependency |
|
|
10
|
+
| Contract | Spring Cloud Contract or Pact | verify consumer↔provider agreement (`microservice-testing.md`), not E2E |
|
|
11
|
+
| E2E | Playwright / Selenium against the deployed app | critical journeys only |
|
|
12
|
+
| BDD (optional) | Cucumber-JVM — component/service scenarios | `.feature` files run inside JUnit 5 via `cucumber-junit-platform-engine` |
|
|
13
|
+
|
|
14
|
+
**Notes.** Prefer slice annotations (`@WebMvcTest`, `@DataJpaTest`) over full `@SpringBootTest` — faster context, sharper scope. Inject a fixed `Clock` bean for time determinism. Wrap third-party clients in an owned adapter and double the adapter (`cd-test-architecture.md`), never the SDK. For outbound HTTP, **WireMock** is the preferred record-and-replay tool for that adapter — see `../virtual-service-libraries.md` for the full preferred/backup catalog. Kotlin: same tools; MockK is an idiomatic alternative to Mockito.
|
|
15
|
+
|
|
16
|
+
**BDD.** Use Cucumber-JVM when non-technical stakeholders need to read or co-author scenarios (see `../references/bdd-value-guide.md` for the decision rubric). Wire it via `cucumber-junit-platform-engine` so Cucumber runs inside JUnit 5 — Maven Surefire and the Gradle `test` task pick it up automatically (the Maven and Gradle dependency sets differ slightly). Full wiring for both build tools and the `PendingException` stub: `bdd-frameworks.md`.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Stack profile — SSR + HTMX / Alpine / Turbo
|
|
2
|
+
|
|
3
|
+
Resolves `test-design-advisor`'s abstract layer (`test-pyramid.md`) for server-rendered apps with hypermedia-driven dynamic swaps. The server uses its own stack profile (`spring-boot` / `django` / `node` / …); this profile covers the **frontend/swap** layer those don't.
|
|
4
|
+
|
|
5
|
+
| Layer | Tool | How to assert |
|
|
6
|
+
|-------|------|---------------|
|
|
7
|
+
| Unit (server) | the server stack's unit tools | template-data/logic |
|
|
8
|
+
| Integration (server) | the server's component tools (TestClient/MockMvc/supertest) | the endpoint mutates state and returns the **right HTML fragment** |
|
|
9
|
+
| Frontend (template/wiring) | **JSDOM + MSW** — parse the rendered fragment in Node | the fragment carries the correct `hx-target` / `hx-swap` / `hx-trigger` / Alpine `x-data` attributes, without a browser |
|
|
10
|
+
| Browser (swap seam) | **Playwright (REQUIRED — Gate C)** | the swap actually updates the DOM in a real browser: right target, no stale swap, scripts re-init after swap |
|
|
11
|
+
|
|
12
|
+
**Recipe — testing the swap without a browser (the cheap 80%).** Request the fragment from the server (or render the template), load the HTML into **JSDOM**, and assert the hypermedia attributes and structure. This catches wrong/missing `hx-*` wiring fast and deterministically. It does **not** prove the browser applies the swap — that is Gate C's required Playwright test (`test-layer-gates.md`), because integration gives the client-side seam *zero* coverage.
|
|
13
|
+
|
|
14
|
+
**Notes.** Don't unit-test HTMX itself — test *your* attributes and *your* fragment. Visual fidelity of a swapped fragment → `../testing-techniques/screenshot.md`; markup correctness → `approval.md`. The advisor flags the browser requirement and defers harness/pipeline design to `cd-test-architecture`.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Stack profile — Vue (CSR / SPA)
|
|
2
|
+
|
|
3
|
+
Resolves `test-design-advisor`'s abstract layer (`test-pyramid.md`) for a client-side Vue app. Backend layers live in `node.md` (or the API's profile).
|
|
4
|
+
|
|
5
|
+
| Layer | Tool | How to assert |
|
|
6
|
+
|-------|------|---------------|
|
|
7
|
+
| Unit | Vitest | composables/stores (Pinia)/utils called directly — no mount |
|
|
8
|
+
| Component | Vue Testing Library (preferred) or `@vue/test-utils` + **MSW** | mount, interact via role/label queries, assert on rendered DOM; API mocked at the network |
|
|
9
|
+
| Integration (UI↔API) | Testing Library + MSW with realistic handlers | fetching, store wiring, error/loading states |
|
|
10
|
+
| E2E | Playwright / Cypress | critical journeys only |
|
|
11
|
+
|
|
12
|
+
**Notes.** Prefer **Vue Testing Library** (role/label queries) over `test-utils`' `findComponent`/`wrapper.vm` access — querying by what the user sees is more resilient and a11y-aware (`a11y-review`). Mock the network with **MSW**, not stubbed `fetch`/`axios`. Test Pinia stores as plain units. For visual fidelity use `../testing-techniques/screenshot.md`; don't lean on full-DOM snapshots for correctness.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Test Strategy
|
|
2
|
+
|
|
3
|
+
Reference file for `test-review`, `test-smell-review`, and the `test-design-advisor` skill. Where `test-smells.md` catalogues what to *avoid* and `test-doubles.md` covers *which collaborator stand-in* to use, this file covers the **up-front strategic choices** made before and while building a test: how the fixture is organized, how the test is driven, and how it reaches the system under test (SUT).
|
|
4
|
+
|
|
5
|
+
Source taxonomy: Gerard Meszaros, *xUnit Test Patterns* (xunitpatterns.com), "Test Strategy" patterns. Language- and framework-agnostic — described by role, not by any tool's API.
|
|
6
|
+
|
|
7
|
+
Core principle: **default to the simplest, most isolated strategy, and only trade isolation away under measured pressure.** Minimal + Fresh fixtures, scripted tests, and front-door interaction are the defaults; every step away from them buys speed or reach at the cost of clarity or coupling, and must be justified.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Test Fixture Strategy
|
|
12
|
+
|
|
13
|
+
The fixture is everything the test needs in place before it acts. Two independent decisions:
|
|
14
|
+
|
|
15
|
+
**A. Design — how much fixture?**
|
|
16
|
+
|
|
17
|
+
| Strategy | What it is | Use when | Cost / risk |
|
|
18
|
+
|---|---|---|---|
|
|
19
|
+
| **Minimal Fixture** | Build only what *this* test uses | **Default.** Always start here | — (this is the safe choice) |
|
|
20
|
+
| **Standard Fixture** | One fixture *design* reused across many tests (a "big design up front" for the suite) | Many tests genuinely share the same shape and a common design reduces duplication | Drifts into the **General Fixture** smell if it builds more than each test needs (see `test-smells.md`) |
|
|
21
|
+
|
|
22
|
+
**B. Lifecycle — how long does the instance live?** (orthogonal to A)
|
|
23
|
+
|
|
24
|
+
| Strategy | What it is | Use when | Cost / risk |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| **Fresh Fixture** | A new instance built and torn down per test — every test starts from a clean slate | **Default.** Guarantees isolation | Slow if setup is heavy (esp. persistent/DB fixtures) |
|
|
27
|
+
| **Immutable Shared Fixture** | One instance reused across tests but never mutated (read-only) | Fresh is too slow *and* tests only read the fixture | Requires discipline that nothing writes to it |
|
|
28
|
+
| **Shared Fixture** | One mutable instance reused across many tests / runs | Last resort, when even an immutable shared fixture won't do | Inter-test coupling, order-dependence, **Interacting Tests / Unrepeatable Test / Test Run War** (see `test-smells.md`) |
|
|
29
|
+
|
|
30
|
+
**Decision flow:** Minimal + Fresh → if too slow, make it an **Immutable Shared Fixture** → only then a mutable **Shared Fixture**, and if shared+persistent, isolate it (per-test DB sandbox / partition scheme) so runs can't collide. Standard vs ad-hoc is a separate axis: a Shared Fixture is always Standard, but a Standard Fixture can still be built Fresh per test.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. Test Automation Strategy
|
|
35
|
+
|
|
36
|
+
How the test is written and driven.
|
|
37
|
+
|
|
38
|
+
| Strategy | What it is | Use when | Cost / risk |
|
|
39
|
+
|---|---|---|---|
|
|
40
|
+
| **Scripted Test** | Test programs written by hand (the test code you write in any xUnit) | **Default**, and the only option that can *drive* development (TDD) — there's nothing to record before the code exists | Needs programming skill; not for non-technical authors |
|
|
41
|
+
| **Data-Driven Test** | A common interpreter holds the logic; cases live as rows in an external data table (one line per case) | Many cases vary only by input/expected data; lets non-programmers add cases (e.g. Fit/Fitnesse) | Interpreter is itself code to maintain; failures can be opaque; easy to over-build |
|
|
42
|
+
| **Recorded Test** | Capture interactions with a running SUT (usually through the UI) and replay them | Regression-testing a **finished, stable** app where little will change | Brittle to UI/behavior change; can't drive development; high re-record cost |
|
|
43
|
+
| **Test Automation Framework** | The harness that discovers, runs, verifies, and reports tests; you supply only test-specific logic | You **use** one (xUnit, etc.) — rarely build one | Building your own is almost always wasted effort |
|
|
44
|
+
|
|
45
|
+
Rule of thumb: **scripted by default; data-driven when the variation is purely data; recorded only for regression on something already done.**
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 3. SUT Interaction Strategy
|
|
50
|
+
|
|
51
|
+
How the test reaches the system under test.
|
|
52
|
+
|
|
53
|
+
| Strategy | What it is | Use when | Cost / risk |
|
|
54
|
+
|---|---|---|---|
|
|
55
|
+
| **Layer Test** | Treat each layer of a layered architecture as its own SUT; test layer *n* with tests standing in for *n+1* and (optionally) a Test Double for *n-1* | The system is layered and you want precise per-layer coverage | Requires real layer boundaries (see `hexagonal-architecture`); misses cross-layer integration bugs unless complemented by broader tests |
|
|
56
|
+
| **Back Door Manipulation** | Set up pre-state or verify post-state by bypassing the SUT's public API — direct DB/file/registry access | Front-door setup/verification is impractical, slow, or so verbose it obscures the test's intent | Couples the test to the SUT's internal state representation; can mask real integration defects — use sparingly and deliberately |
|
|
57
|
+
|
|
58
|
+
**Front-door first.** Prefer driving and checking the SUT through its real API; reach for a back door only when the front door makes the test unclear or infeasible.
|
|
59
|
+
|
|
60
|
+
> **Reconciling with the "Test Logic in Production" smell.** `test-smell-review` flags back doors *baked into shipped code* (`if (testMode)`, test-only endpoints) — that is always a smell. **Back Door Manipulation is different:** it is the *test* reaching around the API to touch state the SUT owns, with no change to production code. The first is production code that knows it's being tested; the second is a test that knows the SUT's internals. The former is banned; the latter is a costed trade-off. Don't conflate them in review.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## How this connects to the rest of the toolkit
|
|
65
|
+
|
|
66
|
+
- **`test-doubles.md`** — once Layer Test or Back Door Manipulation needs a collaborator stand-in, choose the double there.
|
|
67
|
+
- **`test-smells.md`** — the failure modes these strategies guard against (General Fixture, Interacting Tests, Mystery Guest, Test Logic in Production).
|
|
68
|
+
- **`test-pyramid.md`** — *where* a check belongs (granularity); this file is *how* the test at that layer is built.
|
|
69
|
+
- **`testability-patterns.md`** — the seams (dependency injection, etc.) that make Fresh Fixtures and front-door interaction possible without back doors.
|
|
70
|
+
- **`cd-test-architecture.md` / `microservice-testing.md`** — applying fixture and interaction strategy in a CD / distributed context.
|