Skip to content

io-cli 0.18.0 - #48

Merged
aakashpawar1999 merged 15 commits into
mainfrom
develop
Aug 26, 2026
Merged

io-cli 0.18.0#48
aakashpawar1999 merged 15 commits into
mainfrom
develop

Conversation

@aakashpawar1999

Copy link
Copy Markdown
Contributor

Release PR for io-cli 0.18.0 — the memory release, and the release that got this product off an unmaintained dependency.

/remember writes a line of guidance into a markdown file the operator owns, at a scope they choose when they write it: AGENTS.md for the team, AGENTS.local.md for the checkout, ~/.io-cli/IO.md for every project. The complete [instructions] list is installed in the one scope that is never committed, because naming files there replaces the default rather than adding to it. The line takes effect on the next turn of the same session — and so does an edit made in another editor — because the configuration is discovered again for every turn; a file that stops parsing leaves the last good one in force and names itself rather than ending the session.

/memory shows both memories in one place: the three files with what each holds and which are actually being read, and beside them the durable memory the agent wrote for itself — key, kind, pinned, run and step, draw count, both scopes, caps per scope. Entries are pinned so they survive eviction, or forgotten with a restore point rather than deleted.

tui-textarea is gone. The composer and the wizard run on an editing model io-cli owns, ratatui moves to 0.30, crossterm stays at 0.28, and every editing behaviour survives — including undo and redo at one step per character.

Gates

  • 8/8 checks green on three platforms on the feature PR (io-cli 0.18.0 #47), Windows included
  • cargo test — 74 binaries, 989 passed, 0 failed
  • cargo fmt --check clean, cargo clippy --all-targets -- -D warnings silent
  • A six-arm sabotage pass, with the two arms that were less isolated than their criteria claim recorded rather than tidied
  • Three live pty captures of the built 0.18.0 binary against a real endpoint, plus a 0.17.0 baseline

Two things the process caught that the suite could not

The audit before any code falsified three roadmap claims, all in the direction of the dependency giving less than the entry assumed.

And running the built binary found a release blocker with 989 tests green and clippy clean: ratatui 0.30 made Terminal::insert_before end in Terminal::clear, and 0.30's clear snapshots the cursor where 0.29's asked nothing — so a commit queries the terminal, io-cli's keyboard reader takes the reply, and every session died two seconds after the splash. Nothing under tests/ drives a real pty, so no gate here could have seen it.

The release record is sealed and pinned. The tag, the Release and the post-release smoke follow this merge.

The five files were written by hand across several tasks and reflowed in one
pass, so the formatting change is separated from the code it formats rather
than folded into a task's own commit.
ratatui 0.30 made `Terminal::insert_before` end in `Terminal::clear`, and 0.30's
`clear` snapshots the cursor before clearing so it can restore it
(`ratatui-core-0.1.2/src/terminal/buffers.rs:147`). 0.29's wrote the escape and
asked nothing. So a commit now queries the terminal, the reply arrives on stdin,
and io-cli's keyboard reader thread takes it — leaving the query to time out
after two seconds. The call that failed was the commit of the splash, so every
session died before its first prompt.

The stand-aside `stdin` already provides was written for exactly this hazard, but
it was applied at the two explicit placement sites because in 0.29 those were the
only places that queried. It now goes where the queries are: `attach_raw`,
`commit`, `commit_raw`, `resize`, and the one `draw` where the recorded size
moved. A still screen takes no lock, so an unchanged frame still writes no bytes.

`stdin::placing()` becomes reentrant, because `main` holds a guard around the
larger operations that are built out of these sites and a second acquisition on
one thread would wait for itself forever. A thread-local records which guard is
the holder rather than a depth count, so releasing out of order is still correct.

Found by driving the built binary. The whole suite passes on the broken binary —
nothing under tests/ drives a real pty.
The release binary is built after this so the pty captures name the version they
are evidence for.
The masking tests typed a string beginning `sk-or-v1-`, which is OpenRouter's
own key prefix. It is obviously synthetic to a reader and not to a secret
scanner, and a repository that trips its own scanning on every push teaches
people to wave the alerts through. Same length and the same word boundary, so
the mask-width and `Ctrl+W` assertions are unchanged.
`the_user_path_is_written_literally_and_not_as_a_substitution` was red on
windows-latest only. It asserted `!text.contains('~')`, and a temporary directory
on Windows comes back in 8.3 short form — so the path this crate wrote correctly
and literally was `C:\Users\RUNNER~1\AppData\Local\Temp\…`. The tilde was the
operating system's, in a path that resolves, and the assertion called it a
shorthand.

The property the criterion is about is io-cli writing `~` as a stand-in for a
home directory it declined to resolve, which can only appear at the start of an
entry. Every entry is a quoted string, so `"~` is that and nothing else.

The sealed record is not amended: nothing it claims became false. Its evidence
line quotes the macOS suite, and the operational claim it makes about the
three-platform matrix is the one this commit makes true.
@aakashpawar1999
aakashpawar1999 merged commit 876debf into main Aug 26, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant