358 lines
8.1 KiB
Markdown
358 lines
8.1 KiB
Markdown
---
|
|
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.
|