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,252 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Python port of scripts/build-wave-reconcile.sh (#612 / #572 Phase 3).
|
|
3
|
+
|
|
4
|
+
Serially merge a wave's completed slice branches into an integration branch,
|
|
5
|
+
then gate on the full suite before the next wave.
|
|
6
|
+
|
|
7
|
+
Order-independent: branches are merged in a deterministic (sorted) order.
|
|
8
|
+
Because same-wave slices touch disjoint files (build-wave.py's collision gate
|
|
9
|
+
guarantees it) the merged tree is identical regardless of the order slices
|
|
10
|
+
finished. If two branches unexpectedly touch the same file, the merge
|
|
11
|
+
conflicts — the script halts LOUDLY (exit 1, names the file) and **picks no
|
|
12
|
+
side** (it aborts the merge), starting no next-wave slice.
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
build_wave_reconcile.py --into <branch> --base <ref> [--test-cmd CMD] <slice-branch>...
|
|
16
|
+
|
|
17
|
+
Stdlib-only. See docs/python-hook-contract.md.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import argparse
|
|
23
|
+
import os
|
|
24
|
+
import re
|
|
25
|
+
import shlex
|
|
26
|
+
import subprocess
|
|
27
|
+
import sys
|
|
28
|
+
from collections.abc import Sequence
|
|
29
|
+
|
|
30
|
+
# Default hard ceiling for --test-cmd so a hung suite can never block the
|
|
31
|
+
# wave pipeline indefinitely. Override (test-only injection seam) via
|
|
32
|
+
# BUILD_WAVE_RECONCILE_TEST_CMD_TIMEOUT.
|
|
33
|
+
_DEFAULT_TEST_CMD_TIMEOUT_SECONDS = 1800.0
|
|
34
|
+
|
|
35
|
+
# Characters that require real shell interpretation (pipes, chaining,
|
|
36
|
+
# redirects, expansion, globs, backticks). A --test-cmd containing none of
|
|
37
|
+
# these is a plain word list and can run directly (no shell hop needed).
|
|
38
|
+
_SHELL_METACHARACTERS_RE = re.compile(r"[|&;<>$`*?~]")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _test_cmd_timeout_seconds() -> float:
|
|
42
|
+
raw = os.environ.get("BUILD_WAVE_RECONCILE_TEST_CMD_TIMEOUT")
|
|
43
|
+
if raw:
|
|
44
|
+
try:
|
|
45
|
+
return float(raw)
|
|
46
|
+
except ValueError:
|
|
47
|
+
pass
|
|
48
|
+
return _DEFAULT_TEST_CMD_TIMEOUT_SECONDS
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _git(args: Sequence[str], capture: bool = True) -> subprocess.CompletedProcess:
|
|
52
|
+
"""Run `git <args>` with stdout+stderr captured by default."""
|
|
53
|
+
return subprocess.run(
|
|
54
|
+
["git", *args],
|
|
55
|
+
capture_output=capture,
|
|
56
|
+
text=True,
|
|
57
|
+
check=False,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _branch_exists(name: str) -> bool:
|
|
62
|
+
r = _git(["rev-parse", "--verify", "--quiet", name])
|
|
63
|
+
return r.returncode == 0
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _checkout_existing(into: str) -> int:
|
|
67
|
+
r = _git(["checkout", into])
|
|
68
|
+
if r.returncode != 0:
|
|
69
|
+
print(
|
|
70
|
+
f"build-wave-reconcile: cannot check out existing integration "
|
|
71
|
+
f"branch '{into}'.",
|
|
72
|
+
file=sys.stderr,
|
|
73
|
+
)
|
|
74
|
+
return 2
|
|
75
|
+
return 0
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _create_from_base(into: str, base: str) -> int:
|
|
79
|
+
r = _git(["checkout", "-B", into, base])
|
|
80
|
+
if r.returncode != 0:
|
|
81
|
+
print(
|
|
82
|
+
f"build-wave-reconcile: cannot create integration branch '{into}' "
|
|
83
|
+
f"from '{base}'.",
|
|
84
|
+
file=sys.stderr,
|
|
85
|
+
)
|
|
86
|
+
return 2
|
|
87
|
+
return 0
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _merge_branch(branch: str) -> int:
|
|
91
|
+
r = _git(["merge", "--no-ff", "--no-edit", branch])
|
|
92
|
+
if r.returncode != 0:
|
|
93
|
+
# Capture conflicted paths BEFORE aborting.
|
|
94
|
+
diff = _git(["diff", "--name-only", "--diff-filter=U"])
|
|
95
|
+
conflicted = ", ".join(
|
|
96
|
+
line for line in diff.stdout.splitlines() if line.strip()
|
|
97
|
+
)
|
|
98
|
+
_git(["merge", "--abort"])
|
|
99
|
+
print(
|
|
100
|
+
f"build-wave-reconcile: CONFLICT — same-wave branches touch "
|
|
101
|
+
f"'{conflicted}'.",
|
|
102
|
+
file=sys.stderr,
|
|
103
|
+
)
|
|
104
|
+
print(
|
|
105
|
+
" No side was chosen (merge aborted). Halting; start no next-wave slice.",
|
|
106
|
+
file=sys.stderr,
|
|
107
|
+
)
|
|
108
|
+
return 1
|
|
109
|
+
return 0
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _run_test_cmd(cmd: str) -> int:
|
|
113
|
+
"""Run the caller-supplied gate, bounded by a hard timeout so a hung
|
|
114
|
+
suite can never block the pipeline indefinitely.
|
|
115
|
+
|
|
116
|
+
Bash used `eval` with stdout+stderr silenced — mirror that exactly for
|
|
117
|
+
byte-parity of the diagnostic line. A command with no shell
|
|
118
|
+
metacharacters is a plain word list and runs directly (list-form,
|
|
119
|
+
shell=False); a command that chains, pipes, redirects, or expands
|
|
120
|
+
still needs the shell to interpret it (list-form can't express that
|
|
121
|
+
syntax), so it runs via shell=True as before.
|
|
122
|
+
"""
|
|
123
|
+
timeout = _test_cmd_timeout_seconds()
|
|
124
|
+
use_shell = bool(_SHELL_METACHARACTERS_RE.search(cmd))
|
|
125
|
+
args: str | list[str] = cmd if use_shell else shlex.split(cmd)
|
|
126
|
+
try:
|
|
127
|
+
proc = subprocess.run(
|
|
128
|
+
args,
|
|
129
|
+
shell=use_shell,
|
|
130
|
+
capture_output=True,
|
|
131
|
+
check=False,
|
|
132
|
+
timeout=timeout,
|
|
133
|
+
)
|
|
134
|
+
except subprocess.TimeoutExpired:
|
|
135
|
+
print(
|
|
136
|
+
f"build-wave-reconcile: full-suite gate TIMED OUT after {timeout:g}s "
|
|
137
|
+
f"('{cmd}'). Halting before the next wave.",
|
|
138
|
+
file=sys.stderr,
|
|
139
|
+
)
|
|
140
|
+
return 1
|
|
141
|
+
except (OSError, ValueError) as e:
|
|
142
|
+
print(
|
|
143
|
+
f"build-wave-reconcile: full-suite gate FAILED ('{cmd}'): {e}. "
|
|
144
|
+
"Halting before the next wave.",
|
|
145
|
+
file=sys.stderr,
|
|
146
|
+
)
|
|
147
|
+
return 1
|
|
148
|
+
if proc.returncode != 0:
|
|
149
|
+
print(
|
|
150
|
+
f"build-wave-reconcile: full-suite gate FAILED ('{cmd}'). "
|
|
151
|
+
"Halting before the next wave.",
|
|
152
|
+
file=sys.stderr,
|
|
153
|
+
)
|
|
154
|
+
return 1
|
|
155
|
+
return 0
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def _parse_argv(argv: list[str]) -> argparse.Namespace | int:
|
|
159
|
+
ap = argparse.ArgumentParser(add_help=False)
|
|
160
|
+
ap.add_argument("--into", default="")
|
|
161
|
+
ap.add_argument("--base", default="")
|
|
162
|
+
ap.add_argument("--test-cmd", dest="test_cmd", default="")
|
|
163
|
+
ap.add_argument("branches", nargs="*")
|
|
164
|
+
# Preserve the bash script's error contract: any unknown option or missing
|
|
165
|
+
# required flag exits 2 with the same usage line.
|
|
166
|
+
known: list[str] = []
|
|
167
|
+
branches: list[str] = []
|
|
168
|
+
i = 0
|
|
169
|
+
while i < len(argv):
|
|
170
|
+
tok = argv[i]
|
|
171
|
+
if tok in ("--into", "--base", "--test-cmd"):
|
|
172
|
+
if i + 1 >= len(argv):
|
|
173
|
+
_usage()
|
|
174
|
+
return 2
|
|
175
|
+
known.extend([tok, argv[i + 1]])
|
|
176
|
+
i += 2
|
|
177
|
+
elif tok.startswith("-"):
|
|
178
|
+
print(f"unknown option: {tok}", file=sys.stderr)
|
|
179
|
+
return 2
|
|
180
|
+
else:
|
|
181
|
+
branches.append(tok)
|
|
182
|
+
i += 1
|
|
183
|
+
parsed = ap.parse_args(known)
|
|
184
|
+
parsed.branches = branches
|
|
185
|
+
if not parsed.into or not parsed.base or not parsed.branches:
|
|
186
|
+
_usage()
|
|
187
|
+
return 2
|
|
188
|
+
return parsed
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _usage() -> None:
|
|
192
|
+
# Match the .sh's exact wording (name kept as `build-wave-reconcile.sh`)
|
|
193
|
+
# so bash and python emit byte-identical stderr on usage errors — the
|
|
194
|
+
# parity harness gates on this.
|
|
195
|
+
print(
|
|
196
|
+
"usage: build-wave-reconcile.sh --into <branch> --base <ref> "
|
|
197
|
+
"[--test-cmd CMD] <slice-branch>...",
|
|
198
|
+
file=sys.stderr,
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def main(argv: list[str]) -> int:
|
|
203
|
+
parsed = _parse_argv(argv)
|
|
204
|
+
if isinstance(parsed, int):
|
|
205
|
+
return parsed
|
|
206
|
+
|
|
207
|
+
into: str = parsed.into
|
|
208
|
+
base: str = parsed.base
|
|
209
|
+
test_cmd: str = parsed.test_cmd
|
|
210
|
+
branches: list[str] = parsed.branches
|
|
211
|
+
|
|
212
|
+
# Deterministic merge order → reproducible tree regardless of caller order.
|
|
213
|
+
sorted_branches = sorted(branches)
|
|
214
|
+
|
|
215
|
+
# If $INTO exists, reconcile onto its current tip so caller WIP commits
|
|
216
|
+
# (spec/plan on the integration branch made before or between waves) stay
|
|
217
|
+
# in the ancestry. Only create $INTO fresh from $BASE when it does not
|
|
218
|
+
# exist yet — resetting an existing $INTO to $BASE would silently discard
|
|
219
|
+
# those WIP commits.
|
|
220
|
+
if _branch_exists(into):
|
|
221
|
+
rc = _checkout_existing(into)
|
|
222
|
+
else:
|
|
223
|
+
rc = _create_from_base(into, base)
|
|
224
|
+
if rc != 0:
|
|
225
|
+
return rc
|
|
226
|
+
|
|
227
|
+
for branch in sorted_branches:
|
|
228
|
+
rc = _merge_branch(branch)
|
|
229
|
+
if rc != 0:
|
|
230
|
+
return rc
|
|
231
|
+
|
|
232
|
+
if test_cmd:
|
|
233
|
+
rc = _run_test_cmd(test_cmd)
|
|
234
|
+
if rc != 0:
|
|
235
|
+
return rc
|
|
236
|
+
|
|
237
|
+
# Match the .sh's exact status suffix. Bash does:
|
|
238
|
+
# suite gate ${TESTCMD:+passed}${TESTCMD:-skipped}.
|
|
239
|
+
# Which expands to 'passed<TESTCMD>' when TESTCMD is set, and
|
|
240
|
+
# 'skipped' when it's not. That's a shell-substitution quirk in the
|
|
241
|
+
# .sh, not a spec — but byte-parity is the contract.
|
|
242
|
+
gate_status = f"passed{test_cmd}" if test_cmd else "skipped"
|
|
243
|
+
|
|
244
|
+
print(
|
|
245
|
+
f"build-wave-reconcile: merged {len(sorted_branches)} slice "
|
|
246
|
+
f"branch(es) into '{into}'; suite gate {gate_status}."
|
|
247
|
+
)
|
|
248
|
+
return 0
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
if __name__ == "__main__":
|
|
252
|
+
raise SystemExit(main(sys.argv[1:]))
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Python port of scripts/build-worktree-baseref.sh (#587 / #572 Phase 2).
|
|
3
|
+
|
|
4
|
+
Detects the effective worktree.baseRef setting so /build can warn loudly
|
|
5
|
+
(never mutate) when it is not "head".
|
|
6
|
+
|
|
7
|
+
Issue #553 / plans/build-worktree-inherits-caller-head.md Slice 1.
|
|
8
|
+
|
|
9
|
+
Background: Claude Code's `worktree.baseRef: "head"` setting makes
|
|
10
|
+
isolation:"worktree" Agent-tool dispatch branch child worktrees from the
|
|
11
|
+
caller's local HEAD instead of origin/<default> ("fresh", the default).
|
|
12
|
+
docs/spikes/worktree-baseref-head-spike.md empirically confirmed this
|
|
13
|
+
setting is honored only at project (.claude/settings.json) and user
|
|
14
|
+
(~/.claude/settings.json) scope — NOT at project-local
|
|
15
|
+
(.claude/settings.local.json) or plugin (plugins/<name>/settings.json)
|
|
16
|
+
scope. This script's default search order reflects only the two scopes
|
|
17
|
+
that are actually honored.
|
|
18
|
+
|
|
19
|
+
Usage:
|
|
20
|
+
build_worktree_baseref.py detect
|
|
21
|
+
|
|
22
|
+
Prints exactly one token to stdout and always exits 0 (degrade-never-abort):
|
|
23
|
+
head — effective setting is "head"
|
|
24
|
+
fresh — effective setting is "fresh"
|
|
25
|
+
unset — no honored settings file sets worktree.baseRef
|
|
26
|
+
unknown — detection failed — treat as fail-safe
|
|
27
|
+
|
|
28
|
+
Env vars (TEST-ONLY injection seam):
|
|
29
|
+
BASEREF_SETTINGS_PATHS colon-separated list of settings files,
|
|
30
|
+
highest precedence first. Defaults to
|
|
31
|
+
".claude/settings.json:$HOME/.claude/settings.json".
|
|
32
|
+
|
|
33
|
+
Stdlib-only (json/os/pathlib/sys). See ADR 0014.
|
|
34
|
+
|
|
35
|
+
Refs: #572, #577, #553.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
from __future__ import annotations
|
|
39
|
+
|
|
40
|
+
import json
|
|
41
|
+
import os
|
|
42
|
+
import sys
|
|
43
|
+
from pathlib import Path
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _default_settings_paths() -> str:
|
|
47
|
+
home = os.environ.get("HOME", "")
|
|
48
|
+
return f".claude/settings.json:{home}/.claude/settings.json"
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _settings_paths() -> list[str]:
|
|
52
|
+
raw = os.environ.get("BASEREF_SETTINGS_PATHS")
|
|
53
|
+
if raw is None:
|
|
54
|
+
raw = _default_settings_paths()
|
|
55
|
+
# Preserve the .sh's colon-separated parsing including empty segments
|
|
56
|
+
# (the `[ -n "$f" ] || continue` guard skips them).
|
|
57
|
+
return [p for p in raw.split(":") if p]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _load_worktree_baseref(path: Path) -> str | None:
|
|
61
|
+
"""Return the .worktree.baseRef value from `path`, or None on any error.
|
|
62
|
+
|
|
63
|
+
None distinguishes 'file unreadable or malformed' (skip to next file)
|
|
64
|
+
from an empty string (parseable but no baseRef — also skip).
|
|
65
|
+
"""
|
|
66
|
+
try:
|
|
67
|
+
with path.open("r", encoding="utf-8") as fh:
|
|
68
|
+
data = json.load(fh)
|
|
69
|
+
except (OSError, json.JSONDecodeError, ValueError):
|
|
70
|
+
return None
|
|
71
|
+
if not isinstance(data, dict):
|
|
72
|
+
return None
|
|
73
|
+
wt = data.get("worktree")
|
|
74
|
+
if not isinstance(wt, dict):
|
|
75
|
+
return None
|
|
76
|
+
value = wt.get("baseRef")
|
|
77
|
+
if not isinstance(value, str):
|
|
78
|
+
return None
|
|
79
|
+
return value
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _detect() -> str:
|
|
83
|
+
"""Walk settings files in precedence order. First honored value wins.
|
|
84
|
+
|
|
85
|
+
Every file that fails to parse or lacks the key is skipped rather than
|
|
86
|
+
aborting the whole detection. The .sh also gates on `command -v jq`;
|
|
87
|
+
the .py has no such external dependency but keeps the 'unknown' exit
|
|
88
|
+
reserved for future contract expansion.
|
|
89
|
+
"""
|
|
90
|
+
for raw in _settings_paths():
|
|
91
|
+
path = Path(raw)
|
|
92
|
+
if not path.is_file():
|
|
93
|
+
continue
|
|
94
|
+
value = _load_worktree_baseref(path)
|
|
95
|
+
if value == "head" or value == "fresh":
|
|
96
|
+
return value
|
|
97
|
+
return "unset"
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def main(argv: list[str] | None = None) -> int:
|
|
101
|
+
args = sys.argv[1:] if argv is None else list(argv)
|
|
102
|
+
if not args or args[0] != "detect":
|
|
103
|
+
# Byte-parity with the .sh's usage message: name it after the .sh
|
|
104
|
+
# executable so operators searching for the exact string in logs
|
|
105
|
+
# find it regardless of which implementation ran.
|
|
106
|
+
sys.stderr.write("Usage: build-worktree-baseref.sh detect\n")
|
|
107
|
+
return 2
|
|
108
|
+
sys.stdout.write(_detect() + "\n")
|
|
109
|
+
return 0
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
if __name__ == "__main__": # pragma: no cover
|
|
113
|
+
sys.exit(main())
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate that every review agent declares a body-level Scope: field.
|
|
3
|
+
|
|
4
|
+
``Scope:`` is a body-level declaration, not frontmatter (issue #1333 — it is
|
|
5
|
+
not part of the official Claude Code sub-agent contract; see
|
|
6
|
+
plugins/marketplace-dev/knowledge/agent-contract.json).
|
|
7
|
+
|
|
8
|
+
Exit 0 if all review agents have a Scope: line in their body.
|
|
9
|
+
Exit 1 with a list of offending agents if any are missing.
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
python3 check_agent_scope.py [--agents-dir <path>]
|
|
13
|
+
|
|
14
|
+
The agents directory defaults to plugins/dev-team/agents/ relative to the
|
|
15
|
+
repo root (inferred from this script's location).
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
# Keeps PEP 585 annotations (`list[str]`) as strings, so this module imports on
|
|
19
|
+
# the floor ADR 0014 sets for shipped code.
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import argparse
|
|
23
|
+
import sys
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent / "lib"))
|
|
27
|
+
# The `agents/` directory root is the shared, resolved single source of
|
|
28
|
+
# truth in hooks/lib (#1904 item 3) — scripts/ -> hooks/lib/ is the correct
|
|
29
|
+
# dependency direction (see review_agent_registry.py's own docstring). This
|
|
30
|
+
# script globs all agents/*.md (not just *-review.md), so it uses only
|
|
31
|
+
# default_agents_dir() for the directory path — never
|
|
32
|
+
# registered_review_agent_names()/find_review_agent_files(), which are
|
|
33
|
+
# review-agent-specific.
|
|
34
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "hooks" / "lib"))
|
|
35
|
+
|
|
36
|
+
# Review agents are the agents named in the Review Agents section of
|
|
37
|
+
# knowledge/agent-registry.md. Rather than parsing that file we check all
|
|
38
|
+
# agents/*.md files that contain a 'description:' frontmatter field and are
|
|
39
|
+
# not one of the well-known non-review agents. The exclusion set is shared
|
|
40
|
+
# with select_lenses.py (#1516) — see scripts/lib/review_roster.py.
|
|
41
|
+
from review_agent_registry import default_agents_dir
|
|
42
|
+
from review_roster import NON_REVIEW_AGENTS
|
|
43
|
+
from review_roster import SCOPE_LINE_RE as SCOPE_RE
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def has_frontmatter(text: str) -> bool:
|
|
47
|
+
"""True if the file opens with a YAML frontmatter block."""
|
|
48
|
+
return text.startswith("---") and "---" in text[3:]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def strip_frontmatter(text: str) -> str:
|
|
52
|
+
"""Return the body (everything after the frontmatter block)."""
|
|
53
|
+
if not text.startswith("---"):
|
|
54
|
+
return text
|
|
55
|
+
end = text.find("\n---", 3)
|
|
56
|
+
if end == -1:
|
|
57
|
+
return text
|
|
58
|
+
after = text.find("\n", end + 1)
|
|
59
|
+
return text[after + 1:] if after != -1 else ""
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def declares_scope(body: str) -> bool:
|
|
63
|
+
"""True if the body contains a Scope: line (scalar or block-list)."""
|
|
64
|
+
return any(SCOPE_RE.match(line) for line in body.splitlines())
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def main() -> int:
|
|
68
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
69
|
+
parser.add_argument(
|
|
70
|
+
"--agents-dir",
|
|
71
|
+
type=Path,
|
|
72
|
+
default=None,
|
|
73
|
+
help="Path to the agents/ directory (default: auto-detect from script location)",
|
|
74
|
+
)
|
|
75
|
+
args = parser.parse_args()
|
|
76
|
+
|
|
77
|
+
if args.agents_dir is not None:
|
|
78
|
+
agents_dir = args.agents_dir
|
|
79
|
+
else:
|
|
80
|
+
agents_dir = default_agents_dir()
|
|
81
|
+
|
|
82
|
+
if not agents_dir.is_dir():
|
|
83
|
+
print(f"ERROR: agents directory not found: {agents_dir}", file=sys.stderr)
|
|
84
|
+
return 1
|
|
85
|
+
|
|
86
|
+
missing: list[str] = []
|
|
87
|
+
for agent_file in sorted(agents_dir.glob("*.md")):
|
|
88
|
+
name = agent_file.stem
|
|
89
|
+
if name in NON_REVIEW_AGENTS:
|
|
90
|
+
continue
|
|
91
|
+
text = agent_file.read_text(encoding="utf-8")
|
|
92
|
+
if not has_frontmatter(text):
|
|
93
|
+
# No frontmatter — skip (not an agent file)
|
|
94
|
+
continue
|
|
95
|
+
body = strip_frontmatter(text)
|
|
96
|
+
if not declares_scope(body):
|
|
97
|
+
missing.append(name)
|
|
98
|
+
|
|
99
|
+
if missing:
|
|
100
|
+
print("FAIL: the following review agents are missing a 'Scope:' body declaration:")
|
|
101
|
+
for name in missing:
|
|
102
|
+
print(f" - {name}")
|
|
103
|
+
print(
|
|
104
|
+
"\nAdd one of: 'Scope: always' (language-agnostic, every diff), a bullet list "
|
|
105
|
+
"of glob patterns (file-type-scoped), 'Scope: added-only' + globs (only newly-"
|
|
106
|
+
"added matching files), or 'Scope: on-demand' (never per-diff — dispatched by "
|
|
107
|
+
"name or by /repo-review). See plugins/dev-team/docs/developer-notes.md."
|
|
108
|
+
)
|
|
109
|
+
return 1
|
|
110
|
+
|
|
111
|
+
print(f"OK: all {len(list(agents_dir.glob('*.md'))) - len(NON_REVIEW_AGENTS)} "
|
|
112
|
+
f"review agents declare a Scope: field.")
|
|
113
|
+
return 0
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
if __name__ == "__main__":
|
|
117
|
+
sys.exit(main())
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate the non-review agent→code-intelligence-tool mapping (#1108).
|
|
3
|
+
|
|
4
|
+
#1102 granted the 24 read-only ``*-review`` agents a fixed MCP tool set
|
|
5
|
+
(``check_review_agent_mcp_tools.py``). #1108 extends the grant to the non-review
|
|
6
|
+
team agents by **tier**:
|
|
7
|
+
|
|
8
|
+
- **narrow** — codegraph + the four Repowise tools (``BASE_MCP_TOOLS``):
|
|
9
|
+
``software-engineer``, ``mutation-kill``, ``qa-engineer``, ``data-flow-tracer``.
|
|
10
|
+
``data-flow-tracer`` additionally gets a scoped ``Bash(graphify *)`` grant (its
|
|
11
|
+
sole execution capability — it invokes the Graphify CLI for cross-layer traces).
|
|
12
|
+
- **rationale** — the narrow set plus ``get_why`` (code-existence rationale):
|
|
13
|
+
``adr-author``, ``architect``, ``security-engineer``, ``platform-engineer``,
|
|
14
|
+
``codebase-recon``.
|
|
15
|
+
|
|
16
|
+
Coverage is the **union** of two branches so a named target is always validated
|
|
17
|
+
even when it carries no persona marker, and a *new* team agent can't silently
|
|
18
|
+
escape the mapping:
|
|
19
|
+
|
|
20
|
+
- (a) every agent named in ``TIER_CONFIG`` — deterministic coverage of the known
|
|
21
|
+
targets (``codebase-recon`` is ``Enforcement: script``; ``mutation-kill`` carries
|
|
22
|
+
neither persona marker — branch (b) alone would miss both).
|
|
23
|
+
- (b) the structural sweep — team agents detected by a ``## Behavioral Guidelines``
|
|
24
|
+
section *or* an ``Enforcement: script`` body line (not frontmatter — issue
|
|
25
|
+
#1333), minus ``*-review.md``, minus the documented ``EXCLUSIONS``. A swept
|
|
26
|
+
agent in neither ``TIER_CONFIG`` nor ``EXCLUSIONS`` is *unclassified* and
|
|
27
|
+
fails — the self-extension net.
|
|
28
|
+
|
|
29
|
+
A granted MCP tool whose server is absent is inert at runtime; agents fall back to
|
|
30
|
+
Read/Grep/Glob.
|
|
31
|
+
|
|
32
|
+
Usage (repo-root-relative — this script mutates the agent files next to
|
|
33
|
+
wherever it itself resides, so it must run against the maintainer's own
|
|
34
|
+
checkout, never a `${CLAUDE_PLUGIN_ROOT}`-qualified installed-cache path):
|
|
35
|
+
python3 plugins/dev-team/scripts/check_agent_tool_mapping.py [--agents-dir <path>]
|
|
36
|
+
python3 plugins/dev-team/scripts/check_agent_tool_mapping.py --fix # append missing tier tools
|
|
37
|
+
python3 plugins/dev-team/scripts/check_agent_tool_mapping.py --json # machine-readable report
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from __future__ import annotations
|
|
41
|
+
|
|
42
|
+
import argparse
|
|
43
|
+
import json
|
|
44
|
+
import re
|
|
45
|
+
import sys
|
|
46
|
+
from pathlib import Path
|
|
47
|
+
|
|
48
|
+
sys.path.insert(0, str(Path(__file__).parent / "lib"))
|
|
49
|
+
# The `agents/` directory root is the shared, resolved single source of
|
|
50
|
+
# truth in hooks/lib (#1904 item 3) — scripts/ -> hooks/lib/ is the correct
|
|
51
|
+
# dependency direction (see review_agent_registry.py's own docstring).
|
|
52
|
+
sys.path.insert(0, str(Path(__file__).parent.parent / "hooks" / "lib"))
|
|
53
|
+
|
|
54
|
+
from mcp_tool_grants import (
|
|
55
|
+
BASE_MCP_TOOLS,
|
|
56
|
+
GET_WHY,
|
|
57
|
+
build_json_report,
|
|
58
|
+
run_grants_check,
|
|
59
|
+
)
|
|
60
|
+
from review_agent_registry import default_agents_dir
|
|
61
|
+
|
|
62
|
+
# Tiers ---------------------------------------------------------------------
|
|
63
|
+
NARROW = list(BASE_MCP_TOOLS)
|
|
64
|
+
RATIONALE = BASE_MCP_TOOLS + [GET_WHY]
|
|
65
|
+
_GRAPHIFY_BASH = "Bash(graphify *)"
|
|
66
|
+
|
|
67
|
+
# The canonical non-review mapping. Each agent → the tool names its tier requires
|
|
68
|
+
# in `tools:` (merge target, never a replacement — existing grants are preserved).
|
|
69
|
+
TIER_CONFIG = {
|
|
70
|
+
"software-engineer": NARROW,
|
|
71
|
+
"mutation-kill": NARROW,
|
|
72
|
+
"qa-engineer": NARROW,
|
|
73
|
+
"data-flow-tracer": NARROW + [_GRAPHIFY_BASH],
|
|
74
|
+
"adr-author": RATIONALE,
|
|
75
|
+
"architect": RATIONALE,
|
|
76
|
+
"security-engineer": RATIONALE,
|
|
77
|
+
"platform-engineer": RATIONALE,
|
|
78
|
+
"codebase-recon": RATIONALE,
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
# Team agents the structural sweep surfaces but the mapping deliberately does NOT
|
|
82
|
+
# grant (dispatch-only, non-code-structure roles). Exactly the swept agents absent
|
|
83
|
+
# from TIER_CONFIG — no more, no less. `session-analysis` and `mutation-kill` carry
|
|
84
|
+
# neither marker, so the sweep never surfaces them (they need no exclusion entry;
|
|
85
|
+
# mutation-kill is covered via TIER_CONFIG).
|
|
86
|
+
EXCLUSIONS = {
|
|
87
|
+
"orchestrator",
|
|
88
|
+
"product-manager",
|
|
89
|
+
"ui-ux-designer",
|
|
90
|
+
"tech-writer",
|
|
91
|
+
"progress-guardian",
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
_BEHAVIORAL_RE = re.compile(r"^##\s+Behavioral Guidelines\s*$", re.MULTILINE)
|
|
95
|
+
_ENFORCEMENT_RE = re.compile(r"^Enforcement:\s*script\s*$", re.MULTILINE)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def is_team_agent(text: str) -> bool:
|
|
99
|
+
"""True if the file is a team agent per agent-audit §2c's markers.
|
|
100
|
+
|
|
101
|
+
A team agent carries a ``## Behavioral Guidelines`` section OR declares
|
|
102
|
+
``Enforcement: script`` (a body-level declaration, not frontmatter — issue
|
|
103
|
+
#1333 — marking a script-enforced prose spec: still a team agent for
|
|
104
|
+
coverage purposes, just persona-exempt).
|
|
105
|
+
"""
|
|
106
|
+
return bool(_BEHAVIORAL_RE.search(text) or _ENFORCEMENT_RE.search(text))
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def swept_agents(agents_dir: Path) -> list[str]:
|
|
110
|
+
"""Structural sweep (branch b): team agents minus *-review, sorted by stem."""
|
|
111
|
+
out = []
|
|
112
|
+
for path in sorted(agents_dir.glob("*.md")):
|
|
113
|
+
if path.name.endswith("-review.md"):
|
|
114
|
+
continue
|
|
115
|
+
if is_team_agent(path.read_text(encoding="utf-8")):
|
|
116
|
+
out.append(path.stem)
|
|
117
|
+
return out
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _targets(agents_dir: Path) -> dict[str, tuple[Path, list[str]]]:
|
|
121
|
+
return {name: (agents_dir / f"{name}.md", required) for name, required in TIER_CONFIG.items()}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _unclassified(covered: list[str]) -> list[str]:
|
|
125
|
+
return sorted(name for name in covered if name not in TIER_CONFIG and name not in EXCLUSIONS)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def evaluate(agents_dir: Path) -> dict:
|
|
129
|
+
"""Return the mapping report: covered set, offenders, unclassified.
|
|
130
|
+
|
|
131
|
+
covered = union of TIER_CONFIG keys (branch a) and the sweep (branch b).
|
|
132
|
+
offenders = {agent: missing tools} for covered config agents under-granted.
|
|
133
|
+
unclassified = swept team agents in neither TIER_CONFIG nor EXCLUSIONS.
|
|
134
|
+
"""
|
|
135
|
+
swept = swept_agents(agents_dir)
|
|
136
|
+
covered = sorted(set(TIER_CONFIG) | set(swept))
|
|
137
|
+
offenders, _fixed, _unfixable = run_grants_check(_targets(agents_dir))
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
"covered": covered,
|
|
141
|
+
"swept": swept,
|
|
142
|
+
"offenders": offenders,
|
|
143
|
+
"unclassified": _unclassified(covered),
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def apply_fixes(agents_dir: Path) -> dict[str, list[str]]:
|
|
148
|
+
"""Append missing tier tools to each under-granted config agent. Returns fixed map.
|
|
149
|
+
|
|
150
|
+
Unclassified agents are not auto-fixed (they need a human classification
|
|
151
|
+
decision) — the caller reports them and exits non-zero.
|
|
152
|
+
"""
|
|
153
|
+
_offenders, fixed, _unfixable = run_grants_check(_targets(agents_dir), apply_fix=True)
|
|
154
|
+
return fixed
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def main(argv=None) -> int:
|
|
158
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
159
|
+
parser.add_argument("--agents-dir", type=Path, default=None)
|
|
160
|
+
parser.add_argument("--fix", action="store_true", help="append missing tier tools")
|
|
161
|
+
parser.add_argument("--json", action="store_true", help="machine-readable output")
|
|
162
|
+
args = parser.parse_args(argv)
|
|
163
|
+
|
|
164
|
+
agents_dir = args.agents_dir or default_agents_dir()
|
|
165
|
+
if not agents_dir.is_dir():
|
|
166
|
+
print(f"ERROR: agents directory not found: {agents_dir}", file=sys.stderr)
|
|
167
|
+
return 1
|
|
168
|
+
|
|
169
|
+
swept = swept_agents(agents_dir)
|
|
170
|
+
covered = sorted(set(TIER_CONFIG) | set(swept))
|
|
171
|
+
offenders, fixed, unfixable = run_grants_check(_targets(agents_dir), apply_fix=args.fix)
|
|
172
|
+
unclassified = _unclassified(covered)
|
|
173
|
+
rc = 1 if (offenders or unclassified) else 0
|
|
174
|
+
|
|
175
|
+
if args.json:
|
|
176
|
+
# --json owns stdout: emit ONLY the JSON object.
|
|
177
|
+
report = build_json_report(
|
|
178
|
+
"agent-tool-mapping",
|
|
179
|
+
covered,
|
|
180
|
+
offenders,
|
|
181
|
+
ok=(rc == 0),
|
|
182
|
+
fixed=fixed,
|
|
183
|
+
unfixable=unfixable,
|
|
184
|
+
unclassified=unclassified,
|
|
185
|
+
notes={"swept": swept},
|
|
186
|
+
)
|
|
187
|
+
print(json.dumps(report, indent=2))
|
|
188
|
+
return rc
|
|
189
|
+
|
|
190
|
+
if args.fix:
|
|
191
|
+
if fixed:
|
|
192
|
+
for name, added in fixed.items():
|
|
193
|
+
print(f"FIXED: {name} — added {', '.join(added)}")
|
|
194
|
+
else:
|
|
195
|
+
print("OK: all mapped agents already grant their tier tools.")
|
|
196
|
+
|
|
197
|
+
if offenders:
|
|
198
|
+
print("FAIL: non-review agents missing their tier's code-intelligence tools:")
|
|
199
|
+
for name, missing in offenders.items():
|
|
200
|
+
print(f" - {name}: missing {', '.join(missing)}")
|
|
201
|
+
print("\nRun: python3 plugins/dev-team/scripts/check_agent_tool_mapping.py --fix")
|
|
202
|
+
if unclassified:
|
|
203
|
+
print("FAIL: team agents in neither the mapping nor the exclusion list "
|
|
204
|
+
"(classify each into TIER_CONFIG or EXCLUSIONS):")
|
|
205
|
+
for name in unclassified:
|
|
206
|
+
print(f" - {name}")
|
|
207
|
+
if rc == 0:
|
|
208
|
+
print(f"OK: all {len(covered)} covered agents match the tool mapping.")
|
|
209
|
+
return rc
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
if __name__ == "__main__":
|
|
213
|
+
sys.exit(main())
|