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,1197 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: project-init
|
|
3
|
+
description: "Get a repository ready for the dev-team toolchain in one command — detect the tech stack (JS/TS, Python, C#, Java), inventory the static-analysis tools the project already has, confirm a plan, and install only what's missing, repo-level. This is the canonical source of truth for tech-stack detection and toolchain installation — NOT dev-team-specific config (CLAUDE.md generation, agent template activation, PostToolUse hooks, the generated `/pr` command all live in `/setup`, which invokes this skill first for the stack signal). Also installs the detection-gated capability tools other skills depend on — semgrep, Playwright + Chromium, adr, gh, and the docker scanners (hadolint/trivy/grype). For JavaScript it scaffolds a new project with ES modules, functional style, prettier, oxlint, editorconfig, vitest, and gitignore."
|
|
4
|
+
role: worker
|
|
5
|
+
user-invocable: true
|
|
6
|
+
argument-hint: "[--yes] [--force]"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Project Initializer
|
|
10
|
+
|
|
11
|
+
<!-- pi-port-notes -->
|
|
12
|
+
## pi port notes (read first — these override the steps below)
|
|
13
|
+
|
|
14
|
+
- **MCP servers (Step 4c):** pi reads project MCP servers from `.pi/mcp.json` (user level: `~/.pi/agent/mcp.json`), not `.mcp.json`. Register CodeGraph/Repowise there, or with `pi mcp add -l <name> -- <command>`. Tell the user to run `/reload`.
|
|
15
|
+
- **Settings/hook guards (Step 4c, #1367):** there is no `.claude/settings.json` hook registration in pi; the settings.json guard reports `n/a (pi)`.
|
|
16
|
+
- **`CLAUDE.md` guard around `graphify install`:** apply the same guard to `AGENTS.md`.
|
|
17
|
+
- The `claude` CLI is not required; ignore checks for it.
|
|
18
|
+
<!-- pi-port-notes -->
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
One command to get a repository ready for the dev-team toolchain, whatever
|
|
22
|
+
the stack. Detect the project's language(s), inventory the static-analysis
|
|
23
|
+
tools already present, confirm a three-column plan, then install only the
|
|
24
|
+
missing tools — lane tools and Playwright always repo-level, never
|
|
25
|
+
user-level or global. It then installs the detection-gated **capability
|
|
26
|
+
tools** other skills depend on (semgrep, Playwright, adr, gh, docker
|
|
27
|
+
scanners — see Step 4b), which are user/system-level CLIs by nature.
|
|
28
|
+
|
|
29
|
+
Supported stacks: **JS/TS**, **Python**, **C#**, **Java** — the four lanes
|
|
30
|
+
registered in
|
|
31
|
+
`${CLAUDE_PLUGIN_ROOT}/skills/static-analysis-integration/references/tool-configs.md`
|
|
32
|
+
§ Build-time lanes. Tool facts (choice, versions, install mechanism) follow
|
|
33
|
+
that registry; provider-binding semantics (capability slots, ordered
|
|
34
|
+
provider lists, bind-don't-replace, the qualification contract) follow
|
|
35
|
+
`${CLAUDE_PLUGIN_ROOT}/skills/build/references/static-self-heal.md`. The
|
|
36
|
+
manual commands stay documented in
|
|
37
|
+
`${CLAUDE_PLUGIN_ROOT}/skills/static-analysis-integration/references/language-setup.md`;
|
|
38
|
+
this skill automates them.
|
|
39
|
+
|
|
40
|
+
## Arguments
|
|
41
|
+
|
|
42
|
+
Arguments: $ARGUMENTS
|
|
43
|
+
|
|
44
|
+
- `--yes`: Run unattended — auto-confirm each gate below with its **safe**
|
|
45
|
+
default and never wait for input. `/setup --yes` passes this through.
|
|
46
|
+
- `--force`: Bypass Step 0's idempotency short-circuit and force the full
|
|
47
|
+
Step 1-6 sequence even when `.claude/init-state.json` records a matching
|
|
48
|
+
`last_run` (#1778). Independent of `--yes` — combine them to force a full
|
|
49
|
+
unattended re-check.
|
|
50
|
+
|
|
51
|
+
### `--yes` semantics
|
|
52
|
+
|
|
53
|
+
**Affirmative** (auto-confirm, no prompt):
|
|
54
|
+
|
|
55
|
+
- **Step 3 three-column plan** — proceed: install the "missing and will add"
|
|
56
|
+
column's defaults, repo-level. Existing configs are still never overwritten
|
|
57
|
+
(that is already the plan's contract, not a prompt).
|
|
58
|
+
- **Step 4b capability tools** — install every tool whose detection signal
|
|
59
|
+
fired and that is still missing. Tools whose signal did not fire are still
|
|
60
|
+
not installed.
|
|
61
|
+
- **Step 4c CodeGraph** — install if missing (its recommended default is
|
|
62
|
+
already yes, as part of the interactive keyless-pair prompt — see Step 4c).
|
|
63
|
+
CodeGraph never writes to the repo, so it stays in this bucket. Repowise,
|
|
64
|
+
offered alongside it in the same interactive prompt, does **not** stay
|
|
65
|
+
here — see the Conservative bucket below (#1690).
|
|
66
|
+
|
|
67
|
+
**Conservative** (skip with a printed note — never mutate the repo by
|
|
68
|
+
surprise):
|
|
69
|
+
|
|
70
|
+
- **Step 4c Graphify** — skipped for this run, because `graphify install
|
|
71
|
+
--project` writes PreToolUse hook entries embedding this machine's
|
|
72
|
+
absolute binary path into the shared, git-tracked `.claude/settings.json`
|
|
73
|
+
(see the settings.json absolute-path guard, #1367, in the Graphify
|
|
74
|
+
sub-section below) — a write that file cannot simply be gitignored out of
|
|
75
|
+
(unlike the generated git hooks themselves, which are). It also writes a
|
|
76
|
+
`## graphify` section into the tracked `.claude/CLAUDE.md`. Print
|
|
77
|
+
`Graphify: skipped under --yes (repo-writing; run /project-init without --yes to add it)`
|
|
78
|
+
and do **not** record a durable decline in `.claude/init-state.json`, so a
|
|
79
|
+
later interactive run still offers it.
|
|
80
|
+
- **Step 4c Repowise** — skipped for this run, because `repowise init` writes
|
|
81
|
+
a `## Codebase Intelligence for <project> (Repowise)` section into the
|
|
82
|
+
tracked `.claude/CLAUDE.md` (see the Repowise sub-section below) — the same
|
|
83
|
+
class of repo-level write Graphify is gated for above (#1670 item 3 made
|
|
84
|
+
this write explicit; #1690 is what moves Repowise to this bucket to match).
|
|
85
|
+
Repowise's own `.mcp.json` write also carries a machine-specific path, but
|
|
86
|
+
that file IS gitignored by the standing check below — it is the tracked
|
|
87
|
+
CLAUDE.md write, not the `.mcp.json` write, that puts Repowise here. Print
|
|
88
|
+
`Repowise: skipped under --yes (repo-writing; run /project-init without --yes to add it)`
|
|
89
|
+
and do **not** record a durable decline in `.claude/init-state.json`, so a
|
|
90
|
+
later interactive run still offers it as part of the keyless-pair prompt.
|
|
91
|
+
CodeGraph, the other half of that same prompt, is unaffected — it stays in
|
|
92
|
+
the Affirmative bucket above and installs under `--yes` regardless.
|
|
93
|
+
- **Step 1 zero/ambiguous stack** — never guess. Report the supported stacks
|
|
94
|
+
and exit gracefully without writing files or installing anything, exactly as
|
|
95
|
+
the interactive path's "something else" branch.
|
|
96
|
+
- **Greenfield JS/TS scaffold** — the confirm step proceeds with the documented
|
|
97
|
+
defaults (no customization prompt); it only writes into an empty/near-empty
|
|
98
|
+
directory, so nothing existing is overwritten.
|
|
99
|
+
|
|
100
|
+
## Workflow
|
|
101
|
+
|
|
102
|
+
### Step 0: Idempotency short-circuit (#1778)
|
|
103
|
+
|
|
104
|
+
`/project-init` is invoked far more often than it has anything new to do —
|
|
105
|
+
most re-invocations find every slot still bound and every capability tool
|
|
106
|
+
still resolved (installed or durably declined), and re-running the full
|
|
107
|
+
Steps 1-6 sequence for that outcome burns tokens presenting a three-column
|
|
108
|
+
plan whose answer never changed. This step does not skip detection — it
|
|
109
|
+
only skips Step 3's plan presentation and any install when detection itself
|
|
110
|
+
proves there is nothing to install.
|
|
111
|
+
|
|
112
|
+
1. **Always run Step 1's stack detection, Step 2's tool inventory, Step
|
|
113
|
+
4b's capability-tool detection signals, and Step 4c's "Detect which are
|
|
114
|
+
already present" probes first** — all cheap, deterministic,
|
|
115
|
+
filesystem/PATH-only signals with no network and no builds, so running
|
|
116
|
+
them here is not new work, only reordered. Their live result is
|
|
117
|
+
authoritative for step 2 below — never substitute a cached value for
|
|
118
|
+
what they just found, per this file's own stale-state override rule
|
|
119
|
+
(§ "Detect which are already present").
|
|
120
|
+
2. **Short-circuit** only when `--force` was **not** passed AND the just-run
|
|
121
|
+
detection shows: the stack list matches `.claude/init-state.json`'s
|
|
122
|
+
`last_run.stack` (if the key is absent, this condition fails and step 3
|
|
123
|
+
below never fires — first run always takes the full path), Step 2's
|
|
124
|
+
fresh inventory has every lane's capability slot bound (Step 3's own
|
|
125
|
+
"missing and will add" column would be empty), and every Step 4b/4c
|
|
126
|
+
capability tool is installed or durably declined per its own
|
|
127
|
+
already-present/decline state (never "signal fired, decision still
|
|
128
|
+
open"). All three are re-derived from the live probes just run, not read
|
|
129
|
+
back from `last_run` — `last_run.stack` is the only field compared
|
|
130
|
+
against a recorded value, because the other two must reflect what the
|
|
131
|
+
filesystem shows *right now*, exactly as an uninstalled tool or a wiped
|
|
132
|
+
config file must be caught on this very run, not papered over by a
|
|
133
|
+
stale cache.
|
|
134
|
+
3. **Before stopping, still run both of this file's standing checks** —
|
|
135
|
+
the `.mcp.json` machine-specific-path hygiene scan (§ "Standing check —
|
|
136
|
+
`.mcp.json` machine-specific-path hygiene") and Graphify's settings.json
|
|
137
|
+
absolute-path scan (§ "Standing check — run even when Graphify install
|
|
138
|
+
is skipped") — both are explicitly documented elsewhere in this file as
|
|
139
|
+
running "unconditionally, once per `/project-init` (and therefore
|
|
140
|
+
`/setup`) run," independent of every other branch, and a short-circuited
|
|
141
|
+
pass is not an exception to that. Fold their one-line outcomes into the
|
|
142
|
+
short-circuit's own report.
|
|
143
|
+
4. Print exactly one line reporting both the short-circuit and the standing
|
|
144
|
+
checks' outcomes — e.g. `Project already initialized for <stack> —
|
|
145
|
+
nothing changed since the last run (.claude/init-state.json); .mcp.json
|
|
146
|
+
hygiene: <outcome>; Graphify path check: <outcome or "not applicable">.
|
|
147
|
+
Re-run with --force to re-check anyway.` — and stop. Do not proceed to
|
|
148
|
+
Step 3's plan presentation or any install step.
|
|
149
|
+
5. **Otherwise** (first run, no `last_run` key, a changed stack, an unbound
|
|
150
|
+
slot, an unresolved capability tool, or `--force`), proceed to Step 3 as
|
|
151
|
+
normal with the detection/inventory results already in hand from step 1
|
|
152
|
+
above — do not re-run them a second time.
|
|
153
|
+
6. **`--force`** always bypasses this short-circuit and forces the full
|
|
154
|
+
Step 1-6 sequence, exactly as if `last_run` were absent (already listed
|
|
155
|
+
in the Arguments section above).
|
|
156
|
+
|
|
157
|
+
On a normal, successful completion, Step 6 writes the `last_run` snapshot
|
|
158
|
+
into `.claude/init-state.json` — see its final bullet below. A run that
|
|
159
|
+
stops early (Step 1's zero/ambiguous-stack exit, an install failure) does
|
|
160
|
+
not write `last_run`, so the next invocation naturally re-checks from
|
|
161
|
+
scratch rather than caching a failed or incomplete state as "done."
|
|
162
|
+
|
|
163
|
+
### Step 1: Detect the stack
|
|
164
|
+
|
|
165
|
+
Probe the working directory with cheap, deterministic filesystem signals —
|
|
166
|
+
no builds, no network:
|
|
167
|
+
|
|
168
|
+
| Signal | Stack |
|
|
169
|
+
|---|---|
|
|
170
|
+
| `package.json`, `tsconfig.json`, `*.js`/`*.jsx`/`*.ts`/`*.tsx` sources | JS/TS |
|
|
171
|
+
| `pyproject.toml`, `requirements*.txt`, `setup.cfg`/`setup.py`, `*.py` sources | Python |
|
|
172
|
+
| `*.sln`, `*.csproj`, `global.json` | C# |
|
|
173
|
+
| `pom.xml`, `build.gradle`/`build.gradle.kts`, `*.java` sources | Java |
|
|
174
|
+
|
|
175
|
+
- **Multiple stacks detected** → multi-stack setup: run every matched
|
|
176
|
+
language's inventory and install, mirroring the self-heal pass's
|
|
177
|
+
mixed-language lane dispatch.
|
|
178
|
+
- **Zero or ambiguous signals** (empty dir, README-only repo) → **ask the
|
|
179
|
+
user**: present the four supported stacks plus "something else".
|
|
180
|
+
"Something else" explains what's supported and exits gracefully — no
|
|
181
|
+
files written, nothing installed. **Under `--yes`, do not prompt** — never
|
|
182
|
+
guess a stack: report the supported stacks and exit gracefully, exactly as
|
|
183
|
+
the "something else" branch.
|
|
184
|
+
|
|
185
|
+
### Step 2: Inventory the existing toolchain
|
|
186
|
+
|
|
187
|
+
Stack detection says which lanes apply; the inventory then establishes, per
|
|
188
|
+
capability slot (**autofix** / **diagnostic**, as the lane registry defines
|
|
189
|
+
them), which recognized provider — if any — the project already has. Three
|
|
190
|
+
signal classes, still cheap and deterministic — no builds, no network:
|
|
191
|
+
|
|
192
|
+
1. **Config-file signals** — `eslint.config.js`/`.eslintrc*`, `biome.json`,
|
|
193
|
+
`[tool.ruff]`/`[tool.black]`/`[tool.mypy]` sections in `pyproject.toml`,
|
|
194
|
+
`.flake8`/`setup.cfg` sections, `.pylintrc`, `checkstyle.xml`, PMD
|
|
195
|
+
rulesets (`pmd-ruleset.xml`).
|
|
196
|
+
2. **Dependency signals** — `package.json` devDependencies,
|
|
197
|
+
`requirements-dev.txt`/the `pyproject.toml` dev group, Maven/Gradle
|
|
198
|
+
plugin blocks.
|
|
199
|
+
3. **Executable probes** — the lane registry's detection probes, run per
|
|
200
|
+
candidate provider down each slot's ordered provider list
|
|
201
|
+
(`tool-configs.md` § Build-time lanes; repo-local locations first,
|
|
202
|
+
then PATH).
|
|
203
|
+
|
|
204
|
+
Binding follows **bind-don't-replace**: an existing, configured tool that
|
|
205
|
+
passes the qualification contract is bound as its slot's provider, and the
|
|
206
|
+
plugin's default is never installed over it. A bound equivalent — black +
|
|
207
|
+
flake8 as a pair, biome, an ESLint kept under demotion, checkstyle —
|
|
208
|
+
satisfies its slot; nothing is installed for it.
|
|
209
|
+
|
|
210
|
+
### Step 3: Confirm the three-column plan
|
|
211
|
+
|
|
212
|
+
Detection is always confirmed, never assumed. Present the stack + inventory
|
|
213
|
+
results as a three-column plan and wait for the user to confirm it
|
|
214
|
+
**before any file is written or any install runs** (**under `--yes`, print the
|
|
215
|
+
plan and proceed without waiting** — see the Arguments section):
|
|
216
|
+
|
|
217
|
+
1. **Found and keeping** — providers the inventory bound. Nothing is
|
|
218
|
+
installed for these slots, and existing configs (`eslint.config.js`,
|
|
219
|
+
`pyproject.toml` sections, `.editorconfig`, …) are never overwritten —
|
|
220
|
+
this column doubles as the report of what already exists and is left
|
|
221
|
+
alone.
|
|
222
|
+
2. **Missing and will add** — empty slots to be filled with the lane's
|
|
223
|
+
default tool. **Only this column installs anything.**
|
|
224
|
+
3. **Found but can't participate** — a present tool that fails the
|
|
225
|
+
qualification contract (e.g. pyright before its adapter exists), with
|
|
226
|
+
the reason stated and the lane default offered alongside — never a
|
|
227
|
+
silent replacement.
|
|
228
|
+
|
|
229
|
+
The mode follows from what detection found:
|
|
230
|
+
|
|
231
|
+
- **Existing project** (sources present) → tools-only mode, driven entirely
|
|
232
|
+
by the three columns: bind, fill empty slots, surface non-conforming
|
|
233
|
+
tools. No existing config file is modified.
|
|
234
|
+
- **Greenfield JS/TS** (empty or near-empty dir) → the full scaffold below;
|
|
235
|
+
its defaults are presented as this plan's **missing and will add**
|
|
236
|
+
column.
|
|
237
|
+
- **Greenfield Python/C#/Java** → tools plus minimal config (full
|
|
238
|
+
config-scaffold parity with the JS path lands as per-language
|
|
239
|
+
follow-ups).
|
|
240
|
+
|
|
241
|
+
### Step 4: Install missing tools (repo-level, per lane)
|
|
242
|
+
|
|
243
|
+
Every install lands in the project, versioned with it, reproducible for
|
|
244
|
+
every contributor and CI — never `pip install --user`, never a global
|
|
245
|
+
pipx install, never `npm install -g`.
|
|
246
|
+
|
|
247
|
+
- **JS/TS** — greenfield: the full scaffold below (oxlint as the default
|
|
248
|
+
linter, ESLint behind `lint:deep`). Existing project: fill the empty
|
|
249
|
+
autofix slot as a devDependency, leaving all configs alone:
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
npm install --save-dev oxlint
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
If this fails with `npm error code ERESOLVE`, the peer conflict is
|
|
256
|
+
pre-existing in the repo's tree (not with `oxlint`) — retry once with
|
|
257
|
+
`--legacy-peer-deps` and note to the user that you did so, rather than
|
|
258
|
+
aborting.
|
|
259
|
+
|
|
260
|
+
- **Python** — add `ruff` and `mypy` — plus `pytest` if no test runner is
|
|
261
|
+
present — to the project's own dev-dependency mechanism: the
|
|
262
|
+
`pyproject.toml` dev group or `requirements-dev.txt`, whichever the
|
|
263
|
+
project already uses; create `requirements-dev.txt` if neither exists.
|
|
264
|
+
- **C#** — nothing to install: both lane tools ship with the .NET SDK.
|
|
265
|
+
Verify the SDK is present — honoring a `global.json` pin when one
|
|
266
|
+
exists — and that `dotnet format --version` responds.
|
|
267
|
+
- **Java** — verify a JDK is present (`java` on PATH), then run the
|
|
268
|
+
plugin's pinned-PMD installer — the user never locates or invokes it by
|
|
269
|
+
hand:
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/install-java-static-analysis.py"
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
It installs a pinned PMD distribution into the repo-local, gitignored
|
|
276
|
+
`.pmd/` directory (version pin single-sourced in the script; re-runs are
|
|
277
|
+
idempotent). Add the `.pmd/` entry to the project's `.gitignore` if it
|
|
278
|
+
is missing.
|
|
279
|
+
|
|
280
|
+
### Step 4b: Install capability tools
|
|
281
|
+
|
|
282
|
+
Beyond the four static-analysis lanes, other skills and agents depend on a
|
|
283
|
+
set of **capability tools**. `references/capability-tools.md` is their single
|
|
284
|
+
source of truth — a registry of *tool | skills that need it | offer-when
|
|
285
|
+
signal | OS-aware install command | verify probe*. This step installs the
|
|
286
|
+
warranted ones so the "run `/project-init`" pointer those skills print is
|
|
287
|
+
honest.
|
|
288
|
+
|
|
289
|
+
**Run the detection signals** (cheap, deterministic — no builds, no network):
|
|
290
|
+
|
|
291
|
+
| Capability | Skills served | Offer-when signal |
|
|
292
|
+
|---|---|---|
|
|
293
|
+
| semgrep | `/semgrep-analyze`, security-assessment | any source lane detected (universal SAST) — always offer, opt-in |
|
|
294
|
+
| Playwright + Chromium | `/benchmark`, `/browse`, `/browser-testing`, `/performance-benchmark` | frontend signals (React/Svelte/Vue/Angular/Next/Nuxt/SvelteKit/Astro, or an `e2e/` dir, or `playwright.config.*`) in an existing project |
|
|
295
|
+
| adr | `/adr-tools`, adr-author | `docs/adr/`, `docs/decisions/`, or existing ADR `*.md` files present |
|
|
296
|
+
| gh | `/issues-from-assessment` and other issue/PR skills | git repo with a GitHub remote (`git remote -v` shows `github.com`) |
|
|
297
|
+
| docker scanners (hadolint, trivy, grype) | `/docker-image-audit` | a `Dockerfile`/`*.dockerfile`/`compose.y*ml` present |
|
|
298
|
+
|
|
299
|
+
**Present the warranted capability tools as their own group** in the Step 3
|
|
300
|
+
three-column plan — a "capability tools" block alongside the lane columns —
|
|
301
|
+
and **confirm before installing**, same gate as the lanes. **Under `--yes`,
|
|
302
|
+
install every warranted-and-missing tool without prompting** (see the
|
|
303
|
+
Arguments section). Install only the
|
|
304
|
+
tools whose signal fired *and* that the user confirmed *and* that are still
|
|
305
|
+
missing (skip any already on `PATH`). Use the OS-aware install command from
|
|
306
|
+
`references/capability-tools.md` for each — never inline a different command.
|
|
307
|
+
|
|
308
|
+
**Install-level honesty.** The "always repo-level, never user/system" rule
|
|
309
|
+
of the lanes applies to the lane tools **plus Playwright**. The other
|
|
310
|
+
capability tools are general-purpose CLIs that are **user/system-level by
|
|
311
|
+
nature** — there is no repo-local install for `gh`, `semgrep`, `adr`, or the
|
|
312
|
+
docker scanners, so they install via the OS package manager (or pipx / user
|
|
313
|
+
pip on Linux). **Playwright is the repo-level exception among capability
|
|
314
|
+
tools**: it installs as an `npm` devDependency (`@playwright/test`), versioned
|
|
315
|
+
with the project like a lane tool — only its Chromium download is machine-level.
|
|
316
|
+
State this explicitly to the user when the capability group installs. If the
|
|
317
|
+
Playwright `npm` install fails with `npm error code ERESOLVE`, the peer
|
|
318
|
+
conflict is pre-existing in the repo's tree (`@playwright/test` has no
|
|
319
|
+
framework peer relationship) — retry that install once with
|
|
320
|
+
`--legacy-peer-deps` and note to the user that you did so, rather than
|
|
321
|
+
aborting.
|
|
322
|
+
|
|
323
|
+
### Step 4c: Offer the code-lookup tools (keyless group + keyless Graphify build)
|
|
324
|
+
|
|
325
|
+
Three optional, complementary code-intelligence tools — **CodeGraph**,
|
|
326
|
+
**Repowise**, and **Graphify** — let the review and analysis agents read
|
|
327
|
+
verified skeletons, resolved call graphs, modification risk, and decision
|
|
328
|
+
rationale instead of re-reading whole files. None is required.
|
|
329
|
+
|
|
330
|
+
They are offered by **cost profile**, so the operator never has to accept a
|
|
331
|
+
model/API-key cost to get the keyless tools (issue #1141, which relaxes the
|
|
332
|
+
single all-or-none group of #1108):
|
|
333
|
+
|
|
334
|
+
- **Keyless pair — CodeGraph + Repowise.** Both build a purely structural
|
|
335
|
+
index with **no model/API key** and are safe to build unattended. They are
|
|
336
|
+
offered as **one all-or-none group** — a single decision that gives the
|
|
337
|
+
agents a consistent, predictable lookup set (issue #1108). Accepting the
|
|
338
|
+
group both **installs and builds** every missing tool's index in this same
|
|
339
|
+
run — it is not a "print instructions and leave it to the user" step (issues
|
|
340
|
+
#1134, #1135). CodeGraph installs its CLI (`npm install -g
|
|
341
|
+
@colbymchenry/codegraph`) and runs `codegraph init .`; Repowise installs and
|
|
342
|
+
runs `repowise init . --no-prose -y` for a keyless index.
|
|
343
|
+
- **Graphify — full extraction is the target; `--code-only` is a degraded
|
|
344
|
+
fallback, not the goal.** `graphify extract .` is Graphify's documented
|
|
345
|
+
headless full extraction (**AST + semantic LLM pass**) — it is what indexes
|
|
346
|
+
this plugin's multi-modal target (code + docs + schemas + infra) into the
|
|
347
|
+
`graph.json` that `graphify query`/`path`/`explain` traverse. Only the
|
|
348
|
+
**AST pass** builds with **no model/API key**; the **semantic pass** is what
|
|
349
|
+
pulls docs and images into the graph at all — with no working backend, that
|
|
350
|
+
pass is skipped and `--code-only` must be used explicitly, which excludes
|
|
351
|
+
docs and images. Two further add-ons sit on top of a successful full
|
|
352
|
+
extraction and are also key-gated: inferred edges (`extract --mode deep`)
|
|
353
|
+
and human-readable community names (`graphify label`; without them
|
|
354
|
+
communities stay `Community N` placeholders). Graphify is offered as
|
|
355
|
+
**its own opt-in prompt after the keyless pair** — separate not because of a
|
|
356
|
+
key, but because its integration is **repo-level** (it writes PreToolUse
|
|
357
|
+
hook entries into this repo's tracked `.claude/settings.json` and a
|
|
358
|
+
`## graphify` CLAUDE.md section; the generated git hooks it also installs
|
|
359
|
+
are gitignored — see the sub-section below). On accept: with a
|
|
360
|
+
working backend, run full extraction, repairing the backend's dependencies
|
|
361
|
+
first if needed and never discarding a completed AST pass if the semantic
|
|
362
|
+
pass then fails; without one, build the **code-only** graph and say so
|
|
363
|
+
plainly — it is a degraded index, not the full one. When Graphify is absent
|
|
364
|
+
the agents that use it fall back gracefully (see
|
|
365
|
+
`knowledge/codegraph-vs-graphify.md`).
|
|
366
|
+
|
|
367
|
+
**Detect which are already present** (so re-runs are idempotent and each offer
|
|
368
|
+
scopes to the *missing* set):
|
|
369
|
+
|
|
370
|
+
- CodeGraph — `command -v codegraph` succeeds **and** `.codegraph/` exists.
|
|
371
|
+
- Repowise — the Repowise MCP server is registered / `.repowise/` exists.
|
|
372
|
+
- Graphify — `command -v graphify` succeeds, `graphify-out/graph.json` exists,
|
|
373
|
+
**and** it is not a degraded build waiting on a key that has since shown up:
|
|
374
|
+
if `.claude/init-state.json` has `graphify.code_only_build == true` **and** a
|
|
375
|
+
provider key is now present, treat Graphify as still in the missing set (so
|
|
376
|
+
the opt-in re-offers full extraction) rather than as already present — a
|
|
377
|
+
`--code-only` graph must not permanently block ever reaching the full index
|
|
378
|
+
(issue #1483). Otherwise, present.
|
|
379
|
+
|
|
380
|
+
Also read `.claude/init-state.json`: honor any prior **explicit decline**
|
|
381
|
+
(e.g. `codegraph.install_declined == true`) — a declined tool is excluded from
|
|
382
|
+
the "missing" set rather than silently re-offered, and the existing unstick
|
|
383
|
+
instruction still applies (`remove the <tool> key from .claude/init-state.json
|
|
384
|
+
to re-prompt`).
|
|
385
|
+
|
|
386
|
+
**The keyless group prompt.** Compute the *missing* set = the keyless tools
|
|
387
|
+
(CodeGraph, Repowise) that are neither already present nor previously declined.
|
|
388
|
+
|
|
389
|
+
- If the missing set is **empty**: print
|
|
390
|
+
`Code-lookup tools: keyless pair present (or previously declined) — nothing to install.`
|
|
391
|
+
and continue. No prompt.
|
|
392
|
+
- Otherwise, first show the user the "When to use which" section of
|
|
393
|
+
`${CLAUDE_PLUGIN_ROOT}/knowledge/codegraph-vs-graphify.md`, then prompt
|
|
394
|
+
**once**, listing the missing tools by name (this is an explicit `y`/`n`, and
|
|
395
|
+
the recommended default is **yes** when anything is missing):
|
|
396
|
+
|
|
397
|
+
```
|
|
398
|
+
Install the code-lookup tools <missing list> to enable faster, verified
|
|
399
|
+
code navigation for the review and analysis agents? [Y/n]
|
|
400
|
+
- CodeGraph — personal, user-level MCP; nothing committed to the repo.
|
|
401
|
+
Keyless: `npm install -g @colbymchenry/codegraph` + `codegraph init .`.
|
|
402
|
+
- Repowise — local keyless index under .repowise/ (gitignored); MCP server.
|
|
403
|
+
Keyless: `init . --no-prose -y`, no API key requested. Also
|
|
404
|
+
adds a `## Codebase Intelligence for <project> (Repowise)`
|
|
405
|
+
section to the tracked .claude/CLAUDE.md documenting the
|
|
406
|
+
codebase — intended (confirmed by the repo owner, #1670
|
|
407
|
+
item 3), and committed along with the rest of this run's
|
|
408
|
+
changes, not reverted.
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
**Under `--yes`, treat the keyless-pair prompt as yes for CodeGraph only.**
|
|
412
|
+
Repowise moved to the Conservative bucket (Arguments section, #1690) because
|
|
413
|
+
`repowise init` also writes a `## Codebase Intelligence for <project>
|
|
414
|
+
(Repowise)` section into the tracked `.claude/CLAUDE.md` — a repo-level write
|
|
415
|
+
gated the same way below. Install CodeGraph without waiting (its recommended
|
|
416
|
+
default is already yes); skip Repowise for this run, print `Repowise:
|
|
417
|
+
skipped under --yes (repo-writing; run /project-init without --yes to add
|
|
418
|
+
it)`, and do **not** record a durable decline in `.claude/init-state.json`,
|
|
419
|
+
so a later interactive run still offers it as part of this same prompt.
|
|
420
|
+
|
|
421
|
+
- On **yes** (interactive only — see the `--yes` split above): install
|
|
422
|
+
**every** tool in the missing set by running its sub-section below
|
|
423
|
+
(CodeGraph, Repowise), recording each tool's accept in
|
|
424
|
+
`.claude/init-state.json`.
|
|
425
|
+
- **Partial failure is surfaced, never hidden.** If one tool's install
|
|
426
|
+
errors after another already succeeded, print the failing tool's error,
|
|
427
|
+
record per-tool success/failure in `.claude/init-state.json`, and report
|
|
428
|
+
the group as *partially installed* — do not claim both succeeded.
|
|
429
|
+
- On **no** (or empty): install nothing, record the group decline for each
|
|
430
|
+
missing tool in `.claude/init-state.json`, and print a terminal-visible
|
|
431
|
+
confirmation so the operator knows the choice was durable and reversible:
|
|
432
|
+
`Code-lookup tools: skipped — agents fall back to Read/Grep/Glob (re-run /project-init to be offered again).`
|
|
433
|
+
|
|
434
|
+
**The Graphify opt-in.** After the keyless pair, offer Graphify whenever it is
|
|
435
|
+
in the missing set (regardless of key presence — its AST graph builds keyless):
|
|
436
|
+
|
|
437
|
+
0. **Under `--yes`, skip Graphify for this run** — `graphify install
|
|
438
|
+
--project` writes a machine-specific absolute path into the tracked
|
|
439
|
+
`.claude/settings.json`, so it stays opt-in even unattended (see the
|
|
440
|
+
Arguments section's `--yes` semantics). Print the skip note from the
|
|
441
|
+
Arguments section and do not record a durable decline. Do not run the
|
|
442
|
+
prompt below.
|
|
443
|
+
1. **Skip if already present or previously declined** — same missing-set rule
|
|
444
|
+
as above.
|
|
445
|
+
2. **Prompt once** (recommended default **no**, because — unlike the keyless
|
|
446
|
+
pair — Graphify writes a machine-specific path into this repo's tracked
|
|
447
|
+
`.claude/settings.json`):
|
|
448
|
+
|
|
449
|
+
```
|
|
450
|
+
Also install Graphify for architecture/onboarding-level code intelligence? (y/N)
|
|
451
|
+
- Graphify — repo-level: writes PreToolUse hook entries with this
|
|
452
|
+
machine's graphify path into the tracked
|
|
453
|
+
`.claude/settings.json` (relocated to settings.local.json
|
|
454
|
+
by the #1367 guard) and a `## graphify` section into this
|
|
455
|
+
repo's CLAUDE.md (guarded against the known over-delete
|
|
456
|
+
bug — see the Graphify sub-section). Also installs git
|
|
457
|
+
hooks, which are gitignored.
|
|
458
|
+
Its AST structural graph builds WITHOUT an API key; indexing
|
|
459
|
+
docs and images needs a working backend (see below).
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
3. **On yes:** run the Graphify sub-section below (install + guarded native
|
|
463
|
+
integration + build the graph — full extraction when a working backend is
|
|
464
|
+
available, `--code-only` fallback otherwise), recording the accept in
|
|
465
|
+
`.claude/init-state.json`.
|
|
466
|
+
4. **Full extraction vs. `--code-only` fallback.** Detect a provider key —
|
|
467
|
+
`ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, `GOOGLE_API_KEY`, `MOONSHOT_API_KEY`,
|
|
468
|
+
`OPENAI_API_KEY` (`GEMINI_API_KEY` and `GOOGLE_API_KEY` both select the
|
|
469
|
+
same backend — `.claude/skills/graphify/SKILL.md`'s own detection checks
|
|
470
|
+
either):
|
|
471
|
+
- **Key present:** run full extraction (`graphify extract .`), first
|
|
472
|
+
verifying/repairing the selected backend's dependency (the Graphify
|
|
473
|
+
sub-section's backend-repair step) so the semantic pass does not fail on
|
|
474
|
+
a missing extra. On success, merge `{"graphify": {"code_only_build":
|
|
475
|
+
false}}` — explicitly `false`, not omitted, so it overrides a `true` left
|
|
476
|
+
by an earlier degraded run. If the semantic pass still fails after the
|
|
477
|
+
AST pass succeeds, re-run `--code-only` to keep the completed AST work,
|
|
478
|
+
report the result as **degraded** — never as a full success — and merge
|
|
479
|
+
`{"graphify": {"code_only_build": true}}` so the next `/project-init` run
|
|
480
|
+
re-offers full extraction instead of treating this graph as done (issue
|
|
481
|
+
#1483; see the "Detect which are already present" rule above).
|
|
482
|
+
- **No key:** run `graphify extract . --code-only` directly and say so
|
|
483
|
+
plainly: `Graphify: no provider key — code-only graph built (docs/images
|
|
484
|
+
not indexed). Set a provider key (e.g. ANTHROPIC_API_KEY) and re-run
|
|
485
|
+
/project-init for the full index.` Merge
|
|
486
|
+
`{"graphify": {"enrichment_skipped_no_key": true, "code_only_build":
|
|
487
|
+
true}}` into `.claude/init-state.json` — the latter is what keeps this
|
|
488
|
+
run from being mistaken for a completed build once a key shows up.
|
|
489
|
+
5. **Semantic enrichment (key-gated add-on, on top of a successful full
|
|
490
|
+
extraction).** `graphify label` (community naming) and
|
|
491
|
+
`extract . --mode deep` (inferred edges) are additional passes over an
|
|
492
|
+
already-fully-extracted graph — they do not gate whether docs/images are in
|
|
493
|
+
the graph at all (full extraction in step 4 does). Offer both when a
|
|
494
|
+
provider key is present and full extraction succeeded; both stay non-fatal
|
|
495
|
+
(partial-failure rule) if the key is rejected at build time. Skip entirely
|
|
496
|
+
when step 4 took the `--code-only` path.
|
|
497
|
+
6. **On no:** install nothing, record `{"graphify": {"install_declined": true}}`.
|
|
498
|
+
|
|
499
|
+
The per-tool mechanics below are unchanged; Step 4c only decides *whether* each
|
|
500
|
+
runs. Each remains user-scoped/gitignored exactly as before, except Graphify's
|
|
501
|
+
documented repo-level native integration — which is written on any Graphify
|
|
502
|
+
accept (it does not require a key) — and the `.mcp.json` machine-specific-path
|
|
503
|
+
hygiene standing check (#1416, filed under Repowise's sub-section below),
|
|
504
|
+
which touches this repo's own `.gitignore`.
|
|
505
|
+
|
|
506
|
+
#### CodeGraph — strictly personal, never committed
|
|
507
|
+
|
|
508
|
+
CodeGraph (<https://github.com/colbymchenry/codegraph>) is a third-party
|
|
509
|
+
SQLite knowledge graph of every symbol, edge, and file in the workspace.
|
|
510
|
+
**It is user-level tooling only** — nothing it produces or registers is
|
|
511
|
+
ever written into a repo-tracked file. `.codegraph/codegraph.db` stays
|
|
512
|
+
gitignored and machine-local, exactly as it already does.
|
|
513
|
+
|
|
514
|
+
**Classify state** (run both, record results as `installed` and `initialized`):
|
|
515
|
+
|
|
516
|
+
```bash
|
|
517
|
+
command -v codegraph > /dev/null 2>&1 && echo "installed" || echo "not-installed"
|
|
518
|
+
[ -d "${PWD}/.codegraph" ] && echo "initialized" || echo "not-initialized"
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
Read `.claude/init-state.json` if it exists (top-level `codegraph` key holds
|
|
522
|
+
the four state booleans: `install_accepted`, `install_declined`,
|
|
523
|
+
`init_accepted`, `init_declined`).
|
|
524
|
+
|
|
525
|
+
**Branch on (installed, initialized):**
|
|
526
|
+
|
|
527
|
+
| installed | initialized | Action |
|
|
528
|
+
|-----------|-------------|--------|
|
|
529
|
+
| any | true | Print "CodeGraph: initialized ✓" and continue. State file untouched. |
|
|
530
|
+
| true | false | **Init prompt branch** (below). |
|
|
531
|
+
| false | false | **Install prompt branch** (below). |
|
|
532
|
+
|
|
533
|
+
**Stale-state override.** Before consulting the recorded state, apply these
|
|
534
|
+
rules: `install_declined` is ignored when `installed=true` (the user has
|
|
535
|
+
since installed CodeGraph); `init_declined` is ignored when
|
|
536
|
+
`initialized=true` (the project got initialized by other means). The live
|
|
537
|
+
filesystem/PATH check supersedes the recorded preference.
|
|
538
|
+
|
|
539
|
+
**Install prompt branch** (installed=false, initialized=false):
|
|
540
|
+
|
|
541
|
+
- If `.codegraph.install_declined == true`: print
|
|
542
|
+
`CodeGraph: previously declined install (remove the codegraph key from .claude/init-state.json to re-prompt)`
|
|
543
|
+
and continue.
|
|
544
|
+
- Otherwise prompt: `Install CodeGraph for code intelligence? (y/N)`
|
|
545
|
+
- On `y`/`Y`: install the CodeGraph CLI (machine-level, keyless — nothing is
|
|
546
|
+
committed to the repo):
|
|
547
|
+
|
|
548
|
+
```bash
|
|
549
|
+
npm install -g @colbymchenry/codegraph
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
- On success: merge `{"codegraph": {"install_accepted": true}}` into
|
|
553
|
+
`.claude/init-state.json` and **fall through to the init step below**
|
|
554
|
+
(`codegraph init .`) so the index is built in this same run — this is
|
|
555
|
+
what issue #1134 requires (install *and* build, not just instructions).
|
|
556
|
+
- **Non-fatal on failure** (npm missing, or the install errors): print
|
|
557
|
+
`CodeGraph install failed — install it manually: https://github.com/colbymchenry/codegraph#installation`,
|
|
558
|
+
merge `{"codegraph": {"install_failed": true}}`, and continue. Per the
|
|
559
|
+
group's partial-failure rule, report the tool as failed rather than
|
|
560
|
+
aborting the rest of setup.
|
|
561
|
+
- On any other response (including empty): merge
|
|
562
|
+
`{"codegraph": {"install_declined": true}}` and continue silently.
|
|
563
|
+
|
|
564
|
+
**Init prompt branch** (installed=true, initialized=false):
|
|
565
|
+
|
|
566
|
+
- If `.codegraph.init_declined == true`: print
|
|
567
|
+
`CodeGraph: previously declined init (remove the codegraph key from .claude/init-state.json to re-prompt)`
|
|
568
|
+
and continue.
|
|
569
|
+
- Otherwise prompt:
|
|
570
|
+
`CodeGraph is installed but not initialized in this project. Initialize now? (y/N)`
|
|
571
|
+
- On `y`/`Y`:
|
|
572
|
+
1. Print: `Running 'codegraph init .' in this project...`
|
|
573
|
+
2. Execute `codegraph init .` — **non-interactive** (no `-i`; issue #1134),
|
|
574
|
+
targeting the current working directory. Surface its stdout/stderr to
|
|
575
|
+
the user.
|
|
576
|
+
3. On exit 0: print `CodeGraph: initialized ✓`, merge
|
|
577
|
+
`{"codegraph": {"init_accepted": true}}` into
|
|
578
|
+
`.claude/init-state.json`, then register the MCP server (below).
|
|
579
|
+
4. On non-zero exit N: print
|
|
580
|
+
`CodeGraph init failed (exit code N). See output above. Continuing without CodeGraph.`
|
|
581
|
+
Do NOT modify `.claude/init-state.json`.
|
|
582
|
+
- On any other response: merge `{"codegraph": {"init_declined": true}}`
|
|
583
|
+
and continue silently.
|
|
584
|
+
|
|
585
|
+
**Register the MCP server at user scope (never a repo file).** After a
|
|
586
|
+
successful init, CodeGraph must be registered the same way any personal MCP
|
|
587
|
+
server is added for this Claude Code installation — **not** written into a
|
|
588
|
+
project's `.mcp.json`, and no `.codegraph/` directory is ever committed.
|
|
589
|
+
Print the manual command for the user to run themselves at user scope:
|
|
590
|
+
|
|
591
|
+
```
|
|
592
|
+
claude mcp add codegraph -- codegraph serve --mcp
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
Note the exact CLI flag for user-scope registration may vary by Claude Code
|
|
596
|
+
version — point the user at `claude mcp add --help` if the command above is
|
|
597
|
+
rejected. Do not attempt to write `.mcp.json` in the project root, and do
|
|
598
|
+
not run `git add`/`git commit` for anything under `.codegraph/`.
|
|
599
|
+
|
|
600
|
+
`.claude/init-state.json` uses a top-level `codegraph` key so future plugins
|
|
601
|
+
can claim sibling keys without collision. Always merge into existing JSON
|
|
602
|
+
rather than overwriting it.
|
|
603
|
+
|
|
604
|
+
#### Repowise — keyless local index, MCP server
|
|
605
|
+
|
|
606
|
+
Repowise (`repowise` on PyPI) is a codebase-documentation engine that indexes
|
|
607
|
+
the repo and exposes it as an MCP server
|
|
608
|
+
(`mcp__plugin_repowise_repowise__{get_context,get_symbol,search_codebase,get_risk,get_why}`).
|
|
609
|
+
It installs and indexes **without any LLM API key** and stores its index under
|
|
610
|
+
`.repowise/`.
|
|
611
|
+
|
|
612
|
+
Run this tool's install/index through the `repowise-setup` skill (or the
|
|
613
|
+
`index-codebase` skill), which handles the install (`uv`/`pipx`/`pip`), adds
|
|
614
|
+
`.repowise/` to git's **global** ignore so the index never clutters the repo,
|
|
615
|
+
and runs a **keyless** index (`repowise init . --no-prose -y`, no provider key
|
|
616
|
+
requested). There is no `--index-only` flag — `--no-prose` renders the whole
|
|
617
|
+
wiki from structure with no model/key, and `-y` skips the cost-confirmation
|
|
618
|
+
prompt so an unattended `--yes` run does not block on it. Budget for it: on a
|
|
619
|
+
~1600-file repo this took ~5.5 minutes.
|
|
620
|
+
|
|
621
|
+
The install steps below run only when Step 4c's keyless-group opt-in accepts
|
|
622
|
+
and Repowise is in the missing set. **Under `--yes`, that acceptance never
|
|
623
|
+
happens for Repowise** — it is in the Conservative bucket (Arguments
|
|
624
|
+
section, #1690), so an unattended run skips these steps and prints the
|
|
625
|
+
`Repowise: skipped under --yes` note instead; only an interactive accept of
|
|
626
|
+
the keyless-pair prompt reaches this sub-section's install steps. **The one
|
|
627
|
+
exception is the `.mcp.json` standing check at the end of this sub-section
|
|
628
|
+
(#1416)**, which runs on every `/project-init` pass regardless of the
|
|
629
|
+
group's outcome — accept, decline, or already-present — the same carve-out
|
|
630
|
+
the Graphify sub-section's own Standing check (#1367) makes below.
|
|
631
|
+
|
|
632
|
+
**Install steps (executed only when the all-or-none group is accepted):**
|
|
633
|
+
|
|
634
|
+
1. Install: prefer `uv tool install repowise`, else `pipx install repowise`,
|
|
635
|
+
else `python3 -m pip install --user repowise`.
|
|
636
|
+
2. Index keyless: run `repowise init . --no-prose -y` so no API key is
|
|
637
|
+
requested; the index lands under `.repowise/` (gitignored). This step
|
|
638
|
+
(or an equivalent `repowise init` invocation) is known to write a
|
|
639
|
+
project-root `.mcp.json` registering the repowise MCP server, with an
|
|
640
|
+
`args` array baking in this machine's absolute filesystem path — the
|
|
641
|
+
**standing check below** (not gated behind this install branch) covers it
|
|
642
|
+
regardless of whether `.mcp.json` existed before this run. It also appends
|
|
643
|
+
a `## Codebase Intelligence for <project> (Repowise)` section to the
|
|
644
|
+
tracked `.claude/CLAUDE.md` — intended, expected behavior (confirmed by
|
|
645
|
+
the repo owner, issue #1670 item 3), not a bug to guard against: the
|
|
646
|
+
section documents the codebase for readers of `CLAUDE.md` and is
|
|
647
|
+
committed along with the rest of this run's changes, not reverted. It is
|
|
648
|
+
derived structurally (`--no-prose`, no model/key involved — see the
|
|
649
|
+
Repowise sub-section above), not free-form model-generated prose — a
|
|
650
|
+
lower-risk profile than fully model-authored text, though it is still
|
|
651
|
+
third-party-tool-generated content landing in an agent-loaded file, so
|
|
652
|
+
the normal PR review before merge is what actually vets it, not this
|
|
653
|
+
note alone.
|
|
654
|
+
3. Register the MCP server for this Claude Code installation (user scope), the
|
|
655
|
+
same way any personal MCP server is added — point the user at
|
|
656
|
+
`claude mcp add --help` for the exact invocation. **Server-name caveat:**
|
|
657
|
+
the agents' grants assume the server name `plugin_repowise_repowise`; if a
|
|
658
|
+
different name is used the grants are inert and agents fall back to
|
|
659
|
+
`Read`/`Grep`/`Glob`.
|
|
660
|
+
4. On success, merge `{"repowise": {"install_accepted": true}}` into
|
|
661
|
+
`.claude/init-state.json`. On failure, surface the error and merge
|
|
662
|
+
`{"repowise": {"install_failed": true}}` — do not claim the group fully
|
|
663
|
+
installed (see the partial-failure rule above).
|
|
664
|
+
|
|
665
|
+
**Detection probe** (used by the group's "already present" check and re-runs):
|
|
666
|
+
|
|
667
|
+
```bash
|
|
668
|
+
command -v repowise > /dev/null 2>&1 && echo "installed" || echo "not-installed"
|
|
669
|
+
[ -d "${PWD}/.repowise" ] && echo "indexed" || echo "not-indexed"
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
**Standing check — `.mcp.json` machine-specific-path hygiene, runs every pass
|
|
673
|
+
(issues #1376, #1416).** Unlike the install steps above, this check is **not**
|
|
674
|
+
gated behind the all-or-none group's accept/decline branch or the
|
|
675
|
+
"already present" skip — a repo can carry an ungitignored `.mcp.json` from a
|
|
676
|
+
Repowise install that predates this guard, and once Repowise shows as
|
|
677
|
+
already-present the accept-gated install steps above never re-run (the same
|
|
678
|
+
shape issue #1367's Graphify settings.json standing check, below, already
|
|
679
|
+
solves for a different pollution class). It is filed under the Repowise
|
|
680
|
+
sub-section because that install is the more common source of a project's
|
|
681
|
+
`.mcp.json`, but the check itself is repo-wide — it also covers a `.mcp.json`
|
|
682
|
+
written by `index-codebase` or a hand-registered MCP server. So run this scan
|
|
683
|
+
unconditionally, once per `/project-init` (and therefore `/setup`) run,
|
|
684
|
+
idempotently appending the same `.gitignore` marker block `/setup` applies
|
|
685
|
+
for its own downstream backstop check, so the two never duplicate an entry
|
|
686
|
+
regardless of which one runs first. The marker prefix (everything up to and
|
|
687
|
+
including `machine-specific MCP config`) must stay byte-identical between
|
|
688
|
+
the two blocks — `grep -qF` matches that prefix only, so the trailing
|
|
689
|
+
issue-number suffix may differ, but changing the prefix itself in only one
|
|
690
|
+
place breaks idempotency (`tests/skills/test_project_init_mcp_json_hygiene.py`
|
|
691
|
+
pins both copies):
|
|
692
|
+
|
|
693
|
+
```bash
|
|
694
|
+
MCP_MARKER="# dev-team hygiene — machine-specific MCP config"
|
|
695
|
+
if ! grep -qF "$MCP_MARKER" .gitignore 2>/dev/null; then
|
|
696
|
+
printf '\n%s\n%s\n' \
|
|
697
|
+
"$MCP_MARKER (absolute-path pollution — issues #1376, #1416)" \
|
|
698
|
+
".mcp.json" >> .gitignore
|
|
699
|
+
echo "mcp-json-gitignore-updated"
|
|
700
|
+
else
|
|
701
|
+
echo "mcp-json-gitignore-already-covered"
|
|
702
|
+
fi
|
|
703
|
+
```
|
|
704
|
+
|
|
705
|
+
This check is intentionally **not** scoped to the downstream-only, Step 2
|
|
706
|
+
`in-repo`-skip case the way `/setup`'s own backstop check is — a
|
|
707
|
+
machine-specific path in `.mcp.json` breaks every clone or teammate
|
|
708
|
+
regardless of whether the repo is this plugin's own checkout or a downstream
|
|
709
|
+
project, so this standing check applies in both.
|
|
710
|
+
|
|
711
|
+
**If `.mcp.json` is already tracked by git** (`git ls-files --error-unmatch
|
|
712
|
+
.mcp.json` exits 0), gitignoring the whole file isn't viable — a team that
|
|
713
|
+
legitimately commits `.mcp.json` to distribute other MCP servers (e.g.
|
|
714
|
+
`codegraph`, an internal org server) would lose those too (#1731). Before
|
|
715
|
+
falling back to the operator, try the finer-grained fix (#1747):
|
|
716
|
+
|
|
717
|
+
```bash
|
|
718
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/hooks/lib/mcp_json_repowise.py" relocate --cwd .
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
This strips only the `repowise` key from the tracked `.mcp.json`'s
|
|
722
|
+
`mcpServers` object — every other entry is left untouched — and re-registers
|
|
723
|
+
it at `local` scope (`claude mcp add repowise --scope local -- repowise mcp
|
|
724
|
+
"$(pwd)" --transport stdio`) instead, in that order (register succeeds
|
|
725
|
+
before the tracked entry is ever removed, so a failed registration never
|
|
726
|
+
leaves `.mcp.json` with no working entry at all). It prints one of
|
|
727
|
+
`not-tracked`, `no-repowise-entry`, `relocated`, or `relocate-failed`.
|
|
728
|
+
Record the outcome as `{"mcp_hygiene": {"repowise_relocated": "<that
|
|
729
|
+
string>"}}`.
|
|
730
|
+
|
|
731
|
+
**Residual fallback**: `relocate` only ever touches the `repowise` key. If
|
|
732
|
+
the printed outcome is `relocate-failed`, or `.mcp.json` is tracked for a
|
|
733
|
+
reason unrelated to Repowise, do not untrack it automatically — tell the
|
|
734
|
+
operator to run `git rm --cached .mcp.json` themselves, same posture as
|
|
735
|
+
#1376, and record that outcome too. Merge one of `{"mcp_hygiene":
|
|
736
|
+
{"gitignore": "added"}}`, `{"mcp_hygiene": {"gitignore":
|
|
737
|
+
"already-covered"}}`, or (when this residual fallback fires) `{"mcp_hygiene":
|
|
738
|
+
{"gitignore": "added-but-tracked"}}` into `.claude/init-state.json` — a
|
|
739
|
+
top-level key rather than nested under `repowise`, since this check runs
|
|
740
|
+
independently of Repowise's own install state. Report both outcomes as their
|
|
741
|
+
own lines in Step 6's summary below (and the caller's own report, when
|
|
742
|
+
`/setup` is the caller).
|
|
743
|
+
|
|
744
|
+
#### Graphify — native integration, opt-in, with corruption/pollution guards
|
|
745
|
+
|
|
746
|
+
Graphify (`graphifyy` on PyPI) is a multi-modal knowledge graph tool
|
|
747
|
+
(code + docs + schemas + infra + images/video). Unlike CodeGraph it is a
|
|
748
|
+
**repo-level native integration** — its installer writes a `/graphify`
|
|
749
|
+
skill, PreToolUse nudge hooks into `.claude/settings.json`, and a
|
|
750
|
+
`## graphify` section into the project's own `CLAUDE.md`.
|
|
751
|
+
|
|
752
|
+
This sub-section runs **only after the Graphify opt-in in Step 4c accepts** —
|
|
753
|
+
that is, the user said yes. Its integration is repo-level, so none of the file
|
|
754
|
+
writes below happen unless that opt-in was accepted; no model/API key is
|
|
755
|
+
required to reach or complete this sub-section — the AST build is keyless.
|
|
756
|
+
The one exception is the **Standing check** at the end of this sub-section
|
|
757
|
+
(#1367), which runs on every `/project-init` pass regardless of the opt-in
|
|
758
|
+
outcome — it audits `.claude/settings.json` for pollution left by a past
|
|
759
|
+
install, not this run's.
|
|
760
|
+
|
|
761
|
+
**Install (fallback chain):**
|
|
762
|
+
|
|
763
|
+
```bash
|
|
764
|
+
command -v uv > /dev/null 2>&1 && uv tool install graphifyy \
|
|
765
|
+
|| command -v pipx > /dev/null 2>&1 && pipx install graphifyy \
|
|
766
|
+
|| python3 -m pip install --user graphifyy
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
**Native integration, with the CLAUDE.md corruption guard.** Graphify's
|
|
770
|
+
`install --project` updater matches the literal `## graphify` header and
|
|
771
|
+
replaces everything between it and the next `##` heading — a known bug can
|
|
772
|
+
over-delete, taking unrelated pre-existing content with it. Guard every run:
|
|
773
|
+
|
|
774
|
+
1. **Snapshot** the project's `CLAUDE.md` before installing — a plain file
|
|
775
|
+
copy (e.g. `cp CLAUDE.md /tmp/claude-md-pre-graphify.bak`, or a
|
|
776
|
+
project-local temp path), regardless of whether the repo is git-tracked.
|
|
777
|
+
`git stash` is unsafe mid-flow and must not be used.
|
|
778
|
+
2. Run the installer:
|
|
779
|
+
|
|
780
|
+
```bash
|
|
781
|
+
graphify install --project
|
|
782
|
+
graphify hook install
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
3. **Diff** the snapshot against the post-install `CLAUDE.md`. If any line
|
|
786
|
+
present in the snapshot is missing from the new file, treat it as the
|
|
787
|
+
known corruption bug. (`scripts/lib/claude_md_guard.py` implements this
|
|
788
|
+
snapshot/diff/restore logic in isolation and is unit-tested at
|
|
789
|
+
`tests/scripts/test_claude_md_guard.py` — reuse its
|
|
790
|
+
`run_install_with_guard` function rather than re-deriving the diff by
|
|
791
|
+
hand.)
|
|
792
|
+
4. **On detected corruption:** restore the snapshot, then append the
|
|
793
|
+
canonical `## graphify` section text at EOF yourself. Source the
|
|
794
|
+
canonical text either by capturing graphify's own generated section from
|
|
795
|
+
a clean scratch-dir install first, or by reusing the fixed template that
|
|
796
|
+
matches this repo's own root `CLAUDE.md` `## graphify` section (see
|
|
797
|
+
`/home/user/agentic-dev-team/CLAUDE.md` for the canonical section this
|
|
798
|
+
repo already carries).
|
|
799
|
+
5. **On no corruption detected:** leave the installer's output as-is —
|
|
800
|
+
nothing further to do.
|
|
801
|
+
|
|
802
|
+
**Native integration, with the settings.json absolute-path guard (#1367).**
|
|
803
|
+
The same `graphify install --project` call also writes PreToolUse hook
|
|
804
|
+
entries into the target repo's shared, git-tracked `.claude/settings.json`,
|
|
805
|
+
using the **absolute path to the graphify binary on this machine** (e.g.
|
|
806
|
+
`/Users/alice/.local/bin/graphify`, or `uv tool`/`pipx`/`--user pip`
|
|
807
|
+
equivalents that resolve differently per machine). If that file is
|
|
808
|
+
committed as-is, it bakes one developer's path into the repo and silently
|
|
809
|
+
breaks for every other clone/teammate whose graphify binary lives
|
|
810
|
+
elsewhere. Immediately after running the installer:
|
|
811
|
+
|
|
812
|
+
1. **Scan** `.claude/settings.json`'s `hooks.PreToolUse` array for any entry
|
|
813
|
+
whose command invokes graphify via an absolute filesystem path (POSIX or
|
|
814
|
+
Windows) instead of a bare, PATH-resolved `graphify` — that is the known
|
|
815
|
+
pollution, regardless of whether it was just written by this install or
|
|
816
|
+
left over from a previous one. (`scripts/lib/settings_hook_guard.py`
|
|
817
|
+
implements this scan/relocate logic in isolation and is unit-tested at
|
|
818
|
+
`tests/scripts/test_settings_hook_guard.py` — reuse its
|
|
819
|
+
`run_install_with_guard` function, which runs the installer then applies
|
|
820
|
+
the scan, rather than re-deriving the check by hand.)
|
|
821
|
+
2. **On detected pollution:** relocate the polluting entry out of
|
|
822
|
+
`.claude/settings.json` into `.claude/settings.local.json` (already
|
|
823
|
+
gitignored, personal-machine scope — the same treatment already given to
|
|
824
|
+
the `.husky/post-commit`/`post-checkout` hooks below). The shared file
|
|
825
|
+
keeps everything else untouched. If the repo is git-tracked, check
|
|
826
|
+
`git log --all -- .claude/settings.json` — if any prior commit already
|
|
827
|
+
carries the polluting path, relocating it fixes the working tree but not
|
|
828
|
+
history; tell the operator the path may still be recoverable from history
|
|
829
|
+
and that scrubbing it (e.g. `git filter-repo`) is their call, not
|
|
830
|
+
something this guard does automatically.
|
|
831
|
+
3. **On no pollution detected:** leave the installer's output as-is —
|
|
832
|
+
nothing further to do.
|
|
833
|
+
|
|
834
|
+
**Standing check — run even when Graphify install is skipped.** The scan
|
|
835
|
+
above only fires right after a fresh install; it does nothing for a repo
|
|
836
|
+
that was graphify-installed *before* this guard existed (Graphify already
|
|
837
|
+
present means it drops out of Step 4c's "missing set" and the installer
|
|
838
|
+
never runs — see the idempotency rule above). So run this scan
|
|
839
|
+
**unconditionally, once per `/project-init` (and therefore `/setup`) run
|
|
840
|
+
whenever `.claude/settings.json` exists** — not gated behind the Graphify
|
|
841
|
+
opt-in/install branch:
|
|
842
|
+
|
|
843
|
+
```python
|
|
844
|
+
from pathlib import Path
|
|
845
|
+
from settings_hook_guard import fix_settings
|
|
846
|
+
|
|
847
|
+
fix_settings(Path(".claude/settings.json"), Path(".claude/settings.local.json"))
|
|
848
|
+
```
|
|
849
|
+
|
|
850
|
+
This is what makes `/setup` self-healing for repos that already carry the
|
|
851
|
+
baked-in path: no re-install, no opt-in prompt, just a scan-and-relocate.
|
|
852
|
+
|
|
853
|
+
**Build the graph — full extraction is the target (issue #1224, revised by
|
|
854
|
+
#1483).** `graphify extract .` is documented in its own `--help` as headless
|
|
855
|
+
full extraction (**AST + semantic LLM**) and is the invocation to run: it is
|
|
856
|
+
what indexes this plugin's multi-modal target (code + docs + schemas + infra)
|
|
857
|
+
into `graph.json`, the graph the agents actually traverse (`graphify
|
|
858
|
+
query`/`path`/`explain`). Whether the semantic pass actually runs is gated on
|
|
859
|
+
**backend health, not just key presence** — `extract` dispatches the semantic
|
|
860
|
+
pass whenever a backend is configured, and discards the completed AST work if
|
|
861
|
+
that pass then fails outright, so a naive `graphify extract .` can silently
|
|
862
|
+
produce no `graph.json` at all despite a clean AST run.
|
|
863
|
+
|
|
864
|
+
- **Idempotent:** if `graphify-out/graph.json` already exists, skip extraction
|
|
865
|
+
and offer the incremental, keyless refresh instead:
|
|
866
|
+
|
|
867
|
+
```bash
|
|
868
|
+
graphify update .
|
|
869
|
+
```
|
|
870
|
+
|
|
871
|
+
- **Before extracting, repair the selected backend if a provider key is
|
|
872
|
+
present.** Graphify auto-selects a backend from whichever key it finds
|
|
873
|
+
(`ANTHROPIC_API_KEY`, `GEMINI_API_KEY`/`GOOGLE_API_KEY` — either selects the
|
|
874
|
+
same backend, `MOONSHOT_API_KEY`, `OPENAI_API_KEY`). At least one of these
|
|
875
|
+
backends routes through an OpenAI-compatible client and needs an extra a
|
|
876
|
+
plain `uv tool install graphifyy` does not provide. If the semantic pass
|
|
877
|
+
fails citing a missing package for the selected backend, install the matching
|
|
878
|
+
extra from the **fixed, hardcoded mapping** in `scripts/dev-setup.sh`'s
|
|
879
|
+
`GRAPHIFY_SPEC` selection (keyed off the same detected provider key) —
|
|
880
|
+
never a package/extra name copied out of the failing tool's own error text,
|
|
881
|
+
which is untrusted third-party output, not a safe source for a command to
|
|
882
|
+
run. `ANTHROPIC_API_KEY` and `MOONSHOT_API_KEY` need no extra.
|
|
883
|
+
|
|
884
|
+
```bash
|
|
885
|
+
uv tool install "graphifyy[<extra from dev-setup.sh's GRAPHIFY_SPEC>]" --force # or the pipx/pip equivalent
|
|
886
|
+
```
|
|
887
|
+
|
|
888
|
+
If the extra install fails, or the failing backend has no entry in that
|
|
889
|
+
mapping, prefer selecting a backend whose deps are already present instead
|
|
890
|
+
— e.g. `graphify extract . --backend claude` when `ANTHROPIC_API_KEY` is
|
|
891
|
+
set, since that backend needs no extra.
|
|
892
|
+
|
|
893
|
+
- **Run full extraction:**
|
|
894
|
+
|
|
895
|
+
```bash
|
|
896
|
+
graphify extract .
|
|
897
|
+
```
|
|
898
|
+
|
|
899
|
+
This writes `graphify-out/graph.json` (gitignored) plus `GRAPH_REPORT.md`,
|
|
900
|
+
indexing code, docs, schemas, and infra. Without a provider key it
|
|
901
|
+
structurally clusters communities but leaves them unlabeled (`Community N`)
|
|
902
|
+
and skips inferred edges — the structure is intact.
|
|
903
|
+
- **If the semantic pass fails after the AST pass already completed:** never
|
|
904
|
+
discard that finished work. Re-run `graphify extract . --code-only` to land
|
|
905
|
+
a graph from what already succeeded, and report the result as **degraded**
|
|
906
|
+
— e.g. `Graphify: semantic pass failed (<reason>) — code-only graph built,
|
|
907
|
+
docs/images not indexed. See error above.` Never report this as a full
|
|
908
|
+
success.
|
|
909
|
+
- **`--code-only` is the fallback, never the default when a key is
|
|
910
|
+
present.** Use it directly only when no key is present or no backend can be
|
|
911
|
+
made to work, and say so plainly rather than reporting a successful full
|
|
912
|
+
build:
|
|
913
|
+
`Graphify: no usable backend — code-only graph built, docs/images not
|
|
914
|
+
indexed.`
|
|
915
|
+
- **Non-fatal:** if extraction fails outright (the AST pass itself errors),
|
|
916
|
+
print the error, merge `{"graphify": {"build_failed": true}}` into
|
|
917
|
+
`.claude/init-state.json`, and continue — never abort the rest of setup,
|
|
918
|
+
and never claim the group fully installed (the partial-failure rule).
|
|
919
|
+
Agents that consume graphify fall back to `Read`/`Grep`/`Glob` when
|
|
920
|
+
`graphify-out/` is absent (see `knowledge/codegraph-vs-graphify.md`).
|
|
921
|
+
|
|
922
|
+
**Semantic enrichment (key-gated add-on, on top of a successful full
|
|
923
|
+
extraction).** Only when a provider key is present (per Step 4c step 4) and
|
|
924
|
+
full extraction above succeeded (not the `--code-only` fallback), further
|
|
925
|
+
enrich the graph: `graphify label` names the structural communities, and
|
|
926
|
+
`graphify extract . --mode deep` adds INFERRED semantic edges. Both stay
|
|
927
|
+
non-fatal — if the key is rejected at build time the existing graph stands
|
|
928
|
+
as-is. With no key, or when the graph is `--code-only`, skip this step
|
|
929
|
+
entirely.
|
|
930
|
+
|
|
931
|
+
**Gitignore advice.** `graphify hook install` creates machine-specific
|
|
932
|
+
generated git hooks. Tell the user to gitignore them the same way this
|
|
933
|
+
repo's own root `.gitignore` does for its own graphify hooks:
|
|
934
|
+
|
|
935
|
+
```gitignore
|
|
936
|
+
graphify-out/
|
|
937
|
+
.husky/post-commit
|
|
938
|
+
.husky/post-checkout
|
|
939
|
+
```
|
|
940
|
+
|
|
941
|
+
(Or `.git/hooks/post-*` if the target repo does not use husky.)
|
|
942
|
+
|
|
943
|
+
This covers the generated **git hooks** only. The machine-specific path
|
|
944
|
+
`graphify install --project` writes into the *shared* `.claude/settings.json`
|
|
945
|
+
itself is handled separately by the settings.json absolute-path guard
|
|
946
|
+
above (#1367) — that file is not gitignored, so the fix there is to relocate
|
|
947
|
+
the polluting entry, not to gitignore the whole file.
|
|
948
|
+
|
|
949
|
+
### Step 5: Verify — post-install probes
|
|
950
|
+
|
|
951
|
+
Run each configured lane's detection probe exactly as the lane registry
|
|
952
|
+
defines it, and report per-lane status — including which provider each
|
|
953
|
+
slot bound — so the user knows `/build`'s self-heal pass will find the
|
|
954
|
+
tools:
|
|
955
|
+
|
|
956
|
+
| Lane | Probe |
|
|
957
|
+
|---|---|
|
|
958
|
+
| Python | `command -v ruff`, `command -v mypy` |
|
|
959
|
+
| JS/TS | `npx --no-install oxlint --version` (bound alternatives verify the same way: `npx --no-install biome --version`, `npx --no-install eslint --version`) |
|
|
960
|
+
| C# | `command -v dotnet` |
|
|
961
|
+
| Java | `.pmd/pmd-bin-*/bin/pmd` launcher first, then `command -v pmd` |
|
|
962
|
+
|
|
963
|
+
Then probe every capability tool that Step 4b installed, using its verify
|
|
964
|
+
command from `references/capability-tools.md`:
|
|
965
|
+
|
|
966
|
+
| Capability | Probe |
|
|
967
|
+
|---|---|
|
|
968
|
+
| semgrep | `semgrep --version` |
|
|
969
|
+
| Playwright | `npx --no-install playwright --version` |
|
|
970
|
+
| adr | `adr help` |
|
|
971
|
+
| gh | `gh --version` |
|
|
972
|
+
| docker scanners | `hadolint --version`, `trivy --version`, `grype --version` |
|
|
973
|
+
| codegraph | `command -v codegraph`, `.codegraph/` present |
|
|
974
|
+
| graphify | `graphify --version` |
|
|
975
|
+
|
|
976
|
+
A capability tool that was offered but not confirmed, or whose signal never
|
|
977
|
+
fired, is simply not probed — it is not a failure.
|
|
978
|
+
|
|
979
|
+
### Step 6: Summary
|
|
980
|
+
|
|
981
|
+
After every configured lane probes green, give the user:
|
|
982
|
+
|
|
983
|
+
- Per lane, per slot: the bound provider — kept (column 1) or newly
|
|
984
|
+
installed (column 2).
|
|
985
|
+
- Configs and tools found and left alone (columns 1 and 3 double as this
|
|
986
|
+
report).
|
|
987
|
+
- Any **found but can't participate** entry, with its reason and the
|
|
988
|
+
default offered alongside.
|
|
989
|
+
- **Capability tools** (Step 4b): which were offered, which were installed,
|
|
990
|
+
and which were skipped (signal didn't fire, or the user declined) — noting
|
|
991
|
+
Playwright is repo-level and the rest are user/system-level CLIs.
|
|
992
|
+
- **Graph tools** (Step 4c): the keyless pair — CodeGraph state
|
|
993
|
+
(installed/initialized, MCP registration command printed or skipped) and
|
|
994
|
+
Repowise state, including whether it wrote its `## Codebase Intelligence
|
|
995
|
+
for <project> (Repowise)` section to `.claude/CLAUDE.md` this run (#1670
|
|
996
|
+
item 3) — plus Graphify state: installed with native integration
|
|
997
|
+
applied (and whether the CLAUDE.md corruption guard fired and repaired
|
|
998
|
+
anything) and whether the graph it built was **full extraction** (docs and
|
|
999
|
+
images indexed) or the **`--code-only` fallback** (degraded — no provider
|
|
1000
|
+
key or no working backend), **whether semantic enrichment ran or was
|
|
1001
|
+
skipped because no provider key was detected or the graph was
|
|
1002
|
+
`--code-only`**, or declined. Note CodeGraph is strictly user-level/personal
|
|
1003
|
+
and Graphify is the repo-level native integration; only its AST pass is
|
|
1004
|
+
keyless — full extraction (docs + images) needs a working backend, and
|
|
1005
|
+
semantic enrichment is a further key-gated add-on on top of that.
|
|
1006
|
+
- **`.mcp.json` machine-specific-path hygiene** (issue #1416, runs
|
|
1007
|
+
independently of Repowise's own install/decline state): added the block,
|
|
1008
|
+
found it already covered, or — when it's git-tracked — relocated a
|
|
1009
|
+
`repowise` entry to local scope (#1747) or, if that wasn't applicable/
|
|
1010
|
+
failed, flagged that `.mcp.json` still needs `git rm --cached`.
|
|
1011
|
+
- Files created (greenfield only).
|
|
1012
|
+
|
|
1013
|
+
**Persist the idempotency snapshot (#1778).** On successful completion of
|
|
1014
|
+
this step — never on an early exit (Step 1's zero/ambiguous-stack branch,
|
|
1015
|
+
or an install failure) — merge (never overwrite the rest of the file, per
|
|
1016
|
+
the merge convention every other `.claude/init-state.json` write in this
|
|
1017
|
+
skill already follows) this top-level key:
|
|
1018
|
+
|
|
1019
|
+
```json
|
|
1020
|
+
{"last_run": {"stack": ["<detected stack list>"], "all_slots_bound": <bool>, "capability_tools_resolved": <bool>, "checked_at": "<ISO-8601 now>"}}
|
|
1021
|
+
```
|
|
1022
|
+
|
|
1023
|
+
`all_slots_bound` is `true` only when Step 3's "missing and will add"
|
|
1024
|
+
column ended up empty; `capability_tools_resolved` is `true` only when
|
|
1025
|
+
every Step 4b/4c tool is installed or durably declined, never "signal
|
|
1026
|
+
fired, decision still open." Step 0 compares only `last_run.stack` against
|
|
1027
|
+
this record; `all_slots_bound` and `capability_tools_resolved` are recorded
|
|
1028
|
+
for audit/telemetry and are deliberately re-derived live on each run, never
|
|
1029
|
+
read back from here.
|
|
1030
|
+
|
|
1031
|
+
## Greenfield JS/TS scaffold
|
|
1032
|
+
|
|
1033
|
+
Scaffold a new JavaScript project with opinionated defaults for ES modules,
|
|
1034
|
+
functional development, and modern tooling. Goal: zero to
|
|
1035
|
+
working/linted/tested in under a minute, with every config file explained
|
|
1036
|
+
and customizable.
|
|
1037
|
+
|
|
1038
|
+
Defaults:
|
|
1039
|
+
- **Package manager**: npm
|
|
1040
|
+
- **Module system**: ES Modules (`"type": "module"`)
|
|
1041
|
+
- **Style**: functional — no classes, prefer `const`, no mutation
|
|
1042
|
+
- **Formatter**: Prettier (2-space indent, single quotes, trailing commas, 100-char width)
|
|
1043
|
+
- **Linter**: oxlint — fast (Rust-based, ESLint-compatible) per-step linter for day-to-day `lint`/`lint:fix`; ESLint flat config with functional rules stays available as the deep pass (`lint:deep`) for plugin-only rules
|
|
1044
|
+
- **Editor**: EditorConfig (2-space, UTF-8, LF, trim trailing whitespace, final newline)
|
|
1045
|
+
- **Tests**: Vitest
|
|
1046
|
+
- **E2E** (frontend only): Playwright
|
|
1047
|
+
- **Git hooks**: Husky pre-commit (lint-staged auto-fix of staged files) + pre-push (test)
|
|
1048
|
+
- **`.gitignore`**: node_modules, dist, build, coverage, .env, .env.*, OS files
|
|
1049
|
+
|
|
1050
|
+
This scaffold is the **base tooling layer**. It does not replace
|
|
1051
|
+
framework-specific CLIs (`npx sv create`, `ng new`, `npm create
|
|
1052
|
+
vite@latest`). For a full framework scaffold, run the framework CLI first,
|
|
1053
|
+
then layer on these configs.
|
|
1054
|
+
|
|
1055
|
+
### Scaffold step 1: Present defaults and confirm
|
|
1056
|
+
|
|
1057
|
+
Present the defaults above as the three-column plan's **missing and will
|
|
1058
|
+
add** column and ask: "Want to change anything, or should I go ahead?"
|
|
1059
|
+
Include Playwright in the summary only if the user mentions a frontend
|
|
1060
|
+
project (React, Svelte, Angular, Vue, Next.js, Nuxt, SvelteKit, Astro, UI,
|
|
1061
|
+
web app, dashboard). Wait for confirmation before writing files. **Under
|
|
1062
|
+
`--yes`, proceed with these defaults without the customization prompt** — the
|
|
1063
|
+
scaffold only writes into an empty/near-empty directory, so nothing existing
|
|
1064
|
+
is overwritten.
|
|
1065
|
+
|
|
1066
|
+
### Scaffold step 2: Initialize package.json
|
|
1067
|
+
|
|
1068
|
+
```bash
|
|
1069
|
+
npm init -y
|
|
1070
|
+
```
|
|
1071
|
+
|
|
1072
|
+
Read the generated `package.json`, then edit to:
|
|
1073
|
+
- Add `"type": "module"`
|
|
1074
|
+
- Add the scripts block below
|
|
1075
|
+
- Remove fields that don't apply (e.g., `"main"` for non-libraries)
|
|
1076
|
+
|
|
1077
|
+
```json
|
|
1078
|
+
{
|
|
1079
|
+
"scripts": {
|
|
1080
|
+
"test": "vitest run",
|
|
1081
|
+
"test:watch": "vitest",
|
|
1082
|
+
"test:coverage": "vitest run --coverage",
|
|
1083
|
+
"lint": "oxlint .",
|
|
1084
|
+
"lint:fix": "oxlint --fix .",
|
|
1085
|
+
"lint:deep": "eslint .",
|
|
1086
|
+
"format": "prettier --write .",
|
|
1087
|
+
"format:check": "prettier --check .",
|
|
1088
|
+
"prepare": "husky"
|
|
1089
|
+
},
|
|
1090
|
+
"lint-staged": {
|
|
1091
|
+
"*.{js,mjs,cjs}": ["prettier --write", "oxlint --fix"],
|
|
1092
|
+
"*.{json,md,yaml,yml}": ["prettier --write"]
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
```
|
|
1096
|
+
|
|
1097
|
+
`lint-staged` runs Prettier (and oxlint `--fix` on JS) against only the staged
|
|
1098
|
+
files on each commit, so formatting/lint drift is corrected automatically before
|
|
1099
|
+
it lands — without scanning the whole tree. `lint:deep` runs the full ESLint
|
|
1100
|
+
pass for the framework-plugin rules oxlint lacks.
|
|
1101
|
+
|
|
1102
|
+
Frontend projects also add: `"test:e2e": "playwright test"`.
|
|
1103
|
+
|
|
1104
|
+
### Scaffold step 3: Install dependencies
|
|
1105
|
+
|
|
1106
|
+
```bash
|
|
1107
|
+
npm install -D eslint prettier vitest @eslint/js eslint-config-prettier husky lint-staged oxlint
|
|
1108
|
+
```
|
|
1109
|
+
|
|
1110
|
+
If this (or the Playwright install below) fails with `npm error code
|
|
1111
|
+
ERESOLVE`, the peer conflict is pre-existing in the repo's tree, not with the
|
|
1112
|
+
tooling being added — retry the failing command once with `--legacy-peer-deps`
|
|
1113
|
+
and note to the user that you did so, rather than aborting.
|
|
1114
|
+
|
|
1115
|
+
`eslint-config-prettier` disables ESLint rules that conflict with Prettier. Do NOT install `eslint-plugin-prettier` — run Prettier as a separate step (`npm run format:check`), not through ESLint.
|
|
1116
|
+
|
|
1117
|
+
Frontend projects also:
|
|
1118
|
+
|
|
1119
|
+
```bash
|
|
1120
|
+
npm install -D @playwright/test
|
|
1121
|
+
npx playwright install
|
|
1122
|
+
```
|
|
1123
|
+
|
|
1124
|
+
### Scaffold step 4: Create config files
|
|
1125
|
+
|
|
1126
|
+
Templates: `references/configs.md`. Required files:
|
|
1127
|
+
|
|
1128
|
+
1. `eslint.config.js` — flat config with functional rules (no classes, prefer const, no var, no param reassign)
|
|
1129
|
+
2. `prettier.config.js` — 2-space, single quotes, trailing commas, 100-char width
|
|
1130
|
+
3. `.editorconfig` — 2-space, UTF-8, LF, trim trailing whitespace, final newline
|
|
1131
|
+
4. `.gitignore` — node_modules, dist, build, coverage, .env, .env.*, OS files (DS_Store, Thumbs.db)
|
|
1132
|
+
5. `vitest.config.js` — minimal config pointing at test files
|
|
1133
|
+
6. (frontend) `playwright.config.js` — chromium, sensible defaults
|
|
1134
|
+
|
|
1135
|
+
### Scaffold step 5: Create starter files
|
|
1136
|
+
|
|
1137
|
+
```
|
|
1138
|
+
src/index.js — single exported pure function with JSDoc (e.g., greet or add)
|
|
1139
|
+
src/index.test.js — one passing vitest test for the starter function
|
|
1140
|
+
```
|
|
1141
|
+
|
|
1142
|
+
Frontend projects also create `e2e/example.spec.js` — one Playwright placeholder.
|
|
1143
|
+
|
|
1144
|
+
### Scaffold step 6: Git hooks
|
|
1145
|
+
|
|
1146
|
+
```bash
|
|
1147
|
+
git init # skip if already a git repo
|
|
1148
|
+
npx husky init
|
|
1149
|
+
```
|
|
1150
|
+
|
|
1151
|
+
Create both hooks (templates in `references/configs.md`):
|
|
1152
|
+
|
|
1153
|
+
```bash
|
|
1154
|
+
echo 'npx lint-staged' > .husky/pre-commit
|
|
1155
|
+
echo 'npm test' > .husky/pre-push
|
|
1156
|
+
```
|
|
1157
|
+
|
|
1158
|
+
`npx husky init` writes a default `pre-commit`; the command above overwrites it.
|
|
1159
|
+
|
|
1160
|
+
Frontend projects also run the e2e suite on push:
|
|
1161
|
+
|
|
1162
|
+
```bash
|
|
1163
|
+
echo 'npm test
|
|
1164
|
+
npm run test:e2e' > .husky/pre-push
|
|
1165
|
+
```
|
|
1166
|
+
|
|
1167
|
+
The pre-commit hook auto-fixes only the staged files (`prettier --write` +
|
|
1168
|
+
`oxlint --fix`) so the commit loop stays fast and clean; the pre-push hook runs
|
|
1169
|
+
the test suite to gate what goes upstream. Because lint-staged formats and lints
|
|
1170
|
+
on commit, the redundant `npm run format:check` and `npm run lint` steps are no
|
|
1171
|
+
longer needed on pre-push.
|
|
1172
|
+
|
|
1173
|
+
### Scaffold step 7: Verify
|
|
1174
|
+
|
|
1175
|
+
```bash
|
|
1176
|
+
npm run lint
|
|
1177
|
+
npm run format:check
|
|
1178
|
+
npm test
|
|
1179
|
+
```
|
|
1180
|
+
|
|
1181
|
+
If any command fails, fix it before reporting success. Show the user the test
|
|
1182
|
+
output, then finish with the shared Step 5 probes and Step 6 summary above.
|
|
1183
|
+
|
|
1184
|
+
## Customization handling
|
|
1185
|
+
|
|
1186
|
+
If the user changes the scaffold defaults:
|
|
1187
|
+
|
|
1188
|
+
| Request | Update |
|
|
1189
|
+
|---|---|
|
|
1190
|
+
| Different indent size | prettier config, editorconfig, eslint indent rule |
|
|
1191
|
+
| Tabs instead of spaces | prettier (`useTabs: true`), editorconfig (`indent_style = tab`) |
|
|
1192
|
+
| Double quotes | prettier (`singleQuote: false`) |
|
|
1193
|
+
| Different print width | prettier config |
|
|
1194
|
+
| Semicolons | prettier (`semi: true/false`) |
|
|
1195
|
+
| Yarn / pnpm | substitute the package manager in all install commands; adjust scripts if needed |
|
|
1196
|
+
| TypeScript | the scaffold's starter files are JS-only — run the framework/TS CLI first, then re-run this skill for the toolchain layer |
|
|
1197
|
+
| Additional ESLint plugins | install and add to the flat config array |
|