Skip to content

fix(installer): add custom Rovo Dev installer with prompts.yml generation#1701

Merged
bmadcode merged 6 commits intobmad-code-org:mainfrom
alexeyv:fix/rovo-dev-prompts-registration
Feb 21, 2026
Merged

fix(installer): add custom Rovo Dev installer with prompts.yml generation#1701
bmadcode merged 6 commits intobmad-code-org:mainfrom
alexeyv:fix/rovo-dev-prompts-registration

Conversation

@alexeyv
Copy link
Copy Markdown
Collaborator

@alexeyv alexeyv commented Feb 18, 2026

Summary

  • Add custom rovodev.js installer that generates .rovodev/prompts.yml manifest, fixing /prompts showing nothing in Rovo Dev CLI
  • Remove stale rovo entry from tools/platform-codes.yaml (only rovo-dev should exist)
  • Switch rovo-dev from config-driven to custom installer in platform-codes.yaml

Closes #1466

Test plan

  • node -e "require('./tools/cli/installers/lib/ide/manager.js')" loads without errors
  • IdeManager discovers and instantiates RovoDevSetup handler for rovo-dev
  • All existing tests pass (schemas, refs, install components)
  • ESLint, markdownlint, and Prettier checks pass
  • Manual verification: ran bmad-cli install selecting rovo-dev, confirmed .rovodev/workflows/ contains bmad-*.md files and .rovodev/prompts.yml exists with correct entries
  • Re-install is idempotent (BMAD entries replaced, user entries preserved)
  • Uninstall cleans up bmad files and bmad prompts.yml entries

Manual test results

Full end-to-end test run against a fresh git repo at /tmp/bmad-rovo-test:

Step Test Result
Install 56 workflow files written to .rovodev/workflows/ PASS
Install All content_file paths in prompts.yml resolve on disk (56/56) PASS
Reinstall No duplicate entries in prompts.yml after second install PASS
Reinstall User-added custom prompt entry preserved across reinstall PASS
Uninstall All bmad-* workflow files removed PASS
Uninstall prompts.yml retains only user's custom entry; file deleted entirely if no user entries PASS
Post-uninstall RovoDevSetup.detect() returns false PASS

Note: Rovo Dev's UI displays only the description field — the name field is ignored for display. The bmad-<name> - <title> description format is intentional to keep entries identifiable in the UI.

…tion

Rovo Dev CLI requires a .rovodev/prompts.yml manifest to register prompts
for /prompts access. The config-driven installer was writing .md files but
never generating this manifest, so /prompts showed nothing.

- Create custom rovodev.js installer extending BaseIdeSetup
- Generate prompts.yml indexing all written workflow files
- Merge with existing user entries (only touch bmad- prefixed entries)
- Remove stale rovo entry from tools/platform-codes.yaml

Closes bmad-code-org#1466
The /prompts list in Rovo Dev only shows descriptions, making it hard
to identify entries. Prefix each description with the bmad entry name
so users see e.g. "bmad-bmm-create-prd - PRD workflow..." instead of
just the description text.
@augmentcode
Copy link
Copy Markdown

augmentcode bot commented Feb 18, 2026

🤖 Augment PR Summary

Summary: This PR adds a dedicated Rovo Dev installer so BMAD prompt files show up in the Rovo Dev CLI /prompts list.

Changes:

  • Extends IdeManager custom-installer discovery to include rovodev.js.
  • Switches rovo-dev from config-driven installation to a custom handler (and removes the old installer block from platform-codes.yaml).
  • Adds RovoDevSetup which writes dash-named .md artifacts into .rovodev/workflows/ using shared generators.
  • Generates/updates .rovodev/prompts.yml by removing existing bmad-* entries, preserving user entries, and appending newly generated BMAD prompt entries.
  • Implements cleanup/detection logic for removing BMAD workflow files and stripping BMAD entries from prompts.yml.
  • Removes the stale rovo platform code entry from tools/platform-codes.yaml (leaving only rovo-dev).

Technical Notes: The manifest uses Rovo’s content_file field pointing to workflows/<file>.md, and the installer runs cleanup first to support idempotent reinstall behavior.

🤖 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. 3 suggestions posted.

Fix All in Augment

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

@alexeyv
Copy link
Copy Markdown
Collaborator Author

alexeyv commented Feb 18, 2026

image

And I quite honestly have no desire to touch this PR with a 10 foot pole. It's good enough as is.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 18, 2026

📝 Walkthrough

Walkthrough

Introduces a custom IDE installer for Rovo Dev that generates BMAD workflow artifacts and a prompts.yml manifest file instead of using standard configuration-driven installation. Adds rovodev.js to the custom installer loader and removes the rovo platform entry from platform configuration.

Changes

Cohort / File(s) Summary
IDE Installer Configuration
tools/cli/installers/lib/ide/manager.js, tools/cli/installers/lib/ide/platform-codes.yaml
Added rovodev.js to custom installer discovery list. Removed standard installer config for Rovo Dev, replaced with comment indicating rovodev.js handles initialization.
Rovo Dev Custom Installer
tools/cli/installers/lib/ide/rovodev.js
New RovoDevSetup class extending BaseIdeSetup. Implements setup workflow generating BMAD artifacts (agents, workflows, tasks, tools) into .rovodev/workflows/, builds prompts.yml manifest with artifact metadata, and provides cleanup and detection logic for BMAD entries.
Platform Configuration
tools/platform-codes.yaml
Removed rovo public platform entry; rovo-dev platform remains unchanged.

Sequence Diagram

sequenceDiagram
    participant ProjectDir
    participant RovoDevSetup
    participant AgentGen as Agent Generator
    participant WorkflowGen as Workflow Generator
    participant TaskToolGen as TaskTool Generator
    participant PromptsYml as prompts.yml
    
    ProjectDir->>RovoDevSetup: setup(projectDir, bmadDir, options)
    RovoDevSetup->>RovoDevSetup: cleanup old BMAD artifacts
    RovoDevSetup->>RovoDevSetup: ensure .rovodev/workflows/ exists
    RovoDevSetup->>AgentGen: generate agent artifacts
    AgentGen->>RovoDevSetup: return files & metadata
    RovoDevSetup->>WorkflowGen: generate workflow artifacts
    WorkflowGen->>RovoDevSetup: return files & metadata
    RovoDevSetup->>TaskToolGen: generate task/tool artifacts
    TaskToolGen->>RovoDevSetup: return files & metadata
    RovoDevSetup->>RovoDevSetup: accumulate artifact counts
    RovoDevSetup->>PromptsYml: generatePromptsYml(writtenFiles)
    PromptsYml->>PromptsYml: read existing entries
    PromptsYml->>PromptsYml: preserve non-BMAD entries
    PromptsYml->>PromptsYml: merge new BMAD entries
    RovoDevSetup->>ProjectDir: return { success, results }
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly describes the main change: adding a custom Rovo Dev installer with prompts.yml generation, which aligns with the primary objectives.
Linked Issues check ✅ Passed The PR meets the requirements from issue #1466: creates a custom RovoDevSetup installer that generates .rovodev/prompts.yml manifest with workflow entries, enabling /prompts in Rovo Dev CLI to display workflows.
Out of Scope Changes check ✅ Passed All changes are in-scope: rovodev.js implements the custom installer, platform-codes.yaml updates rovo-dev configuration and removes stale rovo entry, and manager.js adds rovodev.js to the loader list.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check ✅ Passed The PR description clearly relates to the changeset, detailing the addition of rovodev.js, removal of stale rovo entry, and switching rovo-dev to custom installer to fix prompts visibility in Rovo Dev CLI.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Warning

Review ran into problems

🔥 Problems

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
tools/cli/installers/lib/ide/manager.js (1)

45-48: ⚠️ Potential issue | 🟡 Minor

JSDoc for loadHandlers() still lists only three custom files — rovodev.js is absent.

Line 11 (the class-level comment) was updated, but the method-level JSDoc on lines 47–48 was not. It still reads (codex.js, github-copilot.js, kilo.js). This will confuse anyone reading the method in isolation.

🐛 Proposed fix
-   * 1. Load custom installer files first (codex.js, github-copilot.js, kilo.js)
+   * 1. Load custom installer files first (codex.js, github-copilot.js, kilo.js, rovodev.js)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tools/cli/installers/lib/ide/manager.js` around lines 45 - 48, The JSDoc for
the loadHandlers() method is out of sync: it still lists only "codex.js,
github-copilot.js, kilo.js" while the class-level comment and code also load
"rovodev.js"; update the method-level JSDoc on loadHandlers() to include
rovodev.js (and ensure the wording matches the class-level comment) so readers
inspecting the method see the correct list of custom installer files.
🧹 Nitpick comments (4)
tools/cli/installers/lib/ide/rovodev.js (3)

56-104: require inside loops — hoist toDashPath to the module top level.

toDashPath is destructured from require('./shared/path-utils') on lines 58, 76, and 96 — once per loop iteration, three separate loops. While Node.js caches the module, this is unnecessary overhead and obscures the module's true dependency graph. The import belongs at the top of the file alongside all other requires.

♻️ Proposed fix
 const { TaskToolCommandGenerator } = require('./shared/task-tool-command-generator');
+const { toDashPath } = require('./shared/path-utils');
 
 ...
 
   for (const artifact of agentArtifacts) {
     if (artifact.type === 'agent-launcher') {
-      const { toDashPath } = require('./shared/path-utils');
       const flatName = toDashPath(artifact.relativePath);

Apply the same removal to lines 76 and 96.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tools/cli/installers/lib/ide/rovodev.js` around lines 56 - 104, Hoist the
destructured require for toDashPath out of the loops by adding a single
top-level import like const { toDashPath } = require('./shared/path-utils');
alongside the other module requires, and remove the in-loop requires that
currently appear inside the agentArtifacts, workflowArtifacts, and
taskToolArtifacts loops (references: toDashPath, './shared/path-utils',
writtenFiles push blocks in the code that build name/description/contentFile).
This preserves behavior while avoiding repeated requires and clarifies the
module dependency.

56-104: Three near-identical artifact-to-prompt-entry blocks — extract a shared helper.

Lines 56–66, 74–84, and 94–104 follow the exact same pattern: check artifact type, derive flat filename, push a { name, description, contentFile } object. The only variation is the set of accepted type strings and the fallback description suffix. Extract a helper (e.g., artifactToPromptEntry) to eliminate the repetition and centralise the mapping logic.

♻️ Proposed refactor sketch
+  /**
+   * `@param` {Object} artifact
+   * `@param` {string[]} acceptedTypes
+   * `@returns` {{ name, description, contentFile }|null}
+   */
+  _toPromptEntry(artifact, acceptedTypes) {
+    if (!acceptedTypes.includes(artifact.type)) return null;
+    const flatName = toDashPath(artifact.relativePath);
+    return {
+      name: path.basename(flatName, '.md'),
+      description: artifact.description || `${artifact.name} ${artifact.type}`,
+      contentFile: `${this.workflowsDir}/${flatName}`,
+    };
+  }
 
   // In setup():
-  for (const artifact of agentArtifacts) {
-    if (artifact.type === 'agent-launcher') {
-      const { toDashPath } = require('./shared/path-utils');
-      const flatName = toDashPath(artifact.relativePath);
-      writtenFiles.push({
-        name: path.basename(flatName, '.md'),
-        description: artifact.description || `${artifact.name} agent`,
-        contentFile: `${this.workflowsDir}/${flatName}`,
-      });
-    }
-  }
+  writtenFiles.push(...agentArtifacts.map(a => this._toPromptEntry(a, ['agent-launcher'])).filter(Boolean));
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tools/cli/installers/lib/ide/rovodev.js` around lines 56 - 104, There are
three duplicated loops that map artifacts into prompt entries; extract a helper
function (e.g., artifactToPromptEntry) to centralise the logic used by the loops
that populate writtenFiles. Implement artifactToPromptEntry(relativePath,
artifact, typeMatchers, fallbackSuffix) which uses
require('./shared/path-utils').toDashPath to compute flatName, path.basename to
derive name, builds description from artifact.description || `${artifact.name}
${fallbackSuffix}`, and returns the { name, description, contentFile } object
(contentFile should be `${this.workflowsDir}/${flatName}`). Replace the three
inline blocks that iterate agentArtifacts, workflowArtifacts, and
taskToolArtifacts with calls to this helper (pass appropriate typeMatchers or
simple type checks for 'agent-launcher', 'workflow-command', and ['task','tool']
and the respective suffixes like "agent", "workflow", or the artifact.type), and
push the returned object into writtenFiles when the type matches.

174-234: cleanup() bypasses BaseIdeSetup file I/O abstractions while generatePromptsYml() uses them — breaks mock-based unit testing for half the class.

generatePromptsYml calls this.pathExists, this.readFile, this.writeFile (presumably provided by BaseIdeSetup and replaceable in tests), but cleanup calls fs.pathExists, fs.readFile, fs.writeFile, and fs.remove directly. Any test harness that stubs the BaseIdeSetup methods will not intercept cleanup's I/O, making it impossible to unit-test cleanup in isolation without touching the real filesystem. Standardise on one approach — preferably the BaseIdeSetup abstraction throughout.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tools/cli/installers/lib/ide/rovodev.js` around lines 174 - 234, cleanup()
currently uses direct fs.* calls which bypass the BaseIdeSetup file I/O
abstraction used by generatePromptsYml(); replace those direct fs calls with the
class's abstracted methods so tests can stub them. Specifically, in cleanup()
replace fs.pathExists with this.pathExists, fs.readdir with the corresponding
this.readdir/this.readDir wrapper (or add one to BaseIdeSetup if missing),
fs.readFile with this.readFile, fs.writeFile with this.writeFile, and fs.remove
with a this.remove (or add a remove/unlink wrapper to BaseIdeSetup); keep the
existing logic and logging (prompts.log.message/warn and options.silent) intact
while using these instance methods.
tools/cli/installers/lib/ide/manager.js (1)

70-86: Establish a convention: each IDE handler file must export the handler class as a default export.

The current pattern HandlerModule.default || Object.values(HandlerModule)[0] at line 72 is fragile. Today it works because all handler files (codex.js, github-copilot.js, kilo.js, rovodev.js) export exactly one class, and Object.values() happens to pick it. But this silently breaks if anyone adds a second export (a helper constant, utility function, etc.)—the wrong value gets instantiated with no error. Either enforce default exports in all handler files, or explicitly check for the handler class by name instead of relying on enumeration order.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tools/cli/installers/lib/ide/manager.js` around lines 70 - 86, The loader
currently uses HandlerModule.default || Object.values(HandlerModule)[0], which
is fragile; change the logic in manager.js to require a proper default export:
only use HandlerModule.default as the handler class, and if
HandlerModule.default is missing or not a constructor, log/warn and skip loading
that file. Specifically, update the block that derives HandlerClass (replace the
fallback to Object.values) to validate HandlerModule.default is a
function/constructor before instantiating, and adjust the error message to
indicate a missing or invalid default export; keep honoring
instance.setBmadFolderName and this.handlers.set(instance.name, instance) as
before.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tools/cli/installers/lib/ide/rovodev.js`:
- Around line 143-150: The current filter on parsed.prompts that drops entries
whose name starts with 'bmad-' (the existingPrompts assignment) can silently
delete user-owned prompts; change the logic to detect which entries would be
removed by the bmad- filter and, for each removed entry not present in this
run's writtenFiles set, emit a warning (e.g., console.warn or the module's
logger) listing the prompt name and that it was removed; only then continue to
set existingPrompts to the filtered array. Ensure you reference parsed.prompts,
the bmad- name check, existingPrompts, and writtenFiles when implementing the
detection and warning.
- Line 107: The code unconditionally calls generatePromptsYml(projectDir,
writtenFiles) even when no artifacts were collected, which creates/overwrites a
prompts manifest with an empty BMAD block; guard the call so it only runs when
there are artifacts to write. Modify the caller to check that writtenFiles is a
non-empty array (e.g., if (Array.isArray(writtenFiles) && writtenFiles.length >
0) await this.generatePromptsYml(projectDir, writtenFiles);), leaving
generatePromptsYml unchanged so existing user entries aren't touched when no new
artifacts are found.
- Around line 178-185: The cleanup() implementation only removes files matching
'bmad-*.md' under workflowsPath but detect() considers any entry that
startsWith('bmad-') (including directories or non-.md files), causing detect()
to still return true after cleanup; update cleanup() to remove any filesystem
entry whose name startsWith('bmad-') (use fs.stat or fs.lstat to handle
directories and files and call fs.remove on each matching entry) so its
predicate aligns with detect(), and keep references to the existing functions
and variable names (cleanup(), detect(), workflowsPath, entries) when making the
change.
- Around line 22-29: Remove the unused detectionPaths assignment from the
RovoDevSetup constructor: the class currently sets this.detectionPaths =
['.rovodev/workflows', '.rovodev/prompts.yml'] but its detect() method
(RovoDevSetup.detect) overrides detection logic and never uses the
BaseIdeSetup.detect mechanism that reads this property, so delete the
this.detectionPaths line from the constructor to eliminate the redundant field.
- Around line 88-91: The fix must not destructure a non-object from
taskToolGen.writeDashArtifacts; call await
taskToolGen.writeDashArtifacts(bmadDir) and, if you need the number of files
written capture it as a single numeric writtenCount, but keep taskCount and
toolCount coming from taskToolCounts returned by
taskToolGen.collectTaskToolArtifacts (use taskToolCounts.tasks || 0 and
taskToolCounts.tools || 0); alternatively, if you only track a combined written
total, assign that single writtenCount to both taskCount and toolCount, but do
not attempt to destructure {tasks, tools} from writeDashArtifacts (see
taskToolGen.writeDashArtifacts, taskToolGen.collectTaskToolArtifacts, and the
analogous agentGen.writeDashArtifacts/workflowGen.writeDashArtifacts behavior).
- Around line 52-104: The workflow and task/tool collectors are not receiving
the user's selectedModules while agentGen.collectAgentArtifacts does, so
workflows and tasks are being installed unfiltered; update the calls to
WorkflowCommandGenerator.collectWorkflowArtifacts(...) and
TaskToolCommandGenerator.collectTaskToolArtifacts(...) to pass the
selectedModules argument (same variable used with
agentGen.collectAgentArtifacts), ensuring the collectors receive selectedModules
so getTasksFromBmad/module filtering is applied and prompts.yml only lists
selected modules' artifacts.
- Around line 53-104: The manifest references stale files because writtenFiles
is populated from agentArtifacts/workflowArtifacts/taskToolArtifacts instead of
the actual results of writeDashArtifacts; change writeDashArtifacts (used by
agentGen.writeDashArtifacts, workflowGen.writeDashArtifacts,
taskToolGen.writeDashArtifacts) to return the list of successfully written
artifact objects (not just a count), then update the callers to use those
returned arrays to build writtenFiles (replace loops over
agentArtifacts/workflowArtifacts/taskToolArtifacts with loops over the returned
written-artifacts arrays) before calling generatePromptsYml so prompts.yml only
lists confirmed-on-disk files.

---

Outside diff comments:
In `@tools/cli/installers/lib/ide/manager.js`:
- Around line 45-48: The JSDoc for the loadHandlers() method is out of sync: it
still lists only "codex.js, github-copilot.js, kilo.js" while the class-level
comment and code also load "rovodev.js"; update the method-level JSDoc on
loadHandlers() to include rovodev.js (and ensure the wording matches the
class-level comment) so readers inspecting the method see the correct list of
custom installer files.

---

Nitpick comments:
In `@tools/cli/installers/lib/ide/manager.js`:
- Around line 70-86: The loader currently uses HandlerModule.default ||
Object.values(HandlerModule)[0], which is fragile; change the logic in
manager.js to require a proper default export: only use HandlerModule.default as
the handler class, and if HandlerModule.default is missing or not a constructor,
log/warn and skip loading that file. Specifically, update the block that derives
HandlerClass (replace the fallback to Object.values) to validate
HandlerModule.default is a function/constructor before instantiating, and adjust
the error message to indicate a missing or invalid default export; keep honoring
instance.setBmadFolderName and this.handlers.set(instance.name, instance) as
before.

In `@tools/cli/installers/lib/ide/rovodev.js`:
- Around line 56-104: Hoist the destructured require for toDashPath out of the
loops by adding a single top-level import like const { toDashPath } =
require('./shared/path-utils'); alongside the other module requires, and remove
the in-loop requires that currently appear inside the agentArtifacts,
workflowArtifacts, and taskToolArtifacts loops (references: toDashPath,
'./shared/path-utils', writtenFiles push blocks in the code that build
name/description/contentFile). This preserves behavior while avoiding repeated
requires and clarifies the module dependency.
- Around line 56-104: There are three duplicated loops that map artifacts into
prompt entries; extract a helper function (e.g., artifactToPromptEntry) to
centralise the logic used by the loops that populate writtenFiles. Implement
artifactToPromptEntry(relativePath, artifact, typeMatchers, fallbackSuffix)
which uses require('./shared/path-utils').toDashPath to compute flatName,
path.basename to derive name, builds description from artifact.description ||
`${artifact.name} ${fallbackSuffix}`, and returns the { name, description,
contentFile } object (contentFile should be `${this.workflowsDir}/${flatName}`).
Replace the three inline blocks that iterate agentArtifacts, workflowArtifacts,
and taskToolArtifacts with calls to this helper (pass appropriate typeMatchers
or simple type checks for 'agent-launcher', 'workflow-command', and
['task','tool'] and the respective suffixes like "agent", "workflow", or the
artifact.type), and push the returned object into writtenFiles when the type
matches.
- Around line 174-234: cleanup() currently uses direct fs.* calls which bypass
the BaseIdeSetup file I/O abstraction used by generatePromptsYml(); replace
those direct fs calls with the class's abstracted methods so tests can stub
them. Specifically, in cleanup() replace fs.pathExists with this.pathExists,
fs.readdir with the corresponding this.readdir/this.readDir wrapper (or add one
to BaseIdeSetup if missing), fs.readFile with this.readFile, fs.writeFile with
this.writeFile, and fs.remove with a this.remove (or add a remove/unlink wrapper
to BaseIdeSetup); keep the existing logic and logging (prompts.log.message/warn
and options.silent) intact while using these instance methods.

alexeyv and others added 4 commits February 18, 2026 08:08
- Hoist toDashPath import to module top level
- Extract _collectPromptEntries helper replacing 3 duplicated loops
- Remove unused detectionPaths (detect() is overridden)
- Guard generatePromptsYml when writtenFiles is empty
- Align cleanup() with detect() predicate (remove any bmad-*, not just .md)
- Use BaseIdeSetup abstractions (this.pathExists/readFile/writeFile) in cleanup()
- Update loadHandlers() JSDoc to include rovodev.js
@bmadcode bmadcode merged commit e72b82e into bmad-code-org:main Feb 21, 2026
5 checks passed
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.

Atlassian's Rovo development environment not working

2 participants