324 lines
12 KiB
Markdown
324 lines
12 KiB
Markdown
[日本語](./task-management.ja.md)
|
|
|
|
# Task Management
|
|
|
|
## Overview
|
|
|
|
TAKT provides a task management workflow for accumulating multiple tasks and executing them in batch. The basic flow is:
|
|
|
|
1. **`takt add`** -- Refine task requirements through AI conversation and save to `.takt/tasks.yaml`
|
|
2. **Tasks accumulate** -- Edit `order.md` files, attach reference materials
|
|
3. **`takt run`** -- Execute all pending tasks at once (sequential or parallel)
|
|
4. **`takt list`** -- Review results, merge branches, retry failures, or add instructions
|
|
|
|
Each task executes in an isolated shared clone (optional), produces reports, and creates a branch that can be merged or discarded via `takt list`.
|
|
|
|
## Adding Tasks (`takt add`)
|
|
|
|
Use `takt add` to create a new task entry in `.takt/tasks.yaml`.
|
|
|
|
```bash
|
|
# Add a task with inline text
|
|
takt add "Implement user authentication"
|
|
|
|
# Add a task from a GitHub Issue
|
|
takt add #28
|
|
```
|
|
|
|
When adding a task, you are prompted for:
|
|
|
|
- **Piece** -- Which piece (workflow) to use for execution
|
|
- **Worktree path** -- Where to create the isolated clone (Enter for auto, or specify a path)
|
|
- **Branch name** -- Custom branch name (Enter for auto-generated `takt/{timestamp}-{slug}`)
|
|
- **Auto-PR** -- Whether to automatically create a pull request after successful execution
|
|
|
|
### GitHub Issue Integration
|
|
|
|
When you pass an issue reference (e.g., `#28`), TAKT fetches the issue title, body, labels, and comments via the GitHub CLI (`gh`) and uses them as the task content. The issue number is recorded in `tasks.yaml` and reflected in the branch name.
|
|
|
|
**Requirement:** [GitHub CLI](https://cli.github.com/) (`gh`) must be installed and authenticated.
|
|
|
|
### Saving Tasks from Interactive Mode
|
|
|
|
You can also save tasks from interactive mode. After refining requirements through conversation, use `/save` (or the save action when prompted) to persist the task to `tasks.yaml` instead of executing immediately.
|
|
|
|
## Task Directory Format
|
|
|
|
TAKT stores task metadata in `.takt/tasks.yaml` and each task's detailed specification in `.takt/tasks/{slug}/`.
|
|
|
|
### `tasks.yaml` Schema
|
|
|
|
```yaml
|
|
tasks:
|
|
- name: add-auth-feature
|
|
status: pending
|
|
task_dir: .takt/tasks/20260201-015714-foptng
|
|
piece: default
|
|
created_at: "2026-02-01T01:57:14.000Z"
|
|
started_at: null
|
|
completed_at: null
|
|
```
|
|
|
|
Fields:
|
|
|
|
| Field | Description |
|
|
|-------|-------------|
|
|
| `name` | AI-generated task slug |
|
|
| `status` | `pending`, `running`, `completed`, or `failed` |
|
|
| `task_dir` | Path to the task directory containing `order.md` |
|
|
| `piece` | Piece name to use for execution |
|
|
| `worktree` | `true` (auto), a path string, or omitted (run in current directory) |
|
|
| `branch` | Branch name (auto-generated if omitted) |
|
|
| `auto_pr` | Whether to auto-create a PR after execution |
|
|
| `issue` | GitHub Issue number (if applicable) |
|
|
| `created_at` | ISO 8601 timestamp |
|
|
| `started_at` | ISO 8601 timestamp (set when execution begins) |
|
|
| `completed_at` | ISO 8601 timestamp (set when execution finishes) |
|
|
|
|
### Task Directory Layout
|
|
|
|
```text
|
|
.takt/
|
|
tasks/
|
|
20260201-015714-foptng/
|
|
order.md # Task specification (auto-generated, editable)
|
|
schema.sql # Attached reference materials (optional)
|
|
wireframe.png # Attached reference materials (optional)
|
|
tasks.yaml # Task metadata records
|
|
runs/
|
|
20260201-015714-foptng/
|
|
reports/ # Execution reports (auto-generated)
|
|
logs/ # NDJSON session logs
|
|
context/ # Snapshots (previous_responses, etc.)
|
|
meta.json # Run metadata
|
|
```
|
|
|
|
`takt add` creates `.takt/tasks/{slug}/order.md` automatically and saves the `task_dir` reference to `tasks.yaml`. You can freely edit `order.md` and add supplementary files (SQL schemas, wireframes, API specs, etc.) to the task directory before execution.
|
|
|
|
## Executing Tasks (`takt run`)
|
|
|
|
Execute all pending tasks from `.takt/tasks.yaml`:
|
|
|
|
```bash
|
|
takt run
|
|
```
|
|
|
|
The `run` command claims pending tasks and executes them through the configured piece. Each task goes through:
|
|
|
|
1. Clone creation (if `worktree` is set)
|
|
2. Piece execution in the clone/project directory
|
|
3. Auto-commit and push (if worktree execution)
|
|
4. Post-execution flow (PR creation if `auto_pr` is set)
|
|
5. Status update in `tasks.yaml` (`completed` or `failed`)
|
|
|
|
### Parallel Execution (Concurrency)
|
|
|
|
By default, tasks run sequentially (`concurrency: 1`). Configure parallel execution in `~/.takt/config.yaml`:
|
|
|
|
```yaml
|
|
concurrency: 3 # Run up to 3 tasks in parallel (1-10)
|
|
task_poll_interval_ms: 500 # Polling interval for new tasks (100-5000ms)
|
|
```
|
|
|
|
When concurrency is greater than 1, TAKT uses a worker pool that:
|
|
|
|
- Runs up to N tasks simultaneously
|
|
- Polls for newly added tasks at the configured interval
|
|
- Picks up new tasks as workers become available
|
|
- Displays color-coded prefixed output per task for readability
|
|
- Supports graceful shutdown on Ctrl+C (waits for in-flight tasks to complete)
|
|
|
|
### Interrupted Task Recovery
|
|
|
|
If `takt run` is interrupted (e.g., process crash, Ctrl+C), tasks left in `running` status are automatically recovered to `pending` on the next `takt run` or `takt watch` invocation.
|
|
|
|
## Watching Tasks (`takt watch`)
|
|
|
|
Run a resident process that monitors `.takt/tasks.yaml` and auto-executes tasks as they appear:
|
|
|
|
```bash
|
|
takt watch
|
|
```
|
|
|
|
The watch command:
|
|
|
|
- Stays running until Ctrl+C (SIGINT)
|
|
- Monitors `tasks.yaml` for new `pending` tasks
|
|
- Executes each task as it appears
|
|
- Recovers interrupted `running` tasks on startup
|
|
- Displays a summary of total/success/failed tasks on exit
|
|
|
|
This is useful for a "producer-consumer" workflow where you add tasks with `takt add` in one terminal and let `takt watch` execute them automatically in another.
|
|
|
|
## Managing Task Branches (`takt list`)
|
|
|
|
List and manage task branches interactively:
|
|
|
|
```bash
|
|
takt list
|
|
```
|
|
|
|
The list view shows all tasks organized by status (pending, running, completed, failed) with creation dates and summaries. Selecting a task shows available actions depending on its status.
|
|
|
|
### Actions for Completed Tasks
|
|
|
|
| Action | Description |
|
|
|--------|-------------|
|
|
| **View diff** | Show full diff against the default branch in a pager |
|
|
| **Instruct** | Open an AI conversation to craft additional instructions, then re-execute |
|
|
| **Try merge** | Squash merge (stages changes without committing, for manual review) |
|
|
| **Merge & cleanup** | Squash merge and delete the branch |
|
|
| **Delete** | Discard all changes and delete the branch |
|
|
|
|
### Actions for Failed Tasks
|
|
|
|
| Action | Description |
|
|
|--------|-------------|
|
|
| **Retry** | Open a retry conversation with failure context, then re-execute |
|
|
| **Delete** | Remove the failed task record |
|
|
|
|
### Actions for Pending Tasks
|
|
|
|
| Action | Description |
|
|
|--------|-------------|
|
|
| **Delete** | Remove the pending task from `tasks.yaml` |
|
|
|
|
### Instruct Mode
|
|
|
|
When you select **Instruct** on a completed task, TAKT opens an interactive conversation loop with the AI. The conversation is pre-loaded with:
|
|
|
|
- Branch context (diff stat against default branch, commit history)
|
|
- Previous run session data (movement logs, reports)
|
|
- Piece structure and movement previews
|
|
- Previous order content
|
|
|
|
You can discuss what additional changes are needed, and the AI helps refine the instructions. When ready, choose:
|
|
|
|
- **Execute** -- Re-execute the task immediately with the new instructions
|
|
- **Save task** -- Requeue the task as `pending` with the new instructions for later execution
|
|
- **Cancel** -- Discard and return to the list
|
|
|
|
### Retry Mode
|
|
|
|
When you select **Retry** on a failed task, TAKT:
|
|
|
|
1. Displays failure details (failed movement, error message, last agent message)
|
|
2. Prompts you to select a piece
|
|
3. Prompts you to select which movement to start from (defaults to the failed movement)
|
|
4. Opens a retry conversation pre-loaded with failure context, run session data, and piece structure
|
|
5. Lets you refine instructions with AI assistance
|
|
|
|
The retry conversation supports the same actions as Instruct mode (execute, save task, cancel). Retry notes are appended to the task record, accumulating across multiple retry attempts.
|
|
|
|
### Non-Interactive Mode (`--non-interactive`)
|
|
|
|
For CI/CD scripts, use non-interactive mode:
|
|
|
|
```bash
|
|
# List all tasks as text
|
|
takt list --non-interactive
|
|
|
|
# List all tasks as JSON
|
|
takt list --non-interactive --format json
|
|
|
|
# Show diff stat for a specific branch
|
|
takt list --non-interactive --action diff --branch takt/my-branch
|
|
|
|
# Merge a specific branch
|
|
takt list --non-interactive --action merge --branch takt/my-branch
|
|
|
|
# Delete a branch (requires --yes)
|
|
takt list --non-interactive --action delete --branch takt/my-branch --yes
|
|
|
|
# Try merge (stage without commit)
|
|
takt list --non-interactive --action try --branch takt/my-branch
|
|
```
|
|
|
|
Available actions: `diff`, `try`, `merge`, `delete`.
|
|
|
|
## Task Directory Workflow
|
|
|
|
The recommended end-to-end workflow:
|
|
|
|
1. **`takt add`** -- Create a task. A pending record is added to `.takt/tasks.yaml` and `order.md` is generated in `.takt/tasks/{slug}/`.
|
|
2. **Edit `order.md`** -- Open the generated file and add detailed specifications, reference materials, or supplementary files as needed.
|
|
3. **`takt run`** (or `takt watch`) -- Execute pending tasks from `tasks.yaml`. Each task runs through the configured piece workflow.
|
|
4. **Verify outputs** -- Check execution reports in `.takt/runs/{slug}/reports/` (the slug matches the task directory).
|
|
5. **`takt list`** -- Review results, merge successful branches, retry failures, or add further instructions.
|
|
|
|
## Isolated Execution (Shared Clone)
|
|
|
|
Specifying `worktree` in task configuration executes each task in an isolated clone created with `git clone --shared`, keeping your main working directory clean.
|
|
|
|
### Configuration Options
|
|
|
|
| Setting | Description |
|
|
|---------|-------------|
|
|
| `worktree: true` | Auto-create shared clone in adjacent directory (or location specified by `worktree_dir` config) |
|
|
| `worktree: "/path/to/dir"` | Create clone at the specified path |
|
|
| `branch: "feat/xxx"` | Use specified branch (auto-generated as `takt/{timestamp}-{slug}` if omitted) |
|
|
| *(omit `worktree`)* | Execute in current directory (default) |
|
|
|
|
### How It Works
|
|
|
|
TAKT uses `git clone --shared` instead of `git worktree` to create lightweight clones with an independent `.git` directory. This is important because:
|
|
|
|
- **Independent `.git`**: Shared clones have their own `.git` directory, preventing agent tools from traversing `gitdir:` references back to the main repository.
|
|
- **Full isolation**: Agents work entirely within the clone directory, unaware of the main repository.
|
|
|
|
> **Note**: The YAML field name remains `worktree` for backward compatibility. Internally, it uses `git clone --shared` instead of `git worktree`.
|
|
|
|
### Ephemeral Lifecycle
|
|
|
|
Clones follow an ephemeral lifecycle:
|
|
|
|
1. **Create** -- Clone is created before task execution
|
|
2. **Execute** -- Task runs inside the clone directory
|
|
3. **Commit & Push** -- On success, changes are auto-committed and pushed to the branch
|
|
4. **Preserve** -- Clone is preserved after execution (for instruct/retry operations)
|
|
5. **Cleanup** -- Branches are the persistent artifacts; use `takt list` to merge or delete
|
|
|
|
### Dual Working Directory
|
|
|
|
During worktree execution, TAKT maintains two directory references:
|
|
|
|
| Directory | Purpose |
|
|
|-----------|---------|
|
|
| `cwd` (clone path) | Where agents run, where reports are written |
|
|
| `projectCwd` (project root) | Where logs and session data are stored |
|
|
|
|
Reports are written to `cwd/.takt/runs/{slug}/reports/` (inside the clone) to prevent agents from discovering the main repository path. Session resume is skipped when `cwd !== projectCwd` to avoid cross-directory contamination.
|
|
|
|
## Session Logs
|
|
|
|
TAKT writes session logs in NDJSON (Newline-Delimited JSON, `.jsonl`) format. Each record is atomically appended, so partial logs are preserved even if the process crashes.
|
|
|
|
### Log Location
|
|
|
|
```text
|
|
.takt/runs/{slug}/
|
|
logs/{sessionId}.jsonl # NDJSON session log per piece execution
|
|
meta.json # Run metadata (task, piece, start/end, status, etc.)
|
|
context/
|
|
previous_responses/
|
|
latest.md # Latest previous response (inherited automatically)
|
|
```
|
|
|
|
### Record Types
|
|
|
|
| Record Type | Description |
|
|
|-------------|-------------|
|
|
| `piece_start` | Piece initialization with task and piece name |
|
|
| `step_start` | Movement execution start |
|
|
| `step_complete` | Movement result with status, content, matched rule info |
|
|
| `piece_complete` | Successful piece completion |
|
|
| `piece_abort` | Abort with reason |
|
|
|
|
### Real-Time Monitoring
|
|
|
|
You can monitor logs in real-time during execution:
|
|
|
|
```bash
|
|
tail -f .takt/runs/{slug}/logs/{sessionId}.jsonl
|
|
```
|