Repository navigation
Conversation
|
@leegisang is attempting to deploy a commit to the Manaflow Team on Vercel. A member of the Team first needs to authorize it. |
📝 WalkthroughWalkthroughWorkspace group creation no longer creates a fresh terminal workspace as the group header anchor; instead, the first eligible selected child workspace is promoted as the anchor. This change cascades through the ChangesAnchor-Promoted Workspace Groups
Sequence Diagram(s)sequenceDiagram
rect rgba(173, 216, 230, 0.5)
Note over Caller,TabManager: Group Creation (anchor promoted from children)
end
participant Caller
participant WorkspaceGroupCoordinator
participant WorkspaceGroup
participant TabManager
Caller->>WorkspaceGroupCoordinator: createWorkspaceGroup(eligibleChildren)
WorkspaceGroupCoordinator->>WorkspaceGroupCoordinator: anchorId = eligibleChildren.first
WorkspaceGroupCoordinator->>WorkspaceGroup: init(anchorWorkspaceId: anchorId)
WorkspaceGroupCoordinator->>WorkspaceGroupCoordinator: assign groupId to each child
WorkspaceGroupCoordinator->>WorkspaceGroupCoordinator: placeNewWorkspaceGroupAtCreationPosition(childIds)
WorkspaceGroupCoordinator->>TabManager: select promoted anchor (if selectAnchor)
WorkspaceGroupCoordinator-->>Caller: workspaceOrderDidChange(movedIds: eligibleChildren)
sequenceDiagram
rect rgba(255, 218, 185, 0.5)
Note over cmuxApp,SidebarWorkspaceRenderItem: Digit shortcut → workspace selection (UUID-based)
end
participant cmuxApp
participant TabManager
participant SidebarWorkspaceRenderItem
participant WorkspaceShortcutMapper
cmuxApp->>TabManager: selectWorkspaceByShortcutDigit(digit)
TabManager->>SidebarWorkspaceRenderItem: numberedShortcutWorkspaceIds(tabs, groupsById)
Note right of SidebarWorkspaceRenderItem: skips group headers & collapsed members
SidebarWorkspaceRenderItem-->>TabManager: [UUID]
TabManager->>WorkspaceShortcutMapper: workspaceId(forDigit:, workspaceIds:)
WorkspaceShortcutMapper-->>TabManager: UUID?
TabManager->>TabManager: find tab by UUID, selectTab
TabManager-->>cmuxApp: Bool
Estimated code review effort🎯 4 (Complex) | ⏱️ ~65 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 19 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (19 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Greptile SummaryThis PR fixes Cmd+number workspace selection by replacing the raw-index approach with a visible-row mapping that skips group headers and collapsed members. It also removes the "fresh anchor terminal" pattern from group creation — the first eligible selected workspace is now promoted as the anchor, eliminating a hidden workspace that previously inflated the workspace count and broke shortcut numbering.
Confidence Score: 5/5Safe to merge; the behavioral change is coherent, well-tested, and the stale-locale issue from the previous review round is fully addressed. The core group-creation and shortcut-routing changes are mechanically straightforward — removing one workspace creation call and replacing a raw index lookup with a visible-row mapping. All 20 locale files are updated. The new numberedWorkspaceShortcutsSkipGroupHeadersAndCollapsedMembers test exercises the end-to-end shortcut flow, and the existing coordinator and group-ordering tests were revised to match the promoted-anchor invariant. The one non-blocking concern is a dead anchorWorkingDirectory parameter left in the public coordinator API with a suppression assignment; this is documented but should be cleaned up in a follow-up. No files require special attention. WorkspaceGroupCoordinator.swift has a dead public parameter worth tracking for future cleanup. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[User presses Cmd+N] --> B[AppDelegate shortcut handler]
B --> C[manager.selectWorkspaceByShortcutDigit digit]
C --> D[numberedWorkspaceShortcutWorkspaceIds]
D --> E[SidebarWorkspaceRenderItem.renderItems]
E --> F{For each tab in order}
F --> G{Has groupId?}
G -- No --> H[Emit .workspace row]
G -- Yes --> I{Group collapsed?}
I -- Yes --> J[Emit .groupHeader only]
I -- No --> L[Emit .workspace row incl. anchor]
J --> F
H --> F
L --> F
F --> M[compactMap numberedShortcutWorkspaceId]
M --> N[WorkspaceShortcutMapper.workspaceId forDigit]
N --> O{digit == 9?}
O -- Yes --> P[Select last visible workspace]
O -- No --> Q[Select workspace at digit-1 index]
P --> R[TabManager.selectWorkspace]
Q --> R
%%{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[User presses Cmd+N] --> B[AppDelegate shortcut handler]
B --> C[manager.selectWorkspaceByShortcutDigit digit]
C --> D[numberedWorkspaceShortcutWorkspaceIds]
D --> E[SidebarWorkspaceRenderItem.renderItems]
E --> F{For each tab in order}
F --> G{Has groupId?}
G -- No --> H[Emit .workspace row]
G -- Yes --> I{Group collapsed?}
I -- Yes --> J[Emit .groupHeader only]
I -- No --> L[Emit .workspace row incl. anchor]
J --> F
H --> F
L --> F
F --> M[compactMap numberedShortcutWorkspaceId]
M --> N[WorkspaceShortcutMapper.workspaceId forDigit]
N --> O{digit == 9?}
O -- Yes --> P[Select last visible workspace]
O -- No --> Q[Select workspace at digit-1 index]
P --> R[TabManager.selectWorkspace]
Q --> R
Reviews (7): Last reviewed commit: "Merge branch 'main' into fix/workspace-g..." | Re-trigger Greptile |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Packages/CmuxMobileShellModel/Sources/CmuxMobileShellModel/MobileWorkspaceGroupPreview.swift (1)
39-48:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winAlign the initializer docs with the new anchor semantics.
The property comment now says the anchor workspace positions the group, but the
anchorWorkspaceIDparameter still says it owns the group. That leaves the generated API docs contradictory.🤖 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 `@Packages/CmuxMobileShellModel/Sources/CmuxMobileShellModel/MobileWorkspaceGroupPreview.swift` around lines 39 - 48, The property documentation for anchorWorkspaceID states that it positions the group, but the initializer parameter documentation for anchorWorkspaceID states that it owns the group. Update the parameter documentation comment for anchorWorkspaceID in the initializer to use "positions" instead of "owns" to align with the property's semantic meaning and ensure consistency in the generated API documentation.
🤖 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
`@Packages/CmuxWorkspaces/Tests/CmuxWorkspacesTests/WorkspaceCoordinatorTests.swift`:
- Line 267: The `try! `#require`(...)` pattern at the assignment to groupId uses
force try which can crash the test process instead of reporting a proper test
failure. Replace the force try (`try!`) with a regular `try` statement in a
throwing context to allow proper error propagation and test failure reporting.
Ensure the test function containing this line is marked as `throws` so that any
errors from the `createWorkspaceGroup` call will properly fail the test instead
of hard-crashing the test process.
---
Outside diff comments:
In
`@Packages/CmuxMobileShellModel/Sources/CmuxMobileShellModel/MobileWorkspaceGroupPreview.swift`:
- Around line 39-48: The property documentation for anchorWorkspaceID states
that it positions the group, but the initializer parameter documentation for
anchorWorkspaceID states that it owns the group. Update the parameter
documentation comment for anchorWorkspaceID in the initializer to use
"positions" instead of "owns" to align with the property's semantic meaning and
ensure consistency in the generated API documentation.
🪄 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: 8316370a-b1c6-4bd4-b40a-be986f69eac2
📒 Files selected for processing (29)
Packages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/WorkspaceGroup/ControlWorkspaceGroupContext.swiftPackages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/WorkspaceGroup/ControlWorkspaceGroupCreateResolution.swiftPackages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/WorkspaceGroup/ControlWorkspaceGroupFocusResolution.swiftPackages/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileSyncWorkspaceListResponse.swiftPackages/CmuxMobileShellModel/Sources/CmuxMobileShellModel/MobileWorkspaceGroupPreview.swiftPackages/CmuxMobileShellModel/Sources/CmuxMobileShellModel/MobileWorkspaceListItem.swiftPackages/CmuxMobileShellModel/Tests/CmuxMobileShellModelTests/MobileWorkspaceListItemTests.swiftPackages/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceGroupHeaderRow.swiftPackages/CmuxWorkspaces/Sources/CmuxWorkspaces/Coordinators/WorkspaceGroupCoordinator.swiftPackages/CmuxWorkspaces/Sources/CmuxWorkspaces/Coordinators/WorkspaceGroupHosting.swiftPackages/CmuxWorkspaces/Sources/CmuxWorkspaces/Model/WorkspaceTabRepresenting.swiftPackages/CmuxWorkspaces/Sources/CmuxWorkspaces/Model/WorkspacesModel+GroupInvariants.swiftPackages/CmuxWorkspaces/Sources/CmuxWorkspaces/Values/WorkspaceGroup.swiftPackages/CmuxWorkspaces/Tests/CmuxWorkspacesTests/WorkspaceCoordinatorTests.swiftSources/App/TerminalDirectoryOpenSupport.swiftSources/AppDelegate.swiftSources/ContentView.swiftSources/SidebarWorkspaceGroupHeaderView.swiftSources/SidebarWorkspaceRenderItem.swiftSources/TabManager+WindowTitle.swiftSources/TabManager.swiftSources/TerminalController+ControlWorkspaceGroupContext.swiftSources/VerticalTabsSidebar+WorkspaceGroups.swiftSources/cmuxApp.swiftcmuxTests/MobileWorkspaceListFidelityTests.swiftcmuxTests/WorkspaceGroupTests.swiftdocs/workspace-groups.mdweb/messages/en.jsonweb/messages/ja.json
💤 Files with no reviewable changes (1)
- Sources/TabManager+WindowTitle.swift
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Sources/VerticalTabsSidebar+WorkspaceGroups.swift (1)
27-31:⚠️ Potential issue | 🟠 Major | ⚡ Quick winAvoid per-render full member scans for collapsed-group unread counts.
Line 27–31 recomputes unread by iterating all
memberWorkspaceIdsinside a sidebar render path. With scalable data (~1000 workspaces), this introduces repeated O(n) scans per render/event. Precompute group unread totals once in the render-context snapshot (e.g.,[UUID: Int]keyed by group id) and read O(1) here.As per coding guidelines, this path must avoid repeated full scans over workspace/group collections in render hot paths and should use a cached/pre-indexed snapshot.
🤖 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 `@Sources/VerticalTabsSidebar`+WorkspaceGroups.swift around lines 27 - 31, The `anchorUnreadCount` computation at lines 27-31 iterates through all `memberWorkspaceIds` on every render, creating an O(n) performance issue with large workspace counts. Replace the reduce loop that scans `memberWorkspaceIds` with a simple O(1) dictionary lookup by precomputing a snapshot of unread totals (keyed by group ID) earlier in the render-context pipeline, then accessing the cached value here instead of recalculating it each time.Source: Coding guidelines
🤖 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.
Outside diff comments:
In `@Sources/VerticalTabsSidebar`+WorkspaceGroups.swift:
- Around line 27-31: The `anchorUnreadCount` computation at lines 27-31 iterates
through all `memberWorkspaceIds` on every render, creating an O(n) performance
issue with large workspace counts. Replace the reduce loop that scans
`memberWorkspaceIds` with a simple O(1) dictionary lookup by precomputing a
snapshot of unread totals (keyed by group ID) earlier in the render-context
pipeline, then accessing the cached value here instead of recalculating it each
time.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 08b51276-b6ce-40df-9bce-7654ef2f27c0
📒 Files selected for processing (20)
Packages/CmuxWorkspaces/Sources/CmuxWorkspaces/Values/WorkspaceGroup.swiftSources/VerticalTabsSidebar+WorkspaceGroups.swiftweb/messages/ar.jsonweb/messages/bs.jsonweb/messages/da.jsonweb/messages/de.jsonweb/messages/es.jsonweb/messages/fr.jsonweb/messages/it.jsonweb/messages/km.jsonweb/messages/ko.jsonweb/messages/no.jsonweb/messages/pl.jsonweb/messages/pt-BR.jsonweb/messages/ru.jsonweb/messages/th.jsonweb/messages/tr.jsonweb/messages/uk.jsonweb/messages/zh-CN.jsonweb/messages/zh-TW.json
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (4)
Packages/CmuxWorkspaces/Tests/CmuxWorkspacesTests/WorkspaceCoordinatorTests.swift (4)
199-199: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick winReplace
try!with throwable test flow for consistency.Line 199 uses
try!#require(...), the same pattern that was fixed at Line 267. This can crash the test process instead of reporting a proper test failure.♻️ Proposed fix
`@Test` -func createWorkspaceGroupAdoptsChildrenAndKeepsSectionContiguous() { +func createWorkspaceGroupAdoptsChildrenAndKeepsSectionContiguous() throws { let (model, host, groups, _) = makeWorld() @@ - let group = try! `#require`(model.workspaceGroups.first(where: { $0.id == groupId })) + let group = try `#require`(model.workspaceGroups.first(where: { $0.id == groupId }))🤖 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 `@Packages/CmuxWorkspaces/Tests/CmuxWorkspacesTests/WorkspaceCoordinatorTests.swift` at line 199, Replace the `try! `#require`(...)` pattern on line 199 where the workspaceGroup is retrieved from model.workspaceGroups with the proper throwable test flow pattern that was already applied at line 267. This will ensure the code reports proper test failures instead of crashing the test process when the required workspace group is not found.
231-231: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick winReplace
try!with throwable test flow for consistency.Line 231 uses
try!#require(...), the same pattern that was fixed at Line 267. This can crash the test process instead of reporting a proper test failure.♻️ Proposed fix
`@Test` -func deleteWorkspaceGroupClosesMembersAndClearsLastHoldout() { +func deleteWorkspaceGroupClosesMembersAndClearsLastHoldout() throws { let (model, host, groups, _) = makeWorld() @@ - let groupId = try! `#require`(groups.createWorkspaceGroup(name: "G", childWorkspaceIds: [a.id, b.id])) + let groupId = try `#require`(groups.createWorkspaceGroup(name: "G", childWorkspaceIds: [a.id, b.id]))🤖 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 `@Packages/CmuxWorkspaces/Tests/CmuxWorkspacesTests/WorkspaceCoordinatorTests.swift` at line 231, Replace the `try! `#require`(...)` pattern in the createWorkspaceGroup call with a proper throwable test flow for consistency with the pattern already used elsewhere in the test file. Instead of using force try with `#require` which can crash the test process, use the appropriate throwable pattern (likely `try `#require`(...)` or a similar construct that allows the test framework to properly report failures) to ensure errors are handled as test failures rather than crashes.
251-251: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick winReplace
try!with throwable test flow for consistency.Line 251 uses
try!#require(...), the same pattern that was fixed at Line 267. This can crash the test process instead of reporting a proper test failure.♻️ Proposed fix
`@Test` -func ungroupKeepsMemberPositionsAndDropsMembership() { +func ungroupKeepsMemberPositionsAndDropsMembership() throws { let (model, host, groups, _) = makeWorld() @@ - let groupId = try! `#require`(groups.createWorkspaceGroup(name: "G", childWorkspaceIds: [a.id])) + let groupId = try `#require`(groups.createWorkspaceGroup(name: "G", childWorkspaceIds: [a.id]))🤖 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 `@Packages/CmuxWorkspaces/Tests/CmuxWorkspacesTests/WorkspaceCoordinatorTests.swift` at line 251, Replace the `try!` keyword with `try` in the WorkspaceCoordinatorTests.swift file at line 251 where groupId is assigned using `#require`(groups.createWorkspaceGroup(...)). This change ensures that if the workspace group creation fails, the test will report a proper test failure instead of crashing the test process, consistent with the fix already applied at line 267.
306-306: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick winReplace
try!with throwable test flow for consistency.Line 306 uses
try!#require(...), the same pattern that was fixed at Line 267. This can crash the test process instead of reporting a proper test failure.♻️ Proposed fix
`@Test` -func setWorkspaceGroupAnchorHoistsNewAnchorToSectionFront() { +func setWorkspaceGroupAnchorHoistsNewAnchorToSectionFront() throws { let (model, host, groups, _) = makeWorld() @@ - let groupId = try! `#require`(groups.createWorkspaceGroup(name: "G", childWorkspaceIds: [a.id, b.id])) + let groupId = try `#require`(groups.createWorkspaceGroup(name: "G", childWorkspaceIds: [a.id, b.id]))🤖 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 `@Packages/CmuxWorkspaces/Tests/CmuxWorkspacesTests/WorkspaceCoordinatorTests.swift` at line 306, Replace the try! unwrap in the groupId assignment where createWorkspaceGroup is called with a proper throwable test flow for consistency. Instead of using try! `#require`(...), use a pattern that allows test failures to be reported properly rather than crashing the test process. This matches the fix that was already applied to similar code elsewhere in the test file.
🤖 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.
Outside diff comments:
In
`@Packages/CmuxWorkspaces/Tests/CmuxWorkspacesTests/WorkspaceCoordinatorTests.swift`:
- Line 199: Replace the `try! `#require`(...)` pattern on line 199 where the
workspaceGroup is retrieved from model.workspaceGroups with the proper throwable
test flow pattern that was already applied at line 267. This will ensure the
code reports proper test failures instead of crashing the test process when the
required workspace group is not found.
- Line 231: Replace the `try! `#require`(...)` pattern in the createWorkspaceGroup
call with a proper throwable test flow for consistency with the pattern already
used elsewhere in the test file. Instead of using force try with `#require` which
can crash the test process, use the appropriate throwable pattern (likely `try
`#require`(...)` or a similar construct that allows the test framework to properly
report failures) to ensure errors are handled as test failures rather than
crashes.
- Line 251: Replace the `try!` keyword with `try` in the
WorkspaceCoordinatorTests.swift file at line 251 where groupId is assigned using
`#require`(groups.createWorkspaceGroup(...)). This change ensures that if the
workspace group creation fails, the test will report a proper test failure
instead of crashing the test process, consistent with the fix already applied at
line 267.
- Line 306: Replace the try! unwrap in the groupId assignment where
createWorkspaceGroup is called with a proper throwable test flow for
consistency. Instead of using try! `#require`(...), use a pattern that allows test
failures to be reported properly rather than crashing the test process. This
matches the fix that was already applied to similar code elsewhere in the test
file.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 9393eb2c-5300-4beb-b7fe-d26abadee167
📒 Files selected for processing (9)
Packages/CmuxMobileShellModel/Sources/CmuxMobileShellModel/MobileWorkspaceGroupPreview.swiftPackages/CmuxWorkspaces/Tests/CmuxWorkspacesTests/WorkspaceCoordinatorTests.swiftSources/App/TerminalDirectoryOpenSupport.swiftSources/AppDelegate.swiftSources/ContentView.swiftSources/TabManager+WorkspaceShortcuts.swiftSources/VerticalTabsSidebar+WorkspaceGroups.swiftSources/WorkspaceShortcutMapper.swiftcmux.xcodeproj/project.pbxproj
💤 Files with no reviewable changes (1)
- Sources/App/TerminalDirectoryOpenSupport.swift
|
@coderabbitai resume |
✅ Action performedReviews resumed. |
…eader-shortcuts # Conflicts: # Sources/ContentView.swift # cmux.xcodeproj/project.pbxproj
…eader-shortcuts # Conflicts: # Sources/AppDelegate.swift # Sources/VerticalTabsSidebar+WorkspaceGroups.swift
|
The anchor and visible-row behavior changes a workspace-group interaction model, so this needs the product call tracked in #15427 before landing. |
Summary
Root cause
Workspace groups used a fresh anchor workspace as the group header representation. That hidden/virtual-looking terminal workspace still lived in the workspace list, so Cmd+number navigation counted the group header and hidden grouped members instead of the visible open workspace rows.
Validation
git diff --checkjq empty web/messages/en.json web/messages/ja.jsonNot run
swift test --package-path Packages/CmuxWorkspacesandswift test --package-path Packages/CmuxMobileShellModel: local Command Line Tools Swift cannot parse the package manifests (.swiftLanguageMode(.v6)/ iOS 18 platform).xcodebuild/ app build: active developer directory is/Library/Developer/CommandLineTools, not Xcode../scripts/reload.sh --tag fix-workspace-groups: failed becausezigis not installed.Need help on this PR? Tag
/codesmithwith what you need. Autofix is disabled.Summary by cubic
Fixes Cmd+number workspace selection to target only visible workspace rows and keeps digits consistent across sidebar badges and View → Workspace N. Groups now promote an existing anchor; when expanded the anchor shows as a normal row under the header.
Bug Fixes
Migration
workspace.group.createwith an explicit empty children list now fails; header-only groups are not created.cwdfor group creation is accepted for compatibility but ignored; docs and localized text updated to “anchor positions the group.”Written for commit 7326d00. Summary will update on new commits.
Summary by CodeRabbit
Release Notes