diff --git a/README.md b/README.md index b08b422..f2c1d04 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ A server and macOS app for running many coding agents (Claude Code, Codex and An - **Questions.** Agents ask structured questions with a recommended answer; you answer by clicking. Each question shows in the transcript where it was asked, and clicking it shows it again with your answer. macOS notifications for questions, turn summaries and errors. - **Reviews.** Choose a review workflow for each project. Its reviewers check the task's work after each turn that changes files. Findings go back to the agent, and you can fix or ignore each one. - **Snapshots and forks.** Step through a task's snapshots, diff any of them, and fork a new task from any one, conversation included. -- **Merge.** One click: the agent merges main in and resolves conflicts, then byre squashes, pushes and closes the task, with co-author trailers and a git note recording the task. Merge after review, and one merge per project at a time with a queue. +- **Merge.** One click: the agent merges the default branch in and resolves conflicts, then byre squashes, pushes and closes the task, with co-author trailers and a git note recording the task. Merge after review, and one merge per project at a time with a queue. - **Subtasks and teams.** Agents can spawn subtasks on their own branches and merge them back, or several agents can share one worktree and talk through a board. - **Workflows.** Named graphs of stages, each run as its own task, with fan-out and fan-in. - **TODO.md.** A project's `TODO.md` items show in the Project tab; start or discuss one in a click. diff --git a/docs/macos.md b/docs/macos.md index 053e697..80e5155 100644 --- a/docs/macos.md +++ b/docs/macos.md @@ -27,7 +27,7 @@ Every build is signed for distribution outside the App Store: the team's Develop ## Startup and streams - Startup waits until the app's tailnet node lists the server's node among its peers, not just until it is `Running`: a node starting from libtailscale's netmap cache reports `Running` with no peers before control sends the real netmap, and a dial then waits out the SOCKS proxy's 5 s and is refused, which `URLSession` reports as "bad URL". -- The SSE client splits lines itself, because `AsyncBytes.lines` drops the blank lines that end SSE events. +- `AsyncBytes.lines` drops blank lines, including the ones that end SSE events. - Run byre on this Mac and the Server tab run `byre install` through the user's login shell, since `byre install` copies its `PATH` into the service and the app's own `PATH` from launchd finds none of `claude`, `codex`, `agy` or `npx`. - SwiftUI's window restoration is off, but the scene keeps the id `main` that earlier builds used: AppKit restores their saved window by that id, and SwiftUI then opens no launch window at all when the id names no scene. - The app logs through `os.Logger`: `log show --last 10m --predicate 'subsystem == "run.fc.byre.mac"'` prints it. diff --git a/docs/operations.md b/docs/operations.md index ee2a989..861edf3 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -71,7 +71,6 @@ Vendor setup and protocol quirks are in [Claude Code](claude-protocol.md), [Code - Every agent CLI starts in its own process group, and killing one kills the whole group. Otherwise a launcher that runs the real agent as its child, along with the agent's MCP servers, can keep holding byre's stdout pipe, and the kill waits forever for end of file. - Codex runs with its own home, `codex` under the data directory (`CODEX_HOME`), so the human's `~/.codex/config.toml` (its `notify` program, MCP servers and plugins) doesn't apply and byre's threads stay out of the ChatGPT app's history. That home needs its own login, once: `CODEX_HOME="$HOME/Library/Application Support/byre/codex" codex login`. Until then a Codex turn fails with `401 Unauthorized`, filed as a session error. -- Codex's stdout reader blocks when its event consumer falls behind, so responses queued behind those notifications wait too: the goroutine draining events therefore never waits on a reply itself. - Antigravity uses the user's own login and config (`~/.gemini`), so its conversations show up in the user's own `agy` history. - Claude Code records `--append-system-prompt` on a session's first request and reuses it on resume, so a running session keeps the guidance it started with; the `UserPromptSubmit` hook re-attaches the guidance to every turn so existing sessions see changes. On a fork Claude Code can reuse the system prompt recorded for the source conversation, the source's cwd included, so the hook's copy is what reliably tells a fork where it is. - A Claude `result` with `num_turns` 0, no `result` text and no error, outside an interrupt, isn't a turn end: the CLI emits one on its own, for example after a resume when it reports a background shell left over from the previous process. byre logs `ignored result with no model turns` and keeps the turn running. @@ -81,7 +80,7 @@ Vendor setup and protocol quirks are in [Claude Code](claude-protocol.md), [Code ## Agent behavior - A turn whose final message asks the human something in prose is bounced once, telling the agent to use `ask_human`. For Claude the bounce is a Stop hook that blocks the stop; Claude Code reports the block as a "Stop hook error" notification, which is expected. An agent told explicitly to ask in plain text will refuse the bounce. -- A turn's final message is its summary. There is no report tool: models write a closing recap whatever they are told, so byre uses it rather than asking for a second one. +- A turn that asks a question has no summary; everything the human needs belongs in the question's context. Other turns use their final message as the summary. There is no report tool: models already write a closing recap, so byre uses it rather than asking for a second one. - A review covers the whole task against the default branch, so a newer one makes older ones moot. Findings reach the task's agent together, once the whole review workflow finishes; an individual reviewer finishing is not a completed review. - An audit checks only the newest commit of the default branch, one at a time per project, so it doesn't run on every revision but the newest one is always audited eventually. byre never fetches for an audit, so a commit pushed outside byre is audited only once a byre merge has fetched it. - The lead's `show` is refused for a few seconds after the human moves the pane, and only a refusal arranges the "hold is over" signal, so the lead's prompt tells it to call `show` at once whenever it wants to show something, never holding back in expectation of a refusal. diff --git a/internal/agents/guidance.go b/internal/agents/guidance.go index e0b8f87..ea203e6 100644 --- a/internal/agents/guidance.go +++ b/internal/agents/guidance.go @@ -24,8 +24,8 @@ const guidance = `You are running inside byre. The human reads your work in byre - TODO.md at the repo root is the project's list of work for byre; its format is the read_knowledge article todo-file.` const proseQuestionNudge = "Your final message asks the human something in prose. Ask it with byre's ask_human tool " + - "(context with the choices inline as `- ( ) choice` / `- (*) recommended` or `- [ ] choice` / `- [x] recommended` list items, and question)," + - "then end your turn with a short summary." + "(context with the choices inline as `- ( ) choice` / `- (*) recommended` or `- [ ] choice` / `- [x] recommended` list items, and question), " + + "then end your turn without a summary; put everything the human needs in the question's context." var ( fencedCode = regexp.MustCompile("(?s)```.*?```") diff --git a/mac/Sources/Byre/Changes.swift b/mac/Sources/Byre/Changes.swift index dae4e44..db2de65 100644 --- a/mac/Sources/Byre/Changes.swift +++ b/mac/Sources/Byre/Changes.swift @@ -318,7 +318,7 @@ private struct ChangesHead: View { private var toggle: some View { HStack(spacing: 4) { if model.pinned != nil { - RangeTabButton(label: "Since main", active: model.pinRange == .main) { + RangeTabButton(label: "Since default branch", active: model.pinRange == .main) { model.setPinRange(.main) } RangeTabButton(label: "This step", active: model.pinRange == .step) { @@ -328,7 +328,7 @@ private struct ChangesHead: View { store.pinSnapshot(nil) } } else { - RangeTabButton(label: "Since main", active: model.range == .main) { + RangeTabButton(label: "Since default branch", active: model.range == .main) { model.setRange(.main) } RangeTabButton(label: "This turn", active: model.range == .turn) { diff --git a/site/index.html b/site/index.html index 684e126..467fac5 100644 --- a/site/index.html +++ b/site/index.html @@ -1252,7 +1252,7 @@ footer {
The agent merges main in and resolves conflicts, then byre squashes, pushes and closes the task.
The agent merges the default branch in and resolves conflicts, then byre squashes, pushes and closes the task.