---
name: execute-issue
description: Execute a single sub-task with context priming. Supports both Linear and Jira backends via progressive disclosure. Use when ready to implement a refined issue, when the user mentions "execute", "implement", or "work on" an issue.
invocation: /execute
---
Execute EXACTLY ONE sub-task from a refined issue, then STOP. This skill is designed to run in a loop where each invocation completes one sub-task.
Key behavior:
- Find ONE ready sub-task (no unresolved blockers)
- Implement it completely
- Verify with tests/typecheck/lint
- Commit and push
- Update issue status
- Report completion and STOP IMMEDIATELY
**CRITICAL**: After completing one sub-task (or determining none are ready), you MUST stop and end your response. Do NOT continue to the next sub-task. The calling loop will invoke you again for the next sub-task.
**THIS SKILL EXECUTES EXACTLY ONE SUB-TASK PER INVOCATION**
The workflow for each invocation:
1. Find the next ready sub-task
2. If none ready -> output STATUS and STOP
3. If found -> implement, verify, commit, push
4. Update issue status
5. Output completion STATUS and STOP
**NEVER**:
- Process multiple sub-tasks in one invocation
- Ask "should I continue to the next task?"
- Loop through remaining sub-tasks
- Suggest running the skill again
The loop script handles iteration. This skill handles ONE task.
**FIRST**: Detect the backend from mobius config before proceeding.
Read `~/.config/mobius/config.yaml` or `mobius.config.yaml` in the project root:
```yaml
backend: linear # or 'jira'
```
**Default**: If no backend is specified, default to `linear`.
The detected backend determines which MCP tools to use throughout this skill. All subsequent tool references use the backend-specific tools from the `` section below.
**MCP Tools for Linear**:
- **Fetch issue**: `mcp__plugin_linear_linear__get_issue`
- Parameters: `id` (issue ID), `includeRelations` (boolean)
- Returns: Issue with status, description, blockedBy relations
- **List sub-tasks**: `mcp__plugin_linear_linear__list_issues`
- Parameters: `parentId`, `includeArchived`
- Returns: Array of child issues
- **Update status**: `mcp__plugin_linear_linear__update_issue`
- Parameters: `id`, `state` (e.g., "In Progress", "Done")
- Transitions: Backlog -> In Progress -> Done
- **Add comment**: `mcp__plugin_linear_linear__create_comment`
- Parameters: `issueId`, `body` (markdown)
- Use for: Work started, completion notes, progress updates
**MCP Tools for Jira**:
- **Fetch issue**: `mcp_plugin_atlassian_jira__get_issue`
- Parameters: `issueIdOrKey` (e.g., "PROJ-123")
- Returns: Issue with status, description, links (blocking relationships)
- **List sub-tasks**: `mcp_plugin_atlassian_jira__list_issues`
- Parameters: `jql` (e.g., "parent = PROJ-123")
- Returns: Array of child issues
- **Update status**: `mcp_plugin_atlassian_jira__transition_issue`
- Parameters: `issueIdOrKey`, `transitionId` or `transitionName`
- Transitions: To Do -> In Progress -> Done
- **Add comment**: `mcp_plugin_atlassian_jira__add_comment`
- Parameters: `issueIdOrKey`, `body` (markdown or Jira wiki markup)
- Use for: Work started, completion notes, progress updates
This skill is the execution phase of the issue workflow:
1. **define-issue** - Creates well-defined issues with acceptance criteria
2. **refine-issue** - Breaks issues into single-file-focused sub-tasks with dependencies
3. **execute-issue** (this skill) - Implements ONE sub-task, then stops
**Loop-Based Execution Model**:
This skill is designed to be called repeatedly by a loop script (e.g., `mobius loop`). Each invocation:
1. Finds the NEXT ready sub-task
2. Executes it completely
3. Reports completion
4. STOPS (does not continue to next sub-task)
The loop script will call this skill again for the next sub-task. This ensures:
- Fresh context for each sub-task
- Clear boundaries between tasks
- Predictable execution behavior
- Easy progress monitoring
Each sub-task is designed to:
- Target a single file (or source + test pair)
- Fit within one context window
- Have clear acceptance criteria
- Have explicit blocking relationships
**Checkpoint system enables recovery from interruptions** by saving structured state after each major phase.
Checkpoints are only used for **non-trivial tasks** (estimated >5 minutes or involving multiple verification cycles). Skip checkpoints for simple single-file changes.
### Checkpoint 1: Context Priming Complete
**Phase**: After loading parent issue, finding ready subtask, and loading dependency context
**Marker**: `CHECKPOINT:PRIMED`
**Saves**:
- Parent issue ID and title
- Selected subtask ID and title
- Target file path
- Completed dependency summaries (not full content)
- Key patterns identified for implementation
**Recovery**: Skip context loading, proceed directly to implementation
### Checkpoint 2: Implementation Complete
**Phase**: After implementing changes but before verification
**Marker**: `CHECKPOINT:IMPLEMENTED`
**Saves**:
- List of modified files
- Summary of changes made (not full diffs)
- Staged files ready for verification
- Implementation approach taken
**Recovery**: Skip implementation, proceed to verification
### Checkpoint 3: Verification Complete
**Phase**: After all verification passes, ready to commit
**Marker**: `CHECKPOINT:VERIFIED`
**Saves**:
- Verification results (typecheck, tests, lint)
- Files ready to commit
- Draft commit message
**Recovery**: Skip verification, proceed directly to commit
**When to create checkpoints**:
- Task description > 5 sentences
- Multiple acceptance criteria (>3)
- Target file > 200 lines
- Previous attempt was interrupted (detected via existing checkpoint)
**When to skip checkpoints**:
- Simple single-criterion tasks
- Small file changes (<50 lines)
- Tasks marked as "quick fix" or "trivial"
**Add checkpoint comment to issue** after completing each phase.
Use the backend-appropriate comment tool:
- **Linear**: `mcp__plugin_linear_linear__create_comment`
- **Jira**: `mcp_plugin_atlassian_jira__add_comment`
**Checkpoint comment format** (structured for parsing):
```markdown
## Checkpoint: {CHECKPOINT_MARKER}
**Timestamp**: {ISO-8601 timestamp}
**Agent**: {agent-id or session-id if available}
### State Summary
{phase-specific state data as key-value pairs}
### Files Involved
- `{file1}` - {status: read/modified/staged}
- `{file2}` - {status: read/modified/staged}
### Next Phase
{description of what the next phase should do}
---
CHECKPOINT:{MARKER}:{subtask-id}:{timestamp}
```
**Example checkpoint comments**:
```markdown
## Checkpoint: PRIMED
**Timestamp**: 2024-01-15T14:30:00Z
**Agent**: execute-loop-1
### State Summary
- parent_id: PROJ-100
- subtask_id: PROJ-125
- target_file: src/contexts/ThemeContext.tsx
- change_type: Create
- dependencies_loaded: PROJ-124
### Files Involved
- `src/types/theme.ts` - read (from dependency)
### Next Phase
Implement ThemeContext provider with light/dark/system modes
---
CHECKPOINT:PRIMED:PROJ-125:2024-01-15T14:30:00Z
```
**Important**:
- Append new checkpoints; never delete previous ones (audit trail)
- Include machine-parseable marker line at the end
- Keep state summaries concise - metadata only, not full content
**Detect and resume from interrupted work** at the start of execution.
**Detection steps**:
1. After loading the subtask, list recent comments
2. Search for comments containing `CHECKPOINT:` marker
3. Parse the most recent checkpoint marker line
**Checkpoint marker format**:
```
CHECKPOINT:{MARKER}:{subtask-id}:{timestamp}
```
**Resume logic by marker**:
| Marker | Resume Action |
|--------|---------------|
| `PRIMED` | Skip context loading, read state summary, proceed to implementation |
| `IMPLEMENTED` | Skip implementation, verify files from state, proceed to verification |
| `VERIFIED` | Skip verification, use saved commit message, proceed to commit |
**Resume validation**:
Before resuming, validate the checkpoint is still valid:
1. Check that mentioned files still exist
2. Verify git status matches expected state (staged files, no unexpected changes)
3. If validation fails, discard checkpoint and start fresh
**Resume comment** (add when resuming):
```markdown
## Resuming from Checkpoint
**Previous checkpoint**: {MARKER} at {timestamp}
**Validation**: PASSED
**Skipping phases**: {list of skipped phases}
Continuing from {phase name}...
```
**When NOT to resume**:
- Checkpoint is >24 hours old
- Files mentioned in checkpoint were modified outside this workflow
- Subtask description has changed since checkpoint
- User explicitly requests fresh start
Pass an issue ID (either parent or subtask):
```
/execute PROJ-123 # Parent issue - finds next ready subtask
/execute PROJ-124 # Subtask - executes this specific task
```
When running in parallel mode, each agent receives a specific subtask ID to prevent race conditions.
1. **Detect backend** - Read backend from config (linear or jira)
2. **Detect issue type** - Check if passed ID is a subtask (has parent) or parent issue
3. **Load parent issue** - Get high-level context and acceptance criteria
4. **Find ready sub-task** - If parent was passed, find first ready subtask (skip if subtask was passed)
5. **Mark In Progress** - Move sub-task to "In Progress" immediately before starting work
6. **Prime context** - Load completed dependent tasks for implementation context
7. **Implement changes** - Execute the single-file-focused work
8. **Verify standard** - Run tests, typecheck, and lint
9. **Fix if needed** - Attempt automatic fixes on verification failures
10. **Verify sub-task** - Execute `### Verify` command from sub-task if present (with safety checks)
11. **Commit and push** - Create commit with conventional message, push
12. **Update status** - Move sub-task to "Done" if all criteria met
13. **Report completion** - Show what was done and what's next
**FIRST**: Determine if the passed issue ID is a subtask or a parent issue.
Use the backend-appropriate fetch tool:
- **Linear**: `mcp__plugin_linear_linear__get_issue` with `includeRelations: true`
- **Jira**: `mcp_plugin_atlassian_jira__get_issue`
**Check the `parent` field in the response**:
1. **If `parent` field EXISTS** -> This is a **SUBTASK**
- The passed ID is the specific subtask to execute (e.g., "PROJ-124")
- Skip the "find ready subtask" phase entirely
- Use this subtask directly for implementation
- Load the parent issue for context (the `parent.id` from response)
2. **If `parent` field is NULL/MISSING** -> This is a **PARENT ISSUE**
- The passed ID is the parent (e.g., "PROJ-123")
- Continue with the "find ready subtask" flow below
- This is the fallback for backward compatibility
**Why this matters**: When running in parallel mode (`mobius loop PROJ-123 --parallel=3`), each agent receives a specific subtask ID to prevent race conditions. The orchestrator assigns tasks upfront, so each agent should execute exactly the task it was given.
If the issue is a subtask, fetch its parent for high-level context.
If the issue is a parent, this is the issue itself.
Use the backend-appropriate fetch tool to get:
- **Goal**: What the overall feature/fix achieves
- **Acceptance criteria**: High-level success conditions
- **Context**: Any technical notes or constraints
- **Related issues**: For broader understanding
**Skip this section if executing a specific subtask (issue had `parent` field).**
If a parent issue was passed, list all sub-tasks:
- **Linear**: `mcp__plugin_linear_linear__list_issues` with `parentId`
- **Jira**: `mcp_plugin_atlassian_jira__list_issues` with JQL `parent = {issue-key}`
For each sub-task, check:
1. State is not "Done" or "Canceled"
2. All blocking issues are in "Done" state
Select the FIRST sub-task where all blockers are resolved.
**STOP CONDITIONS** (report and end immediately):
1. **All sub-tasks are Done**:
```
STATUS: ALL_COMPLETE
All N sub-tasks of {parent-id} are complete.
Parent issue is ready for review.
```
2. **All remaining sub-tasks are blocked**:
```
STATUS: ALL_BLOCKED
N sub-tasks remain, but all are blocked.
Waiting on: {list of blocking issues}
```
3. **No sub-tasks exist**:
```
STATUS: NO_SUBTASKS
Issue {parent-id} has no sub-tasks.
Consider running /refine first.
```
If any stop condition is met, output the status message and STOP. Do not continue.
**IMMEDIATELY** after selecting a sub-task to work on, move it to "In Progress":
- **Linear**: `mcp__plugin_linear_linear__update_issue` with `state: "In Progress"`
- **Jira**: `mcp_plugin_atlassian_jira__transition_issue` to "In Progress"
Add a comment indicating work has started using the backend-appropriate comment tool.
**Why this matters**: Moving to "In Progress" immediately ensures:
- Other agents (in parallel mode) won't pick up the same task
- The TUI/dashboard shows accurate real-time status
- If the agent crashes or times out, the task remains "In Progress" for the next loop
For each completed blocker of the selected sub-task, fetch the issue details.
Extract from each completed dependency:
- **What was implemented**: Summary of changes
- **Files modified**: To understand current state
- **Patterns used**: To maintain consistency
- **Any notes**: Implementation decisions or gotchas
Compile into a context brief for the current task.
Build context brief for implementation:
```markdown
# Execution Context
## Parent Issue: {ID} - {Title}
{Parent description and acceptance criteria}
## Current Sub-task: {ID} - {Title}
**Target file**: {file path}
**Change type**: {Create/Modify}
{Sub-task description and acceptance criteria}
## Completed Dependencies
### {Dep-1 ID}: {Title}
- Modified: {files}
- Summary: {what was done}
### {Dep-2 ID}: {Title}
- Modified: {files}
- Summary: {what was done}
## Implementation Notes
- Follow patterns from: {relevant completed tasks}
- Key imports needed: {based on dependency analysis}
- Test file: {expected test location}
```
Before making changes, read the target file(s):
- If **Create**: Check directory exists, understand sibling file patterns
- If **Modify**: Read current file content completely
Also read:
- Related type definitions (from completed dependencies)
- Test file if it exists
- Any files imported by the target
Execute the implementation following:
1. **Match existing patterns** - Use same style as similar files
2. **Single file focus** - Only modify the target file(s) specified
3. **Meet acceptance criteria** - Each criterion should be addressed
4. **Add/update tests** - If target is source file, update corresponding test
Use Edit tool for modifications, Write tool for new files.
**Implementation checklist**:
- [ ] All acceptance criteria addressed
- [ ] Follows existing code patterns
- [ ] Proper imports added
- [ ] Types are correct
- [ ] Test coverage for new code
**Stay within scope**:
- Only modify files specified in the sub-task
- Don't refactor unrelated code
- Don't add features not in acceptance criteria
- Don't fix unrelated issues discovered during work
If you discover issues outside scope:
- Note them for later
- Don't fix them now
- Can mention in completion report
**Test-Driven Development workflow is optional** and should be used when explicitly requested or when sub-tasks have highly testable acceptance criteria.
**Use TDD when ANY of these apply**:
1. **Explicit directive**: Sub-task description contains "Use TDD" or "TDD workflow"
2. **Complex business logic**: Algorithm implementations, data transformations, validation rules
3. **Refactoring existing code**: When changing implementation while preserving behavior
4. **Bug fixes with reproducible steps**: Write test that reproduces bug first
5. **Well-defined input/output**: Functions with clear contracts and edge cases
**Skip TDD when**:
- Simple configuration changes
- UI/layout modifications without logic
- Adding imports or wiring up existing components
- Documentation-only changes
- Sub-task explicitly says "Do NOT use TDD"
**Detection heuristic**: If sub-task has >3 specific, testable acceptance criteria (not just "implement X"), consider TDD.
When TDD is appropriate, follow the **red-green-refactor** cycle instead of the standard implementation flow:
### Red Phase: Write Failing Tests First
1. **Analyze acceptance criteria** - Convert each criterion to a test case
2. **Create/update test file** - Write tests that define expected behavior
3. **Run tests to confirm failure** - Tests MUST fail (proves tests are meaningful)
4. **Commit failing tests** (optional) - Some teams prefer this for traceability
```bash
# Example: Run tests to verify they fail
just test-file {test-file-pattern}
# Expected: Tests should FAIL at this point
```
**Red phase checklist**:
- [ ] Each acceptance criterion has a corresponding test
- [ ] Tests cover edge cases mentioned in sub-task
- [ ] Tests are isolated and independent
- [ ] Tests fail for the right reason (missing implementation, not syntax errors)
### Green Phase: Implement Minimal Code to Pass
1. **Focus on passing tests** - Write just enough code to make tests green
2. **Don't optimize prematurely** - Correctness first, elegance later
3. **Run tests after each change** - Verify progress incrementally
4. **All tests must pass** before proceeding
```bash
# Verify tests pass
just test-file {test-file-pattern}
# Expected: All tests should PASS
```
**Green phase checklist**:
- [ ] All previously failing tests now pass
- [ ] No new test failures introduced
- [ ] Implementation addresses acceptance criteria
- [ ] Code compiles without type errors
### Refactor Phase: Improve Code Quality
1. **Clean up implementation** - Remove duplication, improve naming
2. **Maintain passing tests** - Run tests after each refactor step
3. **Apply code patterns** - Match existing codebase conventions
4. **Don't add new behavior** - Only restructure existing code
```bash
# Verify tests still pass after refactoring
just test-file {test-file-pattern}
# Expected: All tests should still PASS
```
**Refactor phase checklist**:
- [ ] Code follows project patterns and conventions
- [ ] No code duplication
- [ ] Clear naming and structure
- [ ] All tests still pass
- [ ] Typecheck passes
**When to use each approach**:
| Scenario | Approach | Why |
|----------|----------|-----|
| "Use TDD" in description | TDD | Explicit request |
| Algorithm implementation | TDD | Complex logic benefits from test-first |
| Bug fix with repro steps | TDD | Test captures the bug |
| UI component wiring | Standard | Tests come after implementation |
| Config/env changes | Standard | Not meaningfully testable |
| >3 testable criteria | Consider TDD | High specificity suggests test-first value |
**Switching mid-task**: If you start with standard flow and realize TDD would help, you can switch. Write tests for remaining criteria, verify they fail, then continue with green-refactor.
**Commit points in TDD workflow**:
Option A: Single commit at end (recommended for small sub-tasks)
- Complete full red-green-refactor cycle
- Single commit with all changes
Option B: Multiple commits (for larger sub-tasks)
- Commit 1: Failing tests (optional, documents intent)
- Commit 2: Passing implementation + refactored code
**Commit message for TDD**:
```
feat(scope): implement feature using TDD
Red: Added tests for {criteria}
Green: Implemented {functionality}
Refactor: {what was cleaned up}
Implements: {sub-task-id}
Part-of: {parent-issue-id}
```
**Avoid these TDD mistakes**:
- **Testing implementation details**: Test behavior, not internal structure
- BAD: `expect(obj._privateMethod).toBeCalled()`
- GOOD: `expect(result).toEqual(expectedOutput)`
- **Writing tests that can't fail**: Tests must be meaningful
- BAD: `expect(true).toBe(true)`
- GOOD: `expect(calculate(input)).toBe(expectedResult)`
- **Skipping the refactor phase**: Refactoring is essential for maintainability
- BAD: Green tests → commit immediately
- GOOD: Green tests → refactor → verify still green → commit
- **Over-testing**: Don't test framework behavior or trivial code
- BAD: Testing that React renders a div
- GOOD: Testing that component displays correct data
- **Forcing TDD on unsuitable tasks**: Not everything benefits from test-first
- BAD: TDD for a CSS color change
- GOOD: Standard flow for styling, TDD for logic
Run all three verification steps:
**1. Type checking**:
```bash
just typecheck
```
**2. Tests**:
```bash
just test-file {pattern matching target file}
```
Or if new functionality spans multiple test files:
```bash
just test
```
**3. Lint** (if available):
```bash
just lint
# or
bun run lint
```
If any verification fails:
**Attempt automatic fix**:
1. Read the error output carefully
2. Identify the root cause
3. Apply targeted fix to resolve the issue
4. Re-run the failing verification
5. Repeat up to 3 times
**Common fixes**:
- Type errors: Add missing types, fix type mismatches
- Test failures: Update test expectations, fix logic errors
- Lint errors: Apply auto-fix if available, manual fix otherwise
**If fix attempts fail after 3 tries**:
- Stop execution immediately
- Do NOT ask user questions (this skill runs in an automated loop)
- Output failure status and terminate:
```markdown
STATUS: VERIFICATION_FAILED
## Sub-task Failed: {sub-task-id}
### Error Summary
{type of failure: typecheck/tests/lint}
### Last Error Output
```
{truncated error output, last 50 lines}
```
### Attempted Fixes
1. {fix attempt 1}
2. {fix attempt 2}
3. {fix attempt 3}
### Files Modified (uncommitted)
- {file1}
- {file2}
The loop will stop. Review the errors and either:
- Fix manually and run `/execute {parent-id}` again
- Or rollback with `git checkout -- .`
```
**CRITICAL**: After outputting this failure report, STOP. Do not continue trying.
All checks must pass before proceeding:
```markdown
## Verification Results
- Typecheck: PASS
- Tests: PASS (X tests, Y assertions)
- Lint: PASS
Ready for sub-task verify command (if present).
```
**After standard verification passes**, check for and execute a `### Verify` command from the sub-task description.
Extract the verify command from the sub-task description:
1. Look for `### Verify` section in the sub-task description
2. Extract the bash code block immediately following the header
3. The command is the content between ` ```bash ` and ` ``` ` markers
**Example sub-task description**:
```markdown
### Verify
```bash
grep -q "export function" src/utils/helpers.ts && \
npm test -- --grep "helpers" && \
echo "PASS: Helper function verified"
```
```
**Extraction result**: The bash command to execute.
**CRITICAL**: Before executing any verify command, check for dangerous patterns.
**Block these patterns** (do NOT execute, report as unsafe):
- `rm -rf` or `rm -r` with wildcards or root paths
- `sudo` commands
- Commands writing to system paths (`/etc`, `/usr`, `/var`)
- `chmod 777` or overly permissive permission changes
- `curl | bash` or `wget | sh` piping to shell
- `dd if=` disk operations
- `mkfs` or filesystem formatting
- `:(){:|:&};:` or other fork bombs
- `> /dev/` device writes
- Commands containing `$()` or backticks with destructive operations
**Safety check implementation**:
```bash
# Patterns to block (regex)
DANGEROUS_PATTERNS=(
"rm\s+(-[rf]+\s+)*(/|~|\*|\.\.|\\$)"
"sudo\s+"
"chmod\s+777"
"curl.*\|\s*(ba)?sh"
"wget.*\|\s*(ba)?sh"
"dd\s+if="
"mkfs"
">\s*/dev/"
":\(\)\s*\{.*\}.*;"
)
```
If a dangerous pattern is detected:
```markdown
## Verify Command Blocked
**Reason**: Command contains potentially dangerous pattern: `{pattern}`
**Command**: `{command}`
The verify command was not executed for safety reasons.
Proceeding to commit phase without sub-task verification.
**Note**: Review the verify command in the sub-task description.
```
If the verify command passes safety checks, execute it:
```bash
# Execute the extracted verify command
{extracted_verify_command}
```
**Timeout**: Verify commands have a 60-second timeout to prevent hanging.
**On success** (exit code 0):
```markdown
## Sub-task Verify Command
- Command: `{command_summary}`
- Result: PASS
- Output: {last few lines of output}
Verify command passed. Ready to commit.
```
**On failure** (non-zero exit code):
The verify command failure triggers an implementation review loop:
1. Read the error output to understand what failed
2. Review the implementation against the sub-task requirements
3. Attempt to fix the issue (similar to handling test failures)
4. Re-run the verify command
5. Repeat up to 3 times
If verify command still fails after 3 attempts:
```markdown
STATUS: VERIFICATION_FAILED
## Sub-task Failed: {sub-task-id}
### Error Summary
Sub-task verify command failed after 3 attempts
### Verify Command
```bash
{command}
```
### Last Error Output
```
{error output}
```
### Attempted Fixes
1. {fix attempt 1}
2. {fix attempt 2}
3. {fix attempt 3}
### Files Modified (uncommitted)
- {file1}
- {file2}
The loop will stop. Review the verify command and implementation.
```
**CRITICAL**: After outputting this failure report, STOP.
**If no `### Verify` section exists** in the sub-task description:
- This is normal and expected for older sub-tasks
- Proceed directly to commit phase after standard verification passes
- Include note in completion report:
```markdown
## Verification Results
- Typecheck: PASS
- Tests: PASS
- Lint: PASS
- Sub-task verify: N/A (no verify block in sub-task)
Ready to commit.
```
**Fallback behavior ensures**:
- Backward compatibility with existing sub-tasks
- Standard tests/typecheck/lint still required
- No failure if verify block is missing
Create conventional commit message:
Format:
```
{type}({scope}): {description}
{body with details}
Implements: {sub-task-id}
Part-of: {parent-issue-id}
```
**Type mapping**:
- New file created -> `feat`
- Bug fix -> `fix`
- Modification/enhancement -> `feat` or `refactor`
- Test only -> `test`
- Types only -> `types`
**Example**:
```
feat(theme): add ThemeContext provider
- Create ThemeProvider with light/dark/system modes
- Persist theme preference to localStorage
- Add useTheme hook for consuming context
Implements: PROJ-125
Part-of: PROJ-100
```
Execute git operations:
```bash
# Stage only the files we modified
git add {target-file} {test-file-if-applicable}
# Commit with conventional message
git commit -m "{commit message}"
# Push to current branch
git push
```
**Important**:
- Only stage files explicitly modified for this sub-task
- Don't use `git add -A` or `git add .`
- Verify staged files match expected scope before commit
After push, verify:
```bash
git log -1 --oneline
git status
```
Confirm:
- Commit created successfully
- Push completed without errors
- Working directory is clean
After successful commit with all acceptance criteria met, move sub-task to "Done":
- **Linear**: `mcp__plugin_linear_linear__update_issue` with `state: "Done"`
- **Jira**: `mcp_plugin_atlassian_jira__transition_issue` to "Done"
**Criteria for moving to "Done"**:
- All acceptance criteria from the sub-task are implemented
- All verification checks pass (typecheck, tests, lint)
- Changes are committed and pushed
- No outstanding work remains for this sub-task
Add comment documenting the implementation using the backend-appropriate comment tool:
```markdown
## Implementation Complete
**Commit**: {commit-hash}
**Files modified**:
- {file1}
- {file2}
**Changes**:
{brief summary of what was implemented}
**Verification**:
- Typecheck: PASS
- Tests: PASS
- Lint: PASS
**Acceptance Criteria**:
- [x] {criterion 1}
- [x] {criterion 2}
- [x] {criterion 3}
```
If the agent must wrap up before completing all work (context limits, time constraints, or blocking issues discovered), keep the task "In Progress" and add a detailed progress comment:
```markdown
## Partial Progress - Continuing Next Loop
**Progress Made**:
- {what was accomplished}
- {files modified so far}
**Remaining Work**:
- {what still needs to be done}
- {specific acceptance criteria not yet met}
**Current State**:
- Committed: {yes/no - if yes, include commit hash}
- Verification: {status of typecheck/tests/lint}
**Blockers/Issues Discovered** (if any):
- {any issues that need attention}
**Next Steps**:
- {what the next loop iteration should focus on}
```
**CRITICAL**: Do NOT move to "Done" if:
- Some acceptance criteria are not yet implemented
- Tests are failing
- There are uncommitted changes that need more work
- The implementation is incomplete
Leave the task "In Progress" so the next loop iteration can continue the work.
After successful execution, report and STOP:
```markdown
# Sub-task Completed
STATUS: SUBTASK_COMPLETE
## {Sub-task ID}: {Title}
**Status**: Moved to Done
**Commit**: {hash} on {branch}
### Files Modified
- `{file1}` - {change summary}
- `{file2}` - {change summary}
### Acceptance Criteria
- [x] Criterion 1
- [x] Criterion 2
- [x] Criterion 3
### Verification
- Typecheck: PASS
- Tests: PASS
- Lint: PASS
- Sub-task verify: {PASS/N/A}
---
## Progress
**Completed**: {X of Y sub-tasks}
**Ready next**: {list of now-unblocked sub-tasks, or "none" if all blocked/done}
**Still blocked**: {count of sub-tasks still waiting}
---
EXECUTION_COMPLETE: {sub-task-id}
```
**CRITICAL**: After outputting this report, STOP IMMEDIATELY. Do not:
- Start working on the next sub-task
- Ask if the user wants to continue
- Suggest what to do next
- Make any further tool calls
The loop script will invoke this skill again for the next sub-task.
If wrapping up with incomplete work, output this report instead:
```markdown
# Sub-task Partial Progress
STATUS: SUBTASK_PARTIAL
## {Sub-task ID}: {Title}
**Status**: In Progress (continuing next loop)
**Commit**: {hash if any, or "uncommitted changes"}
### Progress Made
- {what was accomplished}
- {files modified}
### Remaining Work
- [ ] {uncompleted criterion 1}
- [ ] {uncompleted criterion 2}
### Current State
- Typecheck: {PASS/FAIL/NOT_RUN}
- Tests: {PASS/FAIL/NOT_RUN}
- Lint: {PASS/FAIL/NOT_RUN}
- Sub-task verify: {PASS/FAIL/NOT_RUN/N/A}
### Why Stopping
{reason - e.g., "context limit reached", "blocking issue discovered", "time constraint"}
### Notes for Next Loop
{specific guidance for continuation}
---
EXECUTION_PARTIAL: {sub-task-id}
```
This status keeps the task "In Progress" for the next loop iteration to continue.
If issues were discovered during implementation but not addressed:
```markdown
### Out-of-Scope Issues Discovered
- {Issue 1}: {brief description} in {file}
- {Issue 2}: {brief description} in {file}
Consider creating separate issues for these.
```
**Input**: `/execute PROJ-100`
**Flow**:
1. Detect backend from config (e.g., `linear`)
2. Load PROJ-100 (parent: "Add dark mode support")
3. Find sub-tasks:
- PROJ-124: Define types (Done)
- PROJ-125: Create ThemeProvider (blockedBy: PROJ-124) <- **Ready**
- PROJ-126: Add useTheme hook (blockedBy: PROJ-125) - Blocked
- PROJ-127: Update Header (blockedBy: PROJ-126) - Blocked
4. Select PROJ-125 (first ready task)
5. **Immediately mark PROJ-125 as "In Progress"** and add start comment
6. Load context from PROJ-124:
- Created `src/types/theme.ts`
- Exports: `Theme`, `ThemeMode`, `ThemeContextValue`
7. Implement PROJ-125:
- Create `src/contexts/ThemeContext.tsx`
- Import types from completed dependency
- Follow existing context patterns in codebase
8. Verify:
- `just typecheck` -> PASS
- `just test-file ThemeContext` -> PASS
- `just lint` -> PASS
9. Commit and push:
```
feat(theme): create ThemeProvider context
- Add ThemeProvider component with light/dark/system modes
- Persist preference to localStorage
- Detect system preference changes
Implements: PROJ-125
Part-of: PROJ-100
```
10. Update status:
- PROJ-125 -> "Done" (all criteria met)
- Add completion comment with commit hash and acceptance criteria
11. Report and STOP:
```
STATUS: SUBTASK_COMPLETE
## PROJ-125: Create ThemeProvider
**Status**: Moved to Done
Completed: 2 of 4 sub-tasks
Ready next: PROJ-126
EXECUTION_COMPLETE: PROJ-125
```
12. **STOP** - Do not continue to PROJ-126. The loop will invoke again.
**Don't continue to next sub-task** (MOST IMPORTANT):
- BAD: "Sub-task A complete. Now let me work on sub-task B..."
- BAD: "Should I continue to the next sub-task?"
- BAD: Processing multiple sub-tasks in one invocation
- GOOD: Complete ONE sub-task, output STATUS, STOP
**Don't skip context priming**:
- BAD: Jump straight into coding without understanding dependencies
- GOOD: Load parent issue and completed blockers first
**Don't expand scope**:
- BAD: Fix unrelated issues discovered during work
- GOOD: Note them and stay focused on the sub-task
**Don't skip verification**:
- BAD: Commit without running tests
- GOOD: Full validation (tests, typecheck, lint) before every commit
**Don't commit unrelated files**:
- BAD: `git add -A` to stage everything
- GOOD: Stage only files specified in sub-task
**Don't ignore failures**:
- BAD: Push despite test failures
- GOOD: Fix issues or output VERIFICATION_FAILED and stop
**Don't forget status updates**:
- BAD: Complete work but leave sub-task in Backlog
- GOOD: Update status and add completion comment
**Don't misuse status transitions**:
- BAD: Leave task in Backlog while working on it
- BAD: Move to Done before all acceptance criteria are met
- BAD: Move to Done when tests are failing
- GOOD: Move to "In Progress" immediately when starting work
- GOOD: Move to "Done" only after successful commit with all criteria met
- GOOD: Keep "In Progress" with progress comment if wrapping up incomplete
**Don't ask user questions**:
- BAD: Using AskUserQuestion during automated loop execution
- GOOD: Make reasonable decisions or output failure STATUS and stop
A successful execution achieves:
- [ ] Backend detected from config
- [ ] Parent issue context loaded and understood
- [ ] Correct ready sub-task selected (no unresolved blockers)
- [ ] Sub-task moved to "In Progress" immediately when starting work
- [ ] Context from completed dependencies incorporated
- [ ] Implementation addresses all acceptance criteria
- [ ] Only specified files modified (scope discipline)
- [ ] Typecheck passes
- [ ] Tests pass
- [ ] Lint passes
- [ ] Sub-task verify command passes (if present in description)
- [ ] Commit created with conventional message
- [ ] Changes pushed to remote
- [ ] Sub-task moved to "Done" (if fully complete)
- [ ] Or: Sub-task kept "In Progress" with progress comment (if partial)
- [ ] Completion comment added to sub-task
- [ ] Completion report output with STATUS marker
- [ ] **STOPPED after one sub-task** (no continuation)
The skill outputs these status markers for loop script parsing:
| Status | Meaning | Loop Action |
|--------|---------|-------------|
| `STATUS: SUBTASK_COMPLETE` | Sub-task fully implemented, moved to Done | Continue loop |
| `STATUS: SUBTASK_PARTIAL` | Partial progress made, stays In Progress | Continue loop |
| `STATUS: ALL_COMPLETE` | All sub-tasks are done | Exit loop |
| `STATUS: ALL_BLOCKED` | Remaining sub-tasks are blocked | Exit loop |
| `STATUS: NO_SUBTASKS` | No sub-tasks exist | Exit loop |
| `STATUS: VERIFICATION_FAILED` | Tests/typecheck failed after retries | Exit loop |
Each invocation outputs exactly ONE status and then terminates.