Initial commit
This commit is contained in:
12
.claude-plugin/plugin.json
Normal file
12
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "mcp-tasks-skill",
|
||||
"description": "Guidance for using the mcp-tasks MCP server for task and story management",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Hugo Duncan",
|
||||
"email": "hugo_duncan@yahoo.com"
|
||||
},
|
||||
"skills": [
|
||||
"./skills"
|
||||
]
|
||||
}
|
||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# mcp-tasks-skill
|
||||
|
||||
Guidance for using the mcp-tasks MCP server for task and story management
|
||||
45
plugin.lock.json
Normal file
45
plugin.lock.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||
"pluginId": "gh:hugoduncan/mcp-tasks:plugins/mcp-tasks-skill",
|
||||
"normalized": {
|
||||
"repo": null,
|
||||
"ref": "refs/tags/v20251128.0",
|
||||
"commit": "286a6f8b68b8d9285b9e9b703bdb5b722925ae74",
|
||||
"treeHash": "3213f6566405fcb1f81133768e82f1dffbe096048c6e2d0bf04c00dcc2090375",
|
||||
"generatedAt": "2025-11-28T10:17:36.658486Z",
|
||||
"toolVersion": "publish_plugins.py@0.2.0"
|
||||
},
|
||||
"origin": {
|
||||
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||
"branch": "master",
|
||||
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||
},
|
||||
"manifest": {
|
||||
"name": "mcp-tasks-skill",
|
||||
"description": "Guidance for using the mcp-tasks MCP server for task and story management",
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"content": {
|
||||
"files": [
|
||||
{
|
||||
"path": "README.md",
|
||||
"sha256": "fe0e0357197e81a8b0db8ef771061eababa589347078cfa3296eb622a7389737"
|
||||
},
|
||||
{
|
||||
"path": ".claude-plugin/plugin.json",
|
||||
"sha256": "fdb1cf19820246aa85aeddc273e2f866b0bd0dc3b8566ca185f9ee808b0c7c95"
|
||||
},
|
||||
{
|
||||
"path": "skills/story-and-tasks/SKILL.md",
|
||||
"sha256": "66eea7a079bf5de35686e7a45716a71a2953f630c68c6a18a624d513d57b4873"
|
||||
}
|
||||
],
|
||||
"dirSha256": "3213f6566405fcb1f81133768e82f1dffbe096048c6e2d0bf04c00dcc2090375"
|
||||
},
|
||||
"security": {
|
||||
"scannedAt": null,
|
||||
"scannerVersion": null,
|
||||
"flags": []
|
||||
}
|
||||
}
|
||||
685
skills/story-and-tasks/SKILL.md
Normal file
685
skills/story-and-tasks/SKILL.md
Normal file
@@ -0,0 +1,685 @@
|
||||
# MCP-Tasks Story and Task Management
|
||||
|
||||
This skill provides guidance on using the mcp-tasks MCP server for task and story management.
|
||||
|
||||
## Overview
|
||||
|
||||
The mcp-tasks MCP server provides:
|
||||
- **Tools**: For managing tasks (create, update, select, complete, delete)
|
||||
- **Prompts**: Workflow templates for executing tasks and stories
|
||||
- **Resources**: Category instructions and execution state
|
||||
|
||||
## MCP Tools
|
||||
|
||||
### Task Query and Modification
|
||||
|
||||
| Tool | Purpose | Key Parameters |
|
||||
|------|---------|---------------|
|
||||
| `select-tasks` | Query tasks with filtering | `task-id`, `parent-id`, `category`, `type`, `status`, `title-pattern`, `limit`, `unique` |
|
||||
| `add-task` | Create new task | Required: `category`, `title`. Optional: `description`, `parent-id`, `type`, `prepend` |
|
||||
| `update-task` | Update task fields | Required: `task-id`. Optional: `title`, `description`, `design`, `category`, `type`, `status`, `parent-id`, `meta`, `relations` |
|
||||
| `complete-task` | Mark complete and archive | Identify by `task-id` or `title`. Optional: `completion-comment` |
|
||||
| `delete-task` | Delete task | Identify by `task-id` or `title-pattern`. Cannot delete with non-closed children |
|
||||
|
||||
### Task Environment Setup
|
||||
|
||||
**`work-on`** - Prepares task execution environment (called automatically by execute prompts)
|
||||
- Required: `task-id`
|
||||
- Actions: Records execution state, manages branches/worktrees (if configured)
|
||||
- Returns: Task info (`:task-id`, `:category`, `:type`, `:title`, `:status`), environment info (`:worktree-path`, `:worktree-name`, `:branch-name`, `:worktree-clean?`, `:worktree-created?`), state file path
|
||||
|
||||
## Available Activities
|
||||
|
||||
Each activity can be invoked via slash command or by programmatically accessing the MCP resource using `ReadMcpResourceTool`.
|
||||
|
||||
### Task Activities
|
||||
|
||||
**Execute task by criteria**
|
||||
- Slash command: `/mcp-tasks:execute-task [selection-criteria...]`
|
||||
- Arguments: `category=X`, `parent-id=N`, `type=X` (combinable)
|
||||
- MCP resource: `prompt://execute-task`
|
||||
- Implementation: Use slash command OR read resource and follow prompt instructions
|
||||
|
||||
**Execute next task for category**
|
||||
- Slash command: `/mcp-tasks:next-<category>`
|
||||
- Arguments: None
|
||||
- MCP resource: `prompt://next-<category>`
|
||||
- Implementation: Use slash command OR read resource and follow prompt instructions
|
||||
|
||||
**Refine task**
|
||||
- Slash command: `/mcp-tasks:refine-task [task-spec] [context...]`
|
||||
- Arguments: Task ID ("#59", "59", "task 59") or pattern ("Update prompt")
|
||||
- MCP resource: `prompt://refine-task`
|
||||
- Implementation: Use slash command OR read resource and follow prompt instructions
|
||||
|
||||
### Story Activities
|
||||
|
||||
**Create story tasks**
|
||||
- Slash command: `/mcp-tasks:create-story-tasks [story-spec] [context...]`
|
||||
- Arguments: Story ID ("#59", "59", "story 59") or pattern ("Story title")
|
||||
- MCP resource: `prompt://create-story-tasks`
|
||||
- Implementation: Use slash command OR read resource and follow prompt instructions
|
||||
|
||||
**Execute story task**
|
||||
- Slash command: `/mcp-tasks:execute-story-child [story-spec] [context...]`
|
||||
- Arguments: Same as create-story-tasks
|
||||
- MCP resource: `prompt://execute-story-child`
|
||||
- Implementation: Use slash command OR read resource and follow prompt instructions
|
||||
|
||||
**Create story PR**
|
||||
- Slash command: `/mcp-tasks:create-story-pr [story-spec]`
|
||||
- Arguments: Same as create-story-tasks
|
||||
- MCP resource: `prompt://create-story-pr`
|
||||
- Implementation: Use slash command OR read resource and follow prompt instructions
|
||||
|
||||
**Review story implementation**
|
||||
- Slash command: `/mcp-tasks:review-story-implementation [story-spec]`
|
||||
- Arguments: Same as create-story-tasks
|
||||
- MCP resource: `prompt://review-story-implementation`
|
||||
- Implementation: Use slash command OR read resource and follow prompt instructions
|
||||
|
||||
**Complete story**
|
||||
- Slash command: `/mcp-tasks:complete-story [story-spec]`
|
||||
- Arguments: Same as create-story-tasks
|
||||
- MCP resource: `prompt://complete-story`
|
||||
- Implementation: Use slash command OR read resource and follow prompt instructions
|
||||
|
||||
### Story Shared Context
|
||||
|
||||
Stories maintain a **shared context** (`:shared-context` field) that
|
||||
enables inter-task communication during story execution. This allows
|
||||
child tasks to coordinate by reading context from previous tasks and
|
||||
appending discoveries, decisions, and important information for
|
||||
subsequent tasks.
|
||||
|
||||
**How It Works:**
|
||||
|
||||
1. **Reading Context**: Child tasks access parent story's shared context via `:parent-shared-context` field returned by `select-tasks`
|
||||
2. **Writing Context**: Tasks append to parent story's shared context using `update-task` with the story's task ID
|
||||
3. **Automatic Prefixing**: System reads current task ID from execution state (`.mcp-tasks-current.edn`) and automatically prefixes each entry with "Task NNN: "
|
||||
4. **Persistence**: Context persists with story throughout execution and is archived when story completes
|
||||
|
||||
**Context Precedence Rule:**
|
||||
|
||||
Shared context takes precedence over a task's static `:description` and
|
||||
`:design` fields when conflicts exist or new information emerges. This
|
||||
ensures tasks work with the most current state.
|
||||
|
||||
**When to Update Shared Context:**
|
||||
|
||||
Update during execution when you:
|
||||
- Make architectural or design decisions
|
||||
- Discover important information (API endpoints, configuration, constraints)
|
||||
- Find edge cases or issues
|
||||
- Implement features that subsequent tasks depend on
|
||||
- Choose between alternatives that affect later work
|
||||
|
||||
The system automatically prefixes your update with "Task NNN:" where NNN
|
||||
is the current task ID. Multiple updates accumulate with newest first.
|
||||
|
||||
**Key Points:**
|
||||
|
||||
- **Append Only**: New entries are appended to existing context (not replaced)
|
||||
- **Chronological Order**: Entries maintain order with task ID prefix showing sequence
|
||||
- **Size Limit**: 50KB total serialized EDN (enforced by `update-task`)
|
||||
- **Story Scope**: Context shared only among story and its children (not across stories)
|
||||
- **Security**: Don't store sensitive data - context appears in task files and may appear in PRs
|
||||
|
||||
### Other Resources
|
||||
|
||||
**Category instructions:**
|
||||
- `prompt://category-<category>` - Execution instructions for specific category (e.g., `prompt://category-simple`)
|
||||
|
||||
**Execution state:**
|
||||
- `resource://current-execution` - Current execution state (`story-id`, `task-id`, `started-at`)
|
||||
|
||||
### Accessing MCP Resources Programmatically
|
||||
|
||||
```clojure
|
||||
;; Example: Access execute-task prompt
|
||||
(ReadMcpResourceTool
|
||||
:server "mcp-tasks"
|
||||
:uri "prompt://execute-task")
|
||||
```
|
||||
|
||||
**Common workflow:** All execution activities follow: Find task → Call work-on → Execute category workflow → Mark complete
|
||||
|
||||
## Common Workflows
|
||||
|
||||
**Execute simple task:**
|
||||
```
|
||||
/mcp-tasks:next-simple
|
||||
```
|
||||
|
||||
**Story workflow:**
|
||||
```
|
||||
/mcp-tasks:create-story-tasks 59 # Break into tasks
|
||||
/mcp-tasks:execute-story-child 59 # Execute (repeat for each task)
|
||||
/mcp-tasks:review-story-implementation 59
|
||||
/mcp-tasks:complete-story 59
|
||||
```
|
||||
|
||||
**Refine then execute:**
|
||||
```
|
||||
/mcp-tasks:refine-task 123
|
||||
/mcp-tasks:execute-task task-id=123
|
||||
```
|
||||
|
||||
## Complete Task Lifecycle Walkthrough
|
||||
|
||||
### Prerequisites
|
||||
- mcp-tasks MCP server configured and running
|
||||
- Project initialized with `.mcp-tasks/` directory
|
||||
- Optional: `:worktree-management?` enabled in `.mcp-tasks.edn`
|
||||
- Optional: `:base-branch` configured for branch management
|
||||
|
||||
This section covers two workflows: **Standalone Tasks** and **Story-Based Workflows**.
|
||||
|
||||
### Workflow A: Standalone Task
|
||||
|
||||
Example: Executing standalone task #123 "Add user authentication" (category: medium).
|
||||
|
||||
#### 1. Refine Task (Optional - Skip for Simple/Clear Tasks)
|
||||
|
||||
```bash
|
||||
/mcp-tasks:refine-task 123
|
||||
```
|
||||
|
||||
**What happens:**
|
||||
- Agent analyzes task in project context
|
||||
- Reviews design patterns and codebase
|
||||
- Suggests improvements interactively
|
||||
- Updates task with `update-task` tool
|
||||
- Sets `meta: {"refined": "true"}`
|
||||
|
||||
**When to skip:** Simple tasks with clear requirements need no refinement.
|
||||
|
||||
#### 2. Execute Task
|
||||
|
||||
```bash
|
||||
/mcp-tasks:execute-task task-id=123
|
||||
```
|
||||
|
||||
**Behind the scenes - work-on tool (automatic):**
|
||||
|
||||
The execute prompt calls `work-on` which:
|
||||
- Writes execution state to `.mcp-tasks-current.edn`
|
||||
- Creates/switches to worktree (if `:worktree-management?` enabled)
|
||||
- Creates/switches to branch `123-add-user-authentication` (if branch management configured)
|
||||
|
||||
See [work-on Tool Reference](#work-on-tool-reference) for complete return value specification.
|
||||
|
||||
**Agent displays working environment:**
|
||||
```
|
||||
Worktree: project-123-add-user-authentication
|
||||
Directory: /Users/user/project-123-add-user-authentication
|
||||
Branch: 123-add-user-authentication
|
||||
```
|
||||
|
||||
**Category workflow execution (medium):**
|
||||
|
||||
1. **Analyze** - Agent reviews task spec, researches patterns
|
||||
2. **Check understanding** - Agent confirms understanding with user
|
||||
3. **Plan** - Agent creates implementation plan
|
||||
4. **Implement** - Agent writes code
|
||||
5. **Commit** - Agent creates git commit in main repository
|
||||
|
||||
#### 3. Complete Task
|
||||
|
||||
After successful implementation, the agent calls:
|
||||
|
||||
```clojure
|
||||
(complete-task :task-id 123 :completion-comment "Implemented JWT auth")
|
||||
```
|
||||
|
||||
**What happens:**
|
||||
- Task status changed to `:closed`
|
||||
- Task moved from `tasks.ednl` to `complete.ednl`
|
||||
- Execution state cleared from `.mcp-tasks-current.edn`
|
||||
- **Automatic worktree cleanup** (if `:worktree-management?` enabled) - see [Worktree Cleanup Mechanism](#worktree-cleanup-mechanism)
|
||||
|
||||
### Configuration Impact
|
||||
|
||||
| Feature | Enabled | Disabled |
|
||||
|---------|---------|----------|
|
||||
| **Worktree Management** | Creates sibling directory worktree, auto-cleanup on completion | Works in current directory |
|
||||
| **Branch Management** | Creates `<id>-<title-slug>` branch automatically | Uses current branch |
|
||||
|
||||
See [Git Integration](#git-integration) for naming conventions and [Error Recovery](#error-recovery) for failure handling.
|
||||
|
||||
### Workflow B: Story-Based Workflow
|
||||
|
||||
Example: Story #408 "Improve mcp-tasks skill" with multiple child tasks.
|
||||
|
||||
#### 1. Refine Story (Optional but Recommended)
|
||||
|
||||
```bash
|
||||
/mcp-tasks:refine-task 408
|
||||
```
|
||||
|
||||
**What happens:**
|
||||
- Agent analyzes story in project context
|
||||
- Suggests improvements to requirements
|
||||
- Updates story with `update-task` tool
|
||||
- Sets `meta: {"refined": "true"}`
|
||||
|
||||
**Note:** The `create-story-tasks` prompt will halt and require explicit user confirmation to proceed if story is unrefined. Agents must never proceed automatically.
|
||||
|
||||
#### 2. Create Story Tasks
|
||||
|
||||
```bash
|
||||
/mcp-tasks:create-story-tasks 408
|
||||
```
|
||||
|
||||
**What happens:**
|
||||
- Retrieves story using `select-tasks` (type: story)
|
||||
- Checks refinement status, warns if not refined
|
||||
- Displays story content to user
|
||||
- Analyzes and breaks down into specific tasks
|
||||
- Presents task breakdown for user approval
|
||||
- Adds each task using `add-task` with:
|
||||
- `parent-id`: Story ID (408)
|
||||
- `category`: Appropriate category per task
|
||||
- `type`: Usually `:task`, `:feature`, or `:bug`
|
||||
|
||||
**Example tasks created:**
|
||||
```
|
||||
Task #410: Add walkthrough section (category: medium, parent-id: 408)
|
||||
Task #411: Document git integration (category: medium, parent-id: 408)
|
||||
Task #412: Add error recovery section (category: simple, parent-id: 408)
|
||||
```
|
||||
|
||||
#### 3. Execute Story Tasks (Repeat for Each Task)
|
||||
|
||||
```bash
|
||||
/mcp-tasks:execute-story-child 408
|
||||
```
|
||||
|
||||
**What happens:**
|
||||
- Finds story and first incomplete child task
|
||||
- Shows progress: "2 of 5 tasks completed"
|
||||
- Calls `work-on` tool with task ID
|
||||
- **For first task only** (if worktree/branch management enabled):
|
||||
- Creates worktree: `project-408-improve-mcp-tasks-skill/`
|
||||
- Creates branch: `408-improve-mcp-tasks-skill`
|
||||
- All story tasks use same worktree/branch
|
||||
- Executes task using its category workflow
|
||||
- Creates git commit
|
||||
- Marks task complete with `complete-task`
|
||||
- **Preserves worktree** for remaining story tasks
|
||||
|
||||
**Repeat** until all story tasks complete.
|
||||
|
||||
#### 4. Create Pull Request (Optional)
|
||||
|
||||
```bash
|
||||
/mcp-tasks:create-story-pr 408
|
||||
```
|
||||
|
||||
**What happens:**
|
||||
- Finds story using `select-tasks`
|
||||
- Verifies current branch (must not be master/main)
|
||||
- Collects commits from story branch
|
||||
- Generates PR content:
|
||||
- Title: Story title (with optional semantic prefix)
|
||||
- Description: Story details + commit summary
|
||||
- Creates PR targeting default branch
|
||||
- Returns PR URL
|
||||
|
||||
**Prerequisites:**
|
||||
- Must be on story branch
|
||||
- Remote repository configured
|
||||
- `gh` CLI or similar tool available
|
||||
|
||||
#### 5. Complete Story (After PR Merged)
|
||||
|
||||
```bash
|
||||
/mcp-tasks:complete-story 408
|
||||
```
|
||||
|
||||
**What happens:**
|
||||
- Requires user confirmation before archiving. Never complete a story without explicit user approval.
|
||||
- Moves story and all child tasks to archive
|
||||
- Preserves implementation history
|
||||
|
||||
**Worktree cleanup:**
|
||||
After PR is merged, manually remove worktree:
|
||||
```bash
|
||||
git worktree remove /path/to/project-408-improve-mcp-tasks-skill
|
||||
```
|
||||
|
||||
Or if automatic cleanup enabled, it happens on last task completion.
|
||||
|
||||
## work-on Tool Reference
|
||||
|
||||
### Invocation Rules
|
||||
|
||||
| Context | Invocation | Who Calls |
|
||||
|---------|------------|-----------|
|
||||
| Execute prompts | Automatic | Execute prompt calls `work-on` before category workflow |
|
||||
| Manual setup | Manual | User calls `work-on` directly via tool |
|
||||
| Typical use | Automatic | Most users never call `work-on` directly |
|
||||
|
||||
**When to call manually:**
|
||||
- Custom workflows outside standard execute prompts
|
||||
- Debugging execution state issues
|
||||
- Setting up environment without executing task
|
||||
|
||||
### When Agents Should Call work-on Directly
|
||||
|
||||
Agents must call the `work-on` tool explicitly when the user instructs them to work on a specific task or story:
|
||||
|
||||
**User instruction patterns requiring explicit work-on call:**
|
||||
- "Work on task 123"
|
||||
- "Start working on task 123"
|
||||
- "Work on story 59"
|
||||
- "Begin task 123"
|
||||
- Similar direct instructions to start working on a specific task/story
|
||||
|
||||
**Process:**
|
||||
1. Parse user instruction to identify task/story ID
|
||||
2. Call `mcp__mcp-tasks__work-on` with the task ID
|
||||
3. Display working environment context (worktree, branch if present)
|
||||
4. Proceed with task execution according to the category workflow
|
||||
|
||||
**Contrast with execute prompts:**
|
||||
- Execute prompts (e.g., `/mcp-tasks:execute-story-child`) call `work-on` automatically
|
||||
- When user gives direct instruction to work on a task, agent must call `work-on` before proceeding
|
||||
|
||||
### Return Value Specification
|
||||
|
||||
`work-on` returns a map with task and environment information:
|
||||
|
||||
| Field | Type | Always Present | Description |
|
||||
|-------|------|----------------|-------------|
|
||||
| `:task-id` | int | Yes | Task ID being worked on |
|
||||
| `:category` | string | Yes | Task category |
|
||||
| `:type` | keyword | Yes | Task type (`:task`, `:bug`, `:feature`, `:story`, `:chore`) |
|
||||
| `:title` | string | Yes | Task title |
|
||||
| `:status` | keyword | Yes | Task status (`:open`, `:in-progress`, `:blocked`, `:closed`) |
|
||||
| `:message` | string | Yes | Status message about operation |
|
||||
| `:execution-state-file` | string | Yes | Path to `.mcp-tasks-current.edn` |
|
||||
| `:worktree-path` | string | Conditional | Full path to worktree (only if in worktree) |
|
||||
| `:worktree-name` | string | Conditional | Worktree directory name (only if `:worktree-path` present) |
|
||||
| `:branch-name` | string | Conditional | Current branch name (only if branch management active) |
|
||||
| `:worktree-clean?` | boolean | Conditional | No uncommitted changes (only if in worktree) |
|
||||
| `:worktree-created?` | boolean | Conditional | New worktree created vs reused (only if in worktree) |
|
||||
|
||||
**Example response (with worktree management enabled):**
|
||||
```clojure
|
||||
{:task-id 123
|
||||
:category "medium"
|
||||
:type :task
|
||||
:title "Add user authentication"
|
||||
:status :open
|
||||
:message "Task validated successfully and execution state written"
|
||||
:worktree-path "/Users/user/project-123-add-user-authentication"
|
||||
:worktree-name "project-123-add-user-authentication"
|
||||
:branch-name "123-add-user-authentication"
|
||||
:worktree-clean? true
|
||||
:worktree-created? true
|
||||
:execution-state-file "/Users/user/project-123-add-user-authentication/.mcp-tasks-current.edn"}
|
||||
```
|
||||
|
||||
**Example response (worktree management disabled):**
|
||||
```clojure
|
||||
{:task-id 123
|
||||
:category "medium"
|
||||
:type :task
|
||||
:title "Add user authentication"
|
||||
:status :open
|
||||
:message "Task validated successfully and execution state written"
|
||||
:execution-state-file ".mcp-tasks-current.edn"}
|
||||
```
|
||||
|
||||
## Git Integration
|
||||
|
||||
### Branch Naming Convention
|
||||
|
||||
**Format:** `<id>-<title-slug>`
|
||||
|
||||
**Slugification process:**
|
||||
1. Extract first N words from title (default: 4, configurable via `:branch-title-words`)
|
||||
2. Convert to lowercase
|
||||
3. Replace spaces with dashes
|
||||
4. Remove all special characters (keep only a-z, 0-9, -)
|
||||
|
||||
**Examples:**
|
||||
|
||||
| Task ID | Title | `:branch-title-words` | Branch Name |
|
||||
|---------|-------|----------------------|-------------|
|
||||
| 123 | "Implement user authentication with OAuth" | 4 (default) | `123-implement-user-authentication-with` |
|
||||
| 123 | "Implement user authentication with OAuth" | 2 | `123-implement-user` |
|
||||
| 123 | "Implement user authentication with OAuth" | nil | `123-implement-user-authentication-with-oauth` |
|
||||
| 59 | "Add JWT support" | 4 | `59-add-jwt-support` |
|
||||
| 408 | "Improve mcp-tasks skill" | 4 | `408-improve-mcp-tasks-skill` |
|
||||
|
||||
### Worktree Naming Convention
|
||||
|
||||
**Format:** Depends on `:worktree-prefix` configuration
|
||||
|
||||
| `:worktree-prefix` | Format | Example |
|
||||
|-------------------|--------|---------|
|
||||
| `:project-name` | `<project>-<id>-<title-slug>` | `mcp-tasks-123-implement-user-authentication-with` |
|
||||
| `:none` | `<id>-<title-slug>` | `123-implement-user-authentication-with` |
|
||||
|
||||
**Title slug:** Same process as branch naming (first N words, slugified)
|
||||
|
||||
**Location:** Sibling directory to main repository
|
||||
```
|
||||
/Users/user/project/ # Main repo
|
||||
/Users/user/project-123-add-auth/ # Worktree (with :project-name prefix)
|
||||
/Users/user/123-add-auth/ # Worktree (with :none prefix)
|
||||
```
|
||||
|
||||
### Commit Timing and Location
|
||||
|
||||
**When commits occur:**
|
||||
- During category workflow execution (varies by category)
|
||||
- Simple: After implementation complete
|
||||
- Medium: After implementation complete
|
||||
- Large: After each significant milestone + final implementation
|
||||
|
||||
**Where commits occur:**
|
||||
- Always in the **main repository** (`.git` directory location)
|
||||
- Even when working in a worktree, commits are recorded in main repo
|
||||
- Worktrees share the same commit history
|
||||
|
||||
**Who creates commits:**
|
||||
- The agent executing the category workflow
|
||||
- Follows category-specific commit instructions
|
||||
- Uses git operations in current working directory
|
||||
|
||||
### Task/Branch/Worktree Relationships
|
||||
|
||||
```
|
||||
Story Task #408 "Improve mcp-tasks skill"
|
||||
├─ Branch: 408-improve-mcp-tasks-skill
|
||||
├─ Worktree: /path/to/project-408-improve-mcp-tasks-skill/
|
||||
│
|
||||
├─ Child Task #410 (category: medium)
|
||||
│ └─ Uses same branch + worktree as parent story
|
||||
│
|
||||
├─ Child Task #411 (category: medium)
|
||||
│ └─ Uses same branch + worktree as parent story
|
||||
│
|
||||
└─ Child Task #412 (category: simple)
|
||||
└─ Uses same branch + worktree as parent story
|
||||
|
||||
Standalone Task #123 "Add authentication"
|
||||
├─ Branch: 123-add-authentication
|
||||
└─ Worktree: /path/to/project-123-add-authentication/
|
||||
```
|
||||
|
||||
**Rules:**
|
||||
- Story tasks share parent story's branch and worktree
|
||||
- Standalone tasks get unique branch and worktree
|
||||
- One worktree per task/story (not per child task)
|
||||
- All commits for story tasks go to story branch
|
||||
|
||||
### Worktree Cleanup Mechanism
|
||||
|
||||
**Automatic cleanup (when `:worktree-management?` enabled):**
|
||||
|
||||
Triggered by `complete-task` tool when:
|
||||
- Task is completed successfully
|
||||
- Current working directory is inside a worktree
|
||||
|
||||
**Safety checks before removal:**
|
||||
|
||||
| Check | Requirement | Failure Result |
|
||||
|-------|-------------|----------------|
|
||||
| Clean working directory | No uncommitted changes | Task marked complete, worktree preserved, warning shown |
|
||||
| Pushed commits | All commits pushed to remote (if remote configured) | Task marked complete, worktree preserved, warning shown |
|
||||
|
||||
**Cleanup outcomes:**
|
||||
|
||||
| Scenario | Task Status | Worktree | Branch | Message |
|
||||
|----------|-------------|----------|--------|---------|
|
||||
| Success | `:closed` | Removed | Preserved | "Worktree removed at /path (switch directories to continue)" |
|
||||
| Uncommitted changes | `:closed` | Preserved | Preserved | "Warning: Could not remove worktree: Uncommitted changes exist" |
|
||||
| Unpushed commits | `:closed` | Preserved | Preserved | "Warning: Could not remove worktree: Unpushed commits exist" |
|
||||
| Git error | `:closed` | Preserved | Preserved | "Warning: Could not remove worktree: <error message>" |
|
||||
|
||||
**Manual cleanup commands:**
|
||||
|
||||
```bash
|
||||
# From main repository directory
|
||||
git worktree remove /path/to/worktree
|
||||
|
||||
# Force removal (use with caution)
|
||||
git worktree remove --force /path/to/worktree
|
||||
|
||||
# List all worktrees
|
||||
git worktree list
|
||||
|
||||
# Remove worktree that was already deleted from filesystem
|
||||
git worktree prune
|
||||
```
|
||||
|
||||
**When to use manual cleanup:**
|
||||
- Automatic cleanup failed due to safety checks
|
||||
- Worktree directory deleted manually
|
||||
- Need to clean up multiple worktrees at once
|
||||
- Worktree in inconsistent state
|
||||
|
||||
## Error Recovery
|
||||
|
||||
### Task Execution Failures
|
||||
|
||||
**If task execution fails or is interrupted:**
|
||||
|
||||
1. **Execution state persists:** `.mcp-tasks-current.edn` remains with `:started-at` timestamp
|
||||
2. **Task status unchanged:** Stays `:open` (not marked complete)
|
||||
3. **Worktree/branch preserved:** Environment remains set up
|
||||
4. **To resume:** Re-run the execute prompt
|
||||
- `work-on` overwrites stale execution state automatically
|
||||
- Execution continues from current code state
|
||||
|
||||
**Common failure scenarios:**
|
||||
|
||||
| Failure | Recovery Action |
|
||||
|---------|----------------|
|
||||
| Agent context limit exceeded | Break task into smaller subtasks, execute separately |
|
||||
| Implementation error/bug | Fix manually, re-run execute prompt to continue |
|
||||
| Network/tool failure | Re-run execute prompt (idempotent) |
|
||||
| User interruption (Ctrl-C) | Re-run execute prompt |
|
||||
|
||||
### Handling Blocked Tasks
|
||||
|
||||
**When a task depends on another task:**
|
||||
|
||||
```clojure
|
||||
;; Mark current task as blocked
|
||||
(update-task
|
||||
:task-id 123
|
||||
:status :blocked
|
||||
:relations [{:relates-to 456, :as-type :blocked-by}])
|
||||
```
|
||||
|
||||
**Relation types:**
|
||||
|
||||
| Type | Meaning | Example |
|
||||
|------|---------|---------|
|
||||
| `:blocked-by` | Cannot proceed until other task completes | Task #123 blocked by #456 |
|
||||
| `:related` | Related but not blocking | Task #123 related to #456 |
|
||||
| `:discovered-during` | Found while working on another task | Task #123 found during #456 |
|
||||
|
||||
**Unblocking workflow:**
|
||||
1. Execute blocking task first (e.g., task #456)
|
||||
2. Complete blocking task
|
||||
3. Update blocked task to remove relation and set status to `:open`
|
||||
4. Execute previously blocked task
|
||||
|
||||
### Delete vs Update vs Complete
|
||||
|
||||
**Decision matrix:**
|
||||
|
||||
| Scenario | Action | Tool | Reason |
|
||||
|----------|--------|------|--------|
|
||||
| Task done successfully | Complete | `complete-task` | Preserves audit trail in `complete.ednl` |
|
||||
| Task no longer needed | Delete | `delete-task` | Removes from `tasks.ednl`, archives in `complete.ednl` with `:status :deleted` |
|
||||
| Task needs clarification | Update | `update-task` | Modify `:description` or `:design` fields |
|
||||
| Task scope changed | Update | `update-task` | Modify `:title`, `:description`, `:category` |
|
||||
| Task blocked temporarily | Update | `update-task` | Set `:status :blocked`, add `:relations` |
|
||||
| Task duplicates another | Delete | `delete-task` | Add `:relations` to other task first |
|
||||
| Task split into subtasks | Create subtasks then delete parent | `add-task` + `delete-task` | Use `:parent-id` for subtasks |
|
||||
|
||||
**Constraints:**
|
||||
- Cannot delete task with non-closed children (must complete or delete children first)
|
||||
- Cannot complete task if blocked (must update to `:open` first)
|
||||
- Deleted tasks are archived, not permanently removed
|
||||
|
||||
### Recovering from Interrupted Execution
|
||||
|
||||
**Stale execution state detection:**
|
||||
|
||||
External tools detect stale executions via `:started-at` timestamp in `.mcp-tasks-current.edn`:
|
||||
|
||||
```clojure
|
||||
{:story-id 408
|
||||
:task-id 411
|
||||
:started-at "2025-10-29T10:30:00Z"} ; If hours/days old = likely stale
|
||||
```
|
||||
|
||||
**Recovery steps:**
|
||||
|
||||
1. **Check current execution state:**
|
||||
```bash
|
||||
cat .mcp-tasks-current.edn
|
||||
```
|
||||
|
||||
2. **Verify if execution actually stale:**
|
||||
- Check timestamp age
|
||||
- Check if agent still running
|
||||
- Check if work in progress
|
||||
|
||||
3. **Resume or restart:**
|
||||
- If continuing same task: Re-run execute prompt
|
||||
- If switching tasks: Run execute prompt for different task (overwrites state)
|
||||
- If abandoning task: Manually delete `.mcp-tasks-current.edn`
|
||||
|
||||
4. **Manual state cleanup (if needed):**
|
||||
```bash
|
||||
rm .mcp-tasks-current.edn
|
||||
```
|
||||
|
||||
**Note:** `work-on` automatically overwrites execution state, so manual cleanup rarely needed.
|
||||
|
||||
## Best Practices
|
||||
|
||||
- Refine complex/unclear tasks before execution
|
||||
- Match task complexity to category
|
||||
- Use `parent-id` when creating story tasks
|
||||
- Monitor execution via `resource://current-execution`
|
||||
- Never create story child tasks for unrefined stories without explicit user confirmation
|
||||
- Always call work-on tool when user instructs you to work on a specific task or story
|
||||
- Never complete stories without explicit user confirmation
|
||||
|
||||
## File Locations
|
||||
|
||||
- Tasks: `.mcp-tasks/tasks.ednl`
|
||||
- Completed: `.mcp-tasks/complete.ednl`
|
||||
- Execution state: `.mcp-tasks-current.edn`
|
||||
- Category prompts: `.mcp-tasks/prompts/<category>.md` (optional overrides)
|
||||
- Story prompts: `.mcp-tasks/story/prompts/<name>.md` (optional overrides)
|
||||
Reference in New Issue
Block a user