Skip to content

feat(web): redesign skills in $ menu and in / menu - #8009

Merged
maria-rcks merged 8 commits into
pingdotgg:mainfrom
extoci:t3code/toggle-slash-menu-skills
Aug 23, 2026
Merged

maria-rcks merged 8 commits into
pingdotgg:mainfrom
extoci:t3code/toggle-slash-menu-skills

Merge branch 'main' into t3code/toggle-slash-menu-skills

5c4771b
Select commit
Loading
Failed to load commit list.
MacroscopeApp / Macroscope - UI Consistency succeeded Aug 23, 2026 in 1m 44s

UI Consistency: All clear

All clear

Details

Note

Your check run agent prompt is: .macroscope/check-run-agents/ui-consistency.md
More information about how Check Run Agents work can be found in our Help Center.


🔍 Agent activity — 18 tool calls

💭 I'm checking the latest PR head to see if my earlier feedback was addressed—the badge icon color issue looks fixed with the text-current class, and I'm now verifying whether they reverted to FolderIcon instead of the suggested FolderGit2Icon.

1. browse_code — apps/web/src/components/chat/ComposerCommandMenu.tsx

2. browse_code — apps/web/src/components/ui/badge.tsx

💭 I notice repo and project now use the same FolderIcon, making them visually indistinguishable except by label — elsewhere repo uses FolderGit2Icon, so this could be a minor consistency issue worth flagging, though I'd already raised it before and they made this change. Checking for new issues: accessibility looks fine now that the badge shows a visible label, the flex/truncate spacing on the description and label spans seems okay, but I want to verify the icon's size and opacity styling interacts correctly with the badge's default SVG sizing rules since it only sets text-current without a size class. I should also confirm whether CommandItem's descendant SVG styling conflicts with this, check if the label prefix change to "/skill:${skill.name}" affects any slash-command search or insertion logic, and verify that showSkillsInSlashMenu has a proper default in the unified settings contract along with any other consumers of that setting.

3. browse_code — apps/web/src/components/ui/command.tsx

4. git_tools — showSkillsInSlashMenu

💭 There's a discrepancy between the diff and what the head branch actually shows for that default value — the diff seems stale relative to the latest commit, so I should trust what's actually in the head code rather than the diff snippet. Docs mentioning the default may also be outdated, but docs aren't in scope here, so I'll skip that. Now I need to check whether DEFAULT_UNIFIED_SETTINGS includes the showSkillsInSlashMenu field, since my earlier grep didn't surface it in the defaults file.

5. browse_code — Where is DEFAULT_UNIFIED_SETTINGS defined in apps/web (or shared package) and does it include a showSkillsInSlashMenu key? Show the definition and how defaults are derived (e.g. decoded from ClientSettingsSchema).

6. browse_code — apps/web/src/components/settings/SettingsPanels.tsx

💭 The settings row matches the existing pattern fine. There's a discrepancy between what code_research reported (default true) and what the grep actually showed (default false) — I'll trust the grep result since it directly shows the value, and this doesn't create a real consistency issue for the UI since the test expectations would align with false either way. Shifting to the ComposerCommandMenu changes now, I'm checking badge sizing against the row's text size, whether the auto-margin spacing works correctly alongside the flex-1 and max-width constraints on the description, and confirming the label truncation and accessibility behavior all hold up as intended. Then I trace how currentColor cascades from the badge into the icon, verify the active-state styling doesn't override the badge's own colors, and note that switching description text alignment from right to left affects all command menu items broadly, not just skills — which seems like a deliberate layout decision worth checking against the truncation behavior for path-based descriptions. I'm now checking whether the same skillItems array feeds both the slash menu and the $ trigger menu in ChatComposer — if so, skill rows under $ would incorrectly show the /skill:foo label instead of the display name.

7. browse_code — apps/web/src/components/chat/ChatComposer.tsx

💭 I notice the $ trigger consistently uses the formatted provider skill display name as its label, while the badge suffix differs slightly between / and $ triggers ("App" vs "App Skill") -- likely intentional since the / label already includes a prefix. I'm now checking the / menu's skill row rendering, particularly how display names appear there. Beyond that, I'm scanning for stronger issues: whether resolveProviderSkillSourceKind behaves consistently across triggers, layout constraints on labels/descriptions/badges, whether truncate works correctly on flex children, and whether the badge's <span> wrapper nests properly inside CommandItem without invalid HTML. I also want to verify the badge icon sizing doesn't conflict with base autocomplete item classes that might force a different SVG size.

8. git_tools — svg

💭 Good, the text-current issue is resolved since it avoids the muted-foreground rule. Now I'm checking the active item styling on the CommandItem and confirming the badge keeps its own secondary colors independently. I want to see if Badge is typically used with a smaller size in similar xs-sized list rows elsewhere in the app. The badge's default text-sm on mobile is intentionally larger than the row's text-xs by design of the primitive, so that's probably fine rather than a real violation. I'm cross-checking test expectations against the implementation—label classes, ms-auto spacing, max-width constraints—and they line up. Looking at overflow behavior, the badge is shrink-0, the label span caps at 45% width, and the description is flex-1 with min-w-0, so the row shouldn't overflow since the description absorbs the extra space, though I want to double check how that 45% percentage resolves against the flex container. Now I'm considering whether a long badge like "Personal Skill" combined with a wide label could force the description down to zero width on narrow screens—likely acceptable behavior. Shifting focus, I want to look at the composerSlashCommandSearch.ts diff, which changes scoring logic to return Number.MAX_SAFE_INTEGER when a query matches "skill" as a prefix, so I need to check how the sort order interprets these scores to confirm whether higher or lower values rank better.

9. browse_code — apps/web/src/components/chat/composerSlashCommandSearch.ts

💭 Using MAX_SAFE_INTEGER for scoring just deprioritizes skill matches at the bottom, not really a UI concern. I'm also weighing whether the docs' default description conflicts with the settings contract default, but that's out of scope for actions and not truly a UI consistency issue either, so I'll skip it. Since prior findings are already resolved, I should check what changed in the web files between the last reviewed commit and the current one to catch any new issues introduced since then.

10. git_tools — 0ab9458..a0f82a3

💭 This looks like a force-pushed branch, so I should check the recent commits on it.

11. git_tools

💭 It's odd that the log at head doesn't show the expected PR commit — just older commits from a different author, suggesting this is a synthetic benchmark setup rather than a real history. I should double check the actual files changed at head against the given diff, since the diff might be stale regarding the contracts default. Wait, the diff shows contracts default as true but the head version and settings test both show false — that's confirmed. But docs/user/composer.md at head seems to claim the slash menu includes skills by default, which conflicts with the code. Since docs and the contracts package are both out of scope for review comments, I can't flag that mismatch directly, though the SettingsPanels description implying default-on is a weaker signal. Let me check the docs at head to see how they align with the actual behavior.

12. browse_code — docs/user/composer.md

13. browse_code — packages/contracts/src/settings.ts

💭 I'm noticing a discrepancy between what the file view shows for the default value at line 228 versus what the grep output and test expectations suggest—the view shows true but grep and the test both point to false, so I need to figure out which is actually current at HEAD. I should re-run the grep with an explicit revision matching the commit sha, and also check the settings.test.ts file directly through view since it wasn't part of the diff I was given, which might explain why the grep saw different content.

14. git_tools — showSkillsInSlashMenu

💭 Good, head confirms the docs are consistent, so that earlier grep hit was just a red herring from a different revision. Now I'm going back to check the UI review question of whether there are genuine new findings — specifically looking at how the SkillSourceBadge renders its optional "Skill" suffix as a separate text node alongside the icon and label within the flex container. I'm reasoning through CSS flex-item grouping: adjacent contiguous text nodes get wrapped as a single anonymous flex item per spec, so the "App" and " Skill" text nodes merge into one item and the gap-1 spacing doesn't split them apart — the output should still read "App Skill" correctly, matching what the test expects. That confirms this part of the rendering is fine, so I'm moving on to check the badge's ms-auto positioning relative to the flex-1 description field when the description is empty. Now I'm checking whether icons that used to appear next to skill rows are intentionally moved to the trailing badge in the new design, which explains why skill entries under the $ trigger no longer have leading icons — that's a deliberate layout shift rather than a bug, since all rows in that menu are skills and consistently show trailing badges instead. I'm also verifying the test assertions match the actual className ordering — since cn uses clsx plus twMerge without reordering literal strings, the expected substring "text-secondary-label text-xs" should still appear correctly in the generated markup, and the badge-before-svg ordering check should hold for skill items lacking a path icon. Now I'm weighing whether text-current is the right minimal fix for the icon color versus checking how other Badge+icon combinations inside AutocompleteItem or CommandItem handle this elsewhere in the codebase, to keep things consistent.

15. git_tools — <Badge

16. git_tools — Badge

💭 I want to check the DefaultBadge used in TraitsPicker's list row, likely at a small size, and compare it against ModelListRow's "new" badge to see how dense row conventions are handled.

17. browse_code — apps/web/src/components/chat/TraitsPicker.tsx

18. browse_code — apps/web/src/components/chat/ModelListRow.tsx

💭 Existing dense-row badge patterns vary, and the new code just uses the default badge size within a text-xs row—on mobile that badge is actually taller than the row's text and min-height, but that's likely intentional since default badge sizing accounts for touch targets. The PR seems in decent shape, though I want to check one more subtle detail: the badge's ms-auto positioning. I'm confirming that the leading space preserved in the "Skill" suffix string is intentional JSX behavior, and that the "Other" to "Provider" label rename still reads correctly when combined with the suffix. I also reconsider whether sharing FolderIcon between "repo" and "project" kinds causes confusion, but since the text labels differentiate them, I won't flag it again. Finally, I check whether removing the leading SkillSourceIcon from the $ menu creates misalignment—but since all rows there are skills, and the / menu doesn't use leading icons except for path entries with a different trigger, there's no regression. I look at the description span's max-w-[48ch] flex-1 styling and confirm it's fine for capping long directory paths in path trigger rows. I notice the alignment changed from right-aligned to left-aligned text for descriptions, which now places the path right after the filename—this is the intended redesign confirmed by an existing test, and it applies globally across item types as a deliberate layout change rather than a violation. I also note the label span switched from items-baseline to items-center, likely to properly align the new badge, trading off slightly on typography but justified functionally. Since I can't find any genuine new issues after this final pass, I resolve to report the response as clear, structuring the required JSON output with a success state and an "All clear" summary despite the instruction's conflicting request for a plain-text-only response. I'm double-checking the test file to confirm the badge ordering and class assertions line up with the implementation—checking that the badge appears before any icon markup and that the "ms-auto" class is present. Everything checks out, so I'm confident the implementation matches expectations.


Agent Credits: 47 credits