From miranda
Create GitHub issues from task descriptions or session context. Investigates when needed, skips when context exists.
npx claudepluginhub open-horizon-labs/bottle --plugin mirandaThis skill uses the workspace's default tool permissions.
Creates well-structured GitHub issues ready for oh-task agents. Works in two modes:
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Creates well-structured GitHub issues ready for oh-task agents. Works in two modes:
.oh/<session>.md context, skips investigation, creates issues# Task mode - investigate from scratch
/oh-plan "Add dark mode support to the dashboard"
# Session mode - use existing context from skills workflow
/oh-plan auth-refactor
At the start, check if the argument matches an existing session file:
If .oh/<arg>.md exists AND contains ## Solution Space:
→ Session mode (skip investigation, use context)
Else:
→ Task mode (investigate, ask questions)
When .oh/<session>.md exists with solution-space context:
Read session file and extract:
## Aim → Goal for issues## Problem Space → Constraints, terrain, assumptions## Solution Space → Selected approach, trade-offs accepted## Problem Statement → Framing (if present)Skip investigation - context already gathered by grounding skills
Skip clarifying questions - decisions already made during solution-space
Decompose the selected solution into right-sized issues:
Create GitHub issues with enriched context from session:
gh issue create --title "<title>" --label "oh-planned" --body "$(cat <<'EOF'
## Goal
<from Aim section>
## Context
<from Problem Space: constraints, terrain>
<from Solution Space: selected approach>
## Acceptance Criteria
- [ ] <derived from solution trade-offs>
- [ ] <derived from aim feedback signals>
## Trade-offs Accepted
<from Solution Space>
## Notes
<from Problem Space assumptions>
EOF
)"
Update session file with created issues:
## Plan
**Updated:** <timestamp>
**Issues:** #43, #44, #45
$ /oh-plan auth-refactor
Found session file: .oh/auth-refactor.md
Reading context...
- Aim: Users complete signup in under 60 seconds
- Problem: Current flow has 5 steps, competitors have 2
- Solution: Collapse to email + password, defer profile to post-signup
- Trade-offs: Less data upfront, need progressive profiling later
Decomposing into issues...
Created 2 issues:
#43: "Simplify signup to email + password only"
- Remove name, company, role fields from signup
- Add post-signup redirect to profile completion
- Depends on: none
#44: "Add progressive profile completion flow"
- Prompt for missing fields on first dashboard visit
- Track completion percentage
- Depends on: #43
Updated .oh/auth-refactor.md with issue links.
Done. Issues ready for /oh-task.
When no session file exists (current behavior):
Explore the codebase to understand:
Ask clarifying questions via AskUserQuestion:
Assess complexity and determine decomposition:
Create GitHub issue(s) with the oh-planned label:
# Create label if it doesn't exist (one-time)
gh label create oh-planned --description "Created via oh-plan skill" --color "0E8A16" 2>/dev/null || true
# Create issue
gh issue create --title "<clear, actionable title>" --label "oh-planned" --body "$(cat <<'EOF'
## Goal
<1-2 sentences describing what we're trying to achieve>
## Context
<relevant background - files identified, patterns to follow, constraints>
## Acceptance Criteria
- [ ] Criterion 1 (specific, testable)
- [ ] Criterion 2
- [ ] Criterion 3
## Notes
<any technical decisions, edge cases, or things to watch out for>
EOF
)"
Signal completion: Call signal_completion(status: "success") to notify the orchestrator.
Fallback: If signal_completion is not available, output COMPLETION: status=success as your final message.
Issues created by oh-plan should be:
Bias toward focused issues. A well-scoped issue that does one thing well is better than a multifaceted issue that tries to do many things. When genuinely uncertain, prefer splitting - but don't create trivial issues.
Split into multiple issues when ANY of these apply:
Keep as one issue when:
Consider a separate integration issue when connecting components involves:
Don't create integration issues for:
Pattern when integration IS complex:
Issue #1: "Add theme persistence API" (Foundation)
Issue #2: "Add theme toggle component" (Feature)
Issue #3: "Wire theme system with fallback handling" (Integration - Depends on #1, #2)
- Handle API failures gracefully
- System preference detection fallback
- Theme flicker prevention on load
Task: "Add dark mode support to the dashboard"
Over-decomposed (too many trivial issues):
Issue #1: Add preferences API
Issue #2: Add toggle component
Issue #3: Add CSS variables
Issue #4: Wire toggle to API
Issue #5: Wire CSS to components
Issue #6: Handle loading states
Under-decomposed (one big issue):
Issue #1: Add dark mode support (everything)
Right-sized:
Issue #1: "Add user preferences API with theme support" (Foundation)
- GET/POST /api/preferences
- Includes theme field
Issue #2: "Add dark mode theming system" (Feature - Depends on #1)
- CSS custom properties for light/dark
- Theme toggle in settings
- Wire to preferences API
- Apply theme on app load
Issue #3: "Handle theme edge cases" (Polish - Depends on #2)
- Only if complex: system preference fallback,
theme flicker prevention, etc.
- Skip if straightforward
Use "Depends on #N" in issue body:
## Goal
Add dark mode theming system with toggle and persistence.
**Depends on:** #1 (preferences API)
| Outcome | Call |
|---|---|
| Issue(s) created successfully | signal_completion(status: "success") |
| User cancelled during questions | signal_completion(status: "error", error: "User cancelled") |
| Failed to create issue | signal_completion(status: "error", error: "<reason>") |
| Session file missing solution-space | signal_completion(status: "error", error: "Session missing Solution Space - run /solution-space first") |
$ /oh-plan "Add heartbeat monitoring for tmux sessions"
Exploring codebase...
Found relevant files:
- src/tmux/sessions.ts (session management)
- src/state/sessions.ts (session state tracking)
- src/index.ts (main loop)
I have a few questions to scope this correctly:
Q: What should happen when a session stops responding?
[1] Mark as crashed, notify user
[2] Auto-restart the session
[3] Just log and continue
User: 1
Q: How often should we check for heartbeats?
[1] Every 30 seconds (Recommended)
[2] Every minute
[3] Every 5 minutes
User: 1
Creating issue...
Created issue #67: "Add heartbeat monitoring for tmux sessions"
## Goal
Detect when tmux sessions stop responding and notify the user.
## Context
- Sessions are tracked in src/state/sessions.ts
- Tmux interactions in src/tmux/sessions.ts
- Need to add periodic check in main loop
## Acceptance Criteria
- [ ] Check session liveness every 30 seconds
- [ ] Mark session as "crashed" if not responding
- [ ] Send Telegram notification when session crashes
- [ ] Add crashed sessions to /status output
## Notes
- Use tmux has-session to check liveness
- Consider: what if tmux server itself is down?
signal_completion(status: "success")
Done. Issue #67 ready for /oh-task.
oh-plan works seamlessly with the Open Horizons skills workflow:
# Grounding phase (in skills workflow)
/aim auth-refactor
/problem-space auth-refactor
/solution-space auth-refactor
# Planning phase (oh-plan reads the context)
/oh-plan auth-refactor # Creates GitHub issues from session
# Execution phase
/oh-task 43 # Work the issues
This avoids duplicating investigation work - the grounding skills gather context, oh-plan transforms it into trackable issues.