Markdown Converter
Agent skill for markdown-converter
Manage hierarchical project plans in SQLite. Tree-based structure with phases and tasks. Multiple output formats (text, JSON, XML, markdown).
Sign in to like and favorite skills
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 (default: cwd) |
| Description for add/describe |
| Summary for summarize |
| Force remove nodes with children |
| JSON output |
| XML output |
| Markdown output |
| Target parent for move |
| Sibling to position after |
| 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>