Skip to content

feat: add set-color/clear-color to workspace-action CLI - #1833

Merged
lawrencecchen merged 4 commits into
manaflow-ai:mainfrom
bagelcode-jhkim:feature/workspace-set-color
Mar 20, 2026
Merged

lawrencecchen merged 4 commits into
manaflow-ai:mainfrom
bagelcode-jhkim:feature/workspace-set-color

Conversation

@bagelcode-jhkim

@bagelcode-jhkim bagelcode-jhkim commented Mar 20, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Add CLI support for setting workspace tab colors via workspace-action.

Usage

# Set color by name
cmux workspace-action --action set-color --workspace workspace:1 --color Red

# Set color by hex
cmux workspace-action --action set-color --workspace workspace:1 --color '#C0392B'

# Clear color
cmux workspace-action --action clear-color --workspace workspace:1

Changes

  • CLI/cmux.swift: Add --color option parsing, validation for set_color action, help text and synopsis updates
  • Sources/TerminalController.swift: Add set_color/clear_color to supportedActions, implement switch cases with:
    • Named color → hex resolution via WorkspaceTabColorSettings.defaultPalette
    • Hex input validation via normalizedHex()
    • Proper error messages for invalid colors

Motivation

Currently workspace colors can only be set via the UI context menu. This enables scripting use cases like:

  • Auto-assigning colors based on project name hash when creating workspaces
  • Batch color assignment across workspaces
  • Hook-driven color normalization

No model changes needed — tabManager.setTabColor(tabId:color:) and WorkspaceTabColorSettings already exist.


Summary by cubic

Add set-color and clear-color to cmux workspace-action so you can script workspace tab colors. Supports named colors and #RRGGBB with validation and clear errors.

  • New Features
    • Parse --color in the CLI, require it for set-color, and pass it in the v2 payload.
    • Resolve color names via WorkspaceTabColorSettings.defaultPalette and validate hex via normalizedHex().
    • Handle set_color/clear_color in TerminalController; update help text and synopsis.

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

Summary by CodeRabbit

New Features

  • Added ability to set and clear workspace tab colors using new --color option
  • Supports color specification via hex values or named colors from the default palette
  • Includes validation with clear error messaging for invalid or missing color inputs

- CLI: parse --color option in runWorkspaceAction
- CLI: validate --color required for set-color action
- CLI: pass color param to v2 payload
- CLI: update help text and usage summary
- TerminalController: add set_color/clear_color to supportedActions
- TerminalController: handle set_color/clear_color cases via setTabColor
@vercel

vercel Bot commented Mar 20, 2026

Copy link
Copy Markdown

@bagelcode-jhkim is attempting to deploy a commit to the Manaflow Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Mar 20, 2026 •

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Extended CLI argument parsing for workspace actions with --color option support and added backend handlers for set_color and clear_color actions. Color values are validated, resolved via hex or palette lookup, and applied to workspace tabs via tab manager.

Changes

Cohort / File(s) Summary
CLI argument parsing
CLI/cmux.swift
Added --color option parsing and validation requiring this flag for set_color action. Updated usage text with new action examples and included color parameter in v2 request payload.
Workspace action handlers
Sources/TerminalController.swift
Added set_color and clear_color to action allow-list with color validation, hex/palette resolution, and tab color management. Returns appropriate error responses for invalid inputs.

Sequence Diagram

sequenceDiagram
    participant User
    participant CLI as CLI/cmux
    participant TC as TerminalController
    participant Settings as WorkspaceTabColorSettings
    participant TM as tabManager

    User->>CLI: workspace-action set-color --color "FF5733"
    CLI->>CLI: Parse --color option
    CLI->>CLI: Validate color parameter present
    CLI->>TC: sendV2(method: "workspace.action",<br/>params: {action, color})
    
    TC->>TC: Validate color not empty
    alt Color is hex
        TC->>Settings: normalizedHex(color)
        Settings-->>TC: Validated hex "#RRGGBB"
    else Color is name
        TC->>Settings: defaultPalette lookup
        Settings-->>TC: Hex from palette
    else Invalid
        TC-->>User: invalid_params error
    end
    
    TC->>TM: setTabColor(tabId: color: "#RRGGBB")
    TM-->>TC: ✓ Updated
    TC-->>User: {success, color: "#RRGGBB"}
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Poem

🐰 Hop-hop, colors bloom in the CLI today,
Set and clear them in a rainbow way!
Hex or palette names, the choice is thine,
Workspace tabs now paint in colors divine! 🎨

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description provides a comprehensive Summary section with motivation and changes, detailed Usage examples, and implementation details. However, it lacks the Testing section, Demo Video section, Review Trigger block, and Checklist as specified in the template. Add Testing section documenting how the change was tested locally, include a Demo Video section (or note if not applicable for CLI changes), add the Review Trigger block with bot review requests, and complete the Checklist items.
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding set-color and clear-color actions to the workspace-action CLI command.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
📝 Coding Plan
  • Generate coding plan for human review comments

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.

Tip

You can disable the changed files summary in the walkthrough.

Disable the reviews.changed_files_summary setting to disable the changed files summary in the walkthrough.

@greptile-apps

greptile-apps Bot commented Mar 20, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR exposes two new workspace tab color operations — set-color and clear-color — as first-class workspace-action subcommands, enabling scripted color assignment that was previously only available through the UI context menu.

Key changes:

  • CLI/cmux.swift: adds --color option parsing to runWorkspaceAction, a pre-flight guard that rejects set_color when --color is omitted, propagates the color param to the V2 payload, and updates help/synopsis text.
  • Sources/TerminalController.swift: registers set_color/clear_color in supportedActions and implements the corresponding switch cases — hex inputs are normalized via WorkspaceTabColorSettings.normalizedHex(), named colors are resolved from the palette, and the final hex is passed to tabManager.setTabColor.

One logic bug found: the named-color lookup in TerminalController.swift uses WorkspaceTabColorSettings.defaultPalette (the raw, unoverridden palette) instead of WorkspaceTabColorSettings.palette(). This silently bypasses any user-configured default-color overrides and omits custom named colors, causing set-color --color Red to apply the hardcoded hex rather than the user's actual current "Red" color. The error message that lists valid names has the same issue.

Confidence Score: 3/5

  • Safe to merge with the palette bug fixed; the clear-color path and hex-input path are correct, but the named-color path ignores user overrides.
  • The overall structure is clean and the hex-validation path is correct. However, using defaultPalette instead of palette() for named-color resolution is a real correctness bug — a user who has customized their "Red" color will get the wrong hex silently, with no error. This needs a one-line fix before the feature is fully reliable.
  • Sources/TerminalController.swift — the set_color case palette lookup at lines 4076–4082.

Important Files Changed

Filename Overview
Sources/TerminalController.swift Adds set_color and clear_color switch cases inside v2WorkspaceAction. Logic is mostly correct, but the named-color lookup and error-message palette both use defaultPalette (hardcoded, unoverridden) instead of palette(), so user color overrides and custom named colors are silently ignored.
CLI/cmux.swift Parses --color flag, validates it for set_color, passes it through to workspace.action, and updates help/synopsis text. The parsing chain and validation are correct; the only minor gap is that the resolved color hex is not echoed in non-JSON summary output.

Sequence Diagram

sequenceDiagram
    participant User as User (CLI)
    participant CLI as cmux.swift
    participant Socket as SocketClient
    participant TC as TerminalController
    participant WCS as WorkspaceTabColorSettings
    participant TM as TabManager

    User->>CLI: workspace-action --action set-color --color Red
    CLI->>CLI: parse --color → colorOpt
    CLI->>CLI: guard colorOpt not empty
    CLI->>Socket: sendV2("workspace.action", {action:"set_color", color:"Red"})
    Socket->>TC: v2WorkspaceAction(params)
    TC->>TC: resolve workspace by ID
    TC->>WCS: defaultPalette.first(where name == "Red")
    Note over WCS: ⚠️ Should use palette() to<br/>respect user overrides
    WCS-->>TC: entry.hex = "#C0392B"
    TC->>TM: setTabColor(tabId:, color:"#C0392B")
    TM-->>TC: (tab color updated)
    TC-->>Socket: .ok({action, workspace_id, color:"#C0392B"})
    Socket-->>CLI: payload
    CLI->>User: OK action=set_color workspace=...

    User->>CLI: workspace-action --action clear-color
    CLI->>Socket: sendV2("workspace.action", {action:"clear_color"})
    Socket->>TC: v2WorkspaceAction(params)
    TC->>TM: setTabColor(tabId:, color:nil)
    TC-->>Socket: .ok({action, workspace_id, color:null})
    Socket-->>CLI: payload
    CLI->>User: OK action=clear_color workspace=...
Loading

Comments Outside Diff (1)

  1. CLI/cmux.swift, line 3330-3336 (link)

    P2 Resolved color not surfaced in text-mode summary

    For set_color, the server returns { "color": "<resolved-hex>" } (the normalized hex, which matters especially when the user passed a named color like "Red"). For clear_color, it returns { "color": null }. Neither is included in summaryParts, so the non-JSON CLI output gives no feedback about the resulting color:

    OK action=set_color workspace=workspace:1 window=window:1
    

    Other "value-returning" actions (e.g. rename → title, move_up/down → index) also omit their values from the text summary, so this follows the existing pattern. However, for color specifically the resolved hex is arguably the most useful thing to confirm (especially when a named color was given). Consider adding:

    Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Last reviewed commit: "fix: validate hex in..."

@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: c9f5903836

ℹ️ 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 +4076 to +4077
} else if let entry = WorkspaceTabColorSettings.defaultPalette.first(where: {
$0.name.lowercased() == colorRaw.lowercased()

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 Badge Resolve named colors using configured palette

Named color resolution currently searches WorkspaceTabColorSettings.defaultPalette, which always uses the hardcoded base hex values and ignores user overrides from Settings. In environments where a user has remapped a default color (for example, changed Red to another hex), workspace-action --action set-color --color Red will apply the wrong color compared with the UI palette. This should resolve through the override-aware API (for example defaultColorHex(named:) or defaultPaletteWithOverrides) so CLI behavior matches configured workspace colors.

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.

No issues found across 2 files


Since this is your first cubic review, here's how it works:

  • cubic automatically reviews your code and comments on bugs and improvements
  • Teach cubic by replying to its comments. cubic learns from your replies and gets better over time
  • Add one-off context when rerunning by tagging @cubic-dev-ai with guidance or docs links (including llms.txt)
  • Ask questions if you need clarification on any suggestion

Comment on lines +4076 to +4082
} else if let entry = WorkspaceTabColorSettings.defaultPalette.first(where: {
$0.name.lowercased() == colorRaw.lowercased()
}) {
resolved = entry.hex
} else {
let names = WorkspaceTabColorSettings.defaultPalette.map(\.name).joined(separator: ", ")
result = .err(code: "invalid_params", message: "Unknown color '\(colorRaw)'. Use #RRGGBB or: \(names)", data: nil)

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.

P2 Named color lookup ignores user overrides and custom colors

WorkspaceTabColorSettings.defaultPalette returns the raw, hardcoded originalPRPalette — it does not apply user-configured default overrides (stored under workspaceTabColor.defaultOverrides) nor does it include user-added custom colors (stored under workspaceTabColor.customColors).

This creates two problems:

  1. If a user has overridden, say, "Red" to a custom hex via the UI, set-color --color Red will silently apply the original #C0392B instead of their override.
  2. Any custom named colors the user has added cannot be referenced by name from the CLI.

WorkspaceTabColorSettings.palette() (which returns defaultPaletteWithOverrides + customColorEntries) is the correct source of truth here, and is what the UI color picker uses. The error message listing valid names at line 4081 also needs to use the same source so it accurately reflects the user's actual palette.

Suggested change
} else if let entry = WorkspaceTabColorSettings.defaultPalette.first(where: {
$0.name.lowercased() == colorRaw.lowercased()
}) {
resolved = entry.hex
} else {
let names = WorkspaceTabColorSettings.defaultPalette.map(\.name).joined(separator: ", ")
result = .err(code: "invalid_params", message: "Unknown color '\(colorRaw)'. Use #RRGGBB or: \(names)", data: nil)
} else if let entry = WorkspaceTabColorSettings.palette().first(where: {
$0.name.lowercased() == colorRaw.lowercased()
}) {
resolved = entry.hex
} else {
let names = WorkspaceTabColorSettings.palette().map(\.name).joined(separator: ", ")

@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 (1)
CLI/cmux.swift (1)

3307-3309: Normalize --color before validation and payload construction.

Line 3307 and Line 3318 currently treat whitespace-only input as valid. Trimming once avoids passing effectively-empty values downstream.

Proposed diff
-        if action == "set_color", (colorOpt?.isEmpty ?? true) {
+        let normalizedColor = colorOpt?.trimmingCharacters(in: .whitespacesAndNewlines)
+        if action == "set_color", (normalizedColor?.isEmpty ?? true) {
             throw CLIError(message: "workspace-action set-color requires --color <#hex|name>")
         }
@@
-        if let color = colorOpt, !color.isEmpty {
+        if let color = normalizedColor, !color.isEmpty {
             params["color"] = color
         }

Also applies to: 3318-3320

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CLI/cmux.swift` around lines 3307 - 3309, For the "set_color" branch,
normalize the incoming color option by trimming whitespace before validating and
before using it in the payload: replace uses of colorOpt with a trimmedColor
(e.g., let trimmedColor = colorOpt?.trimmingCharacters(in:
.whitespacesAndNewlines)) and use trimmedColor for the isEmpty check that throws
the CLIError and later when constructing the payload; ensure you still preserve
optional semantics (nil vs empty) so downstream code sees a proper nil or
non-empty hex/name string.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Sources/TerminalController.swift`:
- Around line 4063-4084: The handler for "set_color" currently only treats
strings starting with "#" as hex; update the branching so that after checking
colorRaw.hasPrefix("#") and normalizing that, you also attempt to normalize bare
6-digit hex strings by calling WorkspaceTabColorSettings.normalizedHex(colorRaw)
before falling back to WorkspaceTabColorSettings.defaultPalette lookup; if
normalization succeeds assign to resolved, otherwise continue to palette lookup
and finally return the same invalid_params error message using resolved/colorRaw
as appropriate.

---

Nitpick comments:
In `@CLI/cmux.swift`:
- Around line 3307-3309: For the "set_color" branch, normalize the incoming
color option by trimming whitespace before validating and before using it in the
payload: replace uses of colorOpt with a trimmedColor (e.g., let trimmedColor =
colorOpt?.trimmingCharacters(in: .whitespacesAndNewlines)) and use trimmedColor
for the isEmpty check that throws the CLIError and later when constructing the
payload; ensure you still preserve optional semantics (nil vs empty) so
downstream code sees a proper nil or non-empty hex/name string.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4d8f5396-87c0-483e-90ad-6ebeef65d860

📥 Commits

Reviewing files that changed from the base of the PR and between 8d4ba24 and c9f5903.

📒 Files selected for processing (2)
  • CLI/cmux.swift
  • Sources/TerminalController.swift

Comment on lines +4063 to +4084
case "set_color":
guard let colorRaw = v2String(params, "color"), !colorRaw.isEmpty else {
result = .err(code: "invalid_params", message: "set-color requires --color", data: nil)
return
}
// Resolve named color to hex via palette lookup
let resolved: String
if colorRaw.hasPrefix("#") {
guard let normalized = WorkspaceTabColorSettings.normalizedHex(colorRaw) else {
result = .err(code: "invalid_params", message: "Invalid hex color '\(colorRaw)'. Expected #RRGGBB", data: nil)
return
}
resolved = normalized
} else if let entry = WorkspaceTabColorSettings.defaultPalette.first(where: {
$0.name.lowercased() == colorRaw.lowercased()
}) {
resolved = entry.hex
} else {
let names = WorkspaceTabColorSettings.defaultPalette.map(\.name).joined(separator: ", ")
result = .err(code: "invalid_params", message: "Unknown color '\(colorRaw)'. Use #RRGGBB or: \(names)", data: nil)
return
}

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 | 🟡 Minor

Accept bare 6-digit hex values before falling back to palette names.

Line 4070 only treats #... input as hex, so C0392B is rejected here even though WorkspaceTabColorSettings.normalizedHex(...) already accepts that format.

♻️ Proposed fix
             case "set_color":
-                guard let colorRaw = v2String(params, "color"), !colorRaw.isEmpty else {
-                    result = .err(code: "invalid_params", message: "set-color requires --color", data: nil)
+                guard let colorRaw = v2String(params, "color") else {
+                    result = .err(code: "invalid_params", message: "Missing or invalid color", data: nil)
                     return
                 }
-                // Resolve named color to hex via palette lookup
                 let resolved: String
-                if colorRaw.hasPrefix("#") {
-                    guard let normalized = WorkspaceTabColorSettings.normalizedHex(colorRaw) else {
-                        result = .err(code: "invalid_params", message: "Invalid hex color '\(colorRaw)'. Expected `#RRGGBB`", data: nil)
-                        return
-                    }
+                if let normalized = WorkspaceTabColorSettings.normalizedHex(colorRaw) {
                     resolved = normalized
                 } else if let entry = WorkspaceTabColorSettings.defaultPalette.first(where: {
                     $0.name.lowercased() == colorRaw.lowercased()
                 }) {
                     resolved = entry.hex
                 } else {
                     let names = WorkspaceTabColorSettings.defaultPalette.map(\.name).joined(separator: ", ")
-                    result = .err(code: "invalid_params", message: "Unknown color '\(colorRaw)'. Use `#RRGGBB` or: \(names)", data: nil)
+                    result = .err(code: "invalid_params", message: "Unknown color '\(colorRaw)'. Use a 6-digit hex color or: \(names)", data: nil)
                     return
                 }
📝 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
case "set_color":
guard let colorRaw = v2String(params, "color"), !colorRaw.isEmpty else {
result = .err(code: "invalid_params", message: "set-color requires --color", data: nil)
return
}
// Resolve named color to hex via palette lookup
let resolved: String
if colorRaw.hasPrefix("#") {
guard let normalized = WorkspaceTabColorSettings.normalizedHex(colorRaw) else {
result = .err(code: "invalid_params", message: "Invalid hex color '\(colorRaw)'. Expected #RRGGBB", data: nil)
return
}
resolved = normalized
} else if let entry = WorkspaceTabColorSettings.defaultPalette.first(where: {
$0.name.lowercased() == colorRaw.lowercased()
}) {
resolved = entry.hex
} else {
let names = WorkspaceTabColorSettings.defaultPalette.map(\.name).joined(separator: ", ")
result = .err(code: "invalid_params", message: "Unknown color '\(colorRaw)'. Use #RRGGBB or: \(names)", data: nil)
return
}
case "set_color":
guard let colorRaw = v2String(params, "color") else {
result = .err(code: "invalid_params", message: "Missing or invalid color", data: nil)
return
}
let resolved: String
if let normalized = WorkspaceTabColorSettings.normalizedHex(colorRaw) {
resolved = normalized
} else if let entry = WorkspaceTabColorSettings.defaultPalette.first(where: {
$0.name.lowercased() == colorRaw.lowercased()
}) {
resolved = entry.hex
} else {
let names = WorkspaceTabColorSettings.defaultPalette.map(\.name).joined(separator: ", ")
result = .err(code: "invalid_params", message: "Unknown color '\(colorRaw)'. Use a 6-digit hex color or: \(names)", data: nil)
return
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Sources/TerminalController.swift` around lines 4063 - 4084, The handler for
"set_color" currently only treats strings starting with "#" as hex; update the
branching so that after checking colorRaw.hasPrefix("#") and normalizing that,
you also attempt to normalize bare 6-digit hex strings by calling
WorkspaceTabColorSettings.normalizedHex(colorRaw) before falling back to
WorkspaceTabColorSettings.defaultPalette lookup; if normalization succeeds
assign to resolved, otherwise continue to palette lookup and finally return the
same invalid_params error message using resolved/colorRaw as appropriate.

@lawrencecchen
lawrencecchen merged commit e0c301b into manaflow-ai:main Mar 20, 2026
16 of 17 checks passed
@lawrencecchen

Copy link
Copy Markdown
Contributor

Thanks for the contribution!

jingtaozf pushed a commit to jingtaozf/cmux that referenced this pull request Mar 28, 2026
…1833)

* [auto] cmux session changes (1 files) [03/19 17:38]

* feat: add set-color/clear-color to workspace-action

- CLI: parse --color option in runWorkspaceAction
- CLI: validate --color required for set-color action
- CLI: pass color param to v2 payload
- CLI: update help text and usage summary
- TerminalController: add set_color/clear_color to supportedActions
- TerminalController: handle set_color/clear_color cases via setTabColor

* fix: resolve named colors via palette, improve clear_color response

* fix: validate hex input via normalizedHex, fix synopsis typo
bn-l pushed a commit to bn-l/cmux that referenced this pull request Apr 3, 2026
…1833)

* [auto] cmux session changes (1 files) [03/19 17:38]

* feat: add set-color/clear-color to workspace-action

- CLI: parse --color option in runWorkspaceAction
- CLI: validate --color required for set-color action
- CLI: pass color param to v2 payload
- CLI: update help text and usage summary
- TerminalController: add set_color/clear_color to supportedActions
- TerminalController: handle set_color/clear_color cases via setTabColor

* fix: resolve named colors via palette, improve clear_color response

* fix: validate hex input via normalizedHex, fix synopsis typo
@coderabbitai coderabbitai Bot mentioned this pull request Apr 7, 2026
5 of 6 tasks
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