From 9c6534259dd9c30e8f9f77676a60a7874562bedf Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Sun, 22 Mar 2026 10:46:50 -0600 Subject: [PATCH] refactor(cli): rename tools/cli to tools/installer and flatten lib directories The entire CLI exists to serve the installer. Rename the directory to reflect its purpose and collapse the two redundant lib/ directories (cli/lib/ and cli/installers/lib/) into the top level. - tools/cli/ -> tools/installer/ - tools/installer/installers/lib/{core,ide,modules}/ -> tools/installer/{core,ide,modules}/ - tools/installer/lib/*.js -> tools/installer/*.js - Update all require() paths, package.json bin/main, CI workflow, tests, and docs Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/publish.yaml | 2 +- .../fr/how-to/non-interactive-installation.md | 2 +- docs/how-to/non-interactive-installation.md | 2 +- .../how-to/non-interactive-installation.md | 2 +- package.json | 14 ++++---- .../resources/distillate-format-reference.md | 2 +- test/test-install-to-bmad.js | 2 +- test/test-installation-components.js | 6 ++-- test/test-workflow-path-regex.js | 2 +- tools/docs/_prompt-external-modules-page.md | 2 +- tools/{cli => installer}/README.md | 0 tools/{cli => installer}/bmad-cli.js | 2 +- tools/{cli/lib => installer}/cli-utils.js | 2 +- tools/{cli => installer}/commands/install.js | 6 ++-- tools/{cli => installer}/commands/status.js | 8 ++--- .../{cli => installer}/commands/uninstall.js | 4 +-- .../lib => installer}/core/config.js | 0 .../core/custom-module-cache.js | 2 +- .../core/existing-install.js | 0 .../lib => installer}/core/install-paths.js | 2 +- .../lib => installer}/core/installer.js | 6 ++-- .../core/manifest-generator.js | 6 ++-- .../lib => installer}/core/manifest.js | 4 +-- .../lib => installer}/custom-handler.js | 2 +- .../external-official-modules.yaml | 0 tools/{cli/lib => installer}/file-ops.js | 0 .../lib => installer}/ide/_config-driven.js | 2 +- .../lib => installer}/ide/manager.js | 2 +- .../lib => installer}/ide/platform-codes.js | 0 .../lib => installer}/ide/platform-codes.yaml | 0 .../ide/shared/agent-command-generator.js | 0 .../ide/shared/bmad-artifacts.js | 0 .../ide/shared/module-injections.js | 2 +- .../ide/shared/path-utils.js | 0 .../ide/shared/skill-manifest.js | 0 .../ide/templates/agent-command-template.md | 0 .../ide/templates/combined/antigravity.md | 0 .../ide/templates/combined/claude-agent.md | 0 .../combined/claude-workflow-yaml.md | 0 .../ide/templates/combined/claude-workflow.md | 0 .../ide/templates/combined/default-agent.md | 0 .../ide/templates/combined/default-task.md | 0 .../ide/templates/combined/default-tool.md | 0 .../templates/combined/default-workflow.md | 0 .../ide/templates/combined/gemini-agent.toml | 0 .../ide/templates/combined/gemini-task.toml | 0 .../ide/templates/combined/gemini-tool.toml | 0 .../combined/gemini-workflow-yaml.toml | 0 .../templates/combined/gemini-workflow.toml | 0 .../ide/templates/combined/kiro-agent.md | 0 .../ide/templates/combined/kiro-task.md | 0 .../ide/templates/combined/kiro-tool.md | 0 .../ide/templates/combined/kiro-workflow.md | 0 .../ide/templates/combined/opencode-agent.md | 0 .../ide/templates/combined/opencode-task.md | 0 .../ide/templates/combined/opencode-tool.md | 0 .../combined/opencode-workflow-yaml.md | 0 .../templates/combined/opencode-workflow.md | 0 .../ide/templates/combined/rovodev.md | 0 .../ide/templates/combined/trae.md | 0 .../templates/combined/windsurf-workflow.md | 0 .../ide/templates/split/.gitkeep | 0 .../install-messages.yaml | 0 .../lib => installer}/message-loader.js | 4 +-- .../modules/custom-modules.js | 2 +- .../modules/external-manager.js | 4 +-- .../modules/official-modules.js | 6 ++-- tools/{cli/lib => installer}/project-root.js | 0 tools/{cli/lib => installer}/prompts.js | 0 tools/{cli/lib => installer}/ui.js | 36 +++++++++---------- tools/{cli/lib => installer}/yaml-format.js | 0 71 files changed, 69 insertions(+), 69 deletions(-) rename tools/{cli => installer}/README.md (100%) rename tools/{cli => installer}/bmad-cli.js (98%) rename tools/{cli/lib => installer}/cli-utils.js (99%) rename tools/{cli => installer}/commands/install.js (95%) rename tools/{cli => installer}/commands/status.js (89%) rename tools/{cli => installer}/commands/uninstall.js (98%) rename tools/{cli/installers/lib => installer}/core/config.js (100%) rename tools/{cli/installers/lib => installer}/core/custom-module-cache.js (99%) rename tools/{cli/installers/lib => installer}/core/existing-install.js (100%) rename tools/{cli/installers/lib => installer}/core/install-paths.js (98%) rename tools/{cli/installers/lib => installer}/core/installer.js (99%) rename tools/{cli/installers/lib => installer}/core/manifest-generator.js (99%) rename tools/{cli/installers/lib => installer}/core/manifest.js (99%) rename tools/{cli/installers/lib => installer}/custom-handler.js (98%) rename tools/{cli => installer}/external-official-modules.yaml (100%) rename tools/{cli/lib => installer}/file-ops.js (100%) rename tools/{cli/installers/lib => installer}/ide/_config-driven.js (99%) rename tools/{cli/installers/lib => installer}/ide/manager.js (99%) rename tools/{cli/installers/lib => installer}/ide/platform-codes.js (100%) rename tools/{cli/installers/lib => installer}/ide/platform-codes.yaml (100%) rename tools/{cli/installers/lib => installer}/ide/shared/agent-command-generator.js (100%) rename tools/{cli/installers/lib => installer}/ide/shared/bmad-artifacts.js (100%) rename tools/{cli/installers/lib => installer}/ide/shared/module-injections.js (98%) rename tools/{cli/installers/lib => installer}/ide/shared/path-utils.js (100%) rename tools/{cli/installers/lib => installer}/ide/shared/skill-manifest.js (100%) rename tools/{cli/installers/lib => installer}/ide/templates/agent-command-template.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/antigravity.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/claude-agent.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/claude-workflow-yaml.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/claude-workflow.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/default-agent.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/default-task.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/default-tool.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/default-workflow.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/gemini-agent.toml (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/gemini-task.toml (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/gemini-tool.toml (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/gemini-workflow-yaml.toml (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/gemini-workflow.toml (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/kiro-agent.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/kiro-task.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/kiro-tool.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/kiro-workflow.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/opencode-agent.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/opencode-task.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/opencode-tool.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/opencode-workflow-yaml.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/opencode-workflow.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/rovodev.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/trae.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/combined/windsurf-workflow.md (100%) rename tools/{cli/installers/lib => installer}/ide/templates/split/.gitkeep (100%) rename tools/{cli/installers => installer}/install-messages.yaml (100%) rename tools/{cli/installers/lib => installer}/message-loader.js (93%) rename tools/{cli/installers/lib => installer}/modules/custom-modules.js (99%) rename tools/{cli/installers/lib => installer}/modules/external-manager.js (98%) rename tools/{cli/installers/lib => installer}/modules/official-modules.js (99%) rename tools/{cli/lib => installer}/project-root.js (100%) rename tools/{cli/lib => installer}/prompts.js (100%) rename tools/{cli/lib => installer}/ui.js (97%) rename tools/{cli/lib => installer}/yaml-format.js (100%) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 759ea2621..570b62f68 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -5,7 +5,7 @@ on: branches: [main] paths: - "src/**" - - "tools/cli/**" + - "tools/installer/**" - "package.json" workflow_dispatch: inputs: diff --git a/docs/fr/how-to/non-interactive-installation.md b/docs/fr/how-to/non-interactive-installation.md index 46e8ad4dc..0fe6588f9 100644 --- a/docs/fr/how-to/non-interactive-installation.md +++ b/docs/fr/how-to/non-interactive-installation.md @@ -61,7 +61,7 @@ IDs d'outils disponibles pour l’option `--tools` : **Recommandés :** `claude-code`, `cursor` -Exécutez `npx bmad-method install` de manière interactive une fois pour voir la liste complète actuelle des outils pris en charge, ou consultez la [configuration des codes de la plateforme](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/tools/cli/installers/lib/ide/platform-codes.yaml). +Exécutez `npx bmad-method install` de manière interactive une fois pour voir la liste complète actuelle des outils pris en charge, ou consultez la [configuration des codes de la plateforme](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/tools/installer/ide/platform-codes.yaml). ## Modes d'installation diff --git a/docs/how-to/non-interactive-installation.md b/docs/how-to/non-interactive-installation.md index 62b3090d8..f387fe8ba 100644 --- a/docs/how-to/non-interactive-installation.md +++ b/docs/how-to/non-interactive-installation.md @@ -61,7 +61,7 @@ Available tool IDs for the `--tools` flag: **Preferred:** `claude-code`, `cursor` -Run `npx bmad-method install` interactively once to see the full current list of supported tools, or check the [platform codes configuration](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/tools/cli/installers/lib/ide/platform-codes.yaml). +Run `npx bmad-method install` interactively once to see the full current list of supported tools, or check the [platform codes configuration](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/tools/installer/ide/platform-codes.yaml). ## Installation Modes diff --git a/docs/zh-cn/how-to/non-interactive-installation.md b/docs/zh-cn/how-to/non-interactive-installation.md index 930bbe639..4a5722e20 100644 --- a/docs/zh-cn/how-to/non-interactive-installation.md +++ b/docs/zh-cn/how-to/non-interactive-installation.md @@ -61,7 +61,7 @@ sidebar: **推荐:** `claude-code`、`cursor` -运行一次 `npx bmad-method install` 交互式安装以查看完整的当前支持工具列表,或查看 [平台代码配置](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/tools/cli/installers/lib/ide/platform-codes.yaml)。 +运行一次 `npx bmad-method install` 交互式安装以查看完整的当前支持工具列表,或查看 [平台代码配置](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/tools/installer/ide/platform-codes.yaml)。 ## 安装模式 diff --git a/package.json b/package.json index ad305bfb0..6910ff3fd 100644 --- a/package.json +++ b/package.json @@ -18,14 +18,14 @@ }, "license": "MIT", "author": "Brian (BMad) Madison", - "main": "tools/cli/bmad-cli.js", + "main": "tools/installer/bmad-cli.js", "bin": { - "bmad": "tools/cli/bmad-cli.js", - "bmad-method": "tools/cli/bmad-cli.js" + "bmad": "tools/installer/bmad-cli.js", + "bmad-method": "tools/installer/bmad-cli.js" }, "scripts": { - "bmad:install": "node tools/cli/bmad-cli.js install", - "bmad:uninstall": "node tools/cli/bmad-cli.js uninstall", + "bmad:install": "node tools/installer/bmad-cli.js install", + "bmad:uninstall": "node tools/installer/bmad-cli.js uninstall", "docs:build": "node tools/build-docs.mjs", "docs:dev": "astro dev --root website", "docs:fix-links": "node tools/fix-doc-links.js", @@ -34,13 +34,13 @@ "format:check": "prettier --check \"**/*.{js,cjs,mjs,json,yaml}\"", "format:fix": "prettier --write \"**/*.{js,cjs,mjs,json,yaml}\"", "format:fix:staged": "prettier --write", - "install:bmad": "node tools/cli/bmad-cli.js install", + "install:bmad": "node tools/installer/bmad-cli.js install", "lint": "eslint . --ext .js,.cjs,.mjs,.yaml --max-warnings=0", "lint:fix": "eslint . --ext .js,.cjs,.mjs,.yaml --fix", "lint:md": "markdownlint-cli2 \"**/*.md\"", "prepare": "command -v husky >/dev/null 2>&1 && husky || exit 0", "quality": "npm run format:check && npm run lint && npm run lint:md && npm run docs:build && npm run test:install && npm run validate:refs && npm run validate:skills", - "rebundle": "node tools/cli/bundlers/bundle-web.js rebundle", + "rebundle": "node tools/installer/bundlers/bundle-web.js rebundle", "test": "npm run test:refs && npm run test:install && npm run lint && npm run lint:md && npm run format:check", "test:install": "node test/test-installation-components.js", "test:refs": "node test/test-file-refs-csv.js", diff --git a/src/core-skills/bmad-distillator/resources/distillate-format-reference.md b/src/core-skills/bmad-distillator/resources/distillate-format-reference.md index 11ffac526..3c21d3598 100644 --- a/src/core-skills/bmad-distillator/resources/distillate-format-reference.md +++ b/src/core-skills/bmad-distillator/resources/distillate-format-reference.md @@ -172,7 +172,7 @@ parts: 1 - Deferred: CI/CD integration, telemetry for module authors, air-gapped enterprise install, zip bundle integrity verification (checksums/signing), deeper non-technical platform integrations ## Current Installer (migration context) -- Entry: `tools/cli/bmad-cli.js` (Commander.js) → `tools/cli/installers/lib/core/installer.js` +- Entry: `tools/installer/bmad-cli.js` (Commander.js) → `tools/installer/core/installer.js` - Platforms: `platform-codes.yaml` (~20 platforms with target dirs, legacy dirs, template types, special flags) - Manifests: CSV files (skill/workflow/agent-manifest.csv) are current source of truth, not JSON - External modules: `external-official-modules.yaml` (CIS, GDS, TEA, WDS) from npm with semver diff --git a/test/test-install-to-bmad.js b/test/test-install-to-bmad.js index 0367dbe93..d33218eb8 100644 --- a/test/test-install-to-bmad.js +++ b/test/test-install-to-bmad.js @@ -15,7 +15,7 @@ const path = require('node:path'); const os = require('node:os'); const fs = require('fs-extra'); -const { loadSkillManifest, getInstallToBmad } = require('../tools/cli/installers/lib/ide/shared/skill-manifest'); +const { loadSkillManifest, getInstallToBmad } = require('../tools/installer/ide/shared/skill-manifest'); // ANSI colors const colors = { diff --git a/test/test-installation-components.js b/test/test-installation-components.js index 1b17b7cf9..38da1eba4 100644 --- a/test/test-installation-components.js +++ b/test/test-installation-components.js @@ -14,9 +14,9 @@ const path = require('node:path'); const os = require('node:os'); const fs = require('fs-extra'); -const { ManifestGenerator } = require('../tools/cli/installers/lib/core/manifest-generator'); -const { IdeManager } = require('../tools/cli/installers/lib/ide/manager'); -const { clearCache, loadPlatformCodes } = require('../tools/cli/installers/lib/ide/platform-codes'); +const { ManifestGenerator } = require('../tools/installer/core/manifest-generator'); +const { IdeManager } = require('../tools/installer/ide/manager'); +const { clearCache, loadPlatformCodes } = require('../tools/installer/ide/platform-codes'); // ANSI colors const colors = { diff --git a/test/test-workflow-path-regex.js b/test/test-workflow-path-regex.js index 5f57a0ab9..f05ea1a34 100644 --- a/test/test-workflow-path-regex.js +++ b/test/test-workflow-path-regex.js @@ -34,7 +34,7 @@ function assert(condition, testName, errorMessage = '') { // --------------------------------------------------------------------------- // These regexes are extracted from ModuleManager.vendorWorkflowDependencies() -// in tools/cli/installers/lib/modules/manager.js +// in tools/installer/modules/manager.js // --------------------------------------------------------------------------- // Source regex (line ~1081) — uses non-capturing group for _bmad diff --git a/tools/docs/_prompt-external-modules-page.md b/tools/docs/_prompt-external-modules-page.md index f5e124373..414f977a8 100644 --- a/tools/docs/_prompt-external-modules-page.md +++ b/tools/docs/_prompt-external-modules-page.md @@ -6,7 +6,7 @@ Create a reference documentation page at `docs/reference/modules.md` that lists ## Source of Truth -Read `tools/cli/external-official-modules.yaml` — this is the authoritative registry of official external modules. Use the module names, codes, npm package names, and repository URLs from this file. +Read `tools/installer/external-official-modules.yaml` — this is the authoritative registry of official external modules. Use the module names, codes, npm package names, and repository URLs from this file. ## Research Step diff --git a/tools/cli/README.md b/tools/installer/README.md similarity index 100% rename from tools/cli/README.md rename to tools/installer/README.md diff --git a/tools/cli/bmad-cli.js b/tools/installer/bmad-cli.js similarity index 98% rename from tools/cli/bmad-cli.js rename to tools/installer/bmad-cli.js index 252895ec6..042714e45 100755 --- a/tools/cli/bmad-cli.js +++ b/tools/installer/bmad-cli.js @@ -5,7 +5,7 @@ const path = require('node:path'); const fs = require('node:fs'); const { execSync } = require('node:child_process'); const semver = require('semver'); -const prompts = require('./lib/prompts'); +const prompts = require('./prompts'); // The installer flow uses many sequential @clack/prompts, each adding keypress // listeners to stdin. Raise the limit to avoid spurious EventEmitter warnings. diff --git a/tools/cli/lib/cli-utils.js b/tools/installer/cli-utils.js similarity index 99% rename from tools/cli/lib/cli-utils.js rename to tools/installer/cli-utils.js index cf4cfa7b4..6ca615534 100644 --- a/tools/cli/lib/cli-utils.js +++ b/tools/installer/cli-utils.js @@ -8,7 +8,7 @@ const CLIUtils = { */ getVersion() { try { - const packageJson = require(path.join(__dirname, '..', '..', '..', 'package.json')); + const packageJson = require(path.join(__dirname, '..', '..', 'package.json')); return packageJson.version || 'Unknown'; } catch { return 'Unknown'; diff --git a/tools/cli/commands/install.js b/tools/installer/commands/install.js similarity index 95% rename from tools/cli/commands/install.js rename to tools/installer/commands/install.js index 3577116d7..96f536ef4 100644 --- a/tools/cli/commands/install.js +++ b/tools/installer/commands/install.js @@ -1,7 +1,7 @@ const path = require('node:path'); -const prompts = require('../lib/prompts'); -const { Installer } = require('../installers/lib/core/installer'); -const { UI } = require('../lib/ui'); +const prompts = require('../prompts'); +const { Installer } = require('../core/installer'); +const { UI } = require('../ui'); const installer = new Installer(); const ui = new UI(); diff --git a/tools/cli/commands/status.js b/tools/installer/commands/status.js similarity index 89% rename from tools/cli/commands/status.js rename to tools/installer/commands/status.js index ec931fe46..49c0afd73 100644 --- a/tools/cli/commands/status.js +++ b/tools/installer/commands/status.js @@ -1,8 +1,8 @@ const path = require('node:path'); -const prompts = require('../lib/prompts'); -const { Installer } = require('../installers/lib/core/installer'); -const { Manifest } = require('../installers/lib/core/manifest'); -const { UI } = require('../lib/ui'); +const prompts = require('../prompts'); +const { Installer } = require('../core/installer'); +const { Manifest } = require('../core/manifest'); +const { UI } = require('../ui'); const installer = new Installer(); const manifest = new Manifest(); diff --git a/tools/cli/commands/uninstall.js b/tools/installer/commands/uninstall.js similarity index 98% rename from tools/cli/commands/uninstall.js rename to tools/installer/commands/uninstall.js index 177dae27d..643af1872 100644 --- a/tools/cli/commands/uninstall.js +++ b/tools/installer/commands/uninstall.js @@ -1,7 +1,7 @@ const path = require('node:path'); const fs = require('fs-extra'); -const prompts = require('../lib/prompts'); -const { Installer } = require('../installers/lib/core/installer'); +const prompts = require('../prompts'); +const { Installer } = require('../core/installer'); const installer = new Installer(); diff --git a/tools/cli/installers/lib/core/config.js b/tools/installer/core/config.js similarity index 100% rename from tools/cli/installers/lib/core/config.js rename to tools/installer/core/config.js diff --git a/tools/cli/installers/lib/core/custom-module-cache.js b/tools/installer/core/custom-module-cache.js similarity index 99% rename from tools/cli/installers/lib/core/custom-module-cache.js rename to tools/installer/core/custom-module-cache.js index b1cc3d0f7..4afe77884 100644 --- a/tools/cli/installers/lib/core/custom-module-cache.js +++ b/tools/installer/core/custom-module-cache.js @@ -7,7 +7,7 @@ const fs = require('fs-extra'); const path = require('node:path'); const crypto = require('node:crypto'); -const prompts = require('../../../lib/prompts'); +const prompts = require('../prompts'); class CustomModuleCache { constructor(bmadDir) { diff --git a/tools/cli/installers/lib/core/existing-install.js b/tools/installer/core/existing-install.js similarity index 100% rename from tools/cli/installers/lib/core/existing-install.js rename to tools/installer/core/existing-install.js diff --git a/tools/cli/installers/lib/core/install-paths.js b/tools/installer/core/install-paths.js similarity index 98% rename from tools/cli/installers/lib/core/install-paths.js rename to tools/installer/core/install-paths.js index f977e3bba..7383f9bfd 100644 --- a/tools/cli/installers/lib/core/install-paths.js +++ b/tools/installer/core/install-paths.js @@ -1,6 +1,6 @@ const path = require('node:path'); const fs = require('fs-extra'); -const { getProjectRoot } = require('../../../lib/project-root'); +const { getProjectRoot } = require('../project-root'); const { BMAD_FOLDER_NAME } = require('../ide/shared/path-utils'); class InstallPaths { diff --git a/tools/cli/installers/lib/core/installer.js b/tools/installer/core/installer.js similarity index 99% rename from tools/cli/installers/lib/core/installer.js rename to tools/installer/core/installer.js index 1724f7004..f068e6857 100644 --- a/tools/cli/installers/lib/core/installer.js +++ b/tools/installer/core/installer.js @@ -4,11 +4,11 @@ const { Manifest } = require('./manifest'); const { OfficialModules } = require('../modules/official-modules'); const { CustomModules } = require('../modules/custom-modules'); const { IdeManager } = require('../ide/manager'); -const { FileOps } = require('../../../lib/file-ops'); +const { FileOps } = require('../file-ops'); const { Config } = require('./config'); -const { getProjectRoot, getSourcePath, getModulePath } = require('../../../lib/project-root'); +const { getProjectRoot, getSourcePath, getModulePath } = require('../project-root'); const { ManifestGenerator } = require('./manifest-generator'); -const prompts = require('../../../lib/prompts'); +const prompts = require('../prompts'); const { BMAD_FOLDER_NAME } = require('../ide/shared/path-utils'); const { InstallPaths } = require('./install-paths'); const { ExternalModuleManager } = require('../modules/external-manager'); diff --git a/tools/cli/installers/lib/core/manifest-generator.js b/tools/installer/core/manifest-generator.js similarity index 99% rename from tools/cli/installers/lib/core/manifest-generator.js rename to tools/installer/core/manifest-generator.js index 0dd0b24e4..80dc2ddc4 100644 --- a/tools/cli/installers/lib/core/manifest-generator.js +++ b/tools/installer/core/manifest-generator.js @@ -3,8 +3,8 @@ const fs = require('fs-extra'); const yaml = require('yaml'); const crypto = require('node:crypto'); const csv = require('csv-parse/sync'); -const { getSourcePath, getModulePath } = require('../../../lib/project-root'); -const prompts = require('../../../lib/prompts'); +const { getSourcePath, getModulePath } = require('../project-root'); +const prompts = require('../prompts'); const { loadSkillManifest: loadSkillManifestShared, getCanonicalId: getCanonicalIdShared, @@ -13,7 +13,7 @@ const { } = require('../ide/shared/skill-manifest'); // Load package.json for version info -const packageJson = require('../../../../../package.json'); +const packageJson = require('../../../package.json'); /** * Generates manifest files for installed skills and agents diff --git a/tools/cli/installers/lib/core/manifest.js b/tools/installer/core/manifest.js similarity index 99% rename from tools/cli/installers/lib/core/manifest.js rename to tools/installer/core/manifest.js index 0b5fc447b..d6eade648 100644 --- a/tools/cli/installers/lib/core/manifest.js +++ b/tools/installer/core/manifest.js @@ -1,8 +1,8 @@ const path = require('node:path'); const fs = require('fs-extra'); const crypto = require('node:crypto'); -const { getProjectRoot } = require('../../../lib/project-root'); -const prompts = require('../../../lib/prompts'); +const { getProjectRoot } = require('../project-root'); +const prompts = require('../prompts'); class Manifest { /** diff --git a/tools/cli/installers/lib/custom-handler.js b/tools/installer/custom-handler.js similarity index 98% rename from tools/cli/installers/lib/custom-handler.js rename to tools/installer/custom-handler.js index 7843c5fca..a1966b7e7 100644 --- a/tools/cli/installers/lib/custom-handler.js +++ b/tools/installer/custom-handler.js @@ -1,7 +1,7 @@ const path = require('node:path'); const fs = require('fs-extra'); const yaml = require('yaml'); -const prompts = require('../../lib/prompts'); +const prompts = require('./prompts'); /** * Handler for custom content (custom.yaml) * Discovers custom agents and workflows in the project diff --git a/tools/cli/external-official-modules.yaml b/tools/installer/external-official-modules.yaml similarity index 100% rename from tools/cli/external-official-modules.yaml rename to tools/installer/external-official-modules.yaml diff --git a/tools/cli/lib/file-ops.js b/tools/installer/file-ops.js similarity index 100% rename from tools/cli/lib/file-ops.js rename to tools/installer/file-ops.js diff --git a/tools/cli/installers/lib/ide/_config-driven.js b/tools/installer/ide/_config-driven.js similarity index 99% rename from tools/cli/installers/lib/ide/_config-driven.js rename to tools/installer/ide/_config-driven.js index c23938a40..603ffc7a4 100644 --- a/tools/cli/installers/lib/ide/_config-driven.js +++ b/tools/installer/ide/_config-driven.js @@ -2,7 +2,7 @@ const os = require('node:os'); const path = require('node:path'); const fs = require('fs-extra'); const yaml = require('yaml'); -const prompts = require('../../../lib/prompts'); +const prompts = require('../prompts'); const csv = require('csv-parse/sync'); const { BMAD_FOLDER_NAME } = require('./shared/path-utils'); diff --git a/tools/cli/installers/lib/ide/manager.js b/tools/installer/ide/manager.js similarity index 99% rename from tools/cli/installers/lib/ide/manager.js rename to tools/installer/ide/manager.js index d6ea07039..ac49a8773 100644 --- a/tools/cli/installers/lib/ide/manager.js +++ b/tools/installer/ide/manager.js @@ -1,5 +1,5 @@ const { BMAD_FOLDER_NAME } = require('./shared/path-utils'); -const prompts = require('../../../lib/prompts'); +const prompts = require('../prompts'); /** * IDE Manager - handles IDE-specific setup diff --git a/tools/cli/installers/lib/ide/platform-codes.js b/tools/installer/ide/platform-codes.js similarity index 100% rename from tools/cli/installers/lib/ide/platform-codes.js rename to tools/installer/ide/platform-codes.js diff --git a/tools/cli/installers/lib/ide/platform-codes.yaml b/tools/installer/ide/platform-codes.yaml similarity index 100% rename from tools/cli/installers/lib/ide/platform-codes.yaml rename to tools/installer/ide/platform-codes.yaml diff --git a/tools/cli/installers/lib/ide/shared/agent-command-generator.js b/tools/installer/ide/shared/agent-command-generator.js similarity index 100% rename from tools/cli/installers/lib/ide/shared/agent-command-generator.js rename to tools/installer/ide/shared/agent-command-generator.js diff --git a/tools/cli/installers/lib/ide/shared/bmad-artifacts.js b/tools/installer/ide/shared/bmad-artifacts.js similarity index 100% rename from tools/cli/installers/lib/ide/shared/bmad-artifacts.js rename to tools/installer/ide/shared/bmad-artifacts.js diff --git a/tools/cli/installers/lib/ide/shared/module-injections.js b/tools/installer/ide/shared/module-injections.js similarity index 98% rename from tools/cli/installers/lib/ide/shared/module-injections.js rename to tools/installer/ide/shared/module-injections.js index fe3f999d8..3090c5da4 100644 --- a/tools/cli/installers/lib/ide/shared/module-injections.js +++ b/tools/installer/ide/shared/module-injections.js @@ -2,7 +2,7 @@ const path = require('node:path'); const fs = require('fs-extra'); const yaml = require('yaml'); const { glob } = require('glob'); -const { getSourcePath } = require('../../../../lib/project-root'); +const { getSourcePath } = require('../../project-root'); async function loadModuleInjectionConfig(handler, moduleName) { const sourceModulesPath = getSourcePath('modules'); diff --git a/tools/cli/installers/lib/ide/shared/path-utils.js b/tools/installer/ide/shared/path-utils.js similarity index 100% rename from tools/cli/installers/lib/ide/shared/path-utils.js rename to tools/installer/ide/shared/path-utils.js diff --git a/tools/cli/installers/lib/ide/shared/skill-manifest.js b/tools/installer/ide/shared/skill-manifest.js similarity index 100% rename from tools/cli/installers/lib/ide/shared/skill-manifest.js rename to tools/installer/ide/shared/skill-manifest.js diff --git a/tools/cli/installers/lib/ide/templates/agent-command-template.md b/tools/installer/ide/templates/agent-command-template.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/agent-command-template.md rename to tools/installer/ide/templates/agent-command-template.md diff --git a/tools/cli/installers/lib/ide/templates/combined/antigravity.md b/tools/installer/ide/templates/combined/antigravity.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/antigravity.md rename to tools/installer/ide/templates/combined/antigravity.md diff --git a/tools/cli/installers/lib/ide/templates/combined/claude-agent.md b/tools/installer/ide/templates/combined/claude-agent.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/claude-agent.md rename to tools/installer/ide/templates/combined/claude-agent.md diff --git a/tools/cli/installers/lib/ide/templates/combined/claude-workflow-yaml.md b/tools/installer/ide/templates/combined/claude-workflow-yaml.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/claude-workflow-yaml.md rename to tools/installer/ide/templates/combined/claude-workflow-yaml.md diff --git a/tools/cli/installers/lib/ide/templates/combined/claude-workflow.md b/tools/installer/ide/templates/combined/claude-workflow.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/claude-workflow.md rename to tools/installer/ide/templates/combined/claude-workflow.md diff --git a/tools/cli/installers/lib/ide/templates/combined/default-agent.md b/tools/installer/ide/templates/combined/default-agent.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/default-agent.md rename to tools/installer/ide/templates/combined/default-agent.md diff --git a/tools/cli/installers/lib/ide/templates/combined/default-task.md b/tools/installer/ide/templates/combined/default-task.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/default-task.md rename to tools/installer/ide/templates/combined/default-task.md diff --git a/tools/cli/installers/lib/ide/templates/combined/default-tool.md b/tools/installer/ide/templates/combined/default-tool.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/default-tool.md rename to tools/installer/ide/templates/combined/default-tool.md diff --git a/tools/cli/installers/lib/ide/templates/combined/default-workflow.md b/tools/installer/ide/templates/combined/default-workflow.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/default-workflow.md rename to tools/installer/ide/templates/combined/default-workflow.md diff --git a/tools/cli/installers/lib/ide/templates/combined/gemini-agent.toml b/tools/installer/ide/templates/combined/gemini-agent.toml similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/gemini-agent.toml rename to tools/installer/ide/templates/combined/gemini-agent.toml diff --git a/tools/cli/installers/lib/ide/templates/combined/gemini-task.toml b/tools/installer/ide/templates/combined/gemini-task.toml similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/gemini-task.toml rename to tools/installer/ide/templates/combined/gemini-task.toml diff --git a/tools/cli/installers/lib/ide/templates/combined/gemini-tool.toml b/tools/installer/ide/templates/combined/gemini-tool.toml similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/gemini-tool.toml rename to tools/installer/ide/templates/combined/gemini-tool.toml diff --git a/tools/cli/installers/lib/ide/templates/combined/gemini-workflow-yaml.toml b/tools/installer/ide/templates/combined/gemini-workflow-yaml.toml similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/gemini-workflow-yaml.toml rename to tools/installer/ide/templates/combined/gemini-workflow-yaml.toml diff --git a/tools/cli/installers/lib/ide/templates/combined/gemini-workflow.toml b/tools/installer/ide/templates/combined/gemini-workflow.toml similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/gemini-workflow.toml rename to tools/installer/ide/templates/combined/gemini-workflow.toml diff --git a/tools/cli/installers/lib/ide/templates/combined/kiro-agent.md b/tools/installer/ide/templates/combined/kiro-agent.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/kiro-agent.md rename to tools/installer/ide/templates/combined/kiro-agent.md diff --git a/tools/cli/installers/lib/ide/templates/combined/kiro-task.md b/tools/installer/ide/templates/combined/kiro-task.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/kiro-task.md rename to tools/installer/ide/templates/combined/kiro-task.md diff --git a/tools/cli/installers/lib/ide/templates/combined/kiro-tool.md b/tools/installer/ide/templates/combined/kiro-tool.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/kiro-tool.md rename to tools/installer/ide/templates/combined/kiro-tool.md diff --git a/tools/cli/installers/lib/ide/templates/combined/kiro-workflow.md b/tools/installer/ide/templates/combined/kiro-workflow.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/kiro-workflow.md rename to tools/installer/ide/templates/combined/kiro-workflow.md diff --git a/tools/cli/installers/lib/ide/templates/combined/opencode-agent.md b/tools/installer/ide/templates/combined/opencode-agent.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/opencode-agent.md rename to tools/installer/ide/templates/combined/opencode-agent.md diff --git a/tools/cli/installers/lib/ide/templates/combined/opencode-task.md b/tools/installer/ide/templates/combined/opencode-task.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/opencode-task.md rename to tools/installer/ide/templates/combined/opencode-task.md diff --git a/tools/cli/installers/lib/ide/templates/combined/opencode-tool.md b/tools/installer/ide/templates/combined/opencode-tool.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/opencode-tool.md rename to tools/installer/ide/templates/combined/opencode-tool.md diff --git a/tools/cli/installers/lib/ide/templates/combined/opencode-workflow-yaml.md b/tools/installer/ide/templates/combined/opencode-workflow-yaml.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/opencode-workflow-yaml.md rename to tools/installer/ide/templates/combined/opencode-workflow-yaml.md diff --git a/tools/cli/installers/lib/ide/templates/combined/opencode-workflow.md b/tools/installer/ide/templates/combined/opencode-workflow.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/opencode-workflow.md rename to tools/installer/ide/templates/combined/opencode-workflow.md diff --git a/tools/cli/installers/lib/ide/templates/combined/rovodev.md b/tools/installer/ide/templates/combined/rovodev.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/rovodev.md rename to tools/installer/ide/templates/combined/rovodev.md diff --git a/tools/cli/installers/lib/ide/templates/combined/trae.md b/tools/installer/ide/templates/combined/trae.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/trae.md rename to tools/installer/ide/templates/combined/trae.md diff --git a/tools/cli/installers/lib/ide/templates/combined/windsurf-workflow.md b/tools/installer/ide/templates/combined/windsurf-workflow.md similarity index 100% rename from tools/cli/installers/lib/ide/templates/combined/windsurf-workflow.md rename to tools/installer/ide/templates/combined/windsurf-workflow.md diff --git a/tools/cli/installers/lib/ide/templates/split/.gitkeep b/tools/installer/ide/templates/split/.gitkeep similarity index 100% rename from tools/cli/installers/lib/ide/templates/split/.gitkeep rename to tools/installer/ide/templates/split/.gitkeep diff --git a/tools/cli/installers/install-messages.yaml b/tools/installer/install-messages.yaml similarity index 100% rename from tools/cli/installers/install-messages.yaml rename to tools/installer/install-messages.yaml diff --git a/tools/cli/installers/lib/message-loader.js b/tools/installer/message-loader.js similarity index 93% rename from tools/cli/installers/lib/message-loader.js rename to tools/installer/message-loader.js index 7198f0328..03ba7eca1 100644 --- a/tools/cli/installers/lib/message-loader.js +++ b/tools/installer/message-loader.js @@ -1,7 +1,7 @@ const fs = require('fs-extra'); const path = require('node:path'); const yaml = require('yaml'); -const prompts = require('../../lib/prompts'); +const prompts = require('./prompts'); /** * Load and display installer messages from messages.yaml @@ -18,7 +18,7 @@ class MessageLoader { return this.messages; } - const messagesPath = path.join(__dirname, '..', 'install-messages.yaml'); + const messagesPath = path.join(__dirname, 'install-messages.yaml'); try { const content = fs.readFileSync(messagesPath, 'utf8'); diff --git a/tools/cli/installers/lib/modules/custom-modules.js b/tools/installer/modules/custom-modules.js similarity index 99% rename from tools/cli/installers/lib/modules/custom-modules.js rename to tools/installer/modules/custom-modules.js index 68144aa7e..17e5aa86f 100644 --- a/tools/cli/installers/lib/modules/custom-modules.js +++ b/tools/installer/modules/custom-modules.js @@ -3,7 +3,7 @@ const fs = require('fs-extra'); const yaml = require('yaml'); const { CustomHandler } = require('../custom-handler'); const { Manifest } = require('../core/manifest'); -const prompts = require('../../../lib/prompts'); +const prompts = require('../prompts'); class CustomModules { constructor() { diff --git a/tools/cli/installers/lib/modules/external-manager.js b/tools/installer/modules/external-manager.js similarity index 98% rename from tools/cli/installers/lib/modules/external-manager.js rename to tools/installer/modules/external-manager.js index 8fe0d5ae8..467520163 100644 --- a/tools/cli/installers/lib/modules/external-manager.js +++ b/tools/installer/modules/external-manager.js @@ -3,7 +3,7 @@ const os = require('node:os'); const path = require('node:path'); const { execSync } = require('node:child_process'); const yaml = require('yaml'); -const prompts = require('../../../lib/prompts'); +const prompts = require('../prompts'); /** * Manages external official modules defined in external-official-modules.yaml @@ -13,7 +13,7 @@ const prompts = require('../../../lib/prompts'); */ class ExternalModuleManager { constructor() { - this.externalModulesConfigPath = path.join(__dirname, '../../../external-official-modules.yaml'); + this.externalModulesConfigPath = path.join(__dirname, '../external-official-modules.yaml'); this.cachedModules = null; } diff --git a/tools/cli/installers/lib/modules/official-modules.js b/tools/installer/modules/official-modules.js similarity index 99% rename from tools/cli/installers/lib/modules/official-modules.js rename to tools/installer/modules/official-modules.js index cda2f6149..b807f44f2 100644 --- a/tools/cli/installers/lib/modules/official-modules.js +++ b/tools/installer/modules/official-modules.js @@ -1,9 +1,9 @@ const path = require('node:path'); const fs = require('fs-extra'); const yaml = require('yaml'); -const prompts = require('../../../lib/prompts'); -const { getProjectRoot, getSourcePath, getModulePath } = require('../../../lib/project-root'); -const { CLIUtils } = require('../../../lib/cli-utils'); +const prompts = require('../prompts'); +const { getProjectRoot, getSourcePath, getModulePath } = require('../project-root'); +const { CLIUtils } = require('../cli-utils'); const { ExternalModuleManager } = require('./external-manager'); class OfficialModules { diff --git a/tools/cli/lib/project-root.js b/tools/installer/project-root.js similarity index 100% rename from tools/cli/lib/project-root.js rename to tools/installer/project-root.js diff --git a/tools/cli/lib/prompts.js b/tools/installer/prompts.js similarity index 100% rename from tools/cli/lib/prompts.js rename to tools/installer/prompts.js diff --git a/tools/cli/lib/ui.js b/tools/installer/ui.js similarity index 97% rename from tools/cli/lib/ui.js rename to tools/installer/ui.js index 134078b3b..1a33c7211 100644 --- a/tools/cli/lib/ui.js +++ b/tools/installer/ui.js @@ -2,8 +2,8 @@ const path = require('node:path'); const os = require('node:os'); const fs = require('fs-extra'); const { CLIUtils } = require('./cli-utils'); -const { CustomHandler } = require('../installers/lib/custom-handler'); -const { ExternalModuleManager } = require('../installers/lib/modules/external-manager'); +const { CustomHandler } = require('./custom-handler'); +const { ExternalModuleManager } = require('./modules/external-manager'); const prompts = require('./prompts'); // Separator class for visual grouping in select/multiselect prompts @@ -32,7 +32,7 @@ class UI { await CLIUtils.displayLogo(); // Display version-specific start message from install-messages.yaml - const { MessageLoader } = require('../installers/lib/message-loader'); + const { MessageLoader } = require('./message-loader'); const messageLoader = new MessageLoader(); await messageLoader.displayStartMessage(); @@ -51,7 +51,7 @@ class UI { confirmedDirectory = await this.getConfirmedDirectory(); } - const { Installer } = require('../installers/lib/core/installer'); + const { Installer } = require('./core/installer'); const installer = new Installer(); const { bmadDir } = await installer.findBmadDir(confirmedDirectory); @@ -279,7 +279,7 @@ class UI { customModuleResult = await this.handleCustomModulesInModifyFlow(confirmedDirectory, selectedModules); } else { // Preserve existing custom modules if user doesn't want to modify them - const { Installer } = require('../installers/lib/core/installer'); + const { Installer } = require('./core/installer'); const installer = new Installer(); const { bmadDir } = await installer.findBmadDir(confirmedDirectory); @@ -452,15 +452,15 @@ class UI { * @returns {Object} Tool configuration */ async promptToolSelection(projectDir, options = {}) { - const { ExistingInstall } = require('../installers/lib/core/existing-install'); - const { Installer } = require('../installers/lib/core/installer'); + const { ExistingInstall } = require('./core/existing-install'); + const { Installer } = require('./core/installer'); const installer = new Installer(); const { bmadDir } = await installer.findBmadDir(projectDir || process.cwd()); const existingInstall = await ExistingInstall.detect(bmadDir); const configuredIdes = existingInstall.ides; // Get IDE manager to fetch available IDEs dynamically - const { IdeManager } = require('../installers/lib/ide/manager'); + const { IdeManager } = require('./ide/manager'); const ideManager = new IdeManager(); await ideManager.ensureInitialized(); // IMPORTANT: Must initialize before getting IDEs @@ -690,8 +690,8 @@ class UI { * @returns {Object} Object with existingInstall, installedModuleIds, and bmadDir */ async getExistingInstallation(directory) { - const { ExistingInstall } = require('../installers/lib/core/existing-install'); - const { Installer } = require('../installers/lib/core/installer'); + const { ExistingInstall } = require('./core/existing-install'); + const { Installer } = require('./core/installer'); const installer = new Installer(); const { bmadDir } = await installer.findBmadDir(directory); const existingInstall = await ExistingInstall.detect(bmadDir); @@ -709,7 +709,7 @@ class UI { * @returns {Object} Collected module configurations keyed by module name */ async collectModuleConfigs(directory, modules, options = {}) { - const { OfficialModules } = require('../installers/lib/modules/official-modules'); + const { OfficialModules } = require('./modules/official-modules'); const configCollector = new OfficialModules(); // Seed core config from CLI options if provided @@ -809,7 +809,7 @@ class UI { } // Add official modules - const { OfficialModules } = require('../installers/lib/modules/official-modules'); + const { OfficialModules } = require('./modules/official-modules'); const officialModules = new OfficialModules(); const { modules: availableModules, customModules: customModulesFromCache } = await officialModules.listAvailable(); @@ -866,7 +866,7 @@ class UI { * @returns {Array} Selected module codes (excluding core) */ async selectAllModules(installedModuleIds = new Set()) { - const { OfficialModules } = require('../installers/lib/modules/official-modules'); + const { OfficialModules } = require('./modules/official-modules'); const officialModulesSource = new OfficialModules(); const { modules: localModules } = await officialModulesSource.listAvailable(); @@ -963,7 +963,7 @@ class UI { * @returns {Array} Default module codes */ async getDefaultModules(installedModuleIds = new Set()) { - const { OfficialModules } = require('../installers/lib/modules/official-modules'); + const { OfficialModules } = require('./modules/official-modules'); const officialModules = new OfficialModules(); const { modules: localModules } = await officialModules.listAvailable(); @@ -1023,7 +1023,7 @@ class UI { const files = await fs.readdir(directory); if (files.length > 0) { // Check for any bmad installation (any folder with _config/manifest.yaml) - const { Installer } = require('../installers/lib/core/installer'); + const { Installer } = require('./core/installer'); const installer = new Installer(); const bmadResult = await installer.findBmadDir(directory); const hasBmadInstall = @@ -1265,8 +1265,8 @@ class UI { * @returns {Array} List of configured IDEs */ async getConfiguredIdes(directory) { - const { ExistingInstall } = require('../installers/lib/core/existing-install'); - const { Installer } = require('../installers/lib/core/installer'); + const { ExistingInstall } = require('./core/existing-install'); + const { Installer } = require('./core/installer'); const installer = new Installer(); const { bmadDir } = await installer.findBmadDir(directory); const existingInstall = await ExistingInstall.detect(bmadDir); @@ -1415,7 +1415,7 @@ class UI { const { existingInstall } = await this.getExistingInstallation(directory); // Check if there are any custom modules in cache - const { Installer } = require('../installers/lib/core/installer'); + const { Installer } = require('./core/installer'); const installer = new Installer(); const { bmadDir } = await installer.findBmadDir(directory); diff --git a/tools/cli/lib/yaml-format.js b/tools/installer/yaml-format.js similarity index 100% rename from tools/cli/lib/yaml-format.js rename to tools/installer/yaml-format.js