Skip to content

[AI-3418] app: Add full-size onboarding with CLI-compatible setup - #1326

Merged
alexeyzimarev merged 21 commits into
mainfrom
norton/ai-3418-onboarding-production
Oct 7, 2026
Merged

alexeyzimarev merged 21 commits into
mainfrom
norton/ai-3418-onboarding-production

Conversation

@nortonandreev

@nortonandreev nortonandreev commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Closes #1267 — AI-3418

What & why

Adds a six-step desktop onboarding flow for sign-in, workspace creation, harness connections, explicit privacy choices, history import, and daemon setup. Users can leave for the main app and return to setup; existing CLI-completed setup is recognized. macOS installation supports safe replacement with a newer version, and desktop packages include the harness assets needed for setup.

Where to look

The shared CLI startup gate remains authoritative. Wizard actions resolve the selected profile freshly; consent acknowledgements retain their separate literal identity. History import can outlive onboarding, but restarting setup warns before interrupting it.

Verification

  • dotnet build Capacitor.slnx --no-restore: zero warnings/errors.
  • Desktop unit suite: 2,926 passed.
  • Affected CLI unit tests: 66 passed.
  • Packaging scripts: 16 passed, covering macOS and Windows plugin layouts.
  • Native CLI Release publish completed without IL/AOT warnings; local Homebrew linker deployment-target warnings remain.
  • Verification used source, isolated headless tests, and package checks, without inspecting the live app or sessions. Windows installer verification runs in CI.

@linear-code

linear-code Bot commented Oct 6, 2026

Copy link
Copy Markdown

AI-3418

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Add full-size, CLI-compatible desktop onboarding

✨ Enhancement 🐞 Bug fix 🧪 Tests 📝 Documentation 🕐 40+ Minutes

Grey Divider

AI Description

• Replace the separate setup window with onboarding inside the main window, using shared CLI
 credentials.
Diagram

graph TD
  G["CLI config gate"] --> W["Main window"] --> S["Sign-in pane"] --> H["Harness choices"] --> I["History import"] --> D["Daemon setup"] --> M["Main app"]
  H --> C["Shared CLI"]
  I --> C
  D --> C
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Keep setup in a separate window
  • ➕ Smaller main-window lifecycle change.
  • ➖ Preserves the window transition and duplicates setup-specific hosting behavior.
2. Reimplement setup operations in the desktop app
  • ➕ Avoids shelling out for each onboarding operation.
  • ➖ Duplicates CLI behavior and risks divergent configuration, authentication, and plugin semantics.

Recommendation: Keep the main-window pane and shared-CLI approach: it makes setup and normal use continuous while retaining one implementation of installation and import operations. Review the window handoff, long-lived import ownership, and tools-only refresh semantics particularly closely.

Files changed (92) +6283 / -1111

Enhancement (58) +4084 / -427
App.axamlRegister onboarding resources +10/-4

Register onboarding resources

• Makes the new pane resources and styles available to the app.

src/Capacitor.App/App.axaml

App.axaml.csHost and hand off onboarding in the main window +158/-57

Host and hand off onboarding in the main window

• Gates startup on shared CLI state, supports reopening setup, adopts the onboarding window for normal use, retains background imports, and applies safer macOS installation decisions.

src/Capacitor.App/App.axaml.cs

ApplicationsInstallPlan.csDescribe safe bundle-install actions +26/-0

Describe safe bundle-install actions

• Models install, update, open-installed, and blocked outcomes with corresponding user-facing text.

src/Capacitor.App/Services/ApplicationsInstallPlan.cs

ILifecycleSurface.csExpose setup lifecycle prompt kind +1/-0

Expose setup lifecycle prompt kind

• Adds the lifecycle prompt designation used when restarting into setup.

src/Capacitor.App/Services/ILifecycleSurface.cs

ImportDiscoveryReport.csParse per-repository discovery reports +40/-0

Parse per-repository discovery reports

• Defines and validates the CLI JSON report, including repository counts for history windows.

src/Capacitor.App/Services/ImportDiscoveryReport.cs

KcapCli.csExtend desktop CLI operations +42/-5

Extend desktop CLI operations

• Adds plugin install options, JSON history discovery, and repository, date, privacy, and titling import arguments.

src/Capacitor.App/Services/KcapCli.cs

WizardAuthBridges.csSupport revised sign-in prompts +18/-4

Support revised sign-in prompts

• Adjusts authentication and provisioning bridges for the consolidated onboarding sign-in flow.

src/Capacitor.App/Services/Onboarding/WizardAuthBridges.cs

WizardComposition.csCompose the six-step onboarding flow +51/-102

Compose the six-step onboarding flow

• Replaces separate connection, defaults, agent, and import steps with welcome, integrated sign-in, harnesses, history, daemon, and live completion.

src/Capacitor.App/Services/Onboarding/WizardComposition.cs

LifecyclePromptViewModel.csSupport the reopen-setup confirmation +2/-0

Support the reopen-setup confirmation

• Provides prompt behavior for restarting the app into setup.

src/Capacitor.App/ViewModels/LifecyclePromptViewModel.cs

MainWindowViewModel.csExpose setup and ongoing import in the main app +20/-1

Expose setup and ongoing import in the main app

• Adds a setup action and reactive history-import status after onboarding hands off.

src/Capacitor.App/ViewModels/MainWindowViewModel.cs

AgentInstallStatus.csRepresent harness installation states +3/-0

Represent harness installation states

• Defines status values for per-harness progress and retry feedback.

src/Capacitor.App/ViewModels/Onboarding/AgentInstallStatus.cs

AgentVendor.csDescribe an onboarding harness +7/-0

Describe an onboarding harness

• Defines the vendor information used by harness choices.

src/Capacitor.App/ViewModels/Onboarding/AgentVendor.cs

AgentVendors.csCentralize offered harnesses +10/-0

Centralize offered harnesses

• Provides the ordered vendor list shared by detection and onboarding.

src/Capacitor.App/ViewModels/Onboarding/AgentVendors.cs

CaptureItem.csModel completion capture indicators +7/-0

Model completion capture indicators

• Provides the per-harness recording status displayed on the final page.

src/Capacitor.App/ViewModels/Onboarding/CaptureItem.cs

ConnectChoiceViewModel.csValidate workspace choices within sign-in +85/-0

Validate workspace choices within sign-in

• Models work-account discovery and pasted workspace addresses using the same URL validation as the startup gate.

src/Capacitor.App/ViewModels/Onboarding/ConnectChoiceViewModel.cs

DaemonStepViewModel.csRequire a running daemon to finish setup +90/-36

Require a running daemon to finish setup

• Integrates machine naming, strengthens completion gating, and keeps asynchronous state changes on the UI thread.

src/Capacitor.App/ViewModels/Onboarding/DaemonStepViewModel.cs

DoneFacts.csCollect live completion facts +17/-0

Collect live completion facts

• Carries recording, import, daemon, machine, and workspace outcomes into the final page.

src/Capacitor.App/ViewModels/Onboarding/DoneFacts.cs

DoneStepViewModel.csShow an outcome-based completion summary +109/-19

Show an outcome-based completion summary

• Replaces the static checklist with live import figures, recording indicators, daemon status, and failure guidance.

src/Capacitor.App/ViewModels/Onboarding/DoneStepViewModel.cs

HarnessRowViewModel.csSeparate recording and tools choices +100/-0

Separate recording and tools choices

• Models each detected harness's bundled or independent options, installation state, and retry action.

src/Capacitor.App/ViewModels/Onboarding/HarnessRowViewModel.cs

HarnessesStepViewModel.csConfigure harnesses and recording privacy together +363/-0

Configure harnesses and recording privacy together

• Detects harnesses, persists visibility and provider-key choices, handles the PATH fix, and installs selected connections without removing existing ones.

src/Capacitor.App/ViewModels/Onboarding/HarnessesStepViewModel.cs

HistoryImportRun.csTrack an import beyond onboarding +109/-0

Track an import beyond onboarding

• Runs private and shared import passes, aggregates streamed results, and cancels only at shutdown.

src/Capacitor.App/ViewModels/Onboarding/HistoryImportRun.cs

HistoryOwnerGroup.csGroup repository import choices by owner +39/-0

Group repository import choices by owner

• Allows an owner-level choice to set all repositories while reporting mixed selections.

src/Capacitor.App/ViewModels/Onboarding/HistoryOwnerGroup.cs

HistoryRepoRow.csModel repository-specific history choices +55/-0

Model repository-specific history choices

• Holds discovery counts, dates, window totals, and skip, private, or shared import levels.

src/Capacitor.App/ViewModels/Onboarding/HistoryRepoRow.cs

HistoryStepViewModel.csOffer per-repository history import +305/-0

Offer per-repository history import

• Discovers history for enabled recording harnesses, supports date windows and titling consent, and starts imports without blocking later steps.

src/Capacitor.App/ViewModels/Onboarding/HistoryStepViewModel.cs

HistoryWindowOption.csModel selectable history windows +30/-0

Model selectable history windows

• Carries each import window's date boundary, label, selection, and discovered count.

src/Capacitor.App/ViewModels/Onboarding/HistoryWindowOption.cs

ImportLevel.csDefine repository import privacy levels +4/-0

Define repository import privacy levels

• Distinguishes skipped, owner-only, and shared history.

src/Capacitor.App/ViewModels/Onboarding/ImportLevel.cs

ImportRunState.csDefine history-run outcomes +3/-0

Define history-run outcomes

• Represents running, finished, failed, and cancelled imports.

src/Capacitor.App/ViewModels/Onboarding/ImportRunState.cs

MachineNameViewModel.csPersist the daemon's machine name +81/-0

Persist the daemon's machine name

• Validates and saves the name to the shared active CLI profile before enabling the service.

src/Capacitor.App/ViewModels/Onboarding/MachineNameViewModel.cs

OnboardingViewModel.csCoordinate pane navigation and footer actions +96/-25

Coordinate pane navigation and footer actions

• Adds step-aware navigation labels, action availability, tenant controls, finish-later behavior, and entry at harnesses for authenticated users.

src/Capacitor.App/ViewModels/Onboarding/OnboardingViewModel.cs

SignInPhase.csName sign-in presentation phases +4/-0

Name sign-in presentation phases

• Defines the states used to present authentication, workspace selection, creation, and provisioning on one page.

src/Capacitor.App/ViewModels/Onboarding/SignInPhase.cs

SignInStepViewModel.csConsolidate sign-in and workspace provisioning +310/-68

Consolidate sign-in and workspace provisioning

• Supports work-account, code, and URL entry; keeps workspace selection in place; and adds creation feedback and cancellation handling.

src/Capacitor.App/ViewModels/Onboarding/SignInStepViewModel.cs

VisibilityOption.csDescribe recording visibility choices +5/-0

Describe recording visibility choices

• Provides labeled privacy options for new recorded sessions.

src/Capacitor.App/ViewModels/Onboarding/VisibilityOption.cs

WelcomeStepViewModel.csIntroduce the setup journey +30/-0

Introduce the setup journey

• Provides the welcome page and an overview of what setup configures.

src/Capacitor.App/ViewModels/Onboarding/WelcomeStepViewModel.cs

AppMenu.csAdd a menu route back to setup +9/-1

Add a menu route back to setup

• Exposes the reopen-setup action in the application menu.

src/Capacitor.App/Views/AppMenu.cs

InstallLocationWindow.axamlAdapt installation dialog layout +1/-2

Adapt installation dialog layout

• Makes the location prompt accommodate action-specific installation and update text.

src/Capacitor.App/Views/InstallLocationWindow.axaml

MainWindow.axamlAdd onboarding to the main window +7/-0

Add onboarding to the main window

• Places the setup pane alongside the normal surface so the window can switch between them.

src/Capacitor.App/Views/MainWindow.axaml

MainWindow.axaml.csSwitch the main window between setup and sessions +19/-2

Switch the main window between setup and sessions

• Adds pane visibility and supports binding the normal workspace after onboarding has already activated the window.

src/Capacitor.App/Views/MainWindow.axaml.cs

DaemonPaneView.axamlPresent daemon enablement +47/-0

Present daemon enablement

• Provides the machine-name, service-action, and status UI for the daemon step.

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

DaemonPaneView.axaml.csInitialize the daemon pane +7/-0

Initialize the daemon pane

• Adds the code-behind for the new daemon view.

src/Capacitor.App/Views/Onboarding/DaemonPaneView.axaml.cs

DonePaneView.axamlRender the live completion page +109/-0

Render the live completion page

• Shows import counts and progress, recording connections, daemon status, and follow-up guidance.

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

DonePaneView.axaml.csInitialize the completion pane +7/-0

Initialize the completion pane

• Adds the code-behind for the completion view.

src/Capacitor.App/Views/Onboarding/DonePaneView.axaml.cs

HarnessesPaneView.axamlRender harness and privacy controls +159/-0

Render harness and privacy controls

• Presents separate recording and tools choices, visibility settings, provider-key consent, PATH repair, and per-row retries.

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

HarnessesPaneView.axaml.csConnect harness selection controls +26/-0

Connect harness selection controls

• Wires the harness page's view-specific selection behavior.

src/Capacitor.App/Views/Onboarding/HarnessesPaneView.axaml.cs

HistoryPaneView.axamlRender repository history choices +169/-0

Render repository history choices

• Shows grouped repository privacy tracks, date-window counts, titling consent, and discovery feedback.

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

HistoryPaneView.axaml.csWire history-pane interactions +18/-0

Wire history-pane interactions

• Adds the view behavior for history import controls and documentation links.

src/Capacitor.App/Views/Onboarding/HistoryPaneView.axaml.cs

ImportTrack.csAdd a three-stop import control +134/-0

Add a three-stop import control

• Draws and handles pointer and keyboard selection of skip, only-me, and shared history access.

src/Capacitor.App/Views/Onboarding/ImportTrack.cs

ImportTrackAutomationPeer.csMake import tracks screen-reader accessible +31/-0

Make import tracks screen-reader accessible

• Exposes the custom history control as a range-valued slider with spoken choices.

src/Capacitor.App/Views/Onboarding/ImportTrackAutomationPeer.cs

OnboardingPaneView.axamlLay out full-size onboarding +117/-0

Lay out full-size onboarding

• Hosts all six step views with persistent navigation and a scrollable content region.

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

OnboardingPaneView.axaml.csReset scrolling on step changes +43/-0

Reset scrolling on step changes

• Observes pane navigation, restores the scroll position, and handles window dragging.

src/Capacitor.App/Views/Onboarding/OnboardingPaneView.axaml.cs

OnboardingResources.axamlDefine onboarding visual resources +32/-0

Define onboarding visual resources

• Introduces colors and other resources scoped to the new setup design.

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

OnboardingStyles.axamlStyle the full-size setup panes +436/-0

Style the full-size setup panes

• Adds the scoped typography, cards, buttons, fields, selection controls, and responsive states.

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

SignInPaneView.axamlRender unified sign-in and workspace flows +241/-0

Render unified sign-in and workspace flows

• Presents work-account and code sign-in, workspace URL and selection, creation, provisioning, and cancellation states.

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

SignInPaneView.axaml.csSupport sign-in pane interactions +32/-0

Support sign-in pane interactions

• Adds view-specific actions for copying sign-in details and interacting with the pane.

src/Capacitor.App/Views/Onboarding/SignInPaneView.axaml.cs

SessionRailView.axamlShow setup and import status in the rail +4/-0

Show setup and import status in the rail

• Adds access to setup and visibility into a continuing history import.

src/Capacitor.App/Views/SessionRailView.axaml

AgentInstructionsWriter.csDetect existing agent instructions +9/-0

Detect existing agent instructions

• Adds an installed-state check so tools-only plugin refreshes can recognize existing steering.

src/Capacitor.Cli.Core/Instructions/AgentInstructionsWriter.cs

LoginShellProbe.csProbe provider-key presence safely +22/-1

Probe provider-key presence safely

• Checks whether requested terminal variables are set without returning their values; validates variable names before constructing a shell command.

src/Capacitor.Cli.Core/Setup/LoginShellProbe.cs

ImportDiscoveryJson.csReport counts for each repository and time window +6/-2

Report counts for each repository and time window

• Adds per-repository window totals to JSON history discovery for accurate onboarding choices.

src/Capacitor.Cli/Commands/ImportDiscoveryJson.cs

PluginCommand.csAdd additive tools-only installs and refreshes +169/-98

Add additive tools-only installs and refreshes

• Installs supported harness tools without adding recording hooks, preserves tools-only installs during refresh, and rejects inseparable vendor configurations.

src/Capacitor.Cli/Commands/PluginCommand.cs

Bug fix (2) +81 / -18
ApplicationsMover.csSafely update installed macOS bundles +66/-13

Safely update installed macOS bundles

• Verifies bundle identity and version, avoids replacing running or conflicting copies, and atomically swaps newer bundles after staging.

src/Capacitor.App/Services/ApplicationsMover.cs

InstallLocationWindow.axaml.csPresent install plans and guard active moves +15/-5

Present install plans and guard active moves

• Shows whether the bundle will install, update, or open an existing copy and prevents closing during a move.

src/Capacitor.App/Views/InstallLocationWindow.axaml.cs

Refactor (6) +75 / -52
ReauthComposition.csKeep re-authentication compatible with revised sign-in +3/-4

Keep re-authentication compatible with revised sign-in

• Adapts the independent re-authentication dialog to the new sign-in composition.

src/Capacitor.App/Services/Onboarding/ReauthComposition.cs

WizardAuthService.csAlign authentication service with onboarding +4/-3

Align authentication service with onboarding

• Updates the sign-in service contract used by the new flow.

src/Capacitor.App/Services/Onboarding/WizardAuthService.cs

WizardLateBinding.csUpdate deferred onboarding dependencies +5/-2

Update deferred onboarding dependencies

• Aligns late-bound setup services with the revised wizard composition.

src/Capacitor.App/Services/Onboarding/WizardLateBinding.cs

WizardLifecycleSurface.csAdapt onboarding lifecycle presentation +2/-2

Adapt onboarding lifecycle presentation

• Keeps lifecycle feedback compatible with the pane-based setup surface.

src/Capacitor.App/Services/Onboarding/WizardLifecycleSurface.cs

PathFixViewModel.csEmbed the terminal PATH fix in harness setup +34/-40

Embed the terminal PATH fix in harness setup

• Adapts the former standalone command-line step into an action alongside harness choices.

src/Capacitor.App/ViewModels/Onboarding/PathFixViewModel.cs

WizardStep.csDefine the revised step contract +27/-1

Define the revised step contract

• Reorders the flow and adds step-specific headings, action labels, skippability, and continuation rules.

src/Capacitor.App/ViewModels/Onboarding/WizardStep.cs

Tests (24) +2020 / -613
AgentDetectionFeedTests.csTest harness detection signals +55/-0

Test harness detection signals

• Covers the detection feed used to populate onboarding choices.

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

AppMenuBarTests.csAdjust menu expectations +2/-2

Adjust menu expectations

• Updates assertions for the revised setup menu behavior.

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

AppStartupTests.csTest startup window handoff +32/-0

Test startup window handoff

• Covers startup behavior introduced by main-window onboarding.

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

ApplicationsMoverTests.csTest safe installation decisions +102/-7

Test safe installation decisions

• Exercises verified installation, version-aware updates, conflicting copies, and move failures.

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

ConnectChoiceViewModelTests.csTest integrated connection choices +72/-0

Test integrated connection choices

• Checks discovery and workspace-address validation for sign-in.

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

DaemonLifecycleControllerTests.csAlign daemon lifecycle coverage +11/-1

Align daemon lifecycle coverage

• Adjusts lifecycle assertions for the revised setup surface.

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

DaemonStepViewModelTests.csTest required daemon enablement +163/-13

Test required daemon enablement

• Covers machine naming, action availability, classification, and completion gating.

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

HarnessesStepViewModelTests.csTest harness setup choices and retries +372/-0

Test harness setup choices and retries

• Exercises detection, privacy persistence, tools-only arguments, PATH handling, failures, and retry behavior.

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

HistoryStepViewModelTests.csTest repository history import +308/-0

Test repository history import

• Covers discovery states, repository and date choices, import arguments, and background-run outcomes.

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

ImportDiscoveryReportTests.csTest discovery report parsing +22/-0

Test discovery report parsing

• Checks parsing and validation of the CLI's history JSON.

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

ImportTrackTests.csTest accessible import tracks +27/-0

Test accessible import tracks

• Verifies the custom history control and its selection behavior.

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

OnboardingGateTests.csTest shared-configuration startup gating +23/-0

Test shared-configuration startup gating

• Covers whether existing CLI setup bypasses first-run onboarding.

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

OnboardingViewModelTests.csUpdate navigation tests for the pane +50/-115

Update navigation tests for the pane

• Replaces obsolete wizard expectations with step-aware navigation and close behavior.

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

SignInStepViewModelTests.csTest consolidated sign-in states +203/-72

Test consolidated sign-in states

• Covers workspace choices, provisioning, cancellation, and completion on the new sign-in page.

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

WizardAuthBridgesTests.csAlign auth-bridge tests +1/-1

Align auth-bridge tests

• Updates bridge expectations for consolidated sign-in.

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

WizardAuthServiceTests.csAlign sign-in service tests +10/-10

Align sign-in service tests

• Updates authentication tests for the revised setup contract.

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

WizardCompositionTests.csTest revised onboarding composition +24/-37

Test revised onboarding composition

• Asserts the replacement step graph and its shared dependencies.

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

WizardSimpleStepsTests.csReplace obsolete step tests +126/-196

Replace obsolete step tests

• Moves coverage from retired wizard pages to the new welcome, completion, and related step behavior.

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

WizardStartupTests.csTest pane startup and shutdown +130/-158

Test pane startup and shutdown

• Covers onboarding presentation, window adoption, handoff, and shutdown behavior.

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

AgentInstructionsWriterTests.csTest installed-instructions detection +15/-0

Test installed-instructions detection

• Verifies the marker used to recognize an existing tools installation.

test/Capacitor.Cli.Core.Tests.Unit/Instructions/AgentInstructionsWriterTests.cs

LoginShellProbeTests.csTest safe variable-presence probing +31/-0

Test safe variable-presence probing

• Checks shell variable-name validation and presence-only results.

test/Capacitor.Cli.Core.Tests.Unit/LoginShellProbeTests.cs

DaemonShimCommandsTests.csAlign CLI shim tests +2/-1

Align CLI shim tests

• Adjusts expectations associated with the integrated PATH fix.

test/Capacitor.Cli.Tests.Unit/Commands/DaemonShimCommandsTests.cs

ImportDiscoveryRenderTests.csTest repository window counts in JSON +13/-0

Test repository window counts in JSON

• Verifies discovery output includes each repository's totals for each history window.

test/Capacitor.Cli.Tests.Unit/Commands/ImportDiscoveryRenderTests.cs

PluginCommandToolsOnlyTests.csTest tools-only plugin behavior +226/-0

Test tools-only plugin behavior

• Covers supported and refused vendors, recording-hook preservation, and tools-only refresh behavior.

test/Capacitor.Cli.Tests.Unit/Commands/PluginCommandToolsOnlyTests.cs

Documentation (2) +23 / -1
README.mdDocument desktop setup +7/-1

Document desktop setup

• Explains the revised desktop onboarding and its relationship to CLI setup.

README.md

help-plugin.txtDocument tools-only plugin installs +16/-0

Document tools-only plugin installs

• Explains supported vendors and the recording behavior of --tools-only.

src/Capacitor.Cli.Core/Resources/help-plugin.txt

@nortonandreev nortonandreev self-assigned this Oct 6, 2026
@qodo-code-review

qodo-code-review Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Code Review by Qodo

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

Grey Divider


Action required

1. Onboarding cannot finish without daemon ✗ Dismissed
Description
DaemonStepViewModel.CanLeaveAsync rejects every forward navigation while Satisfied is false.
When the daemon is unavailable or the user declines to enable it, the wizard remains blocked and
cannot reach the Done screen or normal shell.
Code

src/Capacitor.App/ViewModels/Onboarding/DaemonStepViewModel.cs[R209-212]

+        if (direction != WizardNavigation.Back && !Satisfied) {
+            if (!Busy) Status = RequiredMessage;
+            return false;
+        }
Relevance

●●● Strong

The finding directly conflicts with the stated onboarding intent that daemon enablement remains
optional, making the navigation gate actionable.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The daemon step explicitly returns false for every non-Back navigation when Satisfied is false, so
an optional daemon setup becomes a required gate. This violates the requirement that daemon
enablement must not be required to finish onboarding.

Done screen, live progress, and daemon option
src/Capacitor.App/ViewModels/Onboarding/DaemonStepViewModel.cs[209-212]

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

## Issue description
The daemon card is intended to be optional, but forward navigation is rejected whenever the daemon is not running, preventing users from completing onboarding.

## Fix Focus Areas
- src/Capacitor.App/ViewModels/Onboarding/DaemonStepViewModel.cs[209-212]
- src/Capacitor.App/ViewModels/Onboarding/DaemonStepViewModel.cs[110-117]

## Recommended Fix
Allow the user to continue past the daemon step without `Satisfied`, while preserving the enable or start action and clearly communicating that the daemon can be configured later from the app settings or support menu.

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


2. Harness setup can target the wrong account ✓ Resolved
Description
HarnessesStepViewModel.PersistAsync saves settings under the resolved profile, but its
_cli.PluginInstallAsync call uses a CLI bound to the literal active profile. When an environment
profile override selects a different profile, the privacy settings and harness installation target
different accounts.
Code

src/Capacitor.App/ViewModels/Onboarding/HarnessesStepViewModel.cs[304]

+            var result = await _cli.PluginInstallAsync(row.Flag, _shutdownToken, row.InstallOptions).ConfigureAwait(true);
Relevance

●● Moderate

The profile mismatch is a plausible semantic bug, but no closely matching historical conversion
precedent was found.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The new harness step saves to the resolved profile, whereas the CLI factory pins the literal active
profile and overlays it on spawned commands.

src/Capacitor.App/ViewModels/Onboarding/HarnessesStepViewModel.cs[247-263]
src/Capacitor.App/Services/Onboarding/WizardComposition.cs[127-137]
src/Capacitor.App/App.axaml.cs[1040-1048]
src/Capacitor.App/App.axaml.cs[1365-1394]
src/Capacitor.App/Services/KcapCli.cs[263-267]

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

## Issue description
Harness settings and plugin installs can target different profiles when a profile override is present.

## Fix Focus Areas
- src/Capacitor.App/ViewModels/Onboarding/HarnessesStepViewModel.cs[249-263]
- src/Capacitor.App/ViewModels/Onboarding/HarnessesStepViewModel.cs[300-310]
- src/Capacitor.App/App.axaml.cs[1040-1048]

## Recommended Fix
Construct the harness-install CLI using the same freshly resolved profile that persistence uses, while preserving any separate literal-profile behavior required for consent acknowledgements.

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



Remediation recommended

3. One file defines several public models ✓ Resolved
Description
ImportDiscoveryReport.cs declares ImportDiscoveryReport, ImportDiscoveryRepo, and
ImportDiscoveryWindow as separate public record types, along with the generated serializer
context. Because these types are not a narrow enum-extension, tiny private hierarchy, or
descriptor-registry exception, the file name no longer uniquely identifies one primary type for
maintainers and tooling.
Code

src/Capacitor.App/Services/ImportDiscoveryReport.cs[R30-31]

+public sealed record ImportDiscoveryRepo(
+    string Owner, string Name, int Sessions, DateTimeOffset? LastSessionAt, IReadOnlyList<ImportDiscoveryWindow>? Windows) {
Relevance

●●● Strong

This is a deterministic maintainability violation under an explicit repository rule, with no close
rejection precedent found.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The added file defines the public ImportDiscoveryReport record and additional public
ImportDiscoveryRepo and ImportDiscoveryWindow records, which are multiple primary top-level
types in one file.

Rule 3162234: One primary type per file, with only narrow documented exceptions
src/Capacitor.App/Services/ImportDiscoveryReport.cs[8-11]
src/Capacitor.App/Services/ImportDiscoveryReport.cs[30-36]

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

## Issue description
`ImportDiscoveryReport.cs` contains multiple public top-level record types instead of one primary type matching the file name.

## Fix Focus Areas
- src/Capacitor.App/Services/ImportDiscoveryReport.cs[8-11]
- src/Capacitor.App/Services/ImportDiscoveryReport.cs[30-36]

## Recommended Fix
Move `ImportDiscoveryRepo` and `ImportDiscoveryWindow` into separate files whose names match their types, and keep the serializer context with the type it exclusively supports or place it in a narrowly named generated-context file.

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


4. Moving from the disk image can quit without opening the installed app ✓ Resolved
Description
RunInstallLocationGuard runs open <InstalledPath> without the former -n flag, treats its
successful exit as a launch, and then calls Quit() on the disk-image copy. On Install, Update, or
OpenInstalled, macOS can instead activate that already-running copy because it shares the installed
bundle’s identifier, so Quit() closes the only running Capacitor instance.
Code

src/Capacitor.App/App.axaml.cs[R383-390]

+                    var launched = Process.Start(new ProcessStartInfo("open") { ArgumentList = { outcome.InstalledPath! }, UseShellExecute = false });
+                    if (launched is null) return new MoveOutcome(false, outcome.InstalledPath, "Could not open Capacitor. Open the copy in Applications.");
+                    using (launched) {
+                        await launched.WaitForExitAsync(_shutdown.Token);
+                        if (launched.ExitCode != 0)
+                            return new MoveOutcome(false, outcome.InstalledPath, "Could not open Capacitor. Open the copy in Applications.");
+                    }
                    Quit();
Relevance

●●● Strong

Recent app review precedents accept lifecycle and shutdown findings involving unsafe process or
teardown sequencing.

PR-#446
PR-#740

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The previous invocation used open -n <path> to force a new instance, but the current move path
removes -n while the disk-image instance is still running and calls Quit() after open exits
successfully. ReadVersion accepts only bundles with CFBundleIdentifier io.kurrent.capacitor,
which Info.plist also assigns to the app, so a successful open does not establish that a distinct
installed process started.

src/Capacitor.App/App.axaml.cs[380-392]
src/Capacitor.App/Services/ApplicationsMover.cs[71-90]
src/Capacitor.App/Packaging/Info.plist[11-12]
src/Capacitor.App/App.axaml.cs[359-367]
src/Capacitor.App/App.axaml.cs[380-390]

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

## Issue description
After an Install, Update, or OpenInstalled decision, `open <path>` can activate the still-running disk-image copy rather than launch the installed bundle. The guard then quits that copy, leaving no Capacitor instance running.

## Fix Focus Areas
- src/Capacitor.App/App.axaml.cs[380-392]

## Recommended Fix
For Install and Update, restore `open -n <path>` to launch a distinct installed instance. For OpenInstalled, use `-n` when `InstalledAppRunning(path)` is false; otherwise, explicitly activate the installed copy, for example by its PID or with `open -b` after the current process quits. Do not call `Quit()` until the installed copy is confirmed running from the installed path.

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


5. Tools-only refresh still changes capture ✓ Resolved
Description
PluginCommand.Install skips new Git hook installation under --tools-only but still calls
gitHook.Refresh() when --if-installed is present. If an existing global hook points to an older
binary, that tools-only refresh can rewrite its recording command and event entries, altering
capture configuration.
Code

src/Capacitor.Cli/Commands/PluginCommand.cs[R74-77]

+            // A refresh of an existing install is no consent to a new git config entry, and the
+            // git hook files commits under a recorded session, which --tools-only declines.
            if (args.Contains("--if-installed")) gitHook.Refresh();
-            else gitHook.Install();
+            else if (!args.Contains(ToolsOnlyFlag)) gitHook.Install();
Relevance

●●● Strong

Recent CLI precedents accept refresh-healing findings where marker-based refresh logic changes or
fails to restore integration state.

PR-#303
PR-#307

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The CLI documents that --tools-only must not add or alter capture-related Git hooks, yet the
--if-installed branch invokes gitHook.Refresh() without checking that flag. Refresh() writes
changed command and event entries when an existing hook differs, so a stale hook can be modified on
the tools-only path.

Rule 2270057: Keep CLI documentation in README.md in sync with user-facing CLI changes
src/Capacitor.Cli/Commands/PluginCommand.cs[74-77]
README.md[205-206]
src/Capacitor.Cli.Core/Resources/help-plugin.txt[267-270]
src/Capacitor.Cli/Commands/PluginCommand.cs[71-77]
src/Capacitor.Cli/GitHookInstaller.cs[21-25]
src/Capacitor.Cli/GitHookInstaller.cs[38-49]

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

## Issue description
The `--tools-only --if-installed` path can refresh an existing global Git recording hook, modifying capture-related configuration during a tools-only refresh.

## Fix Focus Areas
- src/Capacitor.Cli/Commands/PluginCommand.cs[74-77]

## Recommended Fix
Guard `gitHook.Refresh()` with the same `--tools-only` condition that prevents new Git hook installation. Preserve hook refresh for ordinary `--if-installed` installs, keep tools-only installs limited to MCP registrations, skills, and steering instructions, and add a test for `--tools-only --if-installed` with a stale existing hook.

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


View medium (2)
6. PR references split across two lines ⊘ Outdated
Description
The description places Fixes #1267 on one line and `Linear:
https://linear.app/kurrent/issue/AI-3418/...` on another instead of combining both references on one
dedicated reference line. Reviewers and automation that inspect the reference line cannot verify the
GitHub closing reference and Linear key together.
Code

README.md[R205-206]

+> **Want an agent's kcap tools without recording its sessions?**
+> Add `--tools-only` to `kcap plugin install --cursor|--copilot|--gemini|--kiro|--pi|--opencode|--antigravity`. It writes that agent's MCP servers, skills and steering instructions (the `--skip-<vendor>-mcp`, `--skip-<vendor>-skills` and `--skip-<vendor>-instructions` flags still apply) and nothing that records: no hooks, no Pi or OpenCode live-ingest file, no Antigravity capture plugin, no Kiro agent clone, default-agent switch or Kiro Crew hook, and no git hook. Only Pi's MCP bridge still needs `kcap` on `PATH`. Claude Code and Codex ship their tools with capture, so `--tools-only` is refused for them (exit code 1). The upgrade-time `--if-installed` refresh keeps a tools-only install tools-only: it refreshes the tools and never adds capture. `--tools-only --if-installed` refreshes only the tools of any install.
Relevance

●●● Strong

Accepted template guidance requires a single dedicated line containing both GitHub and Linear
references.

PR-#659

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The supplied PR description ends with Fixes #1267. and a separate Linear: ... AI-3418 line, so
the required GitHub and Linear references are not on one reference line.

Rule 2897991: PR description must contain both GitHub and Linear issue references; PR title must not contain issue IDs

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

## Issue description
The PR description places the GitHub closing reference and Linear issue key on separate lines, while the checklist requires both on the same reference line.

## Fix Focus Areas
- README.md[205-206]

## Recommended Fix
Add a single dedicated reference line containing exactly one GitHub closing keyword and both references, for example `Fixes #1267 AI-3418`, and keep the explanatory summary on subsequent lines.

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


7. PR title breaks the commit subject format ⊘ Outdated
Description
The PR title [AI-3418] app: Add full-size onboarding with CLI-compatible setup includes a
bracketed Linear issue key and a colon-separated scope instead of one imperative clause, and it
lacks the required trailing GitHub reference. Because this title is used in review and merge
metadata, the Linear key remains in the PR subject and the merge subject cannot match the declared
pattern.
Code

README.md[R205-206]

+> **Want an agent's kcap tools without recording its sessions?**
+> Add `--tools-only` to `kcap plugin install --cursor|--copilot|--gemini|--kiro|--pi|--opencode|--antigravity`. It writes that agent's MCP servers, skills and steering instructions (the `--skip-<vendor>-mcp`, `--skip-<vendor>-skills` and `--skip-<vendor>-instructions` flags still apply) and nothing that records: no hooks, no Pi or OpenCode live-ingest file, no Antigravity capture plugin, no Kiro agent clone, default-agent switch or Kiro Crew hook, and no git hook. Only Pi's MCP bridge still needs `kcap` on `PATH`. Claude Code and Codex ship their tools with capture, so `--tools-only` is refused for them (exit code 1). The upgrade-time `--if-installed` refresh keeps a tools-only install tools-only: it refreshes the tools and never adds capture. `--tools-only --if-installed` refreshes only the tools of any install.
Relevance

●●● Strong

Active title rules and accepted PR guidance support removing Linear prefixes and enforcing
standardized commit-subject formatting.

PR-#659

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The supplied title begins with [AI-3418], contains an app: scope, and has no trailing
(#digits) reference. The cited title requirements call for a single imperative clause with a final
GitHub reference while keeping Linear issue keys out of the PR title.

Rule 2897961: Enforce single-clause imperative commit subject with GitHub issue reference and 80-char limit
Rule 2897978: Format PR titles as imperative commit subjects without explicit issue references

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

## Issue description
The PR title contains a bracketed Linear issue key and a colon-separated scope, and it lacks the required trailing GitHub issue reference.

## Fix Focus Areas
- README.md[205-206]

## Recommended Fix
Rename the PR with one imperative clause under 80 characters. Remove `[AI-3418]` and the `app:` scope, and end the title with the required GitHub issue reference in `(#digits)` form.

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



Informational

8. Reopening setup silently kills a running history import ✓ Resolved
Description
RestartForSetupAsync shuts the app down through DisposeAndShutdownAsync → QuiesceAppAsync,
which calls HistoryStepViewModel.CancelActiveRunAsync and cancels the import that onboarding left
running in the main window. The confirmation prompt only says running sessions, settings and sign-in
are kept. The Setup action stays available while the status line reads "Importing history", so one
click aborts the import partway through without warning.
Code

src/Capacitor.App/App.axaml.cs[R736-751]

+            if (!await ShowLifecyclePromptDialogAsync(_coordinator?.Window,
+                new LifecyclePrompt(LifecyclePrompt.KindSetup, null, null, false,
+                    "Capacitor will restart to reopen setup. Your running sessions will keep going, and your settings and sign-in will stay intact."), _shutdown.Token)) {
+                _setupRestarting = false;
+                return;
+            }
+            var executable = Environment.ProcessPath ?? throw new InvalidOperationException("The app's executable could not be found.");
+            var start = new ProcessStartInfo(executable) { UseShellExecute = false };
+            if (Path.GetFileNameWithoutExtension(executable) == "dotnet")
+                start.ArgumentList.Add(Environment.GetCommandLineArgs()[0]);
+            start.ArgumentList.Add("--setup");
+            desktop.Exit += (_, _) => {
+                try { Process.Start(start); }
+                catch (Exception ex) { Console.Error.WriteLine($"kcap: could not reopen setup: {ex.Message}"); }
+            };
+            desktop.TryShutdown();
Relevance

●●● Strong

Recent onboarding precedent accepts lifecycle race findings where delayed or interrupted navigation
can produce incorrect user-visible behavior.

PR-#1101

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The restart prompt's copy says nothing about imports. TryShutdown goes through
OnShutdownRequested → DisposeAndShutdownAsync, which calls QuiesceAppAsync with
_historyImport. That calls CancelActiveRunAsync, which in turn calls run.CancelAsync().
Meanwhile the main window shows the live import status, so the user can trigger setup while it is
still running.

src/Capacitor.App/App.axaml.cs[732-757]
src/Capacitor.App/App.axaml.cs[1838-1842]
src/Capacitor.App/ViewModels/Onboarding/HistoryStepViewModel.cs[283-287]
src/Capacitor.App/ViewModels/MainWindowViewModel.cs[177-183]

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

## Issue description
Reopening setup restarts the app, and the restart cancels an in-progress history import. The confirmation prompt does not mention this.

## Fix Focus Areas
- src/Capacitor.App/App.axaml.cs[732-757]

## Recommended Fix
In `RestartForSetupAsync`, check `_historyImport?.Run is { Running: true }`. If it is running, add a sentence to the prompt saying the history import will stop and can be retried from setup, or disable the Setup action until the import finishes.

ⓘ 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
  Explored: repo: kurrent-io/cloud-meta (sha: 107e7601) — View relationship
  Explored: repo: kurrent-io/kcap-web (sha: ea602810) — View relationship
  Explored: repo: kurrent-io/kcap-server (sha: 23a43213) — View relationship
  Explored: repo: kurrent-io/kcap-deployments (sha: d775bea1) — View relationship
Review mode: Auto: 🧠 Deep: Large cross-cutting onboarding, authentication, CLI, migration, and installer logic has dense independent risks.

Grey Divider

Tip of the day
💡 Did you know, you can route each severity your way: inline, summary, both, or drop

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread src/Capacitor.Cli/Commands/PluginCommand.cs Outdated
Comment thread README.md
Comment thread README.md
Comment thread src/Capacitor.App/Services/ImportDiscoveryReport.cs Outdated
Comment thread src/Capacitor.App/ViewModels/Onboarding/DaemonStepViewModel.cs
Comment thread src/Capacitor.App/ViewModels/Onboarding/HarnessesStepViewModel.cs
Comment thread src/Capacitor.App/App.axaml.cs Outdated
Comment thread src/Capacitor.App/App.axaml.cs
The finished flow hands its window to the main surface in place, so the rail opens where
onboarding was; a window closed mid-flow still abandons it, as before.
The Connect choice is now part of the Sign-in step, so a "workspace you already have" answer
stays on the page and signs in from there. The re-auth dialog keeps its own view.
A refresh of an install whose capture half is absent touches only the tools,
so the npm postinstall keeps a --tools-only install free of hooks.
…#1267)

A row answered tools-only installs with --tools-only, so the page needs the CLI that carries it.
The import outlives onboarding: leaving the page or closing onboarding keeps it running, and
only shutdown stops it. Discovery reports each repository's own window counts for the picker.
The machine name is saved when the daemon is enabled, not on a page of its own, because the
service is installed under it.
Classification clears Busy after the status read resumes off the UI thread. ReactiveCommand leaves that can-execute there, so Avalonia keeps Check again and Enable daemon disabled.
The pane chrome was showing the launcher's Start daemon sentence on every step. The wizard drops that button name, and the line is visible only while the daemon step is current.
The repository rows bind Stop, so setting an owner to skip left them on shared. The titling checkbox was centred in the theme's hit target, and the daemon step no longer says to continue past a failure it refuses.
Hooks store the bare command, so turning a harness on before the login shell can find the bundled binary installs hooks that record nothing.
Continue stays secondary while the step already shows its own filled action, so two filled buttons never sit on one screen.
Back sits on the left and the forward button is last. A finished sign-in or harness install stays until that press.
Continue and Cancel use the same footer columns as Skip and Next, so Back stays on that line. The checkbox theme draws its mark in a 32px row, which a 16px box clips.
A committed pick stays on the workspace list. A failed harness install still holds for Retry.
@nortonandreev
nortonandreev force-pushed the norton/ai-3418-onboarding-production branch from 37bf040 to 23c0fd5 Compare October 6, 2026 17:00
@nortonandreev

Copy link
Copy Markdown
Contributor Author

User-facing changelog for the full onboarding branch:

  • First-run experience

    • A full-size, six-step setup flow in the main window, with an introduction explaining what Capacitor will change on your machine.
    • Clear primary actions, explicit Next/Back navigation, and layouts that remain usable in smaller windows.
    • Improved keyboard navigation, screen-reader labels, and accessible history-sharing controls.
  • Account and workspace

    • Sign in with a work account, use a sign-in code, or enter a workspace name or URL.
    • Choose an existing workspace or create one, with address-availability checks, creation progress, and retry guidance.
    • Copy sign-in links and codes when the browser handoff needs help.
    • Existing CLI setup is recognized: completing setup from the terminal remains supported and does not force a second desktop setup.
    • Settings and installation actions consistently use the selected profile, including profile overrides.
  • Harness connections and privacy

    • Detect supported harnesses and choose which ones receive Capacitor tools and session recording.
    • Choose who can read new sessions: only you, project members, account members for organization repositories, or everyone in the account.
    • Privacy is presented first and requires an explicit choice, even when continuing without connecting harnesses.
    • Existing connections are preserved; individual failed installs can be retried.
    • Choose whether local titles and summaries may use provider API keys.
    • Fix the terminal's ability to find the bundled CLI, with platform-specific instructions and honest success/failure reporting.
    • Desktop packages include the required plugin assets on macOS and Windows.
  • History import

    • Review locally discovered history grouped by repository and owner before uploading.
    • Choose Skip, Only me, or Shared per repository or group, and select the last 30 days, last 90 days, or all history.
    • See counts for the selected repositories and time window, plus guidance for sessions without a matched repository.
    • Choose whether titles are generated locally using your agent subscription.
    • Imports continue in the background after leaving setup, with progress and failure details available in the main window.
  • Daemon and completion

    • Name this machine's daemon and start, install, repair, or replace its background service with appropriate confirmation.
    • Required steps and failed checks stay actionable instead of reporting success prematurely.
    • The completion page summarizes the actual setup results, recording connections, and import progress, and provides a link to the workspace.
  • Leaving and returning to setup

    • Leave onboarding for the main app and reopen it from Help and support or the app menu.
    • Reopening setup preserves sign-in, settings, and running agent sessions.
    • If a history import is active, the restart confirmation warns that it will stop; already-imported sessions are retained.
  • Installation and updates

    • On macOS, move Capacitor into Applications or update an existing copy when the disk-image version is newer.
    • Equal or older disk images offer to open the installed copy; a running installed copy is not overwritten.
    • Failed copies or updates preserve the working installation.
    • The disk-image copy only exits after the installed app is confirmed running, without creating another instance when one is already installed and running.
  • CLI setup

    • plugin install --tools-only installs tools for Cursor, Copilot, Gemini, Kiro, Pi, OpenCode, and Antigravity without enabling recording. Existing recording hooks remain untouched, including during explicit tools-only refreshes; Claude Code and Codex keep tools coupled with capture.
    • Ordinary upgrades preserve tools-only installations instead of enabling capture.
    • History discovery JSON includes per-repository time-window counts for accurate import previews.

alexeyzimarev and others added 3 commits October 7, 2026 13:45
Git Bash treats a bare "kcap" as the kcap.exe beside it, so the existence guard
failed silently and stopped the Windows app bundle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ding-production

# Conflicts:
#	src/Capacitor.Cli/Commands/PluginCommand.cs
@alexeyzimarev
alexeyzimarev merged commit c9331d0 into main Oct 7, 2026
9 checks passed
@alexeyzimarev
alexeyzimarev deleted the norton/ai-3418-onboarding-production branch October 7, 2026 16:38
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.

Desktop app: full-size onboarding pane ported from the browser first-run setup

2 participants