Mycelium
A task manager built for coding agents. Mycelium gives an AI agent
(Claude Code, Cursor, Aider, or your own) a durable, git-trackable place to
plan and remember work across sessions. State lives in a SQLite file inside
your repo, so when an agent's context is cleared, a session ends, or a
teammate pulls the branch three days later, the plan is still there: the same
epics, tasks, dependencies, and open follow-ups. The agent reconstructs where
it left off from myc list, not from your memory.
It is a one-shot, scriptable CLI with JSON output and a zero-config data model, which is exactly what an agent needs to drive it reliably. Humans get the same tool (plus an optional desktop GUI, MycUI).
Why agents
- State that outlives the session: the plan is a file in the repo
(
.mycelium/mycelium.db), not the agent's context window. Clear the context, start a new session, or hand the branch to another machine, and the epics, tasks, dependencies, and follow-ups are still intact. - Git is the sync layer: commit
.mycelium/and the plan travels with the code. A teammate (or agent) who pulls the branch inherits the exact same task graph. No server, no account, no external service. - One-shot and scriptable: every command is a single non-interactive
invocation with
--format jsonand--quietfor clean parsing. An agent drives it without a REPL or a session to manage. - A drop-in agent contract:
myc initwrites anAGENTS.mddescribing the workflow, so the agent knows how to use the tool without you explaining it. Follow-ups let it jot "oh-by-the-way" findings mid-task without derailing. - Blocking that means something: dependency links with cycle detection, so an agent can't close a task whose blockers are still open.
How it works in practice
A walkthrough of a real agent session in a repo.
1. Setup: the agent gets its instructions. Running myc init (once, per
project) writes an AGENTS.md into the repo describing the whole workflow:
the commands, the data model, and the rules (e.g. "every task belongs to an
epic", "surface open follow-ups before wrapping up"). Agents like Claude Code
read AGENTS.md automatically, so the tool is self-documenting and you never
have to explain myc to the agent.
2. During work: the agent tracks as it goes. You ask the agent to build a feature. It decomposes the work into the plan, right in the repo:
Mid-task it notices something unrelated and jots it down without losing focus, using the lightweight follow-ups scratchpad:
3. Wrap-up: nothing gets silently dropped. When the agent finishes, an
optional Claude Code Stop
hook (shipped in hooks/) fires and checks for open follow-ups. If any
exist, it feeds them back to the agent, which surfaces them to you instead of
ending the turn as if everything were done:
Before we wrap, 1 open follow-up: "rotate the JWT secret, hardcoded in config.rs". Want me to handle it now, or leave it for later?
The hook self-gates: it stays silent outside mycelium projects and only fires when there's actually something open, so it never nags.
4. Next session: the state is still there. Days later, a fresh agent session (cleared context, or a teammate on another machine who pulled the branch) starts by reading the plan back, not by asking you what happened:
It resumes exactly where the last session left off. The plan lived in
.mycelium/mycelium.db and travelled with the code through git.
Features
- Agent-Optimized: One-shot CLI,
--format json,--quiet,AGENTS.mdcontract - State Persistence: Plan survives context resets; reconstructable from
myc list - Git-Trackable: SQLite storage designed for version control and branch sync
- Dependency Management: Task blocking with cycle detection
- Follow-ups: Lightweight scratch table for non-blocking items captured mid-work
- Smart List View: Tree visualization for dependencies, epic grouping for simple lists
- Assignees: Local assignees with GitHub username linking
- External References: Link tasks to GitHub issues/PRs and URLs
- Task Notes: Add comments and notes to tasks
- Task Cloning: Duplicate tasks with all metadata
- Batch Operations: Close, tag, or move multiple tasks at once
- Single Binary: Statically compiled, no dependencies
- Fast: Sub-100ms response time for typical operations
- Safe: Comprehensive error handling and validation
Installation
CLI (myc) via crates.io (recommended)
Installs the myc binary to ~/.cargo/bin/. Requires Rust 1.75+.
CLI (myc) from source
# Binary will be at target/release/myc
GUI (MycUI) pre-built download
Each tagged release ships desktop bundles on the
GitHub Releases page:
.dmg/.app (macOS), .deb/.AppImage (Linux), and .msi/.exe (Windows).
Download the one for your platform and install it. Every release also attaches
the myc CLI binaries, alongside the crates.io publish.
Note: macOS bundles are currently unsigned, so Gatekeeper may warn on first launch (right-click → Open to bypass).
GUI (MycUI) from source
MycUI is a Tauri desktop app built with React and TypeScript.
Prerequisites: Rust, Bun, and Tauri prerequisites for your platform.
The built app will be in mycui/src-tauri/target/release/bundle/ with platform-specific installers (.deb, .AppImage, .dmg, .msi).
For development:
One-Line Install (Linux & macOS)
&& &&
The install script detects your platform, builds, and installs both myc (CLI) and MycUI (GUI). On macOS, MycUI is installed as /Applications/MycUI.app. On Linux, both binaries go to /usr/local/bin/.
INSTALL_DIR=/.local/bin
Versioning
The CLI (myc) and the desktop app (MycUI) are versioned independently and
released on their own cadence. The CLI is published to crates.io as
mycelium-manager; MycUI ships as a desktop bundle attached to GitHub
Releases. There is no requirement to run matching version numbers.
They stay compatible because both are built on the same mycelium-core crate,
so they share one schema, one set of migrations, and one data layer. You can
run any released CLI alongside any released MycUI against the same project, use
either tool on its own, or mix them freely. Neither depends on the other at
runtime: the CLI is a standalone binary, and MycUI talks to the database
directly through core rather than shelling out to myc.
Quick Start
# Initialize a new mycelium project
# Create an epic
# Create tasks
# Set up dependencies (task 1 blocks task 2)
# View dependency tree
# Close tasks (blocked tasks prevent closing)
# Batch operations
# Task notes
# Clone a task
# View project summary
Commands
Project
Epics
Tasks
|||
|
|0>
Batch Operations
# Close multiple tasks at once
# Add a tag to multiple tasks
# Move multiple tasks to an epic (use 0 for no epic)
Task Notes
Task Cloning
Dependencies
Assignees
External References
Follow-ups
Lightweight scratch table for non-blocking items captured mid-work
(bugs you noticed, questions, ideas). They are separate from tasks and
carry no epic, priority, or dependencies. Body is required, title optional. Statuses:
open, in_progress, done, wontfix.
After myc task close, mycelium prints a one-line reminder if any
active follow-ups exist. Agents using mycelium MUST run myc followup list at the end of every work unit and surface open items to the user
before wrapping (see AGENTS.md).
Reporting & Export
Global Options
|
Data Model
Epic
├── id, title, description
├── status (open/closed)
└── Tasks[]
Task
├── id, title, description (optional)
├── status (open/closed), priority (low/medium/high/critical)
├── epic_id (optional), assignee_id (optional)
├── due_date (optional)
├── dependencies (blocks/blocked_by)
└── external_refs (GitHub issues/PRs, URLs)
Git Integration
Mycelium stores data in .mycelium/mycelium.db using SQLite with WAL mode. This makes it git-trackable:
# Add to your repo
# The .mycelium/.gitignore excludes WAL files
For AI Agents
Mycelium is optimized for agentic workflows.
The resume pattern. At the start of a task, the agent reads its own prior plan instead of relying on the context window:
At the end, it records state that will still be there next session:
Across a context reset or a fresh session on the same branch, the plan is unchanged and the agent picks up exactly where it left off.
Everyday commands:
# Use --quiet to get just IDs
# Include a description when useful
# Use --format json for parsing
# Check blocked tasks
# Export for analysis
Claude Code follow-up hook (optional)
hooks/ ships a Claude Code
Stop hook that enforces the end-of-task follow-up check, so it no longer
relies on the agent remembering the AGENTS.md rule.
The hook self-gates: it stays silent outside mycelium projects (detected
via the myc:agents-start marker in AGENTS.md) and only fires when
active follow-ups exist, feeding them back to the agent to surface to
you. Requires jq.
Configuration
No configuration needed! All data is stored in the project-local .mycelium/ directory.
Safety Features
- Atomic operations: Database transactions ensure data integrity
- Dependency validation: Circular dependencies are prevented
- Blocker checks: Tasks with open blockers cannot be closed (without
--force) - Confirmation prompts: Destructive operations require
--forceor user confirmation - Clear errors: All errors include actionable guidance
Performance
- Sub-100ms response time for typical operations
- SQLite with proper indexing
- WAL mode for concurrent read/write
- Single binary, no runtime dependencies
Development
# Clone
# Build & test the CLI
# Run MycUI in dev mode
Architecture
- Rust - Type-safe, performant, single binary
- mycelium-core - Shared crate (db, models, migrations, errors) consumed by both the CLI and MycUI, so they use one schema and data layer
- SQLite - Embedded, git-trackable, ACID-compliant
- Clap - Command-line parsing with derive macros
- Rusqlite - SQLite bindings with bundled lib
- Tauri - Desktop GUI framework (MycUI)
- React + TypeScript - MycUI frontend
- Hand-written CSS - MycUI styling (no CSS framework)
License
MIT License - see LICENSE file.
Contributing
Contributions welcome! Feel free to open issues and pull requests.
Acknowledgments
Inspired by beads and the need for a robust, git-trackable task manager that works seamlessly with AI agents.