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,184 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
|
|
5
|
+
const MEMLOG = '.memlog.md';
|
|
6
|
+
|
|
7
|
+
function now() {
|
|
8
|
+
const d = new Date();
|
|
9
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
10
|
+
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function resolvePath(args) {
|
|
14
|
+
if (args.path) {
|
|
15
|
+
return path.resolve(args.path);
|
|
16
|
+
}
|
|
17
|
+
return path.join(path.resolve(args.workspace), MEMLOG);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function split(text) {
|
|
21
|
+
const lines = text.split(/\r?\n/);
|
|
22
|
+
if (!lines.length || lines[0] !== '---') {
|
|
23
|
+
throw new Error('.memlog.md has no frontmatter');
|
|
24
|
+
}
|
|
25
|
+
const end = lines.findIndex((line, i) => i > 0 && line === '---');
|
|
26
|
+
if (end === -1) {
|
|
27
|
+
throw new Error('.memlog.md frontmatter is not terminated');
|
|
28
|
+
}
|
|
29
|
+
const meta = {};
|
|
30
|
+
for (const line of lines.slice(1, end)) {
|
|
31
|
+
const idx = line.indexOf(':');
|
|
32
|
+
if (idx !== -1) {
|
|
33
|
+
meta[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const body = lines.slice(end + 1).join('\n').replace(/^\n/, '');
|
|
37
|
+
return { meta, body };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function render(meta, body) {
|
|
41
|
+
const fm = Object.entries(meta)
|
|
42
|
+
.map(([k, v]) => `${k}: ${String(v).split(/\r?\n/).join(' ')}`)
|
|
43
|
+
.join('\n');
|
|
44
|
+
return `---\n${fm}\n---\n\n${body.replace(/\n$/, '')}\n`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function touch(meta) {
|
|
48
|
+
delete meta.updated;
|
|
49
|
+
meta.updated = now();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function writeAtomic(filePath, text) {
|
|
53
|
+
const tmp = `${filePath}.tmp`;
|
|
54
|
+
fs.writeFileSync(tmp, text, 'utf8');
|
|
55
|
+
try {
|
|
56
|
+
const fd = fs.openSync(tmp, 'r');
|
|
57
|
+
fs.fsyncSync(fd);
|
|
58
|
+
fs.closeSync(fd);
|
|
59
|
+
} catch {
|
|
60
|
+
}
|
|
61
|
+
fs.renameSync(tmp, filePath);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function entryCount(body) {
|
|
65
|
+
return body.split(/\r?\n/).filter((line) => line.startsWith('- ')).length;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function ack(filePath, body) {
|
|
69
|
+
process.stdout.write(`${JSON.stringify({ ok: true, memlog: filePath, entries: entryCount(body) })}\n`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function cmdInit(args) {
|
|
73
|
+
const filePath = resolvePath(args);
|
|
74
|
+
if (fs.existsSync(filePath)) {
|
|
75
|
+
process.stderr.write(`error: ${filePath} already exists; use append/set to update it\n`);
|
|
76
|
+
process.exit(2);
|
|
77
|
+
}
|
|
78
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
79
|
+
const meta = {};
|
|
80
|
+
for (const pair of args.field || []) {
|
|
81
|
+
const idx = pair.indexOf('=');
|
|
82
|
+
if (idx === -1) {
|
|
83
|
+
process.stderr.write(`error: --field expects key=value, got ${JSON.stringify(pair)}\n`);
|
|
84
|
+
process.exit(2);
|
|
85
|
+
}
|
|
86
|
+
meta[pair.slice(0, idx).trim()] = pair.slice(idx + 1).trim();
|
|
87
|
+
}
|
|
88
|
+
touch(meta);
|
|
89
|
+
writeAtomic(filePath, render(meta, ''));
|
|
90
|
+
ack(filePath, '');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function cmdAppend(args) {
|
|
94
|
+
const filePath = resolvePath(args);
|
|
95
|
+
const { meta, body } = split(fs.readFileSync(filePath, 'utf8'));
|
|
96
|
+
const text = args.text.replace(/\s+/g, ' ').trim();
|
|
97
|
+
let label = args.type || '';
|
|
98
|
+
if (args.by) {
|
|
99
|
+
label = `${label} by ${args.by}`.trim();
|
|
100
|
+
}
|
|
101
|
+
const tag = label ? `(${label}) ` : '';
|
|
102
|
+
const entry = `- ${tag}${text}`;
|
|
103
|
+
const newBody = body.trim() ? `${body.replace(/\n$/, '')}\n${entry}` : entry;
|
|
104
|
+
touch(meta);
|
|
105
|
+
writeAtomic(filePath, render(meta, newBody));
|
|
106
|
+
ack(filePath, newBody);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function cmdSet(args) {
|
|
110
|
+
const filePath = resolvePath(args);
|
|
111
|
+
const { meta, body } = split(fs.readFileSync(filePath, 'utf8'));
|
|
112
|
+
meta[args.key] = args.value;
|
|
113
|
+
touch(meta);
|
|
114
|
+
writeAtomic(filePath, render(meta, body));
|
|
115
|
+
ack(filePath, body);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function parseArgs(argv) {
|
|
119
|
+
const result = { cmd: null, field: [], path: null, workspace: null, text: null, type: null, by: null, key: null, value: null };
|
|
120
|
+
const positional = [];
|
|
121
|
+
for (let i = 2; i < argv.length; i++) {
|
|
122
|
+
const arg = argv[i];
|
|
123
|
+
if (arg === 'init' || arg === 'append' || arg === 'set') {
|
|
124
|
+
result.cmd = arg;
|
|
125
|
+
} else if (arg === '--workspace') {
|
|
126
|
+
result.workspace = argv[++i];
|
|
127
|
+
} else if (arg === '--path') {
|
|
128
|
+
result.path = argv[++i];
|
|
129
|
+
} else if (arg === '--field') {
|
|
130
|
+
result.field.push(argv[++i]);
|
|
131
|
+
} else if (arg === '--text') {
|
|
132
|
+
result.text = argv[++i];
|
|
133
|
+
} else if (arg === '--type') {
|
|
134
|
+
result.type = argv[++i];
|
|
135
|
+
} else if (arg === '--by') {
|
|
136
|
+
result.by = argv[++i];
|
|
137
|
+
} else if (arg === '--key') {
|
|
138
|
+
result.key = argv[++i];
|
|
139
|
+
} else if (arg === '--value') {
|
|
140
|
+
result.value = argv[++i];
|
|
141
|
+
} else if (arg === '--help' || arg === '-h') {
|
|
142
|
+
process.stdout.write('Usage: node memlog.js <init|append|set> --workspace <dir> | --path <file> [options]\n');
|
|
143
|
+
process.exit(0);
|
|
144
|
+
} else {
|
|
145
|
+
positional.push(arg);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (!result.cmd && positional.length) {
|
|
149
|
+
result.cmd = positional[0];
|
|
150
|
+
}
|
|
151
|
+
if (!result.cmd) {
|
|
152
|
+
process.stderr.write('error: command required: init, append, or set\n');
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
if (!result.path && !result.workspace) {
|
|
156
|
+
process.stderr.write('error: --workspace or --path is required\n');
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function main() {
|
|
163
|
+
const args = parseArgs(process.argv);
|
|
164
|
+
if (args.cmd === 'init') {
|
|
165
|
+
cmdInit(args);
|
|
166
|
+
} else if (args.cmd === 'append') {
|
|
167
|
+
if (!args.text) {
|
|
168
|
+
process.stderr.write('error: --text is required for append\n');
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
cmdAppend(args);
|
|
172
|
+
} else if (args.cmd === 'set') {
|
|
173
|
+
if (!args.key || args.value == null) {
|
|
174
|
+
process.stderr.write('error: --key and --value are required for set\n');
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
cmdSet(args);
|
|
178
|
+
} else {
|
|
179
|
+
process.stderr.write(`error: unknown command ${args.cmd}\n`);
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
main();
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { loadToml } = require('./lib/load-toml');
|
|
4
|
+
const { deepMerge, extractKey } = require('./lib/merge-utils');
|
|
5
|
+
|
|
6
|
+
function parseArgs(argv) {
|
|
7
|
+
const args = { projectRoot: null, keys: [] };
|
|
8
|
+
for (let i = 2; i < argv.length; i++) {
|
|
9
|
+
const arg = argv[i];
|
|
10
|
+
if (arg === '--project-root' || arg === '-p') {
|
|
11
|
+
args.projectRoot = argv[++i];
|
|
12
|
+
} else if (arg === '--key' || arg === '-k') {
|
|
13
|
+
args.keys.push(argv[++i]);
|
|
14
|
+
} else if (arg === '--help' || arg === '-h') {
|
|
15
|
+
process.stdout.write(`Usage: node resolve-config.js --project-root <path> [--key <dotted.path> ...]\n`);
|
|
16
|
+
process.exit(0);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (!args.projectRoot) {
|
|
20
|
+
process.stderr.write('error: --project-root is required\n');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
return args;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function main() {
|
|
27
|
+
const args = parseArgs(process.argv);
|
|
28
|
+
const projectRoot = path.resolve(args.projectRoot);
|
|
29
|
+
const drtDir = path.join(projectRoot, '_drt');
|
|
30
|
+
|
|
31
|
+
const baseTeam = loadToml(path.join(drtDir, 'config.toml'), { required: true });
|
|
32
|
+
const baseUser = loadToml(path.join(drtDir, 'config.user.toml'));
|
|
33
|
+
const customTeam = loadToml(path.join(drtDir, 'custom', 'config.toml'));
|
|
34
|
+
const customUser = loadToml(path.join(drtDir, 'custom', 'config.user.toml'));
|
|
35
|
+
|
|
36
|
+
let merged = deepMerge(baseTeam, baseUser);
|
|
37
|
+
merged = deepMerge(merged, customTeam);
|
|
38
|
+
merged = deepMerge(merged, customUser);
|
|
39
|
+
|
|
40
|
+
let output;
|
|
41
|
+
if (args.keys.length > 0) {
|
|
42
|
+
output = {};
|
|
43
|
+
for (const key of args.keys) {
|
|
44
|
+
const value = extractKey(merged, key);
|
|
45
|
+
if (value !== undefined) {
|
|
46
|
+
output[key] = value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
output = merged;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
process.stdout.write(`${JSON.stringify(output, null, 2)}\n`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
main();
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
const { loadToml } = require('./lib/load-toml');
|
|
5
|
+
const { deepMerge, extractKey } = require('./lib/merge-utils');
|
|
6
|
+
|
|
7
|
+
function findProjectRoot(start) {
|
|
8
|
+
let current = path.resolve(start);
|
|
9
|
+
while (true) {
|
|
10
|
+
if (fs.existsSync(path.join(current, '_drt')) || fs.existsSync(path.join(current, '.git'))) {
|
|
11
|
+
return current;
|
|
12
|
+
}
|
|
13
|
+
const parent = path.dirname(current);
|
|
14
|
+
if (parent === current) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
current = parent;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function parseArgs(argv) {
|
|
22
|
+
const args = { skill: null, keys: [] };
|
|
23
|
+
for (let i = 2; i < argv.length; i++) {
|
|
24
|
+
const arg = argv[i];
|
|
25
|
+
if (arg === '--skill' || arg === '-s') {
|
|
26
|
+
args.skill = argv[++i];
|
|
27
|
+
} else if (arg === '--key' || arg === '-k') {
|
|
28
|
+
args.keys.push(argv[++i]);
|
|
29
|
+
} else if (arg === '--help' || arg === '-h') {
|
|
30
|
+
process.stdout.write(`Usage: node resolve-customization.js --skill <skill-dir> [--key <dotted.path> ...]\n`);
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (!args.skill) {
|
|
35
|
+
process.stderr.write('error: --skill is required\n');
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
return args;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function main() {
|
|
42
|
+
const args = parseArgs(process.argv);
|
|
43
|
+
const skillDir = path.resolve(args.skill);
|
|
44
|
+
const skillName = path.basename(skillDir);
|
|
45
|
+
const defaultsPath = path.join(skillDir, 'customize.toml');
|
|
46
|
+
|
|
47
|
+
const defaults = loadToml(defaultsPath, { required: true });
|
|
48
|
+
const projectRoot = findProjectRoot(skillDir) || findProjectRoot(process.cwd());
|
|
49
|
+
|
|
50
|
+
let team = {};
|
|
51
|
+
let user = {};
|
|
52
|
+
if (projectRoot) {
|
|
53
|
+
const customDir = path.join(projectRoot, '_drt', 'custom');
|
|
54
|
+
team = loadToml(path.join(customDir, `${skillName}.toml`));
|
|
55
|
+
user = loadToml(path.join(customDir, `${skillName}.user.toml`));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let merged = deepMerge(defaults, team);
|
|
59
|
+
merged = deepMerge(merged, user);
|
|
60
|
+
|
|
61
|
+
let output;
|
|
62
|
+
if (args.keys.length > 0) {
|
|
63
|
+
output = {};
|
|
64
|
+
for (const key of args.keys) {
|
|
65
|
+
const value = extractKey(merged, key);
|
|
66
|
+
if (value !== undefined) {
|
|
67
|
+
output[key] = value;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
output = merged;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
process.stdout.write(`${JSON.stringify(output, null, 2)}\n`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
main();
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const prompts = require('./prompts');
|
|
2
|
+
|
|
3
|
+
const CLIUtils = {
|
|
4
|
+
/**
|
|
5
|
+
* Display DRT Method logo and version using @clack intro + box
|
|
6
|
+
*/
|
|
7
|
+
async displayLogo() {
|
|
8
|
+
const color = await prompts.getColor();
|
|
9
|
+
const termWidth = process.stdout.columns || 80;
|
|
10
|
+
|
|
11
|
+
// Full "DRT Method" logo for wide terminals, "DRT" only for narrow
|
|
12
|
+
const logoWide = [
|
|
13
|
+
' ██████╗ ███╗ ███╗ █████╗ ██████╗ ███╗ ███╗███████╗████████╗██╗ ██╗ ██████╗ ██████╗ ™',
|
|
14
|
+
'██╔══██╗████╗ ████║██╔══██╗██╔══██╗ ████╗ ████║██╔════╝╚══██╔══╝██║ ██║██╔═══██╗██╔══██╗',
|
|
15
|
+
'██████╔╝██╔████╔██║███████║██║ ██║ ██╔████╔██║█████╗ ██║ ███████║██║ ██║██║ ██║',
|
|
16
|
+
'██╔══██╗██║╚██╔╝██║██╔══██║██║ ██║ ██║╚██╔╝██║██╔══╝ ██║ ██╔══██║██║ ██║██║ ██║',
|
|
17
|
+
'██████╔╝██║ ╚═╝ ██║██║ ██║██████╔╝ ██║ ╚═╝ ██║███████╗ ██║ ██║ ██║╚██████╔╝██████╔╝',
|
|
18
|
+
'╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ',
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const logoNarrow = [
|
|
22
|
+
' ██████╗ ███╗ ███╗ █████╗ ██████╗ ™',
|
|
23
|
+
' ██╔══██╗████╗ ████║██╔══██╗██╔══██╗',
|
|
24
|
+
' ██████╔╝██╔████╔██║███████║██║ ██║',
|
|
25
|
+
' ██╔══██╗██║╚██╔╝██║██╔══██║██║ ██║',
|
|
26
|
+
' ██████╔╝██║ ╚═╝ ██║██║ ██║██████╔╝',
|
|
27
|
+
' ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝',
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const logoLines = termWidth >= 95 ? logoWide : logoNarrow;
|
|
31
|
+
const logo = logoLines.map((line) => color.blue(line)).join('\n');
|
|
32
|
+
const tagline = color.white(' Build More, Architect Dreams\n © DRT Code');
|
|
33
|
+
|
|
34
|
+
await prompts.box(`${logo}\n${tagline}`, '', {
|
|
35
|
+
contentAlign: 'center',
|
|
36
|
+
rounded: true,
|
|
37
|
+
formatBorder: color.blue,
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Display module configuration header
|
|
43
|
+
* @param {string} moduleName - Module name (fallback if no custom header)
|
|
44
|
+
* @param {string} header - Custom header from module.yaml
|
|
45
|
+
* @param {string} subheader - Custom subheader from module.yaml
|
|
46
|
+
*/
|
|
47
|
+
async displayModuleConfigHeader(moduleName, header = null, subheader = null) {
|
|
48
|
+
const title = header || `Configuring ${moduleName.toUpperCase()} Module`;
|
|
49
|
+
await prompts.note(subheader || '', title);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
module.exports = { CLIUtils };
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const prompts = require('../prompts');
|
|
3
|
+
const { Installer } = require('../core/installer');
|
|
4
|
+
const { UI } = require('../ui');
|
|
5
|
+
|
|
6
|
+
const installer = new Installer();
|
|
7
|
+
const ui = new UI();
|
|
8
|
+
|
|
9
|
+
module.exports = {
|
|
10
|
+
command: 'install',
|
|
11
|
+
description: 'Install DRT Method agents and tools',
|
|
12
|
+
options: [
|
|
13
|
+
['-d, --debug', 'Enable debug output for manifest generation'],
|
|
14
|
+
['--directory <path>', 'Installation directory (default: current directory)'],
|
|
15
|
+
['--modules <modules>', 'Comma-separated list of module IDs to install (e.g., "bmm,bmb")'],
|
|
16
|
+
[
|
|
17
|
+
'--tools <tools>',
|
|
18
|
+
'Comma-separated list of tool/IDE IDs to configure (e.g., "claude-code,cursor"). Required for fresh non-interactive (--yes) installs. Run with --list-tools to see all valid IDs.',
|
|
19
|
+
],
|
|
20
|
+
['--list-tools', 'Print all supported tool/IDE IDs (with target directories) and exit.'],
|
|
21
|
+
[
|
|
22
|
+
'--set <spec>',
|
|
23
|
+
'Set a module config option non-interactively. Spec format: <module>.<key>=<value> (e.g. bmm.project_knowledge=research). Repeatable. Run --list-options to see available keys.',
|
|
24
|
+
(value, prev) => [...(prev || []), value],
|
|
25
|
+
[],
|
|
26
|
+
],
|
|
27
|
+
[
|
|
28
|
+
'--list-options [module]',
|
|
29
|
+
'List available --set keys for all locally-known official modules, or for a single module by code, then exit.',
|
|
30
|
+
],
|
|
31
|
+
['--action <type>', 'Action type for existing installations: install, update, or quick-update'],
|
|
32
|
+
['--user-name <name>', 'Name for agents to use (default: system username)'],
|
|
33
|
+
['--communication-language <lang>', 'Language for agent communication (default: English)'],
|
|
34
|
+
['--document-output-language <lang>', 'Language for document output (default: English)'],
|
|
35
|
+
['--output-folder <path>', 'Output folder path relative to project root (default: _drt-output)'],
|
|
36
|
+
['--custom-source <sources>', 'Comma-separated Git URLs or local paths to install custom modules from'],
|
|
37
|
+
['-y, --yes', 'Accept all defaults and skip prompts where possible'],
|
|
38
|
+
[
|
|
39
|
+
'--channel <channel>',
|
|
40
|
+
'Apply channel (stable|next) to all external modules being installed. --all-stable and --all-next are aliases.',
|
|
41
|
+
],
|
|
42
|
+
['--all-stable', 'Alias for --channel=stable. Resolves externals to the highest stable release tag.'],
|
|
43
|
+
['--all-next', 'Alias for --channel=next. Resolves externals to main HEAD.'],
|
|
44
|
+
['--next <code>', 'Install module <code> from main HEAD (next channel). Repeatable.', (value, prev) => [...(prev || []), value], []],
|
|
45
|
+
[
|
|
46
|
+
'--pin <spec>',
|
|
47
|
+
'Pin module to a specific tag: --pin CODE=TAG (e.g. --pin bmb=v1.7.0). Repeatable.',
|
|
48
|
+
(value, prev) => [...(prev || []), value],
|
|
49
|
+
[],
|
|
50
|
+
],
|
|
51
|
+
],
|
|
52
|
+
action: async (options) => {
|
|
53
|
+
try {
|
|
54
|
+
if (options.listTools) {
|
|
55
|
+
const { formatPlatformList } = require('../ide/platform-codes');
|
|
56
|
+
process.stdout.write((await formatPlatformList()) + '\n');
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (options.listOptions !== undefined) {
|
|
61
|
+
const { formatOptionsList } = require('../list-options');
|
|
62
|
+
const moduleArg = options.listOptions === true ? null : options.listOptions;
|
|
63
|
+
const { text, ok } = await formatOptionsList(moduleArg);
|
|
64
|
+
const stream = ok ? process.stdout : process.stderr;
|
|
65
|
+
// process.exit() forces immediate termination and can truncate the
|
|
66
|
+
// buffered write when stdout/stderr is piped or captured by CI. Wait
|
|
67
|
+
// for the write to flush, then set process.exitCode and return so the
|
|
68
|
+
// event loop drains naturally. Non-zero exit when a single-module
|
|
69
|
+
// lookup misses so a CI typo like `--list-options bmn` doesn't look
|
|
70
|
+
// successful in scripts.
|
|
71
|
+
await new Promise((resolve, reject) => {
|
|
72
|
+
stream.write(text + '\n', (error) => (error ? reject(error) : resolve()));
|
|
73
|
+
});
|
|
74
|
+
process.exitCode = ok ? 0 : 1;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const { checkWindowsNodeFromWsl } = require('../core/wsl-node-check');
|
|
79
|
+
await checkWindowsNodeFromWsl();
|
|
80
|
+
|
|
81
|
+
// Set debug flag as environment variable for all components
|
|
82
|
+
if (options.debug) {
|
|
83
|
+
process.env.DRT_DEBUG_MANIFEST = 'true';
|
|
84
|
+
await prompts.log.info('Debug mode enabled');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Validate --set syntax up-front so malformed entries fail fast,
|
|
88
|
+
// before we touch the network or filesystem. Parsed entries are
|
|
89
|
+
// re-derived inside ui.js where overrides are seeded.
|
|
90
|
+
if (options.set && options.set.length > 0) {
|
|
91
|
+
const { parseSetEntries } = require('../set-overrides');
|
|
92
|
+
try {
|
|
93
|
+
parseSetEntries(options.set);
|
|
94
|
+
} catch (error) {
|
|
95
|
+
await prompts.log.error(error.message);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const config = await ui.promptInstall(options);
|
|
101
|
+
|
|
102
|
+
// Handle cancel
|
|
103
|
+
if (config.actionType === 'cancel') {
|
|
104
|
+
await prompts.log.warn('Installation cancelled.');
|
|
105
|
+
process.exit(0);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Handle quick update separately. --set is a post-install TOML patch so
|
|
109
|
+
// it works the same way for quick-update as for a regular install — the
|
|
110
|
+
// installer runs, then `applySetOverrides` patches the central config
|
|
111
|
+
// files. Pass the parsed overrides through.
|
|
112
|
+
if (config.actionType === 'quick-update') {
|
|
113
|
+
const { parseSetEntries } = require('../set-overrides');
|
|
114
|
+
config.setOverrides = parseSetEntries(options.set || []);
|
|
115
|
+
const result = await installer.quickUpdate(config);
|
|
116
|
+
await prompts.log.success('Quick update complete!');
|
|
117
|
+
await prompts.log.info(`Updated ${result.moduleCount} modules with preserved settings (${result.modules.join(', ')})`);
|
|
118
|
+
process.exit(0);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Regular install/update flow
|
|
122
|
+
const result = await installer.install(config);
|
|
123
|
+
|
|
124
|
+
// Check if installation was cancelled
|
|
125
|
+
if (result && result.cancelled) {
|
|
126
|
+
process.exit(0);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Check if installation succeeded
|
|
130
|
+
if (result && result.success) {
|
|
131
|
+
process.exit(0);
|
|
132
|
+
}
|
|
133
|
+
} catch (error) {
|
|
134
|
+
try {
|
|
135
|
+
if (error.fullMessage) {
|
|
136
|
+
await prompts.log.error(error.fullMessage);
|
|
137
|
+
} else {
|
|
138
|
+
await prompts.log.error(`Installation failed: ${error.message}`);
|
|
139
|
+
}
|
|
140
|
+
if (error.stack && !error.expected) {
|
|
141
|
+
await prompts.log.message(error.stack);
|
|
142
|
+
}
|
|
143
|
+
} catch {
|
|
144
|
+
console.error(error.fullMessage || error.message || error);
|
|
145
|
+
}
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const prompts = require('../prompts');
|
|
3
|
+
const { Installer } = require('../core/installer');
|
|
4
|
+
const { Manifest } = require('../core/manifest');
|
|
5
|
+
const { UI } = require('../ui');
|
|
6
|
+
|
|
7
|
+
const installer = new Installer();
|
|
8
|
+
const manifest = new Manifest();
|
|
9
|
+
const ui = new UI();
|
|
10
|
+
|
|
11
|
+
module.exports = {
|
|
12
|
+
command: 'status',
|
|
13
|
+
description: 'Display DRT installation status and module versions',
|
|
14
|
+
options: [],
|
|
15
|
+
action: async (options) => {
|
|
16
|
+
try {
|
|
17
|
+
// Find the drt directory
|
|
18
|
+
const projectDir = process.cwd();
|
|
19
|
+
const { drtDir } = await installer.findDrtDir(projectDir);
|
|
20
|
+
|
|
21
|
+
// Check if drt directory exists
|
|
22
|
+
const fs = require('../fs-native');
|
|
23
|
+
if (!(await fs.pathExists(drtDir))) {
|
|
24
|
+
await prompts.log.warn('No DRT installation found in the current directory.');
|
|
25
|
+
await prompts.log.message(`Expected location: ${drtDir}`);
|
|
26
|
+
await prompts.log.message('Run "npx drt-method install" to set up a new installation.');
|
|
27
|
+
process.exit(0);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Read manifest
|
|
32
|
+
const manifestData = await manifest._readRaw(drtDir);
|
|
33
|
+
|
|
34
|
+
if (!manifestData) {
|
|
35
|
+
await prompts.log.warn('No DRT installation manifest found.');
|
|
36
|
+
await prompts.log.message('Run "npx drt-method install" to set up a new installation.');
|
|
37
|
+
process.exit(0);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Get installation info
|
|
42
|
+
const installation = manifestData.installation || {};
|
|
43
|
+
const modules = manifestData.modules || [];
|
|
44
|
+
|
|
45
|
+
// Check for available updates (only for external modules)
|
|
46
|
+
const availableUpdates = await manifest.checkForUpdates(drtDir);
|
|
47
|
+
|
|
48
|
+
// Display status
|
|
49
|
+
await ui.displayStatus({
|
|
50
|
+
installation,
|
|
51
|
+
modules,
|
|
52
|
+
availableUpdates,
|
|
53
|
+
drtDir,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
process.exit(0);
|
|
57
|
+
} catch (error) {
|
|
58
|
+
await prompts.log.error(`Status check failed: ${error.message}`);
|
|
59
|
+
if (process.env.DRT_DEBUG) {
|
|
60
|
+
await prompts.log.message(error.stack);
|
|
61
|
+
}
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
};
|