Skip to content

cmux-tui-artifacts: transitional double-publish under the legacy mux/ prefix - #7716

Merged
lawrencecchen merged 1 commit into
mainfrom
fix-tui-artifacts-legacy-prefix
Jul 9, 2026
Merged

lawrencecchen merged 1 commit into
mainfrom
fix-tui-artifacts-legacy-prefix

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jul 9, 2026 •

Copy link
Copy Markdown
Contributor

The rename (#7710) moved the R2 artifact prefix to files.cmux.com/cmux-tui/ with cmux-tui- binary names, but cmux-cloud's bootstrap/install-mux.sh and snapshot builders still curl the old mux//cmux-mux- URLs, so they would silently stop receiving updates. Double-publish copies under the legacy prefix + names until https://github.com/manaflow-ai/cmux-cloud/pull/2 switches over (commented in the workflow). Workflow-only change.


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Note

Low Risk
CI publish-step extension only; duplicates existing artifacts under legacy keys with no runtime or security impact.

Overview
After the normal cmux-tui/ R2 publish, the cmux-tui artifacts workflow now transitionally mirrors the same binaries under the pre-rename layout: mux/<commit> and mux/latest (on main), with filenames rewritten from cmux-tui-* to cmux-mux-*, plus a copied manifest.json.

This keeps cmux-cloud bootstrap/install and snapshot builders working on files.cmux.com/mux/... until they move to the new prefix (noted in workflow comments with a follow-up PR). Workflow-only; no application code changes.

Reviewed by Cursor Bugbot for commit 694c5ec. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Temporarily double-publishes TUI artifacts to the legacy mux/ prefix with cmux-mux-* names so external consumers keep receiving updates until cmux-cloud migrates to cmux-tui paths. Workflow-only change.

  • Bug Fixes
    • Copy cmux-tui-* to legacy cmux-mux-* and upload to mux/<sha> and mux/latest with appropriate cache headers.
    • Keeps URLs used by cmux-cloud bootstrap and snapshot builders working until they switch to cmux-tui/.

Written for commit 694c5ec. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Bug Fixes
    • Expanded release publishing so built binaries are available through both the current download location and an older compatibility path.
    • Updated the latest-release files on the main branch to keep legacy downloads working for existing consumers.

… prefix

cmux-cloud's bootstrap and snapshot builders still curl
files.cmux.com/mux/<ref>/cmux-mux-<target>; keep those URLs updating until
manaflow-ai/cmux-cloud#2 switches to cmux-tui/.
@vercel

vercel Bot commented Jul 9, 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 Jul 9, 2026 1:06pm

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@coderabbitai

coderabbitai Bot commented Jul 9, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The cmux-tui-artifacts.yml workflow adds a transitional step that copies built binaries and manifests, renames them from cmux-tui- to cmux-mux- prefixes, and republishes them to legacy R2 paths (mux//... and mux/latest/... on main) alongside the existing cmux-tui publish.

Changes

Legacy R2 Publish Step

Layer / File(s) Summary
Legacy artifact double-publish
.github/workflows/cmux-tui-artifacts.yml
After publishing standard cmux-tui binaries/manifests, copies and renames them to cmux-mux- filenames and uploads to legacy mux//... (immutable cache) and mux/latest/... (no-cache, main only) R2 paths.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

  • manaflow-ai/cmux#7653: Similarly updates workflows to publish cmux-mux-style artifacts to the same mux//... and mux/latest/... R2 locations with legacy naming.
🚥 Pre-merge checks | ✅ 4 | ❌ 21

❌ Failed checks (1 warning, 20 inconclusive)

Check name Status Explanation Resolution
Description check ⚠️ Warning The PR explains the change, but it omits most required template sections, including Testing, Demo Video, Review Trigger, and Checklist. Add the missing template sections for Testing, Demo Video, Review Trigger, and Checklist, and note how the change was verified.
Cmux Swift Actor Isolation ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Swift Blocking Runtime ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Browser Automation Off-Main ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Expensive Synchronous Load ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Cache Substitution Correctness ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux No Hacky Sleeps ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Algorithmic Complexity ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Swift Concurrency ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Swift @Concurrent ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Swift File And Package Boundaries ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Swiftpm Lockfiles ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Swift Logging ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux User-Facing Error Privacy ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Full Internationalization ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Swiftui State Layout ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Architecture Rethink ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Swift Auxiliary Window Close Shortcuts ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux Source Artifacts ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux No Test Or Debug Seam In Production Source ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Cmux No Ambient Global State ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: a transitional double-publish to the legacy mux prefix.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix-tui-artifacts-legacy-prefix

Warning

Review ran into problems

🔥 Problems

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.


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.

@greptile-apps

greptile-apps Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This workflow-only PR adds a transitional legacy double-publish block to cmux-tui-artifacts.yml, copying renamed binaries (cmux-tui-* → cmux-mux-*) and re-publishing them under the old mux/<ref>/ R2 prefix to keep cmux-cloud bootstrap scripts working until cmux-cloud#2 lands.

  • Binary renaming via sed 's/^cmux-tui-/cmux-mux-/' is correct, but the manifest.json is copied verbatim and its binaries keys still name cmux-tui-* files that do not exist under the mux/ prefix, making the legacy manifest structurally inconsistent with the directory it describes.
  • The cmux-tui-checksums.txt file is included in the rename loop (becoming cmux-mux-checksums.txt) but its line entries still reference cmux-tui-* names, so sha256sum -c against the renamed binaries would fail for any consumer that verifies checksums.

Confidence Score: 3/5

The binary files themselves are renamed and published correctly, so direct-download consumers should continue to work. However, the legacy manifest and checksums file are published with stale cmux-tui-* names that don't match the cmux-mux-* binaries in the same prefix, which would silently break any consumer that reads the manifest to determine what to download or verifies checksums.

Both metadata files shipped to the legacy prefix — manifest.json and the checksums file — contain filenames inconsistent with the actual binaries present. If bootstrap scripts or snapshot builders read the manifest to choose a download target, or verify integrity via the checksums file, they will fail. Whether current cmux-cloud consumers hit these paths is unclear from the diff alone, but the inconsistency is present and could cause silent failures.

.github/workflows/cmux-tui-artifacts.yml — specifically the manifest copy and the checksums rename in the legacy double-publish block

Important Files Changed

Filename Overview
.github/workflows/cmux-tui-artifacts.yml Adds a legacy double-publish block that renames binaries correctly but copies the manifest and checksum file verbatim, leaving both with stale cmux-tui-* names that don't match the cmux-mux-* files published at the legacy prefix.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Build artifacts\ncmux-tui-*] --> B[Build manifest.json\nkeys: cmux-tui-*]
    A --> C[Build cmux-tui-checksums.txt\nnames: cmux-tui-*]
    B --> D[Publish new prefix\ncmux-tui/sha/cmux-tui-*\nmanifest matches ✅]
    A --> D
    C --> D
    A --> E[Copy + rename to legacy_assets\ncmux-mux-* binaries ✅]
    B --> F[Copy manifest.json verbatim\nkeys still cmux-tui-* ❌]
    C --> G[Rename to cmux-mux-checksums.txt\ncontent still cmux-tui-* ❌]
    E --> H[Publish legacy prefix\nmux/sha/cmux-mux-*]
    F --> H
    G --> H
    H --> I[Consumers curl mux/sha/cmux-mux-target\nbinary downloads OK ✅]
    H --> J[Consumers read mux/sha/manifest.json\nfinds cmux-tui-* names ❌]
    H --> K[Consumers verify cmux-mux-checksums.txt\nsha256sum -c fails ❌]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[Build artifacts\ncmux-tui-*] --> B[Build manifest.json\nkeys: cmux-tui-*]
    A --> C[Build cmux-tui-checksums.txt\nnames: cmux-tui-*]
    B --> D[Publish new prefix\ncmux-tui/sha/cmux-tui-*\nmanifest matches ✅]
    A --> D
    C --> D
    A --> E[Copy + rename to legacy_assets\ncmux-mux-* binaries ✅]
    B --> F[Copy manifest.json verbatim\nkeys still cmux-tui-* ❌]
    C --> G[Rename to cmux-mux-checksums.txt\ncontent still cmux-tui-* ❌]
    E --> H[Publish legacy prefix\nmux/sha/cmux-mux-*]
    F --> H
    G --> H
    H --> I[Consumers curl mux/sha/cmux-mux-target\nbinary downloads OK ✅]
    H --> J[Consumers read mux/sha/manifest.json\nfinds cmux-tui-* names ❌]
    H --> K[Consumers verify cmux-mux-checksums.txt\nsha256sum -c fails ❌]
Loading

Reviews (1): Last reviewed commit: "cmux-tui-artifacts: transitional double-..." | Re-trigger Greptile

for file in assets/cmux-tui-*; do
cp "$file" "$legacy_assets/$(basename "$file" | sed 's/^cmux-tui-/cmux-mux-/')"
done
cp assets/manifest.json "$legacy_assets/manifest.json"

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.

P1 Legacy manifest.json has mismatched binary names

The manifest built in the "Build manifest and checksums" step records "cmux-tui-<target>" as the keys in its binaries object (via the Python snippet that globs cmux-tui-*). This file is copied verbatim with cp assets/manifest.json "$legacy_assets/manifest.json" and then published to mux/<sha>/manifest.json. Any consumer that reads manifest.json from the legacy prefix to discover file names or verify checksums will find entries like "cmux-tui-x86_64-linux" — names that do not exist under mux/, where the actual binaries are named cmux-mux-*. The manifest and the directory contents are structurally inconsistent.

Comment on lines +121 to +123
for file in assets/cmux-tui-*; do
cp "$file" "$legacy_assets/$(basename "$file" | sed 's/^cmux-tui-/cmux-mux-/')"
done

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.

P1 Checksums file content still references cmux-tui-* names

The checksum file cmux-tui-checksums.txt (generated by sha256sum cmux-tui-*) is included in the assets/cmux-tui-* glob, so the loop renames it to cmux-mux-checksums.txt in legacy_assets — but its internal content still reads <hash> cmux-tui-<target>. Any consumer that downloads cmux-mux-checksums.txt and runs sha256sum -c against the co-located cmux-mux-* binaries will get "no such file" errors for every entry because the names inside the file don't match the renamed binaries.

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/cmux-tui-artifacts.yml:
- Around line 119-140: The legacy asset publishing flow in the workflow’s
publish_legacy_prefix path copies manifest.json and checksums unchanged, so
their contents still point to cmux-tui filenames even though the copied binaries
were renamed to cmux-mux-*. Update the content of the copied manifest.json and
cmux-mux-checksums.txt under assets-legacy after the rename loop, using a
targeted filename replacement so only asset names change and hash values remain
intact, and keep the logic localized near publish_legacy_prefix.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 669f92b2-5867-4764-ac0d-e597a8615b22

📥 Commits

Reviewing files that changed from the base of the PR and between d675f0a and 694c5ec.

📒 Files selected for processing (1)
  • .github/workflows/cmux-tui-artifacts.yml

Comment on lines +119 to +140
legacy_assets="assets-legacy"
mkdir -p "$legacy_assets"
for file in assets/cmux-tui-*; do
cp "$file" "$legacy_assets/$(basename "$file" | sed 's/^cmux-tui-/cmux-mux-/')"
done
cp assets/manifest.json "$legacy_assets/manifest.json"
publish_legacy_prefix() {
local prefix="$1"
local cache="$2"
for file in "$legacy_assets"/*; do
python3 scripts/ci/upload-r2-object.py \
--file "$file" \
--endpoint-url "$R2_ENDPOINT" \
--bucket cmux-binaries \
--key "$prefix/$(basename "$file")" \
--cache-control "$cache"
done
}
publish_legacy_prefix "mux/$GITHUB_SHA" "public, max-age=31536000, immutable"
if [ "$GITHUB_REF" = "refs/heads/main" ]; then
publish_legacy_prefix "mux/latest" "no-cache, no-store, must-revalidate"
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Manifest and checksums published under legacy prefix reference wrong filenames.

manifest.json and cmux-mux-checksums.txt are copied as-is to assets-legacy/, but their content still references cmux-tui-* filenames. After the rename loop, the files alongside them are cmux-mux-*, so any consumer downloading mux/<sha>/manifest.json will see binary keys like cmux-tui-linux-x64 while the actual files are named cmux-mux-linux-x64. The same mismatch exists in the checksums file.

Since SHA256 hashes are hex strings, a targeted sed replacement is safe — it will only update filenames, not corrupt hash values.

🛠️ Proposed fix: update manifest and checksums content after copy
           cp assets/manifest.json "$legacy_assets/manifest.json"
+          # Fix manifest and checksums to reference renamed cmux-mux-* binaries
+          sed -i 's/cmux-tui-/cmux-mux-/g' "$legacy_assets/manifest.json"
+          sed -i 's/cmux-tui-/cmux-mux-/g' "$legacy_assets/cmux-mux-checksums.txt"
           publish_legacy_prefix() {
📝 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
legacy_assets="assets-legacy"
mkdir -p "$legacy_assets"
for file in assets/cmux-tui-*; do
cp "$file" "$legacy_assets/$(basename "$file" | sed 's/^cmux-tui-/cmux-mux-/')"
done
cp assets/manifest.json "$legacy_assets/manifest.json"
publish_legacy_prefix() {
local prefix="$1"
local cache="$2"
for file in "$legacy_assets"/*; do
python3 scripts/ci/upload-r2-object.py \
--file "$file" \
--endpoint-url "$R2_ENDPOINT" \
--bucket cmux-binaries \
--key "$prefix/$(basename "$file")" \
--cache-control "$cache"
done
}
publish_legacy_prefix "mux/$GITHUB_SHA" "public, max-age=31536000, immutable"
if [ "$GITHUB_REF" = "refs/heads/main" ]; then
publish_legacy_prefix "mux/latest" "no-cache, no-store, must-revalidate"
fi
legacy_assets="assets-legacy"
mkdir -p "$legacy_assets"
for file in assets/cmux-tui-*; do
cp "$file" "$legacy_assets/$(basename "$file" | sed 's/^cmux-tui-/cmux-mux-/')"
done
cp assets/manifest.json "$legacy_assets/manifest.json"
# Fix manifest and checksums to reference renamed cmux-mux-* binaries
sed -i 's/cmux-tui-/cmux-mux-/g' "$legacy_assets/manifest.json"
sed -i 's/cmux-tui-/cmux-mux-/g' "$legacy_assets/cmux-mux-checksums.txt"
publish_legacy_prefix() {
local prefix="$1"
local cache="$2"
for file in "$legacy_assets"/*; do
python3 scripts/ci/upload-r2-object.py \
--file "$file" \
--endpoint-url "$R2_ENDPOINT" \
--bucket cmux-binaries \
--key "$prefix/$(basename "$file")" \
--cache-control "$cache"
done
}
publish_legacy_prefix "mux/$GITHUB_SHA" "public, max-age=31536000, immutable"
if [ "$GITHUB_REF" = "refs/heads/main" ]; then
publish_legacy_prefix "mux/latest" "no-cache, no-store, must-revalidate"
fi
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/cmux-tui-artifacts.yml around lines 119 - 140, The legacy
asset publishing flow in the workflow’s publish_legacy_prefix path copies
manifest.json and checksums unchanged, so their contents still point to cmux-tui
filenames even though the copied binaries were renamed to cmux-mux-*. Update the
content of the copied manifest.json and cmux-mux-checksums.txt under
assets-legacy after the rename loop, using a targeted filename replacement so
only asset names change and hash values remain intact, and keep the logic
localized near publish_legacy_prefix.

@lawrencecchen
lawrencecchen merged commit cb87a91 into main Jul 9, 2026
40 of 42 checks passed

This branch was successfully deployed

1 active deployment
Preview – cmux — 694c5ec8 Deployed Jul 9, 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.

1 participant