feat: initial scaffold — swappable flow editor

Extracted from fai/studio's lib/pages/flow_editor.dart so the
editor can be swapped out independently of the host.

Public surface kept minimal — a single FlowEditorPage widget
with three named parameters (initialFlowName, locale, onRun).
The package brings its own design tokens, empty/error
widgets, l10n table; no host-internal types leak through.

Studio depends on this repo via pubspec.yaml git reference.
Forks point Studio at a different URL and rebuild.

See README.md for the swap recipe.

Signed-off-by: F∆I Platform <platform@flemming.ai>
This commit is contained in:
F∆I Platform 2026-05-30 14:33:03 +02:00
commit 51f9a1d2b1
8 changed files with 1128 additions and 0 deletions

90
README.md Normal file
View file

@ -0,0 +1,90 @@
# fai_studio_flow_editor
Swappable inline YAML editor for F∆I Studio flows.
## Public surface
```dart
import 'package:fai_studio_flow_editor/fai_studio_flow_editor.dart';
// Studio embeds the page as one of its destinations:
FlowEditorPage(
initialFlowName: 'hello', // optional
locale: FlowEditorLocale.de, // or .en
onRun: (name) => // optional callback
HubService.instance.runSavedFlow(name: name),
)
```
- **`initialFlowName`** — when set, the page loads that flow
from `~/.fai/data/flows/<name>.yaml` on first build. Used
by Studio's Flows-page pencil → editor route push.
- **`locale`** — picks EN or DE for the editor's internal
string table. Studio passes its active locale through.
- **`onRun`** — async callback that runs the named flow
against the host hub and returns the typed outputs map.
When null, the Run button is disabled (e.g. when the
editor is embedded in a context without hub access).
## Behaviour
- File browser (left, 240 px) lists `*.yaml` in
`~/.fai/data/flows/`.
- Code field (right) ships YAML syntax highlighting via
`flutter_code_editor` + the highlight package's yaml
grammar.
- Save writes directly to disk via `dart:io`; the hub picks
up the change on its next `ListFlows` / `RunSavedFlow`
call.
- Cmd+S / Ctrl+S — save. Cmd+Enter / Ctrl+Enter — run.
## Swap it
Studio depends on this package via `pubspec.yaml` git
reference:
```yaml
dependencies:
fai_studio_flow_editor:
git:
url: https://git.flemming.ai/fai/studio-flow-editor
ref: main
```
To use a different editor:
1. Fork this repo (or write your own from scratch).
2. Keep the `FlowEditorPage` constructor signature
(`initialFlowName`, `locale`, `onRun`) — that's the
stable host contract.
3. Point Studio's pubspec at your fork (or local-path
during development):
```yaml
fai_studio_flow_editor:
git:
url: https://your-host/your/flow-editor
ref: main
```
4. Rebuild Studio. Done.
The contract is intentionally minimal: a single page widget
with three parameters. The package brings its own tokens,
its own empty/error widgets, its own l10n table, so the
host doesn't have to share internals. The trade-off is
visual drift if Studio's design tokens change — that's the
deal you accept for a swappable module.
## Develop
```bash
flutter pub get
flutter analyze
flutter test
```
The package's own widget tests live in `test/`. End-to-end
tests against a live hub stay in the host repo (Studio).
## License
Apache-2.0. Same as the rest of the F∆I platform.