takt/README.md

478 lines
14 KiB
Markdown

# TAKT
🇯🇵 [日本語ドキュメント](./docs/README.ja.md)
**T**ask **A**gent **K**oordination **T**ool - Multi-agent orchestration system for Claude Code and OpenAI Codex.
> **Note**: This project is developed at my own pace. See [Disclaimer](#disclaimer) for details.
TAKT is built with TAKT (dogfooding).
## Requirements
- [Claude Code](https://docs.anthropic.com/en/docs/claude-code) or Codex must be installed and configured
TAKT supports both Claude Code and Codex as providers; you can choose the provider during setup.
## Installation
```bash
npm install -g takt
```
## Quick Start
```bash
# Run a task (will prompt for workflow selection)
takt "Add a login feature"
# Add a task to the queue
takt /add-task "Fix the login bug"
# Run all pending tasks
takt /run-tasks
# Watch for tasks and auto-execute
takt /watch
# Switch workflow
takt /switch
```
## Commands
| Command | Description |
|---------|-------------|
| `takt "task"` | Execute task with current workflow (continues session) |
| `takt -r "task"` | Execute task, resuming previous session |
| `takt /run-tasks` | Run all pending tasks from `.takt/tasks/` |
| `takt /watch` | Watch `.takt/tasks/` and auto-execute tasks (stays resident) |
| `takt /add-task` | Add a new task interactively (YAML format) |
| `takt /switch` | Switch workflow interactively |
| `takt /clear` | Clear agent conversation sessions |
| `takt /refresh-builtin` | Update builtin agents/workflows to latest version |
| `takt /config` | Display current configuration |
| `takt /help` | Show help |
## Workflows
TAKT uses YAML-based workflow definitions. Place them in:
- `~/.takt/workflows/*.yaml`
### Example Workflow
```yaml
name: default
max_iterations: 10
steps:
- name: plan
agent: planner
provider: claude # Optional: claude or codex
model: opus # Claude: opus/sonnet/haiku, Codex: gpt-5.2-codex/gpt-5.1-codex
instruction_template: |
{task}
transitions:
- condition: done
next_step: implement
- name: implement
agent: coder
provider: codex
model: gpt-5.2-codex # Codex model example
instruction_template: |
{task}
transitions:
- condition: done
next_step: review
- condition: blocked
next_step: ABORT
- name: review
agent: architect
model: sonnet # Model alias (no provider = uses global default)
transitions:
- condition: approved
next_step: COMPLETE
- condition: rejected
next_step: implement
```
## Built-in Workflows
TAKT ships with several built-in workflows:
| Workflow | Description |
|----------|-------------|
| `default` | Full development workflow: plan → implement → architect review → AI review → security review → supervisor approval. Includes fix loops for each review stage. |
| `simple` | Simplified version of default: plan → implement → architect review → AI review → supervisor. No intermediate fix steps. |
| `research` | Research workflow: planner → digger → supervisor. Autonomously researches topics without asking questions. |
| `expert-review` | Comprehensive review with domain experts: CQRS+ES, Frontend, AI, Security, QA reviews with fix loops. |
| `magi` | Deliberation system inspired by Evangelion. Three AI personas (MELCHIOR, BALTHASAR, CASPER) analyze and vote. |
Switch between workflows with `takt /switch`.
## Built-in Agents
- **coder** - Implements features and fixes bugs
- **architect** - Reviews code and provides feedback
- **supervisor** - Final verification and approval
- **planner** - Task analysis and implementation planning
- **ai-reviewer** - AI-generated code quality review
- **security** - Security vulnerability assessment
## Custom Agents
Define custom agents in `.takt/agents.yaml`:
```yaml
agents:
- name: my-reviewer
prompt_file: .takt/prompts/reviewer.md
allowed_tools: [Read, Glob, Grep]
provider: claude # Optional: claude or codex
model: opus # Claude: opus/sonnet/haiku or full name (claude-opus-4-5-20251101)
status_patterns:
approved: "\\[APPROVE\\]"
rejected: "\\[REJECT\\]"
- name: my-codex-agent
prompt_file: .takt/prompts/analyzer.md
provider: codex
model: gpt-5.2-codex # Codex: gpt-5.2-codex, gpt-5.1-codex, etc.
```
## Model Selection
### Claude Models
You can specify models using either **aliases** or **full model names**:
**Aliases** (recommended for simplicity):
- `opus` - Claude Opus 4.5 (highest reasoning capability)
- `sonnet` - Claude Sonnet 4.5 (balanced, best for most tasks)
- `haiku` - Claude Haiku 4.5 (fast and efficient)
- `opusplan` - Opus for planning, Sonnet for execution
- `default` - Recommended model for your account type
**Full model names** (recommended for production):
- `claude-opus-4-5-20251101`
- `claude-sonnet-4-5-20250929`
- `claude-haiku-4-5-20250101`
### Codex Models
Available Codex models:
- `gpt-5.2-codex` - Latest agentic coding model (default)
- `gpt-5.1-codex` - Previous generation
- `gpt-5.1-codex-max` - Optimized for long-running tasks
- `gpt-5.1-codex-mini` - Smaller, cost-effective version
- `codex-1` - Specialized model aligned with coding preferences
## Project Structure
```
~/.takt/
├── config.yaml # Global config (provider, model, workflows, etc.)
├── workflows/ # Workflow definitions
└── agents/ # Agent prompt files
.takt/ # Project-level config
├── agents.yaml # Custom agent definitions
├── tasks/ # Pending task files (.yaml, .md)
├── completed/ # Completed tasks with reports
├── worktrees/ # Git worktrees for isolated task execution
├── reports/ # Execution reports (auto-generated)
└── logs/ # Session logs
```
### Global Configuration
Configure default provider and model in `~/.takt/config.yaml`:
```yaml
# ~/.takt/config.yaml
language: en
default_workflow: default
log_level: info
provider: claude # Default provider: claude or codex
model: sonnet # Default model (optional)
trusted_directories:
- /path/to/trusted/dir
```
**Model Resolution Priority:**
1. Workflow step `model` (highest priority)
2. Custom agent `model`
3. Global config `model`
4. Provider default (Claude: sonnet, Codex: gpt-5.2-codex)
## Practical Usage Guide
### Resuming Sessions with `-r`
When TAKT prompts for additional input during execution (e.g., "Please provide more details"), use the `-r` flag to continue the conversation:
```bash
# First run - agent might ask for clarification
takt "Fix the login bug"
# Resume the same session to provide the requested information
takt -r "The bug occurs when the password contains special characters"
```
The `-r` flag preserves the agent's conversation history, allowing for natural back-and-forth interaction.
### Adding Custom Workflows
Create your own workflow by adding YAML files to `~/.takt/workflows/`:
```yaml
# ~/.takt/workflows/my-workflow.yaml
name: my-workflow
description: My custom workflow
max_iterations: 5
steps:
- name: analyze
agent: ~/.takt/agents/my-agents/analyzer.md
instruction_template: |
Analyze this request: {task}
transitions:
- condition: done
next_step: implement
- name: implement
agent: ~/.takt/agents/default/coder.md
instruction_template: |
Implement based on the analysis: {previous_response}
pass_previous_response: true
transitions:
- condition: done
next_step: COMPLETE
```
### Specifying Agents by Path
Agents are specified using file paths in workflow definitions:
```yaml
# Use built-in agents
agent: ~/.takt/agents/default/coder.md
agent: ~/.takt/agents/magi/melchior.md
# Use project-local agents
agent: ./.takt/agents/my-reviewer.md
# Use absolute paths
agent: /path/to/custom/agent.md
```
Create custom agent prompts as Markdown files:
```markdown
# ~/.takt/agents/my-agents/reviewer.md
You are a code reviewer focused on security.
## Your Role
- Check for security vulnerabilities
- Verify input validation
- Review authentication logic
## Output Format
- [REVIEWER:APPROVE] if code is secure
- [REVIEWER:REJECT] if issues found (list them)
```
### Task Management
TAKT supports batch task processing through task files in `.takt/tasks/`. Both `.yaml`/`.yml` and `.md` file formats are supported.
#### Adding Tasks with `/add-task`
```bash
# Quick add (no worktree)
takt /add-task "Add authentication feature"
# Interactive mode (prompts for worktree, branch, workflow options)
takt /add-task
```
#### Task File Formats
**YAML format** (recommended, supports worktree/branch/workflow options):
```yaml
# .takt/tasks/add-auth.yaml
task: "Add authentication feature"
worktree: true # Run in isolated git worktree
branch: "feat/add-auth" # Branch name (auto-generated if omitted)
workflow: "default" # Workflow override (uses current if omitted)
```
**Markdown format** (simple, backward compatible):
```markdown
# .takt/tasks/add-login-feature.md
Add a login feature to the application.
Requirements:
- Username and password fields
- Form validation
- Error handling for failed attempts
```
#### Git Worktree Isolation
YAML task files can specify `worktree` to run each task in an isolated git worktree, keeping the main working directory clean:
- `worktree: true` - Auto-create at `.takt/worktrees/{timestamp}-{task-slug}/`
- `worktree: "/path/to/dir"` - Create at specified path
- `branch: "feat/xxx"` - Use specified branch (auto-generated as `takt/{timestamp}-{slug}` if omitted)
- Omit `worktree` - Run in current working directory (default)
#### Running Tasks with `/run-tasks`
```bash
takt /run-tasks
```
- Tasks are executed in alphabetical order (use prefixes like `001-`, `002-` for ordering)
- Completed tasks are moved to `.takt/completed/` with execution reports
- New tasks added during execution will be picked up dynamically
#### Watching Tasks with `/watch`
```bash
takt /watch
```
Watch mode polls `.takt/tasks/` for new task files and auto-executes them as they appear. The process stays resident until `Ctrl+C`. This is useful for:
- CI/CD pipelines that generate task files
- Automated workflows where tasks are added by external processes
- Long-running development sessions where tasks are queued over time
### Workflow Variables
Available variables in `instruction_template`:
| Variable | Description |
|----------|-------------|
| `{task}` | Original user request |
| `{iteration}` | Workflow-wide turn count (total steps executed) |
| `{max_iterations}` | Maximum iterations allowed |
| `{step_iteration}` | Per-step iteration count (how many times THIS step has run) |
| `{previous_response}` | Previous step's output (requires `pass_previous_response: true`) |
| `{user_inputs}` | Additional user inputs during workflow |
| `{git_diff}` | Current git diff (uncommitted changes) |
| `{report_dir}` | Report directory name (e.g., `20250126-143052-task-summary`) |
### Designing Workflows
Each workflow step requires three key elements:
**1. Agent** - A Markdown file containing the system prompt:
```yaml
agent: ~/.takt/agents/default/coder.md # Path to agent prompt file
agent_name: coder # Display name (optional)
```
**2. Status Rules** - Define how the agent signals completion. Agents output status markers like `[CODER:DONE]` or `[ARCHITECT:REJECT]` that TAKT detects to drive transitions:
```yaml
status_rules_prompt: |
Your final output MUST include a status tag:
- `[CODER:DONE]` if implementation is complete
- `[CODER:BLOCKED]` if you cannot proceed
```
**3. Transitions** - Route to the next step based on status:
```yaml
transitions:
- condition: done # Maps to status tag DONE
next_step: review # Go to review step
- condition: blocked # Maps to status tag BLOCKED
next_step: ABORT # End workflow with failure
```
Available transition conditions: `done`, `blocked`, `approved`, `rejected`, `improve`, `always`.
Special next_step values: `COMPLETE` (success), `ABORT` (failure).
**Step options:**
| Option | Default | Description |
|--------|---------|-------------|
| `pass_previous_response` | `true` | Pass previous step's output to `{previous_response}` |
| `on_no_status` | - | Behavior when no status is detected: `complete`, `continue`, `stay` |
| `allowed_tools` | - | List of tools the agent can use (Read, Glob, Grep, Edit, Write, Bash, etc.) |
| `provider` | - | Override provider for this step (`claude` or `codex`) |
| `model` | - | Override model for this step |
## API Usage
```typescript
import { WorkflowEngine, loadWorkflow } from 'takt'; // npm install takt
const config = loadWorkflow('default');
if (!config) {
throw new Error('Workflow not found');
}
const engine = new WorkflowEngine(config, process.cwd(), 'My task');
engine.on('step:complete', (step, response) => {
console.log(`${step.name}: ${response.status}`);
});
await engine.run();
```
## Disclaimer
This project is a personal project developed at my own pace.
- **Response times**: I may not be able to respond to issues immediately
- **Development style**: This project is primarily developed using "vibe coding" (AI-assisted development) - **use at your own risk**
- **Pull requests**:
- Small, focused PRs (bug fixes, typos, docs) are welcome
- Large PRs, especially AI-generated bulk changes, are difficult to review
See [CONTRIBUTING.md](./CONTRIBUTING.md) for more details.
## Docker Support
Docker environment is provided for testing in other environments:
```bash
# Build Docker images
docker compose build
# Run tests in container
docker compose run --rm test
# Run lint in container
docker compose run --rm lint
# Build only (skip tests)
docker compose run --rm build
```
This ensures the project works correctly in a clean Node.js 20 environment.
## Documentation
- [Workflow Guide](./docs/workflows.md) - Create and customize workflows
- [Agent Guide](./docs/agents.md) - Configure custom agents
- [Changelog](./CHANGELOG.md) - Version history
- [Security Policy](./SECURITY.md) - Vulnerability reporting
- [Blog: TAKT - AI Agent Orchestration](https://zenn.dev/nrs/articles/c6842288a526d7) - Design philosophy and practical usage guide (Japanese)
## License
MIT - See [LICENSE](./LICENSE) for details.