Skip to content

Settings → Corveil CLI: add 'Reinstall skill' button next to Verify (manual rebuild-pickup without restart) #491

@dgershman

Description

@dgershman

Ask: Add a Reinstall skill button in Settings → General → Corveil CLI, next to the existing Verify button (SettingsView.swift:615 for Verify's neighbor placement). Clicking it runs the same corveil skill install --path {devRoot}/.claude/commands/query-corveil.md flow that the launch-time and (per #490) config-change paths use — without requiring an app restart, a workspace switch, or re-picking the path.

Why this is its own button

#490 hot-triggers the install when the picker value changes. But the most common rebuild loop doesn't change the picker — the user runs go build ./cmd/corveil in the corveil repo, the binary at the configured path now contains a newer embedded skill version, and they want that newer version installed into their devroot. With #490 alone, the user has three workarounds:

  1. Restart Crow (heavy — closes every session).
  2. Switch workspaces (alternate scaffold path; awkward side-channel).
  3. Re-pick the same path in Settings (works but unintuitive — "why am I telling it the same thing?").

A dedicated Reinstall skill button names the action and makes it discoverable. Verify already establishes the "Settings has interactive buttons next to the picker" pattern; this is the parallel for "I rebuilt corveil, install the new skill."

Fix

SettingsView.swift — adjacent to the Verify button at :615:

Button("Reinstall skill") {
    Task { @MainActor in
        let warning = await Scaffolder.installCorveilSkill(
            config.defaults.binaries["corveil"]
        )
        appState.corveilSkillInstallWarning = warning
        // Surface a transient toast/banner: "Skill reinstalled" or the warning.
    }
}
.disabled((config.defaults.binaries["corveil"] ?? "").isEmpty)

Reuse the same installCorveilSkill function #490 exposes (this ticket depends on #490 landing the function-accessibility refactor; if #490 keeps it private, surface it here too).

The button is disabled when the picker is unset — there's no path to install from, and the launch-time install would also no-op. Tooltip on the disabled state: "Set the Corveil CLI path first."

Acceptance

  1. With a valid corveil path configured, click Reinstall skill. Without restart, {devRoot}/.claude/commands/query-corveil.md matches <corveilPath> skill show byte-for-byte (proves the new embedded skill content from the rebuilt binary installed).
  2. Transient success indication (toast / "✓ Skill reinstalled" label that fades after a few seconds — match the Verify button's success surface for consistency).
  3. With a broken path (set but non-existent / non-executable), clicking Reinstall surfaces the same diagnostic as the launch-time path via corveilSkillInstallWarning. No crash.
  4. Button is disabled and visually grayed when the picker is unset.
  5. Repeated clicks are idempotent (the underlying install is — os.WriteFile + os.Chmod).

Critical files

Purpose Path
Button placement Packages/CrowUI/Sources/CrowUI/SettingsView.swift (next to Verify around :615)
Installer function (already exposed by #490) Sources/Crow/App/Scaffolder.swift:230 (installCorveilSkill)
Warning surface (reuse) Packages/CrowCore/Sources/CrowCore/AppState.swift:237 (corveilSkillInstallWarning)

Out of scope

Related

🐦‍⬛ Created with Crow via Claude Code

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions