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,617 @@
|
|
|
1
|
+
# Tool Configurations (SARIF-first)
|
|
2
|
+
|
|
3
|
+
Per-tool invocation commands, install hints, and adapter-specific notes. Organized by tier per the skill's `## Tool tiers` section.
|
|
4
|
+
|
|
5
|
+
## Tier 1 — required baseline (SARIF native)
|
|
6
|
+
|
|
7
|
+
### semgrep
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
semgrep scan \
|
|
11
|
+
--sarif \
|
|
12
|
+
--config auto \
|
|
13
|
+
--quiet \
|
|
14
|
+
<target-paths>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- **Install**: `pip install semgrep`
|
|
18
|
+
- **Install hint**: `semgrep — SAST. install: pip install semgrep`
|
|
19
|
+
- **Detection**: `command -v semgrep`
|
|
20
|
+
- **Capability tier**: SAST
|
|
21
|
+
- **Adapter**: none; consumed raw by the shared SARIF parser.
|
|
22
|
+
|
|
23
|
+
### gitleaks
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
gitleaks detect \
|
|
27
|
+
--report-format sarif \
|
|
28
|
+
--report-path - \
|
|
29
|
+
--no-verify \
|
|
30
|
+
--source <path>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
- **Install**: `brew install gitleaks` (macOS) / `docker run --rm -v "$PWD:/path" zricethezav/gitleaks:latest detect ...`
|
|
34
|
+
- **Install hint**: `gitleaks — secrets detection. install: brew install gitleaks`
|
|
35
|
+
- **Detection**: `command -v gitleaks`
|
|
36
|
+
- **Capability tier**: secrets
|
|
37
|
+
- **Offline posture**: `--no-verify` disables gitleaks' active-credential verification, which would otherwise make outbound API calls (e.g. to AWS/GitHub) to confirm a detected secret is live. Detection is purely pattern-based and runs with zero network egress. Always on — this flag carries no detection cost.
|
|
38
|
+
- **Adapter**: none.
|
|
39
|
+
|
|
40
|
+
### trivy
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# IaC scanning
|
|
44
|
+
trivy config \
|
|
45
|
+
--format sarif \
|
|
46
|
+
--output /dev/stdout \
|
|
47
|
+
--skip-update \
|
|
48
|
+
--offline-scan \
|
|
49
|
+
<path>
|
|
50
|
+
|
|
51
|
+
# Filesystem / supply-chain scanning
|
|
52
|
+
trivy fs \
|
|
53
|
+
--format sarif \
|
|
54
|
+
--output /dev/stdout \
|
|
55
|
+
--scanners vuln,config,secret \
|
|
56
|
+
--skip-update \
|
|
57
|
+
--offline-scan \
|
|
58
|
+
<path>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
- **Install**: `brew install trivy`
|
|
62
|
+
- **Install hint**: `trivy — IaC + supply-chain scanning. install: brew install trivy`
|
|
63
|
+
- **Detection**: `command -v trivy`
|
|
64
|
+
- **Capability tier**: IaC + supply-chain
|
|
65
|
+
- **Offline posture**: both `trivy config` and `trivy fs` run with `--skip-update --offline-scan`. `--skip-update` pins trivy to the local vulnerability DB (no DB refresh over the network); `--offline-scan` suppresses the remote metadata lookups trivy otherwise performs for some package ecosystems. Run the **offline DB preflight** below before dispatch.
|
|
66
|
+
- **Offline DB preflight**: locate the local DB at trivy's cache path (`${TRIVY_CACHE_DIR:-$HOME/.cache/trivy}/db/trivy.db`) and check its `mtime`:
|
|
67
|
+
- **absent** → skip trivy, warn `trivy local DB missing — run: trivy image --download-db-only`
|
|
68
|
+
- **mtime age ≤ 7 days** → run normally (fresh)
|
|
69
|
+
- **mtime age > 7 days** → run anyway, warn `trivy DB is N days old — consider refreshing with: trivy image --download-db-only` (substitute `N` with the integer day count)
|
|
70
|
+
|
|
71
|
+
The 7-day boundary is inclusive: exactly 7 days old is still fresh; strictly greater than 7 days is stale. A missing or stale DB is never a hard pipeline failure.
|
|
72
|
+
- **Adapter**: none.
|
|
73
|
+
|
|
74
|
+
### hadolint
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
hadolint --format sarif <Dockerfile>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
- **Install**: `brew install hadolint`
|
|
81
|
+
- **Install hint**: `hadolint — Dockerfile linting. install: brew install hadolint`
|
|
82
|
+
- **Detection**: `command -v hadolint`
|
|
83
|
+
- **Capability tier**: IaC (Dockerfile)
|
|
84
|
+
- **Adapter**: none.
|
|
85
|
+
|
|
86
|
+
### actionlint
|
|
87
|
+
|
|
88
|
+
actionlint does not emit SARIF directly as of its current stable release.
|
|
89
|
+
Invoke with JSON output and wrap with a thin adapter (≤ 15 LOC) that
|
|
90
|
+
produces SARIF-compliant results.
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
actionlint -format '{{json .}}' <target-path>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The adapter maps each actionlint finding:
|
|
97
|
+
|
|
98
|
+
| actionlint field | SARIF field |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `.Filepath` | `results[*].locations[0].physicalLocation.artifactLocation.uri` |
|
|
101
|
+
| `.Line` | `results[*].locations[0].physicalLocation.region.startLine` |
|
|
102
|
+
| `.Column` | `results[*].locations[0].physicalLocation.region.startColumn` |
|
|
103
|
+
| `.Kind` | `results[*].ruleId` |
|
|
104
|
+
| `.Message` | `results[*].message.text` |
|
|
105
|
+
|
|
106
|
+
Severity: all actionlint findings map to `warning` by default; upgrade to
|
|
107
|
+
`error` if `.Kind` starts with `shellcheck` and message contains "error".
|
|
108
|
+
|
|
109
|
+
- **Install**: `brew install actionlint`
|
|
110
|
+
- **Install hint**: `actionlint — GitHub Actions linting. install: brew install actionlint`
|
|
111
|
+
- **Detection**: `command -v actionlint`
|
|
112
|
+
- **Capability tier**: CI-CD
|
|
113
|
+
- **Adapter**: thin JSON → SARIF wrapper (see `adapters/actionlint-to-sarif.sh` — created in P2 Step 3b alongside the optional adapters).
|
|
114
|
+
|
|
115
|
+
### Roslyn ErrorLog (C#)
|
|
116
|
+
|
|
117
|
+
C#'s primary static analysis (Roslyn analyzers) is built into the compiler:
|
|
118
|
+
`dotnet build` exports native SARIF when passed the `ErrorLog` property — a
|
|
119
|
+
build-flag change on the build the pipeline already runs, not a separate tool
|
|
120
|
+
invocation.
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
dotnet build /p:ErrorLog=results.sarif,version=2.1
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
- **Install**: nothing beyond the .NET SDK a C# project already requires
|
|
127
|
+
(SDK ≥ 6 for built-in `dotnet format`; Roslyn 3.8+ / .NET 5 SDK or later for
|
|
128
|
+
the SARIF v2.1 export). Where the SDK version matters it is repo-pinned via
|
|
129
|
+
`global.json` — the .NET-native repo-level pin. No standalone install script.
|
|
130
|
+
- **Install hint**: `dotnet — .NET SDK (C# build, format, ErrorLog SARIF). install: https://dotnet.microsoft.com/download`
|
|
131
|
+
- **Detection**: `command -v dotnet` — **language-conditional**: probe and hint
|
|
132
|
+
only when `.cs` files are in the target set, so a non-C# repo never sees a
|
|
133
|
+
"dotnet missing" warning. A missing SDK degrades to `status: skip` with the
|
|
134
|
+
hint above — never a pipeline failure.
|
|
135
|
+
- **Capability tier**: SAST (C# compiler + analyzer diagnostics)
|
|
136
|
+
- **Adapter**: none; native SARIF v2.1, consumed raw by the shared SARIF parser.
|
|
137
|
+
- **Reuse rule (`/code-review`)**: the full-repo pass invokes
|
|
138
|
+
`dotnet build /p:ErrorLog=...` for any C# project in scope unless a SARIF
|
|
139
|
+
produced from the current HEAD commit already exists (e.g. a CI artifact) —
|
|
140
|
+
**same-commit** is the reuse test.
|
|
141
|
+
- **Incremental-build caveat**: the SARIF is rewritten only when the compiler
|
|
142
|
+
actually runs; an up-to-date incremental build skips compilation and leaves
|
|
143
|
+
the previous file in place (still valid for the code on disk). Pass the flag
|
|
144
|
+
on **every** build invocation. A *missing* SARIF (no compile has happened
|
|
145
|
+
yet) degrades to skip — never a pipeline failure.
|
|
146
|
+
- **Scope (v1): single-project builds.** `ErrorLog` is a per-project compiler
|
|
147
|
+
property: in a multi-project solution each project's compilation writes its
|
|
148
|
+
own log — a relative path resolves per project directory, and an absolute
|
|
149
|
+
path is overwritten by whichever project compiles last. Multi-project
|
|
150
|
+
solutions are a documented gap; the v2 plan of record is a per-project path
|
|
151
|
+
via `Directory.Build.props` with `$(MSBuildProjectName)` in the ErrorLog path
|
|
152
|
+
(e.g. `<ErrorLog>$(MSBuildProjectName).sarif,version=2.1</ErrorLog>` — one
|
|
153
|
+
SARIF per project, no overwrite risk) plus a glob-collect.
|
|
154
|
+
- **Dedup-chain placement**: none needed — the only cross-duplicating source is
|
|
155
|
+
semgrep, which already outranks all language-specific sources; revisit only
|
|
156
|
+
if a second Java/C# source is ever added.
|
|
157
|
+
- **Build-time (`/build`) consumption**: the same SARIF doubles as the C#
|
|
158
|
+
lane's diagnostic (verify) source — see the C# lane row under "Build-time
|
|
159
|
+
lanes" below.
|
|
160
|
+
|
|
161
|
+
### pmd
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
pmd check -d . -R <resolved-ruleset> -f sarif --no-progress
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
- **Language-conditional**: dispatch pmd, and surface its missing-tool
|
|
168
|
+
install hint, only when `.java` files are in the target set — a non-Java
|
|
169
|
+
repo never sees a "pmd missing" warning (graceful-degradation constraint).
|
|
170
|
+
- **Install**: repo-level, `python3 ${CLAUDE_PLUGIN_ROOT}/scripts/install-java-static-analysis.py`
|
|
171
|
+
— installs the pinned PMD distribution into the target repo's gitignored
|
|
172
|
+
`.pmd/` directory (`PMD_INSTALL_DIR` overrides). Never user-level/global.
|
|
173
|
+
- **Install hint**: `pmd — Java code quality. install: python3 ${CLAUDE_PLUGIN_ROOT}/scripts/install-java-static-analysis.py` (surfaced only for Java target sets)
|
|
174
|
+
- **Detection**: repo-local first — the `.pmd/pmd-bin-*/bin/pmd` launcher
|
|
175
|
+
(`pmd.bat` on Windows) — then `command -v pmd`; verify with `pmd --version`.
|
|
176
|
+
- **Capability tier**: Java code quality
|
|
177
|
+
- **Exit codes**: `pmd check` exits 0 on clean and **4 when violations are
|
|
178
|
+
found** — 4 is findings, not a tool failure; treat only other non-zero
|
|
179
|
+
codes as tool errors.
|
|
180
|
+
- **Adapter**: none; SARIF renderer is native (PMD 6.36+; we pin 7.x) —
|
|
181
|
+
consumed raw by the shared SARIF parser.
|
|
182
|
+
- **Dedup**: no dedup-chain slot needed — the only cross-duplicating source
|
|
183
|
+
is semgrep, which already outranks all language-specific sources; revisit
|
|
184
|
+
only if a second Java/C# source is added.
|
|
185
|
+
|
|
186
|
+
#### Ruleset resolution (shared by both pmd invocations)
|
|
187
|
+
|
|
188
|
+
The `/code-review` invocation above and the build-time Java lane below
|
|
189
|
+
resolve `<resolved-ruleset>` identically, so the two layers never disagree
|
|
190
|
+
about what a violation is:
|
|
191
|
+
|
|
192
|
+
1. **Repo-root `pmd-ruleset.xml`**, when present — the project override,
|
|
193
|
+
matching the repo-root convention (`ruff.toml`, `.editorconfig`) the
|
|
194
|
+
other lanes honor. A custom `pmd-ruleset.xml` carries its own
|
|
195
|
+
`<exclude-pattern>` entries.
|
|
196
|
+
2. Otherwise the **plugin's quickstart-wrapping default**:
|
|
197
|
+
`${CLAUDE_PLUGIN_ROOT}/skills/static-analysis-integration/rulesets/pmd-quickstart.xml`,
|
|
198
|
+
which references PMD's documented quickstart set
|
|
199
|
+
(`rulesets/java/quickstart.xml`) and ships `<exclude-pattern>` entries
|
|
200
|
+
for generated-output directories — `target/`, `build/`, `out/`,
|
|
201
|
+
`.gradle/` — so the full-repo walk produces no duplicate/noise findings
|
|
202
|
+
on copied sources.
|
|
203
|
+
|
|
204
|
+
Test sources run the same ruleset as production code (recorded decision;
|
|
205
|
+
revisit with a documented exclusion list only if real-world noise shows up
|
|
206
|
+
on JUnit-style test classes).
|
|
207
|
+
|
|
208
|
+
### ruff
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
ruff check --output-format sarif .
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
- **Minimum version**: 0.3.1 — the first release with the SARIF output format.
|
|
215
|
+
- **Install**: `python3 -m pip install ruff` (project venv / dev requirements — repo-level, versioned with the repo; never `pip install --user` or a global pipx install)
|
|
216
|
+
- **Install hint**: `ruff — Python lint + autofix. install: python3 -m pip install ruff (project venv / dev requirements)`
|
|
217
|
+
- **Detection**: `command -v ruff`
|
|
218
|
+
- **Capability tier**: Python lint + autofix
|
|
219
|
+
- **Presence**: language-conditional, never `[REQUIRED]` — dispatch ruff, and surface its missing-tool install hint, only when `.py` files are in the target set. A non-Python repo never sees a "ruff missing" warning, consistent with the skill's "absence is never a pipeline failure" constraint.
|
|
220
|
+
- **Config resolution**: the project's own `ruff.toml`/`pyproject.toml` wins when present (Ruff's default config discovery — no override flags); Ruff's defaults otherwise. The plugin pins no curated rule set — the project owns its **gating** bar. The convention probe below is a separate, non-gating invocation and does not change that.
|
|
221
|
+
- **Adapter**: none; consumed raw by the shared SARIF parser.
|
|
222
|
+
|
|
223
|
+
#### Convention probe (naming + magic values)
|
|
224
|
+
|
|
225
|
+
A **second, separate** ruff invocation whose only job is to give review agents
|
|
226
|
+
deterministic naming and magic-value findings (#1979). Kept apart from the
|
|
227
|
+
lane above on purpose: that one reflects the project's own quality bar, this
|
|
228
|
+
one adds review context and never gates.
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
ruff check --select N,PLR2004 --output-format sarif .
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
- **Displaces**: the mechanical half of `naming-review` — PEP 8 naming conventions (`N801`/`N802`/`N803`…) and magic values in comparisons (`PLR2004`), which that agent lists among its own checks and would otherwise re-derive by inference on every run. Intent-revealing-name judgment stays with the agent.
|
|
235
|
+
- **`--select`, not `--extend-select`** (verified on ruff 0.16.4): `--select` *replaces* the rule set for this invocation, so the probe emits only `N`/`PLR2004` findings and does not duplicate the main lane's output. `--extend-select` would re-report every rule the project already enables.
|
|
236
|
+
- **Project scoping is preserved.** Verified: the project's `exclude` (vendored directories stay unscanned), its `per-file-ignores`, and inline `# noqa: N802` comments are all still honored under `--select`. Only a blanket `ignore = ["N802"]` in project config is overridden — a deliberate trade, since suppressing a convention in CI is not the same as declining to hear about it in review. A project that disagrees suppresses these through the pre-pass's own mechanism, `ACCEPTED-RISKS.md` (SKILL.md step 5).
|
|
237
|
+
- **Thresholds need no tuning**: `PLR2004`'s defaults already ignore `0`, `1`, and `-1` (verified), so it flags unexplained domain constants — `if amount > 1000` — rather than every literal.
|
|
238
|
+
- **Rule ids**: `ruff.python.n802`, `ruff.python.plr2004`, … (see the `ruff` row of the tier map in `sarif-parser.md`).
|
|
239
|
+
- **Presence**: language-conditional and non-gating, exactly like the main ruff lane. No extra install — same binary.
|
|
240
|
+
|
|
241
|
+
## Tier 2 — optional SARIF adapters (shipped in P2 Step 3b)
|
|
242
|
+
|
|
243
|
+
Placeholder for the remaining Step 3b tools: checkov, kube-linter, bandit, gosec, bearer, osv-scanner, grype, trufflehog.
|
|
244
|
+
|
|
245
|
+
### oxlint
|
|
246
|
+
|
|
247
|
+
Primary JS/TS linter (Oxc project, Rust-based, ESLint-compatible) for `/code-review`'s full-repo pre-pass. Pin **oxlint >= 1.0.0**. Oxlint's CLI surface evolves quickly — verify the exact flag names (`--fix`, `--format sarif`) against the project's pinned version; verified against oxlint 1.72.0.
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
npx oxlint --format sarif .
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
- **Tier substitution**: #808 originally specified a Tier 3 bespoke JSON adapter (`--format json`, ≤ 40 LOC). At implementation time the pinned line had gained a native `sarif` output format (verified on 1.72.0), so per the issue's version-pin instruction oxlint lands as a SARIF-native entry instead — no adapter.
|
|
254
|
+
- **Install**: `npm install --save-dev oxlint` — a project devDependency pins the version in `package.json`/lockfile, versioned with the repo and reproducible for every contributor and CI. Never `npm install -g oxlint`.
|
|
255
|
+
- **Install hint**: `oxlint — JS/TS linting. install: npm install --save-dev oxlint`
|
|
256
|
+
- **Detection**: `npx --no-install oxlint --version` (or `node_modules/.bin/oxlint`) — oxlint is a project-local npm devDependency, not a global binary, so PATH probes (`command -v`) would miss it.
|
|
257
|
+
- **Capability tier**: JS/TS linting
|
|
258
|
+
- **Adapter**: none; consumed raw by the shared SARIF parser (`sarif-parser.md`). `runs[*].tool.driver.name` is `oxlint` — the string `TOOL_TIER_MAP` is keyed by, observed on oxlint 1.80.0 — and its SARIF `ruleId` values are `plugin(rule)`-shaped (`eslint(no-unused-vars)`, `jsx-a11y(alt-text)`, observed on the same version). The parser maps that shape to `oxlint.<plugin>.<rule>` — e.g. `oxlint.eslint.no-unused-vars`, `oxlint.jsx-a11y.alt-text`. A rule id with no parentheses falls back to the tool's tier segment, `oxlint.js.<rule-id>`. (Before #1979 the parser had neither branch: `oxlint` was missing from the tier map and the parentheses were hyphen-flattened, so findings were emitted as `oxlint.generic.jsx-a11y-alt-text`.)
|
|
259
|
+
- **Coexistence with legacy ESLint (Tier 4)**: this entry sits alongside the ESLint entry, not replacing it. When a project runs both, the same finding can arrive twice — the dedup chain (SKILL.md step 4) ranks oxlint ahead of the legacy JS tools. While both run, add [`eslint-plugin-oxlint`](https://github.com/oxc-project/eslint-plugin-oxlint) to the ESLint config to turn off ESLint rules oxlint already covers, so the ESLint pass only pays for the plugin-only remainder.
|
|
260
|
+
|
|
261
|
+
#### Frontend probe (accessibility + performance)
|
|
262
|
+
|
|
263
|
+
A **second, separate** oxlint invocation that turns on the plugins the main
|
|
264
|
+
lane leaves off, giving review agents deterministic accessibility and
|
|
265
|
+
performance findings (#1979). One invocation covers both concerns because
|
|
266
|
+
oxlint ships them natively — no `eslint-plugin-jsx-a11y` install, no config
|
|
267
|
+
file, no network.
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
npx oxlint --jsx-a11y-plugin --react-plugin --react-perf-plugin -D perf --format sarif .
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
- **Displaces**: the mechanical half of `a11y-review` (missing `alt`, invalid `href`, click handlers with no keyboard equivalent, static elements with handlers and no role) and feeds `performance-review` on the JS/TS side. Verified on oxlint 1.80.0 against a fixture component: 4 `jsx-a11y` findings and 2 `react-perf` findings, including `alt-text` and `jsx-no-new-function-as-prop`.
|
|
274
|
+
- **`-D perf` is the performance half**: it promotes oxlint's `perf` category, whose most valuable member for this panel is `no-await-in-loop` — the classic **N+1 / I/O-in-loop shape** the spike names. `--react-perf-plugin` adds the render-path rules (`jsx-no-new-object-as-prop`, `jsx-no-new-function-as-prop`).
|
|
275
|
+
- **Correctness overlap is expected and harmless**: this invocation also re-emits the default `correctness` category the main lane already reports. Those arrive with identical `rule_id`/`file`/`line` and are removed by the dedup step (SKILL.md step 4), so the net contribution is the a11y and perf findings.
|
|
276
|
+
- **`-D jsx-a11y` does NOT isolate the a11y rules** — `jsx-a11y` is a plugin, not a category, so `-A all -D jsx-a11y` yields zero findings (verified). That is why the two concerns share one invocation rather than running as two narrower ones.
|
|
277
|
+
- **Rule ids**: `oxlint.jsx-a11y.*` and `oxlint.react-perf.*` / `oxlint.eslint.no-await-in-loop`. The plugin segment is what lets a consumer separate the accessibility findings from the performance ones — see the `plugin(rule)` case in `sarif-parser.md`.
|
|
278
|
+
- **Presence**: dispatched only when the target set contains JS/TS/JSX files, and never `[REQUIRED]` — same posture as the main oxlint lane.
|
|
279
|
+
|
|
280
|
+
##### Naming and magic numbers on the JS/TS side: project-configured, not forced
|
|
281
|
+
|
|
282
|
+
oxlint implements `eslint(no-magic-numbers)`, but it takes **no rule options
|
|
283
|
+
on the command line**, and the rule's unconfigured default flags `0` and `1`.
|
|
284
|
+
Measured over this repo's own 40 TS/JS eval files: 152 findings, **35% of them
|
|
285
|
+
the values `0`, `1`, `-1`, or `2`** — noise that would swamp the injection and
|
|
286
|
+
tell `naming-review` nothing it should act on. Python's `PLR2004` needs no
|
|
287
|
+
such care because its defaults already exclude those values, which is why the
|
|
288
|
+
ruff convention probe above runs unconditionally and this does not.
|
|
289
|
+
|
|
290
|
+
So the JS/TS naming and magic-value rules are an **opt-in the project owns**,
|
|
291
|
+
configured where the options actually live:
|
|
292
|
+
|
|
293
|
+
```jsonc
|
|
294
|
+
// .oxlintrc.json
|
|
295
|
+
{
|
|
296
|
+
"rules": {
|
|
297
|
+
"no-magic-numbers": ["warn", { "ignore": [0, 1, -1], "ignoreArrayIndexes": true }],
|
|
298
|
+
"@typescript-eslint/naming-convention": "warn"
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
With that in place the **main** oxlint lane reports them and they reach agents
|
|
304
|
+
through the normal path — no extra invocation, and the project keeps control
|
|
305
|
+
of the thresholds it has to live with.
|
|
306
|
+
|
|
307
|
+
#### When a project may drop ESLint entirely
|
|
308
|
+
|
|
309
|
+
Decidable checklist — a project drops ESLint only when **all three** hold:
|
|
310
|
+
|
|
311
|
+
1. Every rule enabled in the project's ESLint config is either implemented by the pinned oxlint version (per oxlint's supported-rules list) or explicitly acknowledged in the project as not relied on.
|
|
312
|
+
2. No framework plugin in the ESLint config (React/Vue/Svelte/etc.) contributes an enabled rule oxlint lacks.
|
|
313
|
+
3. A one-time dual run over the repo shows ESLint reporting no finding that oxlint misses.
|
|
314
|
+
|
|
315
|
+
Otherwise run both, with `eslint-plugin-oxlint` suppressing the overlap. In the build-time lane's provider terms (§ Build-time lanes → JS/TS lane), this checklist is the decidable test for rebinding the autofix slot from eslint to oxlint.
|
|
316
|
+
|
|
317
|
+
## Tier 3 — bespoke JSON adapters (shipped in P2 Step 3b)
|
|
318
|
+
|
|
319
|
+
Placeholder — populated by Step 3b. Expected tools: detect-secrets, depcheck, deptry, kube-score, govulncheck. Each adapter is ≤ 40 LOC.
|
|
320
|
+
|
|
321
|
+
### mypy
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
mypy $(python3 adapters/mypy-src-layout.py .) --output json . 2>&1 | python3 adapters/mypy-adapter.py
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
- **Minimum version**: 1.11 — the first release with `--output json`. Older mypy rejects the flag; the adapter detects the rejection and degrades to a skip-with-warning (exit 0, zero findings) — never a pipeline failure.
|
|
328
|
+
- **Install**: `python3 -m pip install mypy` (project venv / dev requirements — repo-level, versioned with the repo; never `pip install --user` or a global pipx install)
|
|
329
|
+
- **Install hint**: `mypy — Python type checking. install: python3 -m pip install mypy (project venv / dev requirements)`
|
|
330
|
+
- **Detection**: `command -v mypy`
|
|
331
|
+
- **Capability tier**: Python type checking
|
|
332
|
+
- **Presence**: language-conditional, like ruff — dispatched only when `.py` files are in the target set.
|
|
333
|
+
- **src/-layout auto-detection**: `../adapters/mypy-src-layout.py` (invoked as `python3 adapters/mypy-src-layout.py <project-root>`) detects a plain `src/` layout — a `src/` directory holding `.py` modules with no `__init__.py` anywhere under it, and no project-level mypy package-base config (`mypy.ini`/`.mypy.ini` present, or a `[mypy]` section in `setup.cfg`/`tox.ini`, or a `[tool.mypy]` section in `pyproject.toml`) — and prints `--explicit-package-bases` (mypy >= 0.990) so mypy can resolve the layout without requiring `__init__.py` files or hand-written config. Prints nothing when the layout doesn't apply or the project already owns its mypy config ("bind, don't replace"). Without this, a project on this layout hits a stable, deterministic `mypy` failure — `Source file found twice under different module names: "calc" and "src.calc"` — the moment any checked file imports a `src/` module by its dotted `src.` path; degradation rung 4 then silently drops all mypy coverage for the run.
|
|
334
|
+
- **Adapter**: `../adapters/mypy-adapter.py` (≤ 40 LOC) maps mypy's JSONL diagnostics to the unified finding envelope:
|
|
335
|
+
|
|
336
|
+
| mypy JSON field | Unified finding field | Notes |
|
|
337
|
+
|---|---|---|
|
|
338
|
+
| `file` | `file` | |
|
|
339
|
+
| `line` | `line` | clamped to ≥ 1 |
|
|
340
|
+
| `column` | `column` | omitted when mypy reports no real column (`< 1`) |
|
|
341
|
+
| `code` | `rule_id` | Prefixed `mypy.python.<error-code>`; `mypy.python.note` when absent |
|
|
342
|
+
| `message` | `message` | truncated to 500 chars |
|
|
343
|
+
| `severity` | `severity` | `error`→`error`, `note`→`suggestion`, unknown→`info` |
|
|
344
|
+
|
|
345
|
+
### lizard
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
lizard --csv <target paths> | python3 adapters/lizard-adapter.py
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
- **Capability tier**: complexity metrics
|
|
352
|
+
- **Install**: `python3 -m pip install lizard` (project venv / dev requirements)
|
|
353
|
+
- **Install hint**: `lizard — complexity metrics. install: python3 -m pip install lizard (project venv / dev requirements)`
|
|
354
|
+
- **Detection**: `command -v lizard`
|
|
355
|
+
- **Presence**: not language-conditional — lizard covers ~15 languages (C/C++, C#, Java, JS/TS, Python, Go, Ruby, PHP, Swift, Kotlin, Rust, Scala, Lua, Objective-C, TTCN-3), so it is probed on every target set.
|
|
356
|
+
- **Never pass `--warnings_only`**: it overrides `--csv` and emits clang-style text the adapter cannot parse (verified against lizard 1.24.0). Thresholds are applied by the adapter, not by lizard.
|
|
357
|
+
- **Exit codes**: plain `--csv` exits 0 even when functions are over threshold; a non-zero exit means lizard itself failed. (`--warnings_only`, which this lane does not use, exits 1 on any warning.)
|
|
358
|
+
- **Adapter**: `../adapters/lizard-adapter.py` (≤ 40 LOC) emits one finding per **threshold breach** (strictly greater than), so a clean tree produces none:
|
|
359
|
+
|
|
360
|
+
| lizard CSV column (0-indexed) | Threshold | `rule_id` | Notes |
|
|
361
|
+
|---|---|---|---|
|
|
362
|
+
| 1 — CCN | > 10 | `lizard.complexity.cyclomatic` | fires on 10.3% of this repo's functions |
|
|
363
|
+
| 4 — length | > 60 | `lizard.complexity.function-length` | function length in lines; 6.1% |
|
|
364
|
+
| 3 — PARAM | > 5 | `lizard.complexity.parameter-count` | 1.4% |
|
|
365
|
+
| 6 — file | — | `file` | absolute paths are relativized to cwd; run from the repo root |
|
|
366
|
+
| 9 / 10 — start / end | — | `line` / `end_line` | clamped to ≥ 1 |
|
|
367
|
+
| 7 — name | — | `message` prefix | the function name |
|
|
368
|
+
|
|
369
|
+
All findings carry `severity: warning` and `metadata.confidence: high` (a measurement, not a judgment), plus `metadata.metric`/`value`/`threshold` so a consumer can re-derive the comparison. Thresholds live in the adapter's `_CHECKS` table.
|
|
370
|
+
|
|
371
|
+
- **Thresholds are calibrated, not guessed.** Measured over this repo's own `hooks/` + `scripts/` tree (1,247 functions): CCN p50=3 / p90=11, length p50=14 / p95=67, param p50=1 / p99=6. Each threshold sits near that tail, so the lane flags outliers instead of describing the median. Re-measure before moving one.
|
|
372
|
+
|
|
373
|
+
- **Nesting depth is deliberately NOT covered here.** lizard's only nesting-ish metric is `-Ens`'s *nested-structure complexity*, and it is not max nesting depth: verified on lizard 1.24.0, a function with three sequential one-level `if`s scores **5** while a two-level nested one scores **2**. It is cumulative, so it scales with function size — over the same 1,247-function tree its median is **9**, and a threshold of 6 fired on **57%** of all functions. There is no fixed threshold that means "deeply nested", so the lane omits the metric rather than shipping a noisy one under a misleading name. **Max nesting depth is not a metric lizard exposes** — for JS/TS it is covered by ESLint's `max-depth` rule; elsewhere it remains a judgment call for `structure-review` (which absorbed `complexity-review`'s nesting-depth charter, #2093), which is part of why that lens keeps this judgment residue after this lane lands.
|
|
374
|
+
|
|
375
|
+
### jscpd
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
jscpd --reporters json --output <report-dir> --silent <target paths> \
|
|
379
|
+
&& python3 adapters/jscpd-adapter.py < <report-dir>/jscpd-report.json
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
- **Capability tier**: copy-paste duplication detection
|
|
383
|
+
- **Install**: `npm install -g jscpd`
|
|
384
|
+
- **Install hint**: `jscpd — copy-paste duplication detection. install: npm install -g jscpd`
|
|
385
|
+
- **Detection**: `command -v jscpd`
|
|
386
|
+
- **Presence**: not language-conditional — jscpd tokenizes ~150 formats.
|
|
387
|
+
- **The JSON reporter writes a FILE, never stdout** (`<output>/jscpd-report.json`, verified against jscpd 5.0.16), which is why the lane redirects the file into the adapter rather than piping the command. `--silent` suppresses the console reporter's own summary; it does not redirect the report.
|
|
388
|
+
- **Exit code** is 0 for a normal run regardless of clones found; it is non-zero only when a `--threshold` is configured and exceeded. Do not read a clone count from the exit status.
|
|
389
|
+
- **Adapter**: `../adapters/jscpd-adapter.py` (≤ 40 LOC) emits **one** finding per clone, anchored at `firstFile`, with `secondFile` named in the message — not two findings, so a clone pair is not double-counted:
|
|
390
|
+
|
|
391
|
+
| jscpd report field | Unified finding field | Notes |
|
|
392
|
+
|---|---|---|
|
|
393
|
+
| `duplicates[].firstFile.name` | `file` | relativized to cwd |
|
|
394
|
+
| `duplicates[].firstFile.start` / `.end` | `line` / `end_line` | clamped to ≥ 1 |
|
|
395
|
+
| `duplicates[].secondFile.*` | `message`, `metadata.duplicate_of` | the other location |
|
|
396
|
+
| `duplicates[].lines` / `.tokens` | `message` | clone size |
|
|
397
|
+
| `duplicates[].format` | `metadata.format` | |
|
|
398
|
+
| `duplicates[].fragment` | **dropped** | see below |
|
|
399
|
+
|
|
400
|
+
- **Shared helper**: both this adapter and lizard's normalize paths through `../adapters/_envelope.py`'s `rel()`. Adapters run as standalone scripts, so `sys.path[0]` is the adapters directory and a plain `import _envelope` resolves with no path manipulation. It exists because two byte-identical copies of that function were exactly the finding this duplication lane reports.
|
|
401
|
+
- **`fragment` is deliberately never copied into the finding.** It holds the duplicated source verbatim, and these findings are injected into every review agent's prompt — echoing both copies of every clone into that context is precisely the token cost this lane exists to remove.
|
|
402
|
+
- **Malformed input degrades to a skip**: a report that is not valid JSON produces a `WARN` on stderr, zero findings, and exit 0 — never a pipeline failure, per the skill's graceful-degradation constraint.
|
|
403
|
+
|
|
404
|
+
## Tier 4 — legacy (pre-SARIF)
|
|
405
|
+
|
|
406
|
+
### ESLint
|
|
407
|
+
|
|
408
|
+
```bash
|
|
409
|
+
npx eslint -f json <target-js-ts-files>
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
| ESLint JSON field | Unified finding field | Notes |
|
|
413
|
+
|---|---|---|
|
|
414
|
+
| `filePath` | `file` | |
|
|
415
|
+
| `messages[].line` | `line` | |
|
|
416
|
+
| `messages[].ruleId` | `rule_id` | Prefixed as `eslint.js.<rule-id>` |
|
|
417
|
+
| `messages[].message` | `message` | |
|
|
418
|
+
| `messages[].severity` (1=warn, 2=error) | `severity` | 1→`warning`, 2→`error` |
|
|
419
|
+
|
|
420
|
+
### TypeScript compiler
|
|
421
|
+
|
|
422
|
+
```bash
|
|
423
|
+
npx tsc --noEmit 2>&1
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
Output is line-based diagnostics; the legacy adapter parses
|
|
427
|
+
`<file>(line,col): error TSNNNN: <message>` entries and maps to
|
|
428
|
+
`rule_id: tsc.ts.ts<NNNN>`.
|
|
429
|
+
|
|
430
|
+
Legacy adapters emit the same unified finding envelope as SARIF tools. Migrate to SARIF-native invocation when upstream support lands.
|
|
431
|
+
|
|
432
|
+
## Build-time lanes
|
|
433
|
+
|
|
434
|
+
The registry for `/build`'s static self-heal pass: one subsection per
|
|
435
|
+
language lane, filled in by the issue that registers the lane with the lane's
|
|
436
|
+
file extensions, each capability slot's (**autofix** / **diagnostic**)
|
|
437
|
+
ordered provider list — default provider first; it doubles as the last-resort
|
|
438
|
+
provider named by install hints — and each provider's detection probe
|
|
439
|
+
(repo-local locations first, then PATH).
|
|
440
|
+
|
|
441
|
+
Everything else — what a lane is, scoping, the shared fix loop, the
|
|
442
|
+
2-attempt cap, detection/provider binding, the provider qualification
|
|
443
|
+
contract, the degradation ladder, granularity, and ordering — is specified
|
|
444
|
+
once, in `${CLAUDE_PLUGIN_ROOT}/skills/build/references/static-self-heal.md`.
|
|
445
|
+
Rows registered here must satisfy that contract and must not restate the
|
|
446
|
+
mechanism. User-facing setup for each lane lives in
|
|
447
|
+
[`language-setup.md`](language-setup.md).
|
|
448
|
+
|
|
449
|
+
A language whose subsection still reads "No lane registered" is skipped by
|
|
450
|
+
the self-heal pass with one info line — never a failure.
|
|
451
|
+
|
|
452
|
+
### Python lane
|
|
453
|
+
|
|
454
|
+
- **Extensions**: `.py`
|
|
455
|
+
- **Autofix slot** — ordered provider list:
|
|
456
|
+
1. **ruff** (default, last-resort provider) — probe `command -v ruff`. Qualification: qualified.
|
|
457
|
+
- Fix (mechanical pre-fix): `ruff check --fix <scoped-files>`
|
|
458
|
+
- Verify (check mode): `ruff check <scoped-files>`
|
|
459
|
+
- Honors the project's `ruff.toml`/`pyproject.toml` when present; Ruff defaults otherwise — no plugin-curated rule set.
|
|
460
|
+
2. **black + flake8** — qualifies only as a **combined pair**: black fills the format-autofix half (`black <scoped-files>`), flake8 the lint-diagnostic half (`flake8 <scoped-files>`). Probes `command -v black` **and** `command -v flake8`; both must be present for the pair to bind. Qualification: qualified as a pair, with a recorded caveat — a **partial mapping**, not 1:1 with ruff's rule surface; the binding info line must say so.
|
|
461
|
+
- **Diagnostic slot** — ordered provider list:
|
|
462
|
+
1. **mypy** (default, last-resort provider) — probe `command -v mypy`. Qualification: qualified; diagnostic-only — no autofix, no mechanical pre-fix; findings go to the coding agent inside the shared fix loop.
|
|
463
|
+
- Verify: `mypy $(python3 adapters/mypy-src-layout.py <project-root>) --follow-imports=silent <scoped-files>`
|
|
464
|
+
- `--follow-imports=silent` keeps a scoped run honest: imported modules are still analyzed for type context, but errors are reported only in the scoped files — without it a scoped pass reports errors in unchanged followed modules, polluting the loop.
|
|
465
|
+
- The `$(...)` prefix is the src/-layout auto-detection documented in the mypy Tier 3 entry above (`../adapters/mypy-src-layout.py`) — prints `--explicit-package-bases` when the project needs it, nothing otherwise. Same detection, same script, for both the build-time lane and the `/code-review` backstop.
|
|
466
|
+
2. **pyright** — Qualification: **gated** — machine-readable output qualifies it in principle, but recognition requires a ≤ 40 LOC Tier 3 adapter in this skill's `adapters/`, which does not exist yet; until that adapter lands, pyright binds nothing and is reported honestly with the mypy default offered alongside.
|
|
467
|
+
- **`/code-review` counterparts**: ruff is the Tier 1 native-SARIF source and mypy the Tier 3 JSON adapter documented above — same tools, full-repo invocations.
|
|
468
|
+
|
|
469
|
+
### JS/TS lane
|
|
470
|
+
|
|
471
|
+
Registered by #808.
|
|
472
|
+
|
|
473
|
+
- **Extensions**: `*.js`, `*.jsx`, `*.ts`, `*.tsx`, `*.mjs`, `*.cjs`
|
|
474
|
+
- **Diagnostic slot**: none registered — the lane verifies with the bound autofix provider's own check mode (degradation-ladder rung 2 in `static-self-heal.md`).
|
|
475
|
+
- **Autofix slot** — ordered provider list (default first; it doubles as the last-resort provider named by install hints):
|
|
476
|
+
|
|
477
|
+
1. **oxlint** — default, last-resort provider. Pin **>= 1.0.0**; verify the exact flag names (`--fix`, `--format sarif`) against the project's pinned version — verified against oxlint 1.72.0.
|
|
478
|
+
- Fix pass (mechanical pre-fix): `npx oxlint --fix <scoped-files>`
|
|
479
|
+
- Verify pass (check mode): `npx oxlint <scoped-files>`
|
|
480
|
+
- Detection probe: `npx --no-install oxlint --version` — resolves the project-local `node_modules/.bin` first; oxlint is a project devDependency, never a global binary
|
|
481
|
+
- Install hint (rung 3): `oxlint — JS/TS linting. install: npm install --save-dev oxlint`
|
|
482
|
+
- Partial autofix: oxlint autofixes a subset of its rules — residue surviving the pre-fix goes to the coding agent on the same attempt, per the shared fix loop.
|
|
483
|
+
2. **biome** — full-speed provider: fast and machine-readable, meets all four qualification-contract items at per-step granularity.
|
|
484
|
+
- Fix pass: `npx biome check --write <scoped-files>`
|
|
485
|
+
- Verify pass: `npx biome check <scoped-files>`
|
|
486
|
+
- Detection probe: `npx --no-install biome --version`
|
|
487
|
+
3. **eslint** — bound with demotion: meets contract items (a), (b), and (d) but fails the per-step latency budget (item c). A project that arrives configured for ESLint binds it with the lane demoted to slice-boundary granularity only, and one info line tells the user the fast default (oxlint) exists.
|
|
488
|
+
- Fix pass: `npx eslint --fix <scoped-files>`
|
|
489
|
+
- Verify pass: `npx eslint <scoped-files>`
|
|
490
|
+
- Detection probe: `npx --no-install eslint --version`
|
|
491
|
+
|
|
492
|
+
Rebinding the slot from eslint to oxlint (dropping ESLint) is decided by the checklist under the Tier 2 oxlint entry ("When a project may drop ESLint entirely"); while both tools run, `eslint-plugin-oxlint` suppresses the overlap.
|
|
493
|
+
|
|
494
|
+
### C# lane
|
|
495
|
+
|
|
496
|
+
- **Extensions**: `.cs`
|
|
497
|
+
- **Autofix slot** (ordered provider list): `dotnet format` — the default and
|
|
498
|
+
only provider; SDK-builtin (.NET SDK ≥ 6), so the last-resort provider the
|
|
499
|
+
install hint names is the SDK itself.
|
|
500
|
+
- **Diagnostic slot**: the Roslyn ErrorLog SARIF exported by the
|
|
501
|
+
GREEN-confirming `dotnet build` (see the Tier 1 "Roslyn ErrorLog (C#)"
|
|
502
|
+
entry above for the flag and caveats) — not a separate scoped invocation.
|
|
503
|
+
Scoping is post-hoc filtering to the changed set and freshness is
|
|
504
|
+
build-then-filter, per the C# accommodation in
|
|
505
|
+
`${CLAUDE_PLUGIN_ROOT}/skills/build/references/static-self-heal.md` — not
|
|
506
|
+
restated here.
|
|
507
|
+
- **Detection probe** (one probe covers both slots): `command -v dotnet`.
|
|
508
|
+
|
|
509
|
+
`dotnet format` operates on an **MSBuild project or solution**, not on bare
|
|
510
|
+
file paths — `--include` is a filter of relative paths *within* that
|
|
511
|
+
project/solution, not the operand. When no project/solution argument is
|
|
512
|
+
given, the tool searches the working directory and errors on zero or multiple
|
|
513
|
+
candidates, so pass the project/solution explicitly whenever auto-discovery
|
|
514
|
+
is ambiguous.
|
|
515
|
+
|
|
516
|
+
**Fix pass** — scoped to the checkpoint's changed `.cs` files (paths relative
|
|
517
|
+
to the project/solution root); the `whitespace` and `style` subcommands run
|
|
518
|
+
at every checkpoint:
|
|
519
|
+
|
|
520
|
+
```bash
|
|
521
|
+
dotnet format whitespace <project-or-solution> --include <changed .cs files>
|
|
522
|
+
dotnet format style <project-or-solution> --include <changed .cs files>
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
At the slice-boundary checkpoint, additionally run the `analyzers`
|
|
526
|
+
subcommand, whose Roslyn workspace-load + implicit-restore cost amortizes
|
|
527
|
+
over the slice — no per-step analyzer visibility is lost, because the
|
|
528
|
+
ErrorLog SARIF from the GREEN-confirming build still surfaces analyzer
|
|
529
|
+
diagnostics at every step at zero cost:
|
|
530
|
+
|
|
531
|
+
```bash
|
|
532
|
+
dotnet format analyzers <project-or-solution> --include <slice's changed .cs files>
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
**Verify pass** — same subcommand split; `--verify-no-changes` formats
|
|
536
|
+
nothing and exits non-zero (with diagnostics; add `--report <path>` for a
|
|
537
|
+
JSON report) if any changes would have been made:
|
|
538
|
+
|
|
539
|
+
```bash
|
|
540
|
+
dotnet format whitespace <project-or-solution> --verify-no-changes --include <same files>
|
|
541
|
+
dotnet format style <project-or-solution> --verify-no-changes --include <same files>
|
|
542
|
+
# slice boundary only:
|
|
543
|
+
dotnet format analyzers <project-or-solution> --verify-no-changes --include <same files>
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
- **Severity threshold**: honor the project's `.editorconfig` at the tool's
|
|
547
|
+
default `--severity warn` — the project's own config is the contract,
|
|
548
|
+
consistent with how the other lanes' tools use project config.
|
|
549
|
+
- **Never invoke with an empty `--include` list** — per the CLI, an empty
|
|
550
|
+
include set means "format all files in the project/solution". The
|
|
551
|
+
mechanism's empty-partition guarantee (a lane with no matching changed
|
|
552
|
+
files is never dispatched) is load-bearing for this lane.
|
|
553
|
+
- **Division of labor**: `dotnet format` applies only the fixes it has
|
|
554
|
+
code-fixes for; diagnostics it can't fix surface via the ErrorLog SARIF
|
|
555
|
+
from the next `dotnet build` and reach the coding agent as the lane's
|
|
556
|
+
diagnostic findings on the same attempt — the two pieces are complementary,
|
|
557
|
+
not redundant.
|
|
558
|
+
- **Recognized equivalent providers**: none — `dotnet format` is SDK-builtin,
|
|
559
|
+
and third-party Roslyn analyzers (StyleCop.Analyzers etc.) automatically
|
|
560
|
+
ride the same ErrorLog SARIF once referenced in the project's `.csproj`.
|
|
561
|
+
C# equivalents join via the `.csproj`, not via lane providers.
|
|
562
|
+
|
|
563
|
+
### Java lane
|
|
564
|
+
|
|
565
|
+
Registered by #810.
|
|
566
|
+
|
|
567
|
+
- **Extensions**: `*.java`
|
|
568
|
+
- **Autofix slot**: none — Java has no autofix tool fast enough for the
|
|
569
|
+
per-step loop. The lane is **diagnostic-only**: it runs the shared fix
|
|
570
|
+
loop minus the mechanical pre-fix (degradation rung 1 by construction).
|
|
571
|
+
- **Diagnostic slot** — ordered provider list: **PMD** (default,
|
|
572
|
+
last-resort) → **checkstyle**.
|
|
573
|
+
|
|
574
|
+
**PMD (default, last-resort provider)**
|
|
575
|
+
|
|
576
|
+
- **Detection probe**: repo-local `.pmd/pmd-bin-*/bin/pmd` launcher
|
|
577
|
+
(`pmd.bat` on Windows) first, then `command -v pmd`; verify with
|
|
578
|
+
`pmd --version`.
|
|
579
|
+
- **Invocation** (the mechanism resolves the changed-file set; write its
|
|
580
|
+
`.java` subset to a temp file — PMD's `-d` takes directories/paths, not a
|
|
581
|
+
shell-expanded word list, so `--file-list` is the robust scoped shape):
|
|
582
|
+
|
|
583
|
+
```bash
|
|
584
|
+
pmd check --file-list "$TMP/pmd-files.txt" -R <resolved-ruleset> -f json --no-progress
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
- **Wrapper contracts**:
|
|
588
|
+
- **Empty file set → skip the invocation entirely.** PMD errors when
|
|
589
|
+
given no input files; an empty changed-`.java` set means "nothing to
|
|
590
|
+
check", not a tool failure. The mechanism's empty-partition guarantee
|
|
591
|
+
(a lane with no matching files is never dispatched) is load-bearing
|
|
592
|
+
for this tool.
|
|
593
|
+
- **Exit code 4 = violations found, not tool breakage.** `pmd check`
|
|
594
|
+
exits 0 on clean, 4 when findings exist; treat only other non-zero
|
|
595
|
+
codes as tool errors (degradation rung 4).
|
|
596
|
+
- **Ruleset**: identical to the `/code-review` invocation — see
|
|
597
|
+
[Ruleset resolution](#ruleset-resolution-shared-by-both-pmd-invocations)
|
|
598
|
+
under the Tier 1 pmd entry.
|
|
599
|
+
- **Install**: repo-level, `python3 ${CLAUDE_PLUGIN_ROOT}/scripts/install-java-static-analysis.py`
|
|
600
|
+
(pinned PMD into the gitignored `.pmd/` dir; `PMD_INSTALL_DIR` overrides).
|
|
601
|
+
|
|
602
|
+
**checkstyle (recognized equivalent provider)**
|
|
603
|
+
|
|
604
|
+
- **Qualification**: Tier 1 via native SARIF output (Checkstyle ≥ 10.3), no
|
|
605
|
+
adapter; recognition still requires this registry row — the lists are
|
|
606
|
+
small and explicit.
|
|
607
|
+
- **Binding**: a project arriving with a repo-root `checkstyle.xml` binds
|
|
608
|
+
checkstyle (bind-don't-replace); PMD is installed only when the slot
|
|
609
|
+
binds no recognized provider.
|
|
610
|
+
- **Detection probe**: `command -v checkstyle`, configured by the repo-root
|
|
611
|
+
`checkstyle.xml`.
|
|
612
|
+
- **Invocation** (scoped): `checkstyle -f sarif -c checkstyle.xml <files>`.
|
|
613
|
+
|
|
614
|
+
**SpotBugs is not a provider candidate** for this slot: it requires
|
|
615
|
+
compiled bytecode, forcing a build step beyond what TDD's GREEN already
|
|
616
|
+
produces — it belongs at the end-of-build `/code-review` pass (opt-in deep
|
|
617
|
+
mode), tracked as a post-landing follow-up.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<ruleset name="dev-team-java-default"
|
|
3
|
+
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
|
|
4
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
5
|
+
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
|
|
6
|
+
|
|
7
|
+
<description>
|
|
8
|
+
Default Java ruleset for the dev-team static-analysis integration: wraps
|
|
9
|
+
PMD's documented quickstart set and excludes generated-output directories
|
|
10
|
+
so the full-repo /code-review walk reports no duplicate or noise findings
|
|
11
|
+
on copied sources. Projects override this file entirely by placing a
|
|
12
|
+
pmd-ruleset.xml at their repo root; custom rulesets carry their own
|
|
13
|
+
exclude-pattern entries. Test sources deliberately run the same rules as
|
|
14
|
+
production code.
|
|
15
|
+
</description>
|
|
16
|
+
|
|
17
|
+
<exclude-pattern>.*/target/.*</exclude-pattern>
|
|
18
|
+
<exclude-pattern>.*/build/.*</exclude-pattern>
|
|
19
|
+
<exclude-pattern>.*/out/.*</exclude-pattern>
|
|
20
|
+
<exclude-pattern>.*/\.gradle/.*</exclude-pattern>
|
|
21
|
+
|
|
22
|
+
<rule ref="rulesets/java/quickstart.xml" />
|
|
23
|
+
|
|
24
|
+
</ruleset>
|