feat(studio): Welcome page Phase C — live getting-started checklist (v0.39.0)

Final slice of the Welcome surface. Four steps that prove
the operator has the basic loop wired up; each step is
a live probe against the running hub, no manual ticks.

The four checked signals:

  1. System AI configured
     → `HubService.systemAiStatus().enabled`
  2. Public capability source added
     → `listMcpClients()` returns at least one entry
  3. Text module installed
     → `listModules()` contains a name starting with `text.`
  4. Saved flow run
     → any `flow.completed` event in the last 100 audit
       events

All four probes fire in parallel from `_OnboardingChecklist`'s
`_refresh()`. Failures stay false (catchError) so a hub that
is briefly unreachable doesn't blank the whole row — the
operator hits the explicit Refresh icon to retry.

UX:

- Renders between hero and pillars so the actionable path
  beats the educational content for screen real estate.
- Each row: status icon (○ pending / ✓ done) + title +
  one-line hint pointing the operator at the right Studio
  surface + status pill.
- Done rows strike-through the title and dim it; pending
  rows stay full-strength.
- When all four flip to done, an "All four steps complete"
  footer appears with a `Hide checklist` button. Clicking
  persists `welcome.checklist.dismissed = true` via
  SharedPreferences; the section is gone for good (we don't
  re-nag operators who chose a non-default path).

15 new ARB keys for the section header, body, four rows
plus done/pending pills, all-done footer, dismiss /
refresh / refreshing button labels.

Three-phase plan from `docs/landing-page-design.md` is now
fully shipped: Phase A scaffolding (v0.37.0), Phase B
embedded doc reader (v0.38.0), Phase C live checklist
(v0.39.0).

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-05-09 00:28:41 +02:00
parent 3b07d340d5
commit 930e246649
8 changed files with 496 additions and 2 deletions

View file

@ -33,6 +33,22 @@
"welcomeDocClose": "Schließen",
"welcomeDocFailedToLoad": "Doku konnte nicht geladen werden: {error}",
"@welcomeDocFailedToLoad": { "placeholders": { "error": { "type": "String" } } },
"welcomeChecklistHeader": "ERSTE SCHRITTE",
"welcomeChecklistBody": "Vier Schritte zu einem funktionierenden Hub. Live-Zustand — nach jeder Änderung aktualisieren.",
"welcomeChecklistAi": "System-AI konfigurieren",
"welcomeChecklistAiHint": "Einstellungen → System-AI. Wird für die KI-Suche und Fehlererklärungen gebraucht.",
"welcomeChecklistMcp": "Öffentliche Capability-Quelle hinzufügen",
"welcomeChecklistMcpHint": "Store → Today-Hero, oder Einstellungen → MCP-Clients. DeepWiki und Semgrep sind je ein Klick.",
"welcomeChecklistModule": "Ein Text-Modul installieren",
"welcomeChecklistModuleHint": "Store → nach „text\" suchen → Installieren. text.extract für PDFs und DOCX ist ein guter Start.",
"welcomeChecklistFlow": "Einen gespeicherten Flow starten",
"welcomeChecklistFlowHint": "Flows → einen wählen → Starten. Der mitgelieferte extract-summarize.yaml ist ein guter erster Lauf.",
"welcomeChecklistAllDone": "Alle vier Schritte erledigt.",
"welcomeChecklistDismiss": "Checkliste ausblenden",
"welcomeChecklistRefresh": "Aktualisieren",
"welcomeChecklistRefreshing": "Prüfe…",
"welcomeChecklistDone": "Erledigt",
"welcomeChecklistTodo": "Offen",
"navDoctor": "Diagnose",
"navModules": "Module",
"navStore": "Store",

View file

@ -34,6 +34,22 @@
"welcomeDocClose": "Close",
"welcomeDocFailedToLoad": "Could not load documentation: {error}",
"@welcomeDocFailedToLoad": { "placeholders": { "error": { "type": "String" } } },
"welcomeChecklistHeader": "GETTING STARTED",
"welcomeChecklistBody": "Four steps to a working hub. Live state — refresh after changing anything.",
"welcomeChecklistAi": "Configure System AI",
"welcomeChecklistAiHint": "Settings → System AI. Required for the AI search and inline failure explanations.",
"welcomeChecklistMcp": "Add a public capability source",
"welcomeChecklistMcpHint": "Store → Today hero, or Settings → MCP Clients. DeepWiki and Semgrep are one click each.",
"welcomeChecklistModule": "Install a text module",
"welcomeChecklistModuleHint": "Store → search \"text\" → Install. Try text.extract for PDFs and DOCX.",
"welcomeChecklistFlow": "Run a saved flow",
"welcomeChecklistFlowHint": "Flows → pick one → Run. The bundled extract-summarize.yaml is a good first run.",
"welcomeChecklistAllDone": "All four steps complete.",
"welcomeChecklistDismiss": "Hide checklist",
"welcomeChecklistRefresh": "Refresh",
"welcomeChecklistRefreshing": "Checking…",
"welcomeChecklistDone": "Done",
"welcomeChecklistTodo": "Pending",
"navDoctor": "Doctor",
"navModules": "Modules",
"navStore": "Store",

View file

@ -278,6 +278,102 @@ abstract class AppLocalizations {
/// **'Could not load documentation: {error}'**
String welcomeDocFailedToLoad(String error);
/// No description provided for @welcomeChecklistHeader.
///
/// In en, this message translates to:
/// **'GETTING STARTED'**
String get welcomeChecklistHeader;
/// No description provided for @welcomeChecklistBody.
///
/// In en, this message translates to:
/// **'Four steps to a working hub. Live state — refresh after changing anything.'**
String get welcomeChecklistBody;
/// No description provided for @welcomeChecklistAi.
///
/// In en, this message translates to:
/// **'Configure System AI'**
String get welcomeChecklistAi;
/// No description provided for @welcomeChecklistAiHint.
///
/// In en, this message translates to:
/// **'Settings → System AI. Required for the AI search and inline failure explanations.'**
String get welcomeChecklistAiHint;
/// No description provided for @welcomeChecklistMcp.
///
/// In en, this message translates to:
/// **'Add a public capability source'**
String get welcomeChecklistMcp;
/// No description provided for @welcomeChecklistMcpHint.
///
/// In en, this message translates to:
/// **'Store → Today hero, or Settings → MCP Clients. DeepWiki and Semgrep are one click each.'**
String get welcomeChecklistMcpHint;
/// No description provided for @welcomeChecklistModule.
///
/// In en, this message translates to:
/// **'Install a text module'**
String get welcomeChecklistModule;
/// No description provided for @welcomeChecklistModuleHint.
///
/// In en, this message translates to:
/// **'Store → search \"text\" → Install. Try text.extract for PDFs and DOCX.'**
String get welcomeChecklistModuleHint;
/// No description provided for @welcomeChecklistFlow.
///
/// In en, this message translates to:
/// **'Run a saved flow'**
String get welcomeChecklistFlow;
/// No description provided for @welcomeChecklistFlowHint.
///
/// In en, this message translates to:
/// **'Flows → pick one → Run. The bundled extract-summarize.yaml is a good first run.'**
String get welcomeChecklistFlowHint;
/// No description provided for @welcomeChecklistAllDone.
///
/// In en, this message translates to:
/// **'All four steps complete.'**
String get welcomeChecklistAllDone;
/// No description provided for @welcomeChecklistDismiss.
///
/// In en, this message translates to:
/// **'Hide checklist'**
String get welcomeChecklistDismiss;
/// No description provided for @welcomeChecklistRefresh.
///
/// In en, this message translates to:
/// **'Refresh'**
String get welcomeChecklistRefresh;
/// No description provided for @welcomeChecklistRefreshing.
///
/// In en, this message translates to:
/// **'Checking…'**
String get welcomeChecklistRefreshing;
/// No description provided for @welcomeChecklistDone.
///
/// In en, this message translates to:
/// **'Done'**
String get welcomeChecklistDone;
/// No description provided for @welcomeChecklistTodo.
///
/// In en, this message translates to:
/// **'Pending'**
String get welcomeChecklistTodo;
/// No description provided for @navDoctor.
///
/// In en, this message translates to:

View file

@ -112,6 +112,59 @@ class AppLocalizationsDe extends AppLocalizations {
return 'Doku konnte nicht geladen werden: $error';
}
@override
String get welcomeChecklistHeader => 'ERSTE SCHRITTE';
@override
String get welcomeChecklistBody =>
'Vier Schritte zu einem funktionierenden Hub. Live-Zustand — nach jeder Änderung aktualisieren.';
@override
String get welcomeChecklistAi => 'System-AI konfigurieren';
@override
String get welcomeChecklistAiHint =>
'Einstellungen → System-AI. Wird für die KI-Suche und Fehlererklärungen gebraucht.';
@override
String get welcomeChecklistMcp => 'Öffentliche Capability-Quelle hinzufügen';
@override
String get welcomeChecklistMcpHint =>
'Store → Today-Hero, oder Einstellungen → MCP-Clients. DeepWiki und Semgrep sind je ein Klick.';
@override
String get welcomeChecklistModule => 'Ein Text-Modul installieren';
@override
String get welcomeChecklistModuleHint =>
'Store → nach „text\" suchen → Installieren. text.extract für PDFs und DOCX ist ein guter Start.';
@override
String get welcomeChecklistFlow => 'Einen gespeicherten Flow starten';
@override
String get welcomeChecklistFlowHint =>
'Flows → einen wählen → Starten. Der mitgelieferte extract-summarize.yaml ist ein guter erster Lauf.';
@override
String get welcomeChecklistAllDone => 'Alle vier Schritte erledigt.';
@override
String get welcomeChecklistDismiss => 'Checkliste ausblenden';
@override
String get welcomeChecklistRefresh => 'Aktualisieren';
@override
String get welcomeChecklistRefreshing => 'Prüfe…';
@override
String get welcomeChecklistDone => 'Erledigt';
@override
String get welcomeChecklistTodo => 'Offen';
@override
String get navDoctor => 'Diagnose';

View file

@ -112,6 +112,59 @@ class AppLocalizationsEn extends AppLocalizations {
return 'Could not load documentation: $error';
}
@override
String get welcomeChecklistHeader => 'GETTING STARTED';
@override
String get welcomeChecklistBody =>
'Four steps to a working hub. Live state — refresh after changing anything.';
@override
String get welcomeChecklistAi => 'Configure System AI';
@override
String get welcomeChecklistAiHint =>
'Settings → System AI. Required for the AI search and inline failure explanations.';
@override
String get welcomeChecklistMcp => 'Add a public capability source';
@override
String get welcomeChecklistMcpHint =>
'Store → Today hero, or Settings → MCP Clients. DeepWiki and Semgrep are one click each.';
@override
String get welcomeChecklistModule => 'Install a text module';
@override
String get welcomeChecklistModuleHint =>
'Store → search \"text\" → Install. Try text.extract for PDFs and DOCX.';
@override
String get welcomeChecklistFlow => 'Run a saved flow';
@override
String get welcomeChecklistFlowHint =>
'Flows → pick one → Run. The bundled extract-summarize.yaml is a good first run.';
@override
String get welcomeChecklistAllDone => 'All four steps complete.';
@override
String get welcomeChecklistDismiss => 'Hide checklist';
@override
String get welcomeChecklistRefresh => 'Refresh';
@override
String get welcomeChecklistRefreshing => 'Checking…';
@override
String get welcomeChecklistDone => 'Done';
@override
String get welcomeChecklistTodo => 'Pending';
@override
String get navDoctor => 'Doctor';