Roadmap
Where pi-code is headed. These are concrete features in design, not vague aspirations. Each one has a detailed design document in the repository.
Teams Live Dashboard Widget
Medium complexityPlannedThe teams extension spawns persistent teammate sessions with a shared task board and inter-agent messaging — but has no live widget. You see tool output scroll by without an at-a-glance view of which teammates are working, which tasks are claimed or blocked, or what messages are flowing between agents.
The fix: a persistent setWidget dashboard that auto-updates as
team state changes. Task board with status icons, teammate list
with colored names and working/idle indicators, and a live message
feed — all in one responsive panel using the same visual language
as the tasks and subagent
extensions.
Wide terminals show tasks and teammates side-by-side. Narrow
terminals stack vertically. The widget appears on team_create
and disappears on team_shutdown.
Parallel Plan Execution via Git Worktrees
High complexityDraftOne plan, N worktrees, N models. Give pi-code a task, pick three models, and it spins up isolated git worktrees — one per model — all running the same plan in parallel. When they finish, compare approaches side-by-side: diffs, test results, token costs, wall-clock time.
This is real model evaluation on your actual codebase. Not synthetic benchmarks — your code, your constraints, your judgment on what “better” means.
The system uses two extensions: worktree-arena for orchestration (worktree lifecycle, agent spawning, cleanup) and an optional terminal pane provider (WezTerm, tmux, Zellij) for visual multi-pane display. Without a display extension, agents run in the background with log files.
Unified Plugin System (Claude Code + pi compatible)
High complexityNearly completeOne plugin system that understands both ecosystems. pi-code
reads from .claude/ (Claude Code convention) and .pi/
(pi convention) at every level: project-local, user-global,
and system. Both directory trees are scanned, merged at
runtime, and project-local always wins.
Claude Code users bring their existing setup. pi users get
the additional structure pi expects: extensions, prompts,
skills, agents. No migration, no duplication. Drop a command
in .claude/commands/ or .pi/commands/ and it works.
Claude Code compatibility maps CC config locations
(~/.claude/.claude.json, .claude/commands/, CLAUDE.md)
into pi-code’s runtime. CC lifecycle hooks (PreToolUse,
PostToolUse, Stop) map to pi-code events. MCP servers
declared in CC config register through the mcp-adapter.
Slash commands merge into pi-code’s command system.
pi-native paths add what CC doesn’t have: extensions, typed prompts with subcommands, skills, and agents at the project level.
Scopes:
- Commands. .pi/commands/ project-local and ~/.pi/agent/commands/ global, via commands-folder extension. CC-format commands/ from plugin sources via plugins extension.
- Prompts. .pi/prompts/ and ~/.pi/agent/prompts/ natively discovered by pi. Registered as /name slash commands.
- CC Hooks. PreToolUse, PostToolUse, Stop mapped to pi events via plugins → hooks:merge event bus. Extension-level hooks.json scanning in both ~/.pi/agent/extensions//hooks.json and .pi/extensions//hooks.json.
- CC Context. CLAUDE.md and AGENTS.md loaded natively by pi from cwd, ancestor directories, and ~/.pi/agent/. Injected into system prompt automatically.
- Settings. .pi/settings.json deep-merges with ~/.pi/agent/settings.json via SettingsManager. Project overrides user defaults.
- Hooks. .pi/hooks.json and .pi/settings.json (hooks key) merge with global hooks. Supports standalone files, settings-embedded hooks, and extension-level hooks.json scanning.
- Skills. .pi/skills/ discovered natively by pi at project level, layered on top of ~/.pi/agent/skills/.
- Agents. .pi/agents/ discovered at project level by agent-commands and subagent extensions, layered on top of ~/.pi/agent/agents/.
- Extensions. .pi/extensions/ discovered natively by pi at project level, alongside ~/.pi/agent/extensions/.
Remaining: .claude/commands/ directory scanning (currently only .pi/commands/), .claude.json settings passthrough, MCP server registration from CC config.
Prompt Stash (Ctrl+S)
Low complexityPlannedYou’re composing a long prompt and need to do something else — run a quick command, ask a different question. Today you lose what you’ve typed or paste it somewhere manually.
Ctrl+S stashes the current input and clears the field. Ctrl+S
again pops it back. Simple stack semantics: multiple stashes supported,
last-in-first-out. When the input is non-empty and the stack has a
previous stash, it swaps — current input goes onto the stack, previous
one comes back. A brief notification shows the stash count.
In-memory only — cleared on session end. No files, no settings.
Plugin Git Sources and Caching
Medium complexityPlannedThe plugins extension can parse and classify
git sources (git:github.com/user/plugin@v1.0.0) but rejects them at
runtime — only local paths work today. The cache infrastructure
(content hashing, TTL logic, mtime comparison) is fully implemented in
utils.ts but not wired into the session lifecycle.
The fix: connect the existing plumbing. Git-pinned sources
(@version) clone once and cache immutably — never re-fetched.
Git-unpinned sources clone and cache with a 1-hour TTL, then
git fetch when stale. Local sources cache scan results and
invalidate on mtime change, with a content hash as secondary check.
/plugins refresh will force-invalidate all cache entries and re-scan
within the running session, replacing the current “restart pi” message.
Plugin Source Caching and Git Support
Medium complexityPlannedThe plugins extension re-scans all local
sources from disk on every session start, and git sources
(git:github.com/user/plugin@v1.0.0) don’t work at all. The
caching infrastructure already exists in the code — content
hashing, mtime comparison, TTL checks — but none of it is
wired up.
The plan: local sources skip re-scanning when mtime is
unchanged. Git pinned sources (@version) clone once and
cache immutably. Git unpinned sources re-clone on a 1-hour
TTL. A cache index at ~/.pi/agent/plugins-cache/index.json
tracks everything. /plugins refresh force-refreshes all
sources regardless of TTL.