feat(installer): add SystemCheckPage with blocking-error gating

Adds a new wizard page (positioned right after Welcome, FreshInstall only)
that auto-runs EnvironmentCheckService on entry and shows one row per check
with status icon, localized title/message, and hint+help-link on
failure/unknown. A "Recheck" button re-runs it, guarded against re-entrancy.

IInstallerPage gets a BlocksNavigation default member; WizardViewModel's
Next button now binds to CanGoNext, which the current page can veto (used
here while a check run is in flight or a blocking Error+Failed result is
present — Warnings and Unknown results never block). The summary line names
the blocking checks so a disabled Next is self-explanatory.

Wires up DI for the check pipeline (IProcessRunner, IPortOwnerResolver,
per-run ClaudeCliLookup) and adds the checks.* / installer.systemCheck.*
locale keys in en.json + de.json.

Visual appearance is NOT verified — needs a manual pass in the running
installer.
This commit is contained in:
mika kuns
2026-08-05 20:09:52 +02:00
parent 05be07b28c
commit 5cc1ec98c0
17 changed files with 717 additions and 3 deletions
+45
View File
@@ -481,6 +481,17 @@
"registerMcp": "MCP-Server bei Claude registrieren",
"registerMcpHint": "Führt 'claude mcp add' aus, damit Claude deine ClaudeDo-Aufgaben sehen und verwalten kann. Du kannst dies später ändern."
},
"systemCheck": {
"title": "Systemprüfung",
"subtitle": "ClaudeDo prüft dein System vor der Installation.",
"recheck": "Erneut prüfen",
"summary": {
"running": "System wird geprüft…",
"ok": "Alles in Ordnung.",
"warnings": "{0} Warnung(en) gefunden.",
"blocking": "{0} Problem(e) müssen behoben werden: {1}"
}
},
"paths": {
"title": "Datenpfade",
"subtitle": "Lege fest, wo ClaudeDo seine Daten speichert.",
@@ -525,6 +536,40 @@
"continueAnyway": "Trotzdem fortfahren"
}
},
"checks": {
"git": {
"title": "Git",
"hint": "Installiere Git und stelle sicher, dass es im PATH liegt."
},
"gitIdentity": {
"title": "Git-Identität",
"hint": "Lege deine Git-Identität fest: git config --global user.name \"...\" und user.email \"...\"."
},
"ports": {
"title": "Ports",
"hint": "Gib den Port frei oder ändere ihn nach der Installation auf der Worker-Seite."
},
"writeAccess": {
"title": "Schreibzugriff",
"hint": "Wähle ein anderes Installationsverzeichnis oder starte den Installer als Administrator."
},
"claudeCli": {
"title": "Claude CLI",
"hint": "Installiere die Claude CLI und stelle sicher, dass sie im PATH liegt."
},
"claudeVersion": {
"title": "Claude-CLI-Version",
"hint": "Aktualisiere die Claude CLI auf eine neuere Version."
},
"claudeAuth": {
"title": "Claude-Anmeldung",
"hint": "Führe 'claude auth login' aus, um dich anzumelden."
},
"permissionModeAuto": {
"title": "Berechtigungsmodus",
"hint": "Aktualisiere die Claude CLI auf eine Version, die --permission-mode auto unterstützt."
}
},
"planning": {
"conflict": {
"windowTitle": "Merge-Konflikt",
+45
View File
@@ -481,6 +481,17 @@
"registerMcp": "Register MCP server with Claude",
"registerMcpHint": "Runs 'claude mcp add' so Claude can view and manage your ClaudeDo tasks. You can change this later."
},
"systemCheck": {
"title": "System Check",
"subtitle": "ClaudeDo checks your system before installing.",
"recheck": "Recheck",
"summary": {
"running": "Checking your system…",
"ok": "Everything looks good.",
"warnings": "{0} warning(s) found.",
"blocking": "{0} problem(s) must be fixed: {1}"
}
},
"paths": {
"title": "Data Paths",
"subtitle": "Configure where ClaudeDo stores its data.",
@@ -525,6 +536,40 @@
"continueAnyway": "Continue anyway"
}
},
"checks": {
"git": {
"title": "Git",
"hint": "Install Git and make sure it is on PATH."
},
"gitIdentity": {
"title": "Git Identity",
"hint": "Set your git identity: git config --global user.name \"...\" and user.email \"...\"."
},
"ports": {
"title": "Ports",
"hint": "Free the port, or change it on the Worker page after install."
},
"writeAccess": {
"title": "Write Access",
"hint": "Choose a different install directory, or run the installer as administrator."
},
"claudeCli": {
"title": "Claude CLI",
"hint": "Install the Claude CLI and make sure it is on PATH."
},
"claudeVersion": {
"title": "Claude CLI Version",
"hint": "Update the Claude CLI to a newer version."
},
"claudeAuth": {
"title": "Claude Login",
"hint": "Run 'claude auth login' to sign in."
},
"permissionModeAuto": {
"title": "Permission Mode",
"hint": "Update the Claude CLI to a version that supports --permission-mode auto."
}
},
"planning": {
"conflict": {
"windowTitle": "Merge conflict",