Changelog
July 29, 2026 · View on GitHub
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
Changed
-
Permissions are now loose by default and easy to change.
/modeis renamed/permissions(the old name still works as an alias) and bare/permissionsopens a three-option picker — Ask for approval, Approve for me, Full Access — instead of requiring a raw mode name. A bare interactiveclawcodexnow starts in Full Access, equivalent to--dangerously-skip-permissions. The chosen level persists topermissions.defaultModein~/.clawcodex/settings.json, so dialing permissions down survives a relaunch.Scope and safety of the new default:
- Only a real terminal gets it.
--print/headless is unchanged (default) — CI and the eval harness drive it — and so is any non-TTY launch, even without-p. A persisteddefaultModeapplies to every surface, with one exception in the safe direction: a saved Full Access is interactive-only (see below). - Explicit intent always wins:
--permission-mode,--dangerously-skip-permissions, and a persisteddefaultModeall outrank the implicit default, and--allow-dangerously-skip-permissions(which means "available without starting in it") suppresses it. - Suppressed entirely under a
disableBypassPermissionsModelockdown, and under root outside a sandbox — where it degrades todefaultrather than refusing to start, and also clamps a persistedbypassPermissionsand settings-granted bypass availability. - Plan mode still restrains. Choosing Full Access sets the mode only and
never grants engine bypass availability, which is what relaxes
plan, so/plankeeps asking in a full-access session. - Repository settings files (
.clawcodex/settings.jsonandsettings.local.json— both are committable, whatever the.localname suggests) may only supplydefaultordontAsk, and only when that would not loosen what applies anyway. A cloned repo cannot widen your permissions.planis excluded on purpose: with bypass availability it is a full bypass, not a restriction. - A saved Full Access applies only to interactive sessions. Persistence
exists so dialing down survives a relaunch; it never dials
-pup. permissions.allowBypassPermissionsModeis now read from the user config only. It was also read from<git-root>/.clawcodex/config.local.json, which — despite the.localname — is a committable repo file, so a checked-out repository could grant itself bypass availability and thereby turn/planinto a write-anywhere bypass. Operators who kept that key in a repo-local config must move it to~/.clawcodex/config.json.- Running as root outside a sandbox now also drops bypass availability, and
ignores a saved Full Access. An explicit
--permission-modeis still honored there; only the implicit and saved paths are clamped. setModearriving inside a permission-ask reply (chosen_updates) is now gated by the same capability as/permissions, and refused entirely for persisted destinations — previously it was an ungated second door tobypassPermissionsfor any non-TUI agent-server client.
- Only a real terminal gets it.
[1.3.0] - 2026-07-29
Added
- Added the
claude-opus-5model, and wired--effortend to end (the interactive/effortpath on Anthropic was also fixed) (#722, #746). - Added bounded persistent memory with a background self-improvement review fork (#731).
- Added a VS Code extension (
vscode-extension/clawcodex-vscode) driving the agent-server over stdio, with interrupt/suggestion/chosen-updates contracts (#727). - Added image-paste input: paste an image at the prompt and it attaches as a
content block, shown as an
[Image #N]chip that un-attaches on demand (#761, #762). - Added a Harbor eval harness (
eval/harbor/) with clawcodex, openclaude, and latest-Claude-Code subscription adapters for terminal-bench 2.0/2.1 three-way comparisons, ATIF trajectory emission, and per-step token/cost accounting (#720, #724, #725, #736–#738).
Changed
- Renamed the project context file
CLAUDE.md→CLAWCODEX.md(clean break, no fallback) (#732). - Tuned the agent prompt and headless harness for reliability and parity with the reference: restored dropped task-tool skip conditions, parallel-tool guidance, and dropped instruction qualifiers; deferred nonessential initial tools; and recovered trials lost to empty turns and transport drops (#743–#745, #747–#754).
- Reworked the TUI header box to the reference's element allocation (#764).
- Honor runtime 1M-context model limits end to end (#730).
- Activated
--allowedTools/--disallowedTools, which were a silent no-op (#739).
Fixed
- Ping-aware stream watchdog to stop spurious
NonZeroAgentExitCodeErroron large-context agentic runs (#734). - Recover trials lost to empty turns, transport drops, and a headless-only tool; preserve thinking and reduce headless overhead (#735, #742).
- Enable interactive TaskV2 and harden Bash execution (#741).
- Retry transient transport failures instead of aborting the run, and stop
Readfrom leaking image base64 into context (#757, #760). - Cap
mcpbelow 2.0 (2.0.0 removedmcp.client.websocket) (#763). - Correct the DeepSeek V4
max_output_tokensto the documented 384K (#758). - Nudge off a stalled background task instead of polling forever (#759).
1.2.1 - 2026-07-16
Changed
- The PyPI distribution is named
clawcodex-clibecause PyPI reservesclawcodexas confusingly similar to the unrelatedclaw-codexproject. The installed executable remainsclawcodex.
1.2.0 - 2026-07-16
Added
- Added the
/ecotoken-compression mode for reducing verbose Bash tool output while preserving actionable information. - Added Anthropic Claude Opus 4.8 and Claude Fable 5 model configurations.
Changed
- Session history and transcripts (
sessions/,transcripts/) now honor$CLAWCODEX_CONFIG_DIR, consistent with config, memory, skills, and auth. Default users are unaffected (still under~/.clawcodex/). If you set the override after accumulating sessions,/resumeand session search look under the new root — move the old~/.clawcodex/sessionsand~/.clawcodex/transcriptsif you want them to carry over. The# Environmentsystem-prompt hint now points at the resolved root so the model finds session history in either configuration. - Updated OpenAI and prompt-toolkit dependency minimums to the versions used by the current implementation.
Fixed
- Corrected MiniMax pricing tiers and model modalities.
- Prevented Anthropic OAuth identity migration from rewriting paths under
.clawcodex. - Restored Claude Code-compatible formatting for thrown tool errors.
1.1.0 - 2026-07-12
Added
- Sign in with ChatGPT — use OpenAI models on a ChatGPT Plus/Pro
subscription instead of metered API billing (#698).
clawcodex login → openai → subscriptionruns an OAuth login (browser loopback, device-code, or import from an existing Codex CLI login) and routes requests through the ChatGPT Codex backend's Responses API. Subscription models:gpt-5.5,gpt-5.4,gpt-5.4-mini,gpt-5.3-codex-spark, with encrypted-reasoning replay across turns; a configuredOPENAI_API_KEYalways wins, and subscription usage reportsbilling_mode: subscription(billed as$0). - Claude Pro/Max subscription login (#697).
clawcodex login → anthropic → subscriptionconnects a Claude subscription over OAuth (PKCE), with automatic token refresh,mcp_-prefixed tool adaptation, and the same$0accounting. - Meta provider +
muse-spark-1.1(#692) — theapi.meta.aiOpenAI-compatible reasoning model with a 1M-token context window, added as a one-rowProviderSpec. /planmode with implicit plan-mode entry/exit (EnterPlanMode/ExitPlanMode), ported from the reference (#676).--worktree/-wsession isolation — run parallel sessions in isolated git worktrees, wired through the launcher, backend, and TUI (#672)./loopscheduled tasks now actually fire — full port of Claude Code's session-scoped scheduler (docs/en/scheduled-tasks). A newsrc/scheduled_tasksengine parses standard 5-field vixie cron expressions (wildcards, steps, ranges, lists, dow 0/7=Sunday, dom/dow OR semantics, local timezone) and fires due prompts between turns from the agent-server worker's idle poll.CronCreate/CronList/CronDeleteregister real firing jobs (8-char IDs, 50-job cap, deterministic per-job jitter, 7-day recurring expiry with a final fire, one-shots self-delete); the newScheduleWakeuptool drives self-paced/loopmode (delay clamped 60–3600 s,stop: trueends the loop, one ~20-minute fallback wakeup when an iteration forgets to reschedule). Esc while idle clears a pending loop wakeup;/cleardrops all session tasks;/resumerestores unexpired ones;CLAWCODEX_DISABLE_CRON=1disables the scheduler.- Typed skill slash commands reach the backend: the TUI's slash
dispatch falls back from workflow commands to a new
skill_commandcontrol that expands bundled/disk skills through the same path the model-side Skill tool uses — so/loop 5m check ci(and any user-invocable skill) now works typed from the composer, with/looplisted in the completion menu. - TUI scheduled-task indicator: a persistent
⟳ loop wakeup in 2m 14s · ⏰ 1 scheduledline above the composer (cronStore + CronIndicator), fed by newcron_statusevents that also render fire/stop/restore lines in the transcript. - Link-opening gesture is now discoverable per terminal. Apple Terminal
has no OSC 8 hyperlink support (still true on macOS 26), and the default
inline mode deliberately leaves the mouse to the terminal — so the only
way to open an agent-printed link there is Apple Terminal's own URL
detection: hold ⌘ and double-click the URL. That gesture was undocumented
and undiscoverable, reading as "links are broken". The TUI now prints a
one-time dim tip under the first assistant message that contains a URL
(Apple Terminal only), and
?quick help //helplist the terminal-appropriate gesture (Cmd+click linkin OSC 8 terminals,Cmd+double-click URLin Apple Terminal, omitted when unknown). VS Code (TERM_PROGRAM=vscode— also Cursor/Windsurf) is now recognized as an OSC 8 terminal: xterm.js has handledCmd+clickhyperlinks since 2022, andsupportsHyperlinksis exported from@clawcodex/inkfor app-level use. /memorynow opens memory files in your$EDITORfrom the TUI — the full port of openclaude's memory-file picker (commands/memory/+MemoryFileSelector). Typing/memoryopens a picker overlay listing the memory hierarchy (synthetic User memory~/.clawcodex/CLAUDE.mdand Project memory rows first, then every loaded CLAUDE.md / rules file /@-import, each with its "Saved in …" / "@-imported" description), served by a newmemory_targetscontrol over the sharedbuild_memory_optionsenumeration. Selecting a file ensure-creates it (exclusive-create preserves existing content), suspends the TUI to the alternate screen, and spawns$VISUAL/$EDITOR(barecode/sublget their wait flags, the TSEDITOR_OVERRIDES); on return the TS-verbatim "Opened memory file at …" line lands in the transcript and amemory_editedcontrol busts the backend's memory-file cache so the very next turn re-reads the edited content. Previously/memorywasn't wired into the TUI at all — the PythonInteractiveCommandport existed but had no reachable surface.
Fixed
- Claude subscription login repaired (#702). The Anthropic OAuth login
migrated off
console.anthropic.comtoplatform.claude.com, and the token exchange sent noUser-Agent— sourllib's default signature was Cloudflare bot-blocked (error code: 1010) before it reached OAuth. Updated the token/authorize/redirect endpoints and scopes to the current upstream config (subscriber authorize baseclaude.com/cai/oauth/authorize) and send a genuineUser-Agent. - Adaptive thinking is only sent to models that support it (#699).
Requests previously sent
thinking={"type":"adaptive"}to every Claude 4.x model, which the API rejects for all but Opus 4.6/4.7 and Sonnet 4.6 ("adaptive thinking is not supported on this model"). Models that support thinking but not adaptive now get a token budget instead;output_configeffort is gated to the models that accept it. - Semantic tool-input coercion + parity validation errors (#700) —
string-coerce boolean/number tool arguments (mirroring the reference's
semanticBoolean/semanticNumber) and format schema-validation failures to matchformatZodValidationError. - Bounded the ESC-cancel worker-thread queue in
OpenAICompatibleProvider.chat_stream_response(src/providers/openai_compatible.py) tomaxsize=64. Previously an unboundedqueue.Queuelet an orphaned worker accumulate chunks in memory indefinitely when a proxy kept sending bytes after abort without closing the SDK iterator (#278). - URLs the agent prints are clickable again. The TUI markdown renderer
(
ui-tui/src/components/markdown.tsx) replaced every visible URL with a remote-fetched page<title>(silently HTTP-GETting each URL the agent printed) or a slug-derived label, leaving the real URL only in OSC 8 metadata. Terminals without OSC 8 support (e.g. Apple Terminal) strip that metadata, so the URL was invisible, unclickable, and uncopyable — and in the default inline mode the TUI never captures the mouse, so terminal-native detection over the visible text is the only affordance that works everywhere. Bare URLs now render verbatim,[label](url)renders aslabel (url), the stealth title fetch is gone, and links remain OSC 8-wrapped for terminals with first-class hyperlink support (Cmd+click in VS Code/iTerm2, plain click in fullscreen mode).
Changed
- Directory rebrand: clawcodex state now lives under
~/.clawcodex/and<project>/.clawcodex/everywhere. The subsystems that still read/wrote the real Claude Code harness's~/.claude/and./.claude/(user skills, agents, workflows, hooks settings, auto-memory, MCP config + OAuth tokens, CLAUDE.md/rules enumeration, output styles, plugins, uploads, projectconfig.json, bridge worktrees + pointer,--worktreesessions, tool results, startup-perf,loop.md,debug.log) were repointed to the clawcodex-branded locations. Sharing directories with the Claude Code harness meant inheriting and mutating another tool's live state. - Env overrides renamed:
CLAUDE_CONFIG_DIR→CLAWCODEX_CONFIG_DIR,CLAUDE_MANAGED_CONFIG_DIR→CLAWCODEX_MANAGED_CONFIG_DIR; managed defaults unified to/etc/clawcodex. The oldCLAUDE_*variables are intentionally ignored (honoring the other harness's override would re-couple the two tools' state). --worktreesessions are created under.clawcodex/worktrees/; pre-rebrand worktrees under.claude/worktrees/are still resumed and removable in place (git registers them by absolute path).- New worktrees no longer receive a copy of the repo's
.claude/settings.local.json(a foreign harness's permission grants); only.clawcodex/settings.local.jsonis propagated.
Added
- One-time startup migration copying legacy
~/.claudestate (skills — size-capped per skill, agents, workflows, outputStyles, plugins, rules,CLAUDE.md, per-projectmemory/) into~/.clawcodex. Copy-only and destination-absent-only: nothing under~/.claudeis ever modified, and existing~/.clawcodexfiles always win. Marker:~/.clawcodex/.claude-migration.json. clawcodex migrate [--user-only|--project-only]— re-attempts the user migration and migrates the current project's.claude/config dirs into./.clawcodex/(settings files and worktrees are deliberately skipped).
Migration notes
- User-scope MCP servers previously stored in
~/.claude/config.jsonare NOT migrated (that file is shared with the real Claude Code harness and clawcodex's entries can't be told apart) — re-add them withclawcodex mcp add --scope user. MCP OAuth tokens live in the OS keychain and are unaffected. settings.json/settings.local.jsonare never migrated: on a machine with both tools they hold the other harness's live permission grants and hooks. Copy them manually only if they were written for clawcodex.
0.1.0 - 2026-04-19
Added
Core Features
- Multi-provider support for Anthropic, OpenAI, and GLM (Zhipu AI)
- Interactive REPL with prompt-toolkit integration
- Rich interactive terminal output
- Session persistence and management
- Configuration management with basic API key obfuscation
CLI Commands
clawcodex- Start the interactive REPLclawcodex login- Interactive API key configurationclawcodex config- View current configurationclawcodex --version- Show version information
Provider Implementations
- Anthropic Provider: Claude integration with chat + streaming interfaces
- OpenAI Provider: GPT integration with chat + streaming interfaces
- GLM Provider: GLM integration with chat + streaming interfaces
REPL Features
- Command history with persistent storage
- Auto-suggestions from history
- Slash commands:
/help,/exit,/clear,/save,/load,/multiline - Skill slash commands backed by
SKILL.md - Syntax highlighting with Rich library
- Tab completion and multi-line input support
Configuration System
- JSON-based configuration storage
- Base64-encoded API keys for basic obfuscation
- Provider-specific settings (API key, base URL, default model)
- Session auto-save option
Session Management
- Unique session ID generation
- Conversation history tracking
- Session save/load functionality
- Conversation clear operation
Code Quality
- Type hints for all public functions
- Abstract base class for provider implementations
- Data classes for structured data (ChatMessage, ChatResponse)
- Error handling and validation
Testing
- Unit tests for core components
- Integration tests for providers
- End-to-end tests for REPL functionality
- Test coverage for configuration management
Technical Details
Architecture
- Modular provider system with base abstraction
- Conversation management with message history
- Configuration management layer
- REPL engine with prompt-toolkit
Dependencies
anthropic>=0.18.0- Anthropic SDKopenai>=1.0.0- OpenAI SDKzhipuai>=2.0.0- Zhipu AI SDKprompt-toolkit>=3.0.0- Interactive REPLrich>=13.0.0- Terminal formattingpython-dotenv>=1.0.0- Environment variables
File Structure
src/
├── providers/ # LLM provider implementations
│ ├── base.py # Abstract base class
│ ├── anthropic_provider.py
│ ├── openai_provider.py
│ └── glm_provider.py
├── repl/ # Interactive REPL
│ └── core.py
├── agent/ # Session management
│ ├── session.py
│ └── conversation.py
├── config.py # Configuration management
└── cli.py # CLI commands
Known Limitations
- Context building is still in early MVP form and needs deeper project summarization
- Permission enforcement exists as a framework but is not fully integrated everywhere
/resume,/compact, and/doctorare not implemented yet- The current CLI uses turn-based output even though providers expose streaming interfaces
Migration Notes
This is the initial MVP release. No migration needed.
Future Roadmap
- Context enrichment and project-memory improvements
- Full permission integration
-
/resume,/compact,/doctor - Token usage and cost tracking
- MCP and plugin-system enhancements
Release Notes
v0.1.0 - MVP Release
This is the first public release of ClawCodex, a complete reimplementation of Claude Code. This MVP includes:
- Full multi-provider support
- Interactive REPL
- Session management
- Configuration system
- Tool system and agent loop foundations
- Type-safe implementation
The focus was on building a solid foundation with clean architecture, comprehensive testing, and good developer experience. All core features are working and tested.
Special Thanks: This project is inspired by Claude Code and aims to provide an open-source alternative for learning and experimentation.