---
name: gantt-tasks
description: Full CRUD operations for Gantt Board tasks including comments, attachments, and sprint management. Uses Gantt Board API with machine token authentication.
---

# gantt-tasks

**Module Skill** - Complete task management for Gantt Board via API.

## Purpose

Provides all operations needed to work with Gantt Board tasks: create, read, update, delete, comments, attachments, and sprint queries. Used by orchestrator skills and agents.

## Authentication

Uses **machine token** for server-to-server API calls:

```bash
export GANTT_MACHINE_TOKEN="50cd5e8fe3f895353f97c9ee64052c0b689b4eedf79259746413734d0a163cf8"
export GANTT_API_URL="https://gantt-board.twisteddevices.com/api"
```

**Architecture:** Skills → API (with machine token) → Database

This follows the API-centric pattern where all business logic lives in API routes.

## Usage

```bash
source ~/.agents/skills/gantt-tasks/lib/tasks.sh

# Create task
TASK_ID=$(task_create --title "Fix bug" --project "Gantt Board" --sprint current)

# Add comment
task_add_comment "$TASK_ID" "Starting work on this"

# Attach file
task_attach_file "$TASK_ID" "/path/to/file.md"
```

## Functions

### Task CRUD

#### `task_create([options])`

Create a new task.

**Options:**
- `--title` - Task title (required)
- `--description` - Task description (optional)
- `--type` - Task type: feature, bug, research, task (default: task)
- `--status` - Status: open, todo, in-progress, review, done (default: open)
- `--priority` - Priority: low, medium, high, critical (default: medium)
- `--project` - Project name or ID (optional, auto-detects "current")
- `--sprint` - Sprint name or ID, or "current" for current sprint (optional)
- `--assignee` - Assignee name or ID (default: Max)
- `--due-date` - Due date YYYY-MM-DD (optional)
- `--tags` - Tags as comma-separated string (optional)

**Returns:** Task ID on success

**Example:**
```bash
TASK_ID=$(task_create \
    --title "Research API options" \
    --description "Compare REST vs GraphQL" \
    --type research \
    --priority high \
    --sprint current \
    --tags "api,research")
```

#### `task_get(TASK_ID)`

Get full task details including comments.

**Parameters:**
- `TASK_ID` - Task UUID

**Returns:** Task JSON

**Example:**
```bash
task=$(task_get "a1b2c3d4-...")
echo "$task" | jq -r '.title'
```

#### `task_update(TASK_ID, [options])`

Update task fields.

**Parameters:**
- `TASK_ID` - Task UUID
- Options same as task_create (except project/sprint usually fixed)

**Example:**
```bash
task_update "$TASK_ID" --status in-progress --priority critical
```

#### `task_delete(TASK_ID)`

Delete a task (permanent).

**Example:**
```bash
task_delete "$TASK_ID"
```

#### `task_list([filters])`

List tasks with optional filters.

**Filters:**
- `--status` - Filter by status (comma-separated: open,todo,in-progress)
- `--project` - Filter by project name/ID
- `--sprint` - Filter by sprint name/ID or "current"
- `--assignee` - Filter by assignee
- `--priority` - Filter by priority
- `--json` - Output as JSON

**Example:**
```bash
# List current sprint tasks
task_list --sprint current --status open,todo,in-progress

# List my high priority tasks
task_list --assignee Max --priority high
```

### Comments

#### `task_add_comment(TASK_ID, TEXT, [OPTIONS])`

Add a comment to a task.

**Parameters:**
- `TASK_ID` - Task UUID
- `TEXT` - Comment text (supports markdown)
- `--checklist` - Include checklist format automatically
- `--status` - Add status prefix (in-progress, review, etc.)

**Example:**
```bash
# Simple comment
task_add_comment "$TASK_ID" "Found the issue in line 42"

# Checklist comment with status
task_add_comment "$TASK_ID" \
    "Fixed the bug\n\nNow testing..." \
    --checklist \
    --status in-progress
```

#### `task_update_comment(TASK_ID, COMMENT_ID, TEXT)`

Update an existing comment (for progress tracking).

**Parameters:**
- `TASK_ID` - Task UUID
- `COMMENT_ID` - Comment UUID to update
- `TEXT` - New comment text

**Example:**
```bash
# Update progress comment
COMMENT_ID=$(echo "$TASK" | jq -r '.comments[-1].id')

task_update_comment "$TASK_ID" "$COMMENT_ID" \
    "## $(date +%Y-%m-%d) 🔄 In Progress\n\n### ✅ Completed\n- [x] Phase 1\n\n### 🔄 In Progress\n- [ ] Phase 2"
```

**Auto-format:**
If `--checklist` is passed, formats as:
```markdown
## [YYYY-MM-DD HH:MM] 🔄 [STATUS]

### ✅ Completed
- [x] Previous item

### 🔄 In Progress
- [x] Current item: [TEXT]

### 📋 Remaining
- [ ] Next step

### 📊 Progress: X/Y tasks complete
```

#### `task_reply_to_comment(TASK_ID, COMMENT_ID, TEXT)`

Reply to an existing comment.

**Example:**
```bash
task_reply_to_comment "$TASK_ID" "$COMMENT_ID" "Great point! I'll check that."
```

### Attachments

#### `task_attach_file(TASK_ID, FILE_PATH, [OPTIONS])`

Attach a file to a task.

**Parameters:**
- `TASK_ID` - Task UUID
- `FILE_PATH` - Path to file
- `--description` - Attachment description (optional)

**Example:**
```bash
# Attach markdown file
task_attach_file "$TASK_ID" "/tmp/plan.md" --description "Implementation plan"

# Attach any file type
task_attach_file "$TASK_ID" "/tmp/screenshot.png"
```

**Note:** Large files should be stored elsewhere and linked.

### Sprint Management

#### `sprint_get_current()`

Get the current sprint (contains today's date).

**Returns:** Sprint ID

**Example:**
```bash
SPRINT_ID=$(sprint_get_current)
echo "Current sprint: $SPRINT_ID"
```

#### `sprint_list([OPTIONS])`

List all sprints.

**Options:**
- `--active` - Only active sprints
- `--project` - Filter by project

**Example:**
```bash
sprint_list --active
```

### Project Resolution

#### `resolve_project_id(PROJECT_NAME)`

Convert project name to ID.

**Example:**
```bash
PROJECT_ID=$(resolve_project_id "Gantt Board")
```

#### `resolve_user_id(USER_NAME)`

Convert user name to ID.

**Example:**
```bash
USER_ID=$(resolve_user_id "Max")
```

## File Structure

```
~/.agents/skills/gantt-tasks/
├── SKILL.md              # This documentation
└── lib/
    └── tasks.sh          # All task functions
```

## Integration Example

Complete workflow:

```bash
# Set authentication
export GANTT_MACHINE_TOKEN="50cd5e8fe3f895353f97c9ee64052c0b689b4eedf79259746413734d0a163cf8"
export GANTT_API_URL="https://gantt-board.twisteddevices.com/api"

source ~/.agents/skills/gantt-tasks/lib/tasks.sh

# 1. Create task
TASK_ID=$(task_create \
    --title "Research URL extraction options" \
    --type research \
    --priority high \
    --sprint current)

echo "Created task: $TASK_ID"

# 2. Add initial comment
task_add_comment "$TASK_ID" "Starting research phase" --checklist

# 3. Update with progress
task_update "$TASK_ID" --status in-progress
task_add_comment "$TASK_ID" "Evaluated 3 options:\n1. Scrapling\n2. Tavily\n3. web_fetch" \
    --checklist \
    --status in-progress

# 4. Attach recommendation
cat > /tmp/recommendation.md << 'EOF'
## Recommendation

Use Scrapling as primary, Tavily as fallback.

- Scrapling handles JavaScript sites
- Tavily fast for articles
- web_fetch for simple sites
EOF

task_attach_file "$TASK_ID" /tmp/recommendation.md --description "Research findings"

# 5. Mark ready for review
task_update "$TASK_ID" --status review
task_add_comment "$TASK_ID" "Research complete. Recommendation attached." \
    --checklist

echo "Task ready for review: https://gantt-board.twisteddevices.com/tasks/$TASK_ID"
```

## CLI Alternative

For interactive/command-line use, use the Gantt Board CLI:

```bash
# Set auth for CLI
export GANTT_MACHINE_TOKEN="50cd5e8fe3f895353f97c9ee64052c0b689b4eedf79259746413734d0a163cf8"
export API_URL="https://gantt-board.twisteddevices.com/api"

cd /Users/mattbruce/Documents/Projects/OpenClaw/Web/gantt-board

# Create task
./scripts/gantt.sh task create "Title" --type research --sprint current

# List tasks
./scripts/gantt.sh task list --sprint current --status in-progress

# Get task
./scripts/gantt.sh task get $TASK_ID

# Update task
./scripts/gantt.sh task update $TASK_ID --status review
```

**Note:** The skill library and CLI both use the same API endpoints with machine token authentication.

---

**Note:** This is a low-level module skill. Used by orchestrator skills, not directly by users.
