Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
0d2b732
Fix main build blockers before release verification
azooz2003-bit Oct 1, 2026
0d7239b
Document intentional settings namespace
azooz2003-bit Oct 1, 2026
56837e5
Include the hook-doc helper in schema guard fixture
azooz2003-bit Oct 1, 2026
ef7f5f8
Complete the agent hook docs guard fixture
azooz2003-bit Oct 1, 2026
6e9a537
fix CI test fixtures and canonical resource lookup
azooz2003-bit Oct 1, 2026
2bac0fa
keep rerun workflow source alias unchanged
azooz2003-bit Oct 1, 2026
db6e391
exclude template manifest from sidebar validation
azooz2003-bit Oct 1, 2026
337f0b5
repair session-bound notification fixtures
azooz2003-bit Oct 1, 2026
8f5550c
fix: suppress notifications for aborted Codex monitor replays
azooz2003-bit Oct 1, 2026
8374a1b
fix: handle aborted transcripts in hook admission
azooz2003-bit Oct 1, 2026
0510b7c
Fix package test regressions
azooz2003-bit Oct 1, 2026
806cb15
Restore updater badge renderer
azooz2003-bit Oct 1, 2026
0beabb7
Merge green main into release gate branch
azooz2003-bit Oct 1, 2026
36651d9
Merge main (337861cfd05e) into fix/acceptance-v2-gate-20261001
azooz2003-bit Oct 1, 2026
f58f193
ci: make v2 acceptance gate enforce real workload
azooz2003-bit Oct 1, 2026
b4e2672
test: close acceptance branch review findings
azooz2003-bit Oct 1, 2026
6459994
docs: document strict Codex acceptance prerequisite
azooz2003-bit Oct 1, 2026
7428e6f
ci: measure relay behavior under network delay
azooz2003-bit Oct 1, 2026
4beac05
ci: record canonical worker identity
azooz2003-bit Oct 1, 2026
097bf9a
docs: list current cloud VM socket methods
azooz2003-bit Oct 1, 2026
6c131b2
test: align gate timeout guard with relay rollover
azooz2003-bit Oct 1, 2026
c4bf7b1
test: keep app machine payload test target-safe
azooz2003-bit Oct 1, 2026
fee0ee0
test: expect inbox mark-read to cover all results
azooz2003-bit Oct 1, 2026
9737bc7
ci: make relay impairment cleanup and evidence fail safe
azooz2003-bit Oct 1, 2026
f439359
Merge remote-tracking branch 'origin/main' into fix/acceptance-v2-gat…
azooz2003-bit Oct 1, 2026
259d531
fix: restore upload path helper after main merge
azooz2003-bit Oct 1, 2026
6910617
fix: compile agent usage owner selection
azooz2003-bit Oct 1, 2026
ef2c886
fix: use app-local shell quoting helper
azooz2003-bit Oct 1, 2026
06b298a
fix: resolve sidebar test conflict markers
azooz2003-bit Oct 1, 2026
a5ce445
test: stabilize package tests after main merge
azooz2003-bit Oct 1, 2026
fa9b5fd
Merge remote-tracking branch 'origin/main' into fix/acceptance-v2-gat…
azooz2003-bit Oct 1, 2026
278d636
fix: restore sidebar preview resources for compile
azooz2003-bit Oct 1, 2026
58c1700
test: account for paste cleanup during relay teardown
azooz2003-bit Oct 2, 2026
9de35d6
test: avoid predicate macro expansion in relay teardown
azooz2003-bit Oct 2, 2026
1b61c17
Merge origin/main into acceptance gate
azooz2003-bit Oct 2, 2026
2dbbcd5
test: keep sidebar template example in sync
azooz2003-bit Oct 2, 2026
6f7170f
Merge latest main into acceptance gate
azooz2003-bit Oct 2, 2026
1bac05f
Merge latest main into acceptance gate
azooz2003-bit Oct 2, 2026
86a6aea
test: match conditional paste cleanup lifecycle
azooz2003-bit Oct 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/app-host-test-rerun.yml
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,12 @@ jobs:
CMUX_CI_RUNTIME_SOURCE_ROOT=/private/tmp/cmux-test-source \
"$GITHUB_WORKSPACE/.rerun-tools/scripts/ci/canonical-build-root.sh" \
--runtime-source "$PWD"
# Some compiled XCTest bundles still contain the producer's
# canonical `#filePath`; keep that path available alongside the
# portable source alias for direct resource fixtures.
CMUX_CI_RUNTIME_SOURCE_ROOT="${CMUX_CI_CANONICAL_ROOT:-/private/tmp/cmux-ci}" \
"$GITHUB_WORKSPACE/.rerun-tools/scripts/ci/canonical-build-root.sh" \
--runtime-source "$PWD"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: CMUX_CI_CANONICAL_ROOT is not available in this step's shell: it was only written to $GITHUB_ENV earlier in the same step (line 217), and GITHUB_ENV entries are applied to subsequent steps, not the current running step. So ${CMUX_CI_CANONICAL_ROOT:-/private/tmp/cmux-ci} always expands to /private/tmp/cmux-ci. When the producer compiled on an owned Mac's second compile slot, take-product-canonical-root.sh set root=/private/tmp/cmux-ci-<n>, and this call then aliases the wrong root: the producer's embedded #filePath (/private/tmp/cmux-ci-<n>/src/...) still cannot resolve, so the fix silently does nothing in that case. Worse, canonical-build-root.sh --runtime-source runs rm -rf "$runtime_src" before symlinking, so it deletes /private/tmp/cmux-ci/src — a root this job did not take via take-product-canonical-root.sh and that another job on the same Mac may be compiling in. Use the root variable already computed in this step instead.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At .github/workflows/app-host-test-rerun.yml, line 239:

<comment>`CMUX_CI_CANONICAL_ROOT` is not available in this step's shell: it was only written to `$GITHUB_ENV` earlier in the same step (line 217), and GITHUB_ENV entries are applied to subsequent steps, not the current running step. So `${CMUX_CI_CANONICAL_ROOT:-/private/tmp/cmux-ci}` always expands to `/private/tmp/cmux-ci`. When the producer compiled on an owned Mac's second compile slot, `take-product-canonical-root.sh` set `root=/private/tmp/cmux-ci-<n>`, and this call then aliases the wrong root: the producer's embedded `#filePath` (`/private/tmp/cmux-ci-<n>/src/...`) still cannot resolve, so the fix silently does nothing in that case. Worse, `canonical-build-root.sh --runtime-source` runs `rm -rf "$runtime_src"` before symlinking, so it deletes `/private/tmp/cmux-ci/src` — a root this job did not take via `take-product-canonical-root.sh` and that another job on the same Mac may be compiling in. Use the `root` variable already computed in this step instead.</comment>

<file context>
@@ -233,6 +233,12 @@ jobs:
+          # Some compiled XCTest bundles still contain the producer's
+          # canonical `#filePath`; keep that path available alongside the
+          # portable source alias for direct resource fixtures.
+          CMUX_CI_RUNTIME_SOURCE_ROOT="${CMUX_CI_CANONICAL_ROOT:-/private/tmp/cmux-ci}" \
+            "$GITHUB_WORKSPACE/.rerun-tools/scripts/ci/canonical-build-root.sh" \
+            --runtime-source "$PWD"
</file context>
Suggested change
CMUX_CI_RUNTIME_SOURCE_ROOT="${CMUX_CI_CANONICAL_ROOT:-/private/tmp/cmux-ci}" \
"$GITHUB_WORKSPACE/.rerun-tools/scripts/ci/canonical-build-root.sh" \
--runtime-source "$PWD"
CMUX_CI_RUNTIME_SOURCE_ROOT="$root" \
"$GITHUB_WORKSPACE/.rerun-tools/scripts/ci/canonical-build-root.sh" \
--runtime-source "$PWD"

echo "CMUX_CI_RUNTIME_SOURCE_ROOT=/private/tmp/cmux-test-source" >> "$GITHUB_ENV"
receipt="$COMPILE_DERIVED_DATA/Build/Products/cmux-test-products.json"
cat "$receipt"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public struct CustomSidebarTemplateCatalog: Sendable {
}
let installedSource = source
.split(separator: "\n", omittingEmptySubsequences: false)
.filter { !$0.trimmingCharacters(in: .whitespaces).hasPrefix("// cp Examples/CustomSidebars/") }
.filter { !$0.contains("cp Examples/CustomSidebars/") }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: This filter's only job is to strip copy-command lines from installed template source, but the tests never assert that behavior. bundledManifestMatchesExamplesFolder checks only source.isEmpty == false, so it would pass even if every cp line leaked into the installed file. That is not hypothetical: the old prefix filter silently missed workspaces.js line 13, which uses // Install: cp Examples/CustomSidebars/workspaces.js instead of // cp ..., and no test caught it — the exact regression this PR fixes. Add a test asserting installed source contains no line with cp Examples/CustomSidebars/, covering both comment styles (the // cp ... form in btop-agents.js/panel-sessions.js/panel-subagents.js/panel-todo.js and the // Install: cp ... form in workspaces.js).

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At Packages/macOS/CmuxSettings/Sources/CmuxSettings/CustomSidebarTemplateCatalog.swift, line 95:

<comment>This filter's only job is to strip copy-command lines from installed template source, but the tests never assert that behavior. `bundledManifestMatchesExamplesFolder` checks only `source.isEmpty == false`, so it would pass even if every `cp` line leaked into the installed file. That is not hypothetical: the old prefix filter silently missed `workspaces.js` line 13, which uses `// Install:  cp Examples/CustomSidebars/workspaces.js` instead of `//   cp ...`, and no test caught it — the exact regression this PR fixes. Add a test asserting installed source contains no line with `cp Examples/CustomSidebars/`, covering both comment styles (the `//   cp ...` form in btop-agents.js/panel-sessions.js/panel-subagents.js/panel-todo.js and the `// Install:  cp ...` form in workspaces.js).</comment>

<file context>
@@ -92,7 +92,7 @@ public struct CustomSidebarTemplateCatalog: Sendable {
         let installedSource = source
             .split(separator: "\n", omittingEmptySubsequences: false)
-            .filter { !$0.trimmingCharacters(in: .whitespaces).hasPrefix("//   cp Examples/CustomSidebars/") }
+            .filter { !$0.contains("cp Examples/CustomSidebars/") }
             .joined(separator: "\n")
         return CustomSidebarTemplate(descriptor: descriptor, source: installedSource)
</file context>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3: The broadened contains filter now strips any line containing cp Examples/CustomSidebars/, not just comment lines, so a template that references the path in code (a string literal, a run("...") helper call, or an inline code(); // cp … tail comment) would silently lose a whole source line after install. Every current bundled template (btop-agents.js:6, panel-sessions.js:4, panel-subagents.js:6, panel-todo.js:4, workspaces.js:13) matches only inside // comments, so nothing breaks today, but the heuristic will corrupt future templates without an error. Scope the strip to comment lines that contain the path.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At Packages/macOS/CmuxSettings/Sources/CmuxSettings/CustomSidebarTemplateCatalog.swift, line 95:

<comment>The broadened `contains` filter now strips any line containing `cp Examples/CustomSidebars/`, not just comment lines, so a template that references the path in code (a string literal, a `run("...")` helper call, or an inline `code(); // cp …` tail comment) would silently lose a whole source line after install. Every current bundled template (btop-agents.js:6, panel-sessions.js:4, panel-subagents.js:6, panel-todo.js:4, workspaces.js:13) matches only inside `//` comments, so nothing breaks today, but the heuristic will corrupt future templates without an error. Scope the strip to comment lines that contain the path.</comment>

<file context>
@@ -92,7 +92,7 @@ public struct CustomSidebarTemplateCatalog: Sendable {
         let installedSource = source
             .split(separator: "\n", omittingEmptySubsequences: false)
-            .filter { !$0.trimmingCharacters(in: .whitespaces).hasPrefix("//   cp Examples/CustomSidebars/") }
+            .filter { !$0.contains("cp Examples/CustomSidebars/") }
             .joined(separator: "\n")
         return CustomSidebarTemplate(descriptor: descriptor, source: installedSource)
</file context>
Suggested change
.filter { !$0.contains("cp Examples/CustomSidebars/") }
.filter { line in
let trimmed = line.trimmingCharacters(in: .whitespaces)
return !(line.contains("cp Examples/CustomSidebars/") && trimmed.hasPrefix("//"))
}

.joined(separator: "\n")
return CustomSidebarTemplate(descriptor: descriptor, source: installedSource)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@ public extension Notification.Name {

/// Holds a gallery request until the progressively mounted Custom Sidebars
/// section is ready to present it.
// lint:allow namespace-type - one-shot main-actor handoff from a host menu to the lazily mounted Custom Sidebars section.
@MainActor
public enum CustomSidebarTemplateGalleryRequest {
private static var pending = false

public static func request() {
pending = true
NotificationCenter.default.post(name: .customSidebarTemplateGalleryRequested)
NotificationCenter.default.post(name: .customSidebarTemplateGalleryRequested, object: nil)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3: The explicit object: nil is a no-op: NotificationCenter.post(name:object:userInfo:) already defaults object to nil, so this line delivers the notification exactly like the removed post(name: .customSidebarTemplateGalleryRequested). The receiver (CustomSidebarsSection.swift .onReceive(NotificationCenter.default.publisher(for: ...))) registers with no object filter either, so observability is unchanged. The "Fixes the gallery notification argument" claim is therefore not achieved by this change.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At Packages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Environment/SettingsHostActions.swift, line 19:

<comment>The explicit `object: nil` is a no-op: `NotificationCenter.post(name:object:userInfo:)` already defaults `object` to `nil`, so this line delivers the notification exactly like the removed `post(name: .customSidebarTemplateGalleryRequested)`. The receiver (CustomSidebarsSection.swift `.onReceive(NotificationCenter.default.publisher(for: ...))`) registers with no `object` filter either, so observability is unchanged. The "Fixes the gallery notification argument" claim is therefore not achieved by this change.</comment>

<file context>
@@ -16,7 +16,7 @@ public enum CustomSidebarTemplateGalleryRequest {
     public static func request() {
         pending = true
-        NotificationCenter.default.post(name: .customSidebarTemplateGalleryRequested)
+        NotificationCenter.default.post(name: .customSidebarTemplateGalleryRequested, object: nil)
     }
 
</file context>

}

public static func consume() -> Bool {
Expand Down
1 change: 1 addition & 0 deletions Sources/CmuxExtensionSidebarSelection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import AppKit
import CmuxExtensionSidebarExamples
import CmuxFoundation
import CmuxSettings
import CmuxSettingsUI
import CmuxSidebarProviderKit
import Foundation

Expand Down
8 changes: 4 additions & 4 deletions cmuxTests/SidebarProviderMenuRegressionTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ struct SidebarProviderMenuRegressionTests {
let directory = root.appendingPathComponent("sidebars", isDirectory: true)
defer { try? FileManager.default.removeItem(at: root) }

let template = try #require(CustomSidebarOnboardingAssets().exampleTemplate(id: "focus"))
let template = try #require(CustomSidebarOnboardingAssets().exampleTemplate(id: "agents-board"))
let first = CmuxExtensionSidebarSelection.writeCustomSidebar(
named: template.suggestedName,
fileExtension: template.fileExtension,
Expand All @@ -468,14 +468,14 @@ struct SidebarProviderMenuRegressionTests {
return
}

#expect(firstName == "focus")
#expect(secondName == "focus-2")
#expect(firstName == "agents-board")
#expect(secondName == "agents-board-2")
#expect(firstURL != secondURL)
#expect(CustomSidebarValidator().validate(fileURL: firstURL).errorMessage == nil)
#expect(CustomSidebarValidator().validate(fileURL: secondURL).errorMessage == nil)
#expect(
CmuxExtensionSidebarSelection.discoveredCustomSidebarNames(sidebarsDirectory: directory)
== ["focus", "focus-2"]
== ["agents-board", "agents-board-2"]
)
}

Expand Down
6 changes: 6 additions & 0 deletions scripts/ci/restore-app-host-test-product.sh
Original file line number Diff line number Diff line change
Expand Up @@ -110,3 +110,9 @@ if [ -n "${GITHUB_ENV:-}" ]; then
echo "CMUX_CI_RUNTIME_SOURCE_ROOT=$CMUX_CI_RUNTIME_SOURCE_ROOT" >> "$GITHUB_ENV"
fi
scripts/ci/canonical-build-root.sh --runtime-source "$PWD"
# `#filePath` literals keep the producer's canonical path even though the
# compiler's prefix map makes the rest of the test metadata portable. Keep a
# second alias at that exact path for tests that still open repository files
# directly (for example bundled CLI scripts).
CMUX_CI_RUNTIME_SOURCE_ROOT="${CMUX_CI_CANONICAL_ROOT:-/private/tmp/cmux-ci}" \

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: This second invocation makes canonical-build-root.sh --runtime-source operate on $CMUX_CI_CANONICAL_ROOT/src — the same path as the real canonical source copy that every canonical compile step (fingerprint/resolve/build run from $CANONICAL_BUILD_ROOT/src) uses — and the script does rm -rf "$runtime_src" before symlinking. The restore job never takes the canonical-root lock (only take-product-canonical-root.sh jobs do; here only a GUI token is taken for test-here), so on owned Macs, where several jobs share the roots, this can delete a source tree another job is concurrently fingerprinting or compiling. It also leaves the canonical src as a symlink; the next canonical-fingerprint/canonical-build that strips the alias (compile-app-host-test-product.sh rms it and mkdir -ps) runs against an empty tree unless a canonical-resolve re-copies first, and fingerprint runs before resolve in the compile job. Hold the canonical root before replacing its src, or confine the second alias to a path that isn't the real compile tree.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At scripts/ci/restore-app-host-test-product.sh, line 117:

<comment>This second invocation makes `canonical-build-root.sh --runtime-source` operate on `$CMUX_CI_CANONICAL_ROOT/src` — the same path as the real canonical source copy that every canonical compile step (`fingerprint`/`resolve`/`build` run from `$CANONICAL_BUILD_ROOT/src`) uses — and the script does `rm -rf "$runtime_src"` before symlinking. The restore job never takes the canonical-root lock (only `take-product-canonical-root.sh` jobs do; here only a GUI token is taken for test-here), so on owned Macs, where several jobs share the roots, this can delete a source tree another job is concurrently fingerprinting or compiling. It also leaves the canonical `src` as a symlink; the next `canonical-fingerprint`/`canonical-build` that strips the alias (compile-app-host-test-product.sh `rm`s it and `mkdir -p`s) runs against an empty tree unless a `canonical-resolve` re-copies first, and fingerprint runs before resolve in the compile job. Hold the canonical root before replacing its `src`, or confine the second alias to a path that isn't the real compile tree.</comment>

<file context>
@@ -110,3 +110,9 @@ if [ -n "${GITHUB_ENV:-}" ]; then
+# compiler's prefix map makes the rest of the test metadata portable. Keep a
+# second alias at that exact path for tests that still open repository files
+# directly (for example bundled CLI scripts).
+CMUX_CI_RUNTIME_SOURCE_ROOT="${CMUX_CI_CANONICAL_ROOT:-/private/tmp/cmux-ci}" \
+  scripts/ci/canonical-build-root.sh --runtime-source "$PWD"
</file context>

scripts/ci/canonical-build-root.sh --runtime-source "$PWD"
6 changes: 5 additions & 1 deletion tests/test_ci_change_areas.py
Original file line number Diff line number Diff line change
Expand Up @@ -5767,8 +5767,12 @@ def test_static_preflight_rejects_stale_embedded_schema_before_native_work() ->
else 'print("Ran 1 test in 0.001s\\nOK")\n' if category == "tests"
else "pass\n")
target.chmod(0o755)
for name in ("verify-local.py", "verification_receipt.py"):
for name in ("verify-local.py", "verification_receipt.py", "check-agent-hook-docs.py"):
shutil.copy2(ROOT / "scripts" / name, repo / "scripts" / name)
for path in ("CLI/CMUXCLI+AgentHookCatalog.swift", "docs/agent-hooks.md"):
target = repo / path
target.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(ROOT / path, target)
generator = repo / "scripts/generate-cmux-config-schema.py"
generator.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(ROOT / "scripts/generate-cmux-config-schema.py", generator)
Expand Down
2 changes: 1 addition & 1 deletion vendor/bonsplit
Loading