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,441 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Agent-readiness scanner — MVP (issue #117).
|
|
3
|
+
|
|
4
|
+
Scores a SINGLE LOCAL REPOSITORY against the Agent-Readiness Scorecard using
|
|
5
|
+
file-presence/heuristic analyzers only (no CI-platform APIs). Emits per-repo
|
|
6
|
+
JSON (with `evidence` strings and `manual_review_flags`) and a Markdown tier
|
|
7
|
+
summary. Weights and thresholds are externalized to scorecard.yaml.
|
|
8
|
+
|
|
9
|
+
Placement decision (recorded per the issue): shipped as an in-plugin skill
|
|
10
|
+
(`/agent-readiness`) that scores the current working repo locally. The org-scale
|
|
11
|
+
Azure DevOps / Jenkins scanner from the plan stays a deferred follow-up.
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
python3 scanner.py [REPO_PATH] [--config scorecard.yaml]
|
|
15
|
+
[--json out.json] [--markdown out.md]
|
|
16
|
+
Defaults: REPO_PATH=., config=<this dir>/scorecard.yaml, reports to stdout.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
import json
|
|
23
|
+
import sys
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
HERE = Path(__file__).resolve().parent
|
|
27
|
+
# skills/agent-readiness -> skills -> dev-team -> hooks/lib (stdlib-only YAML
|
|
28
|
+
# subset parser; see ADR 0014/0015 — no third-party imports in shipped code).
|
|
29
|
+
sys.path.insert(0, str(HERE.parents[1] / "hooks" / "lib"))
|
|
30
|
+
from minimal_yaml import parse_yaml
|
|
31
|
+
|
|
32
|
+
sys.path.insert(0, str(HERE))
|
|
33
|
+
from ai_friendly_analyzers import (
|
|
34
|
+
AI_FRIENDLY_ANALYZERS,
|
|
35
|
+
INSTRUCTION_FILES,
|
|
36
|
+
reset_walk_cache,
|
|
37
|
+
walk_files,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
# --------------------------------------------------------------------------
|
|
41
|
+
# Small filesystem helpers (all detection is file-presence/heuristic).
|
|
42
|
+
# --------------------------------------------------------------------------
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _exists(root: Path, *names: str) -> str | None:
|
|
46
|
+
for n in names:
|
|
47
|
+
if (root / n).exists():
|
|
48
|
+
return n
|
|
49
|
+
return None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _glob_any(root: Path, *patterns: str) -> str | None:
|
|
53
|
+
for p in patterns:
|
|
54
|
+
for hit in root.glob(p):
|
|
55
|
+
return str(hit.relative_to(root))
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _ci_files(root: Path) -> list[Path]:
|
|
60
|
+
out = []
|
|
61
|
+
for pat in (
|
|
62
|
+
".github/workflows/*.yml",
|
|
63
|
+
".github/workflows/*.yaml",
|
|
64
|
+
"Jenkinsfile",
|
|
65
|
+
".gitlab-ci.yml",
|
|
66
|
+
"azure-pipelines.yml",
|
|
67
|
+
".azure-pipelines.yml",
|
|
68
|
+
):
|
|
69
|
+
out.extend(root.glob(pat))
|
|
70
|
+
return [p for p in out if p.is_file()]
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _ci_mentions(root: Path, *needles: str) -> bool:
|
|
74
|
+
for f in _ci_files(root):
|
|
75
|
+
try:
|
|
76
|
+
text = f.read_text(errors="ignore").lower()
|
|
77
|
+
except OSError:
|
|
78
|
+
continue
|
|
79
|
+
if any(n in text for n in needles):
|
|
80
|
+
return True
|
|
81
|
+
return False
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _score(n: int, evidence: str) -> dict:
|
|
85
|
+
return {"score": n, "max": 2, "evidence": evidence}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# --------------------------------------------------------------------------
|
|
89
|
+
# Analyzers — each returns {score, max, evidence}. MVP: file-presence only.
|
|
90
|
+
# --------------------------------------------------------------------------
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def b2_reproducible_env(root: Path, cfg: dict) -> dict:
|
|
94
|
+
strong = _exists(
|
|
95
|
+
root,
|
|
96
|
+
".devcontainer/devcontainer.json",
|
|
97
|
+
"flake.nix",
|
|
98
|
+
"docker-compose.yml",
|
|
99
|
+
"docker-compose.yaml",
|
|
100
|
+
"compose.yaml",
|
|
101
|
+
)
|
|
102
|
+
if strong:
|
|
103
|
+
return _score(2, f"{strong} present (full reproducible environment)")
|
|
104
|
+
if _exists(root, "Dockerfile"):
|
|
105
|
+
return _score(1, "Dockerfile only (no devcontainer/compose/nix)")
|
|
106
|
+
return _score(0, "no Dockerfile/devcontainer/compose/nix")
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
LOCK_FILES = [
|
|
110
|
+
"package-lock.json",
|
|
111
|
+
"yarn.lock",
|
|
112
|
+
"pnpm-lock.yaml",
|
|
113
|
+
"poetry.lock",
|
|
114
|
+
"Pipfile.lock",
|
|
115
|
+
"go.sum",
|
|
116
|
+
"Cargo.lock",
|
|
117
|
+
"composer.lock",
|
|
118
|
+
"uv.lock",
|
|
119
|
+
"Gemfile.lock",
|
|
120
|
+
]
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def b3_dependency_management(root: Path, cfg: dict) -> dict:
|
|
124
|
+
found = [f for f in LOCK_FILES if (root / f).exists()]
|
|
125
|
+
if not found:
|
|
126
|
+
return _score(0, "no lock file found")
|
|
127
|
+
gi = root / ".gitignore"
|
|
128
|
+
ignored = gi.exists() and any(f in gi.read_text(errors="ignore") for f in found)
|
|
129
|
+
if ignored:
|
|
130
|
+
return _score(1, f"lock file(s) {found} present but matched in .gitignore")
|
|
131
|
+
return _score(2, f"lock file(s) committed: {', '.join(found)}")
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def c1_formatting(root: Path, cfg: dict) -> dict:
|
|
135
|
+
cfgfile = _glob_any(
|
|
136
|
+
root, ".prettierrc*", ".editorconfig", "rustfmt.toml"
|
|
137
|
+
) or _pyproject_has(root, "[tool.black]", "[tool.ruff.format]")
|
|
138
|
+
if not cfgfile:
|
|
139
|
+
return _score(0, "no formatter config")
|
|
140
|
+
if _ci_mentions(root, "prettier", "format", "fmt", "ruff format"):
|
|
141
|
+
return _score(2, f"formatter config ({cfgfile}) + CI format step")
|
|
142
|
+
return _score(1, f"formatter config ({cfgfile}) but no CI enforcement found")
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def c2_linting(root: Path, cfg: dict) -> dict:
|
|
146
|
+
cfgfile = _glob_any(
|
|
147
|
+
root,
|
|
148
|
+
".eslintrc*",
|
|
149
|
+
"eslint.config.*",
|
|
150
|
+
"ruff.toml",
|
|
151
|
+
".pylintrc",
|
|
152
|
+
"pylintrc",
|
|
153
|
+
".golangci.yml",
|
|
154
|
+
".golangci.yaml",
|
|
155
|
+
) or _pyproject_has(root, "[tool.ruff]", "[tool.pylint]")
|
|
156
|
+
if not cfgfile:
|
|
157
|
+
return _score(0, "no linter config")
|
|
158
|
+
if _ci_mentions(root, "lint", "eslint", "ruff check", "golangci"):
|
|
159
|
+
return _score(2, f"linter config ({cfgfile}) + CI lint step")
|
|
160
|
+
return _score(1, f"linter config ({cfgfile}) but no CI enforcement found")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def c4_module_size(root: Path, cfg: dict) -> dict:
|
|
164
|
+
exts = set(cfg.get("source_extensions", []))
|
|
165
|
+
excl = set(cfg.get("exclude_dirs", []))
|
|
166
|
+
counts = []
|
|
167
|
+
for f in walk_files(root, excl):
|
|
168
|
+
if f.suffix not in exts:
|
|
169
|
+
continue
|
|
170
|
+
try:
|
|
171
|
+
counts.append(sum(1 for _ in f.open(errors="ignore")))
|
|
172
|
+
except OSError:
|
|
173
|
+
continue
|
|
174
|
+
if not counts:
|
|
175
|
+
return _score(0, "no source files detected for size analysis")
|
|
176
|
+
counts.sort()
|
|
177
|
+
p90 = counts[min(len(counts) - 1, round(0.9 * (len(counts) - 1)))]
|
|
178
|
+
th = cfg["thresholds"]
|
|
179
|
+
if p90 <= th["file_size_p90_small"]:
|
|
180
|
+
return _score(
|
|
181
|
+
2, f"p90 source file = {p90} lines (<= {th['file_size_p90_small']})"
|
|
182
|
+
)
|
|
183
|
+
if p90 <= th["file_size_p90_large"]:
|
|
184
|
+
return _score(1, f"p90 source file = {p90} lines")
|
|
185
|
+
return _score(0, f"p90 source file = {p90} lines (> {th['file_size_p90_large']})")
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def d1_readme(root: Path, cfg: dict) -> dict:
|
|
189
|
+
readme = _exists(root, "README.md", "README.rst", "README")
|
|
190
|
+
if not readme:
|
|
191
|
+
return _score(0, "no README")
|
|
192
|
+
text = (root / readme).read_text(errors="ignore")
|
|
193
|
+
words = len(text.split())
|
|
194
|
+
low = text.lower()
|
|
195
|
+
has_sections = (
|
|
196
|
+
all(k in low for k in ("setup",))
|
|
197
|
+
and any(k in low for k in ("build", "install"))
|
|
198
|
+
and "test" in low
|
|
199
|
+
)
|
|
200
|
+
min_words = cfg["thresholds"]["readme_min_words"]
|
|
201
|
+
if words >= min_words and has_sections:
|
|
202
|
+
return _score(2, f"README {words} words with setup/build/test sections")
|
|
203
|
+
if words > 0:
|
|
204
|
+
return _score(
|
|
205
|
+
1, f"README present ({words} words) but thin or missing setup/build/test"
|
|
206
|
+
)
|
|
207
|
+
return _score(0, "README empty")
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def d2_ai_instructions(root: Path, cfg: dict) -> dict:
|
|
211
|
+
f = _exists(root, *INSTRUCTION_FILES)
|
|
212
|
+
if not f:
|
|
213
|
+
return _score(
|
|
214
|
+
0, "no AI-instructions file (CLAUDE.md/AGENTS.md/.cursorrules/...)"
|
|
215
|
+
)
|
|
216
|
+
words = len((root / f).read_text(errors="ignore").split())
|
|
217
|
+
if words >= cfg["thresholds"]["ai_instructions_min_words"]:
|
|
218
|
+
return _score(2, f"{f} present ({words} words, detailed)")
|
|
219
|
+
return _score(1, f"{f} present but brief ({words} words)")
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def d3_architecture_docs(root: Path, cfg: dict) -> dict:
|
|
223
|
+
f = _glob_any(
|
|
224
|
+
root,
|
|
225
|
+
"docs/adr/*",
|
|
226
|
+
"docs/architecture*",
|
|
227
|
+
"docs/design*",
|
|
228
|
+
"ARCHITECTURE.md",
|
|
229
|
+
"docs/decisions/*",
|
|
230
|
+
)
|
|
231
|
+
if f:
|
|
232
|
+
return _score(2, f"architecture docs present ({f})")
|
|
233
|
+
return _score(0, "no architecture docs (docs/adr, ARCHITECTURE.md, ...)")
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def v2_precommit_hooks(root: Path, cfg: dict) -> dict:
|
|
237
|
+
f = _exists(
|
|
238
|
+
root, ".pre-commit-config.yaml", ".husky", "lefthook.yml", "lefthook.yaml"
|
|
239
|
+
) or _glob_any(root, ".lintstagedrc*")
|
|
240
|
+
if not f:
|
|
241
|
+
return _score(0, "no pre-commit hook config")
|
|
242
|
+
if _ci_mentions(root, "pre-commit") or f == ".pre-commit-config.yaml":
|
|
243
|
+
return _score(2, f"pre-commit hooks configured ({f})")
|
|
244
|
+
return _score(1, f"partial hook config ({f})")
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def v3_commit_conventions(root: Path, cfg: dict) -> dict:
|
|
248
|
+
f = _glob_any(root, "commitlint.config.*", ".commitlintrc*")
|
|
249
|
+
if f:
|
|
250
|
+
enforced = _ci_mentions(root, "commitlint") or (root / ".husky").exists()
|
|
251
|
+
return _score(
|
|
252
|
+
2 if enforced else 1,
|
|
253
|
+
f"commit-convention tooling ({f})"
|
|
254
|
+
+ ("" if enforced else " but no CI/hook enforcement found"),
|
|
255
|
+
)
|
|
256
|
+
return _score(0, "no commit-convention tooling")
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def v4_dependency_scanning(root: Path, cfg: dict) -> dict:
|
|
260
|
+
found = [
|
|
261
|
+
n
|
|
262
|
+
for n in (
|
|
263
|
+
".github/dependabot.yml",
|
|
264
|
+
".github/dependabot.yaml",
|
|
265
|
+
".snyk",
|
|
266
|
+
"renovate.json",
|
|
267
|
+
".renovaterc",
|
|
268
|
+
".renovaterc.json",
|
|
269
|
+
)
|
|
270
|
+
if (root / n).exists()
|
|
271
|
+
]
|
|
272
|
+
if not found:
|
|
273
|
+
return _score(0, "no dependency-scanning config")
|
|
274
|
+
return _score(
|
|
275
|
+
2 if len(found) >= 1 else 1,
|
|
276
|
+
f"dependency scanning configured: {', '.join(found)}",
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def _pyproject_has(root: Path, *sections: str) -> str | None:
|
|
281
|
+
p = root / "pyproject.toml"
|
|
282
|
+
if not p.exists():
|
|
283
|
+
return None
|
|
284
|
+
text = p.read_text(errors="ignore")
|
|
285
|
+
if any(s in text for s in sections):
|
|
286
|
+
return "pyproject.toml"
|
|
287
|
+
return None
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
ANALYZERS = {
|
|
291
|
+
"B2_reproducible_env": b2_reproducible_env,
|
|
292
|
+
"B3_dependency_management": b3_dependency_management,
|
|
293
|
+
"C1_formatting": c1_formatting,
|
|
294
|
+
"C2_linting": c2_linting,
|
|
295
|
+
"C4_module_size": c4_module_size,
|
|
296
|
+
"D1_readme": d1_readme,
|
|
297
|
+
"D2_ai_instructions": d2_ai_instructions,
|
|
298
|
+
"D3_architecture_docs": d3_architecture_docs,
|
|
299
|
+
"V2_precommit_hooks": v2_precommit_hooks,
|
|
300
|
+
"V3_commit_conventions": v3_commit_conventions,
|
|
301
|
+
"V4_dependency_scanning": v4_dependency_scanning,
|
|
302
|
+
}
|
|
303
|
+
ANALYZERS.update(AI_FRIENDLY_ANALYZERS)
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
# --------------------------------------------------------------------------
|
|
307
|
+
# Scorer.
|
|
308
|
+
# --------------------------------------------------------------------------
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def scan(root: Path, cfg: dict) -> dict:
|
|
312
|
+
reset_walk_cache()
|
|
313
|
+
weights = cfg["weights"]
|
|
314
|
+
categories = {}
|
|
315
|
+
manual_flags = []
|
|
316
|
+
|
|
317
|
+
for cat, crits in cfg["criteria"].items():
|
|
318
|
+
scored, raw, mx = {}, 0, 0
|
|
319
|
+
for crit, meta in crits.items():
|
|
320
|
+
if meta.get("manual_review"):
|
|
321
|
+
manual_flags.append(
|
|
322
|
+
{"criterion": crit, "reason": "heuristic weak; needs human review"}
|
|
323
|
+
)
|
|
324
|
+
if not meta.get("mvp"):
|
|
325
|
+
continue
|
|
326
|
+
fn = ANALYZERS.get(crit)
|
|
327
|
+
if fn is None:
|
|
328
|
+
continue
|
|
329
|
+
res = fn(root, cfg)
|
|
330
|
+
scored[crit] = res
|
|
331
|
+
raw += res["score"]
|
|
332
|
+
mx += res["max"]
|
|
333
|
+
if mx == 0:
|
|
334
|
+
categories[cat] = {
|
|
335
|
+
"weight": weights.get(cat, 0),
|
|
336
|
+
"scored": False,
|
|
337
|
+
"reason": "no MVP criteria (deferred — needs CI API)",
|
|
338
|
+
"criteria": {},
|
|
339
|
+
}
|
|
340
|
+
else:
|
|
341
|
+
pct = round(raw / mx * 100, 1)
|
|
342
|
+
categories[cat] = {
|
|
343
|
+
"weight": weights.get(cat, 0),
|
|
344
|
+
"scored": True,
|
|
345
|
+
"score_pct": pct,
|
|
346
|
+
"criteria": scored,
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
# Renormalize weights across scored categories only.
|
|
350
|
+
scored_w = sum(c["weight"] for c in categories.values() if c["scored"])
|
|
351
|
+
overall = 0.0
|
|
352
|
+
for c in categories.values():
|
|
353
|
+
if c["scored"] and scored_w:
|
|
354
|
+
c["weighted_score"] = round(c["score_pct"] * (c["weight"] / scored_w), 2)
|
|
355
|
+
overall += c["weighted_score"]
|
|
356
|
+
overall = round(overall, 2)
|
|
357
|
+
|
|
358
|
+
t = cfg["tiers"]
|
|
359
|
+
tier = (
|
|
360
|
+
"Agent-Ready"
|
|
361
|
+
if overall >= t["agent_ready"]
|
|
362
|
+
else "Agent-Assisted"
|
|
363
|
+
if overall >= t["agent_assisted"]
|
|
364
|
+
else "Agent-Limited"
|
|
365
|
+
if overall >= t["agent_limited"]
|
|
366
|
+
else "Agent-Hostile"
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
return {
|
|
370
|
+
"repository": root.name,
|
|
371
|
+
"scanner_version": cfg.get("version", "unknown"),
|
|
372
|
+
"scope": "mvp-local-file-presence",
|
|
373
|
+
"overall_score": overall,
|
|
374
|
+
"overall_note": "renormalized over scored categories; deferred "
|
|
375
|
+
"categories excluded (need CI-platform APIs)",
|
|
376
|
+
"tier": tier,
|
|
377
|
+
"categories": categories,
|
|
378
|
+
"manual_review_flags": manual_flags,
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def to_markdown(result: dict) -> str:
|
|
383
|
+
lines = [f"# Agent-Readiness Report — {result['repository']}", ""]
|
|
384
|
+
lines.append(f"**Overall: {result['overall_score']} / 100 — {result['tier']}** ")
|
|
385
|
+
lines.append(f"_{result['overall_note']}_")
|
|
386
|
+
lines.append("")
|
|
387
|
+
lines.append("| Category | Scored | % | Weighted |")
|
|
388
|
+
lines.append("| --- | --- | --- | --- |")
|
|
389
|
+
for cat, c in result["categories"].items():
|
|
390
|
+
if c["scored"]:
|
|
391
|
+
lines.append(
|
|
392
|
+
f"| {cat} | yes | {c['score_pct']}% | {c.get('weighted_score', 0)} |"
|
|
393
|
+
)
|
|
394
|
+
else:
|
|
395
|
+
lines.append(f"| {cat} | deferred | — | — |")
|
|
396
|
+
lines.append("")
|
|
397
|
+
lines.append("## Criteria")
|
|
398
|
+
lines.append("| Criterion | Score | Evidence |")
|
|
399
|
+
lines.append("| --- | --- | --- |")
|
|
400
|
+
for cat, c in result["categories"].items():
|
|
401
|
+
for crit, r in c.get("criteria", {}).items():
|
|
402
|
+
lines.append(f"| {crit} | {r['score']}/{r['max']} | {r['evidence']} |")
|
|
403
|
+
if result["manual_review_flags"]:
|
|
404
|
+
lines.append("")
|
|
405
|
+
lines.append("## Manual review flags")
|
|
406
|
+
for f in result["manual_review_flags"]:
|
|
407
|
+
lines.append(f"- **{f['criterion']}**: {f['reason']}")
|
|
408
|
+
return "\n".join(lines) + "\n"
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
def main(argv: list[str]) -> int:
|
|
412
|
+
ap = argparse.ArgumentParser(description=__doc__)
|
|
413
|
+
ap.add_argument("repo", nargs="?", default=".")
|
|
414
|
+
ap.add_argument("--config", default=str(HERE / "scorecard.yaml"))
|
|
415
|
+
ap.add_argument("--json", help="write JSON result to this path")
|
|
416
|
+
ap.add_argument("--markdown", help="write Markdown summary to this path")
|
|
417
|
+
args = ap.parse_args(argv)
|
|
418
|
+
|
|
419
|
+
root = Path(args.repo).resolve()
|
|
420
|
+
if not root.is_dir():
|
|
421
|
+
print(f"error: not a directory: {root}", file=sys.stderr)
|
|
422
|
+
return 2
|
|
423
|
+
cfg = parse_yaml(Path(args.config).read_text())
|
|
424
|
+
|
|
425
|
+
result = scan(root, cfg)
|
|
426
|
+
md = to_markdown(result)
|
|
427
|
+
|
|
428
|
+
if args.json:
|
|
429
|
+
Path(args.json).write_text(json.dumps(result, indent=2) + "\n")
|
|
430
|
+
if args.markdown:
|
|
431
|
+
Path(args.markdown).write_text(md)
|
|
432
|
+
if not args.json and not args.markdown:
|
|
433
|
+
print(json.dumps(result, indent=2))
|
|
434
|
+
print("\n" + md)
|
|
435
|
+
else:
|
|
436
|
+
print(f"{result['tier']} — {result['overall_score']}/100")
|
|
437
|
+
return 0
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
if __name__ == "__main__":
|
|
441
|
+
raise SystemExit(main(sys.argv[1:]))
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Agent-Readiness Scorecard — scoring config (issue #117 MVP).
|
|
2
|
+
#
|
|
3
|
+
# Externalizes weights, tier thresholds, and per-criterion thresholds so they
|
|
4
|
+
# can be tuned without code changes. The MVP scores a SINGLE LOCAL REPO using
|
|
5
|
+
# file-presence/heuristic analyzers only (criteria with `mvp: true`). Criteria
|
|
6
|
+
# that need CI-platform APIs (coverage, flaky rate, durations, branch policy)
|
|
7
|
+
# are marked `mvp: false` and deferred to a later phase; categories with no MVP
|
|
8
|
+
# criterion are reported as "not scored" and excluded from the renormalized
|
|
9
|
+
# overall (see scanner.py).
|
|
10
|
+
#
|
|
11
|
+
# Rubric source: the Agent-Readiness Scorecard (preserved in issue #117).
|
|
12
|
+
version: "1.1-mvp"
|
|
13
|
+
|
|
14
|
+
# Category weights (sum to 1.0). Overall score renormalizes across categories
|
|
15
|
+
# that have at least one MVP criterion.
|
|
16
|
+
weights:
|
|
17
|
+
test_infrastructure: 0.25
|
|
18
|
+
build_env: 0.20
|
|
19
|
+
code_quality: 0.20
|
|
20
|
+
type_safety: 0.15
|
|
21
|
+
documentation: 0.10
|
|
22
|
+
vcs_safety: 0.10
|
|
23
|
+
|
|
24
|
+
tiers:
|
|
25
|
+
agent_ready: 75
|
|
26
|
+
agent_assisted: 50
|
|
27
|
+
agent_limited: 25
|
|
28
|
+
# below agent_limited => agent_hostile
|
|
29
|
+
|
|
30
|
+
# Which criteria the MVP scores, by category. mvp:false = deferred (needs CI API).
|
|
31
|
+
criteria:
|
|
32
|
+
test_infrastructure:
|
|
33
|
+
T1_coverage: { mvp: false }
|
|
34
|
+
T2_reliability: { mvp: false }
|
|
35
|
+
T3_speed: { mvp: false }
|
|
36
|
+
T4_single_command: { mvp: false }
|
|
37
|
+
T5_test_types: { mvp: false }
|
|
38
|
+
build_env:
|
|
39
|
+
B1_single_command_build: { mvp: false }
|
|
40
|
+
B2_reproducible_env: { mvp: true }
|
|
41
|
+
B3_dependency_management: { mvp: true }
|
|
42
|
+
B4_ci_pipeline: { mvp: false }
|
|
43
|
+
B5_composite_check_command: { mvp: true } # #2178
|
|
44
|
+
code_quality:
|
|
45
|
+
C1_formatting: { mvp: true }
|
|
46
|
+
C2_linting: { mvp: true }
|
|
47
|
+
C3_architecture: { mvp: false, manual_review: true }
|
|
48
|
+
C4_module_size: { mvp: true }
|
|
49
|
+
C5_naming: { mvp: false }
|
|
50
|
+
type_safety:
|
|
51
|
+
S1_type_system: { mvp: false }
|
|
52
|
+
S2_api_contracts: { mvp: false }
|
|
53
|
+
S3_interface_design: { mvp: false, manual_review: true }
|
|
54
|
+
S4_db_schema: { mvp: false }
|
|
55
|
+
documentation:
|
|
56
|
+
D1_readme: { mvp: true }
|
|
57
|
+
D2_ai_instructions: { mvp: true }
|
|
58
|
+
D3_architecture_docs: { mvp: true }
|
|
59
|
+
D4_domain_context: { mvp: false, manual_review: true }
|
|
60
|
+
# AI-friendly repo criteria (#2178) — rubric: knowledge/ai-friendly-repo-guidelines.md
|
|
61
|
+
D5_claude_md_size: { mvp: true }
|
|
62
|
+
D6_layered_context: { mvp: true }
|
|
63
|
+
D7_reference_implementation: { mvp: false, manual_review: true }
|
|
64
|
+
vcs_safety:
|
|
65
|
+
V1_branch_protection: { mvp: false }
|
|
66
|
+
V2_precommit_hooks: { mvp: true }
|
|
67
|
+
V3_commit_conventions: { mvp: true }
|
|
68
|
+
V4_dependency_scanning: { mvp: true }
|
|
69
|
+
|
|
70
|
+
# Target names B5 accepts as a composite check command (Makefile/justfile/
|
|
71
|
+
# package.json/pyproject).
|
|
72
|
+
check_target_names: [check, verify, ci, all]
|
|
73
|
+
|
|
74
|
+
thresholds:
|
|
75
|
+
file_size_p90_small: 300 # source-file p90 line count <= this -> score 2
|
|
76
|
+
file_size_p90_large: 500 # <= this -> score 1; above -> score 0
|
|
77
|
+
readme_min_words: 200 # README word count >= this (with setup/build/test) -> 2
|
|
78
|
+
ai_instructions_min_words: 100
|
|
79
|
+
claude_md_max_lines: 200 # instructions file <= this -> score 2 (D5)
|
|
80
|
+
claude_md_hard_max_lines: 300 # <= this -> score 1; above -> score 0 (D5)
|
|
81
|
+
|
|
82
|
+
# File extensions counted as "source" for C4 line-count distribution.
|
|
83
|
+
source_extensions: [".py", ".js", ".ts", ".jsx", ".tsx", ".go", ".rs", ".java",
|
|
84
|
+
".cs", ".rb", ".php", ".svelte", ".c", ".cpp", ".kt", ".scala"]
|
|
85
|
+
# Directory names excluded from C4 (generated/vendored).
|
|
86
|
+
exclude_dirs: [".git", "node_modules", "vendor", "dist", "build", "__pycache__",
|
|
87
|
+
".venv", "venv", "target", "out", ".next", "coverage",
|
|
88
|
+
".claude/worktrees", "graphify-out", ".cache", ".dev-team-reports"]
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-design
|
|
3
|
+
description: Contract-first API design for stable, evolvable interfaces. Use whenever defining a new API endpoint, inter-service boundary, or modifying an existing contract. Includes backward compatibility checklist and error contract specification.
|
|
4
|
+
role: worker
|
|
5
|
+
user-invocable: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# API Design
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
Contract-first API design patterns for defining stable, evolvable interfaces between system components. Protocol-agnostic — applies to REST, gRPC, GraphQL, message-based, or any other interface style.
|
|
13
|
+
|
|
14
|
+
## Constraints
|
|
15
|
+
- Define the contract before implementing it; implementation conforms to the contract
|
|
16
|
+
- Every endpoint must have an error contract; unspecified failure modes are not acceptable
|
|
17
|
+
- Never remove a field or endpoint without a deprecation period and migration path
|
|
18
|
+
- Do not expose internal domain models directly through API boundaries
|
|
19
|
+
|
|
20
|
+
## Core Concepts
|
|
21
|
+
|
|
22
|
+
### Contract-First Design
|
|
23
|
+
|
|
24
|
+
Define the interface before implementing it. The contract is the source of truth; implementation conforms to the contract, not the other way around. Contracts are versioned artifacts.
|
|
25
|
+
|
|
26
|
+
### Resource Modeling
|
|
27
|
+
|
|
28
|
+
- **Entities** — individual resources with identity (e.g., `/orders/{id}`)
|
|
29
|
+
- **Collections** — groups of entities with filtering, pagination, sorting
|
|
30
|
+
- **Relationships** — links between resources expressed through references or embedding
|
|
31
|
+
- **Operations** — actions on resources (CRUD and domain-specific operations)
|
|
32
|
+
|
|
33
|
+
### Versioning Strategies
|
|
34
|
+
|
|
35
|
+
| Strategy | Mechanism | Trade-offs |
|
|
36
|
+
| --- | --- | --- |
|
|
37
|
+
| URL path | `/v1/resources`, `/v2/resources` | Simple routing, but proliferates endpoints |
|
|
38
|
+
| Header | `Accept: application/vnd.api.v2+json` | Clean URLs, but harder to test and discover |
|
|
39
|
+
| Content negotiation | Media type with version parameter | Standards-compliant, but adds client complexity |
|
|
40
|
+
|
|
41
|
+
Choose one strategy per API boundary and apply it consistently. URL path versioning is the simplest default.
|
|
42
|
+
|
|
43
|
+
### Error Contracts
|
|
44
|
+
|
|
45
|
+
Every API defines structured error responses:
|
|
46
|
+
|
|
47
|
+
| Field | Purpose |
|
|
48
|
+
| --- | --- |
|
|
49
|
+
| Error code | Machine-readable identifier (stable across versions) |
|
|
50
|
+
| Message | Human-readable description |
|
|
51
|
+
| Correlation ID | Trace identifier linking request to logs |
|
|
52
|
+
| Details | Optional structured context (field-level validation errors, etc.) |
|
|
53
|
+
|
|
54
|
+
Error contracts are part of the API contract — not an afterthought.
|
|
55
|
+
|
|
56
|
+
## Patterns
|
|
57
|
+
|
|
58
|
+
### API Design Procedure
|
|
59
|
+
|
|
60
|
+
1. **Identify consumers** — who calls this API, what do they need, what are their constraints
|
|
61
|
+
2. **Define resources** — model the domain entities and relationships exposed through the interface
|
|
62
|
+
3. **Specify operations** — define actions on each resource with request/response shapes
|
|
63
|
+
4. **Define error cases** — enumerate failure modes with error codes and response structures
|
|
64
|
+
5. **Document constraints** — rate limits, pagination defaults, size limits, authentication requirements
|
|
65
|
+
6. **Choose version strategy** — select and document the versioning approach
|
|
66
|
+
|
|
67
|
+
### Backward Compatibility Checklist
|
|
68
|
+
|
|
69
|
+
| Change Type | Impact | Action |
|
|
70
|
+
| --- | --- | --- |
|
|
71
|
+
| Add optional field | Safe (additive) | No version bump needed |
|
|
72
|
+
| Add new endpoint | Safe (additive) | No version bump needed |
|
|
73
|
+
| Remove field | **Breaking** | Deprecate first, remove in next major version |
|
|
74
|
+
| Change field type | **Breaking** | New version required |
|
|
75
|
+
| Change endpoint URL | **Breaking** | Redirect old URL, new version |
|
|
76
|
+
| Tighten validation | **Breaking** | New version required |
|
|
77
|
+
| Loosen validation | Safe (relaxing) | No version bump, document change |
|
|
78
|
+
|
|
79
|
+
### Contract Validation
|
|
80
|
+
|
|
81
|
+
Before implementation begins, verify the API contract against:
|
|
82
|
+
|
|
83
|
+
- [ ] BDD scenarios cover all operations and error cases
|
|
84
|
+
- [ ] Acceptance criteria include non-functional requirements (latency, throughput)
|
|
85
|
+
- [ ] Consumer needs are met without exposing internal implementation details
|
|
86
|
+
- [ ] Error codes are unique and documented
|
|
87
|
+
- [ ] Versioning strategy is declared and consistent
|
|
88
|
+
|
|
89
|
+
## When to Apply
|
|
90
|
+
|
|
91
|
+
| Scenario | Apply? | Depth |
|
|
92
|
+
| --- | --- | --- |
|
|
93
|
+
| New external or public API | Yes | Full procedure |
|
|
94
|
+
| New inter-service boundary | Yes | Full procedure |
|
|
95
|
+
| Internal module boundary | Partially | Resource modeling and error contracts |
|
|
96
|
+
| Private helper functions | No | — |
|
|
97
|
+
| Modifying existing API contract | Yes | Backward compatibility checklist |
|
|
98
|
+
|
|
99
|
+
## Guidelines
|
|
100
|
+
|
|
101
|
+
1. **Design for consumers, not implementations.** The API shape reflects what callers need, not how the backend is structured.
|
|
102
|
+
2. **Every endpoint has an error contract.** Callers must know what failures look like before they write integration code.
|
|
103
|
+
3. **Deprecation before removal.** Never remove a field or endpoint without a deprecation period and migration path.
|
|
104
|
+
4. **Contracts are versioned artifacts.** Treat API contracts with the same rigor as source code — reviewed, versioned, and tested.
|
|
105
|
+
5. **Avoid leaking internal models.** Domain entities exposed through an API may need a separate representation (DTO/view model) to prevent tight coupling.
|
|
106
|
+
6. **Pagination is not optional for collections.** Unbounded collection responses are a reliability risk.
|
|
107
|
+
|
|
108
|
+
## Output
|
|
109
|
+
API contract document covering resources, operations, error cases, versioning strategy, and the backward compatibility checklist results. Be concise — use tables; skip narrative prose.
|
|
110
|
+
|
|
111
|
+
## Integration
|
|
112
|
+
|
|
113
|
+
- **Agent-Assisted Specification** — API contracts emerge during the Architecture Specification stage; validate them as part of the consistency gate
|
|
114
|
+
- **Hexagonal Architecture** — API contracts define the ports; adapters implement the protocol-specific translation
|
|
115
|
+
- **Domain-Driven Design** — API boundaries often align with bounded context interfaces; use context maps to identify integration points
|