rejot-dev/fragno/generating-backoffice-uis
Claude Code and agent skill by rejot-dev/fragno
- community
Checking that the SKILL.md file is still in the repository.
Generate Backoffice interfaces for presenting grounded data or collecting durable workflow input.
Install
npx vskill@latest install rejot-dev/fragno/generating-backoffice-uisSKILL.md
Generating Backoffice UIs
Steps
- Ground. Resolve the source data used by the interface. Use input, retrieved data, or
persisted output already available to the current return path. Complete when every displayed operational value, record, status, and identifier traces to one of those sources.
- Compose. Read
/static/codemode/ui.d.tsand the components in
/static/codemode/ui-catalog.d.ts, then build one element tree with the codemode ui builder, passing grounded values directly as props. Complete when every component call and prop matches its declaration and documented limits.
- Return. Return one result object with
$ui: ui.render(root)beside any ordinary fields
needed by the user or later code. Complete when the tool result reports no generated UI error, later code consumes ordinary fields, and follow-up prose does not restate rendered fields.
Branches
- When returning
$uifromstep.door as workflow output, read
/static/skills/workflows/SKILL.md before authoring the workflow, then apply Durable results.
- When the interface collects input, apply Collecting workflow input.
- When the interface contains
ui.fileUpload, set itsscopeto{ kind: "current" }unless the
file belongs to another declared scope, and start its field at null. Uploading writes the file into that scope's workspace; the submitted field holds its scope, /workspace path, filename, sizeBytes, and contentType. Read the file from path with the state tools of that scope, and remove it with state.rm when the workflow rejects it.
- When a tool result or step error reports an invalid generated UI, fix the element its id names.
Ids are tree positions: root.1.0 is the first child of the root's second child.
Results
Ordinary sibling fields remain part of the result. Preserve retrieved records, identifiers, and calculated summaries there when they remain useful to the user or later code; $ui.state is presentation state, not a dataflow API. A rendered interface stays within 128 elements, 32 children per element, and 24 levels of depth.
Durable results
- A
step.docallback returns the same result shape as an immediate call. The complete result is
persisted, and its $ui renders inline in the completed step. A step that returns an invalid $ui fails without retrying.
- Later steps consume the resolved step result's ordinary fields.
- Returning the same result from the workflow function renders it as the final output. When the
return directly delegates to that UI step, the Backoffice keeps the UI on the step instead of rendering a duplicate final-output card.
- Final workflow output is terminal and cannot collect workflow input.
Collecting workflow input
- Declare
const form = ui.form(eventType, initial)in the workflow body.initialnames every
field with its starting value.
- Return the interface from a completed
step.do. Bind each control's value prop with
form.bind(field) and add one form.submit({ label }), which sends every field as the payload.
- Await
step.waitForEvent(name, { type: form.eventType })after the UI step. The Backoffice
supplies the workflow name and instance id to the renderer.
Complete when every requested field is bound to the form and the workflow consumes the submitted payload from waitForEvent.
Presentation boundaries
Render content through component props as plain text. Raw HTML, scripts, iframes, embeds, arbitrary URLs, class names, styles, and presentation colors are invalid. Let the rendered interface carry the primary presentation rather than repeating it in Markdown.
An inline workflow shows in the conversation as one card holding its status, every interface its steps return, and its final output. A run of a saved workflow shows the same card once you call workflow.showInstance({ instanceId }). Do not narrate the card: skip instructions for filling in its form, which go stale once the reader submits it, and do not repeat its output when the instance.completed event arrives. Reply to that event only with what the card does not show.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingapps/backoffice/content/static/skills/generating-backoffice-uis/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/rejot-dev/fragno/generating-backoffice-uis)