From saga-core
Resolves blockers in Saga stories by finding story via ID, parsing journal.md for unresolved blockers, reading story.json context, and disambiguating if needed.
npx claudepluginhub roeia1/saga --plugin coreThis skill is limited to using the following tools:
!`node $SAGA_PLUGIN_ROOT/scripts/find.js "$0" --type story`
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
!node $SAGA_PLUGIN_ROOT/scripts/find.js "$0" --type story
The saga find command ran above. Handle the result:
data.storyId, continue to step 2question: "Which story's blocker do you want to resolve?"
header: "Story"
multiSelect: false
options: [
{label: "<storyId>", description: "<title> (Status: <status>)"}
...for each story in the matches array
]
After selection, continue with the selected story./task-list to see available stories.Compute paths to story files:
STORY_ID=<storyId from resolution>
WORKTREE="$SAGA_PROJECT_DIR/.saga/worktrees/$STORY_ID"
STORY_DIR=".saga/stories/$STORY_ID"
Story files within the worktree:
$WORKTREE/$STORY_DIR/story.json - Story definition$WORKTREE/$STORY_DIR/journal.md - Execution journalRead the story definition to understand what's being built:
cat $WORKTREE/$STORY_DIR/story.json
Extract:
Read the journal to find the blocker:
cat $WORKTREE/$STORY_DIR/journal.md
A blocker entry has this format:
## Blocker: [Brief title]
**Task**: [Which task is blocked]
**What I'm trying to do**: [Description]
**What I tried**: [Approaches attempted and why they didn't work]
**What I need**: [Specific decision or information required]
**Suggested options**: [If ideas exist, list them with pros/cons]
A resolution entry has this format:
## Resolution: [Reference to blocker title]
**Decision**: [Clear statement of the chosen approach]
**Implementation guidance**: [Specific steps or guidance for the worker]
**Rationale**: [Why this approach was chosen over alternatives]
**Approved**: [ISO timestamp]
## Blocker: sections in journal.md## Resolution: section existsIf no unresolved blocker found:
===============================================================
No Unresolved Blocker Found
===============================================================
Story $STORY_ID is not blocked. journal.md does not contain any
unresolved blocker entries.
If you expected a blocker:
- Check journal.md for the blocker entry format
- Ensure the implementation exited with BLOCKED status
To resume implementation: /execute-story $STORY_ID
===============================================================
STOP - do not continue
If blocker already resolved:
===============================================================
Blocker Already Resolved
===============================================================
The blocker "$BLOCKER_TITLE" already has a resolution in journal.md.
To resume implementation with the resolution applied:
/execute-story $STORY_ID
===============================================================
STOP - do not continue
Display the blocker context to the human:
===============================================================
Blocker Analysis: $BLOCKER_TITLE
===============================================================
Story: $STORY_ID ($STORY_TITLE)
Blocked Task: $BLOCKER_TASK
---------------------------------------------------------------
Problem Description
---------------------------------------------------------------
$BLOCKER_TRYING
---------------------------------------------------------------
What Was Tried
---------------------------------------------------------------
$BLOCKER_TRIED
---------------------------------------------------------------
What Is Needed
---------------------------------------------------------------
$BLOCKER_NEED
---------------------------------------------------------------
Worker's Suggested Options
---------------------------------------------------------------
$BLOCKER_OPTIONS (or "None provided")
===============================================================
Analyzing codebase to propose solutions...
===============================================================
This is the critical analysis phase. Use your full codebase access to:
Explore relevant code based on the blocker context:
Analyze the root cause:
Formulate solution options:
Present proposals to the human:
===============================================================
Proposed Solutions
===============================================================
Based on my analysis of the blocker and codebase:
## Option 1: [Name] (Recommended)
**Approach**: [Clear description of the approach]
**Pros**:
- [Benefit 1]
- [Benefit 2]
**Cons**:
- [Drawback 1]
- [Drawback 2]
**Implementation guidance**:
- [Specific step 1]
- [Specific step 2]
---------------------------------------------------------------
## Option 2: [Name]
**Approach**: [Clear description]
**Pros**:
- [Benefit 1]
**Cons**:
- [Drawback 1]
**Implementation guidance**:
- [Specific step 1]
===============================================================
CRITICAL: Do NOT proceed without explicit human approval.
Use AskUserQuestion to get the human's decision:
Which solution should I document as the resolution?
Options:
Wait for explicit response.
Append the resolution entry to journal.md using the Edit tool:
---
## Resolution: $BLOCKER_TITLE
**Decision**: $DECISION
**Implementation guidance**:
$GUIDANCE
**Rationale**: $RATIONALE
**Approved**: [Current ISO timestamp]
---
===============================================================
Resolution Documented
===============================================================
The resolution has been appended to journal.md.
Blocker: $BLOCKER_TITLE
Decision: $DECISION
To resume implementation with this resolution:
/execute-story $STORY_ID
The next worker will read the resolution from journal.md and
apply the guidance to complete the blocked task.
===============================================================