Skip to content

[AI-2761] Align Settings, setup, and launcher chrome with the kit - #932

Merged
alexeyzimarev merged 5 commits into
mainfrom
norton/ai-2761-settings-setup-fields
Sep 14, 2026
Merged

alexeyzimarev merged 5 commits into
mainfrom
norton/ai-2761-settings-setup-fields

Conversation

@nortonandreev

@nortonandreev nortonandreev commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

No GitHub issue — AI-2761

What & why

Settings and first-run used Fluent's default fields, radios, checks, and dropdown — a bright ring and accent-blue glyphs — on the Kcap canvas. Setup also clipped Import under a fixed footer, and the Sign in CTA sat in leftover fill. Shared kcapField, type, and button chrome now skin those surfaces; the step body scrolls; agent/import chips wrap at 220 DIP; in-step CTAs sit 14px under copy. Settings splits name and capacity into independently saved cards with an occupancy pill; choosing all-public visibility warns that private-repo sessions are visible; the launcher connection banner overlays so the composer does not move.

Where to look

ComboBox.kcapField item/popup styles, the step-body ScrollViewer (a * grid row inside a scroll host collapses), SignInStepView's top dock (the CTA must not live in leftover fill), and LauncherPaneView's ConnectionBanner (last child, so it overlays).

Verification

dotnet run --project test/Capacitor.App.Tests.Unit/Capacitor.App.Tests.Unit.csproj
1928 passed, 0 failed (14s).

Visuals

Screenshot 2026-09-14 at 17 53 29 Screenshot 2026-09-14 at 17 53 32 Screenshot 2026-09-14 at 17 53 37 Screenshot 2026-09-14 at 17 53 40 Screenshot 2026-09-14 at 17 53 42 Screenshot 2026-09-14 at 17 53 49 Screenshot 2026-09-14 at 17 53 57 Screenshot 2026-09-14 at 17 53 52 Screenshot 2026-09-14 at 18 32 35 Screenshot 2026-09-14 at 17 54 04

@nortonandreev nortonandreev self-assigned this Sep 14, 2026
@linear-code

linear-code Bot commented Sep 14, 2026

Copy link
Copy Markdown

AI-2761

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Align Settings and first-run setup with the launcher kit

✨ Enhancement 🐞 Bug fix 🧪 Tests 🕐 20-40 Minutes

Grey Divider

AI Description

• Applies shared launcher-kit styling across Settings, sign-in, and onboarding controls.
• Makes onboarding content scrollable and shows nested fields only when relevant.
• Extends UI tests for styling, scrolling, and conditional field visibility.
Diagram

graph TD
  Tokens["Kcap tokens"] --> Styles["Shared styles"] --> Settings["Settings window"]
  Styles --> Wizard["Onboarding shell"] --> Templates["Step templates"] --> Controls["Conditional fields"]
  Styles --> SignIn["Sign-in view"]
  Tests["UI tests"] --> Settings
  Tests --> Wizard
Loading
High-Level Assessment

The current approach is appropriate: reusable application-level style classes prevent Settings, onboarding, and sign-in from drifting while keeping launcher styling opt-in for fields and buttons. Per-view duplication would increase maintenance, while replacing Fluent with full custom control themes would be disproportionately broad for these surfaces.

Files changed (10) +461 / -175

Enhancement (3) +430 / -147
App.axamlAdd shared launcher-kit control and typography styles +200/-0

Add shared launcher-kit control and typography styles

• Introduces application-level Kcap styling for text, numeric, and combo fields; lists; choice controls; typography; and button states. Template-part overrides prevent Fluent focus, hover, selection, and disabled chrome from conflicting with the dark Kcap palette.

src/Capacitor.App/App.axaml

OnboardingWindow.axamlRestyle and make onboarding steps scrollable +210/-129

Restyle and make onboarding steps scrollable

• Rebuilds first-run step layouts with Kcap cards, typography, fields, choices, and buttons, and makes the window resizable. Adds a scrollable step body above the fixed footer and hides provider, organization, and repository inputs unless their corresponding option is selected.

src/Capacitor.App/Views/Onboarding/OnboardingWindow.axaml

SettingsWindow.axamlApply launcher-kit styling to daemon settings +20/-18

Apply launcher-kit styling to daemon settings

• Applies shared title, subtitle, label, hint, field, chip, and primary-button classes throughout Settings. Refines capacity layout and standardizes validation text styling.

src/Capacitor.App/Views/SettingsWindow.axaml

Bug fix (1) +1 / -1
SettingsViewModel.csClarify the unchanged daemon-name hint +1/-1

Clarify the unchanged daemon-name hint

• Rewords the case-equivalent daemon name message to explain why renaming is unavailable and what action enables it.

src/Capacitor.App/ViewModels/SettingsViewModel.cs

Refactor (1) +2 / -21
SignInStepView.axamlAdopt shared sign-in field and typography styles +2/-21

Adopt shared sign-in field and typography styles

• Removes duplicated local field and list styles now supplied by the application stylesheet. Refines status typography to match the launcher-kit presentation.

src/Capacitor.App/Views/Onboarding/SignInStepView.axaml

Tests (5) +28 / -6
AgentsImportStepsTests.csTest onboarding scrolling and conditional import fields +15/-2

Test onboarding scrolling and conditional import fields

• Extends template rendering coverage to require the step ScrollViewer and verify that the organization field appears only after selecting its import scope. Preserves the initial selection assertion before mutating the UI.

test/Capacitor.App.Tests.Unit/AgentsImportStepsTests.cs

OnboardingViewModelTests.csVerify onboarding title typography +5/-3

Verify onboarding title typography

• Expands the current-step title test to assert the rendered text, launcher-kit title class, and configured letter spacing.

test/Capacitor.App.Tests.Unit/OnboardingViewModelTests.cs

SettingsViewModelTests.csUpdate daemon hint expectation +1/-1

Update daemon hint expectation

• Adjusts the case-only rename test to match the clearer service ID guidance.

test/Capacitor.App.Tests.Unit/SettingsViewModelTests.cs

SettingsWindowSmokeTests.csVerify Settings launcher-kit style contracts +6/-0

Verify Settings launcher-kit style contracts

• Adds smoke assertions for shared field classes, hidden numeric spinner, title typography, and primary versus chip button styling.

test/Capacitor.App.Tests.Unit/SettingsWindowSmokeTests.cs

SignInStepViewModelTests.csVerify the connect input uses shared field styling +1/-0

Verify the connect input uses shared field styling

• Ensures the onboarding connect textbox receives the application-level 'kcapField' class.

test/Capacitor.App.Tests.Unit/SignInStepViewModelTests.cs

@qodo-code-review

qodo-code-review Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (2) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. Merge subject breaks required format 📘 Rule violation ⚙ Maintainability
Description
The sole commit subject is [AI-2761] Restyle Settings and first-run setup to the launcher kit,
which does not end with a parenthesized GitHub issue reference. When this subject is used on merge,
the bracketed Linear key also prevents it from matching the required single-clause subject pattern.
Code

src/Capacitor.App/App.axaml[71]

+        <!-- Standalone fields (Settings, setup, sign-in prompts): pin the Fluent ring to our
Relevance

●●● Strong

Explicit commit-format rule makes the missing trailing GitHub reference a straightforward compliance
fix.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The supplied commit metadata contains exactly one subject, `[AI-2761] Restyle Settings and first-run
setup to the launcher kit; it lacks the mandatory trailing (#<digits>)` reference and includes
punctuation outside the allowed subject pattern.

Rule 2897961: Enforce single-clause imperative commit subject with GitHub issue reference and 80-char limit


2. Pull request issue links are misplaced 📘 Rule violation ⚙ Maintainability
Description
The PR title begins with [AI-2761], while the description has no reference line containing both a
GitHub closing reference and the Linear key. Reviewers encounter the issue key in the title instead
of the required description location, and no GitHub issue is linked for closure.
Code

src/Capacitor.App/App.axaml[71]

+        <!-- Standalone fields (Settings, setup, sign-in prompts): pin the Fluent ring to our
Relevance

●●● Strong

Recent precedent enforces description references and rejects issue IDs in titles.

PR-#659

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The supplied PR metadata shows the title `[AI-2761] Restyle Settings and first-run setup to the
launcher kit` and a description without the required combined reference line. Rules 2897978 and
2897991 prohibit issue identifiers in the PR title, while rule 2897991 additionally requires one
description line containing a GitHub closing reference and the Linear key.

Rule 2897978: Format PR titles as imperative commit subjects without explicit issue references
Rule 2897991: PR description must contain both GitHub and Linear issue references; PR title must not contain issue IDs


3. Agent failures hide the retry button ✓ Resolved 🐞 Bug ≡ Correctness
Description
AgentsStepViewModel exposes arbitrary stderr through each row's Message, but the template places
that wrapping text and AgentRetryButton in a horizontal StackPanel inside a fixed 220-DIP item,
where children are measured without a width constraint. When plugin installation emits a long error,
the row exceeds its slot and pushes or overlaps the retry button beyond the visible content,
preventing reliable recovery from the setup screen.
Code

src/Capacitor.App/Views/Onboarding/OnboardingWindow.axaml[R168-171]

+                                    <TextBlock x:Name="AgentRowMessageText" Classes="kcapHint" Text="{Binding Message}"
+                                               TextWrapping="Wrap" VerticalAlignment="Center"
+                                               IsVisible="{Binding Message, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" />
+                                    <Button x:Name="AgentRetryButton" Classes="kcapChip" Content="Retry" Command="{Binding RetryCommand}"
Relevance

●● Moderate

Plausible runtime layout bug, but no closely matching historical acceptance precedent was found.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The new panel fixes every item at 220 DIPs, while each row horizontally stacks the wrapping message
before the retry button. Installation failures assign unbounded CLI stderr or exception text to that
message, establishing a runtime path where the text consumes its unconstrained desired width and
displaces the trailing action.

src/Capacitor.App/Views/Onboarding/OnboardingWindow.axaml[154-172]
src/Capacitor.App/ViewModels/Onboarding/AgentsStepViewModel.cs[172-186]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Agent installation errors can be arbitrarily long, but the new fixed-width agent item uses a horizontal stack for the message and retry button. Long messages therefore overflow the item and can push the retry action outside the visible setup content.

## Fix Focus Areas
- src/Capacitor.App/Views/Onboarding/OnboardingWindow.axaml[159-173]

## Recommended Fix
Replace the horizontal stack with a width-constrained layout, such as a grid with bounded text and an auto-sized retry column, or place the failure message on a separate wrapping row. Ensure the retry button always remains inside the 220-DIP item and visible for long stderr or exception messages.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Compliance rules (platform): 64 rules
✅ Cross-repo context — repo relationships
Review mode: ⚖️ Balanced: This is a broad Avalonia UI and behavior change across shared styles, onboarding layouts, scrolling, conditional field visibility, and settings, with enough independent paths to warrant a complete single-pass review.

Grey Divider

Tip of the day
💡 Did you know, you can ask Qodo to dismiss a finding you disagree with, with your reason on record

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
</Style>
<!-- Standalone fields (Settings, setup, sign-in prompts): pin the Fluent ring to our

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

1. Pull request issue links are misplaced 📘 Rule violation ⚙ Maintainability

The PR title begins with [AI-2761], while the description has no reference line containing both a
GitHub closing reference and the Linear key. Reviewers encounter the issue key in the title instead
of the required description location, and no GitHub issue is linked for closure.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Title is now Restyle Settings and first-run setup to the launcher kit. Description opens with No GitHub issue — AI-2761 — there is no public issue to close.

<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
</Style>
<!-- Standalone fields (Settings, setup, sign-in prompts): pin the Fluent ring to our

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

2. Merge subject breaks required format 📘 Rule violation ⚙ Maintainability

The sole commit subject is [AI-2761] Restyle Settings and first-run setup to the launcher kit,
which does not end with a parenthesized GitHub issue reference. When this subject is used on merge,
the bracketed Linear key also prevents it from matching the required single-clause subject pattern.

Comment thread src/Capacitor.App/Views/Onboarding/OnboardingWindow.axaml Outdated
@nortonandreev nortonandreev changed the title [AI-2761] Restyle Settings and first-run setup to the launcher kit Restyle Settings and first-run setup to the launcher kit Sep 14, 2026
@nortonandreev

nortonandreev commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor Author

Changes

Throughout

  • Fields, dropdowns, radios, checkboxes, and primary/chip buttons on Settings and setup match the launcher: quiet border, no Fluent bright ring, no accent-blue glyphs

Setup

  • Title bar: Kurrent Capacitor — Setup
  • Taller, resizable window; long steps (especially Import) scroll instead of sitting under the footer
  • Back on the left; Skip and Next together on the right
  • Skip hidden on the last step; that Next button reads Get started
  • Action buttons sit close under the copy, including Sign in
  • Connect copy: “you'll sign in on the next step”
  • Connect choices: Find workspaces for my account, Enter a workspace name or URL, Create a new workspace
  • GitHub / Single sign-on only show when finding workspaces; the URL field only shows when entering one
  • PATH step explains that install puts kcap on PATH (one admin-password prompt) and confirms when it is done
  • This machine (was “Defaults”): who can see sessions you start here, and what this machine is called
  • Name field label is just Name
  • Choosing All public shows warning: Everyone in this workspace can see every session you start on this machine, including private repos.
  • Coding agents are a wrapping checklist; a failed agent keeps Retry on that chip
  • Import’s org and repo boxes appear only for those options
  • Daemon status lines say what to do next (including “enable later in Settings”)
  • Check again only appears when a refresh could help — not when you already have an install/start action, or you’re done
  • Skipped rows say why, or Skipped
  • Closing copy: Here’s what this machine is set up for. Change any of this later in Settings.

Settings

  • Title bar: Kurrent Capacitor — Settings
  • Two cards that save on their own: Rename for the daemon name, Save for capacity
  • Hover the disabled Rename button for why it is blocked
  • Occupancy pill: Agents 2 / 5, 3 · unlimited, Not running, or Connecting
  • Hover the pill for “Running as …”
  • Rename no longer restates its warning as always-on body copy

Home launcher

  • If sign-in has expired or the daemon is down, the warning banner covers the top of the pane – the composer stays put instead of jumping down

@nortonandreev nortonandreev changed the title Restyle Settings and first-run setup to the launcher kit [AI-2761] Align Settings, setup, and launcher chrome with the kit Sep 14, 2026
@alexeyzimarev
alexeyzimarev merged commit a379f05 into main Sep 14, 2026
8 checks passed
@alexeyzimarev
alexeyzimarev deleted the norton/ai-2761-settings-setup-fields branch September 14, 2026 14:04
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