drt-method 1.0.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/AGENTS.md +45 -0
- package/GETTING-STARTED.md +269 -0
- package/README.md +233 -0
- package/drt-method-1.0.0.tgz +0 -0
- package/drt-modules.yaml +1 -0
- package/package.json +51 -0
- package/scripts/install-from-github.ps1 +22 -0
- package/scripts/install-from-github.sh +17 -0
- package/src/core-skills/drt-advanced-elicitation/SKILL.md +142 -0
- package/src/core-skills/drt-advanced-elicitation/methods.csv +72 -0
- package/src/core-skills/drt-brainstorming/SKILL.md +80 -0
- package/src/core-skills/drt-brainstorming/assets/brain-icons.json +166 -0
- package/src/core-skills/drt-brainstorming/assets/brain-methods.csv +109 -0
- package/src/core-skills/drt-brainstorming/assets/brain-selector.html +326 -0
- package/src/core-skills/drt-brainstorming/customize.toml +84 -0
- package/src/core-skills/drt-brainstorming/references/converge.md +24 -0
- package/src/core-skills/drt-brainstorming/references/finalize.md +26 -0
- package/src/core-skills/drt-brainstorming/references/headless.md +54 -0
- package/src/core-skills/drt-brainstorming/references/in-chat-techniques.md +18 -0
- package/src/core-skills/drt-brainstorming/references/mode-autonomous.md +10 -0
- package/src/core-skills/drt-brainstorming/references/mode-facilitator.md +11 -0
- package/src/core-skills/drt-brainstorming/references/mode-partner.md +16 -0
- package/src/core-skills/drt-brainstorming/references/resume.md +5 -0
- package/src/core-skills/drt-brainstorming/scripts/brain.py +740 -0
- package/src/core-skills/drt-customize/SKILL.md +111 -0
- package/src/core-skills/drt-customize/scripts/list_customizable_skills.py +231 -0
- package/src/core-skills/drt-editorial-review-prose/SKILL.md +86 -0
- package/src/core-skills/drt-editorial-review-structure/SKILL.md +179 -0
- package/src/core-skills/drt-forge-idea/SKILL.md +107 -0
- package/src/core-skills/drt-forge-idea/customize.toml +42 -0
- package/src/core-skills/drt-forge-idea/scripts/resolve_personas.py +270 -0
- package/src/core-skills/drt-help/SKILL.md +75 -0
- package/src/core-skills/drt-index-docs/SKILL.md +66 -0
- package/src/core-skills/drt-party-mode/SKILL.md +60 -0
- package/src/core-skills/drt-party-mode/customize.toml +211 -0
- package/src/core-skills/drt-party-mode/references/create-party.md +70 -0
- package/src/core-skills/drt-party-mode/references/mode-agent-team.md +13 -0
- package/src/core-skills/drt-party-mode/references/mode-auto.md +13 -0
- package/src/core-skills/drt-party-mode/references/mode-subagent.md +31 -0
- package/src/core-skills/drt-party-mode/references/party-memory.md +51 -0
- package/src/core-skills/drt-party-mode/scripts/resolve_party.py +272 -0
- package/src/core-skills/drt-review-adversarial-general/SKILL.md +37 -0
- package/src/core-skills/drt-review-edge-case-hunter/SKILL.md +73 -0
- package/src/core-skills/drt-review-edge-case-hunter/references/deletion-check.md +14 -0
- package/src/core-skills/drt-review-verification-gap/SKILL.md +106 -0
- package/src/core-skills/drt-shard-doc/SKILL.md +105 -0
- package/src/core-skills/drt-spec/SKILL.md +160 -0
- package/src/core-skills/drt-spec/assets/headless-schemas.md +33 -0
- package/src/core-skills/drt-spec/assets/spec-template.md +49 -0
- package/src/core-skills/drt-spec/assets/stories-schema.md +44 -0
- package/src/core-skills/drt-spec/customize.toml +53 -0
- package/src/core-skills/module-help.csv +14 -0
- package/src/core-skills/module.yaml +33 -0
- package/src/drt-skills/1-analysis/drt-agent-analyst/SKILL.md +76 -0
- package/src/drt-skills/1-analysis/drt-agent-analyst/customize.toml +90 -0
- package/src/drt-skills/1-analysis/drt-agent-tech-writer/SKILL.md +76 -0
- package/src/drt-skills/1-analysis/drt-agent-tech-writer/customize.toml +81 -0
- package/src/drt-skills/1-analysis/drt-agent-tech-writer/explain-concept.md +20 -0
- package/src/drt-skills/1-analysis/drt-agent-tech-writer/mermaid-gen.md +20 -0
- package/src/drt-skills/1-analysis/drt-agent-tech-writer/validate-doc.md +19 -0
- package/src/drt-skills/1-analysis/drt-agent-tech-writer/write-document.md +20 -0
- package/src/drt-skills/1-analysis/drt-document-project/SKILL.md +62 -0
- package/src/drt-skills/1-analysis/drt-document-project/checklist.md +245 -0
- package/src/drt-skills/1-analysis/drt-document-project/customize.toml +41 -0
- package/src/drt-skills/1-analysis/drt-document-project/documentation-requirements.csv +12 -0
- package/src/drt-skills/1-analysis/drt-document-project/instructions.md +128 -0
- package/src/drt-skills/1-analysis/drt-document-project/templates/deep-dive-template.md +345 -0
- package/src/drt-skills/1-analysis/drt-document-project/templates/index-template.md +169 -0
- package/src/drt-skills/1-analysis/drt-document-project/templates/project-overview-template.md +103 -0
- package/src/drt-skills/1-analysis/drt-document-project/templates/project-scan-report-schema.json +160 -0
- package/src/drt-skills/1-analysis/drt-document-project/templates/source-tree-template.md +135 -0
- package/src/drt-skills/1-analysis/drt-document-project/workflows/deep-dive-instructions.md +300 -0
- package/src/drt-skills/1-analysis/drt-document-project/workflows/deep-dive-workflow.md +34 -0
- package/src/drt-skills/1-analysis/drt-document-project/workflows/full-scan-instructions.md +1111 -0
- package/src/drt-skills/1-analysis/drt-document-project/workflows/full-scan-workflow.md +34 -0
- package/src/drt-skills/1-analysis/drt-prfaq/SKILL.md +135 -0
- package/src/drt-skills/1-analysis/drt-prfaq/agents/artifact-analyzer.md +60 -0
- package/src/drt-skills/1-analysis/drt-prfaq/agents/web-researcher.md +49 -0
- package/src/drt-skills/1-analysis/drt-prfaq/assets/prfaq-template.md +62 -0
- package/src/drt-skills/1-analysis/drt-prfaq/bmad-manifest.json +16 -0
- package/src/drt-skills/1-analysis/drt-prfaq/customize.toml +41 -0
- package/src/drt-skills/1-analysis/drt-prfaq/references/customer-faq.md +55 -0
- package/src/drt-skills/1-analysis/drt-prfaq/references/internal-faq.md +51 -0
- package/src/drt-skills/1-analysis/drt-prfaq/references/press-release.md +60 -0
- package/src/drt-skills/1-analysis/drt-prfaq/references/verdict.md +83 -0
- package/src/drt-skills/1-analysis/drt-product-brief/SKILL.md +91 -0
- package/src/drt-skills/1-analysis/drt-product-brief/assets/brief-template.md +41 -0
- package/src/drt-skills/1-analysis/drt-product-brief/customize.toml +99 -0
- package/src/drt-skills/1-analysis/research/drt-domain-research/SKILL.md +96 -0
- package/src/drt-skills/1-analysis/research/drt-domain-research/customize.toml +41 -0
- package/src/drt-skills/1-analysis/research/drt-domain-research/domain-steps/step-01-init.md +137 -0
- package/src/drt-skills/1-analysis/research/drt-domain-research/domain-steps/step-02-domain-analysis.md +229 -0
- package/src/drt-skills/1-analysis/research/drt-domain-research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/src/drt-skills/1-analysis/research/drt-domain-research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/src/drt-skills/1-analysis/research/drt-domain-research/domain-steps/step-05-technical-trends.md +234 -0
- package/src/drt-skills/1-analysis/research/drt-domain-research/domain-steps/step-06-research-synthesis.md +450 -0
- package/src/drt-skills/1-analysis/research/drt-domain-research/research.template.md +29 -0
- package/src/drt-skills/1-analysis/research/drt-market-research/SKILL.md +96 -0
- package/src/drt-skills/1-analysis/research/drt-market-research/customize.toml +41 -0
- package/src/drt-skills/1-analysis/research/drt-market-research/research.template.md +29 -0
- package/src/drt-skills/1-analysis/research/drt-market-research/steps/step-01-init.md +184 -0
- package/src/drt-skills/1-analysis/research/drt-market-research/steps/step-02-customer-behavior.md +239 -0
- package/src/drt-skills/1-analysis/research/drt-market-research/steps/step-03-customer-pain-points.md +251 -0
- package/src/drt-skills/1-analysis/research/drt-market-research/steps/step-04-customer-decisions.md +261 -0
- package/src/drt-skills/1-analysis/research/drt-market-research/steps/step-05-competitive-analysis.md +173 -0
- package/src/drt-skills/1-analysis/research/drt-market-research/steps/step-06-research-completion.md +484 -0
- package/src/drt-skills/1-analysis/research/drt-technical-research/SKILL.md +96 -0
- package/src/drt-skills/1-analysis/research/drt-technical-research/customize.toml +41 -0
- package/src/drt-skills/1-analysis/research/drt-technical-research/research.template.md +29 -0
- package/src/drt-skills/1-analysis/research/drt-technical-research/technical-steps/step-01-init.md +137 -0
- package/src/drt-skills/1-analysis/research/drt-technical-research/technical-steps/step-02-technical-overview.md +239 -0
- package/src/drt-skills/1-analysis/research/drt-technical-research/technical-steps/step-03-integration-patterns.md +248 -0
- package/src/drt-skills/1-analysis/research/drt-technical-research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/src/drt-skills/1-analysis/research/drt-technical-research/technical-steps/step-05-implementation-research.md +233 -0
- package/src/drt-skills/1-analysis/research/drt-technical-research/technical-steps/step-06-research-synthesis.md +493 -0
- package/src/drt-skills/2-plan-workflows/drt-agent-pm/SKILL.md +76 -0
- package/src/drt-skills/2-plan-workflows/drt-agent-pm/customize.toml +75 -0
- package/src/drt-skills/2-plan-workflows/drt-agent-ux-designer/SKILL.md +76 -0
- package/src/drt-skills/2-plan-workflows/drt-agent-ux-designer/customize.toml +60 -0
- package/src/drt-skills/2-plan-workflows/drt-create-prd/SKILL.md +30 -0
- package/src/drt-skills/2-plan-workflows/drt-create-prd/customize.toml +41 -0
- package/src/drt-skills/2-plan-workflows/drt-edit-prd/SKILL.md +30 -0
- package/src/drt-skills/2-plan-workflows/drt-edit-prd/customize.toml +42 -0
- package/src/drt-skills/2-plan-workflows/drt-prd/SKILL.md +92 -0
- package/src/drt-skills/2-plan-workflows/drt-prd/assets/headless-schemas.md +76 -0
- package/src/drt-skills/2-plan-workflows/drt-prd/assets/prd-template.md +165 -0
- package/src/drt-skills/2-plan-workflows/drt-prd/assets/prd-validation-checklist.md +135 -0
- package/src/drt-skills/2-plan-workflows/drt-prd/assets/validation-report-template.html +325 -0
- package/src/drt-skills/2-plan-workflows/drt-prd/customize.toml +147 -0
- package/src/drt-skills/2-plan-workflows/drt-prd/references/headless.md +39 -0
- package/src/drt-skills/2-plan-workflows/drt-prd/references/validate.md +97 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/SKILL.md +90 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/assets/color-themes.md +9 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/assets/design-directions.md +9 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/assets/design-example-editorial.md +158 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/assets/design-example-mobile.md +93 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/assets/design-example-shadcn.md +109 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/assets/excalidraw-wireframe.md +19 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/assets/experience-example-mobile.md +112 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/assets/experience-example-shadcn.md +133 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/assets/headless-schemas.md +84 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/assets/key-screens.md +29 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/assets/validation-report-template.html +319 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/customize.toml +100 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/references/creative-tools.md +19 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/references/design-md-spec.md +50 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/references/headless.md +37 -0
- package/src/drt-skills/2-plan-workflows/drt-ux/references/validate.md +115 -0
- package/src/drt-skills/2-plan-workflows/drt-validate-prd/SKILL.md +30 -0
- package/src/drt-skills/2-plan-workflows/drt-validate-prd/customize.toml +42 -0
- package/src/drt-skills/3-solutioning/drt-agent-architect/SKILL.md +76 -0
- package/src/drt-skills/3-solutioning/drt-agent-architect/customize.toml +65 -0
- package/src/drt-skills/3-solutioning/drt-architecture/SKILL.md +85 -0
- package/src/drt-skills/3-solutioning/drt-architecture/assets/spine-template.md +79 -0
- package/src/drt-skills/3-solutioning/drt-architecture/customize.toml +100 -0
- package/src/drt-skills/3-solutioning/drt-architecture/references/headless.md +26 -0
- package/src/drt-skills/3-solutioning/drt-architecture/references/reviewer-gate.md +13 -0
- package/src/drt-skills/3-solutioning/drt-architecture/scripts/lint_spine.py +257 -0
- package/src/drt-skills/3-solutioning/drt-check-implementation-readiness/SKILL.md +91 -0
- package/src/drt-skills/3-solutioning/drt-check-implementation-readiness/customize.toml +41 -0
- package/src/drt-skills/3-solutioning/drt-check-implementation-readiness/steps/step-01-document-discovery.md +179 -0
- package/src/drt-skills/3-solutioning/drt-check-implementation-readiness/steps/step-02-prd-analysis.md +168 -0
- package/src/drt-skills/3-solutioning/drt-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +169 -0
- package/src/drt-skills/3-solutioning/drt-check-implementation-readiness/steps/step-04-ux-alignment.md +129 -0
- package/src/drt-skills/3-solutioning/drt-check-implementation-readiness/steps/step-05-epic-quality-review.md +241 -0
- package/src/drt-skills/3-solutioning/drt-check-implementation-readiness/steps/step-06-final-assessment.md +132 -0
- package/src/drt-skills/3-solutioning/drt-check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/src/drt-skills/3-solutioning/drt-create-architecture/SKILL.md +30 -0
- package/src/drt-skills/3-solutioning/drt-create-architecture/customize.toml +41 -0
- package/src/drt-skills/3-solutioning/drt-create-epics-and-stories/SKILL.md +93 -0
- package/src/drt-skills/3-solutioning/drt-create-epics-and-stories/customize.toml +41 -0
- package/src/drt-skills/3-solutioning/drt-create-epics-and-stories/steps/step-01-validate-prerequisites.md +263 -0
- package/src/drt-skills/3-solutioning/drt-create-epics-and-stories/steps/step-02-design-epics.md +242 -0
- package/src/drt-skills/3-solutioning/drt-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
- package/src/drt-skills/3-solutioning/drt-create-epics-and-stories/steps/step-04-final-validation.md +143 -0
- package/src/drt-skills/3-solutioning/drt-create-epics-and-stories/templates/epics-template.md +61 -0
- package/src/drt-skills/3-solutioning/drt-generate-project-context/SKILL.md +81 -0
- package/src/drt-skills/3-solutioning/drt-generate-project-context/customize.toml +41 -0
- package/src/drt-skills/3-solutioning/drt-generate-project-context/project-context-template.md +21 -0
- package/src/drt-skills/3-solutioning/drt-generate-project-context/steps/step-01-discover.md +186 -0
- package/src/drt-skills/3-solutioning/drt-generate-project-context/steps/step-02-generate.md +321 -0
- package/src/drt-skills/3-solutioning/drt-generate-project-context/steps/step-03-complete.md +284 -0
- package/src/drt-skills/4-implementation/drt-agent-dev/SKILL.md +76 -0
- package/src/drt-skills/4-implementation/drt-agent-dev/customize.toml +95 -0
- package/src/drt-skills/4-implementation/drt-checkpoint-preview/SKILL.md +68 -0
- package/src/drt-skills/4-implementation/drt-checkpoint-preview/customize.toml +41 -0
- package/src/drt-skills/4-implementation/drt-checkpoint-preview/generate-trail.md +38 -0
- package/src/drt-skills/4-implementation/drt-checkpoint-preview/step-01-orientation.md +105 -0
- package/src/drt-skills/4-implementation/drt-checkpoint-preview/step-02-walkthrough.md +89 -0
- package/src/drt-skills/4-implementation/drt-checkpoint-preview/step-03-detail-pass.md +106 -0
- package/src/drt-skills/4-implementation/drt-checkpoint-preview/step-04-testing.md +74 -0
- package/src/drt-skills/4-implementation/drt-checkpoint-preview/step-05-wrapup.md +30 -0
- package/src/drt-skills/4-implementation/drt-code-review/SKILL.md +90 -0
- package/src/drt-skills/4-implementation/drt-code-review/customize.toml +93 -0
- package/src/drt-skills/4-implementation/drt-code-review/steps/step-01-gather-context.md +84 -0
- package/src/drt-skills/4-implementation/drt-code-review/steps/step-02-review.md +32 -0
- package/src/drt-skills/4-implementation/drt-code-review/steps/step-03-triage.md +50 -0
- package/src/drt-skills/4-implementation/drt-code-review/steps/step-04-present.md +132 -0
- package/src/drt-skills/4-implementation/drt-correct-course/SKILL.md +301 -0
- package/src/drt-skills/4-implementation/drt-correct-course/checklist.md +288 -0
- package/src/drt-skills/4-implementation/drt-correct-course/customize.toml +41 -0
- package/src/drt-skills/4-implementation/drt-create-story/SKILL.md +432 -0
- package/src/drt-skills/4-implementation/drt-create-story/checklist.md +357 -0
- package/src/drt-skills/4-implementation/drt-create-story/customize.toml +41 -0
- package/src/drt-skills/4-implementation/drt-create-story/discover-inputs.md +88 -0
- package/src/drt-skills/4-implementation/drt-create-story/template.md +49 -0
- package/src/drt-skills/4-implementation/drt-dev-auto/SKILL.md +123 -0
- package/src/drt-skills/4-implementation/drt-dev-auto/compile-epic-context.md +62 -0
- package/src/drt-skills/4-implementation/drt-dev-auto/customize.toml +108 -0
- package/src/drt-skills/4-implementation/drt-dev-auto/spec-template.md +98 -0
- package/src/drt-skills/4-implementation/drt-dev-auto/step-01-clarify-and-route.md +84 -0
- package/src/drt-skills/4-implementation/drt-dev-auto/step-02-plan.md +31 -0
- package/src/drt-skills/4-implementation/drt-dev-auto/step-03-implement.md +42 -0
- package/src/drt-skills/4-implementation/drt-dev-auto/step-04-review.md +95 -0
- package/src/drt-skills/4-implementation/drt-dev-story/SKILL.md +500 -0
- package/src/drt-skills/4-implementation/drt-dev-story/checklist.md +80 -0
- package/src/drt-skills/4-implementation/drt-dev-story/customize.toml +41 -0
- package/src/drt-skills/4-implementation/drt-implement-task/SKILL.md +101 -0
- package/src/drt-skills/4-implementation/drt-implement-task/assets/task-spec-template.md +60 -0
- package/src/drt-skills/4-implementation/drt-implement-task/customize.toml +17 -0
- package/src/drt-skills/4-implementation/drt-implement-task/steps/step-01-gather-intent.md +42 -0
- package/src/drt-skills/4-implementation/drt-implement-task/steps/step-02-plan-and-approve.md +43 -0
- package/src/drt-skills/4-implementation/drt-implement-task/steps/step-03-confirm-dependencies.md +38 -0
- package/src/drt-skills/4-implementation/drt-implement-task/steps/step-04-implement.md +42 -0
- package/src/drt-skills/4-implementation/drt-implement-task/steps/step-05-qc-test.md +31 -0
- package/src/drt-skills/4-implementation/drt-implement-task/steps/step-06-quality-review.md +30 -0
- package/src/drt-skills/4-implementation/drt-implement-task/steps/step-07-fix-findings.md +33 -0
- package/src/drt-skills/4-implementation/drt-implement-task/steps/step-08-complete.md +35 -0
- package/src/drt-skills/4-implementation/drt-qa-generate-e2e-tests/SKILL.md +176 -0
- package/src/drt-skills/4-implementation/drt-qa-generate-e2e-tests/checklist.md +33 -0
- package/src/drt-skills/4-implementation/drt-qa-generate-e2e-tests/customize.toml +41 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/SKILL.md +13 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/compile-epic-context.md +62 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/customize.toml +83 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/render.js +206 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/spec-template.md +89 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/step-01-clarify-and-route.md +103 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/step-02-plan.md +47 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/step-03-implement.md +45 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/step-04-review.md +55 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/step-05-present.md +78 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/step-oneshot.md +78 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/sync-sprint-status.md +19 -0
- package/src/drt-skills/4-implementation/drt-quick-dev/workflow.md +85 -0
- package/src/drt-skills/4-implementation/drt-retrospective/SKILL.md +1527 -0
- package/src/drt-skills/4-implementation/drt-retrospective/customize.toml +41 -0
- package/src/drt-skills/4-implementation/drt-sprint-planning/SKILL.md +319 -0
- package/src/drt-skills/4-implementation/drt-sprint-planning/checklist.md +34 -0
- package/src/drt-skills/4-implementation/drt-sprint-planning/customize.toml +41 -0
- package/src/drt-skills/4-implementation/drt-sprint-planning/sprint-status-template.yaml +69 -0
- package/src/drt-skills/4-implementation/drt-sprint-status/SKILL.md +311 -0
- package/src/drt-skills/4-implementation/drt-sprint-status/customize.toml +41 -0
- package/src/drt-skills/module-help.csv +32 -0
- package/src/drt-skills/module.yaml +95 -0
- package/src/scripts/lib/load-toml.js +43 -0
- package/src/scripts/lib/merge-utils.js +89 -0
- package/src/scripts/memlog.js +184 -0
- package/src/scripts/package.json +7 -0
- package/src/scripts/resolve-config.js +56 -0
- package/src/scripts/resolve-customization.js +77 -0
- package/tools/installer/cli-utils.js +53 -0
- package/tools/installer/commands/install.js +149 -0
- package/tools/installer/commands/status.js +65 -0
- package/tools/installer/commands/uninstall.js +167 -0
- package/tools/installer/core/config.js +73 -0
- package/tools/installer/core/existing-install.js +121 -0
- package/tools/installer/core/install-paths.js +132 -0
- package/tools/installer/core/installer.js +1762 -0
- package/tools/installer/core/legacy-warnings.js +151 -0
- package/tools/installer/core/manifest-generator.js +859 -0
- package/tools/installer/core/manifest.js +433 -0
- package/tools/installer/core/uv-check.js +97 -0
- package/tools/installer/core/wsl-node-check.js +109 -0
- package/tools/installer/drt-cli.js +104 -0
- package/tools/installer/file-ops.js +204 -0
- package/tools/installer/fs-native.js +116 -0
- package/tools/installer/ide/_config-driven.js +972 -0
- package/tools/installer/ide/manager.js +324 -0
- package/tools/installer/ide/platform-codes.js +80 -0
- package/tools/installer/ide/platform-codes.yaml +343 -0
- package/tools/installer/ide/shared/installed-skills.js +50 -0
- package/tools/installer/ide/shared/path-utils.js +217 -0
- package/tools/installer/ide/shared/skill-manifest.js +57 -0
- package/tools/installer/install-messages.yaml +29 -0
- package/tools/installer/list-options.js +210 -0
- package/tools/installer/message-loader.js +83 -0
- package/tools/installer/modules/channel-plan.js +203 -0
- package/tools/installer/modules/channel-resolver.js +241 -0
- package/tools/installer/modules/custom-module-manager.js +918 -0
- package/tools/installer/modules/external-manager.js +667 -0
- package/tools/installer/modules/module-help-schema.js +13 -0
- package/tools/installer/modules/official-modules.js +2257 -0
- package/tools/installer/modules/plugin-resolver.js +398 -0
- package/tools/installer/modules/version-resolver.js +336 -0
- package/tools/installer/project-root.js +224 -0
- package/tools/installer/prompts.js +852 -0
- package/tools/installer/set-overrides.js +330 -0
- package/tools/installer/ui.js +2090 -0
- package/tools/installer/yaml-format.js +245 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
const { DRT_FOLDER_NAME } = require('./shared/path-utils');
|
|
2
|
+
const prompts = require('../prompts');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* IDE Manager - handles IDE-specific setup
|
|
6
|
+
* Dynamically discovers and loads IDE handlers
|
|
7
|
+
*
|
|
8
|
+
* Loading strategy:
|
|
9
|
+
* All platforms are config-driven from platform-codes.yaml.
|
|
10
|
+
*/
|
|
11
|
+
class IdeManager {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.handlers = new Map();
|
|
14
|
+
this._initialized = false;
|
|
15
|
+
this.drtFolderName = DRT_FOLDER_NAME; // Default, can be overridden
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Set the drt folder name for all IDE handlers
|
|
20
|
+
* @param {string} drtFolderName - The drt folder name
|
|
21
|
+
*/
|
|
22
|
+
setDrtFolderName(drtFolderName) {
|
|
23
|
+
this.drtFolderName = drtFolderName;
|
|
24
|
+
// Update all loaded handlers
|
|
25
|
+
for (const handler of this.handlers.values()) {
|
|
26
|
+
if (typeof handler.setDrtFolderName === 'function') {
|
|
27
|
+
handler.setDrtFolderName(drtFolderName);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Ensure handlers are loaded (lazy loading)
|
|
34
|
+
*/
|
|
35
|
+
async ensureInitialized() {
|
|
36
|
+
if (!this._initialized) {
|
|
37
|
+
await this.loadHandlers();
|
|
38
|
+
this._initialized = true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Dynamically load all IDE handlers from platform-codes.yaml
|
|
44
|
+
*/
|
|
45
|
+
async loadHandlers() {
|
|
46
|
+
await this.loadConfigDrivenHandlers();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Load config-driven handlers from platform-codes.yaml
|
|
51
|
+
* This creates ConfigDrivenIdeSetup instances for platforms with installer config
|
|
52
|
+
*/
|
|
53
|
+
async loadConfigDrivenHandlers() {
|
|
54
|
+
const { loadPlatformCodes } = require('./platform-codes');
|
|
55
|
+
const platformConfig = await loadPlatformCodes();
|
|
56
|
+
|
|
57
|
+
const { ConfigDrivenIdeSetup } = require('./_config-driven');
|
|
58
|
+
|
|
59
|
+
for (const [platformCode, platformInfo] of Object.entries(platformConfig.platforms)) {
|
|
60
|
+
// Skip if no installer config (platform may not need installation)
|
|
61
|
+
if (!platformInfo.installer) continue;
|
|
62
|
+
|
|
63
|
+
const handler = new ConfigDrivenIdeSetup(platformCode, platformInfo);
|
|
64
|
+
if (typeof handler.setDrtFolderName === 'function') {
|
|
65
|
+
handler.setDrtFolderName(this.drtFolderName);
|
|
66
|
+
}
|
|
67
|
+
this.handlers.set(platformCode, handler);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Get all available IDEs with their metadata
|
|
73
|
+
* @returns {Array} Array of IDE information objects
|
|
74
|
+
*/
|
|
75
|
+
getAvailableIdes() {
|
|
76
|
+
const ides = [];
|
|
77
|
+
|
|
78
|
+
for (const [key, handler] of this.handlers) {
|
|
79
|
+
// Skip handlers without valid names
|
|
80
|
+
const name = handler.displayName || handler.name || key;
|
|
81
|
+
|
|
82
|
+
// Filter out invalid entries (undefined name, empty key, etc.)
|
|
83
|
+
if (!key || !name || typeof key !== 'string' || typeof name !== 'string') {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Skip suspended platforms (e.g., IDE doesn't support skills yet)
|
|
88
|
+
if (handler.platformConfig?.suspended) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
ides.push({
|
|
93
|
+
value: key,
|
|
94
|
+
name: name,
|
|
95
|
+
preferred: handler.preferred || false,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Sort: preferred first, then alphabetical
|
|
100
|
+
ides.sort((a, b) => {
|
|
101
|
+
if (a.preferred && !b.preferred) return -1;
|
|
102
|
+
if (!a.preferred && b.preferred) return 1;
|
|
103
|
+
return a.name.localeCompare(b.name);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
return ides;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Get preferred IDEs
|
|
111
|
+
* @returns {Array} Array of preferred IDE information
|
|
112
|
+
*/
|
|
113
|
+
getPreferredIdes() {
|
|
114
|
+
return this.getAvailableIdes().filter((ide) => ide.preferred);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Get non-preferred IDEs
|
|
119
|
+
* @returns {Array} Array of non-preferred IDE information
|
|
120
|
+
*/
|
|
121
|
+
getOtherIdes() {
|
|
122
|
+
return this.getAvailableIdes().filter((ide) => !ide.preferred);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Setup IDE configuration
|
|
127
|
+
* @param {string} ideName - Name of the IDE
|
|
128
|
+
* @param {string} projectDir - Project directory
|
|
129
|
+
* @param {string} drtDir - DRT installation directory
|
|
130
|
+
* @param {Object} options - Setup options
|
|
131
|
+
*/
|
|
132
|
+
async setup(ideName, projectDir, drtDir, options = {}) {
|
|
133
|
+
const handler = this.handlers.get(ideName.toLowerCase());
|
|
134
|
+
|
|
135
|
+
if (!handler) {
|
|
136
|
+
await prompts.log.warn(`IDE '${ideName}' is not yet supported`);
|
|
137
|
+
await prompts.log.message(`Supported IDEs: ${[...this.handlers.keys()].join(', ')}`);
|
|
138
|
+
return { success: false, ide: ideName, error: 'unsupported IDE' };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Block suspended platforms — clean up legacy files but don't install
|
|
142
|
+
if (handler.platformConfig?.suspended) {
|
|
143
|
+
if (!options.silent) {
|
|
144
|
+
await prompts.log.warn(`${handler.displayName || ideName}: ${handler.platformConfig.suspended}`);
|
|
145
|
+
}
|
|
146
|
+
// Still clean up legacy artifacts so old broken configs don't linger
|
|
147
|
+
if (typeof handler.cleanup === 'function') {
|
|
148
|
+
try {
|
|
149
|
+
await handler.cleanup(projectDir, { silent: true });
|
|
150
|
+
} catch {
|
|
151
|
+
// Best-effort cleanup — don't let stale files block the suspended result
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return { success: false, ide: ideName, error: 'suspended' };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
const handlerResult = await handler.setup(projectDir, drtDir, options);
|
|
159
|
+
// Build detail string from handler-returned data
|
|
160
|
+
let detail = '';
|
|
161
|
+
if (handlerResult && handlerResult.results) {
|
|
162
|
+
const r = handlerResult.results;
|
|
163
|
+
let count = r.skillDirectories || r.skills || 0;
|
|
164
|
+
// Dedup'd platform: report the count its peer wrote so the user sees
|
|
165
|
+
// a consistent picture across all platforms sharing the dir.
|
|
166
|
+
if (count === 0 && r.sharedTargetHandledByPeer && options.sharedSkillCount) {
|
|
167
|
+
count = options.sharedSkillCount;
|
|
168
|
+
}
|
|
169
|
+
const targetDir = handler.installerConfig?.target_dir || null;
|
|
170
|
+
if (count > 0 && targetDir) {
|
|
171
|
+
detail = `${count} skills → ${targetDir}`;
|
|
172
|
+
} else if (count > 0) {
|
|
173
|
+
detail = `${count} skills`;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Propagate handler's success status (default true for backward compat)
|
|
177
|
+
const success = handlerResult?.success !== false;
|
|
178
|
+
return { success, ide: ideName, detail, error: handlerResult?.error, handlerResult };
|
|
179
|
+
} catch (error) {
|
|
180
|
+
await prompts.log.error(`Failed to setup ${ideName}: ${error.message}`);
|
|
181
|
+
return { success: false, ide: ideName, error: error.message };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Run setup for multiple IDEs as a single batch.
|
|
187
|
+
* Dedupes work when several selected platforms share the same target_dir:
|
|
188
|
+
* the first platform owns the directory write, peers skip it.
|
|
189
|
+
* @param {Array<string>} ideList - IDE names to set up
|
|
190
|
+
* @param {string} projectDir
|
|
191
|
+
* @param {string} drtDir
|
|
192
|
+
* @param {Object} [options] - Forwarded to each handler.setup
|
|
193
|
+
* @returns {Promise<Array>} Per-IDE results
|
|
194
|
+
*/
|
|
195
|
+
async setupBatch(ideList, projectDir, drtDir, options = {}) {
|
|
196
|
+
await this.ensureInitialized();
|
|
197
|
+
const results = [];
|
|
198
|
+
// target_dir → { firstIde, skillCount } from the platform that actually wrote it
|
|
199
|
+
const claimedTargets = new Map();
|
|
200
|
+
|
|
201
|
+
for (const ideName of ideList) {
|
|
202
|
+
const handler = this.handlers.get(ideName.toLowerCase());
|
|
203
|
+
if (!handler) {
|
|
204
|
+
results.push(await this.setup(ideName, projectDir, drtDir, options));
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const target = handler.installerConfig?.target_dir || null;
|
|
209
|
+
const claim = target ? claimedTargets.get(target) : null;
|
|
210
|
+
const skipTarget = !!claim;
|
|
211
|
+
|
|
212
|
+
const result = await this.setup(ideName, projectDir, drtDir, {
|
|
213
|
+
...options,
|
|
214
|
+
skipTarget,
|
|
215
|
+
sharedWith: claim?.firstIde || null,
|
|
216
|
+
sharedTarget: target,
|
|
217
|
+
sharedSkillCount: claim?.skillCount || 0,
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
if (target && !claim) {
|
|
221
|
+
const writtenCount = result.handlerResult?.results?.skillDirectories || result.handlerResult?.results?.skills || 0;
|
|
222
|
+
// Only claim the target when the install actually succeeded and wrote skills.
|
|
223
|
+
// If the first platform fails (ancestor conflict, exception, etc.), leave the
|
|
224
|
+
// dir unclaimed so the next peer becomes the new first writer instead of
|
|
225
|
+
// silently skipping into a broken/empty target_dir.
|
|
226
|
+
if (result.success && writtenCount > 0) {
|
|
227
|
+
claimedTargets.set(target, { firstIde: ideName, skillCount: writtenCount });
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
results.push(result);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return results;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Cleanup IDE configurations
|
|
238
|
+
* @param {string} projectDir - Project directory
|
|
239
|
+
* @param {Object} [options] - Cleanup options passed through to handlers
|
|
240
|
+
*/
|
|
241
|
+
async cleanup(projectDir, options = {}) {
|
|
242
|
+
const results = [];
|
|
243
|
+
|
|
244
|
+
for (const [name, handler] of this.handlers) {
|
|
245
|
+
try {
|
|
246
|
+
await handler.cleanup(projectDir, options);
|
|
247
|
+
results.push({ ide: name, success: true });
|
|
248
|
+
} catch (error) {
|
|
249
|
+
results.push({ ide: name, success: false, error: error.message });
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return results;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Cleanup only the IDEs in the provided list
|
|
258
|
+
* Falls back to cleanup() (all handlers) if ideList is empty or undefined
|
|
259
|
+
* @param {string} projectDir - Project directory
|
|
260
|
+
* @param {Array<string>} ideList - List of IDE names to clean up
|
|
261
|
+
* @param {Object} [options] - Cleanup options passed through to handlers
|
|
262
|
+
* options.remainingIdes - IDE names still installed after this cleanup; used
|
|
263
|
+
* to skip target_dir wipe when a co-installed platform shares the dir.
|
|
264
|
+
* @returns {Array} Results array
|
|
265
|
+
*/
|
|
266
|
+
async cleanupByList(projectDir, ideList, options = {}) {
|
|
267
|
+
if (!ideList || ideList.length === 0) {
|
|
268
|
+
return this.cleanup(projectDir, options);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
await this.ensureInitialized();
|
|
272
|
+
const results = [];
|
|
273
|
+
|
|
274
|
+
// Build lowercase lookup for case-insensitive matching
|
|
275
|
+
const lowercaseHandlers = new Map([...this.handlers.entries()].map(([k, v]) => [k.toLowerCase(), v]));
|
|
276
|
+
|
|
277
|
+
// Resolve target_dirs for IDEs that will remain installed after this cleanup
|
|
278
|
+
const remainingTargets = new Set();
|
|
279
|
+
if (Array.isArray(options.remainingIdes)) {
|
|
280
|
+
for (const remaining of options.remainingIdes) {
|
|
281
|
+
const h = lowercaseHandlers.get(String(remaining).toLowerCase());
|
|
282
|
+
const t = h?.installerConfig?.target_dir;
|
|
283
|
+
if (t) remainingTargets.add(t);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
for (const ideName of ideList) {
|
|
288
|
+
const handler = lowercaseHandlers.get(ideName.toLowerCase());
|
|
289
|
+
if (!handler) continue;
|
|
290
|
+
|
|
291
|
+
const target = handler.installerConfig?.target_dir || null;
|
|
292
|
+
const skipTarget = target && remainingTargets.has(target);
|
|
293
|
+
const cleanupOptions = skipTarget ? { ...options, skipTarget: true } : options;
|
|
294
|
+
|
|
295
|
+
try {
|
|
296
|
+
await handler.cleanup(projectDir, cleanupOptions);
|
|
297
|
+
results.push({ ide: ideName, success: true, skippedTarget: !!skipTarget });
|
|
298
|
+
} catch (error) {
|
|
299
|
+
results.push({ ide: ideName, success: false, error: error.message });
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return results;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Detect installed IDEs
|
|
308
|
+
* @param {string} projectDir - Project directory
|
|
309
|
+
* @returns {Array} List of detected IDEs
|
|
310
|
+
*/
|
|
311
|
+
async detectInstalledIdes(projectDir) {
|
|
312
|
+
const detected = [];
|
|
313
|
+
|
|
314
|
+
for (const [name, handler] of this.handlers) {
|
|
315
|
+
if (typeof handler.detect === 'function' && (await handler.detect(projectDir))) {
|
|
316
|
+
detected.push(name);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
return detected;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
module.exports = { IdeManager };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
const fs = require('../fs-native');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const yaml = require('yaml');
|
|
4
|
+
|
|
5
|
+
const PLATFORM_CODES_PATH = path.join(__dirname, 'platform-codes.yaml');
|
|
6
|
+
|
|
7
|
+
let _cachedPlatformCodes = null;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Load the platform codes configuration from YAML
|
|
11
|
+
* @returns {Object} Platform codes configuration
|
|
12
|
+
*/
|
|
13
|
+
async function loadPlatformCodes() {
|
|
14
|
+
if (_cachedPlatformCodes) {
|
|
15
|
+
return _cachedPlatformCodes;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (!(await fs.pathExists(PLATFORM_CODES_PATH))) {
|
|
19
|
+
throw new Error(`Platform codes configuration not found at: ${PLATFORM_CODES_PATH}`);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const content = await fs.readFile(PLATFORM_CODES_PATH, 'utf8');
|
|
23
|
+
_cachedPlatformCodes = yaml.parse(content);
|
|
24
|
+
return _cachedPlatformCodes;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Clear the cached platform codes (useful for testing)
|
|
29
|
+
*/
|
|
30
|
+
function clearCache() {
|
|
31
|
+
_cachedPlatformCodes = null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Format the installable platform list for human-readable output (used by --list-tools).
|
|
36
|
+
* Sourced from IdeManager so this view matches what --tools accepts at install time
|
|
37
|
+
* (suspended platforms excluded).
|
|
38
|
+
* @returns {Promise<string>} Formatted multi-line string with id, name, target_dir, preferred flag.
|
|
39
|
+
*/
|
|
40
|
+
async function formatPlatformList() {
|
|
41
|
+
const { IdeManager } = require('./manager');
|
|
42
|
+
const ideManager = new IdeManager();
|
|
43
|
+
await ideManager.ensureInitialized();
|
|
44
|
+
|
|
45
|
+
const entries = ideManager.getAvailableIdes().map((ide) => {
|
|
46
|
+
const handler = ideManager.handlers.get(ide.value);
|
|
47
|
+
return {
|
|
48
|
+
id: ide.value,
|
|
49
|
+
name: ide.name,
|
|
50
|
+
targetDir: handler?.installerConfig?.target_dir || '',
|
|
51
|
+
preferred: ide.preferred,
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const idWidth = Math.max(...entries.map((e) => e.id.length), 'ID'.length);
|
|
56
|
+
const nameWidth = Math.max(...entries.map((e) => e.name.length), 'Name'.length);
|
|
57
|
+
|
|
58
|
+
const pad = (s, w) => s + ' '.repeat(Math.max(0, w - s.length));
|
|
59
|
+
const lines = [
|
|
60
|
+
`Supported tool IDs (pass via --tools <id>[,<id>...]):`,
|
|
61
|
+
'',
|
|
62
|
+
` ${pad('ID', idWidth)} ${pad('Name', nameWidth)} Target dir`,
|
|
63
|
+
` ${pad('-'.repeat(idWidth), idWidth)} ${pad('-'.repeat(nameWidth), nameWidth)} ${'-'.repeat(10)}`,
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
for (const e of entries) {
|
|
67
|
+
const star = e.preferred ? ' *' : ' ';
|
|
68
|
+
lines.push(`${star}${pad(e.id, idWidth)} ${pad(e.name, nameWidth)} ${e.targetDir}`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
lines.push('', '* = recommended / preferred', '', 'Example: drt-method install --modules drt --tools claude-code');
|
|
72
|
+
|
|
73
|
+
return lines.join('\n');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
module.exports = {
|
|
77
|
+
loadPlatformCodes,
|
|
78
|
+
clearCache,
|
|
79
|
+
formatPlatformList,
|
|
80
|
+
};
|