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,368 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Across-invocation `/pr` gate scoping — the fix-diff retry loop (#2087).
|
|
3
|
+
|
|
4
|
+
## The gap this closes
|
|
5
|
+
|
|
6
|
+
`/code-review`'s own round ledger (`../code-review/scripts/finding_signature.py`,
|
|
7
|
+
#1625) and closing pass (`../code-review/scripts/closing_pass.py`, #1626)
|
|
8
|
+
already scope a review down to the fix delta — but strictly *within one*
|
|
9
|
+
`/code-review` invocation's own internal fix loop (up to `MAX_ITERATIONS=5`).
|
|
10
|
+
`finding_signature.py`'s own reset-trigger table is explicit that "round 1
|
|
11
|
+
always starts a new run": every NEW top-level `/code-review` call — including
|
|
12
|
+
a second `/pr` invocation run after a human manually fixes something outside
|
|
13
|
+
code-review's own automatic loop — restarts at round 1 with the FULL
|
|
14
|
+
branch-diff panel, whatever narrower scoping the previous invocation had
|
|
15
|
+
converged to.
|
|
16
|
+
|
|
17
|
+
That is the actual mechanism PR #2085 paid for: `/pr`'s Step 2 gate calls
|
|
18
|
+
`/code-review --since <merge-base> --json` exactly once per `/pr` invocation,
|
|
19
|
+
unconditionally at full-branch scope. Two separate `/pr` runs (Round B and
|
|
20
|
+
Round C) each re-scanned all 10 changed files with a 6-8 finder-agent fleet,
|
|
21
|
+
even though the only thing that had changed since the prior round was the fix
|
|
22
|
+
applied in direct response to that prior round's own findings. Reconstructed
|
|
23
|
+
cost for that one PR's review rounds: ~$242 across 91 subagent dispatches.
|
|
24
|
+
|
|
25
|
+
## What this module is
|
|
26
|
+
|
|
27
|
+
A deterministic transition function — no LLM judgment — callable once per
|
|
28
|
+
`/pr` Step-2 gate check, that decides what git ref to hand `/code-review
|
|
29
|
+
--since <ref>` next, and whether the retry budget for this PR is exhausted.
|
|
30
|
+
State persists in a JSON file across separate `/pr` invocations (mirroring
|
|
31
|
+
where `../code-review/scripts/finding_signature.py`'s
|
|
32
|
+
`review-round-state.json` already lives), so a second `/pr` run on the same
|
|
33
|
+
branch narrows to just the fix delta instead of re-scanning everything.
|
|
34
|
+
|
|
35
|
+
The phase machine has four states: `initial` (first, full-branch check) ->
|
|
36
|
+
`fix-diff` (narrow re-check after a `fail`) -> `confirm` (one mandatory
|
|
37
|
+
full-branch pass before the gate can close, issue #2087's requirement 3) ->
|
|
38
|
+
`done`. A `fail` from any phase routes back to `fix-diff` — see `decide()`'s
|
|
39
|
+
"pass or warn" branch, which is the only place `phase` advances forward.
|
|
40
|
+
|
|
41
|
+
## Design mirrors `finding_signature.py`, deliberately not imported
|
|
42
|
+
|
|
43
|
+
Same four-trigger, precedence-ordered, "fails toward a reset" reset-trigger
|
|
44
|
+
table; same round-cap posture; the TTL and round-cap constants below are
|
|
45
|
+
independently defined and cross-checked for drift in
|
|
46
|
+
`plugins/dev-team/tests/scripts/test_gate_retry_state.py`, exactly like
|
|
47
|
+
`closing_pass.py`'s `MIN_DISTINCT_DISPATCHES` is checked against
|
|
48
|
+
`hooks/pre_pr_review.py`. This script must not import across skill
|
|
49
|
+
directories — a future change to either skill's constant fails a test rather
|
|
50
|
+
than silently drifting the other.
|
|
51
|
+
|
|
52
|
+
## Why the "no `--last-outcome`" call still writes a placeholder
|
|
53
|
+
|
|
54
|
+
The first call of a `/pr` invocation (no `--last-outcome` yet) reports a
|
|
55
|
+
scope without "committing" a new round — no round increment, no recorded
|
|
56
|
+
outcome. But if that call is a genuinely fresh start (no prior state, or the
|
|
57
|
+
prior run's own gate already reached `done`), it *does* persist a minimal
|
|
58
|
+
placeholder (`round=1, phase="initial"`) so that a crash between this call
|
|
59
|
+
and the `--last-outcome` call that would normally follow it (`/code-review`
|
|
60
|
+
itself dying mid-run, the session ending) leaves evidence on disk: the next
|
|
61
|
+
invocation's first call resumes at the same round/scope instead of silently
|
|
62
|
+
losing the fact that a full-branch check was already attempted. See
|
|
63
|
+
`compute_pending()`'s `phase == "initial"` branch, which exists solely to
|
|
64
|
+
serve this resumed-but-never-recorded case.
|
|
65
|
+
|
|
66
|
+
Stdlib-only. See docs/python-hook-contract.md.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
from __future__ import annotations
|
|
70
|
+
|
|
71
|
+
import argparse
|
|
72
|
+
import json
|
|
73
|
+
import sys
|
|
74
|
+
from datetime import datetime, timezone
|
|
75
|
+
from pathlib import Path
|
|
76
|
+
|
|
77
|
+
#: Total dispatch rounds after which the retry loop stops advancing
|
|
78
|
+
#: automatically and hands control back to a human — no further `/pr`
|
|
79
|
+
#: invocation narrows the scope on its own. Same value and reasoning as
|
|
80
|
+
#: `../code-review/scripts/finding_signature.py`'s `MAX_ROUNDS` (initial +
|
|
81
|
+
#: 3 more); independently defined so a change to one doesn't silently
|
|
82
|
+
#: desync from the other. Drift-tested in
|
|
83
|
+
#: `plugins/dev-team/tests/scripts/test_gate_retry_state.py`.
|
|
84
|
+
PR_GATE_MAX_ROUNDS = 4
|
|
85
|
+
|
|
86
|
+
#: A stored gate-retry state older than this is discarded rather than
|
|
87
|
+
#: reused — the same 24h reasoning as `finding_signature.STATE_TTL_SECONDS`:
|
|
88
|
+
#: a `/pr` gate check does not legitimately span a day, so a state file that
|
|
89
|
+
#: old is abandoned residue. Independently defined; drift-tested alongside
|
|
90
|
+
#: `PR_GATE_MAX_ROUNDS` above.
|
|
91
|
+
PR_GATE_STATE_TTL_SECONDS = 24 * 60 * 60
|
|
92
|
+
|
|
93
|
+
_OUTCOMES = frozenset({"pass", "warn", "fail"})
|
|
94
|
+
|
|
95
|
+
_DEFAULT_STATE_PATH = ".claude/memory/pr-gate-state.json"
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _now_iso() -> str:
|
|
99
|
+
return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _age_seconds(iso) -> float | None:
|
|
103
|
+
try:
|
|
104
|
+
stamp = datetime.strptime(iso, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=timezone.utc)
|
|
105
|
+
except (TypeError, ValueError):
|
|
106
|
+
return None
|
|
107
|
+
return (datetime.now(timezone.utc) - stamp).total_seconds()
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _load_state(state_path, branch: str, base_sha: str, force_reset: bool):
|
|
111
|
+
"""Load the persisted gate-retry state, discarding it when it can't be
|
|
112
|
+
safely resumed. Returns `(state_or_None, reset_reason)`; `state_or_None`
|
|
113
|
+
is `None` whenever this run must start fresh, and `reset_reason` is
|
|
114
|
+
`None` only when nothing anomalous happened (no file at all, or a
|
|
115
|
+
legitimately resumed run).
|
|
116
|
+
|
|
117
|
+
Four reset triggers, in precedence order — mirrors
|
|
118
|
+
`finding_signature._load_state`'s table and its "fails toward a reset"
|
|
119
|
+
philosophy: an ambiguous or stale state always restarts full-branch
|
|
120
|
+
rather than risking a narrow scope that silently misses something.
|
|
121
|
+
|
|
122
|
+
1. `--reset` — explicit, caller-forced.
|
|
123
|
+
2. Stored `branch` differs from the current branch — belongs to a
|
|
124
|
+
different `/pr` run entirely (a fresh branch, or history from a
|
|
125
|
+
branch reused for something else).
|
|
126
|
+
3. Stored `base_sha` differs from the current merge-base — the base
|
|
127
|
+
moved (rebase, or the target branch advanced) since the last check;
|
|
128
|
+
"only what changed since `last_reviewed_sha`" no longer holds safely
|
|
129
|
+
against a shifted base.
|
|
130
|
+
4. Staleness — `PR_GATE_STATE_TTL_SECONDS` since the run started.
|
|
131
|
+
|
|
132
|
+
A missing state file is not itself a "reset" (nothing was there to
|
|
133
|
+
reset) — it returns `(None, None)`, the same as `finding_signature`'s
|
|
134
|
+
round-1 case, and is handled as a fresh start by `compute_pending()`.
|
|
135
|
+
"""
|
|
136
|
+
if force_reset:
|
|
137
|
+
return None, "explicit-reset"
|
|
138
|
+
if state_path is None or not state_path.is_file():
|
|
139
|
+
return None, None
|
|
140
|
+
|
|
141
|
+
try:
|
|
142
|
+
stored = json.loads(state_path.read_text(encoding="utf-8"))
|
|
143
|
+
except (OSError, ValueError):
|
|
144
|
+
return None, "unreadable-state"
|
|
145
|
+
if not isinstance(stored, dict):
|
|
146
|
+
return None, "unreadable-state"
|
|
147
|
+
|
|
148
|
+
if stored.get("branch") != branch:
|
|
149
|
+
return None, "branch-mismatch"
|
|
150
|
+
if stored.get("base_sha") != base_sha:
|
|
151
|
+
return None, "base-sha-mismatch"
|
|
152
|
+
|
|
153
|
+
age = _age_seconds(stored.get("started_at"))
|
|
154
|
+
if age is not None and age > PR_GATE_STATE_TTL_SECONDS:
|
|
155
|
+
return None, "stale-state"
|
|
156
|
+
|
|
157
|
+
return stored, None
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def compute_pending(stored, base_sha: str) -> dict:
|
|
161
|
+
"""Decide the scope for the round about to run (or that just ran),
|
|
162
|
+
purely from persisted state — never mutates `stored`, never touches
|
|
163
|
+
disk. `stored` is `None` (or a leftover `phase == "done"` record — see
|
|
164
|
+
module docstring's note on why that should not normally happen) for a
|
|
165
|
+
fresh start: round 1, full-branch scope.
|
|
166
|
+
|
|
167
|
+
A `phase == "initial"` resumed state is the crash-recovery case: the
|
|
168
|
+
previous `/pr` invocation's first call decided a full-branch check but
|
|
169
|
+
never got to record its outcome. Repeating `since_ref = base_sha` at the
|
|
170
|
+
same round is correct — the full-branch check never actually completed,
|
|
171
|
+
so jumping to a narrower `fix-diff` scope would silently skip reviewing
|
|
172
|
+
parts of the branch.
|
|
173
|
+
"""
|
|
174
|
+
if stored is None or stored.get("phase") == "done":
|
|
175
|
+
return {"phase": "initial", "round": 1, "since_ref": base_sha, "escalate": False}
|
|
176
|
+
|
|
177
|
+
round_ = stored.get("round", 1)
|
|
178
|
+
phase = stored.get("phase", "initial")
|
|
179
|
+
|
|
180
|
+
if round_ >= PR_GATE_MAX_ROUNDS:
|
|
181
|
+
return {"phase": phase, "round": round_, "since_ref": None, "escalate": True}
|
|
182
|
+
|
|
183
|
+
if phase == "fix-diff":
|
|
184
|
+
since_ref = stored.get("last_reviewed_sha") or base_sha
|
|
185
|
+
else: # "initial" (crash-recovery resume) or "confirm"
|
|
186
|
+
since_ref = base_sha
|
|
187
|
+
|
|
188
|
+
return {"phase": phase, "round": round_, "since_ref": since_ref, "escalate": False}
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def decide(stored, reset_reason, branch: str, base_sha: str, head_sha: str, last_outcome):
|
|
192
|
+
"""The transition function. Returns `(result, new_state_or_None, delete)`
|
|
193
|
+
— `result` is the JSON payload to print; `new_state_or_None` is what to
|
|
194
|
+
persist (or `None` for "leave disk untouched"); `delete` is `True` when
|
|
195
|
+
the caller must remove the state file instead (the `done` transitions).
|
|
196
|
+
|
|
197
|
+
See the module docstring for the phase machine and the CLI contract in
|
|
198
|
+
`main()`'s argparse help for the two call shapes (no `--last-outcome`
|
|
199
|
+
vs. `--last-outcome given`).
|
|
200
|
+
"""
|
|
201
|
+
pending = compute_pending(stored, base_sha)
|
|
202
|
+
|
|
203
|
+
if last_outcome is None:
|
|
204
|
+
# First call of a /pr invocation: report the scope this round should
|
|
205
|
+
# use. No round is "committed" here — see the module docstring's
|
|
206
|
+
# note on why a genuinely fresh start still persists a placeholder.
|
|
207
|
+
result = {
|
|
208
|
+
"since_ref": pending["since_ref"],
|
|
209
|
+
"phase": pending["phase"],
|
|
210
|
+
"round": pending["round"],
|
|
211
|
+
"reset_reason": reset_reason,
|
|
212
|
+
"escalate": pending["escalate"],
|
|
213
|
+
}
|
|
214
|
+
is_fresh_start = stored is None or stored.get("phase") == "done"
|
|
215
|
+
new_state = None
|
|
216
|
+
if is_fresh_start:
|
|
217
|
+
new_state = {
|
|
218
|
+
"branch": branch,
|
|
219
|
+
"base_sha": base_sha,
|
|
220
|
+
"last_reviewed_sha": None,
|
|
221
|
+
"round": 1,
|
|
222
|
+
"phase": "initial",
|
|
223
|
+
"started_at": _now_iso(),
|
|
224
|
+
"updated_at": _now_iso(),
|
|
225
|
+
}
|
|
226
|
+
return result, new_state, False
|
|
227
|
+
|
|
228
|
+
# --last-outcome given: record the result of the call this call's
|
|
229
|
+
# `pending` describes, then transition.
|
|
230
|
+
if pending["escalate"]:
|
|
231
|
+
# Misuse guard: the retry budget was already exhausted before this
|
|
232
|
+
# call (a caller ignored the previous escalate=true and dispatched
|
|
233
|
+
# /code-review again anyway). Do not advance the round further.
|
|
234
|
+
result = {
|
|
235
|
+
"since_ref": None,
|
|
236
|
+
"phase": pending["phase"],
|
|
237
|
+
"round": pending["round"],
|
|
238
|
+
"reset_reason": reset_reason,
|
|
239
|
+
"escalate": True,
|
|
240
|
+
}
|
|
241
|
+
return result, None, False
|
|
242
|
+
|
|
243
|
+
new_round = pending["round"] + 1
|
|
244
|
+
started_at = (stored or {}).get("started_at") or _now_iso()
|
|
245
|
+
|
|
246
|
+
if last_outcome == "fail":
|
|
247
|
+
new_state = {
|
|
248
|
+
"branch": branch,
|
|
249
|
+
"base_sha": base_sha,
|
|
250
|
+
"last_reviewed_sha": head_sha,
|
|
251
|
+
"round": new_round,
|
|
252
|
+
"phase": "fix-diff",
|
|
253
|
+
"started_at": started_at,
|
|
254
|
+
"updated_at": _now_iso(),
|
|
255
|
+
}
|
|
256
|
+
# Re-derive the returned scope from the state just persisted so the
|
|
257
|
+
# round-cap check (escalate) is computed exactly once, in
|
|
258
|
+
# compute_pending(), rather than duplicated here.
|
|
259
|
+
next_pending = compute_pending(new_state, base_sha)
|
|
260
|
+
result = {
|
|
261
|
+
"since_ref": next_pending["since_ref"],
|
|
262
|
+
"phase": next_pending["phase"],
|
|
263
|
+
"round": next_pending["round"],
|
|
264
|
+
"reset_reason": reset_reason,
|
|
265
|
+
"escalate": next_pending["escalate"],
|
|
266
|
+
}
|
|
267
|
+
return result, new_state, False
|
|
268
|
+
|
|
269
|
+
# pass or warn: converged for the scope `pending` described.
|
|
270
|
+
converged_phase = pending["phase"]
|
|
271
|
+
if converged_phase in ("initial", "confirm"):
|
|
272
|
+
# Full-branch check passed (either the very first one, or the
|
|
273
|
+
# mandatory pre-merge confirm) — nothing left to review.
|
|
274
|
+
result = {
|
|
275
|
+
"since_ref": None,
|
|
276
|
+
"phase": "done",
|
|
277
|
+
"round": new_round,
|
|
278
|
+
"reset_reason": reset_reason,
|
|
279
|
+
"escalate": False,
|
|
280
|
+
}
|
|
281
|
+
return result, None, True
|
|
282
|
+
|
|
283
|
+
# converged_phase == "fix-diff": issue #2087's requirement 3 — one
|
|
284
|
+
# mandatory full-branch confirmation before the gate can close, run
|
|
285
|
+
# immediately in the same /pr invocation (see pr/SKILL.md step 2).
|
|
286
|
+
new_state = {
|
|
287
|
+
"branch": branch,
|
|
288
|
+
"base_sha": base_sha,
|
|
289
|
+
"last_reviewed_sha": head_sha,
|
|
290
|
+
"round": new_round,
|
|
291
|
+
"phase": "confirm",
|
|
292
|
+
"started_at": started_at,
|
|
293
|
+
"updated_at": _now_iso(),
|
|
294
|
+
}
|
|
295
|
+
result = {
|
|
296
|
+
"since_ref": base_sha,
|
|
297
|
+
"phase": "confirm",
|
|
298
|
+
"round": new_round,
|
|
299
|
+
"reset_reason": reset_reason,
|
|
300
|
+
"escalate": False,
|
|
301
|
+
}
|
|
302
|
+
return result, new_state, False
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
def _write_state(state_path: Path, data: dict) -> None:
|
|
306
|
+
state_path.parent.mkdir(parents=True, exist_ok=True)
|
|
307
|
+
state_path.write_text(json.dumps(data, indent=2, sort_keys=True) + "\n", encoding="utf-8")
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def _delete_state(state_path: Path) -> None:
|
|
311
|
+
try:
|
|
312
|
+
state_path.unlink()
|
|
313
|
+
except FileNotFoundError:
|
|
314
|
+
pass
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def main(argv=None) -> int:
|
|
318
|
+
parser = argparse.ArgumentParser(
|
|
319
|
+
description=(
|
|
320
|
+
"Decide /pr Step 2's next `/code-review --since <ref>` scope "
|
|
321
|
+
"and whether the gate-retry budget is exhausted (#2087)."
|
|
322
|
+
)
|
|
323
|
+
)
|
|
324
|
+
parser.add_argument(
|
|
325
|
+
"--state",
|
|
326
|
+
default=_DEFAULT_STATE_PATH,
|
|
327
|
+
help=f"Path to the durable gate-retry state file (default: {_DEFAULT_STATE_PATH})",
|
|
328
|
+
)
|
|
329
|
+
parser.add_argument("--branch", required=True, help="Current branch name")
|
|
330
|
+
parser.add_argument(
|
|
331
|
+
"--base-sha", required=True, dest="base_sha", help="Current merge-base sha"
|
|
332
|
+
)
|
|
333
|
+
parser.add_argument("--head-sha", required=True, dest="head_sha", help="Current HEAD sha")
|
|
334
|
+
parser.add_argument(
|
|
335
|
+
"--last-outcome",
|
|
336
|
+
choices=sorted(_OUTCOMES),
|
|
337
|
+
default=None,
|
|
338
|
+
dest="last_outcome",
|
|
339
|
+
help=(
|
|
340
|
+
"Omit on the first call of a /pr invocation. Pass on every call "
|
|
341
|
+
"after a /code-review result is known, to record it and "
|
|
342
|
+
"transition to the next scope."
|
|
343
|
+
),
|
|
344
|
+
)
|
|
345
|
+
parser.add_argument(
|
|
346
|
+
"--reset", action="store_true", help="Discard any stored state and start a fresh run."
|
|
347
|
+
)
|
|
348
|
+
args = parser.parse_args(argv)
|
|
349
|
+
|
|
350
|
+
state_path = Path(args.state) if args.state else None
|
|
351
|
+
stored, reset_reason = _load_state(state_path, args.branch, args.base_sha, args.reset)
|
|
352
|
+
|
|
353
|
+
result, new_state, delete = decide(
|
|
354
|
+
stored, reset_reason, args.branch, args.base_sha, args.head_sha, args.last_outcome
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
if state_path is not None:
|
|
358
|
+
if delete:
|
|
359
|
+
_delete_state(state_path)
|
|
360
|
+
elif new_state is not None:
|
|
361
|
+
_write_state(state_path, new_state)
|
|
362
|
+
|
|
363
|
+
print(json.dumps(result, sort_keys=True))
|
|
364
|
+
return 0
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
if __name__ == "__main__":
|
|
368
|
+
raise SystemExit(main(sys.argv[1:]))
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# project-init
|
|
2
|
+
|
|
3
|
+
A Claude Code skill that gets a repository ready for the dev-team toolchain
|
|
4
|
+
in one command: it detects the project's tech stack (JS/TS, Python, C#,
|
|
5
|
+
Java), inventories the static-analysis tools the project already has,
|
|
6
|
+
confirms a three-column plan, and installs only what's missing — repo-level,
|
|
7
|
+
never user-level or global. For greenfield JavaScript it scaffolds a full
|
|
8
|
+
project with opinionated defaults for ES modules, functional development,
|
|
9
|
+
and modern tooling.
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
In any Claude Code session, say:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
/project-init
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or describe what you need:
|
|
20
|
+
|
|
21
|
+
- "set up my project's toolchain"
|
|
22
|
+
- "install the linters for this repo"
|
|
23
|
+
- "get this repo ready for the plugin"
|
|
24
|
+
- "init a new project"
|
|
25
|
+
- "set up a JS project"
|
|
26
|
+
- "create a new node app"
|
|
27
|
+
- "start a new frontend project"
|
|
28
|
+
- "bootstrap a new package"
|
|
29
|
+
|
|
30
|
+
The skill always presents its plan and asks for confirmation before writing
|
|
31
|
+
or installing anything.
|
|
32
|
+
|
|
33
|
+
## How it works
|
|
34
|
+
|
|
35
|
+
1. **Detect the stack** — cheap filesystem signals (`package.json`,
|
|
36
|
+
`pyproject.toml`, `*.csproj`, `pom.xml`, source extensions). Multiple
|
|
37
|
+
stacks set up every matched language; an empty or ambiguous directory
|
|
38
|
+
prompts you to pick a stack (or "something else", which exits without
|
|
39
|
+
writes).
|
|
40
|
+
2. **Inventory the toolchain** — per capability slot, find recognized
|
|
41
|
+
providers already present via config files, dependency declarations, and
|
|
42
|
+
executable probes. Existing, configured tools are bound, never replaced.
|
|
43
|
+
3. **Confirm a three-column plan** — *found and keeping* / *missing and
|
|
44
|
+
will add* (the only column that installs) / *found but can't
|
|
45
|
+
participate* (reason stated, default offered alongside).
|
|
46
|
+
4. **Install repo-level** — per language, into the project itself.
|
|
47
|
+
5. **Verify** — run each lane's detection probe and report which provider
|
|
48
|
+
each slot bound, so `/build`'s static self-heal pass finds the tools.
|
|
49
|
+
|
|
50
|
+
## Per-language installs
|
|
51
|
+
|
|
52
|
+
| Stack | What lands | Where |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| JS/TS | oxlint (existing repo) or the full greenfield scaffold below | `package.json` devDependencies |
|
|
55
|
+
| Python | ruff + mypy (+ pytest if no test runner) | `pyproject.toml` dev group or `requirements-dev.txt` |
|
|
56
|
+
| C# | nothing — verifies the .NET SDK (honoring `global.json`) and `dotnet format` | — |
|
|
57
|
+
| Java | pinned PMD via the plugin's installer script | gitignored `.pmd/` |
|
|
58
|
+
|
|
59
|
+
The manual commands stay documented in the static-analysis-integration
|
|
60
|
+
skill's per-language setup guide
|
|
61
|
+
(`${CLAUDE_PLUGIN_ROOT}/skills/static-analysis-integration/references/language-setup.md`);
|
|
62
|
+
this skill automates them.
|
|
63
|
+
|
|
64
|
+
## Greenfield JavaScript scaffold
|
|
65
|
+
|
|
66
|
+
| Tool | Purpose | Config File |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| **ES Modules** | `"type": "module"` in package.json | `package.json` |
|
|
69
|
+
| **oxlint** | Fast day-to-day linting (`lint`, `lint:fix`) | `.oxlintrc.json` (optional) |
|
|
70
|
+
| **ESLint** | Deep pass (`lint:deep`) — flat config with functional rules (no classes, prefer const, no mutation) | `eslint.config.js` |
|
|
71
|
+
| **Prettier** | 2-space indent, single quotes, no semicolons, trailing commas | `prettier.config.js` |
|
|
72
|
+
| **EditorConfig** | Consistent whitespace across editors | `.editorconfig` |
|
|
73
|
+
| **Vitest** | Fast ESM-native test runner | `vitest.config.js` |
|
|
74
|
+
| **Husky** | Pre-commit (lint-staged auto-fix) + pre-push (tests) | `.husky/` |
|
|
75
|
+
| **Playwright** | E2E browser testing (frontend projects only) | `playwright.config.js` |
|
|
76
|
+
|
|
77
|
+
What gets created:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
your-project/
|
|
81
|
+
package.json ES module, scripts for test/lint/format
|
|
82
|
+
eslint.config.js Flat config, functional rules, prettier integration
|
|
83
|
+
prettier.config.js Opinionated formatting
|
|
84
|
+
vitest.config.js Test runner config
|
|
85
|
+
.editorconfig Cross-editor whitespace consistency
|
|
86
|
+
.gitignore Standard ignores for JS projects
|
|
87
|
+
.husky/
|
|
88
|
+
pre-commit lint-staged auto-fix of the staged files
|
|
89
|
+
pre-push Runs the test suite before every push
|
|
90
|
+
src/
|
|
91
|
+
index.js Starter pure function
|
|
92
|
+
index.test.js Passing test to prove the toolchain works
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Frontend projects also get:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
playwright.config.js Browser testing config
|
|
99
|
+
e2e/
|
|
100
|
+
example.spec.js Placeholder E2E test
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### npm scripts
|
|
104
|
+
|
|
105
|
+
| Script | Command | Purpose |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| `npm test` | `vitest run` | Run tests once |
|
|
108
|
+
| `npm run test:watch` | `vitest` | Run tests in watch mode |
|
|
109
|
+
| `npm run test:coverage` | `vitest run --coverage` | Run with coverage report |
|
|
110
|
+
| `npm run lint` | `oxlint .` | Fast lint check |
|
|
111
|
+
| `npm run lint:fix` | `oxlint --fix .` | Auto-fix lint errors |
|
|
112
|
+
| `npm run lint:deep` | `eslint .` | Full ESLint pass (plugin-only rules) |
|
|
113
|
+
| `npm run format` | `prettier --write .` | Format all files |
|
|
114
|
+
| `npm run format:check` | `prettier --check .` | Check formatting without writing |
|
|
115
|
+
| `npm run test:e2e` | `playwright test` | Run E2E tests (frontend only) |
|
|
116
|
+
|
|
117
|
+
### Git hooks
|
|
118
|
+
|
|
119
|
+
[Husky](https://typicode.github.io/husky/) runs
|
|
120
|
+
[lint-staged](https://github.com/lint-staged/lint-staged) on every commit —
|
|
121
|
+
Prettier plus `oxlint --fix` against only the staged files — and the test
|
|
122
|
+
suite on every push. After a clone, `npm install` sets the hooks up via the
|
|
123
|
+
`prepare` script; `git push --no-verify` bypasses them in an emergency.
|
|
124
|
+
|
|
125
|
+
### Customization
|
|
126
|
+
|
|
127
|
+
The scaffold supports these customizations when prompted:
|
|
128
|
+
|
|
129
|
+
- **Indent size** — updates Prettier, EditorConfig, and ESLint
|
|
130
|
+
- **Tabs vs spaces** — updates Prettier and EditorConfig
|
|
131
|
+
- **Quote style / semicolons / print width** — updates Prettier
|
|
132
|
+
- **Package manager** — npm, yarn, or pnpm
|
|
133
|
+
- **Additional ESLint plugins** — added to the flat config array
|
|
134
|
+
|
|
135
|
+
## Existing projects
|
|
136
|
+
|
|
137
|
+
On a repo that already has sources, the skill runs in tools-only mode: it
|
|
138
|
+
never overwrites existing configs (`eslint.config.js`, `pyproject.toml`
|
|
139
|
+
sections, `.editorconfig`, …) and never displaces a bound provider (black +
|
|
140
|
+
flake8, biome, a demoted ESLint, checkstyle) with the plugin's default. The
|
|
141
|
+
plan's *found and keeping* column reports exactly what was left alone.
|