Repository navigation
Gaps vs. Claude Code / Codex / Gemini CLI (second pass) #26
Copy link
Copy link
Closed
Description
A fresh comparison against the big agent CLIs, after #12–#17 landed. Items already tracked elsewhere are linked; everything here was missing or only partly there when this was written. Each item says where to start.
Missing
1. OpenTelemetry (metrics + traces)
All three big CLIs can export usage to OTLP.
- Have: tokens and cost per model per session (
src/runtime/usage.rs,AgentSession::usage_by_model,/cost); a trace writer (src/trace.rs). - Build: opt-in
OTEL_EXPORTER_OTLP_ENDPOINT(plus_HEADERSand_PROTOCOLhttp/protobuf, or json to avoid a gRPC stack), andINCODE_TELEMETRY=1ortelemetryin admin.json.- Metrics: tokens by type and model, cost, tool calls by tool and outcome (allowed, denied, asked), turn duration, session count.
- Events: tool decision, permission prompt, compaction.
- Off by default; never send prompt or code contents unless
OTEL_LOG_USER_PROMPTS=1.
- Crate choice:
opentelemetry+opentelemetry-otlp(http feature) is a new dependency, so decide deliberately. Alternatively, POST OTLP/JSON by hand with the existingreqwest. - Test: a fake OTLP collector on loopback (the same pattern as the MCP HTTP fakes).
2. Shell completions
- Build:
incode completions bash|zsh|fish|powershell. - Note: the parser is hand-written (
src/main.rsparse_args), so there's no clap to generate completions from. Generate them from a static table of flags and subcommands kept next toUSAGE, with a test that every flag inUSAGEis in the table. Also completeincode mcp|plugin|review|updatesubcommands, and custom slash command names inside the REPL (already done).
3. Package managers
- Homebrew: a tap formula pointing at the release archives and
SHA256SUMS. - winget: a manifest per release; Scoop: a bucket JSON.
- npm: an optional
@incord/incodewrapper package that downloads the right binary. - All of this needs First release (v0.1.0): run the release workflow and prove the installers and
incode update#18 (a first release) first. Automate it inrelease.ymlafter a manual first run.
4. Corporate proxy and custom CA
- Check: every outbound path honours
HTTPS_PROXY,HTTP_PROXYandNO_PROXY: model APIs (src/agent/api.rs), web fetch/search (src/web.rs), MCP HTTP (src/toolbox/mcp_http.rs), OAuth (src/mcp_oauth.rs),incode updateand the memory service. Some clients are built withno_redirect_client(); confirm the proxy still applies there. - Add: a custom CA bundle,
INCODE_CA_CERTS/SSL_CERT_FILE, added to every reqwest client builder. - Document both in the README.
- Test: a loopback CONNECT proxy (
crates/sandbox/src/proxy.rshas one to reuse).
5. Hook events
Claude Code has SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, Notification, Stop, SubagentStop, PreCompact and SessionEnd.
- Check: which of these incode's hooks have (
src/hooks/,src/runtime/lifecycle.rs), and add the missing ones. - Known:
on_compactis not fired when the API route compacts (src/agent/compact.rs; noted insrc/wiring.rs).UserPromptSubmit, which can block or rewrite a prompt, andNotification, wired tosrc/cli/notify.rs, are the most useful.
6. /bug / feedback
- Build: a command that gathers the version, OS, the last turn's trace (with secrets scrubbed) and settings (keys redacted), and opens a prefilled GitHub issue URL. It must not upload anything itself.
- Add
.github/ISSUE_TEMPLATE/bug.ymlto match.
7. Output styles
- Build: named system-prompt add-ons (e.g. "explanatory", "concise", "learning") in
~/.incode/styles/*.mdand.incode/styles/, chosen with/style <name>oroutput_stylein admin.json. - Reuse: the custom command loader (
src/custom_commands.rs) for discovery.
8. Other editors over ACP
- Have:
incode --acpis a standard Agent Client Protocol agent, and VS Code has its own extension (VS Code extension: try it in real VS Code, then sessions, images, terminals and the Marketplace #20). - Write and test: setup notes for Zed (
agent_serversin settings.json) and JetBrains (ACP agent configuration). - Done: a working settings snippet for each in the README, tried for real.
9. Code intelligence through a language server (optional)
- Current approach: incode deliberately uses tree-sitter outlines and the project's own toolchain diagnostics instead of LSP (
src/knowledge.rs,src/tools/diagnostics.rs). - Some CLIs (OpenCode, Claude Code plugins) start real language servers for go-to-definition and references, plus diagnostics after each edit.
- Option: an opt-in
lspentry per language (command + args) that, when present, servesOutline, definition and diagnostics from the server. Weigh it against the current design before building.
Already tracked
#18 release and update · #19 codex default · #20 VS Code · #21 SDKs · #22 by-hand checks · #23 cloud runs · #24 Windows network deny · index: #25.
Already at parity (for reference)
- Sessions: headless
-twith JSON; resume (/resume); rewind (/rewind) and undo; plan and read-only modes; image input; context compaction;/cost. - Extending: custom slash commands with
allowed-toolsand@file; plugins; hooks; sub-agents (/agents);.mcp.jsonwith approval and OAuth; per-command permission rules; managed settings. - Execution: OS sandbox (built-in and sbx) on Linux, macOS and Windows; git worktree lanes; background jobs; web fetch and search.
- Terminal: notifications; status line; vim mode; keybindings.
- Integrations:
incode review; GitHub Action; VS Code extension; SDKs; auto-update.
Generated by Claude Code
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
Merge pull request #29 from incordai/feat/shell-completions
blockmandev commentedon Oct 22, 2026
Item 2 (shell completions) is done in #29:
incode completions <bash|zsh|fish|powershell>, generated from a table besideUSAGEthat tests hold to the help text and the parser. The scripts are driven in the real shells in CI (Linux: bash, fish, zsh, PowerShell; macOS: bash, zsh, PowerShell; Windows: bash, PowerShell), and a missing shell there fails rather than skips.Merge pull request #30 from incordai/feat/bug-report
blockmandev commentedon Oct 22, 2026
Item 6 (
/bug) is done in #30:/bug [what happened](also/feedback) prints a report and a link to a prefilled issue on the new bug form. It sends and opens nothing; typed text is redacted and the home folder becomes~; the link is bounded by its encoded size.Merge pull request #31 from incordai/feat/output-styles
blockmandev commentedon Oct 22, 2026
Item 7 (output styles) is done in #31: Markdown files in
~/.incode/styles/(yours, wins a clash) and.incode/styles/(the project's), chosen byINCODE_OUTPUT_STYLEoroutput_stylein admin.json, switched with/stylein the REPL, on every route and-t. Symlinks are refused and the prompt names which folder a style's text came from. Not offered over--acp(itsOFFEREDlist does not include/style).Merge pull request #32 from incordai/feat/hook-events
blockmandev commentedon Oct 22, 2026
Item 5, first event, is done in #32:
user_prompt_submitin admin.jsonhooksruns before a line you send is passed on (REPL,--acp,-t). Exit 2 refuses it (nothing is sent, not even to the memory engine); stdout becomes that turn's context; the line is never changed. Not taken from a project's plugins. Still to come: Stop, Notification, PreCompact, session start/end, and/review//runcoverage.Merge pull request #34 from incordai/feat/hook-events-2
blockmandev commentedon Oct 22, 2026
Item 5, second slice, is done in #34:
pre_compact(before/compact) andstop(when one of your turns ends) in admin.jsonhooks. Neither can refuse; their output is shown. A project's plugin now gives onlypre_tool_use/post_tool_use, by allowlist (and only once approved, #33). Still to come: Notification, session start/end,/reviewand/runprompt-hook coverage, and PreCompact for automatic compaction.Merge pull request #35 from incordai/feat/hook-notification
blockmandev commentedon Oct 22, 2026
Item 5, third event, is done in #35:
notificationin admin.jsonhooksruns whenever incode would notify you (turn_done/input_needed), in the background besidenotify_command. Still to come: session start/end,/reviewand/runprompt-hook coverage, PreCompact for automatic compaction.Merge pull request #36 from incordai/feat/hook-session
blockmandev commentedon Oct 22, 2026
SessionStart / SessionEnd: done in #36 (merged
5a89a3e).session_startandsession_endare now operator hooks (admin.jsonhooks, and the operator's own plugins). Project plugins still give only the tool events.--acpand-t.sourceisstartup.reasonisprompt_input_exitin the REPL andotherelsewhere.-tit goes to stderr. For--acp, the end is traced, since the client has gone by then.-tinstruction refused byuser_prompt_submitstill runssession_end..incode/lifecycle.json: marked superseded, and it still runs.Not covered:
/runledger workers. They are sessions with no person behind them and already skipuser_prompt_submit.Remaining for this issue:
/reviewand/runMerge pull request #37 from incordai/feat/hook-review-run
Merge pull request #41 from incordai/feat/net-proxy-ca
blockmandev commentedon Oct 22, 2026
Item 5, the rest: done in #37 (merged
2c412ee).user_prompt_submitnow covers/reviewand/run./review: the hook sees the review prompt, diff included./run: the hook sees each task's instruction before a worker or lane gets it. This happens inrun_memory::Remembered, which every worker goes through.pre_compactalso runs before the API route compacts on its own (trigger: "auto"). What it prints arrives as a newAgentEvent::Notice, which the REPL,--acpand-tall show. A CLI agent's own automatic compaction happens inside that agent, so it fires nothing.Item 4: done in #41.
HTTPS_PROXY/HTTP_PROXY/ALL_PROXY/NO_PROXYand the Windows/macOS proxy settings, through reqwest's system proxy. What was wrong: loopback went through the proxy too unlessNO_PROXYlisted it. A request to this machine (the memory engine, a local model or MCP server) now never uses a proxy. Such a client follows a redirect only while it stays on this machine.INCODE_CA_CERTS, orSSL_CERT_FILE, names a PEM bundle that is trusted beside the system store. A bad file is reported and nothing is added.Still open from this issue:
opentelemetrycrates, or OTLP/JSON by hand over reqwest).incode update#18, the first release.SubagentStop: the one Claude Code hook event incode still lacks.Merge pull request #45 from incordai/feat/hook-subagent-stop
blockmandev commentedon Oct 22, 2026
Item 5 finished:
SubagentStopis done in #45 (merged).subagent_stopin admin.jsonhooksruns when a sub-agent (theAgenttool) finishes. It is toldagent_type,task,last_assistant_messageandoutcome. It can't keep the agent working, its output is traced, and a project's plugin can't add one. incode now has every hook event Claude Code has.Also merged since the last update:
.incode/lifecycle.jsoncommands run only once approved as they are (incode lifecycle show|approve). They used to run at session open with no approval. The approval screen escapes every non-printable-ASCII character, so a command can't disguise itself.Win32 error 1056) was a race to start the demand-start Secondary Logon service. A start refused with that error is now made again, up to 5 times.Merge pull request #46 from incordai/feat/otel
blockmandev commentedon Oct 22, 2026
Item 1, OpenTelemetry: done in #46 (merged).
INCODE_TELEMETRY=1or"telemetry": truein admin.json, plus anOTEL_EXPORTER_OTLP_ENDPOINT.reqwest, so no new crates. It goes only tohttpsor this machine. Another protocol, a non-https collector or malformed headers are reported, and nothing is sent.allowedwhen the tool ran,deniedwhen a gate refused it), turns and their duration.OTEL_LOG_USER_PROMPTS=1.-t.Still open here: item 3 (needs #18), item 8 (needs testing inside Zed and JetBrains), and item 9 (optional).
blockmandev commentedon Oct 22, 2026
Item 8 (other editors over ACP): notes written in #53, not yet tried in the editors.
agent_serverscustom-agent entry.~/.jetbrains/acp.json.Both are taken from each editor's current docs.
incode --acp, spawned the way both editors do it, answers an editor'sinitializeandsession/new.What's left: trying them in real Zed and a real JetBrains IDE. Neither is installed on the machine that wrote this.
Item 3 (Homebrew/winget/Scoop) waits for the first release, #18. Item 9 (LSP) is optional and needs a decision first.
Merge pull request #53 from incordai/docs/editors-over-acp
blockmandev commentedon Oct 23, 2026
Solved:
/bug(/bug: a prefilled GitHub issue link, scrubbed; sends nothing (#26 item 6) #30)What's left needs the owner, so it moved to #56: package managers after the first release, trying the editors for real, and the LSP decision.