Skip to content

Fix bundled Ghostty theme picker helper packaging - #1416

Closed
lawrencecchen wants to merge 4 commits into
mainfrom
feat-fix-missing-theme-picker-helper
Closed

lawrencecchen wants to merge 4 commits into
mainfrom
feat-fix-missing-theme-picker-helper

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Mar 14, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • bundle the Ghostty theme picker helper during app builds, including universal release builds
  • verify the helper is present in release/nightly CI and sign it alongside the bundled cmux CLI
  • keep manual release builds from silently shipping without the helper

Verification

  • ./scripts/reload.sh --tag feat-fix-missing-theme-picker-helper
  • scripts/build-ghostty-cli-helper.sh --output /tmp/cmux-ghostty-helper-host
  • scripts/build-ghostty-cli-helper.sh --universal --output /tmp/cmux-ghostty-helper-universal
  • xcodebuild -scheme cmux -configuration Release -derivedDataPath /tmp/cmux-feat-fix-missing-theme-picker-helper-universal -destination 'generic/platform=macOS' ARCHS='arm64 x86_64' ONLY_ACTIVE_ARCH=NO CODE_SIGNING_ALLOWED=NO build

Summary by cubic

Bundles the Ghostty theme picker helper into app builds (including universal) and adds CI guards so we don’t ship without it. Syncs workflows with the latest changes and validates, signs, and packages the helper alongside the cmux CLI.

  • Bug Fixes
    • Added scripts/build-ghostty-cli-helper.sh to build the helper (single-target or universal) and output to cmux.app/Contents/Resources/bin/ghostty.
    • Updated Xcode build phase to build the correct helper (universal or per-arch based on ARCHS), place it under Resources/bin, and fail the build if missing.
    • Updated and reconciled CI, macOS-compat, e2e, depot, nightly, and release workflows to install zig when missing and enforce helper bundling.
    • Updated release paths to require the helper, validate universal architectures via lipo, and codesign it alongside the cmux CLI.

Written for commit cab0e29. Summary will update on new commits.

Summary by CodeRabbit

  • Chores
    • Build and release workflows now produce, validate and bundle a new helper binary and ensure it is executable.
    • Pre-install checks added to CI to ensure required toolchain presence; pre-sign checks verify the helper and conditionally include it in app signing.
    • Multi-architecture helper builds supported to produce universal binaries when applicable.

@vercel

vercel Bot commented Mar 14, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Mar 25, 2026 4:17am

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@coderabbitai

coderabbitai Bot commented Mar 14, 2026 •

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Adds building, verification, and conditional codesigning of a Ghostty CLI helper: a Zig-based helper build script, integration into Xcode build phases, and propagation of helper verification/signing into CI/nightly/release workflows and the signing/upload script.

Changes

Cohort / File(s) Summary
GitHub workflows
.github/workflows/nightly.yml, .github/workflows/release.yml, .github/workflows/ci.yml, .github/workflows/ci-macos-compat.yml, .github/workflows/test-depot.yml, .github/workflows/test-e2e.yml
Add Zig installation guard steps; introduce HELPER_BINARY/HELPER_ARCHS/HELPER_PATH vars; verify helper exists in built app; propagate conditional codesign/verification of Ghostty helper into signing flows.
Xcode project build phase
GhosttyTabs.xcodeproj/project.pbxproj
Extend Copy Ghostty Resources shell phase to invoke helper build logic, add BIN_DEST/GHOSTTY_HELPER_DEST and BUILD_GHOSTTY_HELPER scaffolding, and include architecture-aware build/validation for the helper binary.
Helper build script
scripts/build-ghostty-cli-helper.sh
New Bash script to build the Ghostty CLI helper via Zig; supports --universal and single-target builds, performs per-arch builds and lipo merge, validates inputs/submodule/zig, and sets executable permissions.
Signing/upload script
scripts/build-sign-upload.sh
Add preflight check for helper at APP_PATH/.../Resources/bin/ghostty and conditionally codesign the helper using HELPER_PATH during the existing signing sequence.

Sequence Diagram(s)

sequenceDiagram
    participant Xcode as Xcode Build
    participant BuildHelper as build-ghostty-cli-helper.sh
    participant Zig as Zig Compiler
    participant Lipo as lipo
    participant SignScript as build-sign-upload.sh
    participant Codesign as Code Signer

    Xcode->>BuildHelper: invoke with arch flags / --output
    alt universal
        BuildHelper->>Zig: zig build cli-helper (arm64)
        Zig-->>BuildHelper: arm64 binary
        BuildHelper->>Zig: zig build cli-helper (x86_64)
        Zig-->>BuildHelper: x86_64 binary
        BuildHelper->>Lipo: merge slices -> universal helper
        Lipo-->>BuildHelper: universal binary
    else single-target
        BuildHelper->>Zig: zig build cli-helper (target)
        Zig-->>BuildHelper: single binary
    end
    BuildHelper-->>Xcode: place helper in Resources/bin/ghostty
    Xcode->>SignScript: start signing phase (app path)
    SignScript->>SignScript: verify helper executable at HELPER_PATH
    SignScript->>Codesign: codesign main CLI binary
    Codesign-->>SignScript: CLI signed
    alt helper exists
        SignScript->>Codesign: codesign Ghostty helper
        Codesign-->>SignScript: helper signed
    end
    SignScript-->>Xcode: signing complete
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested labels

aardvark, codex

Poem

🐰 I hopped through Zig's fields and built a tiny friend,
Arm and x86 stitched tight, then merged end-to-end,
Checked its whiskers, signed its coat, tucked it in the app,
A helper snug beneath the hood, ready for a tap—
Carrots, code, and CI cheer to send! 🥕✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: bundling and fixing the Ghostty theme picker helper packaging process, which is the primary objective of the PR.
Description check ✅ Passed The PR description includes a clear summary of changes and verification steps but lacks Testing and Demo sections from the template.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-fix-missing-theme-picker-helper

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fc94a07f96

ℹ️ 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".

Comment on lines +49 to +51
if ! command -v zig >/dev/null 2>&1; then
echo "error: zig is required to build the Ghostty CLI helper" >&2
exit 1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Avoid requiring Zig in every app build

This new helper builder exits immediately if zig is missing, and the app build phase now always invokes it, which introduces a hard toolchain dependency that did not exist for prebuilt-artifact flows. In particular, the release/nightly workflows currently only download prebuilt Ghostty artifacts before running xcodebuild, so environments without preinstalled Zig will now fail during packaging instead of producing a release build. Add a fallback prebuilt helper path or explicitly install Zig in those pipelines.

Useful? React with 👍 / 👎.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 5 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="GhosttyTabs.xcodeproj/project.pbxproj">

<violation number="1" location="GhosttyTabs.xcodeproj/project.pbxproj:333">
P2: Single-arch x86_64 builds can package the wrong Ghostty helper architecture because the non-universal branch always builds for host arch.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread GhosttyTabs.xcodeproj/project.pbxproj Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
scripts/build-sign-upload.sh (1)

96-102: Minor: HELPER_PATH is defined twice.

HELPER_PATH is already defined at line 77 with the same value. The redefinition here is harmless but redundant.

♻️ Suggested cleanup
 # --- Codesign ---
 echo "Codesigning..."
 CLI_PATH="$APP_PATH/Contents/Resources/bin/cmux"
-HELPER_PATH="$APP_PATH/Contents/Resources/bin/ghostty"
 if [ -f "$CLI_PATH" ]; then
   /usr/bin/codesign --force --options runtime --timestamp --sign "$SIGN_HASH" --entitlements "$ENTITLEMENTS" "$CLI_PATH"
 fi
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/build-sign-upload.sh` around lines 96 - 102, The HELPER_PATH variable
is redundantly redefined in the codesign block; remove the duplicate definition
(the second HELPER_PATH="$APP_PATH/Contents/Resources/bin/ghostty") and keep the
existing earlier declaration, then leave the existing conditional that codesigns
"$HELPER_PATH" intact so the codesign lines referencing HELPER_PATH and CLI_PATH
run without changing behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@scripts/build-sign-upload.sh`:
- Around line 96-102: The HELPER_PATH variable is redundantly redefined in the
codesign block; remove the duplicate definition (the second
HELPER_PATH="$APP_PATH/Contents/Resources/bin/ghostty") and keep the existing
earlier declaration, then leave the existing conditional that codesigns
"$HELPER_PATH" intact so the codesign lines referencing HELPER_PATH and CLI_PATH
run without changing behavior.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 72631dd5-8bc7-4d73-a033-420283ed6582

📥 Commits

Reviewing files that changed from the base of the PR and between 80fea62 and fc94a07.

📒 Files selected for processing (5)
  • .github/workflows/nightly.yml
  • .github/workflows/release.yml
  • GhosttyTabs.xcodeproj/project.pbxproj
  • scripts/build-ghostty-cli-helper.sh
  • scripts/build-sign-upload.sh

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e48a701499

ℹ️ 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".

Comment on lines +73 to +75
if ! command -v zig >/dev/null 2>&1; then
echo "error: zig is required to build the Ghostty CLI helper" >&2
exit 1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep app builds working when Zig is unavailable

This helper now hard-fails when zig is missing, and the updated Xcode build phase invokes it on every cmux app build, so prebuilt-artifact flows can still break outside release/nightly. Fresh evidence: I checked .github/workflows/ci.yml (tests-depot UI build), .github/workflows/test-e2e.yml (UI test build), and .github/workflows/ci-macos-compat.yml (smoke-test build), and these jobs run xcodebuild -scheme cmux without installing Zig first. On any runner image (or local machine) without a preinstalled Zig toolchain, those builds now fail before packaging; either add a non-Zig fallback for the helper or install Zig in every workflow that builds the app.

Useful? React with 👍 / 👎.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
.github/workflows/release.yml (1)

205-211: Use executable invariant for helper signing guard.

At signing time, prefer -x + fail-fast rather than a soft -f check so helper signing cannot be silently skipped.

Suggested change
           HELPER_PATH="$APP_PATH/Contents/Resources/bin/ghostty"
@@
-          if [ -f "$HELPER_PATH" ]; then
-            /usr/bin/codesign --force --options runtime --timestamp --sign "$APPLE_SIGNING_IDENTITY" --entitlements "$ENTITLEMENTS" "$HELPER_PATH"
-          fi
+          [ -x "$HELPER_PATH" ] || { echo "Ghostty helper not executable at $HELPER_PATH" >&2; exit 1; }
+          /usr/bin/codesign --force --options runtime --timestamp --sign "$APPLE_SIGNING_IDENTITY" --entitlements "$ENTITLEMENTS" "$HELPER_PATH"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/release.yml around lines 205 - 211, The current guard for
signing the helper uses a soft [-f "$HELPER_PATH"] check which can silently skip
signing; change the guard to use the executable test [-x "$HELPER_PATH"] and
fail fast if the helper is missing so signing cannot be skipped: replace the
if-condition that references HELPER_PATH to check -x instead of -f and ensure
the branch exits with a non-zero status (or enable fail-fast like set -e) when
the helper is expected but not executable, keeping the existing
/usr/bin/codesign invocation for "$HELPER_PATH"; similarly verify the CLI_PATH
check follows the same pattern if applicable.
scripts/build-ghostty-cli-helper.sh (1)

30-37: Add explicit value validation for --target and --output.

Missing option values can currently fail via shift with a less actionable error; explicit guards make CLI failures clearer.

Suggested change
     --target)
-      TARGET_TRIPLE="${2:-}"
+      if [[ $# -lt 2 || -z "${2:-}" ]]; then
+        echo "Missing value for --target" >&2
+        usage >&2
+        exit 1
+      fi
+      TARGET_TRIPLE="$2"
       shift 2
       ;;
     --output)
-      OUTPUT_PATH="${2:-}"
+      if [[ $# -lt 2 || -z "${2:-}" ]]; then
+        echo "Missing value for --output" >&2
+        usage >&2
+        exit 1
+      fi
+      OUTPUT_PATH="$2"
       shift 2
       ;;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/build-ghostty-cli-helper.sh` around lines 30 - 37, The --target and
--output branches set TARGET_TRIPLE and OUTPUT_PATH but don't validate that a
value was supplied; after parsing each option in the case branches for
"--target" and "--output" (where TARGET_TRIPLE and OUTPUT_PATH are assigned),
add an explicit check that the assigned variable is non-empty and print a clear
error (e.g., "Missing value for --target" / "Missing value for --output") to
stderr and exit 1 if empty, to avoid silent/ambiguous failures from shift;
ensure the checks reference TARGET_TRIPLE and OUTPUT_PATH so they run
immediately after assignment.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/release.yml:
- Around line 148-154: The current step "Verify bundled Ghostty theme picker
helper" only checks HELPER_BINARY exists; modify it to also verify the binary
contains both target architectures (e.g., arm64 and x86_64) before passing.
After the existence check for HELPER_BINARY, run an architecture inspection
(using lipo -info or file) on HELPER_BINARY and fail the step if the output does
not indicate both required arches (arm64 and x86_64), emitting a clear error
that the helper is not universal.

---

Nitpick comments:
In @.github/workflows/release.yml:
- Around line 205-211: The current guard for signing the helper uses a soft [-f
"$HELPER_PATH"] check which can silently skip signing; change the guard to use
the executable test [-x "$HELPER_PATH"] and fail fast if the helper is missing
so signing cannot be skipped: replace the if-condition that references
HELPER_PATH to check -x instead of -f and ensure the branch exits with a
non-zero status (or enable fail-fast like set -e) when the helper is expected
but not executable, keeping the existing /usr/bin/codesign invocation for
"$HELPER_PATH"; similarly verify the CLI_PATH check follows the same pattern if
applicable.

In `@scripts/build-ghostty-cli-helper.sh`:
- Around line 30-37: The --target and --output branches set TARGET_TRIPLE and
OUTPUT_PATH but don't validate that a value was supplied; after parsing each
option in the case branches for "--target" and "--output" (where TARGET_TRIPLE
and OUTPUT_PATH are assigned), add an explicit check that the assigned variable
is non-empty and print a clear error (e.g., "Missing value for --target" /
"Missing value for --output") to stderr and exit 1 if empty, to avoid
silent/ambiguous failures from shift; ensure the checks reference TARGET_TRIPLE
and OUTPUT_PATH so they run immediately after assignment.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e388755e-393c-4fa4-9ec9-8634937e99a0

📥 Commits

Reviewing files that changed from the base of the PR and between fc94a07 and e48a701.

📒 Files selected for processing (5)
  • .github/workflows/nightly.yml
  • .github/workflows/release.yml
  • GhosttyTabs.xcodeproj/project.pbxproj
  • scripts/build-ghostty-cli-helper.sh
  • scripts/build-sign-upload.sh
🚧 Files skipped from review as they are similar to previous changes (2)
  • .github/workflows/nightly.yml
  • scripts/build-sign-upload.sh

Comment on lines +148 to +154
- name: Verify bundled Ghostty theme picker helper
if: steps.guard_release_assets.outputs.skip_all != 'true'
run: |
set -euo pipefail
HELPER_BINARY="build/Build/Products/Release/cmux.app/Contents/Resources/bin/ghostty"
[ -x "$HELPER_BINARY" ] || { echo "Ghostty theme picker helper not found at $HELPER_BINARY" >&2; exit 1; }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Verify helper architecture set, not just existence.

This check can pass with a single-arch helper, which risks shipping a non-universal release artifact.

Suggested hardening
       - name: Verify bundled Ghostty theme picker helper
         if: steps.guard_release_assets.outputs.skip_all != 'true'
         run: |
           set -euo pipefail
           HELPER_BINARY="build/Build/Products/Release/cmux.app/Contents/Resources/bin/ghostty"
           [ -x "$HELPER_BINARY" ] || { echo "Ghostty theme picker helper not found at $HELPER_BINARY" >&2; exit 1; }
+          HELPER_ARCHS="$(/usr/bin/lipo -archs "$HELPER_BINARY")"
+          case " $HELPER_ARCHS " in
+            *" arm64 "*) ;;
+            *) echo "Ghostty helper missing arm64 architecture: $HELPER_ARCHS" >&2; exit 1 ;;
+          esac
+          case " $HELPER_ARCHS " in
+            *" x86_64 "*) ;;
+            *) echo "Ghostty helper missing x86_64 architecture: $HELPER_ARCHS" >&2; exit 1 ;;
+          esac
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Verify bundled Ghostty theme picker helper
if: steps.guard_release_assets.outputs.skip_all != 'true'
run: |
set -euo pipefail
HELPER_BINARY="build/Build/Products/Release/cmux.app/Contents/Resources/bin/ghostty"
[ -x "$HELPER_BINARY" ] || { echo "Ghostty theme picker helper not found at $HELPER_BINARY" >&2; exit 1; }
- name: Verify bundled Ghostty theme picker helper
if: steps.guard_release_assets.outputs.skip_all != 'true'
run: |
set -euo pipefail
HELPER_BINARY="build/Build/Products/Release/cmux.app/Contents/Resources/bin/ghostty"
[ -x "$HELPER_BINARY" ] || { echo "Ghostty theme picker helper not found at $HELPER_BINARY" >&2; exit 1; }
HELPER_ARCHS="$(/usr/bin/lipo -archs "$HELPER_BINARY")"
case " $HELPER_ARCHS " in
*" arm64 "*) ;;
*) echo "Ghostty helper missing arm64 architecture: $HELPER_ARCHS" >&2; exit 1 ;;
esac
case " $HELPER_ARCHS " in
*" x86_64 "*) ;;
*) echo "Ghostty helper missing x86_64 architecture: $HELPER_ARCHS" >&2; exit 1 ;;
esac
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/release.yml around lines 148 - 154, The current step
"Verify bundled Ghostty theme picker helper" only checks HELPER_BINARY exists;
modify it to also verify the binary contains both target architectures (e.g.,
arm64 and x86_64) before passing. After the existence check for HELPER_BINARY,
run an architecture inspection (using lipo -info or file) on HELPER_BINARY and
fail the step if the output does not indicate both required arches (arm64 and
x86_64), emitting a clear error that the helper is not universal.

…e-picker-helper

# Conflicts:
#	.github/workflows/ci-macos-compat.yml
#	.github/workflows/ci.yml
#	.github/workflows/nightly.yml
#	.github/workflows/release.yml
#	.github/workflows/test-depot.yml
#	.github/workflows/test-e2e.yml
#	scripts/build-ghostty-cli-helper.sh
@teamleaderleo

Copy link
Copy Markdown
Collaborator

cmux-reconcile: close-candidate

Proposed action: Close this empty PR without merging; preserve the branch.

Evidence checked September 18, 2026: GitHub reports 0 changed files, 0 additions, and 0 deletions. I independently fetched the PR diff and it is empty. Head: cab0e29bf5ea8a3b5f7d6121d239ad3096fe2ceb. Target branch: main.

There is no remaining patch in this PR against its target branch. This does not establish that the original feature shipped to main or that its idea should be discarded. If this is an intentional placeholder for future work, keep the underlying request and record that purpose; otherwise it is ready for queue cleanup.

Recheck the head/diff before acting in case new work arrives. Search "cmux-reconcile: close-candidate" in this repository for this cleanup batch.

@github-actions

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Closing as already on main: merging this branch into main at 2b6ca4c produces main's own tree, so there's nothing left to land. The branch is kept; reopen if something here is still missing. Part of the backlog cleanup in manaflow-ai/cmuxterm-hq#563.

This branch was successfully deployed

1 active deployment
Preview — cab0e29b Deployed Mar 25, 2026 by vercel[bot]
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