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,88 @@
|
|
|
1
|
+
"""knowledge_index_paths — single source of truth for which path edits must
|
|
2
|
+
trigger an index rebuild/freshness check.
|
|
3
|
+
|
|
4
|
+
Python port of hooks/lib/knowledge-index-paths.sh (#575 / #572 Cluster A).
|
|
5
|
+
|
|
6
|
+
Imported (not executed) by the Python siblings of the three .sh callers:
|
|
7
|
+
- hooks/knowledge-index.py (PostToolUse regenerator)
|
|
8
|
+
- hooks/pre-commit-knowledge-index.py (pre-commit freshness gate)
|
|
9
|
+
- tests/agents/… anchor-citation gate (still bats today; the .py
|
|
10
|
+
port will import this module)
|
|
11
|
+
|
|
12
|
+
`is_corpus_path()` answers "does an edit here change indexed content and
|
|
13
|
+
need a rebuild" — that is a broader set than "is this file a top-level
|
|
14
|
+
index entry" (owned by build_knowledge_index.py's `discover_files()`, which
|
|
15
|
+
walks only the first two shapes below). Deliberately two different
|
|
16
|
+
questions, not two copies of one: a references/*.md file is never itself an
|
|
17
|
+
index entry, but editing it changes the *summary* of the SKILL.md section
|
|
18
|
+
that includes it, so it must trigger the same rebuild as editing that
|
|
19
|
+
SKILL.md directly.
|
|
20
|
+
|
|
21
|
+
Rebuild triggers:
|
|
22
|
+
- plugins/dev-team/knowledge/*.md (top-level .md only;
|
|
23
|
+
also an index entry)
|
|
24
|
+
- plugins/dev-team/skills/<name>/SKILL.md (also an index entry)
|
|
25
|
+
- plugins/dev-team/skills/<name>/references/*.md (NOT an index entry —
|
|
26
|
+
only feeds another
|
|
27
|
+
entry's summary, via
|
|
28
|
+
build_knowledge_index.py's
|
|
29
|
+
`<!-- include:
|
|
30
|
+
references/<name>.md
|
|
31
|
+
-->` marker
|
|
32
|
+
resolution, Step 1.1
|
|
33
|
+
of plans/
|
|
34
|
+
test-improve-context-loading-strategy.md)
|
|
35
|
+
|
|
36
|
+
Excluded:
|
|
37
|
+
- plugins/dev-team/knowledge/schemas/** (json schemas, not docs)
|
|
38
|
+
- everything else (agents/, commands/, docs/, README.md, …)
|
|
39
|
+
|
|
40
|
+
Anchor: top-level knowledge .md, <skills-dir>/<one segment>/SKILL.md, OR
|
|
41
|
+
<skills-dir>/<one segment>/references/<one segment>.md. A leading `(^|/)`
|
|
42
|
+
allows repo-relative or absolute paths.
|
|
43
|
+
|
|
44
|
+
Stdlib-only. See docs/python-hook-contract.md.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
from __future__ import annotations
|
|
48
|
+
|
|
49
|
+
import re
|
|
50
|
+
from collections.abc import Iterable
|
|
51
|
+
|
|
52
|
+
# Regex matching corpus paths (POSIX ERE from the .sh sibling, ported to
|
|
53
|
+
# Python re syntax). Anchor: end-of-string; a leading segment is optional so
|
|
54
|
+
# absolute and repo-relative inputs both match. Alternation covers the three
|
|
55
|
+
# corpus shapes: top-level knowledge markdown, per-skill SKILL.md, and
|
|
56
|
+
# per-skill references/*.md (spliced into a SKILL.md summary via include
|
|
57
|
+
# markers — see the module docstring above).
|
|
58
|
+
CORPUS_REGEX: str = (
|
|
59
|
+
r"(^|/)plugins/dev-team/"
|
|
60
|
+
r"(knowledge/[^/]+\.md|skills/[^/]+/SKILL\.md|skills/[^/]+/references/[^/]+\.md)$"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
_CORPUS_RE = re.compile(CORPUS_REGEX)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def is_corpus_path(path: str) -> bool:
|
|
67
|
+
"""Return True iff `path` is part of the indexed corpus.
|
|
68
|
+
|
|
69
|
+
Byte-parity with the .sh's `_is_corpus_path`. Windows backslash paths
|
|
70
|
+
do NOT match — the corpus is a forward-slash convention and Git Bash
|
|
71
|
+
surfaces forward slashes even on Windows.
|
|
72
|
+
"""
|
|
73
|
+
if not path:
|
|
74
|
+
return False
|
|
75
|
+
return _CORPUS_RE.search(path) is not None
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def filter_corpus_paths(paths: Iterable[str]) -> list[str]:
|
|
79
|
+
"""Return the input list filtered to corpus paths, preserving order.
|
|
80
|
+
|
|
81
|
+
Convenience for hook callers that receive a batch of changed files and
|
|
82
|
+
want only the ones the index cares about. Order-preserving because
|
|
83
|
+
downstream builds are order-sensitive (see build_knowledge_index.py).
|
|
84
|
+
"""
|
|
85
|
+
return [p for p in paths if is_corpus_path(p)]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
__all__ = ("CORPUS_REGEX", "filter_corpus_paths", "is_corpus_path")
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""Shared repowise `.mcp.json` detection + relocation (#1747).
|
|
2
|
+
|
|
3
|
+
`repowise init`/`repowise update` unconditionally writes a `mcpServers.
|
|
4
|
+
repowise` entry into the project-root `.mcp.json`, baking in the invoking
|
|
5
|
+
machine's absolute filesystem path (a known, currently-open upstream bug:
|
|
6
|
+
repowise-dev/repowise#1117). When `.mcp.json` is git-tracked — a team may
|
|
7
|
+
legitimately commit it to distribute other MCP servers (`codegraph`, an
|
|
8
|
+
internal org server) that don't bake in a local path — that entry breaks
|
|
9
|
+
for every other clone/teammate.
|
|
10
|
+
|
|
11
|
+
`detect()` is the single shared predicate both consumers of this module
|
|
12
|
+
need: `project-init/SKILL.md`'s `.mcp.json` standing check (which calls
|
|
13
|
+
`relocate()` via this module's CLI) and `hooks/mcp_json_repowise_nudge.py`
|
|
14
|
+
(the SessionStart hook that prompts an already-initialized project to
|
|
15
|
+
re-run `/project-init`). Implemented once here so the two can never drift
|
|
16
|
+
out of sync on what counts as "needs fixing."
|
|
17
|
+
|
|
18
|
+
`relocate()` registers at `local` scope BEFORE stripping the tracked entry
|
|
19
|
+
— never the reverse — so a failed `claude mcp add` (CLI missing, timeout,
|
|
20
|
+
non-zero exit) leaves `.mcp.json` untouched rather than deleting the only
|
|
21
|
+
registration that existed. Every other `mcpServers` entry is preserved
|
|
22
|
+
byte-for-byte; only the `repowise` key is ever touched.
|
|
23
|
+
|
|
24
|
+
Stdlib-only. Python 3.10+. See ADR 0014 / ADR 0015.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
import argparse
|
|
30
|
+
import json
|
|
31
|
+
import subprocess
|
|
32
|
+
import sys
|
|
33
|
+
from collections.abc import Callable
|
|
34
|
+
from pathlib import Path
|
|
35
|
+
|
|
36
|
+
_MCP_JSON_NAME = ".mcp.json"
|
|
37
|
+
_SERVER_NAME = "repowise"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _load_json(path: Path) -> dict:
|
|
41
|
+
if not path.is_file():
|
|
42
|
+
return {}
|
|
43
|
+
text = path.read_text(encoding="utf-8").strip()
|
|
44
|
+
if not text:
|
|
45
|
+
return {}
|
|
46
|
+
try:
|
|
47
|
+
data = json.loads(text)
|
|
48
|
+
except json.JSONDecodeError:
|
|
49
|
+
return {}
|
|
50
|
+
return data if isinstance(data, dict) else {}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _dump_json(path: Path, data: dict) -> None:
|
|
54
|
+
path.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def is_tracked(mcp_json_path: Path, cwd: Path) -> bool:
|
|
58
|
+
"""True iff `mcp_json_path` exists and `git ls-files --error-unmatch`
|
|
59
|
+
(run with `cwd`) confirms it's tracked. False on any git failure (not a
|
|
60
|
+
repo, git missing, timeout) — never raises."""
|
|
61
|
+
if not mcp_json_path.is_file():
|
|
62
|
+
return False
|
|
63
|
+
try:
|
|
64
|
+
completed = subprocess.run(
|
|
65
|
+
["git", "ls-files", "--error-unmatch", mcp_json_path.name],
|
|
66
|
+
cwd=str(cwd),
|
|
67
|
+
capture_output=True,
|
|
68
|
+
check=False,
|
|
69
|
+
text=True,
|
|
70
|
+
timeout=5,
|
|
71
|
+
)
|
|
72
|
+
except (OSError, subprocess.TimeoutExpired):
|
|
73
|
+
return False
|
|
74
|
+
return completed.returncode == 0
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def detect(cwd: Path) -> dict | None:
|
|
78
|
+
"""The shared predicate: the `repowise` `mcpServers` entry iff
|
|
79
|
+
`<cwd>/.mcp.json` exists, is git-tracked, AND carries a `repowise` key.
|
|
80
|
+
None on anything else, including any internal failure — this must
|
|
81
|
+
never raise, since both callers treat None as "nothing to do"."""
|
|
82
|
+
try:
|
|
83
|
+
mcp_json_path = Path(cwd) / _MCP_JSON_NAME
|
|
84
|
+
if not is_tracked(mcp_json_path, Path(cwd)):
|
|
85
|
+
return None
|
|
86
|
+
servers = _load_json(mcp_json_path).get("mcpServers")
|
|
87
|
+
if not isinstance(servers, dict):
|
|
88
|
+
return None
|
|
89
|
+
entry = servers.get(_SERVER_NAME)
|
|
90
|
+
return entry if isinstance(entry, dict) else None
|
|
91
|
+
except Exception: # noqa: BLE001 - fail-open: a detection bug must never propagate
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def strip_entry(mcp_json_path: Path) -> bool:
|
|
96
|
+
"""Remove only the `repowise` key from `mcp_json_path`'s `mcpServers`
|
|
97
|
+
object, preserving every other entry untouched. Drops the `mcpServers`
|
|
98
|
+
key entirely if removing `repowise` leaves it empty. Idempotent: a
|
|
99
|
+
no-op (returns False, no write) when there's nothing to strip."""
|
|
100
|
+
config = _load_json(mcp_json_path)
|
|
101
|
+
servers = config.get("mcpServers")
|
|
102
|
+
if not isinstance(servers, dict) or _SERVER_NAME not in servers:
|
|
103
|
+
return False
|
|
104
|
+
servers.pop(_SERVER_NAME)
|
|
105
|
+
if servers:
|
|
106
|
+
config["mcpServers"] = servers
|
|
107
|
+
else:
|
|
108
|
+
config.pop("mcpServers", None)
|
|
109
|
+
_dump_json(mcp_json_path, config)
|
|
110
|
+
return True
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _register_local_scope(repo_root: Path) -> bool:
|
|
114
|
+
"""`claude mcp add repowise --scope local -- repowise mcp <repo_root>
|
|
115
|
+
--transport stdio`. True on exit 0; False on any failure (`claude` CLI
|
|
116
|
+
missing, non-zero exit, timeout) — never raises. Deliberately re-derives
|
|
117
|
+
`args` from the CURRENT repo root rather than reusing the stripped
|
|
118
|
+
entry's own `args` — those carry the OLD, wrong machine's path, which is
|
|
119
|
+
exactly the bug being fixed."""
|
|
120
|
+
try:
|
|
121
|
+
completed = subprocess.run(
|
|
122
|
+
[
|
|
123
|
+
"claude", "mcp", "add", _SERVER_NAME, "--scope", "local",
|
|
124
|
+
"--", _SERVER_NAME, "mcp", str(repo_root), "--transport", "stdio",
|
|
125
|
+
],
|
|
126
|
+
cwd=str(repo_root),
|
|
127
|
+
capture_output=True,
|
|
128
|
+
check=False,
|
|
129
|
+
text=True,
|
|
130
|
+
timeout=30,
|
|
131
|
+
)
|
|
132
|
+
except (OSError, subprocess.TimeoutExpired):
|
|
133
|
+
return False
|
|
134
|
+
return completed.returncode == 0
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def relocate(
|
|
138
|
+
cwd: Path, *, register: Callable[[Path], bool] = _register_local_scope
|
|
139
|
+
) -> str:
|
|
140
|
+
"""Detect -> register at local scope -> strip from the tracked file, in
|
|
141
|
+
that order (never strip-then-register — see module docstring). Returns
|
|
142
|
+
one of:
|
|
143
|
+
"not-tracked" -- .mcp.json missing, or not git-tracked
|
|
144
|
+
"no-repowise-entry" -- tracked, but no repowise key to relocate
|
|
145
|
+
"relocated" -- registered locally and stripped
|
|
146
|
+
"relocate-failed" -- repowise entry found, but `claude mcp add`
|
|
147
|
+
failed; .mcp.json is left untouched
|
|
148
|
+
|
|
149
|
+
`register` is injectable (stdlib `Callable`, defaulting to the real
|
|
150
|
+
`claude mcp add` call) so callers/tests can verify both branches
|
|
151
|
+
without a real `claude` CLI or a live MCP registration. Never raises.
|
|
152
|
+
"""
|
|
153
|
+
cwd = Path(cwd)
|
|
154
|
+
entry = detect(cwd)
|
|
155
|
+
if entry is None:
|
|
156
|
+
return "no-repowise-entry" if is_tracked(cwd / _MCP_JSON_NAME, cwd) else "not-tracked"
|
|
157
|
+
|
|
158
|
+
if not register(cwd):
|
|
159
|
+
return "relocate-failed"
|
|
160
|
+
|
|
161
|
+
strip_entry(cwd / _MCP_JSON_NAME)
|
|
162
|
+
return "relocated"
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _main() -> int:
|
|
166
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
167
|
+
parser.add_argument("action", choices=["relocate"])
|
|
168
|
+
parser.add_argument("--cwd", default=".")
|
|
169
|
+
args = parser.parse_args()
|
|
170
|
+
|
|
171
|
+
if args.action == "relocate":
|
|
172
|
+
print(relocate(Path(args.cwd).resolve()))
|
|
173
|
+
return 0
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
if __name__ == "__main__":
|
|
177
|
+
sys.exit(_main())
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""metrics_query.py — typed/faceted query helper over metrics event streams (#1169).
|
|
3
|
+
|
|
4
|
+
`dev-team`'s `metrics/*.jsonl` streams (see `knowledge/telemetry-schema.md`)
|
|
5
|
+
are greppable but every consumer hand-rolls `jq`. This is a thin, generic
|
|
6
|
+
filter/facet reader over any single stream so `/session-review` and ad-hoc
|
|
7
|
+
use can slice without bespoke `jq` — no assumptions about which streams
|
|
8
|
+
exist, since sibling issues (#1166 `workflow-states.jsonl`, #1168
|
|
9
|
+
`iteration-journal.jsonl`) land in parallel and may or may not be present in
|
|
10
|
+
any given worktree/checkout.
|
|
11
|
+
|
|
12
|
+
Field-name heterogeneity (documented, not papered over)
|
|
13
|
+
--------------------------------------------------------
|
|
14
|
+
`telemetry-schema.md` shows every stream uses slightly different field
|
|
15
|
+
names for the same *concept*. This module does not assume one canonical
|
|
16
|
+
schema; each facet tries a short, documented list of candidate field names
|
|
17
|
+
in priority order and uses the first one present on a given entry:
|
|
18
|
+
|
|
19
|
+
* `--type` (event/category facet) tries, in order: `event` (e.g.
|
|
20
|
+
`telemetry.jsonl`'s `command`/`skill`/`gate`), `type` (e.g.
|
|
21
|
+
`config-changelog.jsonl`'s `amend`/`approval`/...), `hook` (e.g.
|
|
22
|
+
`boundary-events.jsonl`, `gate-bypass.jsonl`, `refactor-freeze.jsonl`),
|
|
23
|
+
`workflow` (e.g. `workflow-states.jsonl`'s `ship`/`autoship`/`build`).
|
|
24
|
+
This order runs from the most stream-specific "this IS an event type"
|
|
25
|
+
field name to the more generic ones, so a stream that happens to define
|
|
26
|
+
both `event` and `hook` (none currently do) still resolves
|
|
27
|
+
unambiguously.
|
|
28
|
+
* `--gate-outcome` tries, in order: `decision` (e.g.
|
|
29
|
+
`boundary-events.jsonl`'s `block`/`warn`/`bypass`/`intervention`/
|
|
30
|
+
`revert`), then `outcome` (e.g. `telemetry.jsonl`'s `fired`/`bypassed`,
|
|
31
|
+
`autoship-log.jsonl`'s `success`/`convergence_failure`). `decision`
|
|
32
|
+
first because it is the more specific/deliberate name for a gate's
|
|
33
|
+
verdict; `outcome` is the broader fallback used by streams with no
|
|
34
|
+
dedicated `decision` field.
|
|
35
|
+
* `--since` (inclusive lower bound) tries, in order: `ts`, then
|
|
36
|
+
`timestamp`. Comparison is a plain lexical string compare, valid only
|
|
37
|
+
because every emitter in this repo stamps `%Y-%m-%dT%H:%M:%SZ` UTC
|
|
38
|
+
(confirmed against `boundary_events.py` and `workflow_state.py`), which
|
|
39
|
+
sorts identically lexically and chronologically.
|
|
40
|
+
* `until` (inclusive upper bound, symmetric to `since`; #1461) tries the
|
|
41
|
+
same `ts`/`timestamp` fallback order and the same lexical comparison.
|
|
42
|
+
Python-API-only today (no `--until` CLI flag) — added for
|
|
43
|
+
`hooks/lib/review_gate_corroboration.py`'s recency-window read, which
|
|
44
|
+
needs both bounds to select entries strictly between a gate file's mtime
|
|
45
|
+
and that mtime minus a window.
|
|
46
|
+
* `--session` matches the `session_id` field only — every stream that
|
|
47
|
+
carries a session join key names it identically.
|
|
48
|
+
|
|
49
|
+
All provided filters compose with AND. Malformed JSON lines are skipped,
|
|
50
|
+
not fatal — these streams are hand-authored-adjacent, append-only logs and
|
|
51
|
+
a single corrupt line must never break a query over the rest of the file.
|
|
52
|
+
|
|
53
|
+
Stdlib only. See ADR 0014 / ADR 0015.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
from __future__ import annotations
|
|
57
|
+
|
|
58
|
+
import argparse
|
|
59
|
+
import json
|
|
60
|
+
import sys
|
|
61
|
+
from collections.abc import Iterable, Iterator
|
|
62
|
+
from pathlib import Path
|
|
63
|
+
|
|
64
|
+
_LIB_DIR = Path(__file__).resolve().parent
|
|
65
|
+
if str(_LIB_DIR) not in sys.path:
|
|
66
|
+
sys.path.insert(0, str(_LIB_DIR))
|
|
67
|
+
|
|
68
|
+
import artifact_paths
|
|
69
|
+
|
|
70
|
+
_TYPE_FIELDS = ("event", "type", "hook", "workflow")
|
|
71
|
+
_GATE_OUTCOME_FIELDS = ("decision", "outcome")
|
|
72
|
+
_TS_FIELDS = ("ts", "timestamp")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _first_present(entry: dict, candidates) -> str | None:
|
|
76
|
+
for field in candidates:
|
|
77
|
+
if field in entry and entry[field] is not None:
|
|
78
|
+
return entry[field]
|
|
79
|
+
return None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def load_stream(path) -> Iterator[dict]:
|
|
83
|
+
"""Yield parsed JSON objects from a JSONL file, skipping malformed lines.
|
|
84
|
+
|
|
85
|
+
Non-dict JSON values (e.g. a bare string or number on a line) are also
|
|
86
|
+
skipped, since every stream is a sequence of JSON objects.
|
|
87
|
+
"""
|
|
88
|
+
path = Path(path)
|
|
89
|
+
if not path.is_file():
|
|
90
|
+
return
|
|
91
|
+
for line in path.read_text(encoding="utf-8").splitlines():
|
|
92
|
+
line = line.strip()
|
|
93
|
+
if not line:
|
|
94
|
+
continue
|
|
95
|
+
try:
|
|
96
|
+
entry = json.loads(line)
|
|
97
|
+
except json.JSONDecodeError:
|
|
98
|
+
continue
|
|
99
|
+
if isinstance(entry, dict):
|
|
100
|
+
yield entry
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def filter_entries(
|
|
104
|
+
entries: Iterable[dict],
|
|
105
|
+
event_type: str | None = None,
|
|
106
|
+
session_id: str | None = None,
|
|
107
|
+
since: str | None = None,
|
|
108
|
+
until: str | None = None,
|
|
109
|
+
gate_outcome: str | None = None,
|
|
110
|
+
) -> Iterator[dict]:
|
|
111
|
+
"""Apply every provided filter (AND-composed) to `entries`, a pure filter.
|
|
112
|
+
|
|
113
|
+
Each filter is skipped entirely when its argument is `None`, so calling
|
|
114
|
+
with no filters is an identity pass-through — omitting `until` behaves
|
|
115
|
+
exactly as before its addition (#1461).
|
|
116
|
+
"""
|
|
117
|
+
for entry in entries:
|
|
118
|
+
if event_type is not None and _first_present(entry, _TYPE_FIELDS) != event_type:
|
|
119
|
+
continue
|
|
120
|
+
if session_id is not None and entry.get("session_id") != session_id:
|
|
121
|
+
continue
|
|
122
|
+
if since is not None:
|
|
123
|
+
ts = _first_present(entry, _TS_FIELDS)
|
|
124
|
+
if not isinstance(ts, str) or ts < since:
|
|
125
|
+
continue
|
|
126
|
+
if until is not None:
|
|
127
|
+
ts = _first_present(entry, _TS_FIELDS)
|
|
128
|
+
if not isinstance(ts, str) or ts > until:
|
|
129
|
+
continue
|
|
130
|
+
if gate_outcome is not None and _first_present(entry, _GATE_OUTCOME_FIELDS) != gate_outcome:
|
|
131
|
+
continue
|
|
132
|
+
yield entry
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def facet_count(entries: Iterable[dict], field: str) -> dict:
|
|
136
|
+
"""Value -> count breakdown of `field` across `entries`.
|
|
137
|
+
|
|
138
|
+
Entries missing `field` are omitted from the result entirely (not
|
|
139
|
+
counted under e.g. a `None` bucket) since an absent field is a schema
|
|
140
|
+
mismatch, not a meaningful facet value.
|
|
141
|
+
"""
|
|
142
|
+
counts: dict = {}
|
|
143
|
+
for entry in entries:
|
|
144
|
+
if field not in entry or entry[field] is None:
|
|
145
|
+
continue
|
|
146
|
+
value = entry[field]
|
|
147
|
+
key = value if isinstance(value, str) else json.dumps(value, sort_keys=True)
|
|
148
|
+
counts[key] = counts.get(key, 0) + 1
|
|
149
|
+
return counts
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _stream_path(cwd, stream: str) -> Path:
|
|
153
|
+
base = Path(cwd) if cwd else Path.cwd()
|
|
154
|
+
# Read-only query: migrate=False so a mere query never migrates a legacy
|
|
155
|
+
# file or creates .claude/metrics/ as a side effect.
|
|
156
|
+
return artifact_paths.resolve_file("metrics", f"{stream}.jsonl", base, migrate=False)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def cmd_query(args) -> int:
|
|
160
|
+
path = _stream_path(args.cwd, args.stream)
|
|
161
|
+
entries = list(
|
|
162
|
+
filter_entries(
|
|
163
|
+
load_stream(path),
|
|
164
|
+
event_type=args.type,
|
|
165
|
+
session_id=args.session,
|
|
166
|
+
since=args.since,
|
|
167
|
+
gate_outcome=args.gate_outcome,
|
|
168
|
+
)
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
if args.facet:
|
|
172
|
+
counts = facet_count(entries, args.facet)
|
|
173
|
+
for value, count in sorted(counts.items(), key=lambda kv: -kv[1]):
|
|
174
|
+
print(f"{value}\t{count}")
|
|
175
|
+
return 0
|
|
176
|
+
|
|
177
|
+
if args.format == "json-array":
|
|
178
|
+
print(json.dumps(entries, indent=2))
|
|
179
|
+
else:
|
|
180
|
+
for entry in entries:
|
|
181
|
+
print(json.dumps(entry, separators=(",", ":")))
|
|
182
|
+
return 0
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def main(argv=None) -> int:
|
|
186
|
+
ap = argparse.ArgumentParser(description=__doc__)
|
|
187
|
+
ap.add_argument("--cwd", default=None, help="Project directory (default: cwd)")
|
|
188
|
+
ap.add_argument("--stream", required=True, help="Stream name, resolves to .claude/metrics/<name>.jsonl")
|
|
189
|
+
ap.add_argument("--type", default=None, help="Event-type facet; see module docstring for field fallback order")
|
|
190
|
+
ap.add_argument("--session", default=None, help="Filter on the session_id field")
|
|
191
|
+
ap.add_argument("--since", default=None, help="ISO-8601 lower bound on the ts/timestamp field")
|
|
192
|
+
ap.add_argument("--gate-outcome", dest="gate_outcome", default=None, help="Gate decision/outcome facet")
|
|
193
|
+
ap.add_argument("--facet", default=None, help="Print value->count breakdown for this field instead of matches")
|
|
194
|
+
ap.add_argument("--format", choices=["jsonl", "json-array"], default="jsonl")
|
|
195
|
+
ap.set_defaults(func=cmd_query)
|
|
196
|
+
|
|
197
|
+
parsed = ap.parse_args(argv)
|
|
198
|
+
return parsed.func(parsed)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
if __name__ == "__main__": # pragma: no cover
|
|
202
|
+
sys.exit(main())
|