Skip to content

feat(ui): match Glance footer button and banner geometry, split Muse Assist and Muse Code quotas - #167

Merged
jaywedgeworth22 merged 1 commit into
mainfrom
ag/glance-footer-equidistant-muse-split
Oct 5, 2026
Merged

jaywedgeworth22 merged 1 commit into
mainfrom
ag/glance-footer-equidistant-muse-split

Conversation

@jaywedgeworth22

Copy link
Copy Markdown
Collaborator

Summary

  • Standardize Glance footer height to 40pt with 28pt custom prominent button style (GlanceFooterProminentButtonStyle), exactly matching the runaway notice marquee banner's 28pt height and RoundedRectangle(cornerRadius: 6).
  • Configure button insets so top (6pt), bottom (6pt), and trailing (6pt) margins to the window and divider edges are mathematically equidistant.
  • Ensure high-contrast rendering across dark mode (pastel accent with dark ink) and light mode (deep accent with crisp white text).
  • Split Muse into two separate providers: 'muse-assist' ('Muse Assist') and 'muse-code' ('Muse Code') in QuotaProviders.expected, expanding expected quota providers from 8 to 9.
  • Preserve backward compatibility with aliases for muse-assist, muse-assistant, muse-code, muse, muse-cli, and muse-sdk.
  • Bundle authentic transparent background blue script 'm' PNG for Muse Assist and Meta loop artwork for Muse Code across macOS and iOS asset catalogs.
  • Update QuotaCore, PlatformLogo, iOS Companion models, widgets, and test suites.

Validation

  • All 721 unit tests passing across QuotaCoreTests (390 tests) and CodeCapsTests (331 tests).
  • Clean xcodebuild build of CodeCapsCompanion iOS Simulator target.

…Assist and Muse Code quotas

- Standardize Glance footer height to 40pt with 28pt custom prominent button style matching the runaway notice marquee banner.  Corner radius matches at 6pt.
- Configure button insets so top (6pt), bottom (6pt), and trailing (6pt) margins to the window and divider edges are equidistant.
- Split Muse into two distinct providers: 'muse-assist' ('Muse Assist') and 'muse-code' ('Muse Code') in QuotaProviders.expected.
- Bundle authentic transparent background blue script 'm' for Muse Assist and Meta loop artwork for Muse Code across macOS and iOS asset catalogs.
- Update QuotaCore, PlatformLogo, iOS Companion models, widgets, and test suites.
@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.

@jaywedgeworth22
jaywedgeworth22 merged commit 469ab63 into main Oct 5, 2026
2 checks passed
@kody-ai

kody-ai Bot commented Oct 5, 2026 •

Copy link
Copy Markdown

Code Review Completed! 🔥

The code review was successfully completed based on your current configurations.

Kody Guide: Usage and Configuration
Interacting with Kody
  • Request a Review: Ask Kody to review your PR manually by adding a comment with the @kody start-review command at the root of your PR.

  • Validate Business Logic: Ask Kody to validate your code against business rules by adding a comment with the @kody -v business-logic command.

  • Provide Feedback: Help Kody learn and improve by reacting to its comments with a 👍 for helpful suggestions or a 👎 if improvements are needed.

Current Kody Configuration
Review Options

The following review options are enabled or disabled:

Options Enabled
Bug ✅
Performance ✅
Security ✅
Business Logic ✅

Access your configuration settings here.

​

@jaywedgeworth22
jaywedgeworth22 deleted the ag/glance-footer-equidistant-muse-split branch October 5, 2026 22:02
Comment on lines +656 to +661
if viaLower == "assist" || viaLower == "assistant" {
return "muse-assist"
}
if viaLower == "code" {
return "muse-code"
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kody code-review Bug high

Provider misclassification in canonicalKey applies the via branch for assist/assistant/code without confirming Muse, so manifest groups keyed solely by canonicalKey(provider:providerKey:nil, via:group.via) (QuotaModels.swift:494) and deduped through manifestIndex silently merge a non-Muse group advertised with via: "code" into Muse Code and regroup its windows. Gate the muse-assist/muse-code returns on a trimmed, lowercased providerKey or fallback provider containing muse.

let rawProvider = (providerKey?.isEmpty == false ? providerKey! : provider)
                .trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
            if rawProvider.contains("muse") {
                if viaLower == "assist" || viaLower == "assistant" { return "muse-assist" }
                if viaLower == "code" { return "muse-code" }
            }
Prompt for LLM

File Sources/QuotaCore/QuotaModels.swift:

Line 656 to 661:

Provider misclassification in `canonicalKey` applies the `via` branch for `assist`/`assistant`/`code` without confirming Muse, so manifest groups keyed solely by `canonicalKey(provider:providerKey:nil, via:group.via)` (`QuotaModels.swift:494`) and deduped through `manifestIndex` silently merge a non-Muse group advertised with `via: "code"` into Muse Code and regroup its windows. Gate the `muse-assist`/`muse-code` returns on a trimmed, lowercased `providerKey` or fallback `provider` containing `muse`.

Suggested Code:

let rawProvider = (providerKey?.isEmpty == false ? providerKey! : provider)
                .trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
            if rawProvider.contains("muse") {
                if viaLower == "assist" || viaLower == "assistant" { return "muse-assist" }
                if viaLower == "code" { return "muse-code" }
            }

Talk to Kody by mentioning @kody

Was this suggestion helpful? React with 👍 or 👎 to help Kody learn from this interaction.

​

​

Comment thread docs/EFFORT-LOG.md
@@ -1,5 +1,16 @@
# CodeCaps — Effort Log

## 2026-10-05 — Glance footer equidistant polish, Muse Assist & Muse Code quota split [AG, in progress]

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kody code-review Kody Rules critical

Required pre-work coordination is missing from the docs/EFFORT-LOG.md entry, which marks this substantial change in progress without a repo-first #agent-sync claim or a reference to AGENT-SYNC.md. Read /Users/jay/apps/AGENT-SYNC.md, post a claim in #agent-sync with repo: CodeCaps as the first field, and add the claim reference to the entry.

Also found in:

  • docs/EFFORT-LOG.md:5-5
  • ios/CodeCapsCompanion/Widgets/WidgetViews.swift:144-144
  • ios/CodeCapsCompanion/Widgets/WidgetViews.swift:142-142
  • ios/CodeCapsCompanion/Widgets/WidgetViews.swift:143-143

Kody rule violation: Keep credentials out of public source and verify UI changes with automated screenshots

Prompt for LLM

File docs/EFFORT-LOG.md:

Line 3:

Required pre-work coordination is missing from the `docs/EFFORT-LOG.md` entry, which marks this substantial change in progress without a repo-first `#agent-sync` claim or a reference to `AGENT-SYNC.md`. Read `/Users/jay/apps/AGENT-SYNC.md`, post a claim in `#agent-sync` with `repo: CodeCaps` as the first field, and add the claim reference to the entry.

**Also found in:**
- `docs/EFFORT-LOG.md:5-5`
- `ios/CodeCapsCompanion/Widgets/WidgetViews.swift:144-144`
- `ios/CodeCapsCompanion/Widgets/WidgetViews.swift:142-142`
- `ios/CodeCapsCompanion/Widgets/WidgetViews.swift:143-143`

Talk to Kody by mentioning @kody

Was this suggestion helpful? React with 👍 or 👎 to help Kody learn from this interaction.

​

​

Comment on lines 1280 to 1282
if pKey.contains("muse") || prov.contains("muse") {
return ("muse", "Muse", "muse")
return ("muse-code", "Muse Code", "muse-code")
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kody code-review Bug high

Canonicalization drift affects canonicalManifestKey (lines 1299-1317): the legacy mapping returns muse-code, but the mirror lacks the muse/muse-cli/muse-sdk → muse-code aliases and the new via assist/code handling this PR added to QuotaProviders.canonicalKey, despite its doc comment claiming “the aliases match.” The manifest label lookup (lines 1248-1254), iconHint(for:) lookup (lines 1320-1323), and server ordering key (lines 879-884) compare canonicalManifestKey(...) against muse-code, causing legacy Muse manifest groups to canonicalize to muse on iOS/widget, lose their server labels and icon hints, and fall into the “future keys” bucket (line 898), while Mac (QuotaModels.swift:494) honors the manifest and renders the same provider differently; port the alias rows and via branches into both mirrors.

Prompt for LLM

File ios/CodeCapsCompanion/App/Models/CompanionQuotaModel.swift:

Line 1280 to 1282:

Canonicalization drift affects `canonicalManifestKey` (lines 1299-1317): the legacy mapping returns `muse-code`, but the mirror lacks the `muse`/`muse-cli`/`muse-sdk` → `muse-code` aliases and the new `via` assist/code handling this PR added to `QuotaProviders.canonicalKey`, despite its doc comment claiming “the aliases match.” The manifest label lookup (lines 1248-1254), `iconHint(for:)` lookup (lines 1320-1323), and server ordering key (lines 879-884) compare `canonicalManifestKey(...)` against `muse-code`, causing legacy Muse manifest groups to canonicalize to `muse` on iOS/widget, lose their server labels and icon hints, and fall into the “future keys” bucket (line 898), while Mac (`QuotaModels.swift:494`) honors the manifest and renders the same provider differently; port the alias rows and `via` branches into both mirrors.

Talk to Kody by mentioning @kody

Was this suggestion helpful? React with 👍 or 👎 to help Kody learn from this interaction.

​

​

Comment on lines +1274 to 1282
if pKey.contains("muse-assist") || prov.contains("muse-assist") || prov.contains("muse assist") || id.contains("assist") {
return ("muse-assist", "Muse Assist", "muse-assist")
}
if pKey.contains("muse-code") || prov.contains("muse-code") || prov.contains("muse code") || id.contains("code") {
return ("muse-code", "Muse Code", "muse-code")
}
if pKey.contains("muse") || prov.contains("muse") {
return ("muse", "Muse", "muse")
return ("muse-code", "Muse Code", "muse-code")
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kody code-review Bug high

Provider misclassification in the new Muse branches places the unscoped id.contains("assist") and id.contains("code") disjuncts before the grok-bot, cursor, and grok/xai checks, relabeling any non-Muse window whose WireRawWindow.id merely contains "code" or "assist" as Muse Code or Muse Assist and collapsing it into platformGroups[platKey] (lines 862-868); for example, local-mac:cursor:code-review renders as Muse Code with the Muse mark. Only evaluate the id assist/code test when pKey or prov already identifies Muse, matching the pre-existing id.contains("grok-bot") pattern.

if pKey.contains("muse") || prov.contains("muse") {
            let wantsAssist = pKey.contains("assist") || prov.contains("assist") || id.contains("assist")
            return wantsAssist
                ? ("muse-assist", "Muse Assist", "muse-assist")
                : ("muse-code", "Muse Code", "muse-code")
        }
Prompt for LLM

File ios/CodeCapsCompanion/App/Models/CompanionQuotaModel.swift:

Line 1274 to 1282:

Provider misclassification in the new Muse branches places the unscoped `id.contains("assist")` and `id.contains("code")` disjuncts before the grok-bot, cursor, and grok/xai checks, relabeling any non-Muse window whose `WireRawWindow.id` merely contains "code" or "assist" as Muse Code or Muse Assist and collapsing it into `platformGroups[platKey]` (lines 862-868); for example, `local-mac:cursor:code-review` renders as Muse Code with the Muse mark. Only evaluate the `id` assist/code test when `pKey` or `prov` already identifies Muse, matching the pre-existing `id.contains("grok-bot")` pattern.

Suggested Code:

if pKey.contains("muse") || prov.contains("muse") {
            let wantsAssist = pKey.contains("assist") || prov.contains("assist") || id.contains("assist")
            return wantsAssist
                ? ("muse-assist", "Muse Assist", "muse-assist")
                : ("muse-code", "Muse Code", "muse-code")
        }

Talk to Kody by mentioning @kody

Was this suggestion helpful? React with 👍 or 👎 to help Kody learn from this interaction.

​

​

if low.contains("muse") { return "provider-muse" }
if low.contains("muse-assist") || low.contains("muse_assist") { return "provider-muse-assist" }
if low.contains("muse-code") || low.contains("muse_code") { return "provider-muse-code" }
if low.contains("muse") { return "provider-muse-code" }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kody code-review Kody Rules high

Verification gap in the HogHunterIOS simulator verification leaves the added low.contains("muse") fallback to provider-muse-code unverified for generic Muse identifiers because the diff contains no simulator screenshot capture. Add an automated xcrun simctl io booted screenshot <artifact> step to the simulator verification.

Also found in:

  • ios/CodeCapsCompanion/Widgets/WidgetViews.swift:142-142
  • ios/CodeCapsCompanion/Widgets/WidgetViews.swift:143-143

Kody rule violation: Gate iOS/TestFlight releases on a signing-safe workflow and verify UI changes with automated screenshots

Prompt for LLM

File ios/CodeCapsCompanion/Widgets/WidgetViews.swift:

Line 144:

Verification gap in the `HogHunterIOS` simulator verification leaves the added `low.contains("muse")` fallback to `provider-muse-code` unverified for generic Muse identifiers because the diff contains no simulator screenshot capture. Add an automated `xcrun simctl io booted screenshot <artifact>` step to the simulator verification.

**Also found in:**
- `ios/CodeCapsCompanion/Widgets/WidgetViews.swift:142-142`
- `ios/CodeCapsCompanion/Widgets/WidgetViews.swift:143-143`

Talk to Kody by mentioning @kody

Was this suggestion helpful? React with 👍 or 👎 to help Kody learn from this interaction.

​

​

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