Roadmap¶
The roadmap drifts. Each milestone's headline shifts based on what the previous milestone's test-drive surfaced as friction. The constants are the working agreements: test-drive between milestones, defer with rationale, and design docs before implementation.
Shipped¶
v0.1.0 (2026-05-09): Vertical slice¶
OpenAI client + agent loop + 4 built-in tools (read, write, edit, bash), basic terminal frontend, JSONL sessions, skill loader, and pluggy plugin system, targeting OpenAI, Ollama, OpenRouter, Fireworks, or anything OpenAI-compatible.
v0.2.0 (2026-05-12): Substance¶
Drifted from "Polish" to ship five strategic capability gaps:
- Two-tier message model with
convert_to_llmseam. ExecutionEnvabstraction for filesystem + shell.parent_idsession data model (tree-shaped, linear UX).- Compaction primitives (
CompactionPolicy,should_compact,compact,/compact [bias]). - Steering + follow-up queues.
Plus TOML config, /steer, /follow-up, /queue, /compact, /verbose, /footer.
v0.3.0 (2026-05-13): Extension model + ergonomics¶
Drifted from "Advanced TUI plugin" to ship two parallel trees:
- Extension model design doc: five extension types, ten-hook inventory, stable-import contract, semver rule.
letscode-memoryreference plugin: validates the design doc end-to-end.- Plugin authoring guide refresh: covers the new sections (
system_prompt,render_custom_message, stable surface, versioning, optional deps, trust model). - Skill-to-tool synthesis (every skill is also a
skill_<name>tool). letscode_render_custom_messageper-CustomMessage-kind hook.FrontendProtocol tightening./pluginsinventory command.
- Ergonomics punch list with 22 items found by static audit + Fireworks smoke runs.
- First sprint: 8 papercut fixes (skill-shadow silence, empty-turn suppression, bash trailing blank, persistent history, tab completion, welcome banner,
/helpformatting, footer label). - Second cluster: 6 medium fixes (Read panel syntax highlighting, prompt-input ergonomics, Fireworks model pricing).
- Ctrl+C actually aborts (three-commit fix).
- stdin echo silenced during agent calls.
- Markdown rendering of assistant text.
- Read panel suppression in default mode.
v0.4.0 (2026-05-19): Plugin & integration¶
Drifted from "Advanced TUI" to prove the plugin contract a second time and open integration:
- External Textual frontend plugin (
letscode-textual): the contract holds for an out-of-tree frontend. - RPC mode (
letscode --mode rpc): NDJSON over stdio for host/IDE integration. - Tree sessions (
/tree,/fork,/clone);/reload; memory recall +/forget; config sections. - Streaming-time input, redesigned across three real-terminal test-drives to interrupt-and-redirect (the advisory-queue design shipped, was driven, and was scrapped as unusable).
v0.5.0 (2026-05-19): Distribution & usability¶
Make it installable and survivable on first contact, rather than new capability:
--version,--init(config scaffold), an actionable no-key message, cache-hit footer.- CLI migrated typer/click → cyclopts (fixes trailing-option-after-prompt for free).
- Release-readiness gates:
make verify-dist/verify-plugindrive the built wheel from a clean env. - Not published to PyPI; the name is reserved and publishing is a held maintainer decision.
v0.6.0 (2026-06-22): MCP integration¶
MCP: a letscode-mcp plugin exposing MCP servers as tool sources (capability, plugin-shaped, the strongest external pull). Deferred from v0.5 because v0.5 was distribution, rather than capability.
letscode-mcpplugin (plugins/letscode-mcp/). Discover MCP servers from[mcp.servers.<name>]tables in~/.letscode/config.toml; their tools surface as native letscode tools under themcp_<server>_namespace (or a user-configuredprefix). stdio transport, one persistentClientSessionper server, failures degrade toToolResult(is_error=True); never a traceback into the agent loop. Built on the officialmcpPython SDK.- In-tree MCP test server (
tests/fixtures/mcp_test_server.py): a minimal MCP JSON-RPC 2.0 stdio server used by the CI integration test (nonpx/uvxdependency). - MCP end-to-end integration test (
tests/b_integration/test_mcp_e2e.py) drives the full tool-call → MCP roundtrip → tool-result path against the real in-tree server viaFakeLLMClient.
v0.7.0 (2026-07-28): Provider-aware selection, plugin distribution, editor ergonomics¶
Three themes, no new agent-loop architecture. Informed by notes/22-vs-tau.md:
- Model selection across providers. Name a model and letscode routes to the right endpoint and key (
--model deepseek-chatusesDEEPSEEK_API_KEY); an interactive/modelpicker with filter and scrolling; picks persist across-c; the full OpenRouter catalog whenOPENROUTER_API_KEYis set. Built-ins for OpenAI, Fireworks, DeepSeek, Z.AI, OpenRouter, Gemini, plus a user overlay at~/.letscode/catalog.toml. - Plugin distribution.
letscode install/uninstallby PyPI name, path, or git URL, into a shared per-user location everyletscodeon the machine sees (--project/--isolatedto scope it). - Editor ergonomics.
@path/!cmd/!!cmdinput preprocessor; prompt templates at~/.letscode/prompts/; session lifecycle (/new,/resume,/name, auto-naming) and a resume recap on-c; session output (/copy,/export,/share);--thinking; provider retries; a daily update check; SOCKS proxy support.
Next¶
The forward release plan, with candidate items, sizes, dependencies, and deferrals with unblock conditions, lives in notes/24-release-plan.md.
0.7.x: Hardening¶
Patch line, from real use. Version-skew guardrails for the shared plugin venv (refuse an incompatible plugin at install; skip a broken one at load rather than crash), a letscode plugins list two-tier inventory, catalog / reference-endpoint upkeep, and bug-fix rollups.
v0.8: Plugin-ecosystem ceiling¶
Two paired M items that open the plugin classes v0.6 (MCP) and v0.7 (install) implied but can't yet express:
ctx.uiplugin-side interaction primitives (notify,select,confirm,input), routed through the active frontend. Unblocks MCP elicitation, permission popups, and plan-mode plugins./login+ OAuth flows (Anthropic Claude Pro/Max, OpenAI Codex, GitHub Copilot): the biggest single pi/tau-parity gap that remains. Needs the first credential store letscode owns.
v0.9: Set by what v0.8 surfaces¶
Ranked candidates, headline chosen after v0.8's test-drive: MCP scope expansion (elicitation once ctx.ui exists, plus resources / prompts / HTTP-SSE), a meta-plugin manager (Pluxeo-shaped, consuming v0.7's plugin-location seam), or the letscode-llm / letscode-agent / letscode package split once a library consumer appears.
Toward 1.0: Stabilize + publish¶
1.0 is a commitment, not a feature list: the plugin contract and public API frozen under semver, and the held decision to publish to PyPI finally made.
Still deferred with unblock conditions (unchanged): a first-party web UI (RPC mode is the seam), letscode-trace / model tiering, Textual parity, native Anthropic / Bedrock / Vertex providers, image input. Beyond the core, everything is a plugin.
What we won't ship¶
The deliberate non-goals, carried forward from v0.2 and v0.3:
- Native Anthropic / Bedrock / Vertex provider modules (use OpenAI-compat shims)
- MCP support in core (a plugin already added it:
letscode-mcp) - Sub-agents in core (a plugin can add it)
- Permission popups (run in a container)
- Plan mode (write plans to files)
- Built-in to-dos (use
TODO.md) - Background bash (use tmux)
See Related projects for how this compares to similar projects in the space.