Repository navigation
Linux port: design doc + TDD implementation roadmap - #2
Conversation
Design doc covers architecture (Rust + GTK4, two-crate structure), Ghostty FFI integration strategy, and multi-model consensus on tech choices. Roadmap breaks MVP into 27 commits across 7 phases, each 100-500 delta lines, totaling ~7,500-9,000 lines for: vertical tabs, split panes, notification rings, session persistence, and drag-reorder. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Multi-stage Dockerfile (core/gtk/terminal targets) validates every phase in Ubuntu containers before merge. CI workflow runs Docker builds on push. Each phase has an explicit Docker gate documented in the roadmap. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Documents cmux socket commands for agent monitoring — read_screen, send_surface, send_key_surface — plus the rule to never use select_workspace and to coordinate via MCP mail instead. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add correct workflow for finding unknown tabs: collect UUIDs via list_surfaces, then try send_surface to confirm — do not try to read first. Document cmux_coder as a surface tab, not a workspace. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
📝 WalkthroughWalkthroughAdds documentation and workspace manifests: extensive BEADS issue-tracking notes in Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3a875b3ba6
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| - `crates/cmux-core/src/workspace.rs` | ||
|
|
||
| Tab: `{ id: TabId, title: String, split_tree: SplitNode, has_notification: bool, order: usize }` | ||
| Workspace: `{ tabs: Vec<Tab>, active_tab: TabId, focused_pane: PaneId }` |
There was a problem hiding this comment.
Allow workspace active_tab to be absent
The roadmap defines Workspace.active_tab as a non-optional TabId, but the same section requires representing an empty workspace ("New workspace has 0 tabs" and closing the last tab leaves no active tab). With a mandatory TabId, implementations following this spec must invent a sentinel/invalid ID or panic when the last tab is removed, which makes core tab lifecycle logic inconsistent and fragile.
Useful? React with 👍 / 👎.
| - `crates/cmux-core/src/session.rs` | ||
|
|
||
| Types: | ||
| - `SessionData { version: u32, tabs: Vec<TabData>, active_tab: TabId }` |
There was a problem hiding this comment.
Make session active_tab optional for empty-session support
The session model requires active_tab: TabId even though this roadmap also calls for round-tripping an empty workspace (0 tabs). That state cannot be serialized/deserialized correctly with a required tab ID, so session save/restore for the empty-workspace case will either fail or persist an invalid identifier.
Useful? React with 👍 / 👎.
|
|
||
| **Surface layout in `cmux: ubuntu` workspace (UUID: D267DC10-B8C2-437C-B481-2AFD3167BA69):** | ||
| - Surface `0` (UUID: `87DB76A9-60A8-43FC-BFC2-51A5DECEA9B8`) = supervisor (cmux) | ||
| - Surface `1` (UUID: `F05FCE84-ECA7-4944-BCAA-7DFFC105D0D9`) = coder (cmux_coder) |
There was a problem hiding this comment.
Hardcoded session-specific UUIDs in agent instructions
Medium Severity
The "Surface layout" section hardcodes ephemeral session-specific UUIDs (e.g., D267DC10-..., 87DB76A9-..., F05FCE84-...) as definitive facts in a version-controlled agent instructions file. These UUIDs are dynamically generated per session and will be stale/wrong after any restart, causing agents following these instructions to reference surfaces that no longer exist.
Additional Locations (1)
There was a problem hiding this comment.
🧹 Nitpick comments (5)
roadmap/DESIGN.md (4)
47-47: Fix redundant phrase."CLI interface" is redundant since "CLI" already stands for "Command Line Interface." Use either "CLI" or "command-line interface."
📝 Suggested fix
-- Socket control / CLI interface +- Socket control / CLI🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@roadmap/DESIGN.md` at line 47, Replace the redundant phrase "Socket control / CLI interface" so it does not repeat "interface": edit the line containing the exact text "Socket control / CLI interface" and change it to either "Socket control / CLI" or "Socket control / command-line interface" to remove redundancy.
89-104: Add language identifier to fenced code block.The ASCII art diagram would benefit from a language identifier for proper rendering.
📝 Suggested fix
-``` +```text ┌─────────────────────────────────────────────┐🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@roadmap/DESIGN.md` around lines 89 - 104, The fenced ASCII diagram block (the diagram showing GtkWindow with Sidebar/Content Area and Tabs like "Tab 2*") needs a language identifier so it renders correctly; update the opening fence from ``` to ```text (or ```ascii) for the block containing the GtkWindow diagram so tools will treat it as preformatted text.
59-82: Add language identifier to fenced code block.The directory tree would benefit from a language identifier for better rendering and accessibility.
📝 Suggested fix
-``` +```text cmux-linux/ crates/🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@roadmap/DESIGN.md` around lines 59 - 82, The fenced code block containing the project directory tree in DESIGN.md lacks a language identifier; update the block that starts with the triple backticks before "cmux-linux/" to use a language tag (e.g., "text") so the tree renders/accessibility is improved—locate the fenced block in roadmap/DESIGN.md and change the opening ``` to ```text.
6-6: Clarify Ubuntu version target.The overview states "Target: Ubuntu 22.04+" but the Docker validation (line 9, line 288) exclusively uses Ubuntu 24.04. Consider either:
- Validating on the minimum supported version (22.04) to ensure compatibility, or
- Updating the target statement to "Ubuntu 24.04+" to match the validation environment.
Testing on the oldest supported version provides stronger compatibility guarantees.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@roadmap/DESIGN.md` at line 6, The DESIGN.md target declaration "Target: Ubuntu 22.04+" conflicts with the Docker validation that only uses Ubuntu 24.04; update either the documentation or the validation so they match: either change the DESIGN.md target string from "Target: Ubuntu 22.04+" to "Target: Ubuntu 24.04+" (search for the exact phrase "Target: Ubuntu 22.04+" in DESIGN.md) or add/restore an Ubuntu 22.04 Docker validation entry (update the Docker validation config used in the repo that currently references Ubuntu 24.04) so the project is explicitly validated on the declared minimum supported version.roadmap/ROADMAP.md (1)
595-603: Add language identifier to fenced code block.The dependency graph would benefit from a language identifier for proper rendering.
📝 Suggested fix
-``` +```text Phase 1 (core data model)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@roadmap/ROADMAP.md` around lines 595 - 603, The fenced code block containing the ASCII dependency graph (the block starting with "Phase 1 (core data model)" and including "Phase 2 (session model)" through "Phase 7 (restore + polish)") needs a language identifier so it renders correctly; update the opening fence from ``` to ```text in ROADMAP.md so the diagram is treated as plain text (e.g., change the code fence around the Phase 1..Phase 7 diagram to ```text).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@roadmap/DESIGN.md`:
- Line 47: Replace the redundant phrase "Socket control / CLI interface" so it
does not repeat "interface": edit the line containing the exact text "Socket
control / CLI interface" and change it to either "Socket control / CLI" or
"Socket control / command-line interface" to remove redundancy.
- Around line 89-104: The fenced ASCII diagram block (the diagram showing
GtkWindow with Sidebar/Content Area and Tabs like "Tab 2*") needs a language
identifier so it renders correctly; update the opening fence from ``` to ```text
(or ```ascii) for the block containing the GtkWindow diagram so tools will treat
it as preformatted text.
- Around line 59-82: The fenced code block containing the project directory tree
in DESIGN.md lacks a language identifier; update the block that starts with the
triple backticks before "cmux-linux/" to use a language tag (e.g., "text") so
the tree renders/accessibility is improved—locate the fenced block in
roadmap/DESIGN.md and change the opening ``` to ```text.
- Line 6: The DESIGN.md target declaration "Target: Ubuntu 22.04+" conflicts
with the Docker validation that only uses Ubuntu 24.04; update either the
documentation or the validation so they match: either change the DESIGN.md
target string from "Target: Ubuntu 22.04+" to "Target: Ubuntu 24.04+" (search
for the exact phrase "Target: Ubuntu 22.04+" in DESIGN.md) or add/restore an
Ubuntu 22.04 Docker validation entry (update the Docker validation config used
in the repo that currently references Ubuntu 24.04) so the project is explicitly
validated on the declared minimum supported version.
In `@roadmap/ROADMAP.md`:
- Around line 595-603: The fenced code block containing the ASCII dependency
graph (the block starting with "Phase 1 (core data model)" and including "Phase
2 (session model)" through "Phase 7 (restore + polish)") needs a language
identifier so it renders correctly; update the opening fence from ``` to ```text
in ROADMAP.md so the diagram is treated as plain text (e.g., change the code
fence around the Phase 1..Phase 7 diagram to ```text).
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 93996fa3-d737-4ae2-ab5b-97d83439fd96
📒 Files selected for processing (3)
CLAUDE.mdroadmap/DESIGN.mdroadmap/ROADMAP.md
There was a problem hiding this comment.
Pull request overview
Adds documentation to guide the planned Linux port (Rust + GTK4 MVP), including a phased TDD roadmap, a design/architecture write-up, and expanded contributor/agent workflow guidance.
Changes:
- Added a detailed phased implementation roadmap for the Linux MVP (
roadmap/ROADMAP.md). - Added a design document covering architecture, dependencies, testing, and Docker validation strategy (
roadmap/DESIGN.md). - Updated agent/contributor guidance with bd (beads) issue-tracking workflow and socket-steering notes (
CLAUDE.md).
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 12 comments.
| File | Description |
|---|---|
| roadmap/ROADMAP.md | New, detailed phase-by-phase TDD implementation roadmap and Docker validation gates. |
| roadmap/DESIGN.md | New design doc describing architecture, Ghostty/VTE approach, dependencies, testing, and Docker/CI strategy. |
| CLAUDE.md | Adds bd/beads issue-tracking workflow guidance plus socket-control operational notes for agents. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| - Exports to `.beads/issues.jsonl` after changes (5s debounce) | ||
| - Imports from JSONL when newer (e.g., after `git pull`) |
There was a problem hiding this comment.
CLAUDE.md states bd auto-syncs to .beads/issues.jsonl, but there is no .beads/ directory in the repo currently. If bd is being introduced, consider adding the directory (and documenting it) or adjusting this section to reflect the current on-disk location/config.
| - Exports to `.beads/issues.jsonl` after changes (5s debounce) | |
| - Imports from JSONL when newer (e.g., after `git pull`) | |
| - Exports issues to a JSONL file in the bd data directory (see `bd config show`) after changes (5s debounce) | |
| - (Optional convention) You can configure bd to use `.beads/issues.jsonl`; if you do, ensure the `.beads/` directory exists in your repo | |
| - Imports from that JSONL file when newer (e.g., after `git pull`) |
| # cmux Linux MVP — TDD Implementation Roadmap | ||
|
|
||
| Each commit is 100–500 delta lines. Tests written first (red), then | ||
| implementation (green). Ordered by dependency. |
There was a problem hiding this comment.
PR description claims cmux-core implementation with 90 passing tests and session persistence code, but this PR’s diff appears to add only roadmap/design documentation. Please either update the PR description to match the actual changes, or include the referenced code/test changes in this PR.
| ## Overview | ||
|
|
||
| A Ghostty-based Linux terminal with vertical tabs, split panes, and notification | ||
| rings. Built with Rust + GTK4. Target: Ubuntu 22.04+. |
There was a problem hiding this comment.
DESIGN.md says the target is “Ubuntu 22.04+”, but this PR’s Docker validation section and roadmap consistently use Ubuntu 24.04. Please align the stated supported target (or explicitly call out “validated on 24.04, expected to work on 22.04+”).
| rings. Built with Rust + GTK4. Target: Ubuntu 22.04+. | |
| rings. Built with Rust + GTK4. Target: Ubuntu 22.04+ (validated on Ubuntu 24.04). |
| | **core** | 1–2 | `rust:1.80-bookworm` | None (pure Rust, no GUI) | | ||
| | **gtk** | 3, 5, 7 | Ubuntu 24.04 | `libgtk-4-dev`, `xvfb` | | ||
| | **terminal** | 4, 6 | Ubuntu 24.04 | Above + `libghostty` (or `libvte-2.91-gtk4-dev` fallback), `zig` | |
There was a problem hiding this comment.
The “Container tiers” table says the core tier base image is rust:1.80-bookworm, but the Dockerfile example immediately below uses ubuntu:24.04 AS base and derives core from that. Please reconcile the table vs the example so readers don’t implement the wrong container setup.
| | **core** | 1–2 | `rust:1.80-bookworm` | None (pure Rust, no GUI) | | |
| | **gtk** | 3, 5, 7 | Ubuntu 24.04 | `libgtk-4-dev`, `xvfb` | | |
| | **terminal** | 4, 6 | Ubuntu 24.04 | Above + `libghostty` (or `libvte-2.91-gtk4-dev` fallback), `zig` | | |
| | **core** | 1–2 | `ubuntu:24.04` | None (pure Rust, no GUI) | | |
| | **gtk** | 3, 5, 7 | `ubuntu:24.04` | `libgtk-4-dev`, `xvfb` | | |
| | **terminal** | 4, 6 | `ubuntu:24.04` | Above + `libghostty` (or `libvte-2.91-gtk4-dev` fallback), `zig` | |
| | Phase | Commits | Delta Lines | Docker Target | Running Total | | ||
| |---|---|---|---|---| | ||
| | 1. Skeleton + Core Model | 1–5 | ~1,350 | `core` | ~1,350 | | ||
| | 2. Session Persistence | 6–7 | ~450 | `core` | ~1,800 | | ||
| | 3. GTK Window + Sidebar | 8–12 | ~1,350 | `gtk` | ~3,150 | |
There was a problem hiding this comment.
This summary table starts rows with ||, which produces an empty first column in GitHub markdown. Use a single leading | (and matching separator row) to avoid a blank column.
| | Option | Reason rejected | | ||
| |---|---| | ||
| | Zig + GTK4 | Experimental bindings, no high-level UI crates, thin ecosystem | | ||
| | C++ + Qt | Meta-object system overhead, larger binary, more manual memory management | | ||
| | Python + GTK4 | 2-3x slower per-character rendering, no compile-time safety | | ||
| | Fork Wezterm | Divergent terminal engine (not Ghostty), large existing codebase to learn | | ||
|
|
There was a problem hiding this comment.
These markdown tables start with || (double pipe), which renders an empty first column in GitHub-flavored markdown. If that’s not intentional, switch to a single leading | so the table has the expected columns.
| 1. **Build libghostty as a shared library** — use `zig build -Demit-xcframework=true` | ||
| equivalent for Linux (emit `.so`) |
There was a problem hiding this comment.
This suggests using zig build -Demit-xcframework=true “equivalent for Linux” to produce a .so. An XCFramework is an Apple packaging format, so this is likely to confuse Linux build instructions. Please replace with the actual Ghostty/Linux shared-library build flags/steps (or remove the xcframework mention).
| 1. **Build libghostty as a shared library** — use `zig build -Demit-xcframework=true` | |
| equivalent for Linux (emit `.so`) | |
| 1. **Build libghostty as a shared library (.so)** — configure the Ghostty Zig | |
| build for Linux to emit a shared object (`.so`) exposing the C API |
| for Dockerfile and CI setup. Three container tiers: | ||
| - `core` — pure Rust, no GUI deps (Phases 1–2) | ||
| - `gtk` — adds libgtk-4-dev + xvfb (Phases 3, 5, 7) | ||
| - `terminal` — adds libghostty/VTE + zig (Phases 4, 6) |
There was a problem hiding this comment.
ROADMAP says the terminal Docker tier adds “libghostty/VTE + zig”, but the Dockerfile in DESIGN.md currently installs only libvte-2.91-gtk4-dev and does not install zig or Ghostty. Please align the roadmap’s stated dependencies with the current Docker plan (or explicitly note zig/Ghostty as TODOs here too).
| - `terminal` — adds libghostty/VTE + zig (Phases 4, 6) | |
| - `terminal` — adds libvte-2.91-gtk4-dev (Phases 4, 6); TODO: extend Docker `terminal` stage with zig + Ghostty per DESIGN.md |
| - ❌ Do NOT use external issue trackers | ||
| - ❌ Do NOT duplicate tracking systems | ||
|
|
||
| For more details, see README.md and docs/QUICKSTART.md. |
There was a problem hiding this comment.
This references docs/QUICKSTART.md and suggests “see README.md” for beads details, but neither appears to exist / mention beads in the repo right now. Either add the referenced docs (and a README section) or update these pointers to the actual location of bd/beads documentation.
| For more details, see README.md and docs/QUICKSTART.md. | |
| For more details on bd usage, run `bd --help` and consult your project’s documentation. |
| - ❌ Do NOT create markdown TODO lists | ||
| - ❌ Do NOT use external issue trackers | ||
| - ❌ Do NOT duplicate tracking systems | ||
|
|
There was a problem hiding this comment.
This says “Do NOT use markdown TODOs / task lists” for issue tracking, but the repo currently contains TODO.md and .todo.md-style docs (e.g. docs/socket-focus-steal-audit.todo.md). Please clarify whether these are legacy/allowed, or plan to migrate/remove them, so contributors aren’t left with conflicting guidance.
| Note: Existing `TODO.md` / `*.todo.md` docs in this repo are legacy and are being migrated into bd issues or removed. Do not create new markdown TODO files or extend the existing ones; use bd instead. |
|
@CodeRabbit-ai @greptileai @BugBot @copilot Summary (Review Flow):
PR Details:
Instructions: Tasks:
🎯 REQUIRED OUTPUT FORMAT (MANDATORY): Your response MUST follow this exact structure for clarity: ## ✅ AUTOMATION COMPLETE — [STATUS: READY FOR MERGE / NEEDS WORK / BLOCKED]
**Verified at commit `3a875b3b` (3a875b3ba6213e5b3b4e6fae1ecfbacf110c7610)**
---
## 📊 Current Status: **[PERFECT/ISSUES FOUND]** [✅/⚠️/❌]
| Category | Status |
|----------|--------|
| **CI Checks** | [✅ X/Y PASSING / ❌ FAILING] |
| **Merge Status** | [✅ CLEAN / ❌ CONFLICTS] |
| **PR State** | [✅ MERGEABLE / ❌ BLOCKED] |
| **Comments Addressed** | [✅ ALL DONE / ⚠️ X UNRESOLVED] |
| **Code Quality** | [✅ GOOD / ⚠️ ISSUES] |
---
## 🎯 Comment Resolution Summary
[List each outstanding comment and whether it was addressed - check for code fixes OR consolidated response summary]
---
## 🚀 **FINAL VERDICT: [APPROVE / REQUEST CHANGES / BLOCKED]**
[Brief explanation of decision]
---
🐰 [Sign-off emoji and message]IMPORTANT: Do NOT include raw script execution output or analysis chain details in your response. Only provide the clean formatted summary above. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 11515
✅ AUTOMATION COMPLETE — STATUS: NEEDS WORKVerified at commit 📊 Current Status: ISSUES FOUND
|
| Category | Status |
|---|---|
| CI Checks | ✅ 4/4 PASSING (Cursor Bugbot: ⚪ NEUTRAL) |
| Merge Status | ✅ CLEAN |
| PR State | ✅ MERGEABLE |
| Comments Addressed | |
| Code Quality |
🎯 Comment Resolution Summary
No [AI responder] Consolidated Comment Response Summary was found, and no code changes addressing the review comments were detected. All comments below remain open:
🔴 P1 — ChatGPT Codex (design correctness)
| # | Comment | Status |
|---|---|---|
| 1 | Workspace.active_tab must be Option<TabId> to support empty workspaces |
❌ Unresolved |
| 2 | Session JSON active_tab must be optional to allow round-tripping empty-tab state |
❌ Unresolved |
🟡 Medium — Cursor Bugbot
| # | Comment | Status |
|---|---|---|
| 3 | Hardcoded ephemeral session UUIDs (D267DC10-…, etc.) baked into version-controlled agent instructions |
❌ Unresolved |
🟡 Copilot — Documentation Correctness
| # | Comment | Status |
|---|---|---|
| 4 | PR description claims 90 passing tests + session persistence code, but diff contains only documentation | ❌ Unresolved |
| 5 | Ubuntu target says "22.04+" in DESIGN.md but Docker section/roadmap consistently use 24.04 — versions unaligned | ❌ Unresolved |
| 6 | Container tiers table says rust:1.80-bookworm as core base; Dockerfile example uses ubuntu:24.04 — inconsistent |
❌ Unresolved |
| 7 | cbindgen described as generating safe Rust wrappers — incorrect; cbindgen generates C headers from Rust; should be bindgen + manual safe wrapper |
❌ Unresolved |
| 8 | zig build -Demit-xcframework=true described as Linux equivalent — xcframework is an Apple-only format; incorrect for Linux .so build |
❌ Unresolved |
| 9 | terminal Docker tier listed as adding zig/Ghostty, but Dockerfile installs only libvte-2.91-gtk4-dev with no zig/Ghostty — misaligned |
❌ Unresolved |
| 10 | Multiple markdown tables use || (double leading pipe), rendering a blank first column on GitHub |
❌ Unresolved |
| 11 | .beads/ directory referenced in CLAUDE.md but does not exist in repo |
❌ Unresolved |
| 12 | docs/QUICKSTART.md and README beads section referenced but neither exists |
❌ Unresolved |
| 13 | "Do NOT use markdown TODOs" conflicts with existing TODO.md / .todo.md files in repo |
❌ Unresolved |
🔵 Nitpicks — CodeRabbit
| # | Comment | Status |
|---|---|---|
| 14–18 | 5 nitpick comments in roadmap/DESIGN.md (e.g., redundant "CLI interface" phrase and others) |
❌ Unresolved |
🚀 FINAL VERDICT: REQUEST CHANGES
The PR is technically clean (mergeable, all CI green), but approximately 20 open review comments remain unaddressed with no consolidated response summary provided. Two P1-level design gaps (empty workspace/session active_tab optionality) and one medium-severity issue (hardcoded ephemeral UUIDs in version-controlled instructions) require resolution or explicit acknowledgment before merge. Several documentation inconsistencies (Ubuntu version, Docker tier table vs Dockerfile, incorrect tool descriptions) also need correction or documented rationale.
To unblock: either fix the flagged items in code/docs, or post a [AI responder] Consolidated Comment Response Summary addressing each comment with a Re: [Comment #<id>] reference.
🐰 Reviewed by CodeRabbit — keeping your codebase clean, one paw at a time.
Documents cmux-core daemon + ascii/web/gtk4 client strategy for the Linux port. Includes architecture diagram, socket protocol summary, and relationship to macOS cmux socket API. Full spec in cmux_ubuntu repo at roadmap/multi-client.md. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (1)
roadmap/DESIGN.md (1)
59-82: Add fence languages to the unlabeled code blocks.These blocks are currently tripping markdownlint (
MD040). Usetextfor the tree/ASCII diagrams so the document stays lint-clean.Also applies to: 89-104, 390-402
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@roadmap/DESIGN.md` around lines 59 - 82, The unlabeled fenced code blocks containing ASCII/tree diagrams (e.g., the block showing cmux-linux/ with crates/ and files like split_tree.rs, split_nav.rs, tab.rs, workspace.rs, notification.rs, session.rs, config.rs, cmux-gtk/ with main.rs, window.rs, sidebar.rs, etc.) are triggering markdownlint MD040; fix by adding the fence language "text" to those triple-backtick blocks (replace ``` with ```text) wherever they appear (notably the block around the cmux-linux tree and the other ranges called out) so the diagrams are treated as plain text.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@roadmap/DESIGN.md`:
- Around line 149-154: Update the Workspace model and session schema to make
active_tab optional: change the Workspace struct field active_tab from TabId to
Option<TabId> (and update any related types/parsing/serialization for Workspace
and session handling to accept null), and update the JSON examples to show
"active_tab": null for empty workspaces; ensure any validation or round-trip
persistence logic that references Workspace::active_tab or Session.active_tab
handles the None/null case gracefully.
- Around line 5-6: The document currently mixes Ubuntu 22.04 and 24.04
references (overview line, validation plan, Dockerfile, and tier table). Choose
one target (e.g., Ubuntu 24.04) and update the overview sentence, the validation
plan, the example Dockerfile references, and the tier table entries so they
consistently state the same supported Ubuntu version; also make the `core` tier
image reference consistent with the Dockerfile by replacing `rust:1.80-bookworm`
or `ubuntu:24.04` as needed so every place (overview, "validation plan",
"Dockerfile", and the `core` tier row) uses the single agreed-upon
distro/version string.
- Around line 15-16: Replace the incorrect recommendation of "cbindgen" with
"bindgen" and update the explanatory text so it states that bindgen generates
Rust FFI bindings from C headers while cbindgen generates C headers from Rust
(reference the token "cbindgen" -> change to "bindgen" and adjust the
explanatory sentence accordingly); also edit the Linux build guidance that
currently references "xcframework" and Apple terminology—replace that phrasing
with a clear statement that Zig produces standard Linux shared objects (".so")
using normal build-system configuration and remove the Apple/xcframework example
(update the "Zig GTK bindings" / Linux shared-library paragraph to describe
producing .so files and linking via usual Linux toolchain flags).
---
Nitpick comments:
In `@roadmap/DESIGN.md`:
- Around line 59-82: The unlabeled fenced code blocks containing ASCII/tree
diagrams (e.g., the block showing cmux-linux/ with crates/ and files like
split_tree.rs, split_nav.rs, tab.rs, workspace.rs, notification.rs, session.rs,
config.rs, cmux-gtk/ with main.rs, window.rs, sidebar.rs, etc.) are triggering
markdownlint MD040; fix by adding the fence language "text" to those
triple-backtick blocks (replace ``` with ```text) wherever they appear (notably
the block around the cmux-linux tree and the other ranges called out) so the
diagrams are treated as plain text.
| A Ghostty-based Linux terminal with vertical tabs, split panes, and notification | ||
| rings. Built with Rust + GTK4. Target: Ubuntu 22.04+. |
There was a problem hiding this comment.
Align the supported Ubuntu version with the validation environment.
The overview says "Ubuntu 22.04+" but the validation plan, Dockerfile, and package list are all written around Ubuntu 24.04. Separately, the tier table says core uses rust:1.80-bookworm while the example Dockerfile builds every tier from ubuntu:24.04. Pick one support/validation matrix and state it consistently.
Also applies to: 270-319
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@roadmap/DESIGN.md` around lines 5 - 6, The document currently mixes Ubuntu
22.04 and 24.04 references (overview line, validation plan, Dockerfile, and tier
table). Choose one target (e.g., Ubuntu 24.04) and update the overview sentence,
the validation plan, the example Dockerfile references, and the tier table
entries so they consistently state the same supported Ubuntu version; also make
the `core` tier image reference consistent with the Dockerfile by replacing
`rust:1.80-bookworm` or `ubuntu:24.04` as needed so every place (overview,
"validation plan", "Dockerfile", and the `core` tier row) uses the single
agreed-upon distro/version string.
| - Rust's `unsafe` FFI to Ghostty's C API is well-supported; `cbindgen` can generate safe wrappers | ||
| - Zig GTK bindings are experimental/unstable — not ready for production |
There was a problem hiding this comment.
🧩 Analysis chain
🌐 Web query:
Official documentation for cbindgen vs bindgen responsibilities, and official Zig build guidance for producing shared libraries on Linux instead of xcframeworks
💡 Result:
cbindgen vs bindgen (what each is responsible for)
cbindgen(Rust → C/C++ headers): generates C/C++11 header files from a Rust crate that exposes a public C ABI. [1]bindgen/rust-bindgen(C/C++ headers → Rust): takes a C/C++ header and generates Rust FFI declarations/types so Rust can call into that native library. [2][3]
Practical rule of thumb:
- If you’re shipping a Rust library to be consumed by C/C++, use cbindgen to emit the
.h. [1] - If you’re calling a C/C++ library from Rust, use bindgen to emit the Rust
extern "C"surface/types. [2][3]
Official Zig guidance: producing Linux shared libraries (.so) (not XCFrameworks)
A) Using build.zig / zig build (recommended “official” build-system path)
Zig’s official build-system docs show creating a dynamic library by building a library artifact with dynamic linkage and installing it (Linux output becomes .so in zig-out/lib). [4][5]
Also note: recent Zig versions consolidated APIs—addLibrary replaces older addSharedLibrary/addStaticLibrary, and you choose .linkage (e.g., .dynamic). [6]
B) Using the CLI directly
Zig’s official language documentation shows building a dynamic library with:
zig build-lib ... -dynamic(on Linux this produces a shared library, i.e. a.so). [7]
Sources
[1] mozilla/cbindgen (README): what cbindgen generates and for what purpose: C/C++ headers from Rust public C API. (github.com)
[2] docs.rs bindgen: header-in → Rust FFI out description. (docs.rs)
[3] rust-lang/rust-bindgen (GitHub): “Automatically generates Rust FFI bindings to C (and some C++) libraries.” (github.com)
[4] Zig “Build System” (official): dynamic library example via build system. (ziglang.org)
[5] Zig “Build System” (official, RU page snippet shows the dynamic library example and resulting .so files in zig-out/lib). (ziglang.org)
[6] Zig 0.14.0 release notes (official): addLibrary replaces addSharedLibrary/addStaticLibrary, linkage selectable. (ziglang.org)
[7] Zig documentation (official): zig build-lib ... -dynamic usage. (ziglang.org)
Citations:
- 1: https://github.com/mozilla/cbindgen?utm_source=openai
- 2: https://docs.rs/bindgen?utm_source=openai
- 3: https://github.com/rust-lang/rust-bindgen?utm_source=openai
- 4: https://ziglang.org/learn/build-system/?utm_source=openai
- 5: https://ziglang.org/ru-RU/learn/build-system/?utm_source=openai
- 6: https://ziglang.org/download/0.14.0/release-notes.html?utm_source=openai
- 7: https://ziglang.org/documentation/0.11.0/?utm_source=openai
🏁 Script executed:
# Find and read the design file to verify the issues
fd "DESIGN.md" -t f | head -1 | xargs wc -l
# Read around line 15-16
fd "DESIGN.md" -t f | head -1 | xargs sed -n '10,20p'
# Read around line 180-182
fd "DESIGN.md" -t f | head -1 | xargs sed -n '175,185p'Repository: jleechanorg/cmux
Length of output: 1340
Use bindgen (not cbindgen) for Rust FFI to Ghostty's C API, and clarify Linux shared-library build guidance.
Line 15 incorrectly recommends cbindgen for consuming Ghostty's C API from Rust. Use bindgen instead—cbindgen generates C headers from Rust, while bindgen generates Rust FFI bindings from C headers.
Lines 180–182 introduce Apple-specific xcframework terminology while describing the Linux build path, creating confusion. Zig on Linux produces .so files via standard build-system configuration, not xcframework equivalents.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@roadmap/DESIGN.md` around lines 15 - 16, Replace the incorrect recommendation
of "cbindgen" with "bindgen" and update the explanatory text so it states that
bindgen generates Rust FFI bindings from C headers while cbindgen generates C
headers from Rust (reference the token "cbindgen" -> change to "bindgen" and
adjust the explanatory sentence accordingly); also edit the Linux build guidance
that currently references "xcframework" and Apple terminology—replace that
phrasing with a clear statement that Zig produces standard Linux shared objects
(".so") using normal build-system configuration and remove the Apple/xcframework
example (update the "Zig GTK bindings" / Linux shared-library paragraph to
describe producing .so files and linking via usual Linux toolchain flags).
| ```rust | ||
| struct Workspace { | ||
| tabs: Vec<Tab>, | ||
| active_tab: TabId, | ||
| focused_pane: PaneId, | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major
Make active_tab optional in both the model and session schema.
As written, an empty tabs list cannot be represented without inventing a bogus active_tab, so empty workspaces will not round-trip cleanly through persistence. The doc should model active_tab as optional here and in the JSON example.
Proposed doc fix
struct Workspace {
tabs: Vec<Tab>,
- active_tab: TabId,
+ active_tab: Option<TabId>,
focused_pane: PaneId,
} {
"version": 1,
"tabs": [
{
"id": "uuid",
"title": "my-server",
"order": 0,
"split_tree": {
"type": "split",
"direction": "horizontal",
"ratio": 0.5,
"first": { "type": "leaf", "cwd": "/home/user/project" },
"second": { "type": "leaf", "cwd": "/home/user" }
}
}
],
- "active_tab": "uuid"
+ "active_tab": "uuid"
}For the empty-session case, document "active_tab": null as the valid representation.
Also applies to: 232-252
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@roadmap/DESIGN.md` around lines 149 - 154, Update the Workspace model and
session schema to make active_tab optional: change the Workspace struct field
active_tab from TabId to Option<TabId> (and update any related
types/parsing/serialization for Workspace and session handling to accept null),
and update the JSON examples to show "active_tab": null for empty workspaces;
ensure any validation or round-trip persistence logic that references
Workspace::active_tab or Session.active_tab handles the None/null case
gracefully.
|
@codex @coderabbitai @cursor @copilot [AI automation] Codex will implement the code updates while coderabbitai, cursor, and copilot focus on review support. Please make the following changes to this PR. Summary (Execution Flow):
PR Details:
Instructions: Tasks:
Automation Markers:
|
|
To use Codex here, create an environment for this repo. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 15402
✅ AUTOMATION COMPLETE — STATUS: NEEDS WORKVerified at commit 📊 Current Status: ISSUES FOUND
|
| Category | Status |
|---|---|
| CI Checks | ⚪ Cursor Bugbot IN_PROGRESS / ✅ CodeRabbit SUCCESS |
| Merge Status | ✅ CLEAN (mergeable: true) |
| PR State | |
| Comments Addressed | |
| Codex Environment | ❌ NOT CONFIGURED — Codex cannot push fixes until environment is set up |
🎯 Comment Resolution Summary — Full Breakdown for Codex
🔴 P1 — Design Correctness (roadmap/ROADMAP.md + roadmap/DESIGN.md)
| # | File | Line | Author | Issue | Fix Required |
|---|---|---|---|---|---|
| 1 | roadmap/ROADMAP.md |
106 | chatgpt-codex | Workspace.active_tab defined as non-optional TabId, but empty workspaces (0 tabs) are required |
Change to active_tab: Option<TabId> in model docs |
| 2 | roadmap/ROADMAP.md |
138 | chatgpt-codex | Session JSON active_tab is required, breaking round-trip for empty workspace |
Make active_tab optional in session schema example |
| 3 | roadmap/DESIGN.md |
154 | coderabbitai | Same issue — active_tab in session JSON example must be null-able |
Update session JSON example to use "active_tab": null |
🟡 Medium — CLAUDE.md
| # | File | Line | Author | Issue | Fix Required |
|---|---|---|---|---|---|
| 4 | CLAUDE.md |
423 | cursor[bot] | Hardcoded ephemeral session UUIDs (D267DC10-…, 87DB76A9-…, F05FCE84-…) baked into version-controlled agent instructions |
Replace with placeholder examples (e.g., <WINDOW-UUID>) |
🟡 Medium — Documentation Correctness
| # | File | Line | Author | Issue | Fix Required |
|---|---|---|---|---|---|
| 5 | roadmap/ROADMAP.md |
4 | Copilot | PR description claims 90 passing tests + session persistence code, but diff is docs-only | Update PR description or add code/tests to this PR |
| 6 | roadmap/DESIGN.md |
6 | Copilot / coderabbitai | Overview says "Ubuntu 22.04+" but Docker/validation sections use 24.04 | Change to "Ubuntu 22.04+ (validated on Ubuntu 24.04)" |
| 7 | roadmap/DESIGN.md |
15 | Copilot / coderabbitai | cbindgen described as generating safe Rust wrappers — incorrect. cbindgen generates C headers from Rust; bindgen generates Rust bindings from C |
Replace cbindgen with bindgen in this context |
| 8 | roadmap/DESIGN.md |
181 | Copilot / coderabbitai | zig build -Demit-xcframework=true referenced as Linux equivalent — xcframework is Apple-only |
Replace with correct Linux .so build flag/steps (e.g., zig build -Dshared=true) |
| 9 | roadmap/DESIGN.md |
281 | Copilot | Container tiers table lists rust:1.80-bookworm as the core base, but the Dockerfile example uses ubuntu:24.04 |
Reconcile — either update the table to ubuntu:24.04 or align the Dockerfile |
| 10 | roadmap/ROADMAP.md |
13 | Copilot | terminal Docker tier says it adds zig/Ghostty, but DESIGN.md Dockerfile only installs libvte-2.91-gtk4-dev |
Add # TODO: extend with zig/Ghostty note or align roadmap text |
| 11 | CLAUDE.md |
288 | Copilot | References .beads/issues.jsonl auto-sync but .beads/ directory doesn't exist in repo |
Add .beads/.gitkeep + docs, or update description to bd config show |
| 12 | CLAUDE.md |
301 | Copilot | References docs/QUICKSTART.md and "see README.md for beads" — neither exists |
Remove broken references or create the referenced docs |
| 13 | CLAUDE.md |
300 | Copilot | "Do NOT use markdown TODOs" conflicts with existing TODO.md / *.todo.md files in repo |
Add clarification: "Existing *.todo.md files are legacy; new work should use bd" |
🔵 Markdown Formatting — Double Pipe || Tables
| # | File | Line | Author | Issue | Fix Required |
|---|---|---|---|---|---|
| 14 | roadmap/DESIGN.md |
28 | Copilot | Table rows start with || → blank first column on GitHub |
Change ` |
| 15 | CLAUDE.md |
403 | Copilot | Same double-pipe issue | Same fix |
| 16 | roadmap/ROADMAP.md |
586 | Copilot | Same double-pipe issue | Same fix |
🔵 Nitpicks — roadmap/DESIGN.md (CodeRabbit)
| # | File | Issue | Fix |
|---|---|---|---|
| 17 | roadmap/DESIGN.md L47 |
"CLI interface" is redundant (CLI = Command Line Interface) | Change to just "CLI" |
| 18–21 | roadmap/DESIGN.md (various) |
4 additional nitpick suggestions (fence languages on unlabeled code blocks, minor phrasing) | Add language hints to fenced blocks; apply phrasing fixes |
🚀 FINAL VERDICT: REQUEST CHANGES
All 18 comments remain unaddressed. Immediate actions needed:
- Configure Codex environment at https://chatgpt.com/codex/settings/environments so automation can push fixes.
- P1 fixes (items 1–3): Update
active_tabtoOption<TabId>in model docs and session JSON example. - Medium fixes (items 4–13): Correct tool names (
cbindgen→bindgen), remove Apple-onlyxcframeworkreference, fix UUID placeholder, resolve broken doc references, align Ubuntu/Docker versions. - Formatting fixes (items 14–16): Replace all
||double-pipe table rows with single|. - Post
[AI responder] Consolidated Comment Response SummarywithRe: [Comment #<id>]references once fixes are pushed.
🐰 Review support complete — ready to re-review once fixes are pushed.
Adds the Rust workspace definition for the Linux port living alongside the macOS app. cmux-core/ is the shared-logic crate (source lives in cmux_ubuntu repo). Also gitignores .claude/scheduled_tasks.lock. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@Cargo.toml`:
- Line 10: The Cargo.toml repository field is pointing to "manaflow-ai/cmux" but
this PR targets "jleechanorg/cmux"; update the repository = "... " value in
Cargo.toml to the canonical repository URL for this project (replace the current
"manaflow-ai/cmux" string with the correct "jleechanorg/cmux" URL) so tooling
and docs reference the correct upstream; ensure the new URL is a valid HTTPS
GitHub repo link.
- Line 2: The workspace declaration in Cargo.toml lists a non-existent member
"cmux-gtk", which breaks cargo; either remove "cmux-gtk" from the members array
in Cargo.toml or create a new crate directory named cmux-gtk with its own
Cargo.toml (including package name = "cmux-gtk") so the workspace can find it;
update the members = ["cmux-core", "cmux-gtk"] entry accordingly and run cargo
metadata/build to verify the manifest is resolvable.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 4da0bdc8-341b-4b9a-a3c3-7c379a7e9cba
📒 Files selected for processing (3)
.gitignoreCargo.tomlcmux-core/Cargo.toml
✅ Files skipped from review due to trivial changes (1)
- .gitignore
| @@ -0,0 +1,10 @@ | |||
| [workspace] | |||
| members = ["cmux-core", "cmux-gtk"] | |||
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check if cmux-gtk directory and Cargo.toml exist
echo "Checking for cmux-gtk crate..."
if [ -d "cmux-gtk" ] && [ -f "cmux-gtk/Cargo.toml" ]; then
echo "cmux-gtk exists:"
cat cmux-gtk/Cargo.toml
else
echo "cmux-gtk directory or Cargo.toml not found"
fd -t d "cmux-gtk" .
fiRepository: jleechanorg/cmux
Length of output: 133
🏁 Script executed:
echo "=== Root directory structure ==="
ls -la | head -20
echo -e "\n=== Full Cargo.toml ==="
cat -n Cargo.toml
echo -e "\n=== Checking for cmux-core ==="
if [ -d "cmux-core" ] && [ -f "cmux-core/Cargo.toml" ]; then
echo "cmux-core EXISTS"
else
echo "cmux-core NOT FOUND"
fiRepository: jleechanorg/cmux
Length of output: 1651
🏁 Script executed:
echo "=== .gitmodules content ==="
cat .gitmodules
echo -e "\n=== Git submodule status ==="
git config --file=.gitmodules --name-only --get-regexp path
echo -e "\n=== All directories in repo ==="
find . -maxdepth 1 -type d | sort
echo -e "\n=== Attempting cargo check to see actual error ==="
cargo metadata --format-version=1 2>&1 | grep -A 5 "cmux-gtk" || echo "No cmux-gtk error in metadata"Repository: jleechanorg/cmux
Length of output: 886
Workspace member cmux-gtk does not exist.
The Cargo.toml declares cmux-gtk as a workspace member on line 2, but the directory is not present in the repository. This will cause cargo build to fail with a manifest-not-found error. Either remove cmux-gtk from the members list or create the crate directory with a valid Cargo.toml.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@Cargo.toml` at line 2, The workspace declaration in Cargo.toml lists a
non-existent member "cmux-gtk", which breaks cargo; either remove "cmux-gtk"
from the members array in Cargo.toml or create a new crate directory named
cmux-gtk with its own Cargo.toml (including package name = "cmux-gtk") so the
workspace can find it; update the members = ["cmux-core", "cmux-gtk"] entry
accordingly and run cargo metadata/build to verify the manifest is resolvable.
| edition = "2021" | ||
| authors = ["cmux team"] | ||
| license = "MIT" | ||
| repository = "https://github.com/manaflow-ai/cmux" |
There was a problem hiding this comment.
Repository URL may be inconsistent with actual repo.
The repository field points to manaflow-ai/cmux, but this PR appears to be opened against jleechanorg/cmux. Ensure the URL reflects the canonical repository location to avoid confusion for users and tooling (e.g., cargo-deny, documentation generators).
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@Cargo.toml` at line 10, The Cargo.toml repository field is pointing to
"manaflow-ai/cmux" but this PR targets "jleechanorg/cmux"; update the repository
= "... " value in Cargo.toml to the canonical repository URL for this project
(replace the current "manaflow-ai/cmux" string with the correct
"jleechanorg/cmux" URL) so tooling and docs reference the correct upstream;
ensure the new URL is a valid HTTPS GitHub repo link.
|
@CodeRabbit-ai @greptileai @BugBot @copilot Summary (Review Flow):
PR Details:
Instructions: Tasks:
🎯 REQUIRED OUTPUT FORMAT (MANDATORY): Your response MUST follow this exact structure for clarity: ## ✅ AUTOMATION COMPLETE — [STATUS: READY FOR MERGE / NEEDS WORK / BLOCKED]
**Verified at commit `0427582c` (0427582cf0c3b5cc1f071e3b1e884e21988dd79d)**
---
## 📊 Current Status: **[PERFECT/ISSUES FOUND]** [✅/⚠️/❌]
| Category | Status |
|----------|--------|
| **CI Checks** | [✅ X/Y PASSING / ❌ FAILING] |
| **Merge Status** | [✅ CLEAN / ❌ CONFLICTS] |
| **PR State** | [✅ MERGEABLE / ❌ BLOCKED] |
| **Comments Addressed** | [✅ ALL DONE / ⚠️ X UNRESOLVED] |
| **Code Quality** | [✅ GOOD / ⚠️ ISSUES] |
---
## 🎯 Comment Resolution Summary
[List each outstanding comment and whether it was addressed - check for code fixes OR consolidated response summary]
---
## 🚀 **FINAL VERDICT: [APPROVE / REQUEST CHANGES / BLOCKED]**
[Brief explanation of decision]
---
🐰 [Sign-off emoji and message]IMPORTANT: Do NOT include raw script execution output or analysis chain details in your response. Only provide the clean formatted summary above. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 18286
✅ AUTOMATION COMPLETE — STATUS: NEEDS WORKVerified at commit 📊 Current Status: ISSUES FOUND
|
| Category | Status |
|---|---|
| CI Checks | ✅ 2/2 PASSING (Cursor Bugbot ✅ SUCCESS · CodeRabbit ✅ SUCCESS) |
| Merge Status | ✅ CLEAN |
| PR State | ✅ MERGEABLE |
| Comments Addressed | |
| Code Quality |
🎯 Comment Resolution Summary
No [AI responder] Consolidated Comment Response Summary comment was found, and no code/doc changes addressing prior review comments were detected at the new commit. All 20 comments remain open:
🔴 P1 — Design Correctness
| # | File | Line | Author | Issue | Status |
|---|---|---|---|---|---|
| 1 | roadmap/ROADMAP.md |
106 | chatgpt-codex | Workspace.active_tab must be Option<TabId> to support empty workspaces |
❌ Unresolved |
| 2 | roadmap/ROADMAP.md |
138 | chatgpt-codex | Session JSON active_tab must be optional to round-trip empty-tab state |
❌ Unresolved |
| 3 | roadmap/DESIGN.md |
154 | coderabbitai | active_tab in session JSON example must allow null |
❌ Unresolved |
🟠 Major — Correctness (roadmap/DESIGN.md, Cargo.toml)
| # | File | Line | Author | Issue | Status |
|---|---|---|---|---|---|
| 4 | roadmap/DESIGN.md |
16 | coderabbitai | cbindgen described as generating safe Rust wrappers (incorrect) + xcframework is Apple-only, not a Linux build format |
❌ Unresolved |
| 5 | roadmap/DESIGN.md |
15 | Copilot | Same cbindgen/bindgen confusion |
❌ Unresolved |
| 6 | roadmap/DESIGN.md |
181 | Copilot | zig build -Demit-xcframework=true cited as Linux equivalent — xcframework is Apple-only |
❌ Unresolved |
| 7 | Cargo.toml |
2 | coderabbitai | cmux-gtk listed as workspace member but the crate directory does not exist |
❌ Unresolved |
| 8 | Cargo.toml |
10 | coderabbitai | repository field points to manaflow-ai/cmux; actual repo is jleechanorg/cmux |
❌ Unresolved |
🟡 Medium — CLAUDE.md, Documentation
| # | File | Line | Author | Issue | Status |
|---|---|---|---|---|---|
| 9 | CLAUDE.md |
423 | cursor[bot] | Hardcoded ephemeral session UUIDs (D267DC10-… etc.) in version-controlled agent instructions |
❌ Unresolved |
| 10 | CLAUDE.md |
288 | Copilot | .beads/issues.jsonl auto-sync referenced but .beads/ directory absent from repo |
❌ Unresolved |
| 11 | CLAUDE.md |
301 | Copilot | References docs/QUICKSTART.md and a README beads section — neither exists |
❌ Unresolved |
| 12 | CLAUDE.md |
300 | Copilot | "Do NOT use markdown TODOs" conflicts with existing TODO.md / *.todo.md files in repo |
❌ Unresolved |
| 13 | roadmap/ROADMAP.md |
4 | Copilot | PR description claims 90 passing tests + session persistence code; diff is docs-only — mismatch | ❌ Unresolved |
| 14 | roadmap/DESIGN.md |
6 | Copilot / coderabbitai | Overview says "Ubuntu 22.04+" but Docker/validation sections consistently target 24.04 | ❌ Unresolved |
| 15 | roadmap/DESIGN.md |
281 | Copilot | Container tiers table uses rust:1.80-bookworm; Dockerfile example uses ubuntu:24.04 — inconsistent |
❌ Unresolved |
| 16 | roadmap/ROADMAP.md |
13 | Copilot | terminal Docker tier claims zig/Ghostty, but DESIGN.md Dockerfile only installs libvte-2.91-gtk4-dev |
❌ Unresolved |
🔵 Formatting — Double-pipe || Tables
| # | File | Line | Author | Issue | Status |
|---|---|---|---|---|---|
| 17 | roadmap/DESIGN.md |
28 | Copilot | Table rows use || → blank first column on GitHub |
❌ Unresolved |
| 18 | CLAUDE.md |
403 | Copilot | Same double-pipe table issue | ❌ Unresolved |
| 19 | roadmap/ROADMAP.md |
586 | Copilot | Same double-pipe table issue | ❌ Unresolved |
🔵 Nitpicks — roadmap/DESIGN.md (CodeRabbit)
| # | Issue | Status |
|---|---|---|
| 20 | 5 nitpick comments (redundant "CLI interface", unlabeled code fences, minor phrasing) | ❌ Unresolved |
🚀 FINAL VERDICT: REQUEST CHANGES
The PR is technically clean — CI green (2/2), mergeable, no conflicts — but all 20 review comments remain unaddressed at commit 0427582c with no consolidated response summary posted. Three Major-severity issues (missing cmux-gtk crate, incorrect active_tab optionality, wrong tool descriptions including cbindgen/xcframework) and two P1 design gaps require resolution before merge. Note: Codex cannot auto-fix because no environment has been configured for this repo — visit https://chatgpt.com/codex/settings/environments to set one up.
To unblock: fix flagged items in code/docs, then post an [AI responder] Consolidated Comment Response Summary with Re: [Comment #<id>] references for each item addressed.
🐰 Reviewed by CodeRabbit — still holding the gate, one paw at a time.
The Ghostty upgrade made paste_from_clipboard a performable binding. In performKeyEquivalent, the !isPerformable guard prevented the menu from handling Cmd+V, so keyDown was called directly. Inside keyDown, interpretKeyEvents triggered paste: (clipboard request #1) and then ghostty_surface_key fired the same binding (clipboard request #2), causing a double-paste race that corrupted the output. Remove the !isPerformable exclusion so performable bindings like paste also try the Edit menu first, restoring the single-request flow.
- Apply redactClaudeSensitiveSpans to message before classifyNotification so paths inside stringified error objects are redacted (CodeRabbit #1) - Add regression test testSummarizeJSONPathRedactsStringifiedError - Strengthen testSummarizeNonStringErrorPayload: use AND instead of OR to verify both fields appear in stringified error payload (CodeRabbit #2) - Update cmux.swift call site for rawInput parameter Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
… polish - #4 (toggle for agents launched mid-session): the Mac now adopts a detected agent the instant its terminal title becomes the agent's (AgentChatTranscriptService observes .ghosttyDidSetTitle and calls TerminalController.adoptDetectedAgentSessions), so the session registers and pushes to the phone live, not only on next open. - #1 (scroll-to-bottom no longer dismisses keyboard): the dismiss tap excludes the button's frame (ChatScrollButtonFramePreferenceKey + excludedRegion). - #3 (smooth scroll): the button does a single animated proxy.scrollTo to the bottom anchor instead of stacked non-animated jumps. - #5 (toggle eases in): the session-list update is wrapped in withAnimation. - #2 (cramped grouping): intraGroupSpacing 2 -> 5 so a code block isn't flush against the next message bubble. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>


Summary
Phases
🤖 Generated with Claude Code
Note
Low Risk
Primarily documentation and build scaffolding; no changes to existing runtime logic or production behavior.
Overview
Adds initial Linux-port planning and scaffolding: a new Rust workspace (
Cargo.toml) with acmux-corecrate manifest and dependencies, plus repo hygiene via.gitignoreupdate.Expands developer guidance by appending bd (beads) issue-tracking workflow to
CLAUDE.md, and introduces substantial Linux MVP documentation inroadmap/DESIGN.mdandroadmap/ROADMAP.md(architecture, phased TDD plan, and Docker-based validation gates).Written by Cursor Bugbot for commit 0427582. This will update automatically on new commits. Configure here.
Summary by CodeRabbit
Documentation
Chores