{
"$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 users/{owner}/{project}/ directly.",
"The DSL: register <file_rel_path> | trigger.webhook --path /x | sekejap.query --params \"{{ [..] }}\" -- \"SQL\" | web.response --template pages/x.tsx; a draft serves nothing until activated.",
"Webhook data is under input.body; input.params, input.query, input.files, input.auth sit beside it; $trigger has no body.",
"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"
]
}