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,341 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Detect xunit.v3-only constructs that break the v2 mutation-shim compile,
|
|
3
|
+
and classify each so a human can decide how to handle it (#1160, part of #1156).
|
|
4
|
+
|
|
5
|
+
The v2 shim is the only path that gives the mutant-kill loop per-test coverage
|
|
6
|
+
on an xunit.v3 suite (validated in #669). Its weakness is compile fragility:
|
|
7
|
+
any xunit-v3-only API breaks the shim's compile before Stryker runs a mutant.
|
|
8
|
+
This module turns that opaque C# compile error into a classified list the
|
|
9
|
+
mutation-kill agent presents at an **always-ask, never-auto-drop** human gate.
|
|
10
|
+
|
|
11
|
+
Two classification axes:
|
|
12
|
+
|
|
13
|
+
- ``compile_ability`` — ``clean-translatable`` (a mechanical v2 equivalent
|
|
14
|
+
exists) or ``no-v2-equivalent`` (the construct cannot compile under v2).
|
|
15
|
+
- ``coverage_impact`` — ``neutral`` (excluding the test from the shim changes
|
|
16
|
+
no coverage, e.g. ``[Fact(Explicit = true)]`` tests are skipped by default)
|
|
17
|
+
or ``bearing`` (the test runs and covers code, so excluding it inflates the
|
|
18
|
+
loop's survivor set — the operator must be told which lines go dark).
|
|
19
|
+
|
|
20
|
+
Pure and stdlib-only. The interactive gate and the actual shim-exclusion wiring
|
|
21
|
+
(#1159) consume this module's structured output; this module never edits a file.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import argparse
|
|
27
|
+
import json
|
|
28
|
+
import re
|
|
29
|
+
import sys
|
|
30
|
+
from collections.abc import Iterable, Sequence
|
|
31
|
+
from dataclasses import asdict, dataclass
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
|
|
34
|
+
CLEAN_TRANSLATABLE = "clean-translatable"
|
|
35
|
+
NO_V2_EQUIVALENT = "no-v2-equivalent"
|
|
36
|
+
COVERAGE_NEUTRAL = "neutral"
|
|
37
|
+
COVERAGE_BEARING = "bearing"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass(frozen=True)
|
|
41
|
+
class Construct:
|
|
42
|
+
name: str
|
|
43
|
+
pattern: re.Pattern[str]
|
|
44
|
+
compile_ability: str
|
|
45
|
+
coverage_impact: str
|
|
46
|
+
note: str
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# Each entry's classification is grounded in xunit.v3's documented surface —
|
|
50
|
+
# xunit.net/docs/getting-started/v3/whats-new (Explicit property, Assert.Skip*,
|
|
51
|
+
# TestContext, IAsyncLifetime→ValueTask, TheoryDataRow) — validated against real
|
|
52
|
+
# xunit behavior in #1156. C# attribute/keyword casing is fixed, so patterns are
|
|
53
|
+
# case-sensitive (no re.IGNORECASE).
|
|
54
|
+
_CONSTRUCTS: list[Construct] = [
|
|
55
|
+
Construct(
|
|
56
|
+
name="fact-explicit",
|
|
57
|
+
# [Fact(Explicit = true)] / [Theory(Explicit=true)] — the property does
|
|
58
|
+
# not exist on v2's FactAttribute.
|
|
59
|
+
#
|
|
60
|
+
# `(?:[^\]"]|"[^"]*")*` consumes either a non-quote character or a WHOLE
|
|
61
|
+
# quoted span, never a lone `"`. So the property match can never land
|
|
62
|
+
# inside a string (a DisplayName="Explicit = true" is still not a hit),
|
|
63
|
+
# but it can step over a completed one — the previous `[^\]"]*` could
|
|
64
|
+
# only refuse to enter a quote, which silently hid every form where a
|
|
65
|
+
# string-valued property came first: `[Fact(DisplayName = "x",
|
|
66
|
+
# Explicit = true)]`. The same construct is allowed to share its bracket
|
|
67
|
+
# (`[Trait("a","b"), Fact(Explicit = true)]`) rather than having to own
|
|
68
|
+
# it, matching the autofixture construct's reasoning below.
|
|
69
|
+
pattern=re.compile(
|
|
70
|
+
r"\[(?:[^\]\"]|\"[^\"]*\")*?\b(?:Fact|Theory)\s*\("
|
|
71
|
+
r"(?:[^\]\"]|\"[^\"]*\")*?\bExplicit\s*=\s*true"
|
|
72
|
+
),
|
|
73
|
+
compile_ability=NO_V2_EQUIVALENT,
|
|
74
|
+
coverage_impact=COVERAGE_NEUTRAL,
|
|
75
|
+
note="Explicit tests are skipped unless the run opts in (-explicit / "
|
|
76
|
+
"xunit.runner.json explicit=on), so under a normal mutation run they "
|
|
77
|
+
"contribute zero coverage — excluding them from the shim changes nothing. "
|
|
78
|
+
"Neutral ONLY while the run does not enable explicit tests.",
|
|
79
|
+
),
|
|
80
|
+
Construct(
|
|
81
|
+
name="assert-skip",
|
|
82
|
+
# Assert.Skip / Assert.SkipWhen / Assert.SkipUnless — dynamic skip is v3-only.
|
|
83
|
+
pattern=re.compile(r"\bAssert\.(?:Skip|SkipWhen|SkipUnless)\s*\("),
|
|
84
|
+
compile_ability=NO_V2_EQUIVALENT,
|
|
85
|
+
coverage_impact=COVERAGE_BEARING,
|
|
86
|
+
note="Dynamic skip has no v2 equivalent (v2 skip is a static attribute). "
|
|
87
|
+
"The test runs and covers code; excluding it hides that coverage.",
|
|
88
|
+
),
|
|
89
|
+
Construct(
|
|
90
|
+
name="test-context",
|
|
91
|
+
pattern=re.compile(r"\b(?:TestContext\.Current|ITestContext)\b"),
|
|
92
|
+
compile_ability=NO_V2_EQUIVALENT,
|
|
93
|
+
coverage_impact=COVERAGE_BEARING,
|
|
94
|
+
note="TestContext/ITestContext is v3-only with no v2 equivalent; the "
|
|
95
|
+
"test runs and covers code.",
|
|
96
|
+
),
|
|
97
|
+
Construct(
|
|
98
|
+
name="async-lifetime-valuetask",
|
|
99
|
+
# v3's IAsyncLifetime uses ValueTask InitializeAsync/DisposeAsync;
|
|
100
|
+
# v2 uses Task. Mechanically translatable but changes signatures.
|
|
101
|
+
pattern=re.compile(
|
|
102
|
+
r"\bValueTask\s+(?:InitializeAsync|DisposeAsync)\s*\("
|
|
103
|
+
),
|
|
104
|
+
compile_ability=CLEAN_TRANSLATABLE,
|
|
105
|
+
coverage_impact=COVERAGE_BEARING,
|
|
106
|
+
note="v3's IAsyncLifetime returns ValueTask (and extends IAsyncDisposable); "
|
|
107
|
+
"v2's returns Task. Translatable for the common CompletedTask case but not "
|
|
108
|
+
"purely a return-type swap — the interface surface differs and cached "
|
|
109
|
+
"ValueTask / IValueTaskSource bodies don't map trivially. Coverage-bearing "
|
|
110
|
+
"(runs real setup/teardown).",
|
|
111
|
+
),
|
|
112
|
+
Construct(
|
|
113
|
+
name="theory-data-row",
|
|
114
|
+
pattern=re.compile(r"\bTheoryDataRow\b"),
|
|
115
|
+
compile_ability=CLEAN_TRANSLATABLE,
|
|
116
|
+
coverage_impact=COVERAGE_BEARING,
|
|
117
|
+
note="v3's TheoryDataRow maps to v2's TheoryData<> for value-only rows; "
|
|
118
|
+
"rows carrying per-row metadata (Skip/Explicit/Traits/TestDisplayName) "
|
|
119
|
+
"lose it in translation. Coverage-bearing (the test runs and covers code).",
|
|
120
|
+
),
|
|
121
|
+
Construct(
|
|
122
|
+
name="autofixture-auto-data",
|
|
123
|
+
# AutoFixture.Xunit3's attribute family. The bare-name alternations are
|
|
124
|
+
# word-bounded so `MemberAutoData`/`InlineAutoData` each count once
|
|
125
|
+
# instead of also matching a nested `AutoData` — an inflated blocker
|
|
126
|
+
# count is an operator-visible defect at the gate (#1791). Matching the
|
|
127
|
+
# attribute NAME rather than requiring a leading `[` is deliberate:
|
|
128
|
+
# `[Theory, AutoData]` is the common form and has no bracket of its own.
|
|
129
|
+
pattern=re.compile(
|
|
130
|
+
r"\bAutoFixture\.Xunit3\b|\bAutoData\b|\bInlineAutoData\b"
|
|
131
|
+
r"|\bAutoMoqData\b|\bMemberAutoData\b"
|
|
132
|
+
),
|
|
133
|
+
compile_ability=NO_V2_EQUIVALENT,
|
|
134
|
+
coverage_impact=COVERAGE_BEARING,
|
|
135
|
+
note="AutoFixture.Xunit3's [AutoData]/[InlineAutoData]/[AutoMoqData]/"
|
|
136
|
+
"[MemberAutoData] target xunit.v3's attribute surface; the generated shim "
|
|
137
|
+
"mirrors the package reference verbatim, so the linked sources fail to "
|
|
138
|
+
"compile under xunit.v2. Porting means a manual `new Fixture()` in the "
|
|
139
|
+
"body or [Theory]+[InlineData] rows — heavy if pervasive. Coverage-bearing "
|
|
140
|
+
"(these tests run and cover code). A file that names AutoFixture.Xunit2 "
|
|
141
|
+
"and not .Xunit3 is NOT flagged (see _suppressed_constructs): the "
|
|
142
|
+
"attribute names are identical between the two packages, and the v2 one "
|
|
143
|
+
"already compiles in the shim.",
|
|
144
|
+
),
|
|
145
|
+
Construct(
|
|
146
|
+
name="assert-multiple",
|
|
147
|
+
pattern=re.compile(r"\bAssert\.Multiple\s*\("),
|
|
148
|
+
compile_ability=NO_V2_EQUIVALENT,
|
|
149
|
+
coverage_impact=COVERAGE_BEARING,
|
|
150
|
+
note="Assert.Multiple (grouped assertion reporting) is v3-only; v2 has no "
|
|
151
|
+
"equivalent, so the call must become sequential asserts. The test runs and "
|
|
152
|
+
"covers code.",
|
|
153
|
+
),
|
|
154
|
+
Construct(
|
|
155
|
+
name="assert-equivalent",
|
|
156
|
+
pattern=re.compile(r"\bAssert\.Equivalent\s*\("),
|
|
157
|
+
compile_ability=NO_V2_EQUIVALENT,
|
|
158
|
+
coverage_impact=COVERAGE_BEARING,
|
|
159
|
+
note="Assert.Equivalent (structural equivalence) is v3-only; under v2 it "
|
|
160
|
+
"must become an explicit member-by-member or collection assertion. The "
|
|
161
|
+
"test runs and covers code.",
|
|
162
|
+
),
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
@dataclass(frozen=True)
|
|
167
|
+
class Finding:
|
|
168
|
+
file: str
|
|
169
|
+
line: int
|
|
170
|
+
construct: str
|
|
171
|
+
compile_ability: str
|
|
172
|
+
coverage_impact: str
|
|
173
|
+
snippet: str
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
#: Constructs whose pattern alone cannot decide, keyed to the file-level signal
|
|
177
|
+
#: that resolves them. See :func:`_suppressed_constructs`.
|
|
178
|
+
_V2_AUTOFIXTURE = "AutoFixture.Xunit2"
|
|
179
|
+
_V3_AUTOFIXTURE = "AutoFixture.Xunit3"
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def _suppressed_constructs(text: str) -> frozenset[str]:
|
|
183
|
+
"""Constructs to skip for this file because a file-level signal clears them.
|
|
184
|
+
|
|
185
|
+
``[AutoData]`` and friends are spelled IDENTICALLY by AutoFixture.Xunit2 and
|
|
186
|
+
AutoFixture.Xunit3, so the attribute name alone cannot tell a shim blocker
|
|
187
|
+
from code that already compiles under v2. When a file declares the v2
|
|
188
|
+
package and not the v3 one, it is not a blocker — flagging it would stall
|
|
189
|
+
the operator gate on nothing and, if they chose ``exclude``, drop
|
|
190
|
+
v2-compatible tests out of measurement.
|
|
191
|
+
|
|
192
|
+
Absence of both signals is NOT treated as v2: the reference may be a global
|
|
193
|
+
using or live in the ``.csproj``, so the construct is still reported and the
|
|
194
|
+
operator decides. Blocking and asking is the safe default here; silently
|
|
195
|
+
proceeding into a shim that cannot compile is not.
|
|
196
|
+
"""
|
|
197
|
+
if _V2_AUTOFIXTURE in text and _V3_AUTOFIXTURE not in text:
|
|
198
|
+
return frozenset({"autofixture-auto-data"})
|
|
199
|
+
return frozenset()
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def scan_text(path: str, text: str) -> list[Finding]:
|
|
203
|
+
"""Return the v3-only constructs found in ``text``, attributed to ``path``.
|
|
204
|
+
|
|
205
|
+
Line-oriented so each finding carries a 1-based line number and the source
|
|
206
|
+
snippet the operator will see at the gate.
|
|
207
|
+
"""
|
|
208
|
+
findings: list[Finding] = []
|
|
209
|
+
suppressed = _suppressed_constructs(text)
|
|
210
|
+
for lineno, line in enumerate(text.splitlines(), start=1):
|
|
211
|
+
# Skip fully commented-out lines so a `// [Fact(Explicit = true)]` in
|
|
212
|
+
# dead code isn't flagged as a shim-breaker. A trailing comment on a
|
|
213
|
+
# real code line is left alone (the code before `//` still matters).
|
|
214
|
+
if line.lstrip().startswith("//"):
|
|
215
|
+
continue
|
|
216
|
+
for construct in _CONSTRUCTS:
|
|
217
|
+
if construct.name in suppressed:
|
|
218
|
+
continue
|
|
219
|
+
if construct.pattern.search(line):
|
|
220
|
+
findings.append(
|
|
221
|
+
Finding(
|
|
222
|
+
file=path,
|
|
223
|
+
line=lineno,
|
|
224
|
+
construct=construct.name,
|
|
225
|
+
compile_ability=construct.compile_ability,
|
|
226
|
+
coverage_impact=construct.coverage_impact,
|
|
227
|
+
snippet=line.strip(),
|
|
228
|
+
)
|
|
229
|
+
)
|
|
230
|
+
return findings
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def scan_file(path: Path) -> list[Finding]:
|
|
234
|
+
"""Scan a single .cs file. Missing/unreadable files yield no findings."""
|
|
235
|
+
try:
|
|
236
|
+
text = path.read_text(encoding="utf-8", errors="replace")
|
|
237
|
+
except (OSError, FileNotFoundError):
|
|
238
|
+
return []
|
|
239
|
+
return scan_text(str(path), text)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def scan_files(paths: Iterable[Path]) -> list[Finding]:
|
|
243
|
+
findings: list[Finding] = []
|
|
244
|
+
for p in paths:
|
|
245
|
+
findings.extend(scan_file(p))
|
|
246
|
+
return findings
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def files_with_findings(findings: Sequence[Finding]) -> list[str]:
|
|
250
|
+
"""Distinct files carrying at least one shim-breaking construct — the
|
|
251
|
+
candidate exclusion set the human gate offers (dedup, stable order)."""
|
|
252
|
+
seen: list[str] = []
|
|
253
|
+
for f in findings:
|
|
254
|
+
if f.file not in seen:
|
|
255
|
+
seen.append(f.file)
|
|
256
|
+
return seen
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
@dataclass(frozen=True)
|
|
260
|
+
class Summary:
|
|
261
|
+
total: int
|
|
262
|
+
files: int
|
|
263
|
+
neutral: int
|
|
264
|
+
bearing: int
|
|
265
|
+
recommendation: str
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def summarize(findings: Sequence[Finding]) -> Summary:
|
|
269
|
+
"""Roll findings up into counts plus an advisory sizing recommendation.
|
|
270
|
+
|
|
271
|
+
The recommendation is advisory only — the gate is always-ask (#1160). It
|
|
272
|
+
never auto-excludes; it tells the operator which way the blast radius leans.
|
|
273
|
+
"""
|
|
274
|
+
neutral = sum(1 for f in findings if f.coverage_impact == COVERAGE_NEUTRAL)
|
|
275
|
+
bearing = sum(1 for f in findings if f.coverage_impact == COVERAGE_BEARING)
|
|
276
|
+
files = len(files_with_findings(findings))
|
|
277
|
+
|
|
278
|
+
if not findings:
|
|
279
|
+
rec = (
|
|
280
|
+
"No shim-breaking xunit.v3 constructs found — the v2 shim path is "
|
|
281
|
+
"viable as-is."
|
|
282
|
+
)
|
|
283
|
+
elif bearing == 0:
|
|
284
|
+
rec = (
|
|
285
|
+
f"{neutral} coverage-neutral hit(s) across {files} file(s) "
|
|
286
|
+
"(Explicit tests skipped by default). Excluding them from the shim "
|
|
287
|
+
"is safe PROVIDED the run does not enable explicit tests "
|
|
288
|
+
"(-explicit / xunit.runner.json explicit=on) — confirm that, then "
|
|
289
|
+
"proceeding on the shim path is reasonable."
|
|
290
|
+
)
|
|
291
|
+
else:
|
|
292
|
+
rec = (
|
|
293
|
+
f"{bearing} coverage-bearing hit(s) across {files} file(s): "
|
|
294
|
+
"excluding these from the shim blinds the loop to their coverage. "
|
|
295
|
+
"If few and acceptable, exclude and proceed; if many, skip the loop "
|
|
296
|
+
"and run a single-pass advisory with coverage-analysis off."
|
|
297
|
+
)
|
|
298
|
+
return Summary(
|
|
299
|
+
total=len(findings),
|
|
300
|
+
files=files,
|
|
301
|
+
neutral=neutral,
|
|
302
|
+
bearing=bearing,
|
|
303
|
+
recommendation=rec,
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def _cli(argv: Sequence[str]) -> int:
|
|
308
|
+
parser = argparse.ArgumentParser(
|
|
309
|
+
description="Detect and classify xunit.v3-only, shim-breaking test constructs."
|
|
310
|
+
)
|
|
311
|
+
parser.add_argument("paths", nargs="+", help="test .cs files to scan")
|
|
312
|
+
parser.add_argument(
|
|
313
|
+
"--json", action="store_true", help="emit JSON instead of a table"
|
|
314
|
+
)
|
|
315
|
+
args = parser.parse_args(list(argv))
|
|
316
|
+
|
|
317
|
+
findings = scan_files(Path(p) for p in args.paths)
|
|
318
|
+
summary = summarize(findings)
|
|
319
|
+
|
|
320
|
+
if args.json:
|
|
321
|
+
print(
|
|
322
|
+
json.dumps(
|
|
323
|
+
{
|
|
324
|
+
"findings": [asdict(f) for f in findings],
|
|
325
|
+
"summary": asdict(summary),
|
|
326
|
+
},
|
|
327
|
+
indent=2,
|
|
328
|
+
)
|
|
329
|
+
)
|
|
330
|
+
else:
|
|
331
|
+
for f in findings:
|
|
332
|
+
print(
|
|
333
|
+
f"{f.file}:{f.line} {f.construct} "
|
|
334
|
+
f"[{f.compile_ability} / coverage-{f.coverage_impact}] {f.snippet}"
|
|
335
|
+
)
|
|
336
|
+
print(f"\n{summary.recommendation}")
|
|
337
|
+
return 0
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
if __name__ == "__main__": # pragma: no cover
|
|
341
|
+
sys.exit(_cli(sys.argv[1:]))
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: performance-benchmark
|
|
3
|
+
description: >-
|
|
4
|
+
Capture runtime performance metrics (Core Web Vitals, resource sizes, load
|
|
5
|
+
times) against defined budgets. Compare to baselines, flag regressions, and
|
|
6
|
+
maintain trend history. Complements the code-level performance-review agent
|
|
7
|
+
with actual runtime measurement.
|
|
8
|
+
role: worker
|
|
9
|
+
user-invocable: false
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Performance Benchmark Skill
|
|
13
|
+
|
|
14
|
+
Measures **runtime performance** (what the user experiences) — complements the static `performance-review` agent. Uses Playwright + Chromium to load pages, collect timing via the Performance API, measure resource sizes, and compare against baselines and budgets.
|
|
15
|
+
|
|
16
|
+
## Prerequisites
|
|
17
|
+
|
|
18
|
+
Installed by `/project-init` for frontend projects, or install manually:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx playwright install chromium
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
A running dev server (or accessible URL) for the pages being benchmarked.
|
|
25
|
+
|
|
26
|
+
## Metrics collected
|
|
27
|
+
|
|
28
|
+
### Core Web Vitals
|
|
29
|
+
|
|
30
|
+
| Metric | API | Budget Default | Measures |
|
|
31
|
+
|---|---|---|---|
|
|
32
|
+
| **LCP** (Largest Contentful Paint) | `PerformanceObserver('largest-contentful-paint')` | ≤ 2500ms | When main content is visible |
|
|
33
|
+
| **FID** (First Input Delay) | `PerformanceObserver('first-input')` | ≤ 100ms | First-interaction responsiveness |
|
|
34
|
+
| **CLS** (Cumulative Layout Shift) | `PerformanceObserver('layout-shift')` | ≤ 0.1 | Visual stability during load |
|
|
35
|
+
| **INP** (Interaction to Next Paint) | `PerformanceObserver('event')` | ≤ 200ms | Responsiveness across lifecycle |
|
|
36
|
+
|
|
37
|
+
### Navigation Timing
|
|
38
|
+
|
|
39
|
+
| Metric | API | Measures |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| **TTFB** | `performance.timing.responseStart - navigationStart` | Server response time |
|
|
42
|
+
| **FCP** (First Contentful Paint) | `PerformanceObserver('paint')` | When first content appears |
|
|
43
|
+
| **DOM Interactive** | `performance.timing.domInteractive` | When DOM is parseable |
|
|
44
|
+
| **Load Complete** | `performance.timing.loadEventEnd` | Page fully loaded |
|
|
45
|
+
|
|
46
|
+
### Resource metrics
|
|
47
|
+
|
|
48
|
+
| Metric | Collection | Budget Default |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| **Total transfer size** | `performance.getEntriesByType('resource')` sum | ≤ 500KB |
|
|
51
|
+
| **JS bundle size** | Resources with `.js` extension | ≤ 200KB |
|
|
52
|
+
| **CSS bundle size** | Resources with `.css` extension | ≤ 50KB |
|
|
53
|
+
| **Image payload** | Resources with image MIME types | ≤ 300KB |
|
|
54
|
+
| **Request count** | Resource entry count | ≤ 50 |
|
|
55
|
+
| **Largest resource** | Max single transfer size | ≤ 150KB |
|
|
56
|
+
|
|
57
|
+
## Collection procedure
|
|
58
|
+
|
|
59
|
+
Run a Playwright script that:
|
|
60
|
+
|
|
61
|
+
1. Launches headless Chromium with consistent viewport (1280×720) and CPU throttling (4x for mobile, 1x for desktop)
|
|
62
|
+
2. Navigates with `waitUntil: 'networkidle'`
|
|
63
|
+
3. Injects a Performance Observer for Web Vitals
|
|
64
|
+
4. Waits 2s after load for metrics to stabilize
|
|
65
|
+
5. Collects all `performance.getEntriesByType('resource')` entries
|
|
66
|
+
6. Returns structured JSON
|
|
67
|
+
|
|
68
|
+
Full script template: `references/benchmark-script.md`.
|
|
69
|
+
|
|
70
|
+
**Reliability**: run each page **3 times**, take the **median**. Use `--disable-gpu` and `--disable-extensions`. Clear cookies and use a fresh context per run. No network throttling by default; `--3g` flag for mobile simulation.
|
|
71
|
+
|
|
72
|
+
## Modes
|
|
73
|
+
|
|
74
|
+
### Baseline (`--baseline`)
|
|
75
|
+
|
|
76
|
+
Capture current metrics and save as the baseline:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
benchmarks/<slug>/baseline.json
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Commit baselines so the team shares a reference point.
|
|
83
|
+
|
|
84
|
+
### Compare (default)
|
|
85
|
+
|
|
86
|
+
Run and compare against the saved baseline:
|
|
87
|
+
|
|
88
|
+
| Change | Status |
|
|
89
|
+
|---|---|
|
|
90
|
+
| Metric worsened > 10% | `fail` (regression) |
|
|
91
|
+
| Metric worsened 5–10% | `warn` (degradation) |
|
|
92
|
+
| Metric improved > 10% | noted in report |
|
|
93
|
+
| Within ±5% | `pass` (stable) |
|
|
94
|
+
|
|
95
|
+
### Budget (`--budget`)
|
|
96
|
+
|
|
97
|
+
Check absolute budgets from `performance-budget.json` at the project root:
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"budgets": [
|
|
102
|
+
{
|
|
103
|
+
"path": "/",
|
|
104
|
+
"metrics": {
|
|
105
|
+
"LCP": 2500,
|
|
106
|
+
"CLS": 0.1,
|
|
107
|
+
"totalTransferSize": 500000,
|
|
108
|
+
"jsSize": 200000
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"path": "/dashboard",
|
|
113
|
+
"metrics": { "LCP": 3000, "totalTransferSize": 800000 }
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
If no budget file, fall back to defaults above.
|
|
120
|
+
|
|
121
|
+
### Trend (`--trend`)
|
|
122
|
+
|
|
123
|
+
Read `benchmarks/<slug>/history.jsonl` and produce a trend summary across the last N runs.
|
|
124
|
+
|
|
125
|
+
## Output format (JSON)
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"url": "http://localhost:3000/dashboard",
|
|
130
|
+
"timestamp": "2026-04-10T14:30:00Z",
|
|
131
|
+
"runs": 3,
|
|
132
|
+
"device": "desktop",
|
|
133
|
+
"metrics": {
|
|
134
|
+
"LCP": {"median": 1850, "p95": 2100, "unit": "ms"},
|
|
135
|
+
"FCP": {"median": 920, "p95": 1050, "unit": "ms"},
|
|
136
|
+
"CLS": {"median": 0.05, "p95": 0.08, "unit": "score"},
|
|
137
|
+
"INP": {"median": 120, "p95": 180, "unit": "ms"},
|
|
138
|
+
"TTFB": {"median": 210, "p95": 280, "unit": "ms"},
|
|
139
|
+
"loadComplete": {"median": 2400, "p95": 2800, "unit": "ms"}
|
|
140
|
+
},
|
|
141
|
+
"resources": {
|
|
142
|
+
"totalTransferSize": 342000,
|
|
143
|
+
"jsSize": 156000,
|
|
144
|
+
"cssSize": 28000,
|
|
145
|
+
"imageSize": 98000,
|
|
146
|
+
"requestCount": 34,
|
|
147
|
+
"largestResource": {"url": "/assets/main.js", "size": 95000}
|
|
148
|
+
},
|
|
149
|
+
"comparison": {
|
|
150
|
+
"baseline": "2026-04-08T10:00:00Z",
|
|
151
|
+
"regressions": [
|
|
152
|
+
{"metric": "LCP", "baseline": 1600, "current": 1850, "change": "+15.6%", "severity": "fail"}
|
|
153
|
+
],
|
|
154
|
+
"improvements": [],
|
|
155
|
+
"stable": ["FCP", "CLS", "INP", "TTFB"]
|
|
156
|
+
},
|
|
157
|
+
"budget": { "status": "pass", "violations": [] },
|
|
158
|
+
"status": "pass|warn|fail"
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Human-readable report template: [`examples/report-format.md`](examples/report-format.md).
|
|
163
|
+
|
|
164
|
+
## File storage
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
benchmarks/
|
|
168
|
+
├── <page-slug>/
|
|
169
|
+
│ ├── baseline.json # Committed — shared baseline
|
|
170
|
+
│ └── history.jsonl # Committed — trend data (append-only)
|
|
171
|
+
└── performance-budget.json # Committed — budget definitions
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Page slug derived from the URL path: `/dashboard` → `dashboard`, `/` → `index`.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Report Format Example
|
|
2
|
+
|
|
3
|
+
Human-readable benchmark report (emitted by `/benchmark` in prose mode).
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# Performance Benchmark: <URL>
|
|
7
|
+
|
|
8
|
+
**Date**: <timestamp>
|
|
9
|
+
**Device**: desktop | mobile
|
|
10
|
+
**Runs**: 3 (median reported)
|
|
11
|
+
|
|
12
|
+
## Core Web Vitals
|
|
13
|
+
|
|
14
|
+
| Metric | Value | Budget | Baseline | Change | Status |
|
|
15
|
+
|--------|-------|--------|----------|--------|--------|
|
|
16
|
+
| LCP | 1850ms | ≤2500ms | 1600ms | +15.6% | FAIL |
|
|
17
|
+
| FCP | 920ms | — | 900ms | +2.2% | PASS |
|
|
18
|
+
| CLS | 0.05 | ≤0.1 | 0.04 | +25% | PASS |
|
|
19
|
+
| INP | 120ms | ≤200ms | 115ms | +4.3% | PASS |
|
|
20
|
+
|
|
21
|
+
## Resource Budget
|
|
22
|
+
|
|
23
|
+
| Resource | Size | Budget | Status |
|
|
24
|
+
|----------|------|--------|--------|
|
|
25
|
+
| Total | 342KB | ≤500KB | PASS |
|
|
26
|
+
| JS | 156KB | ≤200KB | PASS |
|
|
27
|
+
| CSS | 28KB | ≤50KB | PASS |
|
|
28
|
+
| Images | 98KB | ≤300KB | PASS |
|
|
29
|
+
| Requests | 34 | ≤50 | PASS |
|
|
30
|
+
|
|
31
|
+
## Slowest Resources
|
|
32
|
+
|
|
33
|
+
| Resource | Size | Time |
|
|
34
|
+
|----------|------|------|
|
|
35
|
+
| /assets/main.js | 95KB | 450ms |
|
|
36
|
+
| ...
|
|
37
|
+
|
|
38
|
+
## Regressions
|
|
39
|
+
|
|
40
|
+
- **LCP**: +15.6% (1600ms → 1850ms) — investigate main.js growth
|
|
41
|
+
|
|
42
|
+
## Verdict: WARN (1 regression detected)
|
|
43
|
+
```
|