Skip to content

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_llm seam.
  • ExecutionEnv abstraction for filesystem + shell.
  • parent_id session 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-memory reference 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_message per-CustomMessage-kind hook.
  • Frontend Protocol tightening.
  • /plugins inventory 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, /help formatting, 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-plugin drive 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-mcp plugin (plugins/letscode-mcp/). Discover MCP servers from [mcp.servers.<name>] tables in ~/.letscode/config.toml; their tools surface as native letscode tools under the mcp_<server>_ namespace (or a user-configured prefix). stdio transport, one persistent ClientSession per server, failures degrade to ToolResult(is_error=True); never a traceback into the agent loop. Built on the official mcp Python 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 (no npx/uvx dependency).
  • 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 via FakeLLMClient.

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-chat uses DEEPSEEK_API_KEY); an interactive /model picker with filter and scrolling; picks persist across -c; the full OpenRouter catalog when OPENROUTER_API_KEY is set. Built-ins for OpenAI, Fireworks, DeepSeek, Z.AI, OpenRouter, Gemini, plus a user overlay at ~/.letscode/catalog.toml.
  • Plugin distribution. letscode install / uninstall by PyPI name, path, or git URL, into a shared per-user location every letscode on the machine sees (--project / --isolated to scope it).
  • Editor ergonomics. @path / !cmd / !!cmd input 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.ui plugin-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.