diff --git a/CHANGELOG.md b/CHANGELOG.md index 617635b..f74b4ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,7 +61,7 @@ version + `kStudioVersion` in `lib/main.dart` stay in lockstep. - **Add-module-source dialog** for private modules that aren't in the public store. Asks for URL or local `.fai` - bundle path; carries an explainer block + `fai install --link` + bundle path; carries an explainer block + `chain install --link` example. - **Store catalogue** passed to the flow editor so the analyzer can decide between Install (in store) and Add diff --git a/README.md b/README.md index b37affb..7793600 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# F∆I Studio +# Ch∆In Studio -Desktop GUI client for the F∆I Platform hub. Tier-2 generic +Desktop GUI client for the Ch∆In Platform hub. Tier-2 generic platform client per `docs/architecture/client.md`. Connects to a -local or remote `fai serve` over gRPC. +local or remote `chain serve` over gRPC. > **Status (2026-05-05):** MVP scaffold. Three pages with mock > data, no live gRPC connection yet. Validates the visual diff --git a/assets/docs/architecture.md b/assets/docs/architecture.md index 998fe27..c7a2488 100644 --- a/assets/docs/architecture.md +++ b/assets/docs/architecture.md @@ -1,6 +1,6 @@ # Architecture in one paragraph -F∆I has three concepts you'll meet everywhere: **Hub**, +Ch∆In has three concepts you'll meet everywhere: **Hub**, **Module**, **Flow**. **The hub** is a single Rust binary called `fai`. It runs as a @@ -39,7 +39,7 @@ Studio ──gRPC──▶ Hub ──loads──▶ Module (WASM) or Podman. Modules are WASM components loaded in-process. - No external database. SQLite ships with the hub. - No background services. One process; restart with - `fai daemon restart` — see Doctor → Daemon control. + `chain daemon restart` — see Doctor → Daemon control. ## Where to go next in this app diff --git a/assets/docs/architecture_de.md b/assets/docs/architecture_de.md index 3409d9c..74c565e 100644 --- a/assets/docs/architecture_de.md +++ b/assets/docs/architecture_de.md @@ -1,6 +1,6 @@ # Architektur in einem Absatz -F∆I hat drei Konzepte, die dir überall begegnen: **Hub**, +Ch∆In hat drei Konzepte, die dir überall begegnen: **Hub**, **Modul**, **Flow**. **Der Hub** ist ein einzelnes Rust-Binary namens `fai`. Er @@ -42,7 +42,7 @@ Studio ──gRPC──▶ Hub ──lädt──▶ Modul (WASM) Module sind WASM-Komponenten, in-process geladen. - Keine externe Datenbank. SQLite kommt mit dem Hub. - Keine Hintergrunddienste. Ein Prozess; Neustart per - `fai daemon restart` — siehe Diagnose → Daemon-Steuerung. + `chain daemon restart` — siehe Diagnose → Daemon-Steuerung. ## Wo es in dieser App weitergeht diff --git a/assets/docs/audit.md b/assets/docs/audit.md index 03822cd..021aa12 100644 --- a/assets/docs/audit.md +++ b/assets/docs/audit.md @@ -37,7 +37,7 @@ WORM-1 is our first WORM (write-once-read-many) tier: beta / production channels. - **Tamper-evident**: the chain reveals any retroactive edit. Verification runs end-to-end on every Doctor-page load and - via `fai admin verify-events`. + via `chain admin verify-events`. - **Self-contained**: SQLite + chain hash is enough; no external WORM sink needed. @@ -60,7 +60,7 @@ WORM sink) are roadmap items, not yet shipped. If you want to verify outside Studio: ```bash -fai admin verify-events +chain admin verify-events # Prints "Hash chain intact: N events verified" or names the # first event whose hash mismatches. ``` diff --git a/assets/docs/audit_de.md b/assets/docs/audit_de.md index 8b0c6a7..55f0b62 100644 --- a/assets/docs/audit_de.md +++ b/assets/docs/audit_de.md @@ -38,7 +38,7 @@ WORM-1 ist unsere erste WORM-Stufe (write-once-read-many): beta-/production-Kanälen verweigert. - **Manipulationssicher**: Die Kette zeigt jede nachträgliche Änderung. Verifikation läuft bei jedem Doctor-Page-Load - komplett und über `fai admin verify-events`. + komplett und über `chain admin verify-events`. - **Selbst-tragend**: SQLite + Ketten-Hash genügen; keine externe WORM-Senke nötig. @@ -61,7 +61,7 @@ WORM-Senke) sind Roadmap-Punkte, noch nicht ausgeliefert. Wer außerhalb von Studio verifizieren will: ```bash -fai admin verify-events +chain admin verify-events # Druckt „Hash-Kette intakt: N Events verifiziert" oder nennt # das erste Event, dessen Hash nicht passt. ``` diff --git a/assets/docs/flows.md b/assets/docs/flows.md index 1bbe82e..66bb468 100644 --- a/assets/docs/flows.md +++ b/assets/docs/flows.md @@ -25,7 +25,7 @@ outputs: greeting: "{{ steps.greet.outputs.payload }}" ``` -`fai run flows/hello.yaml --input name=World` produces: +`chain run flows/hello.yaml --input name=World` produces: ```json { "greeting": "Hello, World" } diff --git a/assets/docs/flows_de.md b/assets/docs/flows_de.md index 2725937..123e322 100644 --- a/assets/docs/flows_de.md +++ b/assets/docs/flows_de.md @@ -26,7 +26,7 @@ outputs: greeting: "{{ steps.greet.outputs.payload }}" ``` -`fai run flows/hello.yaml --input name=Welt` ergibt: +`chain run flows/hello.yaml --input name=Welt` ergibt: ```json { "greeting": "Hallo, Welt" } diff --git a/assets/docs/security.md b/assets/docs/security.md index ca6280b..838b2e7 100644 --- a/assets/docs/security.md +++ b/assets/docs/security.md @@ -1,6 +1,6 @@ # Sandbox model -Every F∆I module runs inside a WebAssembly sandbox with no +Every Ch∆In module runs inside a WebAssembly sandbox with no ambient access to the host. The module can do exactly what it declares in its `module.yaml` — and nothing else. diff --git a/assets/docs/security_de.md b/assets/docs/security_de.md index 446313a..3ec033c 100644 --- a/assets/docs/security_de.md +++ b/assets/docs/security_de.md @@ -1,6 +1,6 @@ # Sandbox-Modell -Jedes F∆I-Modul läuft in einer WebAssembly-Sandbox ohne +Jedes Ch∆In-Modul läuft in einer WebAssembly-Sandbox ohne ambienten Hostzugriff. Das Modul kann genau das, was es in seiner `module.yaml` deklariert — und sonst nichts. diff --git a/docs/landing-page-design.md b/docs/landing-page-design.md index 39eee96..73df811 100644 --- a/docs/landing-page-design.md +++ b/docs/landing-page-design.md @@ -12,7 +12,7 @@ content: store / federation items the operator can act on. - **Architecture education**: "every module is sandboxed", "the audit log is hash-chained", "the hub fits in one - binary, no Docker". These are *what F∆I is* — they belong + binary, no Docker". These are *what Ch∆In is* — they belong on a Welcome page that introduces the platform on first launch and stays available afterwards as a reference. @@ -41,7 +41,7 @@ returning operators can come back any time. ├──────────────────────────────────────────────────────────┤ │ ┌────────────────────────────────────────────────────┐ │ │ │ HERO │ │ -│ │ F∆I Platform │ │ +│ │ Ch∆In Platform │ │ │ │ Deterministic workflow engine for AI-assisted │ │ │ │ document processing in regulated environments. │ │ │ └────────────────────────────────────────────────────┘ │ diff --git a/docs/today-pipeline.md b/docs/today-pipeline.md index 5f312e3..bef932e 100644 --- a/docs/today-pipeline.md +++ b/docs/today-pipeline.md @@ -108,7 +108,7 @@ The prompt template (`tools/today/prompt.template.md`) hard-encodes: ## Out of scope (Phase 0.5) - Multi-story rotation (one active story at a time). -- A/B-testing or click-through tracking — F∆I has no surveillance budget +- A/B-testing or click-through tracking — Ch∆In has no surveillance budget and no telemetry pipeline to feed it into. - Auto-publication to git (operator-curated boundary stays manual). - Hub-served stories. Studio reads `~/.fai/today/active.yaml` directly diff --git a/lib/data/error_presentation.dart b/lib/data/error_presentation.dart index 2e372c2..131f5e6 100644 --- a/lib/data/error_presentation.dart +++ b/lib/data/error_presentation.dart @@ -24,7 +24,7 @@ import 'fai_log.dart'; /// /// [source] is a short tag (`flows.run`, `audit.clear`, …) /// used to group entries in the on-disk log so an operator or -/// `fai doctor` can scan recent failures by area without +/// `chain doctor` can scan recent failures by area without /// reading the full free-text. Keep it stable; treat it like /// a metric label, not free-form text. /// diff --git a/lib/data/fai_log.dart b/lib/data/fai_log.dart index ba22b9f..e442e8f 100644 --- a/lib/data/fai_log.dart +++ b/lib/data/fai_log.dart @@ -1,12 +1,12 @@ // Central error log for Studio. Every error surfaced to the // operator (SnackBar, error sheet, recoverable dialog) is also -// appended here so `fai doctor` and "Open log" can show what +// appended here so `chain doctor` and "Open log" can show what // went wrong without the operator having to reproduce the // failure. // // Path: `~/.fai/logs/studio-errors.log` (cross-platform via // HOME / USERPROFILE). One line per event, JSON-shaped so -// `fai doctor` can parse it; humans can still read it because +// `chain doctor` can parse it; humans can still read it because // the JSON is single-line and short. // // Best-effort by design: a failed write to the log file must @@ -76,7 +76,7 @@ class FaiLog { return _append(entry); } - /// Read the last [maxLines] lines back. Used by `fai doctor` + /// Read the last [maxLines] lines back. Used by `chain doctor` /// + Settings → "Recent errors" view. Returns oldest first so /// the caller can render in chronological order. Future> tail({int maxLines = 50}) async { diff --git a/lib/data/system_actions.dart b/lib/data/system_actions.dart index 2884edd..200035e 100644 --- a/lib/data/system_actions.dart +++ b/lib/data/system_actions.dart @@ -11,7 +11,7 @@ // call for processes. // // The `fai` binary is resolved from PATH first; falls back to -// `~/.fai/bin/fai` (Unix) or `%USERPROFILE%\.fai\bin\fai.exe` +// `~/.fai/bin/chain` (Unix) or `%USERPROFILE%\.fai\bin\chain.exe` // (Windows). The PowerShell installer puts both in PATH but // some operators don't restart their shell after install — the // fallback covers that case. @@ -26,7 +26,7 @@ import 'package:shared_preferences/shared_preferences.dart'; /// and render a localized, actionable message instead. const String kFaiBinaryNotFound = 'fai-binary-not-found'; -/// Getting-started / install guide for the F∆I platform. Opened +/// Getting-started / install guide for the Ch∆In platform. Opened /// in the OS browser as the fallback affordance when no `fai` /// binary can be located on the machine. const String kFaiInstallDocsUrl = @@ -135,7 +135,7 @@ class SystemActions { return revealInOs(path); } - /// Run a `fai daemon ...` subcommand and surface the captured + /// Run a `chain daemon ...` subcommand and surface the captured /// output. Used by Doctor's "Restart daemon" button. static Future<({bool ok, String stdout, String stderr})> faiDaemon( List args, @@ -143,7 +143,7 @@ class SystemActions { return _runFai(['daemon', ...args]); } - /// Run `fai update apply --channel `. Long-running on a slow + /// Run `chain update apply --channel `. Long-running on a slow /// network — caller should show a spinner. static Future<({bool ok, String stdout, String stderr})> faiUpdateApply( String channel, @@ -177,7 +177,7 @@ class SystemActions { return _runFai(['daemon', 'disable', '--channel', channel]); } - /// Run `fai reset --yes`. Wipes operator state with the same + /// Run `chain reset --yes`. Wipes operator state with the same /// safety net as the CLI: stops every daemon (including off- /// channel orphans), atomically backs `~/.fai/` up, recreates /// it with `bin/`, `channels/`, `config.yaml`, `current-channel`, @@ -249,7 +249,7 @@ class SystemActions { if (home == null || home.isEmpty) return null; final fallback = isWindows ? '$home\\.fai\\bin\\fai.exe' - : '$home/.fai/bin/fai'; + : '$home/.fai/bin/chain'; return File(fallback).existsSync() ? fallback : null; } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 5b7dda8..7eac8d1 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -1,8 +1,8 @@ { "@@locale": "de", - "appTitle": "F∆I Studio", + "appTitle": "Ch∆In Studio", "navWelcome": "Willkommen", - "welcomeHeroTitle": "F∆I Platform", + "welcomeHeroTitle": "Ch∆In Platform", "welcomeHeroSubtitle": "Deterministische Workflow-Engine für KI-gestützte Dokumentenverarbeitung in regulierten Umgebungen.", "welcomePillarHubTitle": "Hub", "welcomePillarHubBody": "Ein Rust-Binary, das Module lädt und Flows ausführt. SQLite für den State. Kein Docker, kein Message-Broker, keine Hintergrunddienste, die gepflegt werden müssen.", @@ -60,7 +60,7 @@ "welcomeChecklistMcp": "Öffentliche Capability-Quelle hinzufügen", "welcomeChecklistMcpHint": "Im Store eine MCP-Quelle hinzufügen oder unter Einstellungen → MCP-Clients konfigurieren.", "welcomeChecklistModule": "Ein Text-Modul installieren", - "welcomeChecklistModuleHint": "Im Store ein Modul aus der Kategorie deiner Wahl installieren. Module sind sandboxed F∆I-Komponenten.", + "welcomeChecklistModuleHint": "Im Store ein Modul aus der Kategorie deiner Wahl installieren. Module sind sandboxed Ch∆In-Komponenten.", "welcomeChecklistFlow": "Einen gespeicherten Flow starten", "welcomeChecklistFlowHint": "Flows → einen wählen → Starten. Studio bringt einige Demo-Flows mit; auch ein eigener tut's.", "welcomeChecklistAllDone": "Alle vier Schritte erledigt.", @@ -320,7 +320,7 @@ }, "storeReloadTooltip": "Aktualisieren", "storeTodayBadge": "HEUTE", - "storeTodayDeck": "Von der F∆I-Redaktion", + "storeTodayDeck": "Von der Ch∆In-Redaktion", "storeTodayDismissTooltip": "Für diese Sitzung ausblenden", "storePillInstalled": "installiert", "storePillUpdate": "Update", @@ -607,7 +607,7 @@ "auditClearLogButton": "Log löschen", "modulesTitle": "Module", "modulesNoneTitle": "Noch keine Module", - "modulesNoneHint": "`fai install ` ausführen oder ~/.fai/modules/ prüfen.", + "modulesNoneHint": "`chain install ` ausführen oder ~/.fai/modules/ prüfen.", "modulesReloadTooltip": "Aktualisieren", "modulesRecentActivity": "LETZTE AKTIVITÄT", "modulesRecentActivityHint": "letzte {n} install/uninstall-Ereignisse aus dem Audit-Log", @@ -667,7 +667,7 @@ "flowsTitle": "Flows", "flowsReloadTooltip": "Aktualisieren", "flowsNoneTitle": "Keine gespeicherten Flows", - "flowsNoneHint": "Flow speichern mit `fai admin flows save `, dann taucht er hier auf.", + "flowsNoneHint": "Flow speichern mit `chain admin flows save `, dann taucht er hier auf.", "flowsRunDialogTitle": "{name} ausführen", "@flowsRunDialogTitle": { "placeholders": { @@ -849,7 +849,7 @@ "welcomeChecklistNextTodayBody": "tools/today/propose.sh per Cron laufen lassen und die Editorial-Karte im Store füllt sich mit operator-kuratierten Stories.", "welcomeChecklistNextTodayButton": "Today-Doku öffnen", "welcomeChecklistNextModuleTitle": "Eigenes Modul bauen", - "welcomeChecklistNextModuleBody": "Mit `fai new module ` ein Rust+WASM-Scaffold erzeugen. Das module-sdk übernimmt die WIT-Plumbing; du schreibst nur ein typisiertes invoke.", + "welcomeChecklistNextModuleBody": "Mit `chain new module ` ein Rust+WASM-Scaffold erzeugen. Das module-sdk übernimmt die WIT-Plumbing; du schreibst nur ein typisiertes invoke.", "welcomeChecklistNextModuleButton": "Doku lesen", "auditGroupToday": "HEUTE", "auditGroupYesterday": "GESTERN", @@ -954,7 +954,7 @@ "errInternal": "Unerwarteter interner Fehler.", "errInternalHint": "Hub-Logs unter `~/.fai/logs/` prüfen. Wenn das öfter passiert, bitte melden.", "errUnavailable": "Hub nicht erreichbar.", - "errUnavailableHint": "Sicherstellen, dass `fai serve` (oder `fai daemon start`) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.", + "errUnavailableHint": "Sicherstellen, dass `chain serve` (oder `chain daemon start`) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.", "errUnauthenticated": "Authentifizierung erforderlich.", "errUnauthenticatedHint": "`FAI_REGISTRY_TOKEN` setzen oder in den Einstellungen anmelden, dann erneut versuchen.", "errCopyDetail": "Detail kopieren", @@ -1173,7 +1173,7 @@ "doctorStatusUnknown": "Daemon-Status: …", "doctorPillRunning": "läuft", "doctorPillStopped": "gestoppt", - "doctorDaemonControlHint": "Studio ruft das Platform-Binary auf — entspricht `fai daemon …`, sodass CLI und UI im Gleichschritt bleiben.", + "doctorDaemonControlHint": "Studio ruft das Platform-Binary auf — entspricht `chain daemon …`, sodass CLI und UI im Gleichschritt bleiben.", "doctorDaemonControlWorking": "Wird ausgeführt…", "doctorPathLog": "Log", "doctorPathConfig": "Konfig", @@ -1181,7 +1181,7 @@ "doctorPathModules": "Module-Verzeichnis", "doctorPathFlows": "Flow-Verzeichnis", "doctorPathPid": "PID-Datei", - "doctorPathsEmpty": "Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `fai daemon restart`.", + "doctorPathsEmpty": "Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `chain daemon restart`.", "doctorOpenError": "Konnte nicht öffnen: {detail}", "@doctorOpenError": { "placeholders": { @@ -1198,7 +1198,7 @@ } } }, - "doctorUpdateBody": "Kanal {channel} bietet jetzt {version}. Per Button anwenden — Studio ruft `fai update apply --channel {channel}` auf.", + "doctorUpdateBody": "Kanal {channel} bietet jetzt {version}. Per Button anwenden — Studio ruft `chain update apply --channel {channel}` auf.", "@doctorUpdateBody": { "placeholders": { "channel": { @@ -1238,7 +1238,7 @@ "n8nHint": "Aktive n8n-Workflows erscheinen als `n8n..` Fähigkeiten. Einmal konfigurieren, im Store sichtbar.", "n8nEmpty": "Keine n8n-Endpunkte konfiguriert. + klicken zum Hinzufügen.", "hubUnreachable": "Hub nicht erreichbar", - "hubUnreachableHint": "Hub starten mit `fai serve`.", + "hubUnreachableHint": "Hub starten mit `chain serve`.", "languageEnglish": "English", "languageGerman": "Deutsch", "searchHint": "Springe überall hin — Module, Store, Flows, Seiten…", @@ -1511,8 +1511,8 @@ "addSourceField": "URL oder Pfad zum .fai-Bundle", "addSourceHint": "https://git.flemming.ai/deine-org/dein-modul/releases/download/v0.1.0/foo-0.1.0.fai", "addSourceHowItWorksTitle": "Wie private Module funktionieren", - "addSourceHowItWorksBody": "Ein Modul ist ein Verzeichnis mit module.yaml + WASM-Artefakt. Zum Teilen: `fai pack ` baut ein `.fai`-Bundle, das du beliebig hosten kannst (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nimm das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:", - "addSourceCliExample": "fai install --link /pfad/zum/modul", + "addSourceHowItWorksBody": "Ein Modul ist ein Verzeichnis mit module.yaml + WASM-Artefakt. Zum Teilen: `chain pack ` baut ein `.fai`-Bundle, das du beliebig hosten kannst (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nimm das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:", + "addSourceCliExample": "chain install --link /pfad/zum/modul", "addSourceInstallButton": "Installieren", "addSourceCancel": "Abbrechen", "installFailed": "Installation fehlgeschlagen: {error}", @@ -1540,7 +1540,7 @@ } }, "faiBinaryNotFound": "Das Programm `fai` wurde auf diesem Rechner nicht gefunden.", - "faiBinaryNotFoundHint": "Installiere die F∆I-Plattform oder verweise Studio auf eine vorhandene `fai`-Datei.", + "faiBinaryNotFoundHint": "Installiere die Ch∆In-Plattform oder verweise Studio auf eine vorhandene `fai`-Datei.", "faiBinaryLocateButton": "`fai`-Programm suchen …", "faiBinaryInstallDocsButton": "Installationsanleitung öffnen", "faiBinaryPickerTitle": "`fai`-Programm auswählen", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 0be3e46..058c1bd 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1,11 +1,11 @@ { "@@locale": "en", - "appTitle": "F∆I Studio", + "appTitle": "Ch∆In Studio", "@appTitle": { "description": "App-bar title in the OS task switcher." }, "navWelcome": "Welcome", - "welcomeHeroTitle": "F∆I Platform", + "welcomeHeroTitle": "Ch∆In Platform", "welcomeHeroSubtitle": "Deterministic workflow engine for AI-assisted document processing in regulated environments.", "welcomePillarHubTitle": "Hub", "welcomePillarHubBody": "One Rust binary that loads modules and runs flows. SQLite for state. No Docker, no message broker, no background services to babysit.", @@ -63,7 +63,7 @@ "welcomeChecklistMcp": "Add a public capability source", "welcomeChecklistMcpHint": "Add an MCP source from the Store, or configure one under Settings → MCP Clients.", "welcomeChecklistModule": "Install a text module", - "welcomeChecklistModuleHint": "Install a module from the Store — pick whichever category fits your work. Modules are sandboxed F∆I components.", + "welcomeChecklistModuleHint": "Install a module from the Store — pick whichever category fits your work. Modules are sandboxed Ch∆In components.", "welcomeChecklistFlow": "Run a saved flow", "welcomeChecklistFlowHint": "Flows → pick one → Run. Studio ships a few demo flows; one of your own works too.", "welcomeChecklistAllDone": "All four steps complete.", @@ -323,7 +323,7 @@ }, "storeReloadTooltip": "Reload", "storeTodayBadge": "TODAY", - "storeTodayDeck": "From the F∆I editor", + "storeTodayDeck": "From the Ch∆In editor", "storeTodayDismissTooltip": "Hide for this session", "storePillInstalled": "installed", "storePillUpdate": "update", @@ -610,7 +610,7 @@ "auditClearLogButton": "Clear log", "modulesTitle": "Modules", "modulesNoneTitle": "No modules yet", - "modulesNoneHint": "Run `fai install ` or check ~/.fai/modules/.", + "modulesNoneHint": "Run `chain install ` or check ~/.fai/modules/.", "modulesReloadTooltip": "Reload", "modulesRecentActivity": "RECENT ACTIVITY", "modulesRecentActivityHint": "last {n} install/uninstall events from the audit log", @@ -670,7 +670,7 @@ "flowsTitle": "Flows", "flowsReloadTooltip": "Reload", "flowsNoneTitle": "No saved flows", - "flowsNoneHint": "Save a flow with `fai admin flows save ` and it shows up here.", + "flowsNoneHint": "Save a flow with `chain admin flows save ` and it shows up here.", "flowsRunDialogTitle": "Run {name}", "@flowsRunDialogTitle": { "placeholders": { @@ -852,7 +852,7 @@ "welcomeChecklistNextTodayBody": "Run tools/today/propose.sh on a cron and the editorial card on the store auto-fills with operator-curated narratives.", "welcomeChecklistNextTodayButton": "Open Today docs", "welcomeChecklistNextModuleTitle": "Build your own module", - "welcomeChecklistNextModuleBody": "Generate a Rust+WASM scaffold with `fai new module `. The module-sdk handles the WIT plumbing; you write a typed invoke.", + "welcomeChecklistNextModuleBody": "Generate a Rust+WASM scaffold with `chain new module `. The module-sdk handles the WIT plumbing; you write a typed invoke.", "welcomeChecklistNextModuleButton": "Read the docs", "auditGroupToday": "TODAY", "auditGroupYesterday": "YESTERDAY", @@ -957,7 +957,7 @@ "errInternal": "Unexpected internal error.", "errInternalHint": "Check the hub logs at `~/.fai/logs/`. If this repeats, please report it.", "errUnavailable": "Hub not reachable.", - "errUnavailableHint": "Make sure `fai serve` (or `fai daemon start`) is running and the daemon endpoint matches Studio's settings.", + "errUnavailableHint": "Make sure `chain serve` (or `chain daemon start`) is running and the daemon endpoint matches Studio's settings.", "errUnauthenticated": "Authentication required.", "errUnauthenticatedHint": "Set `FAI_REGISTRY_TOKEN` or sign in through Settings before retrying.", "errCopyDetail": "Copy detail", @@ -1176,7 +1176,7 @@ "doctorStatusUnknown": "Daemon status: …", "doctorPillRunning": "running", "doctorPillStopped": "stopped", - "doctorDaemonControlHint": "Studio shells out to the platform binary — mirrors `fai daemon …` exactly so the CLI and UI stay in lockstep.", + "doctorDaemonControlHint": "Studio shells out to the platform binary — mirrors `chain daemon …` exactly so the CLI and UI stay in lockstep.", "doctorDaemonControlWorking": "Working…", "doctorPathLog": "Log", "doctorPathConfig": "Config", @@ -1184,7 +1184,7 @@ "doctorPathModules": "Modules dir", "doctorPathFlows": "Flows dir", "doctorPathPid": "PID file", - "doctorPathsEmpty": "Daemon did not report file paths. Update the running hub via `fai daemon restart`.", + "doctorPathsEmpty": "Daemon did not report file paths. Update the running hub via `chain daemon restart`.", "doctorOpenError": "Could not open: {detail}", "@doctorOpenError": { "placeholders": { @@ -1201,7 +1201,7 @@ } } }, - "doctorUpdateBody": "Channel {channel} now offers {version}. Apply via the button — Studio shells out to `fai update apply --channel {channel}`.", + "doctorUpdateBody": "Channel {channel} now offers {version}. Apply via the button — Studio shells out to `chain update apply --channel {channel}`.", "@doctorUpdateBody": { "placeholders": { "channel": { @@ -1241,7 +1241,7 @@ "n8nHint": "Active n8n workflows surface as `n8n..` capabilities. Configure once, see them in the Store.", "n8nEmpty": "No n8n endpoints configured. Click + to add one.", "hubUnreachable": "Hub unreachable", - "hubUnreachableHint": "Start the hub with `fai serve`.", + "hubUnreachableHint": "Start the hub with `chain serve`.", "languageEnglish": "English", "languageGerman": "Deutsch", "searchHint": "Jump anywhere — modules, store, flows, pages…", @@ -1514,8 +1514,8 @@ "addSourceField": "URL or path to .fai bundle", "addSourceHint": "https://git.flemming.ai/your-org/your-module/releases/download/v0.1.0/foo-0.1.0.fai", "addSourceHowItWorksTitle": "How private modules work", - "addSourceHowItWorksBody": "A module is a directory with a module.yaml + the WASM artifact. To share it: pack it (`fai pack `) and host the resulting `.fai` bundle anywhere (your own Forgejo / GitHub / S3). The hub installs by URL and verifies the signature against its trust store.\n\nDeveloping locally? Use the CLI — Studio cannot install from an unpacked directory (yet):", - "addSourceCliExample": "fai install --link /path/to/module", + "addSourceHowItWorksBody": "A module is a directory with a module.yaml + the WASM artifact. To share it: pack it (`chain pack `) and host the resulting `.fai` bundle anywhere (your own Forgejo / GitHub / S3). The hub installs by URL and verifies the signature against its trust store.\n\nDeveloping locally? Use the CLI — Studio cannot install from an unpacked directory (yet):", + "addSourceCliExample": "chain install --link /path/to/module", "addSourceInstallButton": "Install", "addSourceCancel": "Cancel", "installFailed": "Install failed: {error}", @@ -1543,7 +1543,7 @@ } }, "faiBinaryNotFound": "Could not find the `fai` program on this machine.", - "faiBinaryNotFoundHint": "Install the F∆I platform, or point Studio at an existing `fai` binary.", + "faiBinaryNotFoundHint": "Install the Ch∆In platform, or point Studio at an existing `fai` binary.", "faiBinaryLocateButton": "Locate `fai` binary…", "faiBinaryInstallDocsButton": "Open install guide", "faiBinaryPickerTitle": "Select the `fai` binary", diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 748b286..6ee6009 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -101,7 +101,7 @@ abstract class AppLocalizations { /// App-bar title in the OS task switcher. /// /// In en, this message translates to: - /// **'F∆I Studio'** + /// **'Ch∆In Studio'** String get appTitle; /// No description provided for @navWelcome. @@ -113,7 +113,7 @@ abstract class AppLocalizations { /// No description provided for @welcomeHeroTitle. /// /// In en, this message translates to: - /// **'F∆I Platform'** + /// **'Ch∆In Platform'** String get welcomeHeroTitle; /// No description provided for @welcomeHeroSubtitle. @@ -419,7 +419,7 @@ abstract class AppLocalizations { /// No description provided for @welcomeChecklistModuleHint. /// /// In en, this message translates to: - /// **'Install a module from the Store — pick whichever category fits your work. Modules are sandboxed F∆I components.'** + /// **'Install a module from the Store — pick whichever category fits your work. Modules are sandboxed Ch∆In components.'** String get welcomeChecklistModuleHint; /// No description provided for @welcomeChecklistFlow. @@ -1445,7 +1445,7 @@ abstract class AppLocalizations { /// No description provided for @storeTodayDeck. /// /// In en, this message translates to: - /// **'From the F∆I editor'** + /// **'From the Ch∆In editor'** String get storeTodayDeck; /// No description provided for @storeTodayDismissTooltip. @@ -1991,7 +1991,7 @@ abstract class AppLocalizations { /// No description provided for @modulesNoneHint. /// /// In en, this message translates to: - /// **'Run `fai install ` or check ~/.fai/modules/.'** + /// **'Run `chain install ` or check ~/.fai/modules/.'** String get modulesNoneHint; /// No description provided for @modulesReloadTooltip. @@ -2105,7 +2105,7 @@ abstract class AppLocalizations { /// No description provided for @flowsNoneHint. /// /// In en, this message translates to: - /// **'Save a flow with `fai admin flows save ` and it shows up here.'** + /// **'Save a flow with `chain admin flows save ` and it shows up here.'** String get flowsNoneHint; /// No description provided for @flowsRunDialogTitle. @@ -2615,7 +2615,7 @@ abstract class AppLocalizations { /// No description provided for @welcomeChecklistNextModuleBody. /// /// In en, this message translates to: - /// **'Generate a Rust+WASM scaffold with `fai new module `. The module-sdk handles the WIT plumbing; you write a typed invoke.'** + /// **'Generate a Rust+WASM scaffold with `chain new module `. The module-sdk handles the WIT plumbing; you write a typed invoke.'** String get welcomeChecklistNextModuleBody; /// No description provided for @welcomeChecklistNextModuleButton. @@ -2831,7 +2831,7 @@ abstract class AppLocalizations { /// No description provided for @errUnavailableHint. /// /// In en, this message translates to: - /// **'Make sure `fai serve` (or `fai daemon start`) is running and the daemon endpoint matches Studio\'s settings.'** + /// **'Make sure `chain serve` (or `chain daemon start`) is running and the daemon endpoint matches Studio\'s settings.'** String get errUnavailableHint; /// No description provided for @errUnauthenticated. @@ -3305,7 +3305,7 @@ abstract class AppLocalizations { /// No description provided for @doctorDaemonControlHint. /// /// In en, this message translates to: - /// **'Studio shells out to the platform binary — mirrors `fai daemon …` exactly so the CLI and UI stay in lockstep.'** + /// **'Studio shells out to the platform binary — mirrors `chain daemon …` exactly so the CLI and UI stay in lockstep.'** String get doctorDaemonControlHint; /// No description provided for @doctorDaemonControlWorking. @@ -3353,7 +3353,7 @@ abstract class AppLocalizations { /// No description provided for @doctorPathsEmpty. /// /// In en, this message translates to: - /// **'Daemon did not report file paths. Update the running hub via `fai daemon restart`.'** + /// **'Daemon did not report file paths. Update the running hub via `chain daemon restart`.'** String get doctorPathsEmpty; /// No description provided for @doctorOpenError. @@ -3371,7 +3371,7 @@ abstract class AppLocalizations { /// No description provided for @doctorUpdateBody. /// /// In en, this message translates to: - /// **'Channel {channel} now offers {version}. Apply via the button — Studio shells out to `fai update apply --channel {channel}`.'** + /// **'Channel {channel} now offers {version}. Apply via the button — Studio shells out to `chain update apply --channel {channel}`.'** String doctorUpdateBody(String channel, String version); /// No description provided for @doctorUpdateUnreachable. @@ -3467,7 +3467,7 @@ abstract class AppLocalizations { /// No description provided for @hubUnreachableHint. /// /// In en, this message translates to: - /// **'Start the hub with `fai serve`.'** + /// **'Start the hub with `chain serve`.'** String get hubUnreachableHint; /// No description provided for @languageEnglish. @@ -4253,13 +4253,13 @@ abstract class AppLocalizations { /// No description provided for @addSourceHowItWorksBody. /// /// In en, this message translates to: - /// **'A module is a directory with a module.yaml + the WASM artifact. To share it: pack it (`fai pack `) and host the resulting `.fai` bundle anywhere (your own Forgejo / GitHub / S3). The hub installs by URL and verifies the signature against its trust store.\n\nDeveloping locally? Use the CLI — Studio cannot install from an unpacked directory (yet):'** + /// **'A module is a directory with a module.yaml + the WASM artifact. To share it: pack it (`chain pack `) and host the resulting `.fai` bundle anywhere (your own Forgejo / GitHub / S3). The hub installs by URL and verifies the signature against its trust store.\n\nDeveloping locally? Use the CLI — Studio cannot install from an unpacked directory (yet):'** String get addSourceHowItWorksBody; /// No description provided for @addSourceCliExample. /// /// In en, this message translates to: - /// **'fai install --link /path/to/module'** + /// **'chain install --link /path/to/module'** String get addSourceCliExample; /// No description provided for @addSourceInstallButton. @@ -4337,7 +4337,7 @@ abstract class AppLocalizations { /// No description provided for @faiBinaryNotFoundHint. /// /// In en, this message translates to: - /// **'Install the F∆I platform, or point Studio at an existing `fai` binary.'** + /// **'Install the Ch∆In platform, or point Studio at an existing `fai` binary.'** String get faiBinaryNotFoundHint; /// No description provided for @faiBinaryLocateButton. diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 7a4d453..3d971f7 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -9,13 +9,13 @@ class AppLocalizationsDe extends AppLocalizations { AppLocalizationsDe([String locale = 'de']) : super(locale); @override - String get appTitle => 'F∆I Studio'; + String get appTitle => 'Ch∆In Studio'; @override String get navWelcome => 'Willkommen'; @override - String get welcomeHeroTitle => 'F∆I Platform'; + String get welcomeHeroTitle => 'Ch∆In Platform'; @override String get welcomeHeroSubtitle => @@ -196,7 +196,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get welcomeChecklistModuleHint => - 'Im Store ein Modul aus der Kategorie deiner Wahl installieren. Module sind sandboxed F∆I-Komponenten.'; + 'Im Store ein Modul aus der Kategorie deiner Wahl installieren. Module sind sandboxed Ch∆In-Komponenten.'; @override String get welcomeChecklistFlow => 'Einen gespeicherten Flow starten'; @@ -775,7 +775,7 @@ class AppLocalizationsDe extends AppLocalizations { String get storeTodayBadge => 'HEUTE'; @override - String get storeTodayDeck => 'Von der F∆I-Redaktion'; + String get storeTodayDeck => 'Von der Ch∆In-Redaktion'; @override String get storeTodayDismissTooltip => 'Für diese Sitzung ausblenden'; @@ -1125,7 +1125,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get modulesNoneHint => - '`fai install ` ausführen oder ~/.fai/modules/ prüfen.'; + '`chain install ` ausführen oder ~/.fai/modules/ prüfen.'; @override String get modulesReloadTooltip => 'Aktualisieren'; @@ -1193,7 +1193,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get flowsNoneHint => - 'Flow speichern mit `fai admin flows save `, dann taucht er hier auf.'; + 'Flow speichern mit `chain admin flows save `, dann taucht er hier auf.'; @override String flowsRunDialogTitle(String name) { @@ -1497,7 +1497,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get welcomeChecklistNextModuleBody => - 'Mit `fai new module ` ein Rust+WASM-Scaffold erzeugen. Das module-sdk übernimmt die WIT-Plumbing; du schreibst nur ein typisiertes invoke.'; + 'Mit `chain new module ` ein Rust+WASM-Scaffold erzeugen. Das module-sdk übernimmt die WIT-Plumbing; du schreibst nur ein typisiertes invoke.'; @override String get welcomeChecklistNextModuleButton => 'Doku lesen'; @@ -1635,7 +1635,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get errUnavailableHint => - 'Sicherstellen, dass `fai serve` (oder `fai daemon start`) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.'; + 'Sicherstellen, dass `chain serve` (oder `chain daemon start`) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.'; @override String get errUnauthenticated => 'Authentifizierung erforderlich.'; @@ -1918,7 +1918,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get doctorDaemonControlHint => - 'Studio ruft das Platform-Binary auf — entspricht `fai daemon …`, sodass CLI und UI im Gleichschritt bleiben.'; + 'Studio ruft das Platform-Binary auf — entspricht `chain daemon …`, sodass CLI und UI im Gleichschritt bleiben.'; @override String get doctorDaemonControlWorking => 'Wird ausgeführt…'; @@ -1943,7 +1943,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get doctorPathsEmpty => - 'Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `fai daemon restart`.'; + 'Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `chain daemon restart`.'; @override String doctorOpenError(String detail) { @@ -1957,7 +1957,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String doctorUpdateBody(String channel, String version) { - return 'Kanal $channel bietet jetzt $version. Per Button anwenden — Studio ruft `fai update apply --channel $channel` auf.'; + return 'Kanal $channel bietet jetzt $version. Per Button anwenden — Studio ruft `chain update apply --channel $channel` auf.'; } @override @@ -2015,7 +2015,7 @@ class AppLocalizationsDe extends AppLocalizations { String get hubUnreachable => 'Hub nicht erreichbar'; @override - String get hubUnreachableHint => 'Hub starten mit `fai serve`.'; + String get hubUnreachableHint => 'Hub starten mit `chain serve`.'; @override String get languageEnglish => 'English'; @@ -2487,10 +2487,10 @@ class AppLocalizationsDe extends AppLocalizations { @override String get addSourceHowItWorksBody => - 'Ein Modul ist ein Verzeichnis mit module.yaml + WASM-Artefakt. Zum Teilen: `fai pack ` baut ein `.fai`-Bundle, das du beliebig hosten kannst (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nimm das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:'; + 'Ein Modul ist ein Verzeichnis mit module.yaml + WASM-Artefakt. Zum Teilen: `chain pack ` baut ein `.fai`-Bundle, das du beliebig hosten kannst (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nimm das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:'; @override - String get addSourceCliExample => 'fai install --link /pfad/zum/modul'; + String get addSourceCliExample => 'chain install --link /pfad/zum/modul'; @override String get addSourceInstallButton => 'Installieren'; @@ -2540,7 +2540,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get faiBinaryNotFoundHint => - 'Installiere die F∆I-Plattform oder verweise Studio auf eine vorhandene `fai`-Datei.'; + 'Installiere die Ch∆In-Plattform oder verweise Studio auf eine vorhandene `fai`-Datei.'; @override String get faiBinaryLocateButton => '`fai`-Programm suchen …'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index f105d4b..7b9d408 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -9,13 +9,13 @@ class AppLocalizationsEn extends AppLocalizations { AppLocalizationsEn([String locale = 'en']) : super(locale); @override - String get appTitle => 'F∆I Studio'; + String get appTitle => 'Ch∆In Studio'; @override String get navWelcome => 'Welcome'; @override - String get welcomeHeroTitle => 'F∆I Platform'; + String get welcomeHeroTitle => 'Ch∆In Platform'; @override String get welcomeHeroSubtitle => @@ -195,7 +195,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get welcomeChecklistModuleHint => - 'Install a module from the Store — pick whichever category fits your work. Modules are sandboxed F∆I components.'; + 'Install a module from the Store — pick whichever category fits your work. Modules are sandboxed Ch∆In components.'; @override String get welcomeChecklistFlow => 'Run a saved flow'; @@ -793,7 +793,7 @@ class AppLocalizationsEn extends AppLocalizations { String get storeTodayBadge => 'TODAY'; @override - String get storeTodayDeck => 'From the F∆I editor'; + String get storeTodayDeck => 'From the Ch∆In editor'; @override String get storeTodayDismissTooltip => 'Hide for this session'; @@ -1140,7 +1140,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get modulesNoneHint => - 'Run `fai install ` or check ~/.fai/modules/.'; + 'Run `chain install ` or check ~/.fai/modules/.'; @override String get modulesReloadTooltip => 'Reload'; @@ -1208,7 +1208,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get flowsNoneHint => - 'Save a flow with `fai admin flows save ` and it shows up here.'; + 'Save a flow with `chain admin flows save ` and it shows up here.'; @override String flowsRunDialogTitle(String name) { @@ -1508,7 +1508,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get welcomeChecklistNextModuleBody => - 'Generate a Rust+WASM scaffold with `fai new module `. The module-sdk handles the WIT plumbing; you write a typed invoke.'; + 'Generate a Rust+WASM scaffold with `chain new module `. The module-sdk handles the WIT plumbing; you write a typed invoke.'; @override String get welcomeChecklistNextModuleButton => 'Read the docs'; @@ -1645,7 +1645,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get errUnavailableHint => - 'Make sure `fai serve` (or `fai daemon start`) is running and the daemon endpoint matches Studio\'s settings.'; + 'Make sure `chain serve` (or `chain daemon start`) is running and the daemon endpoint matches Studio\'s settings.'; @override String get errUnauthenticated => 'Authentication required.'; @@ -1927,7 +1927,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get doctorDaemonControlHint => - 'Studio shells out to the platform binary — mirrors `fai daemon …` exactly so the CLI and UI stay in lockstep.'; + 'Studio shells out to the platform binary — mirrors `chain daemon …` exactly so the CLI and UI stay in lockstep.'; @override String get doctorDaemonControlWorking => 'Working…'; @@ -1952,7 +1952,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get doctorPathsEmpty => - 'Daemon did not report file paths. Update the running hub via `fai daemon restart`.'; + 'Daemon did not report file paths. Update the running hub via `chain daemon restart`.'; @override String doctorOpenError(String detail) { @@ -1966,7 +1966,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String doctorUpdateBody(String channel, String version) { - return 'Channel $channel now offers $version. Apply via the button — Studio shells out to `fai update apply --channel $channel`.'; + return 'Channel $channel now offers $version. Apply via the button — Studio shells out to `chain update apply --channel $channel`.'; } @override @@ -2022,7 +2022,7 @@ class AppLocalizationsEn extends AppLocalizations { String get hubUnreachable => 'Hub unreachable'; @override - String get hubUnreachableHint => 'Start the hub with `fai serve`.'; + String get hubUnreachableHint => 'Start the hub with `chain serve`.'; @override String get languageEnglish => 'English'; @@ -2491,10 +2491,10 @@ class AppLocalizationsEn extends AppLocalizations { @override String get addSourceHowItWorksBody => - 'A module is a directory with a module.yaml + the WASM artifact. To share it: pack it (`fai pack `) and host the resulting `.fai` bundle anywhere (your own Forgejo / GitHub / S3). The hub installs by URL and verifies the signature against its trust store.\n\nDeveloping locally? Use the CLI — Studio cannot install from an unpacked directory (yet):'; + 'A module is a directory with a module.yaml + the WASM artifact. To share it: pack it (`chain pack `) and host the resulting `.fai` bundle anywhere (your own Forgejo / GitHub / S3). The hub installs by URL and verifies the signature against its trust store.\n\nDeveloping locally? Use the CLI — Studio cannot install from an unpacked directory (yet):'; @override - String get addSourceCliExample => 'fai install --link /path/to/module'; + String get addSourceCliExample => 'chain install --link /path/to/module'; @override String get addSourceInstallButton => 'Install'; @@ -2543,7 +2543,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get faiBinaryNotFoundHint => - 'Install the F∆I platform, or point Studio at an existing `fai` binary.'; + 'Install the Ch∆In platform, or point Studio at an existing `fai` binary.'; @override String get faiBinaryLocateButton => 'Locate `fai` binary…'; diff --git a/lib/main.dart b/lib/main.dart index 0d10ff7..021f3be 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,4 @@ -// F∆I Studio — desktop GUI for the F∆I hub. +// Ch∆In Studio — desktop GUI for the Ch∆In hub. // // Visual language: warm minimalism / deep tech with soul. // Tokens in lib/theme/, primitives in lib/widgets/. @@ -215,7 +215,7 @@ class StudioAppState extends State { builder: (context, snap) { final p = snap.data ?? (light: null, dark: null); return MaterialApp( - title: 'F∆I Studio', + title: 'Ch∆In Studio', debugShowCheckedModeBanner: false, theme: p.light ?? FaiTheme.light(), darkTheme: p.dark ?? FaiTheme.dark(), @@ -1072,7 +1072,7 @@ class _BrandLabel extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( - 'F∆I Studio', + 'Ch∆In Studio', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600), maxLines: 1, overflow: TextOverflow.ellipsis, diff --git a/lib/pages/audit.dart b/lib/pages/audit.dart index ebef8bf..b292932 100644 --- a/lib/pages/audit.dart +++ b/lib/pages/audit.dart @@ -526,7 +526,7 @@ class _EventDetailDialogState extends State<_EventDetailDialog> { String _buildPrompt(AuditEvent e, String mode) { // Privacy: redacted = no detail JSON, full = include it. final buf = StringBuffer() - ..writeln('A F∆I Platform audit event was logged. Explain what') + ..writeln('A Ch∆In Platform audit event was logged. Explain what') ..writeln('happened in plain language and suggest one concrete') ..writeln('fix the operator can apply now.') ..writeln() diff --git a/lib/pages/doctor.dart b/lib/pages/doctor.dart index 4b3fe0a..c42f7bd 100644 --- a/lib/pages/doctor.dart +++ b/lib/pages/doctor.dart @@ -481,7 +481,7 @@ class _PathRow extends StatelessWidget { /// Daemon control affordances: Restart, Apply update, Stop. /// Each shells out to the `fai` binary (resolved via PATH or -/// `~/.fai/bin/fai`). Studio is the GUI shell; the binary owns +/// `~/.fai/bin/chain`). Studio is the GUI shell; the binary owns /// the supervisor logic so the daemon and CLI stay in lockstep. class _DaemonActionsCard extends StatefulWidget { @override diff --git a/lib/pages/store.dart b/lib/pages/store.dart index 05a85ab..6b235ed 100644 --- a/lib/pages/store.dart +++ b/lib/pages/store.dart @@ -1405,7 +1405,7 @@ String _buildAiSearchPrompt( String locale, ) { final lang = locale == 'de' ? 'German' : 'English'; - return '''You are the F∆I Store assistant. The operator just asked, in $lang: + return '''You are the Ch∆In Store assistant. The operator just asked, in $lang: "$query" @@ -3009,9 +3009,9 @@ const List _kFallbackTodayStories = [ titleEn: 'Plug in any MCP server', titleDe: 'Jeden MCP-Server einbinden', bodyEn: - 'F∆I speaks the Model Context Protocol out of the box. Add a public server (DeepWiki, Semgrep) or a private one — its tools show up in this grid next to the built-in modules. Same install button, same audit trail.', + 'Ch∆In speaks the Model Context Protocol out of the box. Add a public server (DeepWiki, Semgrep) or a private one — its tools show up in this grid next to the built-in modules. Same install button, same audit trail.', bodyDe: - 'F∆I spricht das Model Context Protocol von Haus aus. Einen öffentlichen Server (DeepWiki, Semgrep) oder einen eigenen hinzufügen — seine Tools tauchen in diesem Grid neben den eingebauten Modulen auf. Gleicher Install-Button, gleiche Audit-Spur.', + 'Ch∆In spricht das Model Context Protocol von Haus aus. Einen öffentlichen Server (DeepWiki, Semgrep) oder einen eigenen hinzufügen — seine Tools tauchen in diesem Grid neben den eingebauten Modulen auf. Gleicher Install-Button, gleiche Audit-Spur.', ctaLabelEn: 'Browse suggested sources', ctaLabelDe: 'Empfohlene Quellen ansehen', icon: Icons.hub_outlined, @@ -3053,9 +3053,9 @@ const List _kFallbackTodayStories = [ titleEn: 'Extract, anonymise, translate, summarise', titleDe: 'Extrahieren, anonymisieren, übersetzen, zusammenfassen', bodyEn: - 'The text-processing bundle is F∆I\'s document-analysis backbone. PDF and DOCX in, plain text out. Then anonymise PII, translate, or summarise — every step audit-grade, every Ollama call recorded with model digest.', + 'The text-processing bundle is Ch∆In\'s document-analysis backbone. PDF and DOCX in, plain text out. Then anonymise PII, translate, or summarise — every step audit-grade, every Ollama call recorded with model digest.', bodyDe: - 'Das Text-Processing-Bündel ist F∆Is Dokumentenanalyse-Rückgrat. PDF und DOCX rein, Klartext raus. Dann PII anonymisieren, übersetzen oder zusammenfassen — jeder Schritt audit-tauglich, jeder Ollama-Aufruf mit Modell-Digest protokolliert.', + 'Das Text-Processing-Bündel ist Ch∆Ins Dokumentenanalyse-Rückgrat. PDF und DOCX rein, Klartext raus. Dann PII anonymisieren, übersetzen oder zusammenfassen — jeder Schritt audit-tauglich, jeder Ollama-Aufruf mit Modell-Digest protokolliert.', ctaLabelEn: 'Show text modules', ctaLabelDe: 'Text-Module zeigen', icon: Icons.article_outlined, @@ -3068,9 +3068,9 @@ const List _kFallbackTodayStories = [ titleEn: 'Every module declares its permissions', titleDe: 'Jedes Modul deklariert seine Berechtigungen', bodyEn: - 'F∆I modules are WASM components. They run in a sandbox with no ambient authority — every filesystem path, every network host, every env var has to be listed in module.yaml. The hub enforces them. No declaration, no access.', + 'Ch∆In modules are WASM components. They run in a sandbox with no ambient authority — every filesystem path, every network host, every env var has to be listed in module.yaml. The hub enforces them. No declaration, no access.', bodyDe: - 'F∆I-Module sind WASM-Komponenten. Sie laufen in einer Sandbox ohne Ambient-Authority — jeder Dateipfad, jeder Netzwerk-Host, jede Env-Var muss in module.yaml stehen. Der Hub setzt es durch. Keine Deklaration, kein Zugriff.', + 'Ch∆In-Module sind WASM-Komponenten. Sie laufen in einer Sandbox ohne Ambient-Authority — jeder Dateipfad, jeder Netzwerk-Host, jede Env-Var muss in module.yaml stehen. Der Hub setzt es durch. Keine Deklaration, kein Zugriff.', ctaLabelEn: 'Review permissions', ctaLabelDe: 'Berechtigungen prüfen', icon: Icons.shield_outlined, @@ -3093,12 +3093,12 @@ const List _kFallbackTodayStories = [ TodayStoryData( badgeEn: 'TEST FIRST', badgeDe: 'ZUERST TESTEN', - titleEn: 'fai doctor — diagnose before you ship', - titleDe: 'fai doctor — diagnostizieren bevor ausgerollt wird', + titleEn: 'chain doctor — diagnose before you ship', + titleDe: 'chain doctor — diagnostizieren bevor ausgerollt wird', bodyEn: - 'Before installing a module on a production hub, run `fai doctor` in the CLI. It validates manifest, signatures, declared permissions against the operator policy ceiling, and reports anything the hub would reject — no surprises at install time.', + 'Before installing a module on a production hub, run `chain doctor` in the CLI. It validates manifest, signatures, declared permissions against the operator policy ceiling, and reports anything the hub would reject — no surprises at install time.', bodyDe: - 'Bevor ein Modul auf einem Produktions-Hub installiert wird, in der CLI `fai doctor` laufen lassen. Validiert Manifest, Signaturen und deklarierte Berechtigungen gegen die Operator-Policy-Decke — keine Überraschungen beim Install.', + 'Bevor ein Modul auf einem Produktions-Hub installiert wird, in der CLI `chain doctor` laufen lassen. Validiert Manifest, Signaturen und deklarierte Berechtigungen gegen die Operator-Policy-Decke — keine Überraschungen beim Install.', ctaLabelEn: '', ctaLabelDe: '', icon: Icons.health_and_safety_outlined, diff --git a/lib/pages/welcome.dart b/lib/pages/welcome.dart index 235893c..ac51686 100644 --- a/lib/pages/welcome.dart +++ b/lib/pages/welcome.dart @@ -1,5 +1,5 @@ // Welcome — first surface a new operator sees, default sidebar -// destination on launch. Pure introduction: what F∆I is, the +// destination on launch. Pure introduction: what Ch∆In is, the // three concepts, the trust posture. No live data, no // federation chrome — that's the Store's role. // @@ -1140,7 +1140,7 @@ class _DocReaderError { 'Tried: ${attempted.join(", ")}\n' 'Underlying: $underlying\n' 'This typically means the Studio binary on disk is from\n' - 'before the doc bundle changed. Rebuild Studio (fai studio\n' + 'before the doc bundle changed. Rebuild Studio (chain studio\n' 'or the build pipeline) or open the Forgejo copy in browser.'; } diff --git a/lib/theme/tokens.dart b/lib/theme/tokens.dart index dbbc84b..b583607 100644 --- a/lib/theme/tokens.dart +++ b/lib/theme/tokens.dart @@ -1,11 +1,11 @@ -// Design tokens for F∆I Studio. +// Design tokens for Ch∆In Studio. // // One file, semantic names, no magic numbers in the rest of the // codebase. Both light and dark modes derive from these tokens. import 'package:flutter/material.dart'; -/// Colour palette. Single strong accent (F∆I Cyan) plus neutral +/// Colour palette. Single strong accent (Ch∆In Cyan) plus neutral /// greys. Status colours stay restrained — no candy palette. class FaiColors { FaiColors._(); diff --git a/lib/widgets/fai_card.dart b/lib/widgets/fai_card.dart index e6449c3..7eb6cc3 100644 --- a/lib/widgets/fai_card.dart +++ b/lib/widgets/fai_card.dart @@ -1,5 +1,5 @@ // FaiCard — flat card with subtle accent gradient on the top -// border. Replaces Material's default Card for the F∆I look. +// border. Replaces Material's default Card for the Ch∆In look. import 'package:flutter/material.dart'; diff --git a/lib/widgets/fai_delta_mark.dart b/lib/widgets/fai_delta_mark.dart index 49d19ee..025988c 100644 --- a/lib/widgets/fai_delta_mark.dart +++ b/lib/widgets/fai_delta_mark.dart @@ -1,4 +1,4 @@ -// FaiDeltaMark — the F∆I signature element. A precise triangle +// FaiDeltaMark — the Ch∆In signature element. A precise triangle // (∆) drawn from primitives, not a font glyph. Three states: // // - idle: static, accent colour, soft glow diff --git a/lib/widgets/fai_empty_state.dart b/lib/widgets/fai_empty_state.dart index cf393b9..979afd9 100644 --- a/lib/widgets/fai_empty_state.dart +++ b/lib/widgets/fai_empty_state.dart @@ -2,7 +2,7 @@ // Replaces "(no data)" strings with one tone, one icon, one tip. // // The blank surface is where an app most easily feels unfinished, -// so this state is deliberately *designed*: the F∆I delta (∆) +// so this state is deliberately *designed*: the Ch∆In delta (∆) // sits as a soft watermark behind the icon badge, the badge // carries a whisper of elevation, and the copy breathes. The // result reads "nothing here yet, on purpose" rather than @@ -48,7 +48,7 @@ class FaiEmptyState extends StatelessWidget { // Brand hero: an oversized, low-opacity ∆ watermark // anchors the composition while the contextual icon // badge sits crisply on top — so every empty surface - // still carries the F∆I signature, never a bare icon. + // still carries the Ch∆In signature, never a bare icon. SizedBox( width: 112, height: 112, diff --git a/lib/widgets/fai_settings_dialog.dart b/lib/widgets/fai_settings_dialog.dart index 8510e17..b067622 100644 --- a/lib/widgets/fai_settings_dialog.dart +++ b/lib/widgets/fai_settings_dialog.dart @@ -1013,7 +1013,7 @@ class McpClientDraft { /// MCP-clients panel — shows every configured server with its /// last-discovery health, plus Add / Remove / Refresh actions. /// Configure a server here, the store gains synthetic -/// capabilities for every advertised tool. Mirrors `fai mcp …` +/// capabilities for every advertised tool. Mirrors `chain mcp …` /// on the CLI. class _McpClientsPanel extends StatelessWidget { final List clients; @@ -1669,7 +1669,7 @@ class _ThemePluginPanel extends StatelessWidget { } /// Hub maintenance panel — currently one action: reset operator -/// state via `fai reset --yes`. Lives at the bottom of Settings +/// state via `chain reset --yes`. Lives at the bottom of Settings /// so the everyday config controls aren't crowded by a destructive /// button. The reset itself is gated by an interactive confirm /// dialog before the CLI is invoked. diff --git a/lib/widgets/fai_system_ai_editor.dart b/lib/widgets/fai_system_ai_editor.dart index 77c3589..54881f7 100644 --- a/lib/widgets/fai_system_ai_editor.dart +++ b/lib/widgets/fai_system_ai_editor.dart @@ -820,7 +820,7 @@ class _ModelPicker extends StatelessWidget { /// round-trip; works for Ollama tags (`gemma3:4b`), OpenAI names /// (`gpt-4o-mini`), Anthropic-style (`claude-haiku-4-5`). enum _Suitability { - recommended, // tested with F∆I System AI + recommended, // tested with Ch∆In System AI balanced, // 4-8B params or known-good cloud model small, // <4B params; quality may be insufficient large, // 9-15B; slower but ok diff --git a/lib/widgets/widgets.dart b/lib/widgets/widgets.dart index 6f294c0..adea76b 100644 --- a/lib/widgets/widgets.dart +++ b/lib/widgets/widgets.dart @@ -1,4 +1,4 @@ -// Barrel file for the F∆I Studio widget library. +// Barrel file for the Ch∆In Studio widget library. // // Pages should `import '../widgets/widgets.dart';` and use the // primitives directly — no Material `Card` / generic `Container` diff --git a/pubspec.yaml b/pubspec.yaml index 4a794ad..b941b3e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: fai_studio -description: "F∆I Studio — desktop GUI for the F∆I hub" +description: "Ch∆In Studio — desktop GUI for the Ch∆In hub" publish_to: 'none' version: 0.70.0 diff --git a/test/integration/README.md b/test/integration/README.md index bf45b96..edbed8b 100644 --- a/test/integration/README.md +++ b/test/integration/README.md @@ -1,6 +1,6 @@ # Integration tests -These tests spin up a real `fai serve` subprocess against a +These tests spin up a real `chain serve` subprocess against a fresh temp dir and exercise Studio's Hub-facing data layer against it. They cover the "kind of regression that survives unit tests because the system-shape only manifests across the @@ -48,15 +48,15 @@ cargo build --release --bin fai ### First-time-start gotcha -A cold `fai serve` spends its first ~30s building the +A cold `chain serve` spends its first ~30s building the curated-model database and initialising SQLite migrations. `HubFixture.start()` waits up to 60s by default; if your local -hub takes longer the first time, run `fai serve` once by hand +hub takes longer the first time, run `chain serve` once by hand against any temp `FAI_DATA_DIR` to warm the per-user cargo / SBOM caches: ```bash -FAI_DATA_DIR=/tmp/fai_warmup fai serve --bind 127.0.0.1:0 +FAI_DATA_DIR=/tmp/fai_warmup chain serve --bind 127.0.0.1:0 # wait for "hub started", Ctrl-C ``` diff --git a/tools/today/README.md b/tools/today/README.md index faa50fe..a25ac3e 100644 --- a/tools/today/README.md +++ b/tools/today/README.md @@ -62,7 +62,7 @@ or `generate`; the script auto-detects from the URL path. ## Trust model - Reads only `git log`, `git diff`, and the bundled `seed.yaml` of - installed F∆I monorepos. Never your audit log without explicit op-in. + installed Ch∆In monorepos. Never your audit log without explicit op-in. - Calls only the System-AI you've already configured for Studio. The same privacy mode you set there applies here. - Writes only into `~/.fai/today/`. Nothing in `~/.fai/data/` or diff --git a/tools/today/prompt.template.md b/tools/today/prompt.template.md index a1bab29..529ad74 100644 --- a/tools/today/prompt.template.md +++ b/tools/today/prompt.template.md @@ -1,11 +1,11 @@ -You are the Today-tab editor for the F∆I Platform Studio store. +You are the Today-tab editor for the Ch∆In Platform Studio store. Your job is to draft ONE editorial story per run that the platform's solo developer (Stefan Flemming) will review and either accept or discard. ## Project identity (do not deviate) -F∆I Platform is a deterministic workflow engine for AI-assisted +Ch∆In Platform is a deterministic workflow engine for AI-assisted document processing in regulated environments. It runs WASM modules inside YAML flows, with sandbox-secure capability discovery. @@ -68,7 +68,7 @@ cta_label_de: <≤5 words. Required when cta != none.> ## Signal input -Below is the "what happened in F∆I in the last 24 hours" summary — +Below is the "what happened in Ch∆In in the last 24 hours" summary — git log entries, store-index changes, audit-log highlights. Pick the ONE most operator-relevant thread and tell its story. If nothing notable happened, surface a longer-arc theme (recent week's progress,