git clone https://github.com/MeroZemory/oh-my-droid
T=$(mktemp -d) && git clone --depth=1 https://github.com/MeroZemory/oh-my-droid "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/hud" ~/.claude/skills/merozemory-oh-my-droid-hud && rm -rf "$T"
skills/hud/SKILL.mdHUD Skill
Configure the OMD HUD (Heads-Up Display) for the statusline.
Quick Commands
| Command | Description |
|---|---|
| Show current HUD status (auto-setup if needed) |
| Install/repair HUD statusline |
| Switch to minimal display |
| Switch to focused display (default) |
| Switch to full display |
| Show detailed HUD status |
Auto-Setup
When you run
/hud or /hud setup, the system will automatically:
- Check if
exists~/.factory/hud/omd-hud.mjs - Check if
is configured instatusLine~/.factory/settings.json - If missing, create the HUD wrapper script and configure settings
- Report status and prompt to restart Factory Droid if changes were made
IMPORTANT: If the argument is
setup OR if the HUD script doesn't exist at ~/.factory/hud/omd-hud.mjs, you MUST create the HUD files directly using the instructions below.
Setup Instructions (Run These Commands)
Step 1: Check if setup is needed:
ls ~/.factory/hud/omd-hud.mjs 2>/dev/null && echo "EXISTS" || echo "MISSING"
Step 2: Check if the plugin is built (CRITICAL - common issue!):
# Find the latest version and check if dist/hud/index.js exists PLUGIN_VERSION=$(ls ~/.factory/plugins/cache/oh-my-droid/oh-my-droid/ 2>/dev/null | sort -V | tail -1) if [ -n "$PLUGIN_VERSION" ]; then ls ~/.factory/plugins/cache/oh-my-droid/oh-my-droid/$PLUGIN_VERSION/dist/hud/index.js 2>/dev/null && echo "BUILT" || echo "NOT_BUILT" fi
⚠️ CRITICAL: If NOT_BUILT, the plugin MUST be compiled before the HUD can work!
WHY THIS HAPPENS: The
dist/ directory contains compiled TypeScript code and is NOT stored on GitHub (it's in .gitignore). When you install the plugin from the marketplace, the build step happens automatically via the prepare script during npm install. However, if the plugin wasn't properly installed or the build failed, you'll get this error.
THE FIX: Run npm install in the plugin directory to build it:
cd ~/.factory/plugins/cache/oh-my-droid/oh-my-droid/$PLUGIN_VERSION && npm install
This will:
- Install all dependencies
- Run the
script which executespreparenpm run build - Generate the
file that the HUD wrapper needsdist/hud/index.js
DO NOT try to download
dist/hud/index.js from GitHub raw URLs - it doesn't exist there!
Step 3: If omd-hud.mjs is MISSING or argument is
setup, create the HUD directory and script:
First, create the directory:
mkdir -p ~/.factory/hud
Then, use the Write tool to create
~/.factory/hud/omd-hud.mjs with this exact content:
#!/usr/bin/env node /** * OMD HUD - Statusline Script * Wrapper that imports from plugin cache or development paths */ import { existsSync, readdirSync } from "node:fs"; import { homedir } from "node:os"; import { join } from "node:path"; import { pathToFileURL } from "node:url"; // Semantic version comparison: returns negative if a < b, positive if a > b, 0 if equal function semverCompare(a, b) { const pa = a.replace(/^v/, "").split(".").map(Number); const pb = b.replace(/^v/, "").split(".").map(Number); for (let i = 0; i < Math.max(pa.length, pb.length); i++) { const na = pa[i] || 0; const nb = pb[i] || 0; if (na !== nb) return na - nb; } return 0; } async function main() { const home = homedir(); let pluginCacheDir = null; // 1. Try plugin cache first (marketplace: omc, plugin: oh-my-droid) const pluginCacheBase = join(home, ".factory/plugins/cache/oh-my-droid/oh-my-droid"); if (existsSync(pluginCacheBase)) { try { const versions = readdirSync(pluginCacheBase); if (versions.length > 0) { const latestVersion = versions.sort(semverCompare).reverse()[0]; pluginCacheDir = join(pluginCacheBase, latestVersion); const pluginPath = join(pluginCacheDir, "dist/hud/index.js"); if (existsSync(pluginPath)) { await import(pathToFileURL(pluginPath).href); return; } } } catch { /* continue */ } } // 2. Development paths const devPaths = [ join(home, "Workspace/oh-my-droid/dist/hud/index.js"), join(home, "workspace/oh-my-droid/dist/hud/index.js"), join(home, "Workspace/oh-my-droid/dist/hud/index.js"), join(home, "workspace/oh-my-droid/dist/hud/index.js"), ]; for (const devPath of devPaths) { if (existsSync(devPath)) { try { await import(pathToFileURL(devPath).href); return; } catch { /* continue */ } } } // 3. Fallback - HUD not found (provide actionable error message) if (pluginCacheDir) { console.log(`[OMD] HUD not built. Run: cd "${pluginCacheDir}" && npm install`); } else { console.log("[OMD] Plugin not found. Run: /omd-setup"); } } main();
Step 3: Make it executable:
chmod +x ~/.factory/hud/omd-hud.mjs
Step 4: Update settings.json to use the HUD:
Read
~/.factory/settings.json, then update/add the statusLine field.
IMPORTANT: The command must use an absolute path, not
~, because Windows does not expand ~ in shell commands.
First, determine the correct path:
node -e "const p=require('path').join(require('os').homedir(),'.factory','hud','omd-hud.mjs');console.log(JSON.stringify(p))"
Then set the
statusLine field using the resolved path. On Unix it will look like:
{ "statusLine": { "type": "command", "command": "node /home/username/.factory/hud/omd-hud.mjs" } }
On Windows it will look like:
{ "statusLine": { "type": "command", "command": "node C:\\Users\\username\\.factory\\hud\\omd-hud.mjs" } }
Use the Edit tool to add/update this field while preserving other settings.
Step 5: Clean up old HUD scripts (if any):
rm -f ~/.factory/hud/sisyphus-hud.mjs 2>/dev/null
Step 6: Tell the user to restart Factory Droid for changes to take effect.
Display Presets
Minimal
Shows only the essentials:
[OMD] ralph | ultrawork | todos:2/5
Focused (Default)
Shows all relevant elements:
[OMD] ralph:3/10 | US-002 | ultrawork skill:planner | ctx:67% | agents:2 | bg:3/5 | todos:2/5
Full
Shows everything including multi-line agent details:
[OMD] ralph:3/10 | US-002 (2/5) | ultrawork | ctx:[████░░]67% | agents:3 | bg:3/5 | todos:2/5 ├─ O architect 2m analyzing architecture patterns... ├─ e explore 45s searching for test files └─ s executor 1m implementing validation logic
Multi-Line Agent Display
When agents are running, the HUD shows detailed information on separate lines:
- Tree characters (
,├─
) show visual hierarchy└─ - Agent code (O, e, s) indicates agent type with model tier color
- Duration shows how long each agent has been running
- Description shows what each agent is doing (up to 45 chars)
Display Elements
| Element | Description |
|---|---|
| Mode identifier |
| Ralph loop iteration/max |
| Current PRD story ID |
| Active mode badge |
| Last activated skill (cyan) |
| Context window usage |
| Running subagent count |
| Background task slots |
| Todo completion |
Color Coding
- Green: Normal/healthy
- Yellow: Warning (context >70%, ralph >7)
- Red: Critical (context >85%, ralph at max)
Configuration Location
HUD config is stored at:
~/.factory/.omd/hud-config.json
Manual Configuration
You can manually edit the config file. Each option can be set individually - any unset values will use defaults.
{ "preset": "focused", "elements": { "omdLabel": true, "ralph": true, "prdStory": true, "activeSkills": true, "lastSkill": true, "contextBar": true, "agents": true, "backgroundTasks": true, "todos": true, "showCache": true, "showCost": true, "maxOutputLines": 4 }, "thresholds": { "contextWarning": 70, "contextCritical": 85, "ralphWarning": 7 } }
Troubleshooting
If the HUD is not showing:
- Run
to auto-install and configure/hud setup - Restart Factory Droid after setup completes
- If still not working, run
for full diagnostics/doctor
Manual verification:
- HUD script:
~/.factory/hud/omd-hud.mjs - Settings:
should have~/.factory/settings.json
configuredstatusLine
The HUD updates automatically every ~300ms during active sessions.