一键导入
planz
Manage hierarchical project plans in SQLite. Tree-based structure with phases and tasks. Multiple output formats (text, JSON, XML, markdown).
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Manage hierarchical project plans in SQLite. Tree-based structure with phases and tasks. Multiple output formats (text, JSON, XML, markdown).
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | planz |
| description | Manage hierarchical project plans in SQLite. Tree-based structure with phases and tasks. Multiple output formats (text, JSON, XML, markdown). |
Binary: ~/.local/bin/planz | DB: `~/.local/share/planz/plans.db (SQLite WAL)
The core principle: Start with a high-level outline, then iteratively refine each node until every leaf task is so specific that executing it requires no further thought or decision-making.
planz refine to break down ambiguous nodes into smaller, clearer stepsThe / character is the path separator. Never use slashes in task titles:
# ❌ WRONG - creates nested path "API" -> "auth endpoint"
planz add myplan "API/auth endpoint"
# ✅ CORRECT - use other separators
planz add myplan "API - auth endpoint"
planz add myplan "API: auth endpoint"
planz add myplan "API auth endpoint"
A leaf node is ready for execution when:
A leaf node needs refinement when:
# Start broad
planz create auth-system
planz add auth-system "Phase 1: Design"
planz add auth-system "Phase 2: Implementation"
planz add auth-system "Phase 3: Testing"
# Phase 2 is ambiguous - refine it
planz refine auth-system "#2" \
--add "User registration" \
--add "Login flow" \
--add "Session management"
# "Login flow" [4] is still ambiguous - refine further
planz refine auth-system "#4" \
--add "POST /auth/login endpoint" \
--add "Password verification with bcrypt" \
--add "JWT token generation" \
--add "Set httpOnly cookie"
# "JWT token generation" [7] - is this specific enough?
# Ask: Can I implement this without decisions?
# Maybe not - what claims? what expiry?
planz refine auth-system "#7" \
--add "Create JWT with claims: sub, email, iat, exp" \
--add "Set expiry to 24 hours" \
--add "Sign with RS256 using env.JWT_PRIVATE_KEY"
# Now each leaf is atomic and unambiguous
planz show auth-system
Stop when the leaf node title itself is almost the code comment you'd write:
user_id index to sessions table" ✅validateInput()" ✅password_hash doesn't match" ✅# Before starting work, check the plan
planz show myplan --xml
# Pick a leaf node, implement it, mark done
planz done myplan "#12"
# Discovered complexity? Refine on the fly
planz refine myplan "#15" --add "Handle edge case X" --add "Handle edge case Y"
# Check progress
planz progress myplan
Plans are hierarchical trees with up to 4 levels of nesting. Each node has:
[1], [2], etc.)Nodes can be referenced by path OR ID:
# By path (human-readable)
planz done myplan "Phase 1/Database/Create schema"
# By ID (stable, survives renames)
planz done myplan "#5"
IDs are shown in output: - [ ] Create schema [5]
planz create <plan> # Create empty plan
planz rename-plan <old> <new> # Rename a plan
planz delete <plan> # Delete plan and all nodes
planz list # List all plans for project
planz projects # List all projects
planz delete-project # Delete project and all plans
planz summarize <plan> --summary "..." # Set plan summary
planz add <plan> <path> [--desc "..."] # Add node at path
planz remove <plan> <node> [--force] # Remove node (--force for children)
planz rename <plan> <node> <new-name> # Rename node
planz describe <plan> <node> --desc "..." # Set node description
planz move <plan> <node> --to <parent> # Move to new parent
planz move <plan> <node> --after <sibling> # Reorder among siblings
planz refine <plan> <node> --add <child>... # Expand leaf into subtree
planz done <plan> <node>... # Mark done (cascades DOWN to children)
planz undone <plan> <node>... # Mark undone (propagates UP to ancestors)
planz show <plan> [node] # Text output (default)
planz show <plan> --json # JSON output
planz show <plan> --xml # XML output (best for agents)
planz show <plan> --md # Markdown output
planz progress <plan> # Progress bars per top-level node
Slash-separated node titles:
"Phase 1" # Root node
"Phase 1/Database" # Child of Phase 1
"Phase 1/Database/Create schema" # Grandchild
# myplan
- [x] Phase 1: Setup [1]
- [x] Install deps [2]
- [x] Configure env [3]
- [ ] Phase 2: Implementation [4]
- [ ] Build API [5]
--xml) - Best for agents<?xml version="1.0" encoding="UTF-8"?>
<plan name="myplan">
<node id="1" title="Phase 1: Setup" done="true">
<node id="2" title="Install deps" done="true" />
<node id="3" title="Configure env" done="true" />
</node>
<node id="4" title="Phase 2: Implementation" done="false">
<description>Core implementation work</description>
<node id="5" title="Build API" done="false" />
</node>
</plan>
--json)[{"id":1,"title":"Phase 1: Setup","done":true,"children":[...]}]
| Option | Description |
|---|---|
--project <path> | Project path (default: cwd) |
--desc <text> | Description for add/describe |
--summary <text> | Summary for summarize |
--force | Force remove nodes with children |
--json | JSON output |
--xml | XML output |
--md | Markdown output |
--to <path> | Target parent for move |
--after <sibling> | Sibling to position after |
--add <child> | Child path for refine (repeatable) |
done: Marks node AND all descendants as done. If all siblings become done, parent auto-marks done.undone: Marks node as undone AND propagates up (all ancestors become undone).remove: Deletes node and all descendants (CASCADE). Use --force if node has children.When a command fails:
planz listplanz show <plan>