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,317 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate per-agent-tier MCP tool grants on every read-only *-review agent.
|
|
3
|
+
|
|
4
|
+
Review agents (agents/*-review.md) do structural and behavioral review. When a
|
|
5
|
+
target repo has a CodeGraph index (.codegraph/) and/or a Repowise MCP server, the
|
|
6
|
+
agents should call those tools for verified skeletons and resolved call graphs
|
|
7
|
+
instead of re-reading whole files. That only works if the tool names are present
|
|
8
|
+
in each agent's `tools:` frontmatter allowlist.
|
|
9
|
+
|
|
10
|
+
Grants are no longer one-size-fits-all (#1467). Three tiers:
|
|
11
|
+
|
|
12
|
+
- ``EXEMPT_AGENTS`` (``claude-setup-review``, ``token-efficiency-review``) — pure
|
|
13
|
+
text/regex/frontmatter validators on the ``haiku`` tier that never touch code
|
|
14
|
+
structure. They require **none** of the code-intelligence MCP tools, and this
|
|
15
|
+
check actively asserts they carry **none** of them — a "forbidden tools
|
|
16
|
+
present" failure mode, reported and JSON-exposed distinctly from the ordinary
|
|
17
|
+
"missing tools" offenders, so a future edit can't silently regrant the tools
|
|
18
|
+
these two never needed.
|
|
19
|
+
- ``REASSIGNED_TOOLS`` agents (``refactor-opportunity-review``,
|
|
20
|
+
``performance-review``, ``doc-review``) — require their
|
|
21
|
+
own specific tool set (see the mapping below) instead of the generic
|
|
22
|
+
``BASE_MCP_TOOLS`` five.
|
|
23
|
+
- Every other ``*-review.md`` agent keeps the original ``BASE_MCP_TOOLS``
|
|
24
|
+
requirement, unchanged.
|
|
25
|
+
|
|
26
|
+
``--fix`` behavior: for ``REASSIGNED_TOOLS`` (and generic-tier) agents, it
|
|
27
|
+
appends the agent's own missing required tools (reusing
|
|
28
|
+
``run_grants_check``/``fix_tools_line`` from ``mcp_tool_grants.py``, which are
|
|
29
|
+
generic over the ``required`` list). For ``EXEMPT_AGENTS``, ``--fix`` is a
|
|
30
|
+
no-op for "missing" (there is nothing required). **`--fix` does NOT strip
|
|
31
|
+
forbidden tools from exempt agents** — removing an already-present token is a
|
|
32
|
+
different, riskier operation than appending one, so a forbidden-tools finding
|
|
33
|
+
on an exempt agent always requires a human edit; detection still fails the run
|
|
34
|
+
so it can't be missed.
|
|
35
|
+
|
|
36
|
+
Exit 0 if every review agent's grant matches its tier and the skill prose is
|
|
37
|
+
present. Exit 1 (detection) or applies fixes (--fix) otherwise.
|
|
38
|
+
|
|
39
|
+
Usage (repo-root-relative — this script mutates the agent files next to
|
|
40
|
+
wherever it itself resides, so it must run against the maintainer's own
|
|
41
|
+
checkout, never a `${CLAUDE_PLUGIN_ROOT}`-qualified installed-cache path):
|
|
42
|
+
python3 plugins/dev-team/scripts/check_review_agent_mcp_tools.py [--agents-dir <path>] [--skill-file <path>]
|
|
43
|
+
python3 plugins/dev-team/scripts/check_review_agent_mcp_tools.py --fix # append missing tool names
|
|
44
|
+
python3 plugins/dev-team/scripts/check_review_agent_mcp_tools.py --json # machine-readable report
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
# Keeps PEP 585 annotations (`list[Path]`, `dict[str, list[str]]`) as strings,
|
|
48
|
+
# so this module imports on the floor ADR 0014 sets for shipped.
|
|
49
|
+
# code. Without it this file raised `TypeError: 'type' object is not
|
|
50
|
+
# subscriptable` at import time.
|
|
51
|
+
from __future__ import annotations
|
|
52
|
+
|
|
53
|
+
import argparse
|
|
54
|
+
import json
|
|
55
|
+
import sys
|
|
56
|
+
from pathlib import Path
|
|
57
|
+
|
|
58
|
+
# Shared tool-name constants and tools:-line plumbing live in scripts/lib so the
|
|
59
|
+
# sibling check_agent_tool_mapping.py can import them as a peer (neither script is
|
|
60
|
+
# the other's library). See scripts/lib/mcp_tool_grants.py.
|
|
61
|
+
sys.path.insert(0, str(Path(__file__).parent / "lib"))
|
|
62
|
+
# The *-review glob-discovery logic itself lives in hooks/lib (#1461) — a
|
|
63
|
+
# hook (hooks/agent_dispatch_ledger.py) needs the same closed set of
|
|
64
|
+
# registered review-agent names and must never reach into scripts/, so the
|
|
65
|
+
# dependency direction is scripts/ -> hooks/lib/, not the reverse. This
|
|
66
|
+
# script imports the shared implementation rather than keeping its own copy.
|
|
67
|
+
sys.path.insert(0, str(Path(__file__).parent.parent / "hooks" / "lib"))
|
|
68
|
+
|
|
69
|
+
from mcp_tool_grants import (
|
|
70
|
+
BASE_MCP_TOOLS,
|
|
71
|
+
GET_DEAD_CODE,
|
|
72
|
+
GET_HEALTH,
|
|
73
|
+
GET_WHY,
|
|
74
|
+
build_json_report,
|
|
75
|
+
parse_tools, # noqa: F401 -- re-exported: imported directly by this script's own tests
|
|
76
|
+
run_grants_check,
|
|
77
|
+
)
|
|
78
|
+
from mcp_tool_grants import (
|
|
79
|
+
fix_tools_line as _fix_tools_line,
|
|
80
|
+
)
|
|
81
|
+
from mcp_tool_grants import (
|
|
82
|
+
missing_tools as _missing_tools,
|
|
83
|
+
)
|
|
84
|
+
from review_agent_registry import (
|
|
85
|
+
default_agents_dir,
|
|
86
|
+
)
|
|
87
|
+
from review_agent_registry import (
|
|
88
|
+
find_review_agent_files as _find_review_agent_files,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# The five code-intelligence MCP tool names granted to the generic review-agent
|
|
92
|
+
# tier. Kept as MCP_TOOL_NAMES for this script's public API (imported by the
|
|
93
|
+
# pytest wrapper and agent-audit); the canonical values live in the shared lib.
|
|
94
|
+
MCP_TOOL_NAMES = BASE_MCP_TOOLS
|
|
95
|
+
|
|
96
|
+
# Agents that do pure text/regex/frontmatter validation and never touch code
|
|
97
|
+
# structure — they require zero code-intelligence MCP tools (#1467).
|
|
98
|
+
EXEMPT_AGENTS = {"claude-setup-review", "token-efficiency-review"}
|
|
99
|
+
|
|
100
|
+
# Agents whose grant is reassigned to a specific set instead of the generic
|
|
101
|
+
# BASE_MCP_TOOLS five (#1467).
|
|
102
|
+
REASSIGNED_TOOLS = {
|
|
103
|
+
"refactor-opportunity-review": [
|
|
104
|
+
"mcp__codegraph__codegraph_explore",
|
|
105
|
+
"mcp__plugin_repowise_repowise__get_context",
|
|
106
|
+
"mcp__plugin_repowise_repowise__get_symbol",
|
|
107
|
+
GET_DEAD_CODE,
|
|
108
|
+
GET_HEALTH,
|
|
109
|
+
],
|
|
110
|
+
"performance-review": [
|
|
111
|
+
"mcp__codegraph__codegraph_explore",
|
|
112
|
+
"mcp__plugin_repowise_repowise__get_context",
|
|
113
|
+
"mcp__plugin_repowise_repowise__get_symbol",
|
|
114
|
+
"mcp__plugin_repowise_repowise__search_codebase",
|
|
115
|
+
GET_HEALTH,
|
|
116
|
+
],
|
|
117
|
+
"doc-review": [
|
|
118
|
+
"mcp__codegraph__codegraph_explore",
|
|
119
|
+
"mcp__plugin_repowise_repowise__get_context",
|
|
120
|
+
"mcp__plugin_repowise_repowise__get_symbol",
|
|
121
|
+
GET_WHY,
|
|
122
|
+
],
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
# Every code-intelligence MCP tool name that must be ABSENT from an
|
|
126
|
+
# EXEMPT_AGENTS agent's tools: line.
|
|
127
|
+
FORBIDDEN_FOR_EXEMPT = BASE_MCP_TOOLS + [GET_WHY, GET_HEALTH, GET_DEAD_CODE]
|
|
128
|
+
|
|
129
|
+
# Phrases the code-review skill must contain so the granted tools are actually used:
|
|
130
|
+
# detection of each index, the preference instruction, and the documented fallback.
|
|
131
|
+
SKILL_REQUIRED_PHRASES = [
|
|
132
|
+
"mcp__codegraph__codegraph_explore",
|
|
133
|
+
".codegraph/",
|
|
134
|
+
"get_context",
|
|
135
|
+
"get_symbol",
|
|
136
|
+
"search_codebase",
|
|
137
|
+
"get_risk",
|
|
138
|
+
]
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _skill_file_default() -> Path:
|
|
142
|
+
return Path(__file__).parent.parent / "skills" / "code-review" / "SKILL.md"
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def find_review_agents(agents_dir: Path) -> list[Path]:
|
|
146
|
+
"""Return the read-only review agent files (agents/*-review.md), sorted.
|
|
147
|
+
|
|
148
|
+
Thin wrapper over the shared `hooks/lib/review_agent_registry` extraction
|
|
149
|
+
(#1461) — kept as a stable public name here since this script's own
|
|
150
|
+
tests and `hooks/agent_dispatch_ledger.py`'s registry needs both depend
|
|
151
|
+
on this glob-discovery behavior remaining unchanged.
|
|
152
|
+
"""
|
|
153
|
+
return _find_review_agent_files(agents_dir)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def required_tools_for(name: str) -> list[str]:
|
|
157
|
+
"""Return the tool-name list a review agent named `name` must grant.
|
|
158
|
+
|
|
159
|
+
Empty for EXEMPT_AGENTS, the agent's own set for REASSIGNED_TOOLS, and
|
|
160
|
+
the generic BASE_MCP_TOOLS five for every other *-review agent.
|
|
161
|
+
"""
|
|
162
|
+
if name in EXEMPT_AGENTS:
|
|
163
|
+
return []
|
|
164
|
+
if name in REASSIGNED_TOOLS:
|
|
165
|
+
return REASSIGNED_TOOLS[name]
|
|
166
|
+
return MCP_TOOL_NAMES
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def missing_mcp_tools(text: str, name: str) -> list[str]:
|
|
170
|
+
"""Return the tool names required for agent `name` absent from its tools: line."""
|
|
171
|
+
return _missing_tools(text, required_tools_for(name))
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def fix_tools_line(text: str, name: str) -> tuple[str, list[str]]:
|
|
175
|
+
"""Append any missing required tool names for agent `name`. Idempotent.
|
|
176
|
+
|
|
177
|
+
Thin wrapper over the shared helper, bound to `name`'s required set via
|
|
178
|
+
`required_tools_for`. Returns (new_text, added_names); a line already
|
|
179
|
+
containing every required name is returned unchanged (added == []). For
|
|
180
|
+
an EXEMPT_AGENTS name (required == []), always returns unchanged.
|
|
181
|
+
"""
|
|
182
|
+
return _fix_tools_line(text, required_tools_for(name))
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def forbidden_present(text: str) -> list[str]:
|
|
186
|
+
"""Return the FORBIDDEN_FOR_EXEMPT tool names actually granted in `text`."""
|
|
187
|
+
missing = _missing_tools(text, FORBIDDEN_FOR_EXEMPT)
|
|
188
|
+
return [name for name in FORBIDDEN_FOR_EXEMPT if name not in missing]
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def check_skill(skill_text: str) -> list[str]:
|
|
192
|
+
"""Return the required phrases absent from the code-review skill prose."""
|
|
193
|
+
return [phrase for phrase in SKILL_REQUIRED_PHRASES if phrase not in skill_text]
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def _skill_missing(skill_file: Path) -> list[str]:
|
|
197
|
+
if skill_file.is_file():
|
|
198
|
+
return check_skill(skill_file.read_text(encoding="utf-8"))
|
|
199
|
+
return list(SKILL_REQUIRED_PHRASES)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def _targets(agents: list[Path]) -> dict[str, tuple[Path, list[str]]]:
|
|
203
|
+
return {agent_file.stem: (agent_file, required_tools_for(agent_file.stem)) for agent_file in agents}
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def apply_fixes(agents: list[Path]) -> tuple[dict[str, list[str]], list[str]]:
|
|
207
|
+
"""Append missing required tools to each review agent. Returns (fixed, unfixable).
|
|
208
|
+
|
|
209
|
+
`unfixable` names agents with no inline `tools:` line the regex can append
|
|
210
|
+
to (a missing line, or a block-list form) — these are reported and cause a
|
|
211
|
+
non-zero exit rather than a silent false "OK" (they can't be auto-fixed).
|
|
212
|
+
Never strips forbidden tools from EXEMPT_AGENTS — see module docstring.
|
|
213
|
+
"""
|
|
214
|
+
_offenders, fixed, unfixable = run_grants_check(_targets(agents), apply_fix=True)
|
|
215
|
+
return fixed, unfixable
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def find_offenders(agents: list[Path]) -> dict[str, list[str]]:
|
|
219
|
+
"""Return {agent: missing tool names} for review agents lacking their required set."""
|
|
220
|
+
offenders, _fixed, _unfixable = run_grants_check(_targets(agents))
|
|
221
|
+
return offenders
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def find_forbidden(agents: list[Path]) -> dict[str, list[str]]:
|
|
225
|
+
"""Return {agent: [forbidden tool names present]} for EXEMPT_AGENTS only."""
|
|
226
|
+
forbidden = {}
|
|
227
|
+
for agent_file in agents:
|
|
228
|
+
if agent_file.stem not in EXEMPT_AGENTS or not agent_file.is_file():
|
|
229
|
+
continue
|
|
230
|
+
present = forbidden_present(agent_file.read_text(encoding="utf-8"))
|
|
231
|
+
if present:
|
|
232
|
+
forbidden[agent_file.stem] = present
|
|
233
|
+
return forbidden
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def main() -> int:
|
|
237
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
238
|
+
parser.add_argument("--agents-dir", type=Path, default=None)
|
|
239
|
+
parser.add_argument("--skill-file", type=Path, default=None)
|
|
240
|
+
parser.add_argument("--fix", action="store_true", help="append missing required tool names")
|
|
241
|
+
parser.add_argument("--json", action="store_true", help="machine-readable output")
|
|
242
|
+
args = parser.parse_args()
|
|
243
|
+
|
|
244
|
+
agents_dir = args.agents_dir or default_agents_dir()
|
|
245
|
+
skill_file = args.skill_file or _skill_file_default()
|
|
246
|
+
|
|
247
|
+
if not agents_dir.is_dir():
|
|
248
|
+
print(f"ERROR: agents directory not found: {agents_dir}", file=sys.stderr)
|
|
249
|
+
return 1
|
|
250
|
+
|
|
251
|
+
agents = find_review_agents(agents_dir)
|
|
252
|
+
skill_missing = _skill_missing(skill_file)
|
|
253
|
+
offenders, fixed, unfixable = run_grants_check(_targets(agents), apply_fix=args.fix)
|
|
254
|
+
forbidden = find_forbidden(agents)
|
|
255
|
+
|
|
256
|
+
if args.fix:
|
|
257
|
+
rc = 1 if (unfixable or skill_missing or forbidden) else 0
|
|
258
|
+
if args.json:
|
|
259
|
+
# --json owns stdout: emit ONLY the JSON object, nothing else.
|
|
260
|
+
report = build_json_report(
|
|
261
|
+
"review-agent-mcp-tools",
|
|
262
|
+
[a.stem for a in agents],
|
|
263
|
+
offenders,
|
|
264
|
+
ok=(rc == 0),
|
|
265
|
+
fixed=fixed,
|
|
266
|
+
unfixable=unfixable,
|
|
267
|
+
notes={"skill_missing_phrases": skill_missing, "forbidden": forbidden},
|
|
268
|
+
)
|
|
269
|
+
print(json.dumps(report, indent=2))
|
|
270
|
+
return rc
|
|
271
|
+
if fixed:
|
|
272
|
+
for name, added in fixed.items():
|
|
273
|
+
print(f"FIXED: {name} — added {', '.join(added)}")
|
|
274
|
+
else:
|
|
275
|
+
print(f"OK: all {len(agents)} review agents already grant their required MCP tools.")
|
|
276
|
+
if unfixable:
|
|
277
|
+
print("WARN: review agents with no inline tools: line (fix by hand): "
|
|
278
|
+
+ ", ".join(unfixable), file=sys.stderr)
|
|
279
|
+
if skill_missing:
|
|
280
|
+
print("WARN: code-review SKILL.md is missing phrases (fix by hand): "
|
|
281
|
+
+ ", ".join(skill_missing), file=sys.stderr)
|
|
282
|
+
if forbidden:
|
|
283
|
+
print("WARN: exempt review agents granted forbidden MCP tools (fix by hand): "
|
|
284
|
+
+ "; ".join(f"{name}: {', '.join(tools)}" for name, tools in forbidden.items()),
|
|
285
|
+
file=sys.stderr)
|
|
286
|
+
return rc
|
|
287
|
+
|
|
288
|
+
rc = 1 if (offenders or skill_missing or forbidden) else 0
|
|
289
|
+
if args.json:
|
|
290
|
+
# --json owns stdout: emit ONLY the JSON object, nothing else.
|
|
291
|
+
report = build_json_report(
|
|
292
|
+
"review-agent-mcp-tools",
|
|
293
|
+
[a.stem for a in agents],
|
|
294
|
+
offenders,
|
|
295
|
+
ok=(rc == 0),
|
|
296
|
+
notes={"skill_missing_phrases": skill_missing, "forbidden": forbidden},
|
|
297
|
+
)
|
|
298
|
+
print(json.dumps(report, indent=2))
|
|
299
|
+
return rc
|
|
300
|
+
if offenders:
|
|
301
|
+
print("FAIL: review agents missing their required code-intelligence MCP tools in tools::")
|
|
302
|
+
for name, missing in offenders.items():
|
|
303
|
+
print(f" - {name}: missing {', '.join(missing)}")
|
|
304
|
+
print("\nRun: python3 plugins/dev-team/scripts/check_review_agent_mcp_tools.py --fix")
|
|
305
|
+
if forbidden:
|
|
306
|
+
print("FAIL: exempt review agents granted forbidden code-intelligence MCP tools (should have none):")
|
|
307
|
+
for name, tools in forbidden.items():
|
|
308
|
+
print(f" - {name}: forbidden {', '.join(tools)}")
|
|
309
|
+
if skill_missing:
|
|
310
|
+
print("FAIL: code-review SKILL.md missing required phrases: " + ", ".join(skill_missing))
|
|
311
|
+
if rc == 0:
|
|
312
|
+
print(f"OK: all {len(agents)} review agents grant their required MCP tools; skill prose present.")
|
|
313
|
+
return rc
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
if __name__ == "__main__":
|
|
317
|
+
sys.exit(main())
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate security-assessment code-reading agents' code-intelligence MCP grants.
|
|
3
|
+
|
|
4
|
+
`check_review_agent_mcp_tools.py` (#1102) enforces the canonical CodeGraph/
|
|
5
|
+
Repowise grant (`mcp_tool_grants.BASE_MCP_TOOLS`) on dev-team's own read-only
|
|
6
|
+
`*-review.md` agents, but is scoped to `plugins/dev-team/agents/` only — it
|
|
7
|
+
never sees `plugins/security-assessment/agents/`. That companion plugin's
|
|
8
|
+
code-reading agents were hand-granted the same canonical set (hand-copied
|
|
9
|
+
from `plugins/dev-team/agents/security-review.md`), and a hand-maintained
|
|
10
|
+
grant with no mechanical check silently drifts the moment `BASE_MCP_TOOLS`
|
|
11
|
+
changes (issue #1388).
|
|
12
|
+
|
|
13
|
+
Unlike the dev-team review agents (uniformly named `*-review.md`), the
|
|
14
|
+
security-assessment agents this applies to don't share a filename
|
|
15
|
+
convention, so — mirroring `check_agent_tool_mapping.py`'s named-target
|
|
16
|
+
approach rather than a glob — this script validates an explicit roster:
|
|
17
|
+
the 8 agents that reason about arbitrary target-repo code, as opposed to
|
|
18
|
+
the 5 synthesis-only agents (`redteam-report-generator`,
|
|
19
|
+
`exec-report-generator`, `redteam-recon-analyzer`,
|
|
20
|
+
`redteam-evasion-analyzer`, `redteam-extraction-analyzer`) that only ever
|
|
21
|
+
read a fixed set of upstream probe/finding artifacts and produce narrative
|
|
22
|
+
output — the grant would be inert for them. This classification (not a
|
|
23
|
+
`Glob`-presence heuristic — `exec-report-generator` carries `Glob` for its
|
|
24
|
+
own artifact-directory walk yet is still synthesis-only) is the one
|
|
25
|
+
actually applied to the fleet.
|
|
26
|
+
|
|
27
|
+
Usage:
|
|
28
|
+
python3 check_security_assessment_mcp_tools.py [--agents-dir <path>]
|
|
29
|
+
python3 check_security_assessment_mcp_tools.py --fix # append missing tools
|
|
30
|
+
python3 check_security_assessment_mcp_tools.py --json # machine-readable report
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
import argparse
|
|
36
|
+
import json
|
|
37
|
+
import sys
|
|
38
|
+
from pathlib import Path
|
|
39
|
+
|
|
40
|
+
sys.path.insert(0, str(Path(__file__).parent / "lib"))
|
|
41
|
+
|
|
42
|
+
from mcp_tool_grants import (
|
|
43
|
+
BASE_MCP_TOOLS,
|
|
44
|
+
build_json_report,
|
|
45
|
+
run_grants_check,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
# The security-assessment code-reading agents (#1388) — the 8 agents that
|
|
49
|
+
# reason about arbitrary target-repo code. Named explicitly (not a glob
|
|
50
|
+
# pattern, not a tools:-heuristic) so a newly added agent must be classified
|
|
51
|
+
# here or in NON_CODE_READING_AGENTS rather than silently landing in either
|
|
52
|
+
# bucket.
|
|
53
|
+
CODE_READING_AGENTS = [
|
|
54
|
+
"authorization-logic-review",
|
|
55
|
+
"business-logic-domain-review",
|
|
56
|
+
"compliance-edge-annotator",
|
|
57
|
+
"cross-repo-synthesizer",
|
|
58
|
+
"deep-code-reasoning",
|
|
59
|
+
"fp-reduction",
|
|
60
|
+
"recon-driven-scan",
|
|
61
|
+
"tool-finding-narrative-annotator",
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
# Documented exclusions: the 5 synthesis-only security-assessment agents —
|
|
65
|
+
# they interpret a fixed set of upstream artifacts (redteam probe output,
|
|
66
|
+
# prior-phase findings) and produce narrative/report output, never reasoning
|
|
67
|
+
# about arbitrary target-repo code, so the code-intelligence grant would be
|
|
68
|
+
# inert for them. `exec-report-generator` carries `Glob` (for its own
|
|
69
|
+
# artifact-directory walk) but is still synthesis-only — Glob presence alone
|
|
70
|
+
# is not the classifying signal.
|
|
71
|
+
NON_CODE_READING_AGENTS = [
|
|
72
|
+
"exec-report-generator",
|
|
73
|
+
"redteam-evasion-analyzer",
|
|
74
|
+
"redteam-extraction-analyzer",
|
|
75
|
+
"redteam-recon-analyzer",
|
|
76
|
+
"redteam-report-generator",
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _agents_dir_default() -> Path:
|
|
81
|
+
# scripts/ is one level below plugins/dev-team/; the companion plugin is a
|
|
82
|
+
# sibling of dev-team under plugins/.
|
|
83
|
+
return Path(__file__).parent.parent.parent / "security-assessment" / "agents"
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _targets(agents_dir: Path) -> dict[str, tuple[Path, list[str]]]:
|
|
87
|
+
return {
|
|
88
|
+
name: (agents_dir / f"{name}.md", BASE_MCP_TOOLS) for name in CODE_READING_AGENTS
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def find_offenders(agents_dir: Path) -> dict[str, list[str]]:
|
|
93
|
+
"""Return {agent: missing tool names} for code-reading agents under-granted."""
|
|
94
|
+
offenders, _fixed, _unfixable = run_grants_check(_targets(agents_dir))
|
|
95
|
+
return offenders
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def unclassified_agents(agents_dir: Path) -> list[str]:
|
|
99
|
+
"""Agents on disk that are in neither roster — the self-extension net."""
|
|
100
|
+
known = set(CODE_READING_AGENTS) | set(NON_CODE_READING_AGENTS)
|
|
101
|
+
return sorted(
|
|
102
|
+
path.stem for path in agents_dir.glob("*.md") if path.stem not in known
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def apply_fixes(agents_dir: Path) -> dict[str, list[str]]:
|
|
107
|
+
"""Append missing BASE_MCP_TOOLS to each under-granted code-reading agent."""
|
|
108
|
+
_offenders, fixed, _unfixable = run_grants_check(_targets(agents_dir), apply_fix=True)
|
|
109
|
+
return fixed
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def main(argv=None) -> int:
|
|
113
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
114
|
+
parser.add_argument("--agents-dir", type=Path, default=None)
|
|
115
|
+
parser.add_argument("--fix", action="store_true", help="append missing MCP tool names")
|
|
116
|
+
parser.add_argument("--json", action="store_true", help="machine-readable output")
|
|
117
|
+
args = parser.parse_args(argv)
|
|
118
|
+
|
|
119
|
+
agents_dir = args.agents_dir or _agents_dir_default()
|
|
120
|
+
if not agents_dir.is_dir():
|
|
121
|
+
print(f"ERROR: agents directory not found: {agents_dir}", file=sys.stderr)
|
|
122
|
+
return 1
|
|
123
|
+
|
|
124
|
+
offenders, fixed, unfixable = run_grants_check(_targets(agents_dir), apply_fix=args.fix)
|
|
125
|
+
unclassified = unclassified_agents(agents_dir)
|
|
126
|
+
rc = 1 if (offenders or unclassified) else 0
|
|
127
|
+
|
|
128
|
+
if args.json:
|
|
129
|
+
report = build_json_report(
|
|
130
|
+
"security-assessment-mcp-tools",
|
|
131
|
+
CODE_READING_AGENTS,
|
|
132
|
+
offenders,
|
|
133
|
+
ok=(rc == 0),
|
|
134
|
+
fixed=fixed,
|
|
135
|
+
unfixable=unfixable,
|
|
136
|
+
unclassified=unclassified,
|
|
137
|
+
)
|
|
138
|
+
print(json.dumps(report, indent=2))
|
|
139
|
+
return rc
|
|
140
|
+
|
|
141
|
+
if args.fix:
|
|
142
|
+
if fixed:
|
|
143
|
+
for name, added in fixed.items():
|
|
144
|
+
print(f"FIXED: {name} — added {', '.join(added)}")
|
|
145
|
+
else:
|
|
146
|
+
print("OK: all security-assessment code-reading agents already grant the MCP tools.")
|
|
147
|
+
|
|
148
|
+
if offenders:
|
|
149
|
+
print("FAIL: security-assessment code-reading agents missing code-intelligence MCP tools:")
|
|
150
|
+
for name, missing in offenders.items():
|
|
151
|
+
print(f" - {name}: missing {', '.join(missing)}")
|
|
152
|
+
print("\nRun: python3 plugins/dev-team/scripts/check_security_assessment_mcp_tools.py --fix")
|
|
153
|
+
if unclassified:
|
|
154
|
+
print("FAIL: security-assessment agents in neither CODE_READING_AGENTS nor "
|
|
155
|
+
"NON_CODE_READING_AGENTS (classify each):")
|
|
156
|
+
for name in unclassified:
|
|
157
|
+
print(f" - {name}")
|
|
158
|
+
if rc == 0:
|
|
159
|
+
print(f"OK: all {len(CODE_READING_AGENTS)} security-assessment code-reading agents "
|
|
160
|
+
"grant the five MCP tools.")
|
|
161
|
+
return rc
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
if __name__ == "__main__":
|
|
165
|
+
sys.exit(main())
|