zebflow 0.11.7

Reactive web automation platform — pipelines, templates, and real-time collaboration in a single binary.
Documentation
{
  "$schema": "https://context7.com/schema/context7.json",
  "projectTitle": "Zebflow",
  "description": "Zebflow: pipelines, server-rendered TSX pages on the RWE engine, the zeb/ui component set, Sekejap, the Hub — built by agents over MCP. The help tree under src/platform/help is the canonical 'how to use Zebflow'; blessed/skills are the procedures agents follow.",
  "folders": [
    "src/platform/help",
    "blessed/skills",
    "blessed/skill-extras",
    "docs/usage",
    "docs/contracts"
  ],
  "excludeFolders": [
    ".ignored",
    "target",
    "node_modules",
    "tests"
  ],
  "rules": [
    "Change a Zebflow project only through its MCP tools or HTTP API; never write into the project's storage directly.",
    "The DSL: `register api/posts | trigger.webhook --route /posts/:slug --method GET | sekejap.query.run --param \"1={{ $trigger.params.slug }}\" -- \"SELECT * FROM posts WHERE slug = $1\" | web.response.send --template pages/post.tsx`; a draft serves nothing until activated.",
    "A node is written as its kind, family.noun.verb (fs.file.put, postgres.query.run, javascript.script.run, telegram.message.send); entry nodes are trigger.<source>, run inputs input.<type>, control logic.<verb>, installed nodes x.<package>.<noun>.<verb>. There is no prefix and no alias.",
    "Every node adds one key to the payload, its noun, and keeps the rest: input.webhook.body after trigger.webhook, input.query.rows after a query, input.file after fs.file.put, input.script after a script, input.token.access_token after auth.token.create. $trigger is the trigger's envelope for the whole run ($trigger.body, $trigger.params, $trigger.query, $trigger.auth); $nodes.<id>.<key> is any earlier answer.",
    "Flags: --from names the subject; other inputs are typed roles (--text, --file, --image, --body, --value, --argument); maps are repeated key=value (--param 1=..., --header \"Location=/home\"); switches are bare (--write to change data); units travel in values (--timeout 30s, --max-size 10MB); choices are closed words. Headers are sent exactly as written, Set-Cookie included.",
    "A node's flags, answer and examples are generated from its definition: help(\"pipeline/nodes/<kind>\"); the index of every kind is help(\"pipeline/nodes\"). Never guess a flag.",
    "Every TSX file imports what it uses from \"zeb/react\", \"zeb/ui/<name>\" or \"@/…\"; colours are theme roles (bg-primary, text-muted-foreground), never palette classes.",
    "A 200 response can carry '<!-- RWE component error -->'; read the body and open the page before claiming it works.",
    "Pipeline DSL has two modes: pipe (| chains) for a linear flow and graph ([id] nodes + [a] -> [b] edges, :pin for branches) — every node must be reachable from the one entry.",
    "{{ expr }} in a flag value is resolved before the node runs; scope is input/$input, $trigger, $nodes.<id>, and $item/$index/$count inside foreach; a whole-value expression keeps its JSON type.",
    "Credentials are created by the owner in Studio; pipelines reference them by id (credential_list) and never read or write their values."
  ],
  "excludeFiles": [
    "SECURITY-AUDIT-REPORT*.md"
  ]
}