Flows YAML — Monaco editor with autocomplete, validation, dry-run, run trace #1077
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/claude-hooks#1077
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
User story
As an operator, I want a polished in-browser YAML editor with list view, CRUD, IntelliSense-grade autocomplete, multi-layer validation, side-panel diagnostics + docs, dry-run, and historical run replay overlay, so that authoring and debugging flows feels as good as editing CI YAML in VS Code.
Replaces the React Flow canvas (NF-UI-1..7).
Acceptance criteria
Routes (
apps/web/src/routes/)flows/index.tsx— searchable table: name, source badge (default/custom), trigger summary, enabled pill, last-run pill, mtime. Row actions: edit, dry-run, disable, delete (custom only).flows/new.tsx— name input + starter template picker (blank, pr-opened, issue-labeled, …); loads template YAML on submit.flows/$name.tsx— split-pane: Monaco editor left, side-panel right.flows/$name?run=<id>— same view, editor read-only with replay overlay.Editor stack
monaco-editor+monaco-yamllazy-loaded as a route-level chunk.design/tokens.json)./schemas/flows.schema.jsononce on mount.Save bar
PUT /flows/:namewithexpected_mtime; 409 → diff prompt with current server contents.Autocomplete provider
name,on,if,priority,concurrency,steps,env.on:value list: trigger kinds;on.<kind>array list: subtypes filtered by kind.steps[].uses:— registered op names from schema discriminator.steps[].with:— required + optional args for the chosenuses:, with type hints + Zod.describe()text.${{ }}andif::event.*,steps.<id>.outputs.<key>,env.*, built-in functions, operators.Custom diagnostics provider
step.idwithin a flow.${{ steps.X.outputs.Y }}references unknown step or output key (usesoutputsSchema).if:expression fails to parse (mini-AST round-trip).uses:not in registered ops list.concurrency.grouptemplate references unknown variable.Side panel tabs
.describe(): per op, per trigger, per built-in; searchable.POST /flows/:name/dry-run. Output panel: per-step status, duration, resolved args, output. Sample-event templates seeded for each trigger.GET /flows/runs?flow=:namepaginated list with status pill, duration, trigger summary, link to overlay.Replay overlay (
?run=<id>)GET /flows/runs/:id.Server defence in depth
POST /flows/:name?validate=1(server returns 422 with same diagnostics shape if invalid).Tests (Vitest browser mode)
POST /flows.PUT /flows/:nameand updates dirty state; mtime conflict surfaces merge dialog.Out of scope
References
docs/specs/flows-yaml.md§10.3 (all subsections).