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,212 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""security-review agent output -> unified-finding envelope adapter.
|
|
3
|
+
|
|
4
|
+
Reads the security-review agent's JSON output (see
|
|
5
|
+
plugins/dev-team/agents/security-review.md for the agent-output
|
|
6
|
+
schema) and emits one unified-finding envelope v1 (JSONL) per issue.
|
|
7
|
+
|
|
8
|
+
Rule_id lookup is driven by the canonical mapping at
|
|
9
|
+
plugins/dev-team/knowledge/security-review-rule-map.yaml. This
|
|
10
|
+
adapter contains NO inline rule_id literals beyond the
|
|
11
|
+
``security-review.`` namespace prefix constant used for the
|
|
12
|
+
fallback path; the single-source-of-truth invariant is enforced by an
|
|
13
|
+
AST-level test in evals/security-review-adapter/tests/.
|
|
14
|
+
|
|
15
|
+
Contract, error semantics, and failure modes are documented in
|
|
16
|
+
plugins/dev-team/skills/static-analysis-integration/references/security-review-adapter.md.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
import json
|
|
23
|
+
import os
|
|
24
|
+
import re
|
|
25
|
+
import sys
|
|
26
|
+
from typing import Any
|
|
27
|
+
|
|
28
|
+
# Resolved at startup; exposed via module-level for test inspection.
|
|
29
|
+
_SCHEMA_PATH = os.path.abspath(
|
|
30
|
+
os.path.join(
|
|
31
|
+
os.path.dirname(os.path.abspath(__file__)),
|
|
32
|
+
"..",
|
|
33
|
+
"..",
|
|
34
|
+
"..",
|
|
35
|
+
"knowledge",
|
|
36
|
+
"schemas",
|
|
37
|
+
"unified-finding-v1.json",
|
|
38
|
+
)
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# Namespace prefix used when a well-formed category is not in the mapping YAML.
|
|
42
|
+
# This is the ONLY rule_id-shaped literal permitted in this source file;
|
|
43
|
+
# every other rule_id travels in from security-review-rule-map.yaml.
|
|
44
|
+
_FALLBACK_NAMESPACE = "security-review."
|
|
45
|
+
|
|
46
|
+
_CATEGORY_RE = re.compile(r"^A[0-9]{2}\.[a-z0-9-]+$")
|
|
47
|
+
|
|
48
|
+
# Default mapping path resolved relative to this file, so the adapter works
|
|
49
|
+
# from any cwd. The repo-relative path is also named in --help for operators.
|
|
50
|
+
_THIS_FILE = os.path.abspath(__file__)
|
|
51
|
+
_ADAPTER_DIR = os.path.dirname(_THIS_FILE)
|
|
52
|
+
# /plugins/dev-team/skills/static-analysis-integration/adapters -> /plugins/dev-team
|
|
53
|
+
_PLUGIN_ROOT = os.path.abspath(os.path.join(_ADAPTER_DIR, "..", "..", ".."))
|
|
54
|
+
_DEFAULT_MAPPING_ABS = os.path.join(
|
|
55
|
+
_PLUGIN_ROOT, "knowledge", "security-review-rule-map.yaml"
|
|
56
|
+
)
|
|
57
|
+
_DEFAULT_MAPPING_REL = "plugins/dev-team/knowledge/security-review-rule-map.yaml"
|
|
58
|
+
|
|
59
|
+
# Stdlib-only YAML subset parser (ADR 0014/0015 — no third-party imports in
|
|
60
|
+
# shipped plugins/dev-team/ code); lives at plugins/dev-team/hooks/lib/.
|
|
61
|
+
sys.path.insert(0, os.path.join(_PLUGIN_ROOT, "hooks", "lib"))
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _fail_mapping(path: str) -> None:
|
|
65
|
+
print(f"ERROR: mapping file at {path} is invalid", file=sys.stderr)
|
|
66
|
+
sys.exit(1)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _load_mapping(path: str) -> dict[str, str]:
|
|
70
|
+
"""Load the YAML mapping. Hard-fails with a specific ERROR on any issue."""
|
|
71
|
+
from minimal_yaml import YamlError, parse_yaml # local import; cheap, stdlib-only
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
with open(path, "r", encoding="utf-8") as fh:
|
|
75
|
+
data = parse_yaml(fh.read())
|
|
76
|
+
except FileNotFoundError:
|
|
77
|
+
_fail_mapping(path)
|
|
78
|
+
except YamlError:
|
|
79
|
+
_fail_mapping(path)
|
|
80
|
+
if (
|
|
81
|
+
not isinstance(data, dict)
|
|
82
|
+
or "mappings" not in data
|
|
83
|
+
or not isinstance(data.get("mappings"), dict)
|
|
84
|
+
):
|
|
85
|
+
_fail_mapping(path)
|
|
86
|
+
return {str(k): str(v) for k, v in data["mappings"].items()}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def resolve_rule_id(
|
|
90
|
+
category: str, mapping: dict[str, str], mapping_path: str
|
|
91
|
+
) -> tuple[str, str | None]:
|
|
92
|
+
"""Resolve a category to a rule_id.
|
|
93
|
+
|
|
94
|
+
Returns (rule_id, warning_or_none). The caller prints the warning to stderr
|
|
95
|
+
when it is not None.
|
|
96
|
+
|
|
97
|
+
- Malformed category (regex-violating): exits 1.
|
|
98
|
+
- Well-formed + mapped: upstream rule_id, no warning.
|
|
99
|
+
- Well-formed + unmapped: security-review.<lowercase> rule_id + WARN.
|
|
100
|
+
"""
|
|
101
|
+
if not _CATEGORY_RE.fullmatch(category):
|
|
102
|
+
print(
|
|
103
|
+
f"ERROR: category {category!r} does not match required format A<NN>.<slug>",
|
|
104
|
+
file=sys.stderr,
|
|
105
|
+
)
|
|
106
|
+
sys.exit(1)
|
|
107
|
+
if category in mapping:
|
|
108
|
+
return mapping[category], None
|
|
109
|
+
minted = _FALLBACK_NAMESPACE + category.lower()
|
|
110
|
+
warning = (
|
|
111
|
+
f"WARN: category {category} not in mapping at {mapping_path}; minted {minted}"
|
|
112
|
+
)
|
|
113
|
+
return minted, warning
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _build_finding(issue: dict[str, Any], rule_id: str) -> dict[str, Any]:
|
|
117
|
+
"""Map an agent issue to a unified-finding envelope."""
|
|
118
|
+
return {
|
|
119
|
+
"rule_id": rule_id,
|
|
120
|
+
"file": issue["file"],
|
|
121
|
+
"line": issue["line"],
|
|
122
|
+
"severity": issue["severity"],
|
|
123
|
+
"message": issue["message"],
|
|
124
|
+
"metadata": {
|
|
125
|
+
"source": "security-review",
|
|
126
|
+
"confidence": issue.get("confidence", "none"),
|
|
127
|
+
"source_ref": issue,
|
|
128
|
+
},
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _parse_args(argv):
|
|
133
|
+
parser = argparse.ArgumentParser(
|
|
134
|
+
prog="security-review-adapter.py",
|
|
135
|
+
description=(
|
|
136
|
+
"Normalize security-review agent JSON into unified-finding-v1 JSONL. "
|
|
137
|
+
f"Default mapping: {_DEFAULT_MAPPING_REL}."
|
|
138
|
+
),
|
|
139
|
+
)
|
|
140
|
+
parser.add_argument("--input", required=True, help="Agent-output JSON file.")
|
|
141
|
+
parser.add_argument(
|
|
142
|
+
"--output",
|
|
143
|
+
required=True,
|
|
144
|
+
help="Destination JSONL path (one unified finding per line).",
|
|
145
|
+
)
|
|
146
|
+
parser.add_argument(
|
|
147
|
+
"--mapping",
|
|
148
|
+
default=_DEFAULT_MAPPING_ABS,
|
|
149
|
+
help=f"Mapping YAML path. Default: {_DEFAULT_MAPPING_REL}",
|
|
150
|
+
)
|
|
151
|
+
return parser.parse_args(argv)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def _load_validator():
|
|
155
|
+
"""Load the unified-finding validator once at startup."""
|
|
156
|
+
try:
|
|
157
|
+
from jsonschema import Draft202012Validator
|
|
158
|
+
except ImportError as exc: # pragma: no cover
|
|
159
|
+
print(
|
|
160
|
+
f"ERROR: jsonschema not installed; install with 'pip install jsonschema' ({exc})",
|
|
161
|
+
file=sys.stderr,
|
|
162
|
+
)
|
|
163
|
+
sys.exit(1)
|
|
164
|
+
with open(_SCHEMA_PATH, "r", encoding="utf-8") as fh:
|
|
165
|
+
schema = json.load(fh)
|
|
166
|
+
return Draft202012Validator(schema)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def main(argv=None) -> int:
|
|
170
|
+
args = _parse_args(argv)
|
|
171
|
+
try:
|
|
172
|
+
with open(args.input, "r", encoding="utf-8") as fh:
|
|
173
|
+
agent = json.load(fh)
|
|
174
|
+
except (FileNotFoundError, json.JSONDecodeError) as exc:
|
|
175
|
+
print(f"ERROR: cannot read agent input {args.input!r}: {exc}", file=sys.stderr)
|
|
176
|
+
return 1
|
|
177
|
+
|
|
178
|
+
mapping = _load_mapping(args.mapping)
|
|
179
|
+
validator = _load_validator()
|
|
180
|
+
issues = agent.get("issues", []) or []
|
|
181
|
+
|
|
182
|
+
with open(args.output, "w", encoding="utf-8") as out:
|
|
183
|
+
for issue in issues:
|
|
184
|
+
if "category" not in issue:
|
|
185
|
+
print(
|
|
186
|
+
"ERROR: agent issue missing required 'category' field; "
|
|
187
|
+
"upgrade the agent output",
|
|
188
|
+
file=sys.stderr,
|
|
189
|
+
)
|
|
190
|
+
return 1
|
|
191
|
+
rule_id, warning = resolve_rule_id(issue["category"], mapping, args.mapping)
|
|
192
|
+
if warning:
|
|
193
|
+
print(warning, file=sys.stderr)
|
|
194
|
+
finding = _build_finding(issue, rule_id)
|
|
195
|
+
errors = list(validator.iter_errors(finding))
|
|
196
|
+
if errors:
|
|
197
|
+
detail = "; ".join(
|
|
198
|
+
f"{'.'.join(str(p) for p in e.path) or '<root>'}: {e.message}"
|
|
199
|
+
for e in errors
|
|
200
|
+
)
|
|
201
|
+
print(
|
|
202
|
+
"ERROR: emitted finding violates unified-finding-v1 schema "
|
|
203
|
+
f"({detail})",
|
|
204
|
+
file=sys.stderr,
|
|
205
|
+
)
|
|
206
|
+
return 1
|
|
207
|
+
out.write(json.dumps(finding, ensure_ascii=False) + "\n")
|
|
208
|
+
return 0
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
if __name__ == "__main__":
|
|
212
|
+
sys.exit(main())
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Static Analysis Integration — Maintenance Policies
|
|
2
|
+
|
|
3
|
+
These policies cover the lifecycle of adapters and rulesets shipped with this skill. They are read by maintainers, not by agents at runtime — the runtime skill is in `SKILL.md`.
|
|
4
|
+
|
|
5
|
+
## Adapter Maintenance Policy
|
|
6
|
+
|
|
7
|
+
Adapters (SARIF wrappers, bespoke JSON adapters) have a lifecycle independent of the tools they wrap.
|
|
8
|
+
|
|
9
|
+
- **Owners**: the skill's `maintainers:` frontmatter list. Minimum 2 names.
|
|
10
|
+
- **Update trigger**: a tier-2 CI job (nightly) runs each adapter against the installed tool binary. Schema drift that breaks the adapter fails CI and opens an auto-issue tagged `adapter-drift`.
|
|
11
|
+
- **Escalation**: a tier-2 failure unassigned for > 14 days escalates to CODEOWNERS.
|
|
12
|
+
- **Deprecation**: an adapter failing CI for three consecutive releases AND upstream unmaintained for > 6 months is demoted to "deprecated" — still shipped, emits a warning on invocation, removed in the next MAJOR contract version.
|
|
13
|
+
- **Adding a tool**: requires (a) a fixture pair under `evals/static-analysis-tools/tier1-mocks/<tool>/` (mock output + expected unified finding), and (b) a SARIF adapter first; bespoke-JSON only if upstream genuinely has no SARIF plan.
|
|
14
|
+
|
|
15
|
+
## Ruleset Maintenance Policy
|
|
16
|
+
|
|
17
|
+
Separate lifecycle from adapters — rulesets track evolving attack patterns, not tool schema drift.
|
|
18
|
+
|
|
19
|
+
- **Owners**: each custom ruleset (`knowledge/semgrep-rules/*.yaml`) has a `maintainers:` frontmatter block with ≥ 2 names.
|
|
20
|
+
- **Review cadence**: quarterly. Reviewers confirm patterns are still relevant, add new attack signatures, retire deprecated ones.
|
|
21
|
+
- **FP drift threshold**: if eval fixtures show > 20% false-positive noise on the tier-2 suite, the ruleset is paused and triaged within one release.
|
|
22
|
+
- **Community-PR intake**: PRs adding patterns require a positive fixture plus a negative fixture. Rejections must cite the policy.
|
|
23
|
+
- **Deprecation**: a ruleset with no review or change in two consecutive review cycles is demoted to "archived" unless a maintainer re-ups.
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# Per-language static-analysis setup
|
|
2
|
+
|
|
3
|
+
User-facing configuration guide for the static-analysis integration: the
|
|
4
|
+
build-time self-heal pass that runs at `/build`'s review checkpoints and the
|
|
5
|
+
`/code-review` static pre-pass. One section per registered lane, below. This
|
|
6
|
+
guide is the single source of truth for the manual setup commands; the
|
|
7
|
+
registry of what runs (and how) lives in [`tool-configs.md`](tool-configs.md)
|
|
8
|
+
§ Build-time lanes.
|
|
9
|
+
|
|
10
|
+
## Opting out
|
|
11
|
+
|
|
12
|
+
Set `DEV_TEAM_STATIC_SELF_HEAL=off` to skip the entire build-time static
|
|
13
|
+
self-heal pass — no tool probe or invocation occurs, one info line notes the
|
|
14
|
+
skip, and review checkpoints proceed straight to semantic review. Any other
|
|
15
|
+
value (or unset) leaves the pass enabled. This mirrors the
|
|
16
|
+
`DEV_TEAM_REVIEW_VALUE=off` convention and does not affect `/code-review`'s
|
|
17
|
+
full-repo static pre-pass.
|
|
18
|
+
|
|
19
|
+
## Per-lane section contract
|
|
20
|
+
|
|
21
|
+
Each language section below is added by the issue that registers its lane
|
|
22
|
+
and covers, in order:
|
|
23
|
+
|
|
24
|
+
1. **Tools and roles** — which tools the lane uses and what each does
|
|
25
|
+
(autofix-capable vs diagnostic-only).
|
|
26
|
+
2. **Repo-level install** — how to install them as project-local,
|
|
27
|
+
versioned-with-the-repo dependencies, never user-level/global, so the
|
|
28
|
+
toolchain is reproducible for every contributor and CI.
|
|
29
|
+
3. **Configuration** — which config files the tools honor.
|
|
30
|
+
4. **Verification** — the lane's detection probe commands, to confirm the
|
|
31
|
+
setup is detected.
|
|
32
|
+
5. **Opt-out** — the `DEV_TEAM_STATIC_SELF_HEAL=off` toggle above.
|
|
33
|
+
6. **Recognized equivalent providers** — the slot's ordered provider list
|
|
34
|
+
and each provider's qualification status.
|
|
35
|
+
|
|
36
|
+
Each section also carries a one-line pointer to `/project-init` as the
|
|
37
|
+
one-command path to the same repo-level install; this guide remains the
|
|
38
|
+
source of truth for the manual commands.
|
|
39
|
+
|
|
40
|
+
## Python
|
|
41
|
+
|
|
42
|
+
1. **Tools and roles** — **Ruff** (autofix-capable): lint plus mechanical
|
|
43
|
+
fixes; runs the lane's pre-fix (`ruff check --fix`) and verify
|
|
44
|
+
(`ruff check`). **mypy** (diagnostic-only): type checking; it has no
|
|
45
|
+
autofix — its findings are handed to the coding agent.
|
|
46
|
+
2. **Repo-level install** — add both to the project's own dev-dependency
|
|
47
|
+
mechanism so the toolchain is versioned with the repo and reproducible
|
|
48
|
+
for every contributor and CI: `requirements-dev.txt`, a `pyproject.toml`
|
|
49
|
+
dev dependency group, or `python3 -m pip install ruff mypy` inside the
|
|
50
|
+
project venv. Never `pip install --user` or a global pipx install.
|
|
51
|
+
3. **Configuration** — Ruff honors the project's `ruff.toml`/`pyproject.toml`
|
|
52
|
+
when present (Ruff's default config discovery — no override flags) and
|
|
53
|
+
falls back to Ruff's defaults; the plugin pins no curated rule set — the
|
|
54
|
+
project owns its quality bar. mypy honors `mypy.ini`/`pyproject.toml`
|
|
55
|
+
(`[tool.mypy]`). A plain `src/`-layout project (modules with no
|
|
56
|
+
`__init__.py`, no mypy package-base config) needs no manual setup
|
|
57
|
+
either — both mypy invocations auto-detect the layout and add
|
|
58
|
+
`--explicit-package-bases` for you; see the mypy Tier 3 entry in
|
|
59
|
+
`tool-configs.md`.
|
|
60
|
+
4. **Verification** — the lane's detection probes are `command -v ruff` and
|
|
61
|
+
`command -v mypy`; run them (with the project venv active) to confirm
|
|
62
|
+
the setup will be detected.
|
|
63
|
+
5. **Opt-out** — `DEV_TEAM_STATIC_SELF_HEAL=off` skips the build-time
|
|
64
|
+
static self-heal pass entirely (see [Opting out](#opting-out)).
|
|
65
|
+
6. **Recognized equivalent providers** — autofix slot: ruff (default,
|
|
66
|
+
last-resort) → black + flake8, qualified only as a combined pair (black
|
|
67
|
+
is the format-autofix half, flake8 the lint-diagnostic half — a partial
|
|
68
|
+
mapping, not 1:1 with ruff's rule surface). Diagnostic slot: mypy
|
|
69
|
+
(default, last-resort) → pyright, gated: recognition requires a ≤ 40 LOC
|
|
70
|
+
Tier 3 adapter in `static-analysis-integration`, which does not exist
|
|
71
|
+
yet. A project arriving with black + flake8 (or pyright) present and
|
|
72
|
+
configured gets them bound; ruff/mypy are installed only into slots that
|
|
73
|
+
bind no recognized provider.
|
|
74
|
+
|
|
75
|
+
Run `/project-init` for the one-command path to the same repo-level
|
|
76
|
+
install; the commands above remain the source of truth for manual setup.
|
|
77
|
+
|
|
78
|
+
## JS/TS
|
|
79
|
+
|
|
80
|
+
1. **Tools and roles** — **oxlint** (pin >= 1.0.0; Rust-based,
|
|
81
|
+
ESLint-compatible) is the lane's autofix-capable tool: the mechanical
|
|
82
|
+
pre-fix (`npx oxlint --fix`) covers a subset of its rules — partial
|
|
83
|
+
autofix; findings it cannot fix are reported fast and handed to the coding
|
|
84
|
+
agent — and the verify pass runs oxlint in check mode. **ESLint** is the
|
|
85
|
+
optional deep pass for framework-plugin rules oxlint lacks; it is not part
|
|
86
|
+
of the fast per-step loop (see the provider list below for how an
|
|
87
|
+
ESLint-configured project binds).
|
|
88
|
+
2. **Repo-level install**:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npm install --save-dev oxlint
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
A devDependency pins the oxlint version in `package.json`/the lockfile —
|
|
95
|
+
versioned with the repo and reproducible for every contributor and CI.
|
|
96
|
+
Never `npm install -g oxlint`. One-command alternative: run
|
|
97
|
+
`/project-init` — for a new project its greenfield scaffold installs
|
|
98
|
+
oxlint and wires it as the default linter; for an existing repo it
|
|
99
|
+
installs oxlint only when the slot binds no provider.
|
|
100
|
+
3. **Configuration** — oxlint honors `.oxlintrc.json` (ESLint-v8-compatible
|
|
101
|
+
shape; oxlint runs with sensible defaults when no config exists). When
|
|
102
|
+
ESLint coexists as the deep pass, add
|
|
103
|
+
[`eslint-plugin-oxlint`](https://github.com/oxc-project/eslint-plugin-oxlint)
|
|
104
|
+
to the ESLint config to turn off rules oxlint already covers, so the
|
|
105
|
+
ESLint pass only pays for the plugin-only remainder.
|
|
106
|
+
4. **Verification**:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npx --no-install oxlint --version
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Prints the pinned version when the lane's probe will detect oxlint (the
|
|
113
|
+
probe resolves the project-local `node_modules/.bin` first). Projects
|
|
114
|
+
bound to another provider verify the same way:
|
|
115
|
+
`npx --no-install biome --version` / `npx --no-install eslint --version`.
|
|
116
|
+
5. **Opt-out** — `DEV_TEAM_STATIC_SELF_HEAL=off` skips the build-time pass
|
|
117
|
+
(see [Opting out](#opting-out)).
|
|
118
|
+
6. **Recognized equivalent providers** (autofix slot; provider semantics live
|
|
119
|
+
in the build skill's `static-self-heal.md`):
|
|
120
|
+
- **oxlint** — default and last-resort provider; full-speed.
|
|
121
|
+
- **biome** — full-speed provider (fast, machine-readable).
|
|
122
|
+
- **eslint** — bound with demotion to slice-boundary granularity only
|
|
123
|
+
(fails the per-step latency budget), with one info line telling the
|
|
124
|
+
user the fast default (oxlint) exists.
|
|
125
|
+
|
|
126
|
+
## C#
|
|
127
|
+
|
|
128
|
+
The C# lane rides the .NET SDK — there is no separate linter binary to
|
|
129
|
+
install or configure.
|
|
130
|
+
|
|
131
|
+
1. **Tools and roles**
|
|
132
|
+
- `dotnet format` — autofix-capable: Roslyn-analyzer-driven whitespace,
|
|
133
|
+
style, and analyzer code-fixes. The build-time lane's mechanical
|
|
134
|
+
pre-fix (`whitespace` + `style` at every checkpoint; `analyzers` at the
|
|
135
|
+
slice boundary).
|
|
136
|
+
- Roslyn **ErrorLog SARIF** — diagnostic-only: native SARIF exported by
|
|
137
|
+
the `dotnet build` the TDD loop already runs when passed
|
|
138
|
+
`/p:ErrorLog=results.sarif,version=2.1`. Also the lane's Tier 1
|
|
139
|
+
`/code-review` source.
|
|
140
|
+
2. **Repo-level install** — nothing to install: both pieces ship with the
|
|
141
|
+
.NET SDK the project already requires (SDK ≥ 6 for built-in
|
|
142
|
+
`dotnet format`; .NET 5 SDK / Roslyn 3.8+ for the SARIF v2.1 export).
|
|
143
|
+
Where the SDK version matters, pin it repo-level with `global.json`
|
|
144
|
+
(`dotnet new globaljson --sdk-version <version>`) — never a
|
|
145
|
+
user-level/global toolchain assumption. `/project-init` is the
|
|
146
|
+
one-command path: it verifies SDK presence and honors an existing
|
|
147
|
+
`global.json` pin.
|
|
148
|
+
3. **Configuration** — the tools honor the project's `.editorconfig`;
|
|
149
|
+
`dotnet format` runs against it at its default `--severity warn`.
|
|
150
|
+
Third-party Roslyn analyzers (StyleCop.Analyzers, SonarAnalyzer.CSharp,
|
|
151
|
+
…) are added as `PackageReference`s in the `.csproj` and automatically
|
|
152
|
+
ride the same ErrorLog SARIF.
|
|
153
|
+
4. **Verification** — the lane's detection probe is `command -v dotnet`
|
|
154
|
+
(one SDK probe covers both tools). Confirm the pieces work:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
command -v dotnet
|
|
158
|
+
dotnet format --version
|
|
159
|
+
dotnet build /p:ErrorLog=results.sarif,version=2.1 # writes results.sarif
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
5. **Opt-out** — set `DEV_TEAM_STATIC_SELF_HEAL=off` to skip the build-time
|
|
163
|
+
self-heal pass entirely (see [Opting out](#opting-out) above).
|
|
164
|
+
6. **Recognized equivalent providers** — none. `dotnet format` is
|
|
165
|
+
SDK-builtin, and analyzer alternatives join via the `.csproj`, not via
|
|
166
|
+
lane providers.
|
|
167
|
+
|
|
168
|
+
## Java
|
|
169
|
+
|
|
170
|
+
Registered by #810.
|
|
171
|
+
|
|
172
|
+
### Tools and roles
|
|
173
|
+
|
|
174
|
+
- **PMD** — **diagnostic-only** (no autofix tool exists for a tight
|
|
175
|
+
per-step loop in Java). Syntax-tree based, so it needs no compile step:
|
|
176
|
+
fast enough for build-time checkpoints, and its native SARIF renderer
|
|
177
|
+
makes it a zero-adapter `/code-review` source. Findings go to the coding
|
|
178
|
+
agent to fix; PMD re-runs to confirm convergence.
|
|
179
|
+
|
|
180
|
+
### Repo-level install
|
|
181
|
+
|
|
182
|
+
From your project root (requires a JDK/JRE — `java` on PATH):
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/install-java-static-analysis.py"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Installs a pinned PMD distribution into the repo-local **`.pmd/`**
|
|
189
|
+
directory (`PMD_INSTALL_DIR` overrides the target). Add `.pmd/` to your
|
|
190
|
+
project's `.gitignore` — the distribution is large and must never be
|
|
191
|
+
committed; the installer prints a reminder when the entry is missing. No
|
|
192
|
+
PATH change is needed, and never install user-level/global. Re-running is
|
|
193
|
+
idempotent: an existing install is detected and nothing is re-downloaded.
|
|
194
|
+
|
|
195
|
+
Or run `/project-init` — the one-command path to the same repo-level
|
|
196
|
+
install.
|
|
197
|
+
|
|
198
|
+
### Configuration
|
|
199
|
+
|
|
200
|
+
- **Repo-root `pmd-ruleset.xml`**, when present, is used by both the
|
|
201
|
+
build-time lane and the `/code-review` pass. Carry your own
|
|
202
|
+
`<exclude-pattern>` entries in it (generated-output dirs like `target/`).
|
|
203
|
+
- Otherwise the plugin's quickstart-wrapping default ruleset applies —
|
|
204
|
+
PMD's quickstart rules plus excludes for `target/`, `build/`, `out/`,
|
|
205
|
+
and `.gradle/`. Test sources run the same rules as production code.
|
|
206
|
+
|
|
207
|
+
### Verification
|
|
208
|
+
|
|
209
|
+
Confirm the setup is detected (repo-local probe first, then PATH):
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
ls .pmd/pmd-bin-*/bin/pmd # repo-local launcher (checked first)
|
|
213
|
+
command -v pmd # PATH fallback
|
|
214
|
+
.pmd/pmd-bin-*/bin/pmd --version
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Opt-out
|
|
218
|
+
|
|
219
|
+
Set `DEV_TEAM_STATIC_SELF_HEAL=off` to skip the build-time pass entirely —
|
|
220
|
+
see [Opting out](#opting-out).
|
|
221
|
+
|
|
222
|
+
### Recognized equivalent providers
|
|
223
|
+
|
|
224
|
+
Diagnostic slot, in order: **PMD** (default, last-resort) → **checkstyle**.
|
|
225
|
+
checkstyle qualifies as Tier 1 via native SARIF output (Checkstyle ≥ 10.3,
|
|
226
|
+
no adapter); a project arriving with a repo-root `checkstyle.xml` binds it
|
|
227
|
+
and PMD is not installed. SpotBugs is not a provider candidate — it needs
|
|
228
|
+
compiled bytecode and belongs at the end-of-build `/code-review` pass only.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# SARIF → Unified Finding Parser
|
|
2
|
+
|
|
3
|
+
Shared normalization layer for every SARIF-emitting tool in the static-analysis pre-pass. Reads a SARIF document, walks `runs[*].results[*]`, and emits unified-finding-v1 objects that validate against `plugins/dev-team/knowledge/schemas/unified-finding-v1.json`.
|
|
4
|
+
|
|
5
|
+
## Field mapping
|
|
6
|
+
|
|
7
|
+
### Required fields
|
|
8
|
+
|
|
9
|
+
| Unified finding field | SARIF source | Transform |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| `rule_id` | `runs[r].tool.driver.name` + `results[i].ruleId` | Format: `<driver_name_kebab>.<middle>.<ruleId_kebab>` — see **Rule id prefix conventions** below for what fills the middle segment |
|
|
12
|
+
| `file` | `results[i].locations[0].physicalLocation.artifactLocation.uri` | Strip `file://` prefix; resolve `uriBaseId` if present; ensure repo-relative POSIX path |
|
|
13
|
+
| `line` | `results[i].locations[0].physicalLocation.region.startLine` | Integer, 1-indexed |
|
|
14
|
+
| `severity` | `results[i].level` | Map: `error`→`error`, `warning`→`warning`, `note`→`suggestion`, `none` or absent→`info` |
|
|
15
|
+
| `message` | `results[i].message.text` | Truncate at 500 chars |
|
|
16
|
+
| `metadata.source` | `runs[r].tool.driver.name` | Lowercase; e.g. `"Semgrep"`→`"semgrep"` |
|
|
17
|
+
| `metadata.confidence` | `results[i].properties.confidence` | Default: `medium` |
|
|
18
|
+
|
|
19
|
+
### Optional fields
|
|
20
|
+
|
|
21
|
+
| Unified finding field | SARIF source | Notes |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| `column` | `results[i].locations[0].physicalLocation.region.startColumn` | Omit if absent |
|
|
24
|
+
| `end_line` | `results[i].locations[0].physicalLocation.region.endLine` | Omit if absent |
|
|
25
|
+
| `end_column` | `results[i].locations[0].physicalLocation.region.endColumn` | Omit if absent |
|
|
26
|
+
| `cwe[]` | `runs[r].tool.driver.rules[ruleIndex].properties.cwe` | Wrap as `["CWE-N"]`; accept int or string |
|
|
27
|
+
| `cve[]` | `results[i].properties.cve` or rule `properties.cve` | Validate `CVE-YYYY-N` shape |
|
|
28
|
+
| `owasp[]` | `runs[r].tool.driver.rules[ruleIndex].properties.owasp` | Passthrough |
|
|
29
|
+
| `metadata.source_ref` | `results[i]` (the raw object) | Opaque pointer for debugging only; shape is NOT contract-stable |
|
|
30
|
+
| `metadata.exploitability` | `results[i].properties.exploitability` | Map to `demonstrated|plausible|theoretical|unknown`; default `unknown` if absent |
|
|
31
|
+
|
|
32
|
+
## Rule id prefix conventions
|
|
33
|
+
|
|
34
|
+
Every unified rule_id follows the schema pattern `^[a-z0-9_-]+(\.[a-z0-9_-]+)+$` — at least two dot-separated segments. The parser applies the rules below depending on the shape of the raw SARIF ruleId.
|
|
35
|
+
|
|
36
|
+
The middle segment comes from the raw ruleId's own structure, its plugin, or the tool → tier map — **never** from `results[i].properties.language`. An earlier version of the field table above named that property as the source; no implementation ever read it, and the tier map is what every fixture and both consumers actually exercise.
|
|
37
|
+
|
|
38
|
+
**Raw ruleId contains dots (semgrep-style):** preserve the structure. Each segment is kebab-cased independently.
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
raw: python.django.audit.sql-injection
|
|
42
|
+
out: semgrep.python.django.audit.sql-injection
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Raw ruleId is `plugin(rule)`-shaped (oxlint):** the plugin becomes the tier segment, so the namespace survives.
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
raw: jsx-a11y(alt-text) out: oxlint.jsx-a11y.alt-text
|
|
49
|
+
raw: eslint(no-magic-numbers) out: oxlint.eslint.no-magic-numbers
|
|
50
|
+
raw: react-perf(jsx-no-new-object-as-prop)
|
|
51
|
+
out: oxlint.react-perf.jsx-no-new-object-as-prop
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
This branch is checked **before** the dotted and flat cases. Without it the
|
|
55
|
+
parentheses are hyphen-flattened by `kebab()` into a single segment
|
|
56
|
+
(`oxlint.js.jsx-a11y-alt-text`) — schema-valid, but it erases the boundary
|
|
57
|
+
that lets a consumer tell an accessibility finding from a performance one,
|
|
58
|
+
which is exactly what #1979's two oxlint concerns need. A malformed shape
|
|
59
|
+
(empty half, nested parentheses) falls through to the rules below rather than
|
|
60
|
+
producing a partial id.
|
|
61
|
+
|
|
62
|
+
**Raw ruleId is flat:** the parser inserts a capability-tier segment from its tool → tier map.
|
|
63
|
+
|
|
64
|
+
| Tool driver | Tier segment |
|
|
65
|
+
|---|---|
|
|
66
|
+
| semgrep | `sast` (rarely used — semgrep rules usually have dots) |
|
|
67
|
+
| gitleaks | `secrets` |
|
|
68
|
+
| trivy | `iac` for config findings; `cve` for CVE findings; `supply-chain` for vuln findings |
|
|
69
|
+
| hadolint | `dockerfile` |
|
|
70
|
+
| actionlint | `workflows` |
|
|
71
|
+
| ruff | `python` |
|
|
72
|
+
| oxlint | `js` (fallback only — a `plugin(rule)` id uses its plugin instead) |
|
|
73
|
+
| entropy-check | `secrets` (custom script — passphrase entropy + cross-env reuse) |
|
|
74
|
+
| model-hash-verify | `ml` (custom script — ML model integrity + provenance) |
|
|
75
|
+
|
|
76
|
+
`ruff` and `oxlint` were absent from this map until #1979, so every finding
|
|
77
|
+
from the two language linters was emitted under the `generic` fallback,
|
|
78
|
+
contradicting the ids their own entries in `tool-configs.md` advertise.
|
|
79
|
+
|
|
80
|
+
**Degenerate inputs still produce a valid id.** Two rules keep the output
|
|
81
|
+
inside the schema pattern no matter what a driver reports, because a rule id
|
|
82
|
+
that fails validation costs the whole finding — file, line, and message
|
|
83
|
+
included — even when those are perfectly usable:
|
|
84
|
+
|
|
85
|
+
- The **driver name is kebab-cased** into the first segment, so a tool
|
|
86
|
+
identifying itself as `Semgrep OSS` yields `semgrep-oss.…` rather than
|
|
87
|
+
embedding a space. A no-op for every tool wired up today.
|
|
88
|
+
- A **rule id that kebabs to nothing** (empty string, punctuation only, a
|
|
89
|
+
non-Latin script) becomes the literal segment `unknown` rather than an
|
|
90
|
+
empty trailing segment: `oxlint.js.unknown`, never `oxlint.js.`.
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
raw: aws-access-key out: gitleaks.secrets.aws-access-key
|
|
94
|
+
raw: DS002 out: trivy.iac.ds002
|
|
95
|
+
raw: CVE-2024-1234 out: trivy.cve.cve-2024-1234
|
|
96
|
+
raw: DL3008 out: hadolint.dockerfile.dl3008
|
|
97
|
+
raw: shellcheck out: actionlint.workflows.shellcheck
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Kebab-casing rule:** `[^a-z0-9]+` is replaced with a single hyphen, the string is lowercased, and leading/trailing hyphens are stripped.
|
|
101
|
+
|
|
102
|
+
## Error handling
|
|
103
|
+
|
|
104
|
+
- A SARIF document missing `runs` or `runs[*].tool.driver.name` is an adapter bug; the parser fails the run with a named-tool error.
|
|
105
|
+
- A `result` missing `ruleId` OR `locations` OR `message.text` is discarded with a one-line log entry (`DROPPED: <tool> result missing required SARIF field(s)`). The rest of the run continues.
|
|
106
|
+
- A mapped finding that fails unified-finding-v1 schema validation fails the whole run (not silently discarded) — adapter bug.
|
|
107
|
+
|
|
108
|
+
## Non-goals
|
|
109
|
+
|
|
110
|
+
- Does not convert SARIF fingerprint / taint-flow data into finding fields. Those remain in `metadata.source_ref` for tools that care.
|
|
111
|
+
- Does not enrich findings with exploitability, reachability, or CWE mappings beyond what SARIF carries. Those are downstream concerns (FP-reduction, compliance-mapping).
|
|
112
|
+
- Does not canonicalize file paths beyond stripping `file://` and applying `uriBaseId`. Path normalization (symlink resolution, case-folding) is the caller's responsibility.
|
|
113
|
+
|
|
114
|
+
## Tests
|
|
115
|
+
|
|
116
|
+
Fixtures under `evals/static-analysis-tools/tier1-mocks/<tool>/` contain a pair of files per tool:
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
<tool>/
|
|
120
|
+
mock.sarif # raw SARIF output from the tool (captured or synthesized)
|
|
121
|
+
expected-findings.json # array of unified findings the parser should emit
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
The validator script at `evals/static-analysis-tools/validate.py` iterates every fixture pair, parses `mock.sarif` through the shared parser, and asserts the output equals `expected-findings.json` and validates against the unified-finding-v1 schema.
|