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,386 @@
|
|
|
1
|
+
"""plan_parse — extract per-slice (id, depends_on, files) from a plan markdown.
|
|
2
|
+
|
|
3
|
+
Python port of `plugins/dev-team/scripts/lib/plan-parse.sh` (#579).
|
|
4
|
+
|
|
5
|
+
Contract mirrors the bash: emit one TSV row per slice:
|
|
6
|
+
|
|
7
|
+
id<TAB>depends<TAB>files
|
|
8
|
+
|
|
9
|
+
- `depends` is `"none"`, a raw list (`"1, 2"`), or the sentinel `"__MISSING__"`
|
|
10
|
+
when the slice has no `Depends-on` line at the slice level.
|
|
11
|
+
- `files` is a raw list (`"a, b"`) or the empty string when the slice has no
|
|
12
|
+
slice-level `Files` line.
|
|
13
|
+
|
|
14
|
+
Slice-level fields are the first `Depends-on` / `Files` lines under a
|
|
15
|
+
`### Slice <id>:` heading and BEFORE that slice's first `#### Step` heading,
|
|
16
|
+
so per-step `**Files**:` lines are ignored.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
import re
|
|
23
|
+
import sys
|
|
24
|
+
from collections.abc import Iterable
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from typing import TextIO
|
|
27
|
+
|
|
28
|
+
_SLICE_RE = re.compile(r"^#+\s+[Ss]lice\s+([^:]+)")
|
|
29
|
+
_SLICE_HEADING_RE = re.compile(r"^#{1,3}\s+[Ss]lice\s+([^:]+):\s*(.*)$")
|
|
30
|
+
_HEADING_RE = re.compile(r"^#{1,3}\s")
|
|
31
|
+
_STEP_RE = re.compile(r"^#{4,}\s")
|
|
32
|
+
# `\**\s*:\s*\**\s*` handles bold markup on *both* sides of the colon —
|
|
33
|
+
# `**Depends-on:**` puts the closing `**` right after the colon, not before
|
|
34
|
+
# it, so without the trailing `\**\s*` the leaked marker lands inside the
|
|
35
|
+
# captured value (see #865 AC9: a value may legitimately end in its own
|
|
36
|
+
# `**` glob suffix like `src/auth/**`, so blanket-stripping every asterisk
|
|
37
|
+
# in `_clean_value` is no longer safe — the regex must consume the label's
|
|
38
|
+
# own bold markers instead).
|
|
39
|
+
_DEPENDS_RE = re.compile(r"[Dd]epends-[Oo]n\**\s*:\s*\**\s*(.*)")
|
|
40
|
+
_FILES_RE = re.compile(r"[Ff]iles\**\s*:\s*\**\s*(.*)")
|
|
41
|
+
_INVARIANTS_RE = re.compile(r"[Ii]nvariants\**\s*:\s*\**\s*(.*)")
|
|
42
|
+
_ROLLBACK_RE = re.compile(r"[Rr]ollback[ _-][Pp]oint\**\s*:\s*\**\s*(.*)")
|
|
43
|
+
_BACKTICK_TOKEN_RE = re.compile(r"`([^`]+)`")
|
|
44
|
+
_TOKEN_SPLIT_RE = re.compile(r"[,\s]+")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _clean_value(raw: str) -> str:
|
|
48
|
+
"""Strip backticks and bold-wrapping `**` / surrounding whitespace from a
|
|
49
|
+
field value.
|
|
50
|
+
|
|
51
|
+
Backticks are removed unconditionally (inline-code delimiters are never
|
|
52
|
+
semantically meaningful). Bold markers are trickier since #865: a `Files`
|
|
53
|
+
or `Invariants` value may legitimately end in a recursive glob like
|
|
54
|
+
`src/auth/**`, so a lone trailing `**` must survive — only a **paired**
|
|
55
|
+
`**...**` wrapping the *entire* value (both ends) is markdown bold and
|
|
56
|
+
gets stripped.
|
|
57
|
+
"""
|
|
58
|
+
value = raw.replace("`", "").strip()
|
|
59
|
+
if value.startswith("**") and value.endswith("**") and len(value) > 3:
|
|
60
|
+
value = value[2:-2].strip()
|
|
61
|
+
return value
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _parse_invariant_commands(raw: str) -> list[str]:
|
|
65
|
+
"""Split an `**Invariants:**` value into individual shell commands.
|
|
66
|
+
|
|
67
|
+
Each command is expected to be its own backtick-quoted token
|
|
68
|
+
(`` `npm test` ``, `` `python3 scripts/foo.py` ``) so commas or spaces
|
|
69
|
+
*inside* a command (e.g. `--grep "session"`) don't get misread as
|
|
70
|
+
separators. Falls back to a plain comma split when no backtick tokens
|
|
71
|
+
are present (no commands to run — an empty raw value — yields `[]`).
|
|
72
|
+
"""
|
|
73
|
+
tokens = _BACKTICK_TOKEN_RE.findall(raw)
|
|
74
|
+
if tokens:
|
|
75
|
+
return [t.strip() for t in tokens if t.strip()]
|
|
76
|
+
cleaned = _clean_value(raw)
|
|
77
|
+
if not cleaned:
|
|
78
|
+
return []
|
|
79
|
+
return [c.strip() for c in cleaned.split(",") if c.strip()]
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _slice_id(header_line: str) -> str:
|
|
83
|
+
"""Extract the slice id from a `### Slice <id>:` header line.
|
|
84
|
+
|
|
85
|
+
Mirrors the bash sed pipeline: strip the leading `#+ Slice ` prefix, then
|
|
86
|
+
everything after (and including) the first colon, then trim whitespace.
|
|
87
|
+
"""
|
|
88
|
+
match = _SLICE_RE.match(header_line)
|
|
89
|
+
if not match:
|
|
90
|
+
return ""
|
|
91
|
+
tail = match.group(1)
|
|
92
|
+
# Trim leading whitespace already stripped by `\s+` in the pattern; strip
|
|
93
|
+
# trailing content after `:` and whitespace.
|
|
94
|
+
return tail.split(":", 1)[0].strip()
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def parse_slices(lines: Iterable[str]) -> list[tuple[str, str, str]]:
|
|
98
|
+
"""Return a list of `(id, depends, files)` rows in source order."""
|
|
99
|
+
rows: list[tuple[str, str, str]] = []
|
|
100
|
+
|
|
101
|
+
current_id: str = ""
|
|
102
|
+
deps: str = ""
|
|
103
|
+
deps_seen: bool = False
|
|
104
|
+
files: str = ""
|
|
105
|
+
in_step: bool = False
|
|
106
|
+
|
|
107
|
+
def flush() -> None:
|
|
108
|
+
if current_id:
|
|
109
|
+
rows.append((current_id, deps if deps_seen else "__MISSING__", files))
|
|
110
|
+
|
|
111
|
+
for raw in lines:
|
|
112
|
+
line = raw.rstrip("\n")
|
|
113
|
+
|
|
114
|
+
# New slice header — flush the previous slice's row.
|
|
115
|
+
if _SLICE_RE.match(line):
|
|
116
|
+
flush()
|
|
117
|
+
current_id = _slice_id(line)
|
|
118
|
+
deps = ""
|
|
119
|
+
deps_seen = False
|
|
120
|
+
files = ""
|
|
121
|
+
in_step = False
|
|
122
|
+
continue
|
|
123
|
+
|
|
124
|
+
# #### Step heading turns off slice-level field collection for the
|
|
125
|
+
# rest of this slice — mirrors the bash `instep=1` flag.
|
|
126
|
+
if _STEP_RE.match(line):
|
|
127
|
+
in_step = True
|
|
128
|
+
continue
|
|
129
|
+
|
|
130
|
+
if not current_id or in_step:
|
|
131
|
+
continue
|
|
132
|
+
|
|
133
|
+
lowered = line.lower()
|
|
134
|
+
|
|
135
|
+
if not deps_seen and "depends-on" in lowered:
|
|
136
|
+
match = _DEPENDS_RE.search(line)
|
|
137
|
+
if match is not None:
|
|
138
|
+
deps = _clean_value(match.group(1))
|
|
139
|
+
deps_seen = True
|
|
140
|
+
continue
|
|
141
|
+
|
|
142
|
+
if not files and "files" in lowered:
|
|
143
|
+
match = _FILES_RE.search(line)
|
|
144
|
+
if match is not None:
|
|
145
|
+
files = _clean_value(match.group(1))
|
|
146
|
+
|
|
147
|
+
flush()
|
|
148
|
+
return rows
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def parse_slice_optional_fields(lines: Iterable[str]) -> dict[str, dict[str, object]]:
|
|
152
|
+
"""Return `{slice_id: {"invariants": [...], "rollback_point": str}}`.
|
|
153
|
+
|
|
154
|
+
Collects the two new (#865) optional slice-level fields — `**Invariants:**`
|
|
155
|
+
and `**Rollback point:**` — using the same slice-level-only grammar as
|
|
156
|
+
`parse_slices` (fields before the slice's first `#### Step` heading).
|
|
157
|
+
A slice missing either field simply has an empty list / empty string in
|
|
158
|
+
its entry; this is purely additive and never raises.
|
|
159
|
+
"""
|
|
160
|
+
result: dict[str, dict[str, object]] = {}
|
|
161
|
+
|
|
162
|
+
current_id: str = ""
|
|
163
|
+
invariants: list[str] = []
|
|
164
|
+
rollback: str = ""
|
|
165
|
+
in_step: bool = False
|
|
166
|
+
|
|
167
|
+
def flush() -> None:
|
|
168
|
+
if current_id:
|
|
169
|
+
result[current_id] = {
|
|
170
|
+
"invariants": invariants,
|
|
171
|
+
"rollback_point": rollback,
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
for raw in lines:
|
|
175
|
+
line = raw.rstrip("\n")
|
|
176
|
+
|
|
177
|
+
if _SLICE_RE.match(line):
|
|
178
|
+
flush()
|
|
179
|
+
current_id = _slice_id(line)
|
|
180
|
+
invariants = []
|
|
181
|
+
rollback = ""
|
|
182
|
+
in_step = False
|
|
183
|
+
continue
|
|
184
|
+
|
|
185
|
+
if _STEP_RE.match(line):
|
|
186
|
+
in_step = True
|
|
187
|
+
continue
|
|
188
|
+
|
|
189
|
+
if not current_id or in_step:
|
|
190
|
+
continue
|
|
191
|
+
|
|
192
|
+
lowered = line.lower()
|
|
193
|
+
|
|
194
|
+
if not invariants and "invariants" in lowered:
|
|
195
|
+
match = _INVARIANTS_RE.search(line)
|
|
196
|
+
if match is not None:
|
|
197
|
+
invariants = _parse_invariant_commands(match.group(1))
|
|
198
|
+
continue
|
|
199
|
+
|
|
200
|
+
if not rollback and "rollback" in lowered:
|
|
201
|
+
match = _ROLLBACK_RE.search(line)
|
|
202
|
+
if match is not None:
|
|
203
|
+
rollback = _clean_value(match.group(1))
|
|
204
|
+
|
|
205
|
+
flush()
|
|
206
|
+
return result
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def parse_step_files(lines: Iterable[str]) -> dict[str, list[str]]:
|
|
210
|
+
"""Return `{slice_id: [raw per-step Files values...]}` — the *inferred*
|
|
211
|
+
write set (#865). Each entry is the list of raw `**Files**:` line values
|
|
212
|
+
found under that slice's `#### Step` headings, in source order and
|
|
213
|
+
un-tokenized (callers split on `[,\\s]+` same as slice-level `files`).
|
|
214
|
+
|
|
215
|
+
This is deliberately the mirror image of `parse_slices`, which stops
|
|
216
|
+
collecting `Files` the moment a step heading is seen — here we only
|
|
217
|
+
collect *after* a step heading, so the two never double-count the same
|
|
218
|
+
line.
|
|
219
|
+
"""
|
|
220
|
+
result: dict[str, list[str]] = {}
|
|
221
|
+
|
|
222
|
+
current_id: str = ""
|
|
223
|
+
in_step: bool = False
|
|
224
|
+
|
|
225
|
+
for raw in lines:
|
|
226
|
+
line = raw.rstrip("\n")
|
|
227
|
+
|
|
228
|
+
if _SLICE_RE.match(line):
|
|
229
|
+
current_id = _slice_id(line)
|
|
230
|
+
in_step = False
|
|
231
|
+
continue
|
|
232
|
+
|
|
233
|
+
if _STEP_RE.match(line):
|
|
234
|
+
in_step = True
|
|
235
|
+
continue
|
|
236
|
+
|
|
237
|
+
if not current_id or not in_step:
|
|
238
|
+
continue
|
|
239
|
+
|
|
240
|
+
if "files" in line.lower():
|
|
241
|
+
match = _FILES_RE.search(line)
|
|
242
|
+
if match is not None:
|
|
243
|
+
value = match.group(1).strip()
|
|
244
|
+
if value:
|
|
245
|
+
result.setdefault(current_id, []).append(value)
|
|
246
|
+
|
|
247
|
+
return result
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def step_files_union(lines: Iterable[str]) -> dict[str, list[str]]:
|
|
251
|
+
"""Return `{slice_id: sorted [tokenized inferred files]}` — the union of
|
|
252
|
+
per-step `**Files**:` tokens for each slice, deduplicated and sorted.
|
|
253
|
+
Convenience wrapper around `parse_step_files` for callers (`plan_waves.py`)
|
|
254
|
+
that want the tokenized set directly rather than raw per-line values.
|
|
255
|
+
"""
|
|
256
|
+
raw = parse_step_files(lines)
|
|
257
|
+
unioned: dict[str, list[str]] = {}
|
|
258
|
+
for slice_id, values in raw.items():
|
|
259
|
+
tokens: set = set()
|
|
260
|
+
for value in values:
|
|
261
|
+
tokens.update(t for t in _TOKEN_SPLIT_RE.split(_clean_value(value)) if t)
|
|
262
|
+
unioned[slice_id] = sorted(tokens)
|
|
263
|
+
return unioned
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
class _SliceSection:
|
|
267
|
+
"""The slice section currently being walked."""
|
|
268
|
+
|
|
269
|
+
def __init__(self, slice_id: str, title: str) -> None:
|
|
270
|
+
self.slice_id = slice_id
|
|
271
|
+
self.title = title
|
|
272
|
+
self.gherkin: str | None = None
|
|
273
|
+
|
|
274
|
+
def wants_gherkin(self) -> bool:
|
|
275
|
+
return self.gherkin is None
|
|
276
|
+
|
|
277
|
+
def row(self) -> tuple[str, str, str | None]:
|
|
278
|
+
return (self.slice_id, self.title, self.gherkin)
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
class _FenceState:
|
|
282
|
+
"""Tracks fenced code blocks and collects a gherkin fence's content."""
|
|
283
|
+
|
|
284
|
+
def __init__(self) -> None:
|
|
285
|
+
self.active = False
|
|
286
|
+
self._collecting = False
|
|
287
|
+
self._lines: list[str] = []
|
|
288
|
+
|
|
289
|
+
def enter(self, line: str, wants_gherkin: bool) -> None:
|
|
290
|
+
self.active = True
|
|
291
|
+
self._collecting = wants_gherkin and line[3:].strip().lower() == "gherkin"
|
|
292
|
+
self._lines = []
|
|
293
|
+
|
|
294
|
+
def consume(self, line: str) -> str | None:
|
|
295
|
+
"""Advance one in-fence line; return the collected block (with one
|
|
296
|
+
trailing newline) when a collecting fence closes, else None."""
|
|
297
|
+
if line.startswith("```"):
|
|
298
|
+
self.active = False
|
|
299
|
+
block = "\n".join(self._lines) + "\n" if self._collecting else None
|
|
300
|
+
self._collecting = False
|
|
301
|
+
self._lines = []
|
|
302
|
+
return block
|
|
303
|
+
if self._collecting:
|
|
304
|
+
self._lines.append(line)
|
|
305
|
+
return None
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def slice_gherkin_blocks(
|
|
309
|
+
lines: Iterable[str],
|
|
310
|
+
) -> list[tuple[str, str, str | None]]:
|
|
311
|
+
"""Return `(id, title, gherkin)` per `### Slice <id>: <title>` heading.
|
|
312
|
+
|
|
313
|
+
`gherkin` is the raw content of the slice's first fenced ```gherkin
|
|
314
|
+
block (fences excluded, exactly one trailing newline), or None when the
|
|
315
|
+
slice has no such block. Fence-aware: heading-like lines inside fenced
|
|
316
|
+
code blocks never start or end a slice section.
|
|
317
|
+
|
|
318
|
+
Grammar note — this walker intentionally differs from `parse_slices`:
|
|
319
|
+
it requires the template shape (H1–H3 heading, colon after the id) and
|
|
320
|
+
is fence-aware, while `parse_slices` keeps its looser, fence-blind
|
|
321
|
+
grammar bug-for-bug with the bash original because `plan_waves.py`
|
|
322
|
+
depends on it. For template-conformant plans the two agree on the slice
|
|
323
|
+
set (pinned by `test_both_plan_walkers_agree_on_a_template_conformant_plan`);
|
|
324
|
+
they diverge only on malformed input, where the exporter's stricter
|
|
325
|
+
read is the safer one.
|
|
326
|
+
"""
|
|
327
|
+
blocks: list[tuple[str, str, str | None]] = []
|
|
328
|
+
current: _SliceSection | None = None
|
|
329
|
+
fence = _FenceState()
|
|
330
|
+
|
|
331
|
+
for raw in lines:
|
|
332
|
+
line = raw.rstrip("\n")
|
|
333
|
+
|
|
334
|
+
if fence.active:
|
|
335
|
+
block = fence.consume(line)
|
|
336
|
+
if block is not None and current is not None:
|
|
337
|
+
current.gherkin = block
|
|
338
|
+
continue
|
|
339
|
+
|
|
340
|
+
if line.startswith("```"):
|
|
341
|
+
fence.enter(line, current is not None and current.wants_gherkin())
|
|
342
|
+
continue
|
|
343
|
+
|
|
344
|
+
match = _SLICE_HEADING_RE.match(line)
|
|
345
|
+
if match:
|
|
346
|
+
if current is not None:
|
|
347
|
+
blocks.append(current.row())
|
|
348
|
+
current = _SliceSection(match.group(1).strip(), match.group(2).strip())
|
|
349
|
+
continue
|
|
350
|
+
|
|
351
|
+
# Any other level-1..3 heading ends the current slice section.
|
|
352
|
+
if current is not None and _HEADING_RE.match(line):
|
|
353
|
+
blocks.append(current.row())
|
|
354
|
+
current = None
|
|
355
|
+
|
|
356
|
+
if current is not None:
|
|
357
|
+
blocks.append(current.row())
|
|
358
|
+
return blocks
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
def plan_parse(path: Path) -> str:
|
|
362
|
+
"""Return the TSV rendering of `parse_slices` on the file at `path`."""
|
|
363
|
+
with open(path, encoding="utf-8") as handle:
|
|
364
|
+
rows = parse_slices(handle)
|
|
365
|
+
return "".join(f"{sid}\t{deps}\t{files}\n" for sid, deps, files in rows)
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def _write_rows(rows: list[tuple[str, str, str]], stream: TextIO) -> None:
|
|
369
|
+
stream.writelines(f"{sid}\t{deps}\t{files}\n" for sid, deps, files in rows)
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
def main(argv: list[str] | None = None) -> int:
|
|
373
|
+
parser = argparse.ArgumentParser(
|
|
374
|
+
prog="plan_parse.py",
|
|
375
|
+
description="Extract slice (id, Depends-on, Files) tuples from a plan markdown.",
|
|
376
|
+
)
|
|
377
|
+
parser.add_argument("plan", type=Path, help="Path to the plan markdown file")
|
|
378
|
+
args = parser.parse_args(argv)
|
|
379
|
+
with open(args.plan, encoding="utf-8") as handle:
|
|
380
|
+
rows = parse_slices(handle)
|
|
381
|
+
_write_rows(rows, sys.stdout)
|
|
382
|
+
return 0
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
if __name__ == "__main__": # pragma: no cover
|
|
386
|
+
sys.exit(main())
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""review_result — shared output contract for all Python review scripts.
|
|
2
|
+
|
|
3
|
+
Provides build_result() and main_exit() so every script emits identical
|
|
4
|
+
JSON and consistent exit codes:
|
|
5
|
+
0 = pass (no findings)
|
|
6
|
+
1 = fail (hard errors)
|
|
7
|
+
2 = warn (warnings only or LLM check skipped)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def build_result(
|
|
16
|
+
errors: list,
|
|
17
|
+
warnings: list,
|
|
18
|
+
summary: str = "",
|
|
19
|
+
) -> dict:
|
|
20
|
+
"""Return canonical review output dict."""
|
|
21
|
+
if errors:
|
|
22
|
+
status = "fail"
|
|
23
|
+
elif warnings:
|
|
24
|
+
status = "warn"
|
|
25
|
+
else:
|
|
26
|
+
status = "pass"
|
|
27
|
+
return {
|
|
28
|
+
"status": status,
|
|
29
|
+
"issues": errors + warnings,
|
|
30
|
+
"summary": summary,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def main_exit(result: dict) -> int:
|
|
35
|
+
"""Serialize result to stdout and return the appropriate exit code."""
|
|
36
|
+
print(json.dumps(result))
|
|
37
|
+
status = result.get("status", "pass")
|
|
38
|
+
if status == "fail":
|
|
39
|
+
return 1
|
|
40
|
+
if status == "warn":
|
|
41
|
+
return 2
|
|
42
|
+
return 0
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def make_issue(
|
|
46
|
+
severity: str,
|
|
47
|
+
confidence: str = "high",
|
|
48
|
+
file: str = "",
|
|
49
|
+
line: int = 0,
|
|
50
|
+
message: str = "",
|
|
51
|
+
suggested_fix: str = "",
|
|
52
|
+
rule_id: str = "",
|
|
53
|
+
) -> dict:
|
|
54
|
+
"""Return a canonical issue dict — the shared shape every review script
|
|
55
|
+
(progress_guardian, claude_setup_review, test_modernization_review,
|
|
56
|
+
token_efficiency_review) independently duplicated before #732.
|
|
57
|
+
|
|
58
|
+
`rule_id` is included only when truthy, matching the pre-dedup
|
|
59
|
+
token_efficiency_review._issue behavior.
|
|
60
|
+
"""
|
|
61
|
+
issue: dict = {
|
|
62
|
+
"severity": severity,
|
|
63
|
+
"confidence": confidence,
|
|
64
|
+
"file": file,
|
|
65
|
+
"line": line,
|
|
66
|
+
"message": message,
|
|
67
|
+
"suggestedFix": suggested_fix,
|
|
68
|
+
}
|
|
69
|
+
if rule_id:
|
|
70
|
+
issue["rule_id"] = rule_id
|
|
71
|
+
return issue
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def skipped_llm_warning(message: str = "LLM check skipped (--skip-llm)") -> dict:
|
|
75
|
+
"""Return a single warning finding for use when --skip-llm suppresses the LLM call."""
|
|
76
|
+
return {
|
|
77
|
+
"severity": "warning",
|
|
78
|
+
"confidence": "high",
|
|
79
|
+
"file": "",
|
|
80
|
+
"line": 0,
|
|
81
|
+
"message": message,
|
|
82
|
+
"suggestedFix": "",
|
|
83
|
+
"rule_id": "llm-skipped",
|
|
84
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Shared review-agent roster boundary (#1516).
|
|
2
|
+
|
|
3
|
+
``NON_REVIEW_AGENTS`` names the agents that are **not** dispatchable
|
|
4
|
+
code-review lenses — they have no per-file review scope at all: the team
|
|
5
|
+
agents, the analysis-only agents, and the orchestrator-dispatched
|
|
6
|
+
coordinators/gates (``quality-reviewer``, ``spec-reviewer``) that the
|
|
7
|
+
registry's Review Agents table lists but which are never dispatched as
|
|
8
|
+
standalone lenses. Two consumers share the set, for two related reasons —
|
|
9
|
+
keep them together so an agent added for one reason is handled by both:
|
|
10
|
+
|
|
11
|
+
- ``check_agent_scope.py`` — these are **exempt** from the ``Scope:`` body
|
|
12
|
+
declaration requirement (they are not review lenses, so they need no
|
|
13
|
+
per-file scope).
|
|
14
|
+
- ``select_lenses.py`` — these are **excluded** from the dispatchable-lens
|
|
15
|
+
roster (they never run as a ``/build`` or ``/code-review`` lens).
|
|
16
|
+
|
|
17
|
+
Genuine review agents whose findings are properties of the whole repository
|
|
18
|
+
rather than any one diff (``claude-setup-review``, ``token-efficiency-review``,
|
|
19
|
+
``ai-provenance-review``) are **not** members here — they declare their own
|
|
20
|
+
exclusion directly in their body via ``Scope: on-demand``
|
|
21
|
+
(``select_lenses.SCOPE_ON_DEMAND``), which the resolver reads and never
|
|
22
|
+
selects for the per-diff roster. That is the single-source-of-truth
|
|
23
|
+
mechanism ``select_lenses.py``'s own docstring already promises for every
|
|
24
|
+
other ``Scope:`` kind — putting these three agents in this set instead would
|
|
25
|
+
be a second, competing mechanism for the same fact, and would also (wrongly)
|
|
26
|
+
exempt them from the ``Scope:`` declaration requirement they actually
|
|
27
|
+
satisfy. See each agent's own comment for why it is whole-tree, not
|
|
28
|
+
per-diff, and ``/repo-review``'s fixed roster (#1735) for where it runs
|
|
29
|
+
instead.
|
|
30
|
+
|
|
31
|
+
``SCOPE_LINE_RE`` is the shared ``Scope:`` body-declaration pattern —
|
|
32
|
+
``select_lenses.py`` and ``check_agent_scope.py`` both parsed the
|
|
33
|
+
byte-identical regex independently before this; kept here so a future
|
|
34
|
+
change to the declaration grammar has one definition to update.
|
|
35
|
+
|
|
36
|
+
Stdlib-only.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
from __future__ import annotations
|
|
40
|
+
|
|
41
|
+
import re
|
|
42
|
+
|
|
43
|
+
#: A body-level ``Scope: <value>`` line. Not frontmatter — see
|
|
44
|
+
#: ``plugins/marketplace-dev/knowledge/agent-contract.json`` (issue #1333).
|
|
45
|
+
#: Exposed as a raw pattern string too, so a consumer needing different
|
|
46
|
+
#: compile-time flags (e.g. ``re.MULTILINE`` for a whole-body ``.search()``
|
|
47
|
+
#: instead of a per-line ``.match()``) shares the same grammar without a
|
|
48
|
+
#: second, independently-typed copy of it.
|
|
49
|
+
SCOPE_LINE_PATTERN = r"^\s*Scope\s*:\s*(.*)$"
|
|
50
|
+
SCOPE_LINE_RE = re.compile(SCOPE_LINE_PATTERN)
|
|
51
|
+
|
|
52
|
+
NON_REVIEW_AGENTS = frozenset({
|
|
53
|
+
"adr-author",
|
|
54
|
+
"architect",
|
|
55
|
+
"codebase-recon",
|
|
56
|
+
"data-flow-tracer",
|
|
57
|
+
"mutation-kill",
|
|
58
|
+
"orchestrator",
|
|
59
|
+
"platform-engineer",
|
|
60
|
+
"product-manager",
|
|
61
|
+
"progress-guardian",
|
|
62
|
+
"qa-engineer",
|
|
63
|
+
"quality-reviewer", # Stage-2 coordinator, orchestrator-dispatched — not a lens
|
|
64
|
+
"security-engineer",
|
|
65
|
+
"session-analysis",
|
|
66
|
+
"software-engineer",
|
|
67
|
+
"spec-reviewer", # Stage-1 spec gate, orchestrator-dispatched — not a lens
|
|
68
|
+
"tech-writer",
|
|
69
|
+
"ui-ux-designer",
|
|
70
|
+
# `claude-setup-review`, `token-efficiency-review`, and `ai-provenance-review`
|
|
71
|
+
# are deliberately NOT here — they are genuine review agents that declare
|
|
72
|
+
# `Scope: on-demand` directly in their own body, which select_lenses.py's
|
|
73
|
+
# resolver reads and excludes on its own. See this module's docstring.
|
|
74
|
+
# Plan/Gherkin critics dispatched by /plan and /gherkin-derive — not code-review
|
|
75
|
+
# lenses, so no per-file Scope (closes #1525: check_agent_scope was red for these).
|
|
76
|
+
"gherkin-quality-critic",
|
|
77
|
+
# Dispatched by /autoship Step 2b (skills/autoship/SKILL.md) — a single
|
|
78
|
+
# per-round grouping-proposal worker, not a code-review lens, so no
|
|
79
|
+
# per-file Scope (#2072, same pattern as gherkin-quality-critic above).
|
|
80
|
+
"autoship-batch-proposer",
|
|
81
|
+
"plan-review-acceptance",
|
|
82
|
+
"plan-review-design",
|
|
83
|
+
"plan-review-parallelization",
|
|
84
|
+
"plan-review-strategic",
|
|
85
|
+
"plan-review-ux",
|
|
86
|
+
})
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""session_log — the shared classification/discovery core for the two
|
|
2
|
+
forked session-transcript extractors (epic #2040):
|
|
3
|
+
|
|
4
|
+
- ``scripts/session_extract.py`` (monorepo-only developer tooling)
|
|
5
|
+
- ``plugins/dev-team/scripts/extract_session_report.py`` (shipped)
|
|
6
|
+
|
|
7
|
+
See ``docs/adr/0036-the-two-session-extractors-stay-forked-1994.md`` for why
|
|
8
|
+
the extractors themselves stay forked (discovery/CLI surface, pricing, cost,
|
|
9
|
+
rollup, escalation, and report shapes legitimately differ) while this
|
|
10
|
+
package exists to hold what does NOT legitimately differ: the classification
|
|
11
|
+
logic both scripts computed independently, drifted on, and shipped the same
|
|
12
|
+
missing-41%-of-spend defect in twice (#1990/#1991/#1994).
|
|
13
|
+
|
|
14
|
+
Import direction (ADR 0032 purity): every module in this package is
|
|
15
|
+
stdlib-only (Python 3.10+, per ADR 0014/0015) and imports nothing from
|
|
16
|
+
either extractor script. Both extractors import FROM ``session_log``, never
|
|
17
|
+
the reverse.
|
|
18
|
+
|
|
19
|
+
Modules:
|
|
20
|
+
discovery transcript path classification and enumeration
|
|
21
|
+
records JSONL record iteration, the usage-block read contract, slimming
|
|
22
|
+
classify text/name classification vocabulary (issue #2043)
|
|
23
|
+
signals per-record signal accumulation (issue #2044)
|
|
24
|
+
redact the privacy boundary as a function, not a convention (issue #2045)
|
|
25
|
+
|
|
26
|
+
NOT in this package: model-pricing loading/rate-lookup/cost-computation
|
|
27
|
+
(issue #2045). An earlier draft of this docstring forward-declared a
|
|
28
|
+
`pricing` module here; it landed instead at `hooks/lib/pricing.py`, because
|
|
29
|
+
`hooks/lib/cost_meter.py` (a real Stop hook) is one of its two consumers and
|
|
30
|
+
a hook must be import-safe without any `scripts/` module on its path — see
|
|
31
|
+
that module's docstring for the full reasoning.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from __future__ import annotations
|
|
Binary file
|
|
Binary file
|