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,296 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""verify_gherkin_quality_critic_isolation.py — runtime isolation check for
|
|
3
|
+
the two-instance `gherkin-quality-critic` dispatch (issue #1465).
|
|
4
|
+
|
|
5
|
+
`/gherkin-derive` and `/gherkin-public` both dispatch **two independent
|
|
6
|
+
instances** of the `gherkin-quality-critic` agent in parallel — the whole
|
|
7
|
+
point being ensemble/self-consistency corroboration on the same judgment
|
|
8
|
+
call (see `knowledge/gherkin-quality-review-dispatch.md`). That mutual
|
|
9
|
+
blindness — "one message, two calls, read neither result until both are
|
|
10
|
+
issued" — is currently asserted only in prose and in content-guards that
|
|
11
|
+
check the markdown *says* the right thing. Nothing runs two real dispatches
|
|
12
|
+
and checks the isolation property held at runtime; a future refactor could
|
|
13
|
+
accidentally thread one instance's output into the other's prompt and
|
|
14
|
+
nothing would catch it.
|
|
15
|
+
|
|
16
|
+
This script closes that gap with a cross-contamination canary: each
|
|
17
|
+
instance's `.feature` fixture carries a distinct, randomly-generated marker
|
|
18
|
+
string embedded in its own context (mirroring how a real dispatch's cited
|
|
19
|
+
source text could carry incidental detail). Two fully independent `claude
|
|
20
|
+
-p` subprocess calls dispatch the real `gherkin-quality-critic` agent (via
|
|
21
|
+
the `/review-agent` skill) against each fixture — no shared mutable state, no
|
|
22
|
+
piping one call's output into the other's input. If either transcript
|
|
23
|
+
contains the *other* instance's canary, isolation was broken somewhere in the
|
|
24
|
+
dispatch path and the script fails loudly.
|
|
25
|
+
|
|
26
|
+
This intentionally diverges from production's "identical input to both
|
|
27
|
+
instances" property (see the dispatch doc) — seeding a distinct marker per
|
|
28
|
+
instance is what makes contamination observable at all. It does not change
|
|
29
|
+
what the two instances are asked to review (the fixture's Gherkin content is
|
|
30
|
+
otherwise identical); only the throwaway canary comment differs.
|
|
31
|
+
|
|
32
|
+
**Opt-in, paid, fail-open.** Mirrors `evals/README.md`'s "CI gate (issue
|
|
33
|
+
#99)" live-gate convention: this script dispatches the real `claude` CLI, so
|
|
34
|
+
it costs tokens and must never block anyone without eval credentials. When
|
|
35
|
+
the `claude` CLI is missing or `ANTHROPIC_API_KEY` is unset, it prints a
|
|
36
|
+
skip message and exits 0 — never a failure. It is not wired into any CI
|
|
37
|
+
workflow by this change; see `knowledge/gherkin-quality-review-dispatch.md`
|
|
38
|
+
for how to run it locally (or gate it into CI the same way the existing live
|
|
39
|
+
eval gate is: a label + `ANTHROPIC_API_KEY`).
|
|
40
|
+
|
|
41
|
+
Stdlib only. (ADR 0014/0015).
|
|
42
|
+
|
|
43
|
+
Usage:
|
|
44
|
+
python3 verify_gherkin_quality_critic_isolation.py
|
|
45
|
+
python3 verify_gherkin_quality_critic_isolation.py --model <model-id> --timeout 300
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
from __future__ import annotations
|
|
49
|
+
|
|
50
|
+
import argparse
|
|
51
|
+
import os
|
|
52
|
+
import secrets
|
|
53
|
+
import shutil
|
|
54
|
+
import subprocess
|
|
55
|
+
import sys
|
|
56
|
+
import tempfile
|
|
57
|
+
import textwrap
|
|
58
|
+
from pathlib import Path
|
|
59
|
+
|
|
60
|
+
_DEFAULT_TIMEOUT_SECONDS = 300.0
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _default_timeout() -> float:
|
|
64
|
+
"""Per-dispatch subprocess timeout, overridable for local tuning."""
|
|
65
|
+
raw = os.environ.get("VERIFY_GHERKIN_ISOLATION_TIMEOUT")
|
|
66
|
+
if raw:
|
|
67
|
+
try:
|
|
68
|
+
return float(raw)
|
|
69
|
+
except ValueError:
|
|
70
|
+
pass
|
|
71
|
+
return _DEFAULT_TIMEOUT_SECONDS
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
|
75
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
76
|
+
parser.add_argument(
|
|
77
|
+
"--model",
|
|
78
|
+
default=None,
|
|
79
|
+
help="model id passed to `claude -p --model` (default: omitted, so "
|
|
80
|
+
"`claude -p` uses its own configured default model — this script "
|
|
81
|
+
"does not pin a snapshot; see ADR 0026)",
|
|
82
|
+
)
|
|
83
|
+
parser.add_argument(
|
|
84
|
+
"--timeout",
|
|
85
|
+
type=float,
|
|
86
|
+
default=_default_timeout(),
|
|
87
|
+
help="per-dispatch subprocess timeout in seconds "
|
|
88
|
+
"(default: $VERIFY_GHERKIN_ISOLATION_TIMEOUT or 300)",
|
|
89
|
+
)
|
|
90
|
+
return parser.parse_args(argv)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def check_prerequisites() -> list[str]:
|
|
94
|
+
"""Return missing-prerequisite messages (empty == ready to dispatch)."""
|
|
95
|
+
missing: list[str] = []
|
|
96
|
+
if shutil.which("claude") is None:
|
|
97
|
+
missing.append(
|
|
98
|
+
"the `claude` CLI (npm install -g @anthropic-ai/claude-code)"
|
|
99
|
+
)
|
|
100
|
+
if not os.environ.get("ANTHROPIC_API_KEY"):
|
|
101
|
+
missing.append("ANTHROPIC_API_KEY (required to dispatch a live agent call)")
|
|
102
|
+
return missing
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def build_fixture(canary: str) -> str:
|
|
106
|
+
"""A minimal `.feature` file with one deliberate, known finding: two
|
|
107
|
+
success-path variants and no failure path at all — the exact
|
|
108
|
+
"unbalanced coverage" / "missing failure path" case
|
|
109
|
+
`gherkin-quality-critic` is documented to flag. `canary` is embedded as
|
|
110
|
+
a throwaway leading comment, not part of the scenario content."""
|
|
111
|
+
return textwrap.dedent(
|
|
112
|
+
f"""\
|
|
113
|
+
# isolation-canary: {canary}
|
|
114
|
+
Feature: Widget creation
|
|
115
|
+
As a user
|
|
116
|
+
I want to create a widget
|
|
117
|
+
So that I can use it later
|
|
118
|
+
|
|
119
|
+
Scenario: Create a widget with a valid name
|
|
120
|
+
Given I am authenticated
|
|
121
|
+
When I create a widget named "Anvil"
|
|
122
|
+
Then the widget is created successfully
|
|
123
|
+
|
|
124
|
+
Scenario: Create a widget with a valid name and a description
|
|
125
|
+
Given I am authenticated
|
|
126
|
+
When I create a widget named "Anvil" with description "Heavy"
|
|
127
|
+
Then the widget is created successfully
|
|
128
|
+
"""
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def build_prompt(feature_path: Path, canary: str) -> str:
|
|
133
|
+
"""Prompt for one dispatch. Asks the CLI to run gherkin-quality-critic
|
|
134
|
+
via the shipped /review-agent skill against exactly one fixture file,
|
|
135
|
+
mirroring how .github/workflows/agent-eval.yml's live gate dispatches a
|
|
136
|
+
named agent through its skill wrapper rather than hand-rolling the Agent
|
|
137
|
+
tool call."""
|
|
138
|
+
return textwrap.dedent(
|
|
139
|
+
f"""
|
|
140
|
+
Use the /review-agent skill to run gherkin-quality-critic against
|
|
141
|
+
exactly this one file: {feature_path}
|
|
142
|
+
|
|
143
|
+
Pass --path {feature_path.parent} --json so stdout carries ONLY the
|
|
144
|
+
agent's raw JSON result (per gherkin-quality-critic's documented
|
|
145
|
+
output format in agents/gherkin-quality-critic.md) — no other prose.
|
|
146
|
+
|
|
147
|
+
Context marker for this dispatch only: {canary}
|
|
148
|
+
This marker appears in the .feature file's opening comment purely to
|
|
149
|
+
verify this dispatch's isolation from any other concurrent dispatch.
|
|
150
|
+
It is not part of the scenario content to review — do not mention it
|
|
151
|
+
as a finding.
|
|
152
|
+
"""
|
|
153
|
+
).strip()
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def dispatch(prompt: str, model: str | None, timeout: float) -> str | None:
|
|
157
|
+
"""Run one fully independent `claude -p` subprocess. Returns the raw
|
|
158
|
+
captured stdout (the "transcript"), or None on any infrastructure
|
|
159
|
+
problem (CLI crash, timeout, no output) — callers must treat None as
|
|
160
|
+
fail-open, never as a contamination finding. `model` is only appended to
|
|
161
|
+
the command when explicitly given — omitted, `claude -p` resolves its
|
|
162
|
+
own configured default rather than this script pinning a snapshot."""
|
|
163
|
+
cmd = [
|
|
164
|
+
"claude",
|
|
165
|
+
"-p",
|
|
166
|
+
prompt,
|
|
167
|
+
"--output-format",
|
|
168
|
+
"json",
|
|
169
|
+
"--max-turns",
|
|
170
|
+
"30",
|
|
171
|
+
"--allowedTools",
|
|
172
|
+
"Read",
|
|
173
|
+
"Glob",
|
|
174
|
+
"Grep",
|
|
175
|
+
"Skill(review-agent *)",
|
|
176
|
+
"Agent",
|
|
177
|
+
]
|
|
178
|
+
if model:
|
|
179
|
+
cmd += ["--model", model]
|
|
180
|
+
try:
|
|
181
|
+
proc = subprocess.run(
|
|
182
|
+
cmd,
|
|
183
|
+
capture_output=True,
|
|
184
|
+
text=True,
|
|
185
|
+
timeout=timeout,
|
|
186
|
+
check=False,
|
|
187
|
+
)
|
|
188
|
+
except (OSError, subprocess.TimeoutExpired) as exc:
|
|
189
|
+
print(
|
|
190
|
+
f"SKIP: dispatch could not run ({exc}) — treating as an "
|
|
191
|
+
"infrastructure problem, not a contamination finding.",
|
|
192
|
+
file=sys.stderr,
|
|
193
|
+
)
|
|
194
|
+
return None
|
|
195
|
+
if not proc.stdout.strip():
|
|
196
|
+
print(
|
|
197
|
+
f"SKIP: dispatch produced no output (exit {proc.returncode}); "
|
|
198
|
+
f"stderr: {proc.stderr.strip()[:300]}",
|
|
199
|
+
file=sys.stderr,
|
|
200
|
+
)
|
|
201
|
+
return None
|
|
202
|
+
return proc.stdout
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def check_cross_contamination(
|
|
206
|
+
transcript_a: str, transcript_b: str, canary_a: str, canary_b: str
|
|
207
|
+
) -> list[str]:
|
|
208
|
+
"""Return a list of contamination violations (empty == isolation held).
|
|
209
|
+
|
|
210
|
+
A violation is instance A's transcript containing instance B's canary
|
|
211
|
+
(or vice versa) — the marker seeded only into the OTHER instance's
|
|
212
|
+
fixture context. Either direction means output/context leaked across
|
|
213
|
+
the two supposedly-independent dispatches.
|
|
214
|
+
"""
|
|
215
|
+
violations: list[str] = []
|
|
216
|
+
if canary_b in transcript_a:
|
|
217
|
+
violations.append(
|
|
218
|
+
f"instance A's transcript contains instance B's canary marker "
|
|
219
|
+
f"({canary_b}) — dispatch isolation broken"
|
|
220
|
+
)
|
|
221
|
+
if canary_a in transcript_b:
|
|
222
|
+
violations.append(
|
|
223
|
+
f"instance B's transcript contains instance A's canary marker "
|
|
224
|
+
f"({canary_a}) — dispatch isolation broken"
|
|
225
|
+
)
|
|
226
|
+
return violations
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def main(argv: list[str] | None = None) -> int:
|
|
230
|
+
args = parse_args(argv)
|
|
231
|
+
|
|
232
|
+
missing = check_prerequisites()
|
|
233
|
+
if missing:
|
|
234
|
+
print(
|
|
235
|
+
"SKIP: gherkin-quality-critic isolation check requires a live "
|
|
236
|
+
"dispatch and cannot run here:"
|
|
237
|
+
)
|
|
238
|
+
for item in missing:
|
|
239
|
+
print(f" - {item}")
|
|
240
|
+
print(
|
|
241
|
+
"This is an opt-in, paid, live check (mirrors evals/README.md's "
|
|
242
|
+
"CI gate) — skipping, not failing."
|
|
243
|
+
)
|
|
244
|
+
return 0
|
|
245
|
+
|
|
246
|
+
canary_a = f"ISOLATION-CANARY-A-{secrets.token_hex(8)}"
|
|
247
|
+
canary_b = f"ISOLATION-CANARY-B-{secrets.token_hex(8)}"
|
|
248
|
+
|
|
249
|
+
with tempfile.TemporaryDirectory(prefix="gherkin-isolation-") as tmp:
|
|
250
|
+
tmp_path = Path(tmp)
|
|
251
|
+
dir_a = tmp_path / "instance_a"
|
|
252
|
+
dir_b = tmp_path / "instance_b"
|
|
253
|
+
dir_a.mkdir()
|
|
254
|
+
dir_b.mkdir()
|
|
255
|
+
feature_a = dir_a / "widget_creation.feature"
|
|
256
|
+
feature_b = dir_b / "widget_creation.feature"
|
|
257
|
+
feature_a.write_text(build_fixture(canary_a))
|
|
258
|
+
feature_b.write_text(build_fixture(canary_b))
|
|
259
|
+
|
|
260
|
+
prompt_a = build_prompt(feature_a, canary_a)
|
|
261
|
+
prompt_b = build_prompt(feature_b, canary_b)
|
|
262
|
+
|
|
263
|
+
# Two fully independent subprocess calls — no shared mutable state,
|
|
264
|
+
# no piping one call's output into the other's prompt.
|
|
265
|
+
transcript_a = dispatch(prompt_a, args.model, args.timeout)
|
|
266
|
+
transcript_b = dispatch(prompt_b, args.model, args.timeout)
|
|
267
|
+
|
|
268
|
+
if transcript_a is None or transcript_b is None:
|
|
269
|
+
print(
|
|
270
|
+
"SKIP: one or both dispatches did not produce usable output — "
|
|
271
|
+
"treating as an infrastructure problem, not a contamination "
|
|
272
|
+
"finding."
|
|
273
|
+
)
|
|
274
|
+
return 0
|
|
275
|
+
|
|
276
|
+
violations = check_cross_contamination(
|
|
277
|
+
transcript_a, transcript_b, canary_a, canary_b
|
|
278
|
+
)
|
|
279
|
+
if violations:
|
|
280
|
+
print(
|
|
281
|
+
"FAIL: cross-contamination detected between mutually-blind "
|
|
282
|
+
"gherkin-quality-critic dispatches:"
|
|
283
|
+
)
|
|
284
|
+
for v in violations:
|
|
285
|
+
print(f" - {v}")
|
|
286
|
+
return 1
|
|
287
|
+
|
|
288
|
+
print(
|
|
289
|
+
"OK: both gherkin-quality-critic dispatches completed with no "
|
|
290
|
+
"cross-contamination detected."
|
|
291
|
+
)
|
|
292
|
+
return 0
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
if __name__ == "__main__": # pragma: no cover
|
|
296
|
+
sys.exit(main())
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Resolve a review agent's verification-mode model/effort tier (#1628).
|
|
3
|
+
|
|
4
|
+
When a fix loop re-dispatches an agent to CONFIRM a fix, the task is far
|
|
5
|
+
narrower than discovery — "here is the finding, here is the fix diff:
|
|
6
|
+
resolved or not?" — but the dispatch costs the same. An agent may opt in to a
|
|
7
|
+
cheaper tier for verification dispatches only, by declaring in its **body**:
|
|
8
|
+
|
|
9
|
+
Verify-model: haiku
|
|
10
|
+
Verify-effort: medium
|
|
11
|
+
|
|
12
|
+
Body declarations, not frontmatter: issue #1333 reserves agent frontmatter
|
|
13
|
+
for the official Claude Code sub-agent contract recorded in
|
|
14
|
+
`plugins/marketplace-dev/knowledge/agent-contract.json` (a dated snapshot of
|
|
15
|
+
upstream docs, not a schema this plugin may extend). `Scope:`, `Cites:`, and
|
|
16
|
+
`Enforcement:` follow the same rule. Claude Code silently ignores unknown
|
|
17
|
+
frontmatter keys, so a frontmatter typo would also have been invisible; a
|
|
18
|
+
body declaration this script parses is checkable.
|
|
19
|
+
|
|
20
|
+
**Declared, never inferred.** With no opt-in, the returned tier is the
|
|
21
|
+
agent's own discovery tier — unchanged. That default is deliberate: #1619
|
|
22
|
+
showed some confirmations genuinely need top-tier judgment (the ECMA-402
|
|
23
|
+
receiver-binding call), so tiering down is opt-in per agent, never a blanket
|
|
24
|
+
rule and never derived from a finding's severity.
|
|
25
|
+
|
|
26
|
+
Full contract: `knowledge/verification-mode.md`.
|
|
27
|
+
|
|
28
|
+
Usage:
|
|
29
|
+
python3 verify_tier.py --agent structure-review
|
|
30
|
+
python3 verify_tier.py --all
|
|
31
|
+
|
|
32
|
+
Stdlib-only. See docs/python-hook-contract.md.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
from __future__ import annotations
|
|
36
|
+
|
|
37
|
+
import argparse
|
|
38
|
+
import json
|
|
39
|
+
import re
|
|
40
|
+
import sys
|
|
41
|
+
from pathlib import Path
|
|
42
|
+
|
|
43
|
+
# scripts/verify_tier.py -> scripts -> plugin root
|
|
44
|
+
_PLUGIN_ROOT = Path(__file__).resolve().parents[1]
|
|
45
|
+
_AGENTS_DIR = _PLUGIN_ROOT / "agents"
|
|
46
|
+
|
|
47
|
+
_VERIFY_MODEL_RE = re.compile(r"^\s*Verify-model\s*:\s*(\S+)\s*$", re.IGNORECASE)
|
|
48
|
+
_VERIFY_EFFORT_RE = re.compile(r"^\s*Verify-effort\s*:\s*(\S+)\s*$", re.IGNORECASE)
|
|
49
|
+
_FM_MODEL_RE = re.compile(r"^\s*model\s*:\s*(\S+)\s*$")
|
|
50
|
+
_FM_EFFORT_RE = re.compile(r"^\s*effort\s*:\s*(\S+)\s*$")
|
|
51
|
+
|
|
52
|
+
#: Same closed enums the official contract declares for `model:`/`effort:`
|
|
53
|
+
#: (agent-contract.json). A declaration outside these is a typo, not a new
|
|
54
|
+
#: tier — reported as an error rather than passed through to a dispatch that
|
|
55
|
+
#: would fail at runtime.
|
|
56
|
+
VALID_MODELS = frozenset({"sonnet", "opus", "haiku", "fable", "inherit"})
|
|
57
|
+
VALID_EFFORTS = frozenset({"low", "medium", "high", "xhigh", "max"})
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _split(text: str) -> tuple[str, str]:
|
|
61
|
+
"""Return `(frontmatter, body)`. A file without frontmatter is all body."""
|
|
62
|
+
if not text.startswith("---"):
|
|
63
|
+
return "", text
|
|
64
|
+
end = text.find("\n---", 3)
|
|
65
|
+
if end == -1:
|
|
66
|
+
return "", text
|
|
67
|
+
after = text.find("\n", end + 1)
|
|
68
|
+
return text[3:end], (text[after + 1 :] if after != -1 else "")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def resolve(text: str, agent: str = "") -> dict:
|
|
72
|
+
"""Resolve the verification tier from one agent file's contents.
|
|
73
|
+
|
|
74
|
+
Returns `{"agent", "model", "effort", "opted_in", "errors"}`. `model` and
|
|
75
|
+
`effort` are the values to dispatch this agent at in verification mode —
|
|
76
|
+
already falling back to the frontmatter (discovery) values when no opt-in
|
|
77
|
+
is declared, so a caller never needs its own fallback logic.
|
|
78
|
+
|
|
79
|
+
An invalid declared value is reported in `errors` and **ignored** for that
|
|
80
|
+
field, which falls back to the discovery tier. Failing closed to the more
|
|
81
|
+
expensive tier is the right direction: a typo must never silently make a
|
|
82
|
+
review cheaper than intended.
|
|
83
|
+
"""
|
|
84
|
+
frontmatter, body = _split(text)
|
|
85
|
+
errors = []
|
|
86
|
+
|
|
87
|
+
discovery_model = _first(_FM_MODEL_RE, frontmatter) or "inherit"
|
|
88
|
+
discovery_effort = _first(_FM_EFFORT_RE, frontmatter) or "inherit"
|
|
89
|
+
|
|
90
|
+
verify_model = _first(_VERIFY_MODEL_RE, body)
|
|
91
|
+
verify_effort = _first(_VERIFY_EFFORT_RE, body)
|
|
92
|
+
|
|
93
|
+
if verify_model is not None and verify_model.lower() not in VALID_MODELS:
|
|
94
|
+
errors.append(
|
|
95
|
+
f"Verify-model: {verify_model!r} is not one of {sorted(VALID_MODELS)}"
|
|
96
|
+
)
|
|
97
|
+
verify_model = None
|
|
98
|
+
if verify_effort is not None and verify_effort.lower() not in VALID_EFFORTS:
|
|
99
|
+
errors.append(
|
|
100
|
+
f"Verify-effort: {verify_effort!r} is not one of {sorted(VALID_EFFORTS)}"
|
|
101
|
+
)
|
|
102
|
+
verify_effort = None
|
|
103
|
+
|
|
104
|
+
opted_in = verify_model is not None or verify_effort is not None
|
|
105
|
+
return {
|
|
106
|
+
"agent": agent,
|
|
107
|
+
"model": (verify_model or discovery_model).lower(),
|
|
108
|
+
"effort": (verify_effort or discovery_effort).lower(),
|
|
109
|
+
"opted_in": opted_in,
|
|
110
|
+
"errors": errors,
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _first(pattern, text: str):
|
|
115
|
+
for line in text.splitlines():
|
|
116
|
+
match = pattern.match(line)
|
|
117
|
+
if match:
|
|
118
|
+
return match.group(1)
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def resolve_agent(name: str, agents_dir: Path | None = None) -> dict:
|
|
123
|
+
path = (agents_dir or _AGENTS_DIR) / f"{name}.md"
|
|
124
|
+
if not path.is_file():
|
|
125
|
+
return {
|
|
126
|
+
"agent": name,
|
|
127
|
+
"model": "inherit",
|
|
128
|
+
"effort": "inherit",
|
|
129
|
+
"opted_in": False,
|
|
130
|
+
"errors": [f"no such agent file: {path}"],
|
|
131
|
+
}
|
|
132
|
+
return resolve(path.read_text(encoding="utf-8"), name)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def main(argv=None) -> int:
|
|
136
|
+
parser = argparse.ArgumentParser(description="Resolve verification-mode dispatch tiers.")
|
|
137
|
+
group = parser.add_mutually_exclusive_group(required=True)
|
|
138
|
+
group.add_argument("--agent", help="Agent name (without .md)")
|
|
139
|
+
group.add_argument("--all", action="store_true", help="Every review agent")
|
|
140
|
+
parser.add_argument("--agents-dir", type=Path, default=_AGENTS_DIR)
|
|
141
|
+
args = parser.parse_args(argv)
|
|
142
|
+
|
|
143
|
+
if args.agent:
|
|
144
|
+
result = resolve_agent(args.agent, args.agents_dir)
|
|
145
|
+
print(json.dumps(result, sort_keys=True))
|
|
146
|
+
return 1 if result["errors"] else 0
|
|
147
|
+
|
|
148
|
+
results = [
|
|
149
|
+
resolve_agent(path.stem, args.agents_dir)
|
|
150
|
+
for path in sorted(args.agents_dir.glob("*-review.md"))
|
|
151
|
+
]
|
|
152
|
+
print(json.dumps({"agents": results}, sort_keys=True))
|
|
153
|
+
return 1 if any(r["errors"] for r in results) else 0
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
if __name__ == "__main__":
|
|
157
|
+
raise SystemExit(main(sys.argv[1:]))
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: adr-tools
|
|
3
|
+
description: Create and manage Architecture Decision Records using the npryce adr-tools CLI. Use when the user asks to "add an ADR", "record this decision", "create an ADR", "supersede ADR N", "link ADRs", "generate the ADR table of contents", or any request involving the `adr` command. Pairs with the adr-author agent — this skill is the mechanics (commands, files, links); adr-author is the decision framework (when an ADR is warranted) and the prose authoring.
|
|
4
|
+
role: worker
|
|
5
|
+
user-invocable: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR Tools
|
|
9
|
+
|
|
10
|
+
Mechanics for working with [npryce/adr-tools](https://github.com/npryce/adr-tools) — the `adr` CLI that creates numbered Architecture Decision Records. Pairs with the [`adr-author`](../../agents/adr-author.md) agent: that agent decides *whether* an ADR is warranted and writes the prose; this skill drives the CLI correctly.
|
|
11
|
+
|
|
12
|
+
## Pre-flight
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
command -v adr || echo "adr-tools not installed — see https://github.com/npryce/adr-tools"
|
|
16
|
+
cat .adr-dir 2>/dev/null # project's configured ADR directory
|
|
17
|
+
ls "$(cat .adr-dir 2>/dev/null || echo docs/adr)/" 2>/dev/null | head -3
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
If the pre-flight reports `adr` missing, run `/project-init` to set up this repo's tooling — it installs the `adr` CLI as a capability tool (see its `${CLAUDE_PLUGIN_ROOT}/skills/project-init/references/capability-tools.md`) — or install it directly: see [npryce/adr-tools](https://github.com/npryce/adr-tools) (the CLI link is the fallback).
|
|
21
|
+
|
|
22
|
+
Project convention is `docs/adr/`. `adr-tools` stores the directory in `.adr-dir` at the project root — `adr` reads that file to find the ADRs no matter what subdirectory you're in. If `.adr-dir` is missing, run `adr init docs/adr` once. Do not init silently into a different path — confirm with the user if existing ADRs live somewhere unexpected.
|
|
23
|
+
|
|
24
|
+
## Editor caveat — the most common failure
|
|
25
|
+
|
|
26
|
+
`adr new` opens `$VISUAL` or `$EDITOR` (defaulting to `vi`). In a Claude Code shell this hangs the command and exits non-zero — the file is created but empty. Two workarounds:
|
|
27
|
+
|
|
28
|
+
1. **Preferred — bypass the editor.** Run with a no-op editor, then write the body with the Write tool:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
EDITOR=true VISUAL=true adr new "<title>"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The command prints the new file path to stdout. Read it, then replace the template Context/Decision/Consequences sections with the real content via Edit or Write.
|
|
35
|
+
|
|
36
|
+
2. **Fallback — let it fail, then fill in.** `adr new "<title>"` will create the templated file and exit non-zero from the editor failure. Read the new file (it lives at `<adr-dir>/NNNN-<slugified-title>.md` — typically `docs/adr/`) and fill it in.
|
|
37
|
+
|
|
38
|
+
The skill always prefers workaround 1.
|
|
39
|
+
|
|
40
|
+
## Workflows
|
|
41
|
+
|
|
42
|
+
### Create a new ADR
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
EDITOR=true VISUAL=true adr new "<title in plain words>"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Then Edit the generated file to fill in:
|
|
49
|
+
|
|
50
|
+
- **Status** — `Accepted` (default) is fine for decisions already made. Use `Proposed` only if there is genuine open debate.
|
|
51
|
+
- **Context** — what forces drove this decision (constraints, alternatives considered, prior art)
|
|
52
|
+
- **Decision** — what we are doing (active voice, present tense: "Adopt X" not "We will adopt X")
|
|
53
|
+
- **Consequences** — easier / harder / risks. Be specific. If you cannot name a concrete trade-off, the decision probably did not need an ADR.
|
|
54
|
+
|
|
55
|
+
Commit the new ADR in the same commit (or PR) as the implementation it justifies.
|
|
56
|
+
|
|
57
|
+
### Supersede an earlier ADR
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
EDITOR=true VISUAL=true adr new -s <N> "<new title>"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`adr-tools` automatically:
|
|
64
|
+
|
|
65
|
+
- Inserts a "Supersedes [ADR N](N-old-title.md)" link in the new ADR's Status section.
|
|
66
|
+
- Edits ADR N's Status to "Superseded by [ADR M](M-new-title.md)".
|
|
67
|
+
|
|
68
|
+
Do not delete the old ADR. Its history is the point.
|
|
69
|
+
|
|
70
|
+
### Link two ADRs without superseding
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
adr link <SOURCE> "<LINK>" <TARGET> "<REVERSE-LINK>"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Example: `adr link 12 "Amends" 10 "Amended by"`. Use this for relationships like Amends/Refines/Constrains. Multiple links are normal.
|
|
77
|
+
|
|
78
|
+
### List all ADRs
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
adr list
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Returns sorted file paths. Pipe through `xargs head -1` for a quick title scan.
|
|
85
|
+
|
|
86
|
+
### Generate the table of contents
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
adr generate toc > docs/adr/README.md
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Run this after creating or superseding any ADR, then commit the regenerated TOC alongside the ADR change. Without this, the index drifts.
|
|
93
|
+
|
|
94
|
+
### Generate the dependency graph
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
adr generate graph | dot -Tpng > docs/adr/graph.png
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Optional but useful when supersede/link chains get deep. Requires Graphviz (`dot`).
|
|
101
|
+
|
|
102
|
+
## Anti-patterns to refuse
|
|
103
|
+
|
|
104
|
+
- **Don't renumber ADRs.** `adr-tools` assigns sequential numbers; references in commits, PRs, and other ADRs depend on them being stable. If a number is wrong, supersede; never renumber.
|
|
105
|
+
- **Don't edit ADR status with a text editor when superseding.** Use `adr new -s <N>` so the bidirectional link is automatic and consistent.
|
|
106
|
+
- **Don't squash multiple decisions into one ADR.** One decision per file. If a "Decision" section has multiple bullets that are not facets of the same choice, split.
|
|
107
|
+
- **Don't write Decision in future tense.** "We will adopt X" reads as a proposal; "Adopt X" reads as a decision. Use the latter for `Accepted` status.
|
|
108
|
+
- **Don't omit Consequences.** An ADR without trade-offs is a note, not a decision record. If there genuinely are no consequences, the decision did not need an ADR — defer to the [`adr-author`](../../agents/adr-author.md) decision framework.
|
|
109
|
+
|
|
110
|
+
## When to defer to adr-author
|
|
111
|
+
|
|
112
|
+
This skill handles the CLI mechanics. Use the [`adr-author`](../../agents/adr-author.md) agent when:
|
|
113
|
+
|
|
114
|
+
- It is unclear whether the change *warrants* an ADR (see its decision framework).
|
|
115
|
+
- The decision has policy or architectural implications and you want prose with the right scope.
|
|
116
|
+
- You need to maintain the ADR index README beyond what `adr generate toc` produces.
|
|
117
|
+
|
|
118
|
+
A typical flow: the user asks "should we ADR this?" → adr-author decides yes/no and drafts the body → this skill runs the `adr new` / `adr link` commands and regenerates the TOC.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-readiness
|
|
3
|
+
description: >-
|
|
4
|
+
Score how ready the current repository is for AI-assisted development against
|
|
5
|
+
the Agent-Readiness Scorecard. Use when the user asks "how agent-ready is this
|
|
6
|
+
repo", "score this repo for agents", "agent readiness", or wants a tiered
|
|
7
|
+
readiness report. Scores YOUR project repo's readiness — not the dev-team
|
|
8
|
+
plugin's own review agents and routing (for that, use /harness-audit).
|
|
9
|
+
argument-hint: "[repo-path] [--json <file>] [--markdown <file>]"
|
|
10
|
+
user-invocable: true
|
|
11
|
+
allowed-tools: >-
|
|
12
|
+
Bash(python3 *), Read, Glob
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Agent-Readiness Scanner (MVP)
|
|
16
|
+
|
|
17
|
+
Role: worker. Scores a **single local repository** against the Agent-Readiness
|
|
18
|
+
Scorecard and reports a tier (Agent-Ready / Assisted / Limited / Hostile) with
|
|
19
|
+
per-criterion evidence.
|
|
20
|
+
|
|
21
|
+
> **Not `/harness-audit`.** This scores the **subject repository** (your
|
|
22
|
+
> project's build, code quality, docs, and version-control hygiene) from a
|
|
23
|
+
> static checkout. `/harness-audit` audits the **dev-team plugin's own harness**
|
|
24
|
+
> (review-agent effectiveness, model tiers, orchestration) from accumulated
|
|
25
|
+
> runtime metrics. Different subject, different input, different output.
|
|
26
|
+
|
|
27
|
+
## Scope (MVP — issue #117)
|
|
28
|
+
|
|
29
|
+
This MVP uses **file-presence/heuristic analyzers only** — no CI-platform APIs.
|
|
30
|
+
It scores the criteria that can be judged from a checkout:
|
|
31
|
+
|
|
32
|
+
- **Build & Env:** B2 reproducible env, B3 dependency lock files, B5 composite check command
|
|
33
|
+
- **Code Quality:** C1 formatting, C2 linting, C4 module size (p90 line count)
|
|
34
|
+
- **Documentation:** D1 README, D2 AI instructions, D3 architecture docs,
|
|
35
|
+
D5 CLAUDE.md size, D6 layered context
|
|
36
|
+
- **Version Control:** V2 pre-commit hooks, V3 commit conventions, V4 dep scanning
|
|
37
|
+
|
|
38
|
+
D5, D6, B5 (and the manual-review-only D7) implement the AI-friendly repository
|
|
39
|
+
rubric in [`knowledge/ai-friendly-repo-guidelines.md`](../../knowledge/ai-friendly-repo-guidelines.md),
|
|
40
|
+
the canonical source for the rationale; evidence strings link to its anchors.
|
|
41
|
+
Colocated-test and directory-depth criteria are a deferred follow-up.
|
|
42
|
+
|
|
43
|
+
**Score shift (scorecard 1.1-mvp).** Adding D5, D6 and B5 changes the
|
|
44
|
+
documentation and build_env category percentages, and so the renormalized
|
|
45
|
+
overall score, for repos scanned before this version. The shift is accepted;
|
|
46
|
+
tier thresholds are unchanged. Compare scores only within one scorecard
|
|
47
|
+
version (`scanner_version` in the JSON).
|
|
48
|
+
|
|
49
|
+
Criteria that need CI-platform data (coverage, flaky rate, durations, branch
|
|
50
|
+
policy — T1–T5, B1, B4, C5, S1–S4, V1) and the org-scale Azure DevOps / Jenkins
|
|
51
|
+
discovery from the original plan are **deferred** to follow-up phases.
|
|
52
|
+
Categories with no MVP criterion (test infrastructure, type safety) are reported
|
|
53
|
+
as `deferred` and excluded from the renormalized overall score.
|
|
54
|
+
|
|
55
|
+
## Evidence table
|
|
56
|
+
|
|
57
|
+
Each scored criterion emits `score` (0-2), `max`, and an `evidence` string. The
|
|
58
|
+
new criteria use `found X; threshold Y; to fix: Z (see <guide>#anchor)`.
|
|
59
|
+
N/A results (`max` 0, e.g. D5 when no AI-instructions file exists; see D2) are
|
|
60
|
+
exempt: they carry a plain-text reason and add nothing to the category score.
|
|
61
|
+
|
|
62
|
+
| Criterion | Category | Scores on | Threshold (scorecard.yaml) |
|
|
63
|
+
| --- | --- | --- | --- |
|
|
64
|
+
| B2_reproducible_env | build_env | devcontainer/compose/nix/Dockerfile | presence |
|
|
65
|
+
| B3_dependency_management | build_env | committed lock files | presence |
|
|
66
|
+
| B5_composite_check_command | build_env | `check`/`verify`/`ci`/`all` target running lint and test | `check_target_names` |
|
|
67
|
+
| C1_formatting | code_quality | formatter config + CI step | presence |
|
|
68
|
+
| C2_linting | code_quality | linter config + CI step | presence |
|
|
69
|
+
| C4_module_size | code_quality | p90 source-file line count | `file_size_p90_*` |
|
|
70
|
+
| D1_readme | documentation | README words + setup/build/test | `readme_min_words` |
|
|
71
|
+
| D2_ai_instructions | documentation | AI-instructions file present and detailed | `ai_instructions_min_words` |
|
|
72
|
+
| D3_architecture_docs | documentation | ADRs / architecture docs | presence |
|
|
73
|
+
| D5_claude_md_size | documentation | instructions-file line count (N/A when none; see D2) | `claude_md_max_lines`, `claude_md_hard_max_lines` |
|
|
74
|
+
| D6_layered_context | documentation | non-empty nested CLAUDE.md or `.claude/rules/*.md` | presence |
|
|
75
|
+
| V2_precommit_hooks | vcs_safety | pre-commit hook config | presence |
|
|
76
|
+
| V3_commit_conventions | vcs_safety | commitlint tooling + enforcement | presence |
|
|
77
|
+
| V4_dependency_scanning | vcs_safety | dependabot/renovate/snyk config | presence |
|
|
78
|
+
|
|
79
|
+
Manual review only (never scored): C3, S3, D4, **D7_reference_implementation**
|
|
80
|
+
(is a canonical reference implementation named in CLAUDE.md, and well chosen?).
|
|
81
|
+
|
|
82
|
+
## Run
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-readiness/scanner.py" [REPO_PATH] \
|
|
86
|
+
[--json out.json] [--markdown out.md]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- `REPO_PATH` defaults to the current directory.
|
|
90
|
+
- With no `--json`/`--markdown`, prints the JSON result and a Markdown summary.
|
|
91
|
+
- Weights, tier thresholds, and per-criterion thresholds live in
|
|
92
|
+
`scorecard.yaml` next to the scanner — edit there to tune; no code change.
|
|
93
|
+
|
|
94
|
+
## Steps
|
|
95
|
+
|
|
96
|
+
1. Run the scanner against the target repo (default: current repo).
|
|
97
|
+
2. Report the tier and overall score, then the per-criterion evidence table.
|
|
98
|
+
3. Surface `manual_review_flags` (C3/S3/D4/D7 are heuristic-weak and need human
|
|
99
|
+
judgment) and the list of deferred categories, so the score is not
|
|
100
|
+
mistaken for a full assessment.
|
|
101
|
+
4. If asked, suggest the highest-leverage improvements (lowest-scoring MVP
|
|
102
|
+
criteria first).
|
|
103
|
+
|
|
104
|
+
Do not invent scores — report exactly what the scanner emits, including its
|
|
105
|
+
evidence strings.
|