Skip to content

feat(installer): remote registry + remove custom content#2228

Merged
bmadcode merged 4 commits intomainfrom
install-custom-content
Apr 8, 2026
Merged

feat(installer): remote registry + remove custom content#2228
bmadcode merged 4 commits intomainfrom
install-custom-content

Conversation

@bmadcode
Copy link
Copy Markdown
Collaborator

@bmadcode bmadcode commented Apr 8, 2026

Summary

  • Remove custom content installation feature (custom module cache, custom-handler, custom-modules)
  • Switch module list source of truth from bundled external-official-modules.yaml to remote marketplace registry (registry/official.yaml via raw.githubusercontent.com)
  • Simplify selectAllModules/getDefaultModules to use registry as single source; registry order controls display order
  • Only show "Migrating legacy directories" message when legacy dirs actually exist
  • Falls back to bundled registry-fallback.yaml when GitHub is unreachable

Test plan

  • All 196 installation component tests pass
  • Linting, formatting, and markdown checks pass
  • Manual fresh install confirms module list matches registry order
  • Manual install with no network confirms fallback works

bmadcode added 4 commits April 7, 2026 21:03
Remove the entire local filesystem custom content feature from the
installer to make way for marketplace-based plugin installation.

Deleted: custom-handler.js, custom-module-cache.js, custom-modules.js
Removed: --custom-content CLI flag, interactive custom content prompts,
custom module caching, manifest tracking, missing-source resolution,
and related test suites. Updated docs across all translations.
Fix admonition syntax (remove accidental space in :::note) across 4
translated docs files, and update stale JSDoc on listAvailable().
Switch module list source of truth from bundled
external-official-modules.yaml to the remote marketplace registry
(registry/official.yaml) fetched via raw.githubusercontent.com.

- Rewrite ExternalModuleManager to fetch from GitHub with local fallback
- Simplify selectAllModules/getDefaultModules to use registry as single source
- Registry order controls display order; built_in flag prevents cloning
- Rename fallback file to registry-fallback.yaml in modules/
- Only show legacy migration message when legacy dirs actually exist
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 8, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a727cf9d-65b2-4037-8e6c-aabf000d5f90

📥 Commits

Reviewing files that changed from the base of the PR and between 5dbfb58 and 7899a38.

📒 Files selected for processing (4)
  • tools/installer/ide/_config-driven.js
  • tools/installer/modules/external-manager.js
  • tools/installer/modules/registry-fallback.yaml
  • tools/installer/ui.js

📝 Walkthrough

Walkthrough

The PR refactors the module installer to fetch external modules from a remote GitHub registry with local fallback support, adds pre-existence checks for legacy directory cleanup, and updates the UI layer to source module lists from the unified external module manager instead of separate sources.

Changes

Cohort / File(s) Summary
Module Registry Fetching
tools/installer/modules/external-manager.js, tools/installer/modules/registry-fallback.yaml
Replaced local YAML-only loading with remote GitHub registry fetching via HTTPS; added _fetch() and _normalizeModule() functions; updated config loading to return cached remote data with local fallback and empty module array on failure; changed findExternalModuleSource() to return null for both missing and builtIn modules; removed whiteport-design-studio from fallback registry.
IDE Configuration Cleanup
tools/installer/ide/_config-driven.js
Added pre-check using Promise.all with fs.pathExists to verify which legacy target directories exist before emitting migration message and performing cleanup operations; subsequent migration logic now executes only if at least one legacy directory exists.
Module UI Integration
tools/installer/ui.js
Refactored selectAllModules() and getDefaultModules() to source module lists exclusively from ExternalModuleManager().listAvailable() instead of combining local and official modules separately; simplified option builder to work with registry module objects using mod.code/mod.name/mod.description; removed separate core module insertion logic.

Sequence Diagram(s)

sequenceDiagram
    participant UI as UI Layer
    participant Manager as ExternalModuleManager
    participant HTTP as HTTPS Fetch
    participant GitHub as GitHub Registry
    participant Local as Local Fallback
    participant Cache as Cache
    
    UI->>Manager: listAvailable()
    Manager->>Cache: Check cachedModules
    alt Cache exists
        Cache-->>Manager: Return cached modules
    else Cache miss
        Manager->>HTTP: Fetch official.yaml from GitHub
        HTTP->>GitHub: GET registry/official.yaml
        alt Success
            GitHub-->>HTTP: Registry data (array format)
            HTTP-->>Manager: Module array
            Manager->>Manager: _normalizeModule() per entry
        else Fetch fails
            Manager->>Local: Load registry-fallback.yaml
            Local-->>Manager: Fallback registry (object format)
            Manager->>Manager: _normalizeModule() per entry
        end
        Manager->>Cache: Store in cachedModules
    end
    Manager-->>UI: Normalized module array
    UI->>UI: Build selection UI from array
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • alexeyv
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch install-custom-content

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@bmadcode bmadcode merged commit 5e038a8 into main Apr 8, 2026
5 checks passed
@augmentcode
Copy link
Copy Markdown

augmentcode bot commented Apr 8, 2026

🤖 Augment PR Summary

Summary: This PR simplifies the installer by removing the custom content/custom module pipeline and making the remote marketplace registry the source of truth for module discovery.

Changes:

  • Removed custom content support across CLI/UI/installer (custom handler, custom module cache, manifest customModules, and related tests/docs).
  • Switched external module discovery to a remote registry (raw GitHub URL) with a bundled YAML fallback when offline.
  • Simplified module selection defaults/order to follow the registry, and aligned official module listing APIs to omit custom modules.
  • Improved IDE setup messaging by only announcing legacy directory migration when legacy targets actually exist.
Technical notes: External modules are normalized from both the remote array format and legacy bundled map format; quick-update now only considers modules with official sources available.

🤖 Was this summary useful? React with 👍 or 👎

Copy link
Copy Markdown

@augmentcode augmentcode bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review completed. 2 suggestions posted.

Fix All in Augment

Comment augment review to trigger a new review at any time.

# (bmad-code-org/bmad-plugins-marketplace) is unreachable.
# The remote registry/official.yaml is the source of truth.

modules:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tools/installer/modules/registry-fallback.yaml:5 — The fallback registry omits the built-in modules that exist in the remote registry (notably core and bmm), but the UI now uses the registry as the sole module list. In a no-network interactive install this can make it impossible to select bmm and can lead to a core-only install, contradicting the stated offline fallback behavior.

Severity: high

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

// Pre-select only if already installed (not on fresh install)
value: mod.code,
hint: mod.description,
selected: isInstalled,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tools/installer/ui.js:582-600selectAllModules() only preselects already-installed modules and ignores the registry’s defaultSelected flag (even though getDefaultModules() uses it for --yes). This makes fresh interactive installs start with nothing selected beyond the locked core, so it’s easy to proceed without selecting expected defaults like bmm.

Severity: medium

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant