Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
9f62da9
feat(terminal): link URLs and paths that wrap across rows or sit in t…
aakhter Oct 22, 2026
32a1d54
feat(terminal): link file paths that contain spaces as one path
aakhter Oct 22, 2026
efa647d
fix(terminal): exclude relative prose and trim spaced paths linearly
aakhter Oct 23, 2026
40a9528
fix(terminal): keep unrelated rows out of wrapped links
aakhter Oct 23, 2026
74a107c
fix(terminal): require path labels and preserve markdown context
aakhter Oct 23, 2026
27c93b2
fix(terminal): stop URL continuations from swallowing prose
aakhter Oct 23, 2026
8cdd18f
test(deepseek): stop pinning Node's one-shot zstd decoder to the firs…
JDProfresh Oct 24, 2026
3a4e2c9
fix(terminal): keep shell prompts and status lines out of wrapped URLs
aakhter Oct 24, 2026
405c992
fix(terminal): end spaced paths at line suffixes and generic labels
aakhter Oct 24, 2026
3e33435
fix(mobile): hold the PTY rows while the on-screen keyboard is up
JDProfresh Oct 24, 2026
c7835a1
feat(tabs): start a session beside any tab from an opt-in + in its ac…
JDProfresh Oct 24, 2026
af4b656
fix(agent): COD-549 preserve spawned ID on readiness transport errors
aakhter Oct 25, 2026
e8ea8b0
feat(history): COD-549 read saved Codex conversations offline
aakhter Oct 25, 2026
b2e96dd
feat(agent): COD-549 start workers in existing project directories
aakhter Oct 25, 2026
d25d71b
fix(agent): COD-549 report readiness failures with empty errors
aakhter Oct 25, 2026
2a90fb8
fix(terminal): keep the next table record out of a last-column URL
aakhter Oct 25, 2026
5e1daaf
fix(terminal): keep label prose out of labelled spaced paths
aakhter Oct 25, 2026
a24b0ec
feat(agent): add bounded inspection and guarded submission
aakhter Oct 23, 2026
4c2f050
fix(agent): address inspection and staging review feedback
aakhter Oct 23, 2026
1a2c3be
docs(agent): mark coordination API experimental
aakhter Oct 23, 2026
c5ffea0
fix(agent): treat only an omitted case as a directory spawn, and docu…
aakhter Oct 25, 2026
77ce481
fix(agent): keep the error code when a request fails without a message
aakhter Oct 25, 2026
df9f93d
fix(terminal): keep sentences and script commands out of spaced paths
aakhter Oct 25, 2026
1bdc341
fix(terminal): keep code, fields and measurements out of wrapped URLs
aakhter Oct 25, 2026
c78635a
feat(agent): make coordination routes opt-in and address review
aakhter Oct 25, 2026
803e7c7
refactor(codex): share the rollout format between the two Codex histo…
aakhter Oct 25, 2026
002d876
fix(history): read forked threads, large stores and live rollouts
aakhter Oct 25, 2026
44fa2d4
docs(history): document the offline reader next to codeman agent
aakhter Oct 25, 2026
1082724
perf(zerolag): rebuild only the changed overlay line, one paint layer…
claude Oct 25, 2026
9432d9f
feat(git): a Fetch button in the Git status header, and an interval f…
opticon454 Oct 25, 2026
ea43189
fix(git): the interval fetches one run per folder, and the rest of th…
opticon454 Oct 25, 2026
b26234d
fix(agent): refuse an empty --working-dir instead of spawning in cwd
aakhter Oct 25, 2026
8ad60fa
fix(terminal): keep a directory cell from taking the next row's file …
aakhter Oct 25, 2026
17b2edc
fix(history): count compressed rollouts, read each file once, degrade…
aakhter Oct 25, 2026
ae3d314
fix(terminal): keep a labelled table record out of a cell-wrapped path
aakhter Oct 25, 2026
2832a03
fix(agent): verify staged text on a live codex pane and refuse popups
aakhter Oct 25, 2026
3411d7f
fix(git): the fetch timeout reaches the whole tree, a tick covers eve…
opticon454 Oct 25, 2026
0cc9332
fix: cycle Command-K CLI picker at query edges (johoja12/Codeman#21)
johoja12 Oct 25, 2026
c0d2707
test: register palette keyboard browser regression (johoja12/Codeman#21)
johoja12 Oct 25, 2026
4f6481b
fix(tabs): open the tab + from the keyboard and probe a Docker tab's …
JDProfresh Oct 26, 2026
8fa5b34
fix(settings): serialize settings.json writes so a quick-start cannot…
JDProfresh Oct 26, 2026
fc0ecc6
fix(tunnel): give the unauthenticated tunnel its own acknowledgement
JDProfresh Oct 26, 2026
003398e
fix(agent): refuse an implicit HOME cwd for a directory spawn
aakhter Oct 26, 2026
a29192a
fix(agent): do not rerun a pane capture whose combined call failed
aakhter Oct 26, 2026
ecaddb4
fix(agent): cap inspection cursors per owner and session
aakhter Oct 26, 2026
2aad939
fix(agent): hold input during a guarded submit instead of refusing it
aakhter Oct 26, 2026
cd1b231
fix: apply the review items for #718 at merge
claude Oct 27, 2026
e8f66c6
fix: apply the review items for #711 at merge
claude Oct 27, 2026
e9f3aa2
fix: apply the review items for #710 at merge
claude Oct 27, 2026
e93382f
fix: apply the review items for #686 at merge
claude Oct 27, 2026
8574e3c
fix: apply the review items for #719 at merge
claude Oct 27, 2026
ffa7f57
fix: apply the review items for #717 at merge
claude Oct 27, 2026
04aa44b
fix: apply the review items for #712 at merge
claude Oct 27, 2026
e52cc60
fix: apply the review items for #687 at merge
claude Oct 27, 2026
4b3eebd
fix: apply the review items for #708 at merge
claude Oct 27, 2026
6539bc6
fix: apply the review items for #714 at merge
claude Oct 27, 2026
6368128
fix: apply the review items for #694 at merge
claude Oct 27, 2026
97c91d4
Merge pull request #718: fix(tunnel): give the unauthenticated tunnel…
claude Oct 27, 2026
82ef8b1
Merge pull request #719: fix(settings): serialize settings.json write…
claude Oct 27, 2026
3d0abbf
Merge pull request #686: feat(terminal): link URLs and paths that wra…
claude Oct 27, 2026
9c27342
Merge pull request #687: feat(terminal): link file paths that contain…
claude Oct 27, 2026
97d2998
Merge pull request #713: perf(zerolag): rebuild only the changed over…
claude Oct 27, 2026
cad8621
Merge pull request #707: feat(history): COD-549 read saved Codex conv…
claude Oct 27, 2026
bd3320f
Merge pull request #709: fix(agent): COD-549 preserve worker IDs afte…
claude Oct 27, 2026
6d07a10
Merge pull request #717: fix: cycle Command-K CLI picker both ways at…
claude Oct 27, 2026
6612a89
Merge pull request #714: feat(git): a Fetch button in the Git status …
claude Oct 27, 2026
01cd509
Merge pull request #708: feat(agent): COD-549 launch workers in exist…
claude Oct 27, 2026
5908cc5
Merge pull request #694: feat(agent): COD-529 add bounded inspection …
claude Oct 27, 2026
b21b848
Merge pull request #710: test(deepseek): stop pinning Node's one-shot…
claude Oct 27, 2026
9852652
Merge pull request #711: fix(mobile): hold the PTY rows while the on-…
claude Oct 27, 2026
0f1fca6
Merge pull request #712: feat(tabs): start a session beside any tab f…
claude Oct 27, 2026
da740d4
fix: stop logging settings.json contents from the git-fetch tick, and…
claude Oct 27, 2026
b89f15c
fix: make the tunnel-guard test fail on a settings.json write that sk…
claude Oct 27, 2026
1752d7e
fix: refuse to git fetch while the Docker case list cannot be read (r…
claude Oct 27, 2026
3fdba31
fix: keep a shell prompt whose spaced working directory ends in $ out…
claude Oct 27, 2026
93691e6
fix: bring the skill, plugin, README and API docs in line with the me…
claude Oct 27, 2026
cc08016
fix: keep links in the columns right of a wrapped URL's first row (re…
claude Oct 27, 2026
de1aab9
chore: one changeset for 1.46.0
claude Oct 27, 2026
c04fa97
chore: replace the em-dashes this release added with plain punctuation
claude Oct 27, 2026
8a6e34b
docs: list both unauthenticated-exposure acknowledgements as stable
claude Oct 27, 2026
ecf28fa
chore: version packages
claude Oct 27, 2026
dd09a38
fix: stop desktop dead-key doubling and bracket Ctrl+V paste
Hugo-DDT Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
{
"name": "codeman",
"source": "./plugins/codeman",
"description": "Drive Codeman from inside a Claude Code session: spawn worker sessions, prompt them, wait for them, read their answers, clean up. Acts only inside a Codeman-managed session.",
"version": "1.45.0",
"description": "Drive Codeman from inside a Claude Code session: spawn worker sessions, prompt them, wait for them, read their answers, clean up. Acts inside a Codeman-managed session; outside one it only reads saved Codex conversations offline.",
"version": "1.46.0",
"author": {
"name": "Ark0N",
"url": "https://github.com/Ark0N"
Expand Down
38 changes: 38 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,43 @@
# aicodeman

## 1.46.0

### Minor Changes

- de1aab9: ### Thanks
- @JDProfresh for five PRs: a phone keyboard that no longer costs Claude its transcript (#711, measured in #672), a + on each session tab that starts a session beside it (#712, shaped in Discussion #700), a tunnel that needs its own opt-in instead of the LAN one (#718, from their report #706), a settings.json that two writers can no longer tear (#719), and a DeepSeek test that passes on current Node (#710).
- @aakhter for six PRs: `codeman agent spawn` in a project directory (#708), worker ids kept when the readiness check fails (#709), the offline Codex history reader (#707), experimental bounded inspection and guarded submission for agents (#694, from Discussion #695), links that follow URLs and paths across wrapped rows and table cells (#686), and file paths with spaces linked as one path (#687).
- @opticon454 for the Fetch button and fetch interval in the Git status window (#714).
- @johoja12 for Cmd+K arrows that switch the CLI both ways after you type a case name (#717).

**Fetch from the Git status window (#714).** The Git status window has a Fetch button next to Refresh. It runs `git fetch` for the repositories it lists and shows each one's result. An optional interval runs it for you: off by default, app-wide in App Settings, Bottom bar, with a per-session override in Session Options, Git. A fetch only moves remote-tracking refs (HEAD, the index and the working tree stay as they are), it never runs for a Docker or remote session, and it is bounded in time, output and concurrency.

**Start a session beside any tab (#712, opt-in).** Turn on **New Session Button on Tabs** (App Settings, Tabs) and each session tab gets a +: pick any CLI its case can run (a Docker case offers what its container has) and the new session starts in that case or worktree and that tab's group, without touching the toolbar's case or Run mode. The row menu offers the same as "New session here…" for the keyboard.

**The phone keyboard no longer costs Claude its transcript (#711).** Every keyboard open and close used to resize the PTY, and Claude Code answers each height change by reprinting only the tail that fits, so lines above it were lost from tmux for good (25 of 100 in five keyboard cycles). A local Claude session now keeps its rows while the keyboard is up and slides the screen so the composer stays above the keyboard. On by default as **Keep Size Under Keyboard** (App Settings, per device); off restores the old resize. Fullscreen Claude (mouse tracking on) still resizes as before.

**Typing stays smooth in a long prompt (#713).** The local echo overlay (the instant preview of what you type) rebuilt every character of the prompt on each keystroke, so on a phone-class CPU a 4,000-character prompt took most of a second per key. It now rebuilds only the line that changed, with one paint layer per line, so a keystroke costs the same however long the prompt is. Every character still sits on its terminal cell. This ships in `xterm-zerolag-input` too.

**Links survive wrapping and spaces (#686, #687).** A URL or path a CLI wrapped inside a table cell or an indented paragraph now links whole instead of in fragments, URLs keep balanced parentheses (`…/Team-Space(QA)Archive/…`), a full-width table divider no longer glues onto the row below, and OSC 8 hyperlinks open through Codeman's own opener after a confirmation. A file path with spaces (`/mnt/c/OneDrive - Contoso/report.docx`, `Saved to: ~/My Docs/plan.md`) links as one path in the terminal and the response viewer when the line bounds it, and a shell prompt that prints its working directory no longer turns the whole command line into one link.

**`codeman agent spawn` in a project directory (#708).** Without a case name, `spawn` starts the worker in the current directory, or in an existing directory given with `--working-dir`, through `POST /api/v1/sessions` and the mode's start route. Named cases still use quick-start. `--json` prints `{ sessionId, workingDir, created: true }` plus `ready`, `readinessError` or `startupError`. An empty `--working-dir`, a bare spawn from your home directory (it would install Codeman's hooks into `~/.claude`; pass `--working-dir ~` to mean it) and an unknown `--mode` are refused with exit 4 before any request.

**Read saved Codex conversations offline (#707).** `codeman history read` reads Codex's saved rollouts without a Codeman server: by file, by Codex session id, or a whole conversation with its sub-agents and forks, filtered by topic or UTC date with whole turns kept. Reads and output have separate, raisable budgets, and anything it could not read or attribute (a compressed `.jsonl.zst` rollout, a file still being written) is reported through `complete: false` instead of failing the lookup. The codeman skill routes to it.

**Experimental: bounded inspection and guarded submission for agents (#694, opt-in).** `codeman agent inspect` reads bounded, cursor-paged evidence from another session (a local Codex session's attributed rollout records, otherwise a labelled pane snapshot), and `agent stage` / `agent submit` type one line into a verified local Codex composer and later send exactly one Enter against a hash-confirmed receipt. Off by default behind **Experimental agent coordination** (App Settings, Cross-session features); while off the three routes answer `403 FORBIDDEN` naming the setting. These routes and verbs are experimental under the versioning policy and may change in a minor or patch release. During the few milliseconds of a guarded submit, other input is held and written in order afterwards; a tagged input POST in that window answers `409 CONFLICT` so its sender retries, and an untagged one (the phone keys, the Stop button) is held and answered once written.

**Cmd+K arrows switch the CLI both ways (#717).** After typing a case name in Cmd+K, plain Left and Right now both change the New session row's CLI whenever the caret is at either end of the query (only Right did before). Inside the query the arrows move the caret as usual.

**Fixes.**
- **Security: a LAN install's acknowledgement no longer opens a public tunnel (#718).** `CODEMAN_ALLOW_UNAUTHENTICATED_NETWORK` (and `--allow-unauthenticated-network`), which the installer writes for every LAN install without a password, also let the Cloudflare tunnel start, so one click on the welcome screen's tunnel link published full terminal control to a public URL with no login and no confirm. It now covers the network bind only. An unauthenticated tunnel has its own opt-in, `CODEMAN_ALLOW_UNAUTHENTICATED_TUNNEL=1` or `codeman web --allow-unauthenticated-tunnel` (carried by `codeman web -d` and `codeman service install`), which the installer never writes; if you relied on the network variable to start the tunnel without a password, set one of those. With no password and no multi-user mode, the browser now asks before every tunnel enable, using the new `loginConfigured` field of `GET /api/tunnel/status`. Both acknowledgement variables and their flags are now listed as stable in the versioning policy.
- **settings.json can no longer be torn (#719).** A quick-start's `lastUsedCase` write was not awaited and not atomic, so it could overlap the next settings save and leave one write's bytes over the tail of the other, after which every reader saw `{}`. Every write to settings.json now goes through one serialized writer that writes a temp file and renames it into place, and a file that does not parse is refused with `409 CONFLICT` instead of being overwritten with only the writer's own keys. A case rename checks this before it ends any session.
- **A worker id is never lost (#709).** When `codeman agent spawn` created a worker but its readiness request failed, it exited without the new session id. It now prints the id (and `--json` carries it) and exits 1, so the caller can inspect or delete the worker. `codeman agent` and `codeman mcp` also name the error code (such as `ECONNREFUSED`) when a request fails with an empty message.
- **The DeepSeek transcript test passes on Node 24.22+ and 26.10+ (#710).** It pinned Node's old zstd decoder, which stopped at the first frame until nodejs/node#65865.

**Fixes applied while landing.** The Git fetch interval field is no longer reset by a session update while you type in it, a session holding only half an override shows the app's value for the other half, reading a repository's `core.sshCommand` no longer doubles the fetch timeout, a `GIT_SSH` in the server's environment is honoured, and the Fetch button's disabled and busy styles no longer reach other icon buttons and stop pulsing under reduced motion (#714). A + launch keeps the toolbar on its own case, and pressing the + again closes its picker (#712). The fetch scheduler no longer logs the text of a malformed settings.json on every 15-second tick (the parser's message could quote an API key; it now says the file is not valid JSON, once), and a fetch is skipped while the Docker case list cannot be read, so it can never run inside a Docker workspace (#714). A case rename answers `409 CONFLICT` for a settings.json it cannot write before it ends any session (#719). The unauthenticated-tunnel warning no longer fires in multi-user mode, where the tunnel has a login in front of it (#718). Untagged input during a guarded submit is held instead of refused, and the skill's staging guide says so (#694). A shell prompt line (a spaced working directory followed by `$` included) and a labelled `../` spaced path link as they should, and a bold label or inline code before a path in the response viewer splits it as the terminal does (#687); a URL whose row soft-wraps no longer glues a trailing column onto the next path, and in a table a link in the column right of a wrapped URL stays clickable on the URL's first row (#686). The keyboard hold reads the terminal's height only while rows are held (#711). The README, the plugin's README and its marketplace description now say the codeman skill reads saved Codex conversations outside a Codeman session and refuses everything else there (#707).

**Docs and tests.** New sections for the keyboard hold (next to the terminal geometry rule it is an exception to), the tab +, Git fetch, the settings writer, the tunnel opt-in, the directory spawn, the offline history reader and the experimental agent routes, in CLAUDE.md, the API reference, the architecture notes, the wiki and the codeman skill.

## 1.45.0

### Minor Changes
Expand Down
Loading