feat: guided setup — clickable next steps, signature relaxation, fresh-install auto-open

Post-apply the wizard now renders real Studio actions instead of CLI
text: a start-hub button that polls until the daemon answers,
per-module install buttons (capability-name install via the hub's
store index) with done/progress states, and an open-the-starter-flow
button that navigates to the Flows page. Regulated plans explain in
plain language that modules come from a signed source; the preview
offers 'allow installing from the public store' as one deliberate,
reversible switch that re-assembles the plan (allow_unsigned_modules).

Fresh installs (no config, no setup-plan.yaml) auto-open the wizard
once per run — the wizard IS the onboarding — and it steps back once
a setup exists. The welcome CTA is framed honestly ('get started in
3 questions'), and after the wizard closes the onboarding checklist
remounts, re-probes, and says what the assistant already covered
(profile line from setup-plan.yaml) instead of acting as a second,
disconnected onboarding surface.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-07-12 23:18:41 +02:00
parent 140408d26a
commit 1f1e050b42
8 changed files with 704 additions and 51 deletions

View file

@ -4,7 +4,7 @@
"errModuleDownloadHint": "Die Bundle-URL des Moduls ist nicht erreichbar (Statuscode unten). Der Hub läuft — URL/Host korrigieren oder anderen Store wählen.",
"storeFromSource": "aus {store}",
"guidedSetupTitle": "Setup-Assistent",
"guidedSetupIntro": "Beantworte drei Fragen — Ch∆In stellt passende Konfiguration, Modul-Set und Start-Flow zusammen.",
"guidedSetupIntro": "Beantworten Sie drei Fragen — Ch∆In stellt passende Konfiguration, Modul-Set und Beispiel-Flow zusammen.",
"guidedSetupScenario": "Szenario",
"guidedSetupIntent": "Aufgabe",
"guidedSetupTarget": "Wo läuft es?",
@ -1747,7 +1747,23 @@
"setupApplied": "Fertig — Ch∆In ist eingerichtet.",
"setupNextTitle": "Nächste Schritte",
"setupNextHubStart": "Hub starten",
"setupNextInstall": "Die Module installieren",
"setupNextRunFlow": "Den Beispiel-Flow ausführen",
"setupStartCta": "In 3 Fragen loslegen"
"setupHubRunning": "Der Hub läuft.",
"setupStartHubFirst": "Starten Sie zuerst den Hub — dann lassen sich die Module hier installieren.",
"setupActionInstall": "{module} installieren",
"@setupActionInstall": {"placeholders": {"module": {"type": "String"}}},
"setupActionInstalled": "{module} ist installiert.",
"@setupActionInstalled": {"placeholders": {"module": {"type": "String"}}},
"setupActionOpenFlow": "Beispiel-Flow „{flow}“ öffnen",
"@setupActionOpenFlow": {"placeholders": {"flow": {"type": "String"}}},
"setupModulesOfflineHint": "Die Module kommen ohne Internet als Offline-Paket auf den Server — die Anleitung dazu steht in der Dokumentation unter „Betrieb ohne Internet“.",
"setupModulesSignedHint": "Die Module kommen aus einer eigenen, signierten Quelle — nicht aus dem öffentlichen Store.",
"setupSigPublicStoreNotice": "Diese Einrichtung lässt nur signierte Module zu. Der öffentliche Store liefert zurzeit unsignierte Pakete — die vorbereiteten Module kommen daher aus einer eigenen, signierten Quelle.",
"setupAllowUnsigned": "Installation aus dem öffentlichen Store erlauben",
"setupAllowUnsignedSub": "Lockert die Signaturpflicht bewusst. Gut zum Ausprobieren — für den regulierten Betrieb später wieder aktivieren.",
"setupStartCta": "In 3 Fragen loslegen",
"setupProfileDev": "unkomplizierter Arbeitsplatz",
"setupProfileEnterprise": "abgesicherter Team-Betrieb",
"setupProfileAirgapped": "vollständig lokaler, regulierter Betrieb",
"welcomeChecklistSetupDone": "Die Grundeinrichtung ({profile}) hat der Einrichtungs-Assistent bereits erledigt — hier sehen Sie, was auf dem Hub schon passiert ist.",
"@welcomeChecklistSetupDone": {"placeholders": {"profile": {"type": "String"}}}
}

View file

@ -1786,7 +1786,23 @@
"setupApplied": "Done — Ch∆In is set up.",
"setupNextTitle": "Next steps",
"setupNextHubStart": "Start the hub",
"setupNextInstall": "Install the modules",
"setupNextRunFlow": "Run the example flow",
"setupStartCta": "Get started in 3 questions"
"setupHubRunning": "The hub is running.",
"setupStartHubFirst": "Start the hub first — then the modules can be installed right here.",
"setupActionInstall": "Install {module}",
"@setupActionInstall": {"placeholders": {"module": {"type": "String"}}},
"setupActionInstalled": "{module} is installed.",
"@setupActionInstalled": {"placeholders": {"module": {"type": "String"}}},
"setupActionOpenFlow": "Open the “{flow}” example flow",
"@setupActionOpenFlow": {"placeholders": {"flow": {"type": "String"}}},
"setupModulesOfflineHint": "The modules arrive as an offline bundle, without internet — the documentation explains this under “running without internet”.",
"setupModulesSignedHint": "The modules come from your own, signed source — not from the public store.",
"setupSigPublicStoreNotice": "This setup only accepts signed modules. The public store currently ships unsigned bundles — the prepared modules therefore come from your own, signed source.",
"setupAllowUnsigned": "Allow installing from the public store",
"setupAllowUnsignedSub": "Deliberately relaxes the signature requirement. Fine for trying things out — re-enable it for regulated operation.",
"setupStartCta": "Get started in 3 questions",
"setupProfileDev": "straightforward workstation",
"setupProfileEnterprise": "hardened team operation",
"setupProfileAirgapped": "fully local, regulated operation",
"welcomeChecklistSetupDone": "The setup assistant already took care of the basics ({profile}) — this list shows what has actually happened on your hub.",
"@welcomeChecklistSetupDone": {"placeholders": {"profile": {"type": "String"}}}
}

View file

@ -5329,23 +5329,95 @@ abstract class AppLocalizations {
/// **'Start the hub'**
String get setupNextHubStart;
/// No description provided for @setupNextInstall.
/// No description provided for @setupHubRunning.
///
/// In en, this message translates to:
/// **'Install the modules'**
String get setupNextInstall;
/// **'The hub is running.'**
String get setupHubRunning;
/// No description provided for @setupNextRunFlow.
/// No description provided for @setupStartHubFirst.
///
/// In en, this message translates to:
/// **'Run the example flow'**
String get setupNextRunFlow;
/// **'Start the hub first — then the modules can be installed right here.'**
String get setupStartHubFirst;
/// No description provided for @setupActionInstall.
///
/// In en, this message translates to:
/// **'Install {module}'**
String setupActionInstall(String module);
/// No description provided for @setupActionInstalled.
///
/// In en, this message translates to:
/// **'{module} is installed.'**
String setupActionInstalled(String module);
/// No description provided for @setupActionOpenFlow.
///
/// In en, this message translates to:
/// **'Open the “{flow}” example flow'**
String setupActionOpenFlow(String flow);
/// No description provided for @setupModulesOfflineHint.
///
/// In en, this message translates to:
/// **'The modules arrive as an offline bundle, without internet — the documentation explains this under “running without internet”.'**
String get setupModulesOfflineHint;
/// No description provided for @setupModulesSignedHint.
///
/// In en, this message translates to:
/// **'The modules come from your own, signed source — not from the public store.'**
String get setupModulesSignedHint;
/// No description provided for @setupSigPublicStoreNotice.
///
/// In en, this message translates to:
/// **'This setup only accepts signed modules. The public store currently ships unsigned bundles — the prepared modules therefore come from your own, signed source.'**
String get setupSigPublicStoreNotice;
/// No description provided for @setupAllowUnsigned.
///
/// In en, this message translates to:
/// **'Allow installing from the public store'**
String get setupAllowUnsigned;
/// No description provided for @setupAllowUnsignedSub.
///
/// In en, this message translates to:
/// **'Deliberately relaxes the signature requirement. Fine for trying things out — re-enable it for regulated operation.'**
String get setupAllowUnsignedSub;
/// No description provided for @setupStartCta.
///
/// In en, this message translates to:
/// **'Get started in 3 questions'**
String get setupStartCta;
/// No description provided for @setupProfileDev.
///
/// In en, this message translates to:
/// **'straightforward workstation'**
String get setupProfileDev;
/// No description provided for @setupProfileEnterprise.
///
/// In en, this message translates to:
/// **'hardened team operation'**
String get setupProfileEnterprise;
/// No description provided for @setupProfileAirgapped.
///
/// In en, this message translates to:
/// **'fully local, regulated operation'**
String get setupProfileAirgapped;
/// No description provided for @welcomeChecklistSetupDone.
///
/// In en, this message translates to:
/// **'The setup assistant already took care of the basics ({profile}) — this list shows what has actually happened on your hub.'**
String welcomeChecklistSetupDone(String profile);
}
class _AppLocalizationsDelegate

View file

@ -25,7 +25,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get guidedSetupIntro =>
'Beantworte drei Fragen — Ch∆In stellt passende Konfiguration, Modul-Set und Start-Flow zusammen.';
'Beantworten Sie drei Fragen — Ch∆In stellt passende Konfiguration, Modul-Set und Beispiel-Flow zusammen.';
@override
String get guidedSetupScenario => 'Szenario';
@ -3138,11 +3138,62 @@ class AppLocalizationsDe extends AppLocalizations {
String get setupNextHubStart => 'Hub starten';
@override
String get setupNextInstall => 'Die Module installieren';
String get setupHubRunning => 'Der Hub läuft.';
@override
String get setupNextRunFlow => 'Den Beispiel-Flow ausführen';
String get setupStartHubFirst =>
'Starten Sie zuerst den Hub — dann lassen sich die Module hier installieren.';
@override
String setupActionInstall(String module) {
return '$module installieren';
}
@override
String setupActionInstalled(String module) {
return '$module ist installiert.';
}
@override
String setupActionOpenFlow(String flow) {
return 'Beispiel-Flow „$flow“ öffnen';
}
@override
String get setupModulesOfflineHint =>
'Die Module kommen ohne Internet als Offline-Paket auf den Server — die Anleitung dazu steht in der Dokumentation unter „Betrieb ohne Internet“.';
@override
String get setupModulesSignedHint =>
'Die Module kommen aus einer eigenen, signierten Quelle — nicht aus dem öffentlichen Store.';
@override
String get setupSigPublicStoreNotice =>
'Diese Einrichtung lässt nur signierte Module zu. Der öffentliche Store liefert zurzeit unsignierte Pakete — die vorbereiteten Module kommen daher aus einer eigenen, signierten Quelle.';
@override
String get setupAllowUnsigned =>
'Installation aus dem öffentlichen Store erlauben';
@override
String get setupAllowUnsignedSub =>
'Lockert die Signaturpflicht bewusst. Gut zum Ausprobieren — für den regulierten Betrieb später wieder aktivieren.';
@override
String get setupStartCta => 'In 3 Fragen loslegen';
@override
String get setupProfileDev => 'unkomplizierter Arbeitsplatz';
@override
String get setupProfileEnterprise => 'abgesicherter Team-Betrieb';
@override
String get setupProfileAirgapped =>
'vollständig lokaler, regulierter Betrieb';
@override
String welcomeChecklistSetupDone(String profile) {
return 'Die Grundeinrichtung ($profile) hat der Einrichtungs-Assistent bereits erledigt — hier sehen Sie, was auf dem Hub schon passiert ist.';
}
}

View file

@ -3136,11 +3136,60 @@ class AppLocalizationsEn extends AppLocalizations {
String get setupNextHubStart => 'Start the hub';
@override
String get setupNextInstall => 'Install the modules';
String get setupHubRunning => 'The hub is running.';
@override
String get setupNextRunFlow => 'Run the example flow';
String get setupStartHubFirst =>
'Start the hub first — then the modules can be installed right here.';
@override
String setupActionInstall(String module) {
return 'Install $module';
}
@override
String setupActionInstalled(String module) {
return '$module is installed.';
}
@override
String setupActionOpenFlow(String flow) {
return 'Open the “$flow” example flow';
}
@override
String get setupModulesOfflineHint =>
'The modules arrive as an offline bundle, without internet — the documentation explains this under “running without internet”.';
@override
String get setupModulesSignedHint =>
'The modules come from your own, signed source — not from the public store.';
@override
String get setupSigPublicStoreNotice =>
'This setup only accepts signed modules. The public store currently ships unsigned bundles — the prepared modules therefore come from your own, signed source.';
@override
String get setupAllowUnsigned => 'Allow installing from the public store';
@override
String get setupAllowUnsignedSub =>
'Deliberately relaxes the signature requirement. Fine for trying things out — re-enable it for regulated operation.';
@override
String get setupStartCta => 'Get started in 3 questions';
@override
String get setupProfileDev => 'straightforward workstation';
@override
String get setupProfileEnterprise => 'hardened team operation';
@override
String get setupProfileAirgapped => 'fully local, regulated operation';
@override
String welcomeChecklistSetupDone(String profile) {
return 'The setup assistant already took care of the basics ($profile) — this list shows what has actually happened on your hub.';
}
}