Commit Graph

271 Commits

Author SHA1 Message Date
Alex Verkhovsky c31e334dd8 refactor(installer): remove IdeConfigManager and dead IDE config flow
Delete IdeConfigManager — IDE configs it persisted were empty
markers ({_noConfigNeeded: true}) that no code consumed.
ExistingInstall already tracks which IDEs are installed via the
manifest. Remove _loadIdeConfigurations, collectToolConfigurations
(never called), and the ideConfigurations plumbing from install().
2026-03-22 01:24:50 -06:00
Alex Verkhovsky d0f03869ca refactor(installer): remove dead platform-codes helpers and YAML cruft
Delete unused PlatformCodes class from tools/cli/lib/. Strip dead
helper functions from platform-codes.js (getPlatformInfo,
getPreferredPlatforms, getPlatformsByCategory, etc). Remove
unread category, description, categories, and conventions
sections from platform-codes.yaml.
2026-03-22 01:20:14 -06:00
Alex Verkhovsky 793edd0026 refactor(installer): flatten IDE hierarchy and remove dead code
Delete BaseIdeSetup class and merge surviving members into
ConfigDrivenIdeSetup, eliminating the inheritance hierarchy.
Remove unused template system, multi-target support,
installCustomAgentLauncher, and vestigial config keys
(template_type, skill_format, artifact_types) from
platform-codes.yaml. Freeze Config instance and arrays.
Move Config class to installers/lib/core/. Remove force flag
from update paths. Convert OfficialModules.collectConfigs to
static build().
2026-03-22 01:18:36 -06:00
Alex Verkhovsky 3e54815961 refactor(installer): replace Detector class with ExistingInstall value object
Remove all legacy/v4 detection and migration code. Replace stateless
Detector class with immutable ExistingInstall that exposes a static
detect() factory and precomputed query properties (moduleIds, ides).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 00:51:31 -06:00
Alex Verkhovsky 232fba8cc8 refactor(installer): merge ConfigCollector into OfficialModules
Move all config collection state and methods from config-collector.js
into OfficialModules. Move interactive config prompting from install()
into ui.js so install() never prompts. Delete config-collector.js and
eliminate the moduleConfigs parameter chain from _installAndConfigure,
_installOfficialModules, and _installCustomModules.
2026-03-21 23:58:37 -06:00
Alex Verkhovsky e0e59e66bf refactor(installer): remove logo display and setBmadFolderName from install()
Logo display belongs in ui.js, not install(). setBmadFolderName call
was redundant — IdeManager constructor already defaults to the same
constant. Remove dead CLIUtils import.
2026-03-21 21:51:48 -06:00
Alex Verkhovsky 2c84ed8482 refactor(installer): make install() prompt-free
Replace interactive module/IDE removal confirmations with
unconditional removal — the user's selection is the decision.
Remove promptUpdateAction fallback (ui.js always provides actionType).
Extract _removeDeselectedModules, _loadIdeConfigurations,
_validateIdeSelection, _removeDeselectedIdes from install() body.
2026-03-21 21:33:53 -06:00
Alex Verkhovsky 5ecd498c10 refactor(installer): extract _installAndConfigure from install()
Move module installation, directory creation, config generation, and
manifest generation into a single method. The install() execution
section is now five named method calls followed by summary and return.
2026-03-21 21:07:13 -06:00
Alex Verkhovsky 1befede51d refactor(installer): remove spinners and extract execution methods
Remove all spinner management from install(), quickUpdate(), update(),
_prepareUpdateState(), and _backupUserFiles(). Extract four named
methods from the install() execution tail: _cacheCustomModules(),
_buildModuleLists(), _setupIdes(), _restoreUserFiles().
2026-03-21 20:54:58 -06:00
Alex Verkhovsky 1a519b9748 refactor(installer): extract _prepareUpdateState to unify update branches
Both the regular update and quick-update branches of install() shared
identical sequences: set update flags, detect custom/modified files,
scan cached custom modules, and back up user files. Extract into a
single _prepareUpdateState method called by both branches. Core config
preservation is included (harmless no-op for quick-update which already
has core config).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 20:05:55 -06:00
Alex Verkhovsky 206984f3db refactor(installer): extract _backupUserFiles to deduplicate backup logic
The identical custom-file and modified-file backup loops appeared in both
the regular update and quick-update branches of install(). Extract into
a single _backupUserFiles method that returns temp directory paths.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 20:02:52 -06:00
Alex Verkhovsky 3821b01395 refactor(installer): extract _scanCachedCustomModules to deduplicate cache loop
The identical cache-scanning loop appeared in both the regular update
and quick-update branches of install(). Extract into a single method.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 20:01:27 -06:00
Alex Verkhovsky a567170501 style(installer): move _buildConfig below install per callers-above-callees 2026-03-21 05:29:58 -06:00
Alex Verkhovsky 8d9ea3b95d refactor(installer): move isQuickUpdate into clean config
Add isQuickUpdate() to _buildConfig so the official path can check it
without reaching into customConfig. Replace all customConfig._quickUpdate
references with config.isQuickUpdate().
2026-03-21 05:28:39 -06:00
Alex Verkhovsky a9ba16cff5 refactor(installer): make _collectConfigs take clean config only
Move _quickUpdate short-circuit to the call site in install() so
_collectConfigs receives the clean config object and has no dependency
on customConfig. Uses config.hasCoreConfig() instead of inline check.
2026-03-21 05:26:19 -06:00
Alex Verkhovsky e41cc1f822 refactor(installer): extract _buildConfig method with hasCoreConfig()
Move config normalization into _buildConfig(originalConfig) so the gate
logic is a named, testable method. Add hasCoreConfig() on the returned
config object to replace the repeated coreConfig && Object.keys pattern.
2026-03-21 05:24:54 -06:00
Alex Verkhovsky 68f723d427 refactor(installer): normalize config gate and flatten core into module list
Split install() input into config (clean official fields) and customConfig
(full originalConfig copy for custom module concerns). Core is no longer
special-cased — it's just another module in config.modules that goes through
OfficialModules.install(). Deletes installCore(), copyCoreFiles(), copyFile(),
getFileList() dead code. Updates ui.js and quickUpdate() callers to keep core
in the modules list instead of setting installCore: true.
2026-03-21 05:23:02 -06:00
Alex Verkhovsky aa406419e7 refactor(installer): remove customModulePaths local variable
install() no longer stores the return value of discoverPaths —
this.customModules.paths is accessed directly throughout.
Remove customModulePaths parameter from _installCustomModules.
2026-03-21 04:53:29 -06:00
Alex Verkhovsky 4a76289b35 refactor(installer): make discoverPaths populate this.paths directly
discoverPaths now sets this.paths internally instead of returning
a Map that the caller feeds back via setPaths. Remove setPaths
and all 5 no-op setPaths calls in installer.js.
2026-03-21 04:47:46 -06:00
Alex Verkhovsky a7beab59b9 refactor(installer): move discoverCustomModulePaths into CustomModules
Rename to CustomModules.discoverPaths() and move from installer.js
into custom-modules.js where it belongs.
2026-03-21 04:43:58 -06:00
Alex Verkhovsky ea8c076e29 refactor(installer): split ModuleManager into OfficialModules and CustomModules
OfficialModules handles source resolution (core, bmm, external),
module install/update/remove, directory creation, and file copying.
CustomModules holds the custom module paths Map. findModuleSource
now knows core explicitly. install() accepts optional sourcePath
for custom modules that already know their source.
2026-03-21 04:35:47 -06:00
Alex Verkhovsky 2a9df6377e style(installer): replace lazy singletons with normal requires
Use top-level require and constructor instantiation for
ExternalModuleManager instead of module-scoped lazy singletons.
2026-03-21 04:15:51 -06:00
Alex Verkhovsky ad2833caf6 refactor(installer): move external module ops into ExternalModuleManager
Move cloneExternalModule, findExternalModuleSource, and
getExternalCacheDir from ModuleManager into ExternalModuleManager
where they belong. Replace this.moduleManager.isExternalModule()
calls with direct ExternalModuleManager.hasModule(). Remove
externalModuleManager instance from ModuleManager constructor.
2026-03-21 04:09:35 -06:00
Alex Verkhovsky 89812ec846 refactor(installer): remove dead state from ModuleManager
Remove setBmadFolderName (set to constant, never read),
setCoreConfig (set, never read), dead listAvailable branch
guarded by never-assigned this.bmadDir, and unused
BMAD_FOLDER_NAME import.
2026-03-21 04:01:22 -06:00
Alex Verkhovsky fba77e3e89 refactor(installer): split module install loop into official and custom passes
Extract _installOfficialModules and _installCustomModules from the
interleaved module installation loop. Each method works from its own
source list, eliminating the allModules merge-then-re-split pattern.
Remove unused destructuring of paths into local variables.
2026-03-21 03:59:23 -06:00
Alex Verkhovsky eade619d17 refactor(installer): remove dead dependency resolver
No skills declare cross-module dependencies. The resolver ran four
resolution passes on every install, but both consumers
(installCoreWithDependencies, installModuleWithDependencies) ignored
the resolution data and copied entire module directories anyway.
The sole non-dead consumer (installPartialModule) never fired.

Delete dependency-resolver.js (743 lines), three dead wrapper methods,
and all feeding/filtering logic in install(). Official modules now
call installCore/moduleManager.install directly.
2026-03-21 03:12:00 -06:00
Alex Verkhovsky 9f7ec48a89 refactor(installer): flatten custom/ directory into custom-handler.js
Single file doesn't need its own directory.
2026-03-21 02:45:20 -06:00
Alex Verkhovsky 472c1c9c22 refactor(installer): extract _collectConfigs and _discoverCustomModulePaths
Split the monolithic config collection block in install() into two
methods: _collectConfigs for official modules only, and
_discoverCustomModulePaths for custom module source discovery.
2026-03-21 02:36:51 -06:00
Alex Verkhovsky e8d041a51c refactor(installer): replace copyFileWithPlaceholderReplacement with copyFile
The placeholder replacement logic was removed long ago but the method
still did a pointless read-as-UTF8-then-write-unchanged dance with a
binary fallback. Just use fs.copy.
2026-03-21 02:22:34 -06:00
Alex Verkhovsky c92d84d74a style(installer): reorder methods to callers-above-callees convention 2026-03-21 02:21:40 -06:00
Alex Verkhovsky 1a1909a7f9 refactor(installer): extract InstallPaths class for path init and validation
Replace inline path construction in install() with a dedicated class
that ensures all structural directories exist, validates permissions,
and provides derived-path methods for manifests and modules.
2026-03-21 01:47:20 -06:00
Alex Verkhovsky 93a1e1dc46
refactor(installer): remove dead task/tool/workflow manifest code (#2083)
* refactor(installer): discover skills by SKILL.md instead of manifest YAML

Switch skill discovery gate from requiring bmad-skill-manifest.yaml with
type: skill to detecting any directory with a valid SKILL.md (frontmatter
name + description, name matches directory name). Delete 34 stub manifests
that carried no data beyond type: skill. Agent manifests (9) are retained
for persona metadata consumed by agent-manifest.csv.

* refactor(installer): remove dead task/tool/workflow manifest code

The remove-skill-manifest-yaml branch deleted the scanners that
discover tasks, tools, and workflows but left behind the code that
writes their manifest CSVs. Remove collectTasks/Tools/Workflows,
writeTaskManifest/ToolManifest/WorkflowManifest, their helpers, and
the now-unreachable getPreservedCsvRows/upgradeRowToSchema methods.
Update installer pre-registration and test assertions accordingly.
2026-03-21 00:12:40 -06:00
Alex Verkhovsky 31ae226bb4
refactor(installer): discover skills by SKILL.md instead of manifest YAML (#2082)
Switch skill discovery gate from requiring bmad-skill-manifest.yaml with
type: skill to detecting any directory with a valid SKILL.md (frontmatter
name + description, name matches directory name). Delete 34 stub manifests
that carried no data beyond type: skill. Agent manifests (9) are retained
for persona metadata consumed by agent-manifest.csv.
2026-03-21 00:11:23 -06:00
Alex Verkhovsky c28206dca4
refactor(installer): remove dead agent compilation pipeline (#2080)
* refactor(installer): remove dead agent compilation pipeline

Delete 9 files (~2,600 lines) that compiled .agent.yaml to .md.
No .agent.yaml files exist in the source tree — agents now ship
as pre-built SKILL.md. Clean up all references in installer,
module manager, custom handler, base IDE, UI, and tests.

* refactor(custom-handler): remove dead install/copy/find methods

CustomHandler.install(), copyDirectory(), and findFilesRecursively()
are never called — custom modules are installed via moduleManager.install()
since Dec 2025. Also removes unused FileOps import and constructor.

Verified with before/after clean-installer comparison (codex + custom
modules with custom.yaml): output is identical.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(installer): remove dead compilation refs from docs and module manager

Address review findings from PR #2080 triage:
- Remove compile-agents from CLI action docs (en, fr, zh-cn)
- Remove dead vendorCrossModuleWorkflows() and .agent.yaml skip logic
- Clean stale compilation-era comments in manifest-generator

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 22:52:02 -06:00
Alex Verkhovsky 1cb913523e
refactor(installer): remove legacy workflow, task, and agent IDE generators (#2078)
* refactor(installer): remove legacy workflow, task, and agent IDE generators

All platforms now use skill_format exclusively. The old
WorkflowCommandGenerator, TaskToolCommandGenerator, and
AgentCommandGenerator code paths in _config-driven.js were
no-ops — collectSkills claims every directory before the
legacy collectors run, making their manifests empty.

Removed:
- workflow-command-generator.js (deleted)
- task-tool-command-generator.js (deleted)
- writeAgentArtifacts, writeWorkflowArtifacts, writeTaskToolArtifacts
- AgentCommandGenerator import from _config-driven.js
- Legacy artifact_types/agents/workflows/tasks result fields

Simplified installToTarget, installToMultipleTargets, printSummary,
and IDE manager detail builder to skills-only.

Updated test fixture to use SKILL.md format instead of old agent format.

* fix(installer): address PR review findings from #2078

- Fix temp dir leak in test fixture cleanup (use path.dirname)
- Fail loudly when skill_format missing instead of silent success
- Add workflow.md to test fixture for verbatim-copy coverage

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 15:18:47 -06:00
Murat K Ozcan 1786d1debc
fix: tea agent start (#2067)
* fix: tea agent start

* fix: addressed PR comment
2026-03-19 11:40:43 -05:00
Frank 3c8d865457
fix: update src/core and src/bmm path references to match renamed directories (#2053)
The v6.2.0 release renamed src/core to src/core-skills and src/bmm to
src/bmm-skills, but the installer CLI code still referenced the old
directory names, causing ENOENT crashes during installation.

Updated all path references across 7 files in tools/cli/ including
path.join() calls, string comparisons, regex patterns, and comments.

Fixes #2052

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Brian <bmadcode@gmail.com>
2026-03-18 19:29:16 -05:00
Alex Verkhovsky be6611570a
Merge branch 'main' into feat/add-ona-platform-support 2026-03-16 07:26:53 -06:00
Brian bed9052d49
Feat/conformant agent skills (#2021)
* feat(agents): convert all BMM agents to conformant skill structure

Replace legacy XML-based .agent.yaml files with new SKILL.md + bmad-manifest.json
format for all 9 BMM agents (analyst, architect, dev, pm, qa, sm,
quick-flow-solo-dev, ux-designer, tech-writer). Each agent now has:

- SKILL.md with persona, activation flow (bmad-init, project context, dynamic menu)
- bmad-manifest.json with capabilities referencing external skills
- bmad-skill-manifest.yaml for party-mode agent-manifest.csv generation

Tech-writer includes internal prompt files for write-document, mermaid-gen,
validate-doc, and explain-concept capabilities.

Also includes core bmad-init skill and removes legacy agent compilation tests
that referenced the old .agent.yaml format.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(installer): support new SKILL.md agent format in manifest generation

Update getAgentsFromDir to detect directories with bmad-skill-manifest.yaml
where type=agent and extract metadata directly from the YAML fields. This
allows the agent-manifest.csv to be populated from both old-format compiled
.md agents (XML parsing) and new-format SKILL.md agents (YAML manifest).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(installer): install type:agent skills to IDE native skills directory

The collectSkills scanner only recognized type:skill manifests, causing
new-format agents (type:agent in bmad-skill-manifest.yaml) to be added
to agent-manifest.csv but not installed to .claude/skills/. Now both
type:skill and type:agent are recognized as installable skills, while
collectAgents still processes type:agent dirs for the agent manifest
even when claimed by the skill scanner.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(installer): suppress canonicalId warning for type:agent skills

Agent-type skill manifests legitimately use canonicalId for agent-manifest
mapping (e.g., bmad-analyst). Only warn for regular type:skill manifests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(skills): update analyst manifest and simplify bmad-init instructions

Switch analyst's create-brief menu entry to the new product-brief-preview
skill. Simplify bmad-init SKILL.md by removing hardcoded code fences and
making the script path relative to the skill directory.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(bmm): update tech-writer CSV refs to new skill path

The module-help.csv still referenced the old agent YAML path for
tech-writer entries. Update to skill:bmad-agent-tech-writer to match
the conformant skill structure.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 00:47:30 -05:00
Alex Verkhovsky 8e8432e138
Merge branch 'main' into main 2026-03-15 20:45:41 -06:00
JasonYe d42de639bc add Qoder code agent support 2026-03-16 08:18:02 +08:00
Alex Verkhovsky 2aa5cddbe6
Merge branch 'main' into feat/add-ona-platform-support 2026-03-15 06:35:23 -06:00
Brian cbb8b98876
manifest generate will no longer fail when module has no agents and its first (#1998) 2026-03-15 01:46:16 -05:00
Moritz Eysholdt df4d53de0e feat: add Ona as a supported platform
Add Ona (ona.com) to the BMAD installer so users can select it during
`npx bmad-method install` or via `--tools ona`. Skills are installed to
`.ona/skills/<name>/SKILL.md` using the default templates.

Fixes #1967

Co-authored-by: Ona <no-reply@ona.com>
2026-03-14 02:49:35 +00:00
Alex Verkhovsky d39fcd5938
Convert create-story workflow to native skill package (#1939)
* convert create-story workflow to native skill package

* fix(create-story): update converted workflow path refs

* fix(sm-agent): use skill reference for create-story
2026-03-12 22:58:53 -06:00
Alex Verkhovsky a48fd4aae8
refactor(skills): convert brainstorming to native skill (#1924)
* refactor(skills): convert brainstorming to native skill

* fix(installer): skip workflow metadata for native skills

* revert: restore workflow metadata handling

* refactor(skills): remove duplicate party-mode workflow metadata

* fix(agents): invoke native skills via skill refs
2026-03-12 16:49:35 -06:00
Alex Verkhovsky 7b4875be79
fix(installer): separate skill and agent counts in summary (#1932)
Subtract agents from total skill directories so the summary shows
non-agent skills and agents as distinct counts (e.g. 34 skills, 10
agents) instead of double-counting agents in the skill total.
2026-03-12 09:13:14 -06:00
Alex Verkhovsky c57506464f
fix(installer): simplify install summary (#1915)
* fix(installer): simplify install summary

* style: fix prettier formatting in test file

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(installer): clean up temp dir leak and conditional IDE footer

- Return fixture root from createSkillCollisionFixture so cleanup
  removes the parent temp directory, not just the _bmad child
- Only show bmad-help next-step line when IDEs are configured

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 08:39:10 -06:00
Alex Verkhovsky 2a12c6b2f0
docs: drop slash-command prefix from skill references (#1892)
* docs: drop slash-command syntax from skill references (editorial)

Skill names like bmad-help are now shown without a / prefix since
invocation syntax varies across platforms. First-encounter locations
(README, getting-started, get-answers, installer message, bmad-help
display rules) get editorial framing so new users understand these
are skill names to invoke by name.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: mechanical removal of slash prefix from all remaining skill references

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 02:35:16 -06:00
Alex Verkhovsky 1b3c3c5013
refactor(skills): add SKILL.md entrypoint to skill directories (#1868)
* refactor(skills): add SKILL.md entrypoint to skill directories

Align skill source format with Open Skills standard: each skill
directory now contains a SKILL.md with name/description frontmatter
where name must match the directory name exactly. The installer
copies skill directories verbatim instead of generating SKILL.md.

- Add SKILL.md to both tracer bullet skill directories
- Strip name/description from workflow.md frontmatter (SKILL.md owns it)
- Installer reads metadata from SKILL.md, validates name matches dirname
- Install path in manifest CSV now points to SKILL.md
- Copy filter excludes OS/editor artifacts (.DS_Store, backups, dotfiles)
- Debug-guard validation messages, keep name-mismatch as hard error
- Add typeof guard for malformed YAML frontmatter
- Add negative test cases for parseSkillMd validation (Suite 30)

* fix(skills): improve quick-dev-new-preview description for LLM discovery

Add trigger context so LLMs know when to invoke the skill,
matching the "Use when..." pattern used by other skills.

* fix(cli): validate frontmatter name/description are strings in parseSkillMd

Prevents cleanForCSV() crash when YAML parses name or description as
a non-string type (number, object, boolean).

* fix(cli): address PR review findings (mkdtemp, regex escape, recursive filter)

- Replace Date.now() temp dir with fs.mkdtemp() in Suite 30 tests (F5)
- Replace unescaped RegExp with startsWith/slice for path prefix stripping (F7)
- Apply artifact filter recursively via fs.copy filter option (F8)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 02:08:29 -06:00