Skip to content

chore(release): promote v0.1.16 to main - #87

Merged
whackur merged 16 commits into
mainfrom
dev
Oct 7, 2026
Merged

whackur merged 16 commits into
mainfrom
dev

Conversation

@whackur

@whackur whackur commented Oct 7, 2026

Copy link
Copy Markdown
Collaborator

Promote dev to main for v0.1.16. Includes browser screen restoration after refresh and the accumulated development changes since v0.1.15.

The viewer preserves Repo/Content/Terminal selection in browser storage; repository content restoration does not override a restored Terminal screen. The application and workspace package versions were advanced with the official preparation script.

Verification: development PR #86 and merged dev CI passed on Windows, macOS, and Linux; Windows and Linux workspace gates, 899 frontend tests, reproducible frontend bundle build, release automation tests, and exact next-patch policy validation pass. The official release workflow builds and tests all four binary targets before publishing the assets and SHA256SUMS.

whackur and others added 16 commits October 3, 2026 00:43
chore: synchronize v0.1.15 release history into dev
At 24rem the body was a few characters short of "The process running in it
will be terminated.", so the last word wrapped alone and left a gap at the
end of the first line that read like something was holding the space. 28rem
fits it; `max-w-full` still narrows the dialog on a phone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Narrow screens started on tabs but could be toggled to the grid, and the
choice was stored, so a phone that tried the grid once kept it. Below `md`
the grid is not a preference to respect but a layout that does not work: it
hands each pane fewer columns than a command line needs, and a PTY has one
size for the whole session, so a phone that held the sizing in a grid would
narrow every other screen's panes with its own.

Below `md` the panel is now always tabbed and the toggle is hidden. A choice
stored on a wide screen is kept, not cleared, so widening the window brings
it back; a toggle cannot be stored from a narrow one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
While a soft keyboard is up the panes keep their grid and the cell crops,
anchored to the bottom on the assumption that the prompt is the last row.
That holds once a screen has filled and fails on a terminal just opened: its
prompt is the top row, so the crop showed the empty rows under it and hid the
line being typed behind the keyboard.

The crop now follows the cursor: the lowest window that still shows the
cursor's row. A full screen crops as before; a fresh one shows its top. It
only adjusts how far below the cell's edge the terminal sits, so nothing is
resized and the pointer geometry follows; scrolled back, it is left alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two gaps in how the repository's git state reaches the screen.

Nothing said when git was stopped in the middle of something. A rebase an
agent left half done in a pane looked like any other afternoon in the status
list. `git/diff/operation.rs` now reads libgit2's repository state — merge,
rebase, cherry-pick, revert, bisect — and, for a rebase, the step counters
git writes under `rebase-merge` or `rebase-apply`. The snapshot carries it
with the number of unmerged files, counted before the display cap. The TUI's
repo header and the web footer show it ahead of the ahead/behind counts as
`REBASING 2/5 · 3 conflicts`; conflicts left by a stash pop or checkout,
which leave no operation behind, are shown on their own.

And the web log was a bare list. The TUI already decorated its commit list
from the refs (`LogDecorations`); the web log route now builds the same
decorations per page and each commit carries its refs — HEAD, local
branches, tags, remote branches, in that order — whether it is ahead of or
behind the upstream, and whether it is a merge. The viewer renders the refs
as chips within its palette and marks divergence from the server's walk
rather than guessing that the first N rows are the ahead ones, which a merge
puts out of order.

The new wire fields are optional, so the protocol version stands. The
fixture carries a mid-rebase status with a conflict and a commit with every
ref kind, and the contract test re-narrows the new unions against lists tied
to them in both directions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the end

`spawn_editor` slept the 75ms grace and looked at the child once. A failure
that was only slow to happen — a loaded machine starting the process late —
read as "still running", and the launcher reported success for an editor
that had already failed. Its test hit exactly that: the fixture editor is the
test binary started again, and under a full run it often missed the window,
failing the suite about one run in three.

The window is now polled, so a failure is reported the moment it happens
and a slow start no longer looks like a running editor. The test gives a
generous window, which costs nothing because polling returns as soon as the
child exits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…once

The first cut put each commit's refs and ahead/behind mark on the log rows.
The history a page describes never changes once walked, but its decorations
change whenever a ref moves, so every loaded row went stale on its own
schedule: a fast-forward kept `HEAD → dev` on the old tip, a push left rows
marked ahead after the footer had taken the count back, rows below the first
page were never refreshed at all, a failed refresh dropped the change for
good, and switching branches at the same commit moved neither HEAD nor any
ref target, so nothing asked again.

Decorations now come from `/api/log/decorations` — refs by oid and the
ahead/behind sets, for the whole repository — and the client replaces them
wholesale. It asks again whenever the status stream's HEAD, branch or refs
digest changes (status now carries the digest the snapshot already
computes), aborts an answer a newer change has overtaken, and retries a
failure after five seconds so a change is never lost. Log pages carry only
what cannot go stale: the history and each commit's merge flag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two gaps in the repository-wide decorations.

Pointing a branch at a different upstream — `--set-upstream-to`,
`--unset-upstream` — changes what ahead and behind mean without moving HEAD,
the branch, or any ref target, so nothing asked again and the arrows stayed
answers to the old upstream. Status's tracking now names the upstream, and
the decorations are keyed on it too.

And the answer had no ceiling: a repository with years of release tags or a
remote with hundreds of branches sent every label on every refresh. It is
cut at `MAX_LOG_DECORATION_REFS` after ranking every label across the
repository, so remote branches go first, then tags, and the branch HEAD is
on is never dropped; `truncated` says when that happened.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Three loose ends in the git-state work.

A stopped `git am` read as `REBASING`, but its way out is `git am
--continue`/`--abort`, not the rebase commands. It has its own kind and reads
`APPLYING 1/3`; where libgit2 cannot tell am from rebase it checks the
`applying` marker git leaves in `rebase-apply`.

The ahead and behind sets stop at the walk's own cap, and the answer said
nothing — so deep enough rows silently lost their arrows. That cap now counts
toward `truncated` alongside the ref-label cap.

And the viewer took `truncated` off the wire and dropped it. It now reaches
the log, which notes under the list that some marks are not shown, so a
missing chip is not read as an absent ref.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The cap check took one walk result too many into a set, then removed an
arbitrary element to get back under it — which could be HEAD or any other
recent commit, and could differ from one load to the next, so an arrow near
the top of the log could vanish while a commit a thousand deep kept one.
The walk now keeps the first commits it yields, which are the newest, and
pulls one more only to learn whether it stopped short.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`nightcrow-memory mcp` is a stdio MCP server each agent's CLI runs. It
offers notes (write, search, recent, delete) and a status board (post,
read), kept in one SQLite file per project under ~/.nightcrow/memory and
found through the two variables nightcrow already sets on every pane, so
agents in the same project meet without configuration and an agent
started elsewhere reaches nothing.

There is no server between them. The host only starts a plugin some pane
names or one with `watch_on_signal`, and a single writer process would
add nothing SQLite does not already do across processes. The one place
that needed care is opening: switching to WAL answers BUSY at once
rather than waiting out the busy timeout, so agents starting together
failed to open a store that was merely being opened; it is retried.

Every read is prefixed with a notice that entries are another agent's
unverified notes, authors are labelled with the client name and a prefix
of the pane token, and text over a limit is refused rather than cut.

The crate inherits the workspace version, so the release policy and the
push hook's plugin scope list it beside the recovery plugin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
How to install it and register it with Claude Code, Codex and OpenCode,
what each tool does, its limits, and the three things to know before
turning it on: a note is another agent's words, the store is neither
private nor authenticated, and nothing scans what agents write.

The architecture notes record that it is a pane helper outside the
plugin protocol, and the decision record why it opens SQLite directly
and which alternatives were set aside.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
feat(memory): share notes between the agents in one project's panes
fix(viewer): preserve screen on refresh and prepare v0.1.16
@whackur
whackur requested a review from code0xff as a code owner October 7, 2026 10:17
@whackur
whackur merged commit b72b121 into main Oct 7, 2026
12 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.

2 participants