Structured task management using JJ (Jujutsu). Uses empty revisions as TODO markers with [task:*] flags, forming a DAG of plannable and executable tasks.
- JJ (Jujutsu) - install with
cargo install jj-cliorbrew install jj
# Claude Code plugin
claude plugin marketplace add Coobaha/jjtask
claude plugin install jjtask@jjtask-marketplace
jjtask enables a two-role workflow: Planners create task specifications, Workers implement them.
┌─────────────────────────────────────────────────────────────┐
│ PLANNING PHASE │
├─────────────────────────────────────────────────────────────┤
│ 1. Create task DAG with specifications │
│ jj task create @ "Add user auth" "## Requirements..." │
│ jj task parallel @ "Frontend" "Backend" "Tests" │
│ │
│ 2. Review structure │
│ jj task find │
│ │
│ Result: Empty revisions with [task:todo] flags │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ WORKING PHASE │
├─────────────────────────────────────────────────────────────┤
│ 3. Pick a task and start working │
│ jj edit <task-id> │
│ jj task flag @ wip │
│ │
│ 4. Implement according to specs in description │
│ # write code, make changes │
│ │
│ 5. Review specs, check acceptance criteria │
│ jj task next # shows current specs │
│ │
│ 6. Transition when ALL criteria met │
│ jj task next --mark-as done <next-task> │
└─────────────────────────────────────────────────────────────┘
- Never mark
doneunless ALL acceptance criteria pass - Use
blocked,review, oruntestedif criteria aren't fully met - Task descriptions are specifications - follow them exactly
jj task nextshows specs and available transitions
Status progression: draft → todo → wip → done
| Flag | Meaning |
|---|---|
draft |
Placeholder, needs full specification |
todo |
Ready to work, complete specs |
wip |
Work in progress |
blocked |
Waiting on external dependency |
standby |
Awaits decision |
untested |
Implementation done, needs testing |
review |
Needs review |
done |
Complete, all acceptance criteria met |
jjtask config adds colored task flags to jj log:
○ k [task:todo] Add user authentication +12L
│ Implement OAuth2 flow with Google provider...
○ m [task:wip] Fix database connection pooling
○ n [task:done] Update dependencies
Colors: todo yellow, wip cyan, done green, blocked red, draft dim, review blue, untested magenta.
The +12L hint shows description length (specs with >3 lines).
To show colored task flags in your custom log template, use the task_flag and task_title aliases from jjtask config:
# In your jj config [templates] section
log = '''
...
if(description.starts_with("[task:"),
label("task " ++ task_flag, "[task:" ++ task_flag ++ "]") ++ " " ++ task_title,
description.first_line(),
),
...
'''The label("task " ++ task_flag, ...) applies colors defined in jjtask's [colors] section.
All commands work as jj task <cmd> (requires alias in config) or jjtask <cmd> directly:
| Command | Action |
|---|---|
jj task find [flag] |
List tasks by status |
jj task create [parent] <title> [desc] |
Create task revision |
jj task flag <rev> <flag> |
Update task status |
jj task next [--mark-as flag] [rev] |
Review current task, transition to next |
jj task finalize [rev] |
Strip [task:*] for final commit |
jj task parallel <parent> <t1> <t2>... |
Create sibling tasks |
jj task hoist |
Rebase pending tasks to @- |
jj task show-desc [rev] |
Print revision description |
jj task checkpoint [name] |
Create named checkpoint |
Multi-repo support (requires .jj-workspaces.yaml):
| Command | Action |
|---|---|
jj task all <cmd> [args] |
Run jj command across repos |
# Clone
git clone https://github.com/coobaha/jjtask.git ~/jjtask
# Add to PATH (add to ~/.bashrc or ~/.config/fish/config.fish)
export PATH="$HOME/jjtask/bin:$PATH"
# Merge config into your jj config
cat ~/jjtask/config/conf.d/10-jjtask.toml >> ~/.config/jj/config.tomlThis gives you both jjtask CLI and jj task subcommand.
# Source the function (add to config.fish for persistence)
source ~/jjtask/shell/fish/functions/jjtask-env.fish
jjtask-env # activate (adds PATH, layers config)
jjtask-env off # deactivate./install.sh # Merge config into ~/.config/jj/config.toml
./install.sh --agent # Agent mode: set JJ_CONFIG env var
./install.sh --uninstall # RemoveCreate .jj-workspaces.yaml in project root:
repos:
- path: frontend
name: frontend
- path: backend
name: backendThen jj task find and jj task all operate across all repos.
Short title (< 50 chars)
## Context
Why this task exists, what problem it solves.
## Requirements
- Specific requirement 1
- Specific requirement 2
## Acceptance criteria
- Criterion 1 (testable)
- Criterion 2 (testable)
Requires mise for toolchain management.
mise install # Install Go 1.25 + golangci-lint
mise run build # Build binary to bin/jjtask-go
mise run test # Run integration tests
mise run lint # Run golangci-lint- CLAUDE.md - Architecture and development details
- claude-plugin/skills/jjtask/SKILL.md - Full workflow documentation
Inspired by:
- beads - AI-supervised issue tracker by Steve Yegge
- jj-todo-workflow - JJ-based TODO workflow skill by Yves Parès
MIT