Skip to content

v2.7.0

Choose a tag to compare

@lucascaro lucascaro released this 08 Sep 03:12
· 201 commits to main since this release

Added

  • Claude Code sessions now report their own state instead of relying on
    a guess from terminal output alone. Every session Hive spawns gets
    HIVE_SESSION_ID / HIVE_SOCKET in its environment, and Claude
    sessions get hooks wired through claude --settings that call
    hived hook on prompt submit, turn end, and permission prompts. A
    waiting-for-permission session now shows exactly that — not a guess
    from "no output for two seconds" — and the sidebar/tile glyph and
    tooltip get a real prompt/summary instead of nothing. Falls back to
    the existing heuristic tier automatically when claude predates the
    hooks it needs.
  • Pi sessions now report their own state, the way Claude Code sessions
    already do. Hive ships a small Pi extension with the daemon and loads
    it into every Pi session it spawns, so the sidebar and tile glyphs
    show what Pi is actually doing — working on your prompt, waiting on a
    confirmation, or settled after a reply — with the last thing Pi said
    in the tooltip. Nothing to install: the extension is written to
    Hive's state directory at startup and is inert if you run pi
    yourself. Falls back to the existing heuristic tier if it cannot be
    written.
  • Every session now shows what it is doing. The sidebar row and the grid
    tile header carry a state glyph — working, idle, waiting for you,
    exited — so a screen of ten agents can be read at a glance instead of
    clicked through one at a time. Hovering names the state in words.
    Hive reads the state from what the terminal actually renders, so it
    works for every agent and for plain shells, and a session that is
    waiting on you keeps saying so until you look at it.
  • Ideas in the GUI: ⌘I opens a capture sheet from anywhere — type
    the note, pick idea / bug / feedback, pick the project (the one you
    are working in, prefilled) — and Enter files it and hands focus
    straight back to the terminal. Each project card shows a badge with
    how many ideas are waiting; clicking it, or ⇧⌘I, opens that
    project's inbox, where a row can be edited in place, marked done
    (the note is kept, it just leaves the inbox) or deleted behind a
    confirm. Ideas filed from a session's shell with hived idea add
    show up in the same list, live. Deleting a project now asks before
    it discards the ideas captured for it.
  • Start a session from an idea. Every open note in the inbox gets a
    Start session action: it opens the usual agent launcher with the
    project pinned and an opening prompt built from the note, worktree
    checkbox and all. The prompt is an instruction, not a label — a bug
    asks the agent to reproduce it and find the root cause before
    touching code, an idea asks it to propose a plan first — with your
    note as the subject — and editable right there in the launcher, since
    the note was jotted down mid-task and this is the last moment to
    sharpen it (sharpening it does not change the stored note). Claude and
    Pi receive it as their opening argument, and for them the idea flips to started and links back to its session,
    whose sidebar row carries a small idea glyph. Every other agent gets
    the prompt offered instead of typed in: a bar above the grid
    shows the note with Paste and Dismiss, so you place it once
    you can see the agent is actually ready — Hive cannot tell an agent's
    input box from its startup "do you trust this directory?" gate, and
    you can. Paste drops it in without sending it and links the idea;
    Dismiss leaves the note in the inbox. The plain shell and your own
    custom agents get no prompt at all, and the launcher says so before
    you start.
  • A mis-filed idea can be corrected. The inbox's Edit now opens the
    same sheet you captured it with, so the note, its kind and the
    project it belongs to are all editable — the capture sheet fills the
    project in from whatever session you happened to be in, so getting it
    wrong is ordinary, and deleting and retyping was not a fix.
  • Ideas: capture a note against a project without interrupting what
    you are doing. From inside any Hive session's shell,
    hived idea add "the grid loses focus" files one against that
    session's project (-k bug or -k feedback for the other kinds),
    and hived idea list shows what is waiting — --all for every
    project. Ideas outlive the session that filed them, so closing it
    loses nothing. Deleting a project deletes its ideas, and Hive now
    refuses that delete while any of them are still open rather than
    discarding captured work silently. The ⌘I capture sheet and the
    in-app inbox follow.
  • Hive can now tell you what changed. The gift in the sidebar header opens a
    What's New list — everything that has shipped, grouped by release and newest
    first, plus what is coming next — and carries a dot until you have read the
    current release. It reads the same curated feature list the website shows, is
    bundled with the build, and needs no network.
  • macOS text editing in a session now covers the full set: ⌥⌦ deletes the
    word after the cursor and ⌘⌦ deletes to the end of the line, mirroring the
    ⌥⌫ and ⌘⌫ that already worked. Both chords previously did nothing at all —
    xterm encoded them as \x1b[3;3~ / \x1b[3;9~, which no shell binds.
    The keyboard-shortcuts overlay (⌘/) and the README now list every
    terminal-level editing key, not just some of them.

Changed

  • The menu bar's summary now reads "2 waiting on you" instead of
    "2 need you", and says the same thing the dots beside the sessions
    do. The collapsed project card in the main window uses the same
    wording, so the two surfaces no longer describe the same count
    differently.
  • Hovering a session's state icon, in the sidebar or on a tile, now
    shows what that session was asked to do, the last thing the agent
    said, and whether the state was reported by the agent or guessed from
    its terminal output.
  • Desktop notifications say which kind of answer is wanted: "waiting
    for permission" when an agent is blocked on a yes/no, "waiting for
    input" otherwise.
  • A minimized project chip now shows how many sessions the project holds
    and how many of them are waiting on you, next to the same state icon the
    sidebar rows and grid tiles use — so a minimized project tells you what
    a collapsed one does, including whether a session is waiting for
    permission rather than just waiting.
  • A minimized chip and a collapsed project card now derive "needs you"
    from one shared rule, so the two can no longer disagree. That rule is
    stricter than the old one on both: a session that has exited, or that
    has not finished starting, no longer counts as waiting on you, so a
    stale bell can't outlive the session that raised it.
  • CI is a little faster and its cancellation rules are now correct. The
    Windows leg spent three minutes of every run enabling a Windows media
    codec feature that no test uses, and two pushes to the same pull request
    both ran the full three-platform matrix instead of the first being
    superseded. Developer-facing only — nothing about the app itself changes.
  • On a minimized project chip in the sidebar, the session count is now
    right-aligned instead of sitting next to the project name, with the
    attention badge immediately to its left. Counts line up down the list.

Fixed

  • A session's state glyph no longer gets stuck showing the wrong thing
    when an agent reports two events at almost the same moment. Each
    report arrives on its own connection, so a fast pair could be applied
    out of order and leave a finished session showing "working" (or a
    resolved prompt still showing "waiting") until the next event. Reports
    that arrive late are now ignored in favour of what the daemon already
    knows. Affects Claude and Pi sessions alike.
  • A session whose agent stopped reporting no longer claims the agent
    said it was idle. When Hive falls back to guessing because an agent's
    hooks went quiet, the state icon's tooltip now says "guessed from
    terminal output" instead of continuing to credit the agent for a
    state it never sent.
  • A grid tile's header now shows the same thing its sidebar row does.
    Both read the session the daemon broadcasts, where the header
    previously rendered from a copy refreshed only when the grid was
    rebuilt — so a session could disagree with itself depending on where
    you looked, and a tile's window title could stay blank for a session
    whose tile had been rebuilt or was never attached.
  • Minimized and collapsed projects stay that way across a restart when
    you run more than one Hive daemon. Every GUI process shares one
    webview storage area, so instances attached to different state
    directories were overwriting each other's sidebar state — each launch
    pruned the other's project ids as "projects that no longer exist" and
    emptied the tray. The two keys (hive.minimizedProjects,
    hive.collapsedProjects) are now suffixed with an id derived from the
    daemon's state directory. Your existing sidebar state carries over to
    one instance; the others start from a clean slate once and keep their
    state from then on.
  • The in-app build button no longer fails with "build.sh failed" on
    Apple Silicon Macs. An app launched from Finder inherits only the
    system PATH, which does not include Homebrew's /opt/homebrew prefix or
    a Node version manager's directory, so the build died looking for npm.
    The build script now runs with the PATH the user's own login shell
    reports, probed the way VS Code does it — interactive login shell,
    marker-delimited output, per-shell argument forms. When the toolchain
    still cannot be found, the button now names the missing tool instead
    of reporting a bare "build.sh failed".
  • Hive sets HIVE_RESOLVING_ENVIRONMENT=1 while it asks your shell for
    its PATH. Guard the expensive parts of your shell rc file with it if
    an interactive startup does work you would rather Hive skipped.
  • Restarting Hive no longer risks leaving the daemon unreachable. When
    the old hived shut down while its replacement had already taken
    over the socket path, it could delete the replacement's socket —
    inode numbers get reused, so "is this still my socket?" answered yes
    for a file the old daemon never bound. The dying daemon now asks the
    socket instead of the filesystem, and leaves any socket that is still
    being served alone.
  • Clicking a link in a terminal now only opens http, https and mailto
    URLs. A program could previously print a link labelled with one thing
    that pointed at a local file or another app's URL scheme, and a click
    would launch it.
  • The daemon socket moved out of the shared /tmp into a directory only
    your user can reach — $TMPDIR/hive/ on macOS, $XDG_RUNTIME_DIR/hive/
    on Linux — and Hive now checks that directory's owner and permissions
    before trusting it, whether it is binding to it or dialing it. On a
    shared machine another account could previously plant a fake socket
    there and read everything you typed.
  • Programs running inside a Hive session can now only report their state
    back to Hive and capture ideas for their own project (hived idea). They
    could previously use the same connection to create, attach to or kill
    sessions, remove worktrees, shut the daemon down, or list every session
    you have open. This raises the bar rather than sealing a boundary — an
    agent runs as you and Hive does not sandbox it — so SECURITY.md now says
    so plainly. Requires a daemon restart, which Hive will prompt for after
    the update.
  • hived idea list --all is refused from inside a session, where hived idea list now shows that session's project. --all works from an ordinary
    shell, which it did not before — it needed a session's environment and
    was therefore unreachable in every context the moment the in-session case
    was closed.
  • Hive refuses to start a second daemon against one state directory. The
    old guard was the socket file, which only worked while the socket path
    stayed put; it is now a lock on the state directory itself, which is
    the thing that can only have one writer.
  • Upgrading is handled for you. Because the socket moved, a Hive daemon
    left running from before the update would otherwise have been invisible
    to the new one, and you would have ended up with two of them managing
    the same sessions. The app now finds that older daemon and offers the
    same "restart to finish updating" banner it shows for any out-of-date
    daemon; restarting from there shuts the old one down and starts the new
    one. Nothing to do by hand.
  • The "latest" update channel now checks that the source checkout's
    remote is exactly github.com/lucascaro/hive before pulling and
    building from it. A URL that merely contained that text used to pass.

Security

  • macOS releases are now signed with an Apple Developer ID certificate,
    notarized by Apple, and stapled. A fresh install no longer trips the
    "unidentified developer" warning, and no right-click-Open workaround
    is needed.
  • The in-app updater now refuses any downloaded release that is not
    signed by Hive's Apple Developer team, and says so specifically
    rather than reporting a generic checksum error. Previously the only
    check was a SHA-256 manifest published alongside the download, which
    catches a corrupted transfer but not a tampered one. The installed
    app is left untouched when the check fails.