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,149 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Report or enable marketplace auto-update for the dev-team plugin.
|
|
3
|
+
|
|
4
|
+
Single source of truth for the ``extraKnownMarketplaces.<market>.autoUpdate``
|
|
5
|
+
flag — the same flag the ``/plugin`` UI toggles (there is no dedicated
|
|
6
|
+
``claude plugin`` CLI subcommand for it). With it on, the CLI re-pulls the
|
|
7
|
+
marketplace catalog and upgrades the plugin at launch, which is what keeps a
|
|
8
|
+
Claude Code web session current despite its reused filesystem snapshot pinning
|
|
9
|
+
the first-installed version.
|
|
10
|
+
|
|
11
|
+
Two callers share this one implementation, so the flag logic lives in exactly
|
|
12
|
+
one place:
|
|
13
|
+
|
|
14
|
+
* the ``/upgrade`` skill (``SKILL.md`` step 2) — runs ``--check`` to report
|
|
15
|
+
status, asks the user for consent, then runs ``--enable`` only on "yes";
|
|
16
|
+
* the cloud bootstrap (``.claude/cloud-setup.sh`` and
|
|
17
|
+
``.claude/install-dev-team.sh``) — runs ``--enable`` directly, no consent,
|
|
18
|
+
because pasting the Setup script / setting ``DEV_TEAM_CLOUD_INSTALL=1`` is
|
|
19
|
+
itself the opt-in for an ephemeral cloud VM.
|
|
20
|
+
|
|
21
|
+
Modes:
|
|
22
|
+
--check Print ``enabled`` / ``disabled`` / ``unknown`` and exit (read-only).
|
|
23
|
+
--enable Set the flag to true, idempotently (the default if no mode given).
|
|
24
|
+
|
|
25
|
+
Idempotent and fail-open: ``--enable`` never exits non-zero, so it can never
|
|
26
|
+
break a Setup script or block session start. Honors ``CLAUDE_CONFIG_DIR``.
|
|
27
|
+
Stdlib only, (ADR 0014 / 0015).
|
|
28
|
+
"""
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
import argparse
|
|
32
|
+
import json
|
|
33
|
+
import os
|
|
34
|
+
import sys
|
|
35
|
+
|
|
36
|
+
PLUGIN = "dev-team"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def config_dir() -> str:
|
|
40
|
+
"""The Claude Code config dir — ``CLAUDE_CONFIG_DIR`` if set, else ~/.claude."""
|
|
41
|
+
return os.environ.get("CLAUDE_CONFIG_DIR") or os.path.join(
|
|
42
|
+
os.path.expanduser("~"), ".claude"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def load(path: str):
|
|
47
|
+
"""Parse a JSON file, or return None if it is missing or malformed."""
|
|
48
|
+
try:
|
|
49
|
+
with open(path) as f:
|
|
50
|
+
return json.load(f)
|
|
51
|
+
except (FileNotFoundError, json.JSONDecodeError):
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def resolve_market(cfg: str) -> str | None:
|
|
56
|
+
"""The marketplace id the plugin is installed from (the ``@<market>`` half
|
|
57
|
+
of its ``installed_plugins.json`` key), or None if it is not installed."""
|
|
58
|
+
installed = (
|
|
59
|
+
load(os.path.join(cfg, "plugins", "installed_plugins.json")) or {}
|
|
60
|
+
).get("plugins", {})
|
|
61
|
+
return next(
|
|
62
|
+
(
|
|
63
|
+
pid.split("@", 1)[1]
|
|
64
|
+
for pid in installed
|
|
65
|
+
if pid.split("@", 1)[0] == PLUGIN and "@" in pid
|
|
66
|
+
),
|
|
67
|
+
None,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def settings_candidates(cfg: str) -> list[str]:
|
|
72
|
+
"""Settings files to consult, project-scoped first (mirrors the CLI/UI
|
|
73
|
+
precedence), falling back to the config-dir user settings."""
|
|
74
|
+
cwd = os.getcwd()
|
|
75
|
+
return [
|
|
76
|
+
os.path.join(cwd, ".claude", "settings.json"),
|
|
77
|
+
os.path.join(cwd, ".claude", "settings.local.json"),
|
|
78
|
+
os.path.join(cfg, "settings.json"),
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def check(cfg: str) -> str:
|
|
83
|
+
"""Return ``enabled`` / ``disabled`` / ``unknown`` for the auto-update flag."""
|
|
84
|
+
market = resolve_market(cfg)
|
|
85
|
+
if not market:
|
|
86
|
+
return "unknown"
|
|
87
|
+
for path in settings_candidates(cfg):
|
|
88
|
+
data = load(path)
|
|
89
|
+
if data and market in (data.get("extraKnownMarketplaces") or {}):
|
|
90
|
+
return "enabled" if data["extraKnownMarketplaces"][market].get(
|
|
91
|
+
"autoUpdate"
|
|
92
|
+
) is True else "disabled"
|
|
93
|
+
return "disabled"
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _target(cfg: str, market: str) -> tuple[str, dict]:
|
|
97
|
+
"""Pick the settings file to write, seeding a fresh config-dir entry from the
|
|
98
|
+
marketplace registry when no existing file already declares the market."""
|
|
99
|
+
for path in settings_candidates(cfg):
|
|
100
|
+
data = load(path)
|
|
101
|
+
if data and market in (data.get("extraKnownMarketplaces") or {}):
|
|
102
|
+
return path, data
|
|
103
|
+
path = os.path.join(cfg, "settings.json")
|
|
104
|
+
data = load(path) or {}
|
|
105
|
+
reg = load(os.path.join(cfg, "plugins", "known_marketplaces.json")) or {}
|
|
106
|
+
entry = reg.get(market)
|
|
107
|
+
ekm = data.setdefault("extraKnownMarketplaces", {})
|
|
108
|
+
ekm[market] = {"source": entry["source"]} if entry else {}
|
|
109
|
+
return path, data
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def enable(cfg: str) -> str:
|
|
113
|
+
"""Set the flag to true idempotently. Returns a one-line status message."""
|
|
114
|
+
market = resolve_market(cfg)
|
|
115
|
+
if not market:
|
|
116
|
+
return f"'{PLUGIN}' not installed under {cfg}; nothing to do"
|
|
117
|
+
path, data = _target(cfg, market)
|
|
118
|
+
mk = data.setdefault("extraKnownMarketplaces", {}).setdefault(market, {})
|
|
119
|
+
if mk.get("autoUpdate") is True:
|
|
120
|
+
return f"already enabled for '{market}' ({path})"
|
|
121
|
+
mk["autoUpdate"] = True
|
|
122
|
+
tmp = path + ".tmp"
|
|
123
|
+
with open(tmp, "w") as f:
|
|
124
|
+
json.dump(data, f, indent=2)
|
|
125
|
+
f.write("\n")
|
|
126
|
+
os.replace(tmp, path)
|
|
127
|
+
return f"enabled for '{market}' in {path}"
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def main(argv: list[str] | None = None) -> int:
|
|
131
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
132
|
+
group = parser.add_mutually_exclusive_group()
|
|
133
|
+
group.add_argument("--check", action="store_true", help="Report status only.")
|
|
134
|
+
group.add_argument("--enable", action="store_true", help="Enable (default).")
|
|
135
|
+
args = parser.parse_args(argv)
|
|
136
|
+
cfg = config_dir()
|
|
137
|
+
if args.check:
|
|
138
|
+
print(check(cfg))
|
|
139
|
+
return 0
|
|
140
|
+
# Default action is --enable; fail-open so a bootstrap never breaks.
|
|
141
|
+
try:
|
|
142
|
+
print(enable(cfg))
|
|
143
|
+
except Exception as exc: # noqa: BLE001 - never fail the calling setup/hook
|
|
144
|
+
print(f"non-fatal error: {exc}")
|
|
145
|
+
return 0
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
if __name__ == "__main__":
|
|
149
|
+
sys.exit(main())
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: version
|
|
3
|
+
description: >-
|
|
4
|
+
Report the installed version of the pi-dev-team package and the upstream
|
|
5
|
+
dev-team release it was synced from.
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Bash
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Version
|
|
11
|
+
|
|
12
|
+
Role: worker. Purely mechanical lookup.
|
|
13
|
+
|
|
14
|
+
You have been invoked with the `/version` command. Arguments: none.
|
|
15
|
+
|
|
16
|
+
Run and report the single output line verbatim:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
node -e 'const p=require(process.env.CLAUDE_PLUGIN_ROOT+"/package.json");const u=require(process.env.CLAUDE_PLUGIN_ROOT+"/UPSTREAM.json");console.log(`${p.name} v${p.version} (upstream dev-team v${u.version} @ ${String(u.commit).slice(0,10)})`)'
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
If `CLAUDE_PLUGIN_ROOT` is unset, report exactly:
|
|
23
|
+
`pi-dev-team extension is not loaded in this session.`
|
|
24
|
+
|
|
25
|
+
Do not add commentary beyond the single result line.
|
|
Binary file
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Sync upstream bdfinst/agentic-dev-team `plugins/dev-team` into this pi package.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
python3 sync/sync_upstream.py --upstream /path/to/agentic-dev-team [--check]
|
|
6
|
+
|
|
7
|
+
What it does (idempotent, stdlib only):
|
|
8
|
+
1. Replaces the managed directories (agents, skills, hooks, scripts, knowledge,
|
|
9
|
+
templates, tools, docs/upstream) with fresh copies from upstream.
|
|
10
|
+
2. Drops skills that only make sense inside Claude Code (DROPPED_SKILLS).
|
|
11
|
+
3. Copies pi-specific replacements from overrides/ over the result.
|
|
12
|
+
4. Normalises SKILL.md frontmatter for pi (description <= 1024 chars).
|
|
13
|
+
5. Applies the small, explicit text patch set (PATCHES). Every patch must
|
|
14
|
+
match at least once, so upstream drift is caught instead of silently
|
|
15
|
+
skipped.
|
|
16
|
+
6. Writes UPSTREAM.json (commit, version, what was dropped/overridden/patched).
|
|
17
|
+
|
|
18
|
+
Everything not listed here (extensions/, bin/, sync/, overrides/, test/,
|
|
19
|
+
PORTING.md, README.md, package.json) is owned by the port and never touched.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import argparse
|
|
25
|
+
import json
|
|
26
|
+
import re
|
|
27
|
+
import shutil
|
|
28
|
+
import subprocess
|
|
29
|
+
import sys
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
|
|
32
|
+
PKG = Path(__file__).resolve().parent.parent
|
|
33
|
+
PLUGIN_SUBDIR = Path("plugins/dev-team")
|
|
34
|
+
|
|
35
|
+
MANAGED_DIRS = ["agents", "skills", "hooks", "scripts", "knowledge", "templates", "tools"]
|
|
36
|
+
UPSTREAM_DOCS_DEST = Path("docs/upstream")
|
|
37
|
+
|
|
38
|
+
# Skills that test, audit or drive Claude Code itself. See PORTING.md section 4.
|
|
39
|
+
DROPPED_SKILLS = [
|
|
40
|
+
"agent-audit",
|
|
41
|
+
"agent-eval",
|
|
42
|
+
"claude-setup-review",
|
|
43
|
+
"harness-e2e-check",
|
|
44
|
+
"long-eval",
|
|
45
|
+
"orchestration-benchmark",
|
|
46
|
+
"session-review",
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
IGNORE = shutil.ignore_patterns("__pycache__", "*.pyc", ".pytest_cache", ".mypy_cache", ".ruff_cache")
|
|
50
|
+
|
|
51
|
+
DESCRIPTION_LIMIT = 1024
|
|
52
|
+
|
|
53
|
+
# (glob relative to package root, regex, replacement, description)
|
|
54
|
+
PATCHES: list[tuple[str, str, str, str]] = [
|
|
55
|
+
(
|
|
56
|
+
"skills/plan/SKILL.md",
|
|
57
|
+
r"or stdin is not a usable TTY \(`test -t 0` is false — the headless/CI/automation case\)",
|
|
58
|
+
"or `DEV_TEAM_INTERACTIVE` is not `1` (pi sets it only when a human UI is attached; "
|
|
59
|
+
"a tool shell never has a TTY, so `test -t 0` must not be used — the headless/CI/automation case)",
|
|
60
|
+
"interactivity: tool shells have no TTY in pi",
|
|
61
|
+
),
|
|
62
|
+
(
|
|
63
|
+
"skills/build/SKILL.md",
|
|
64
|
+
r"or stdin is not a usable TTY \(`test -t 0` is false — the headless/CI/automation case\)",
|
|
65
|
+
"or `DEV_TEAM_INTERACTIVE` is not `1` (pi sets it only when a human UI is attached; "
|
|
66
|
+
"a tool shell never has a TTY, so `test -t 0` must not be used — the headless/CI/automation case)",
|
|
67
|
+
"interactivity: tool shells have no TTY in pi",
|
|
68
|
+
),
|
|
69
|
+
(
|
|
70
|
+
"skills/review-agent/SKILL.md",
|
|
71
|
+
r"Read `\.claude/agents/<name>\.md`\. If the file doesn't exist, list available\s+review agents from `\.claude/agents/`",
|
|
72
|
+
"Read `.claude/agents/<name>.md` (project override) or else `${CLAUDE_PLUGIN_ROOT}/agents/<name>.md`. "
|
|
73
|
+
"If neither exists, list available\nreview agents from `${CLAUDE_PLUGIN_ROOT}/agents/`",
|
|
74
|
+
"agent definitions live in the package, not the project",
|
|
75
|
+
),
|
|
76
|
+
(
|
|
77
|
+
"skills/help/SKILL.md",
|
|
78
|
+
r"1\. Use Glob to find every `skills/\*/SKILL\.md` file\.",
|
|
79
|
+
"1. Use `find` to list every `${CLAUDE_PLUGIN_ROOT}/skills/*/SKILL.md` file, plus project skills in "
|
|
80
|
+
"`.pi/skills/*/SKILL.md` and `.claude/skills/*/SKILL.md`.",
|
|
81
|
+
"skills live in the package root",
|
|
82
|
+
),
|
|
83
|
+
(
|
|
84
|
+
"skills/triage/SKILL.md",
|
|
85
|
+
r'Use the Agent tool with `subagent_type: "Explore"`',
|
|
86
|
+
'Use the `dev_team_subagent` tool with `agent: "Explore"`',
|
|
87
|
+
"Claude's built-in Explore agent is provided by the port",
|
|
88
|
+
),
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def run(cmd: list[str], cwd: Path) -> str:
|
|
93
|
+
try:
|
|
94
|
+
return subprocess.run(cmd, cwd=cwd, capture_output=True, text=True, check=False).stdout.strip()
|
|
95
|
+
except OSError:
|
|
96
|
+
return ""
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def split_frontmatter(text: str) -> tuple[list[str], str] | None:
|
|
100
|
+
if not text.startswith("---"):
|
|
101
|
+
return None
|
|
102
|
+
lines = text.split("\n")
|
|
103
|
+
for i in range(1, len(lines)):
|
|
104
|
+
if lines[i].strip() == "---":
|
|
105
|
+
return lines[1:i], "\n".join(lines[i + 1 :])
|
|
106
|
+
return None
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def fm_blocks(fm_lines: list[str]) -> list[tuple[str | None, list[str]]]:
|
|
110
|
+
"""Group frontmatter into top-level key blocks (key line + indented continuation)."""
|
|
111
|
+
blocks: list[tuple[str | None, list[str]]] = []
|
|
112
|
+
for line in fm_lines:
|
|
113
|
+
m = re.match(r"^([A-Za-z0-9_-]+):", line)
|
|
114
|
+
if m and not line.startswith((" ", "\t")):
|
|
115
|
+
blocks.append((m.group(1), [line]))
|
|
116
|
+
elif blocks:
|
|
117
|
+
blocks[-1][1].append(line)
|
|
118
|
+
else:
|
|
119
|
+
blocks.append((None, [line]))
|
|
120
|
+
return blocks
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def block_value(lines: list[str]) -> str:
|
|
124
|
+
first = lines[0].split(":", 1)[1].strip()
|
|
125
|
+
rest = [l.strip() for l in lines[1:]]
|
|
126
|
+
if first in (">", "|", ">-", "|-", ""):
|
|
127
|
+
return " ".join(r for r in rest if r)
|
|
128
|
+
val = " ".join([first] + [r for r in rest if r])
|
|
129
|
+
if len(val) >= 2 and val[0] == val[-1] and val[0] in "\"'":
|
|
130
|
+
val = val[1:-1]
|
|
131
|
+
return val
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def trim_description(desc: str) -> str:
|
|
135
|
+
if len(desc) <= DESCRIPTION_LIMIT:
|
|
136
|
+
return desc
|
|
137
|
+
cut = desc[: DESCRIPTION_LIMIT - 1]
|
|
138
|
+
# prefer ending at a sentence boundary
|
|
139
|
+
dot = cut.rfind(". ")
|
|
140
|
+
if dot > DESCRIPTION_LIMIT * 0.6:
|
|
141
|
+
cut = cut[: dot + 1]
|
|
142
|
+
return cut.rstrip() + ("" if cut.endswith(".") else "…")
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def normalise_skill(path: Path) -> bool:
|
|
146
|
+
text = path.read_text(encoding="utf-8")
|
|
147
|
+
parts = split_frontmatter(text)
|
|
148
|
+
if not parts:
|
|
149
|
+
return False
|
|
150
|
+
fm_lines, body = parts
|
|
151
|
+
changed = False
|
|
152
|
+
out: list[str] = []
|
|
153
|
+
for key, lines in fm_blocks(fm_lines):
|
|
154
|
+
if key == "description":
|
|
155
|
+
desc = block_value(lines)
|
|
156
|
+
trimmed = trim_description(desc)
|
|
157
|
+
if trimmed != desc:
|
|
158
|
+
out.append("description: " + json.dumps(trimmed, ensure_ascii=False))
|
|
159
|
+
changed = True
|
|
160
|
+
continue
|
|
161
|
+
out.extend(lines)
|
|
162
|
+
if changed:
|
|
163
|
+
path.write_text("---\n" + "\n".join(out) + "\n---\n" + body, encoding="utf-8")
|
|
164
|
+
return changed
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
NOTE_MARKER = "<!-- pi-port-notes -->"
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def insert_note(skill_md: Path, note: str) -> None:
|
|
171
|
+
"""Insert a pi port note block after the first H1 (or after frontmatter)."""
|
|
172
|
+
text = skill_md.read_text(encoding="utf-8")
|
|
173
|
+
if NOTE_MARKER in text:
|
|
174
|
+
return
|
|
175
|
+
block = f"\n{NOTE_MARKER}\n{note.strip()}\n{NOTE_MARKER}\n"
|
|
176
|
+
m = re.search(r"^# .*$", text, flags=re.M)
|
|
177
|
+
if m:
|
|
178
|
+
text = text[: m.end()] + "\n" + block + text[m.end() :]
|
|
179
|
+
else:
|
|
180
|
+
parts = split_frontmatter(text)
|
|
181
|
+
text = text + block if not parts else text.replace("\n---\n", "\n---\n" + block, 1)
|
|
182
|
+
skill_md.write_text(text, encoding="utf-8")
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def copy_tree(src: Path, dst: Path) -> None:
|
|
186
|
+
if dst.exists():
|
|
187
|
+
shutil.rmtree(dst)
|
|
188
|
+
shutil.copytree(src, dst, ignore=IGNORE, symlinks=True)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def main() -> int:
|
|
192
|
+
ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
193
|
+
ap.add_argument("--upstream", required=True, help="checkout of bdfinst/agentic-dev-team")
|
|
194
|
+
args = ap.parse_args()
|
|
195
|
+
|
|
196
|
+
upstream = Path(args.upstream).resolve()
|
|
197
|
+
plugin = upstream / PLUGIN_SUBDIR
|
|
198
|
+
if not (plugin / "agents").is_dir():
|
|
199
|
+
print(f"error: {plugin} does not look like plugins/dev-team", file=sys.stderr)
|
|
200
|
+
return 2
|
|
201
|
+
|
|
202
|
+
for name in MANAGED_DIRS:
|
|
203
|
+
src = plugin / name
|
|
204
|
+
if src.is_dir():
|
|
205
|
+
copy_tree(src, PKG / name)
|
|
206
|
+
if (plugin / "docs").is_dir():
|
|
207
|
+
copy_tree(plugin / "docs", PKG / UPSTREAM_DOCS_DEST)
|
|
208
|
+
for fname, dest in (("CHANGELOG.md", "docs/upstream/CHANGELOG.md"), ("README.md", "docs/upstream/README.md")):
|
|
209
|
+
if (plugin / fname).is_file():
|
|
210
|
+
shutil.copy2(plugin / fname, PKG / dest)
|
|
211
|
+
|
|
212
|
+
# hooks/lib/plugin_version.py reads <root>/.claude-plugin/plugin.json for the version stamped on metrics rows.
|
|
213
|
+
if (plugin / ".claude-plugin" / "plugin.json").is_file():
|
|
214
|
+
(PKG / ".claude-plugin").mkdir(exist_ok=True)
|
|
215
|
+
shutil.copy2(plugin / ".claude-plugin" / "plugin.json", PKG / ".claude-plugin" / "plugin.json")
|
|
216
|
+
|
|
217
|
+
dropped = []
|
|
218
|
+
for skill in DROPPED_SKILLS:
|
|
219
|
+
target = PKG / "skills" / skill
|
|
220
|
+
if target.exists():
|
|
221
|
+
shutil.rmtree(target)
|
|
222
|
+
dropped.append(skill)
|
|
223
|
+
|
|
224
|
+
overridden: list[str] = []
|
|
225
|
+
overrides = PKG / "overrides"
|
|
226
|
+
if overrides.is_dir():
|
|
227
|
+
for src in sorted(overrides.rglob("*")):
|
|
228
|
+
if src.is_file() and "__pycache__" not in src.parts and src.relative_to(overrides).parts[0] != "notes":
|
|
229
|
+
rel = src.relative_to(overrides)
|
|
230
|
+
dst = PKG / rel
|
|
231
|
+
dst.parent.mkdir(parents=True, exist_ok=True)
|
|
232
|
+
shutil.copy2(src, dst)
|
|
233
|
+
overridden.append(str(rel))
|
|
234
|
+
|
|
235
|
+
noted: list[str] = []
|
|
236
|
+
for note in sorted((overrides / "notes").glob("*.md")) if (overrides / "notes").is_dir() else []:
|
|
237
|
+
skill_md = PKG / "skills" / note.stem / "SKILL.md"
|
|
238
|
+
if not skill_md.is_file():
|
|
239
|
+
print(f"warning: note for missing skill {note.stem}", file=sys.stderr)
|
|
240
|
+
continue
|
|
241
|
+
insert_note(skill_md, note.read_text(encoding="utf-8"))
|
|
242
|
+
noted.append(note.stem)
|
|
243
|
+
|
|
244
|
+
normalised = [
|
|
245
|
+
str(p.relative_to(PKG)) for p in sorted((PKG / "skills").glob("*/SKILL.md")) if normalise_skill(p)
|
|
246
|
+
]
|
|
247
|
+
|
|
248
|
+
patched: list[dict[str, object]] = []
|
|
249
|
+
failures: list[str] = []
|
|
250
|
+
for pattern, regex, repl, why in PATCHES:
|
|
251
|
+
files = sorted(PKG.glob(pattern))
|
|
252
|
+
hits = 0
|
|
253
|
+
for f in files:
|
|
254
|
+
text = f.read_text(encoding="utf-8")
|
|
255
|
+
new, n = re.subn(regex, lambda _m: repl, text)
|
|
256
|
+
if n:
|
|
257
|
+
f.write_text(new, encoding="utf-8")
|
|
258
|
+
hits += n
|
|
259
|
+
if hits == 0:
|
|
260
|
+
failures.append(f"{pattern}: /{regex[:60]}.../ ({why})")
|
|
261
|
+
patched.append({"file": pattern, "reason": why, "hits": hits})
|
|
262
|
+
|
|
263
|
+
version = ""
|
|
264
|
+
manifest = plugin / ".claude-plugin" / "plugin.json"
|
|
265
|
+
if manifest.is_file():
|
|
266
|
+
version = json.loads(manifest.read_text(encoding="utf-8")).get("version", "")
|
|
267
|
+
info = {
|
|
268
|
+
"repository": "https://github.com/bdfinst/agentic-dev-team",
|
|
269
|
+
"plugin": "dev-team",
|
|
270
|
+
"version": version,
|
|
271
|
+
"commit": run(["git", "rev-parse", "HEAD"], upstream),
|
|
272
|
+
"commitDate": run(["git", "log", "-1", "--format=%cI"], upstream),
|
|
273
|
+
"droppedSkills": dropped,
|
|
274
|
+
"overridden": overridden,
|
|
275
|
+
"notes": noted,
|
|
276
|
+
"normalisedFrontmatter": normalised,
|
|
277
|
+
"patches": patched,
|
|
278
|
+
}
|
|
279
|
+
(PKG / "UPSTREAM.json").write_text(json.dumps(info, indent=2) + "\n", encoding="utf-8")
|
|
280
|
+
|
|
281
|
+
print(f"synced dev-team {version} ({info['commit'][:10]})")
|
|
282
|
+
print(f" dropped {len(dropped)} skills, {len(overridden)} override files, {len(normalised)} frontmatter fixes")
|
|
283
|
+
if failures:
|
|
284
|
+
print("PATCHES THAT NO LONGER MATCH (upstream changed; review and update PATCHES):", file=sys.stderr)
|
|
285
|
+
for f in failures:
|
|
286
|
+
print(" - " + f, file=sys.stderr)
|
|
287
|
+
return 1
|
|
288
|
+
print(f" {sum(int(p['hits']) for p in patched)} patch hits, all patches matched")
|
|
289
|
+
return 0
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
if __name__ == "__main__":
|
|
293
|
+
sys.exit(main())
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
# ACCEPTED-RISKS — project-local policy for suppressing reviewed findings.
|
|
3
|
+
#
|
|
4
|
+
# Each rule must carry a specific rationale, an owner, and an expiry date.
|
|
5
|
+
# Consumed by /code-review, /review-agent, and security-review.
|
|
6
|
+
# Schema reference: plugins/dev-team/knowledge/accepted-risks-schema.md
|
|
7
|
+
#
|
|
8
|
+
# Delete this example rule and add your own. If you don't yet have any
|
|
9
|
+
# accepted risks, leave rules as an empty list: `rules: []`.
|
|
10
|
+
rules:
|
|
11
|
+
- id: example-placeholder
|
|
12
|
+
rule_id: semgrep.generic.placeholder-example
|
|
13
|
+
files:
|
|
14
|
+
- "examples/**"
|
|
15
|
+
rationale: >
|
|
16
|
+
This is a placeholder rule demonstrating the shape of a real entry. Replace
|
|
17
|
+
it with rules that cite the SPECIFIC business or architectural reason the
|
|
18
|
+
finding is accepted — not generic disclaimers. If in doubt, delete this
|
|
19
|
+
rule and start with an empty list.
|
|
20
|
+
expires: 2026-07-20
|
|
21
|
+
owner: unassigned
|
|
22
|
+
scope: finding
|
|
23
|
+
broad: false
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Accepted Risks
|
|
27
|
+
|
|
28
|
+
This file is a project policy, not a todo list. Every rule is a deliberate
|
|
29
|
+
acceptance with a date when it MUST be re-reviewed.
|
|
30
|
+
|
|
31
|
+
## How to add a rule
|
|
32
|
+
|
|
33
|
+
1. Read `plugins/dev-team/knowledge/accepted-risks-schema.md` (lives in
|
|
34
|
+
the plugin) — especially the rationale and expiry requirements.
|
|
35
|
+
2. Add an entry under `rules:` in the frontmatter above.
|
|
36
|
+
3. Commit with a message explaining the acceptance decision.
|
|
37
|
+
|
|
38
|
+
## How to remove a rule
|
|
39
|
+
|
|
40
|
+
Deleting a rule is a real decision. The commit message must state why the risk
|
|
41
|
+
is no longer accepted: fixed upstream, scoped out, moved to a runbook, etc.
|
|
42
|
+
|
|
43
|
+
## Broad rules
|
|
44
|
+
|
|
45
|
+
Rules with `broad: true` (wildcard `rule_id` or multi-file globs) get flagged
|
|
46
|
+
every run. Keep these narrow; prefer two scoped rules to one broad one.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
# REQUIRED — unique identifier
|
|
3
|
+
# Format: lowercase letters, digits, and hyphens only (e.g. code-reviewer, db-reader)
|
|
4
|
+
# Must match the filename convention; used by hooks as agent_type
|
|
5
|
+
name: your-agent-name
|
|
6
|
+
|
|
7
|
+
# REQUIRED — tells Claude when to delegate to this agent
|
|
8
|
+
# Write a clear, specific description. Include "Use proactively" to encourage automatic delegation.
|
|
9
|
+
description: >-
|
|
10
|
+
One-sentence description of what this agent does and when to use it.
|
|
11
|
+
Add "Use proactively when X" to encourage automatic delegation.
|
|
12
|
+
|
|
13
|
+
# OPTIONAL — tools this agent can use
|
|
14
|
+
# If omitted, the agent inherits ALL tools from the main conversation.
|
|
15
|
+
# Use this as an allowlist to restrict what the agent can do.
|
|
16
|
+
#
|
|
17
|
+
# Common tools: Read, Grep, Glob, Bash, Edit, Write, Agent, Skill
|
|
18
|
+
# Tool restrictions: Agent(worker, researcher) limits which subagents can be spawned
|
|
19
|
+
# Bash restrictions: Bash(npx *) limits Bash to matching commands only
|
|
20
|
+
#
|
|
21
|
+
# Note: To preload skill content at startup, use the `skills` field below
|
|
22
|
+
# instead of listing Skill here. Listing Skill here allows runtime invocation
|
|
23
|
+
# but does not inject skill content into context automatically.
|
|
24
|
+
tools: Read, Grep, Glob
|
|
25
|
+
|
|
26
|
+
# OPTIONAL — tools to deny (removed from inherited or specified list)
|
|
27
|
+
# Use when you want to inherit most tools but block a few specific ones.
|
|
28
|
+
# disallowedTools: Write, Edit
|
|
29
|
+
|
|
30
|
+
# OPTIONAL — model to use for this agent's dispatch
|
|
31
|
+
# An alias (haiku | sonnet | opus | fable), a full model ID, or inherit.
|
|
32
|
+
# Resolved natively by the harness before dispatch (ADR 0026) — there is no
|
|
33
|
+
# plugin-side PreToolUse hook, routing map, or ladder file in this path.
|
|
34
|
+
# Do not pin a dated snapshot ID here; use the alias.
|
|
35
|
+
# inherit: use the same model as the main conversation (default if omitted)
|
|
36
|
+
#
|
|
37
|
+
# Routing guidance:
|
|
38
|
+
# haiku — high-volume, structured extraction, simple classification
|
|
39
|
+
# sonnet — balanced capability and speed; most agents
|
|
40
|
+
# opus — frontier reasoning, security analysis, architectural judgment
|
|
41
|
+
model: sonnet
|
|
42
|
+
|
|
43
|
+
# OPTIONAL — reasoning effort for this agent's model calls
|
|
44
|
+
# Values: low | medium | high | xhigh | max (available levels depend on model)
|
|
45
|
+
# ADR 0026 sets every agent to `high` uniformly as the safe default; a
|
|
46
|
+
# follow-up calibration pass may tune this per agent later.
|
|
47
|
+
effort: high
|
|
48
|
+
|
|
49
|
+
# OPTIONAL — permission mode
|
|
50
|
+
# WARNING: Ignored for plugin agents (silently has no effect).
|
|
51
|
+
# Only works for project agents (.claude/agents/) or user agents (~/.claude/agents/).
|
|
52
|
+
# Values: default | acceptEdits | auto | dontAsk | bypassPermissions | plan
|
|
53
|
+
# permissionMode: default
|
|
54
|
+
|
|
55
|
+
# OPTIONAL — maximum agentic turns before the agent stops
|
|
56
|
+
# maxTurns: 10
|
|
57
|
+
|
|
58
|
+
# OPTIONAL — skills to preload into this agent's context at startup
|
|
59
|
+
# The full content of each skill is injected before the agent runs.
|
|
60
|
+
# This is different from listing Skill in tools (which allows runtime invocation).
|
|
61
|
+
# Use skill names as they appear in the skills registry.
|
|
62
|
+
# skills:
|
|
63
|
+
# - api-conventions
|
|
64
|
+
# - error-handling-patterns
|
|
65
|
+
|
|
66
|
+
# OPTIONAL — MCP servers available to this agent
|
|
67
|
+
# WARNING: Ignored for plugin agents (silently has no effect).
|
|
68
|
+
# Only works for project agents (.claude/agents/) or user agents (~/.claude/agents/).
|
|
69
|
+
# mcpServers:
|
|
70
|
+
# - playwright:
|
|
71
|
+
# type: stdio
|
|
72
|
+
# command: npx
|
|
73
|
+
# args: ["-y", "@playwright/mcp@latest"]
|
|
74
|
+
|
|
75
|
+
# OPTIONAL — lifecycle hooks scoped to this agent
|
|
76
|
+
# WARNING: Ignored for plugin agents (silently has no effect).
|
|
77
|
+
# Only works for project agents (.claude/agents/) or user agents (~/.claude/agents/).
|
|
78
|
+
# hooks:
|
|
79
|
+
# PreToolUse:
|
|
80
|
+
# - matcher: "Bash"
|
|
81
|
+
# hooks:
|
|
82
|
+
# - type: command
|
|
83
|
+
# command: "./scripts/validate-command.sh"
|
|
84
|
+
|
|
85
|
+
# OPTIONAL — persistent memory directory that survives across conversations
|
|
86
|
+
# Values: user | project | local
|
|
87
|
+
# user: ~/.claude/agent-memory/<name>/ (all projects)
|
|
88
|
+
# project: .claude/agent-memory/<name>/ (this project, check in to VCS)
|
|
89
|
+
# local: .claude/agent-memory-local/<name>/ (this project, do NOT check in)
|
|
90
|
+
# memory: project
|
|
91
|
+
|
|
92
|
+
# OPTIONAL — always run this agent as a background task (non-blocking)
|
|
93
|
+
# Default: false (agent runs in foreground, blocking the main conversation)
|
|
94
|
+
# background: false
|
|
95
|
+
|
|
96
|
+
# OPTIONAL — effort level for this agent's model calls
|
|
97
|
+
# Overrides the session effort level while this agent is active.
|
|
98
|
+
# Values: low | medium | high | xhigh | max (available levels depend on model)
|
|
99
|
+
# effort: medium
|
|
100
|
+
|
|
101
|
+
# OPTIONAL — run agent in an isolated git worktree
|
|
102
|
+
# Set to "worktree" to give the agent a temporary copy of the repository.
|
|
103
|
+
# The worktree is cleaned up automatically if the agent makes no changes.
|
|
104
|
+
# Values: worktree
|
|
105
|
+
# isolation: worktree
|
|
106
|
+
|
|
107
|
+
# OPTIONAL — display color in the task list and transcript
|
|
108
|
+
# Values: red | blue | green | yellow | purple | orange | pink | cyan
|
|
109
|
+
# color: blue
|
|
110
|
+
|
|
111
|
+
# OPTIONAL — auto-submitted first turn when this agent runs as the main session
|
|
112
|
+
# (via --agent flag or `agent` setting in settings.json)
|
|
113
|
+
# Commands and skills in this prompt are processed.
|
|
114
|
+
# initialPrompt: "Load the project context and summarize the current state."
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
# Agent Name
|
|
118
|
+
|
|
119
|
+
One-sentence description of what this agent is for and what distinguishes it.
|
|
120
|
+
|
|
121
|
+
## Responsibilities
|
|
122
|
+
|
|
123
|
+
- Primary responsibility
|
|
124
|
+
- Secondary responsibility
|
|
125
|
+
- What it explicitly does NOT do (scope boundary)
|
|
126
|
+
|
|
127
|
+
## Process
|
|
128
|
+
|
|
129
|
+
Step-by-step description of how this agent approaches its task.
|
|
130
|
+
|
|
131
|
+
1. First step
|
|
132
|
+
2. Second step
|
|
133
|
+
3. Third step
|
|
134
|
+
|
|
135
|
+
## Output Format
|
|
136
|
+
|
|
137
|
+
Describe the expected output format. For review agents:
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{"status": "pass|warn|fail|skip", "issues": [{"severity": "error|warning|suggestion", "confidence": "high|medium|none", "file": "", "line": 0, "message": "", "suggestedFix": ""}], "summary": ""}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Skip
|
|
144
|
+
|
|
145
|
+
Return skip status when:
|
|
146
|
+
|
|
147
|
+
- Condition that makes this agent inapplicable
|
|
148
|
+
|
|
149
|
+
## Ignore
|
|
150
|
+
|
|
151
|
+
What this agent explicitly does not check (handled by other agents or out of scope).
|