Agent skill

Workflow Generate

by ForestHubAI in ForestHubAI/edge-agents

Generate a validated Edge Agents workflow JSON (.workflow.json) from a natural-language description — the node-graph that runs on Edge Agents edge/IoT agents, built from triggers (timer, startup…

AGPL-3.0Auto-check passed

Install Workflow Generate

skills CLI
$ npx skills add ForestHubAI/edge-agents --skill workflow-generate -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ForestHubAI/edge-agents workflow-generate --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ForestHubAI/edge-agents.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/workflow-generate .claude/skills/workflow-generate && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
workflow-generate
GitHub stars
105
Token cost
~3.2k tokens
SKILL.md length
1,694 words
Files
7
Skills in repo
1
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Generate a validated Edge Agents workflow JSON (.workflow.json) from a natural-language description — the node-graph that runs on Edge Agents edge/IoT agents, built from triggers (timer, startup…

  • Works in 5 steps: Understand the request — ask only about… → Load the shapes and the idioms → Generate the workflow → …
  • GPIO/serial/MQTT I/O
  • SKILL.md covers When to use, How to run it and Notes for Claude
  • Calls node and npm

What it does

Workflow Generate is an agent skill from ForestHubAI/edge-agents. Generate a validated Edge Agents workflow JSON (.workflow.json) from a natural-language description — the node-graph that runs on Edge Agents edge/IoT agents, built from triggers (timer, startup, pin edge, threshold, MQTT, serial), GPIO/serial/MQTT I/O, LLM Agent nodes, and actuators. Builds the graph to match the workflow contract and drives it to zero errors through the fh-workflow CLI's structural + semantic validators. Use this whenever the user describes automation or agent behavior in prose and wants a…

Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files (for example `examples/counter-agent.workflow.json`, `examples/gpio-pin.workflow.json` and `reference/functions.md`).

It works with React, Go and Linux. The repository describes itself as: The 30 MB open-source edge AI agent runtime. Run AI agents offline on Linux (Raspberry Pi, Jetson). GPIO, UART, MQTT as first-class nodes. Industrial protocols (OPC-UA, Modbus)… The licence is AGPL-3.0.

When your agent uses it

  • GPIO/serial/MQTT I/O
  • LLM Agent nodes
  • Describes automation
  • Agent behavior in prose and wants a ready-to-run workflow file — e.g

Example prompts

  • “build a flow that reads a sensor every 10s and toggles a relay”
  • “make an Edge Agents agent that summarizes incoming MQTT messages”
  • “wire up a workflow where…”
  • “/workflow-generate”

Requirements

  • Node.js
  • Docker

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Understand the request — ask only about pivotal unknowns
  2. Load the shapes and the idioms
  3. Generate the workflow
  4. Validate — mandatory two-gate pipeline, in this order
  5. Report

What it can do on your machine

Read from SKILL.md and the folder at commit dad48b7. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • node
    • npm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Workflow Generate loads about 3.2k tokens when it runs. Until then it costs about 234 tokens; SKILL.md has 1,694 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~234
When it runs · the whole SKILL.md, loaded when a task matches
~3.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from ForestHubAI/edge-agents at commit dad48b7, republished under its AGPL-3.0 licence (© ForestHubAI). 1,694 words, ~3,203 tokens.

Download SKILL.mdSave it as .claude/skills/workflow-generate/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.
name
workflow-generate
description
Generate a validated Edge Agents workflow JSON (*.workflow.json) from a natural-language description — the node-graph that runs on Edge Agents edge/IoT agents, built from triggers (timer, startup, pin edge, threshold, MQTT, serial), GPIO/serial/MQTT I/O, LLM Agent nodes, and actuators. Builds the graph to match the workflow contract and drives it to zero errors through the fh-workflow CLI's structural + semantic validators. Use this whenever the user describes automation or agent behavior in prose and wants a ready-to-run workflow file — e.g. "build a flow that reads a sensor every 10s and toggles a relay", "make an Edge Agents agent that summarizes incoming MQTT messages", "wire up a workflow where…" — even when they never say the words "workflow JSON". Not for visually editing an existing workflow (that is fh-workflow open) or merely checking one you already have (fh-workflow check-schema / validate).

workflow-generate

Turn a plain-language description into a *.workflow.json that conforms to the contract and passes the CLI validators.

There is no constrained decoding here — a skill is a prompt, not a schema-locked decoder. Correctness comes from a generate → validate → fix loop, not from a perfect first draft. The contract gives you the shapes; the two CLI gates give you ground truth. Get close, then let the validators drive you to exit 0.

When to use

The user describes a workflow in prose and wants a usable *.workflow.json.

Do NOT use this skill for:

  • Editing an existing workflow visually — that's fh-workflow open
  • Only checking an existing file — run fh-workflow check-schema / validate directly

How to run it

All validation runs through the fh-workflow CLI (the published @foresthubai/workflow-cli package), invoked by its bare binary name — never through any in-repo node …/fh-workflow.mjs path. The CLI carries its own bundled copy of the contract, so it works from any directory and needs no edge-agents checkout.

Before anything else, confirm the CLI is installed:

bash
command -v fh-workflow

If that prints nothing, stop and tell the user to install it once with npm i -g @foresthubai/workflow-cli, then continue. Do not fall back to a repo-local node path — the whole point is that this skill runs anywhere the CLI is on PATH.

Step 1: Understand the request — ask only about pivotal unknowns

A *.workflow.json is a cheap, throwaway text file — nothing is deployed, and regenerating costs seconds. So the default posture is assume sensible defaults and build, not interrogate. The fix for "don't decide things silently" is not an interview up front; it's making the consequential assumptions visible in the report (Step 5). Sort every unknown into one of three tiers:

  1. Mechanical — no behavioral effect, or exactly one sensible value: canvas positions, internal channel/edge ids, output variable names, node ids. Fill silently with a default; never ask, don't even surface it.
  2. Consequential but defaultable — affects runtime behavior, result, cost, or correctness, but has a reasonable default: LLM model, numeric data type (int vs float), intervals/thresholds, debounce, QoS/retain, signal type when a default is safe. Pick a sensible default and build — do NOT block on it. These get listed in the Step 5 report so the user can change them. Most parameters live here; asking about each would be the interrogation we avoid.
  3. Pivotal — no safe default, or the choice cascades through the structure (an ambiguous trigger; digital vs analog when it changes the wiring; whether an Agent is even needed). Only these are worth AskUserQuestion, and only when the description leaves them open.

So: if the description determines the workflow, skip the interview entirely and go to Step 2. When tier-3 unknowns remain, ask them — bundled into one AskUserQuestion call (it takes up to 4 questions), each with the sensible default as the first option, marked "(recommended)", so one click accepts it. Never fire several questions one after another.

Typical pivotal points: the trigger (Ticker/OnStartup/OnPinEdge/Alarm/ OnThreshold/MQTT/serial), whether hardware (pins/serial/MQTT) is involved at all, and whether an Agent/LLM node is needed.

Step 2: Load the shapes and the idioms
  • Read reference/workflow.yaml next to this file — a snapshot of the contract, the source of truth for every field shape. (The CLI carries its own copy for validation; this bundled snapshot is your authoring reference. If the two ever disagree, the CLI gates win.) Look up the specific *Node schemas you need (each lists its required arguments) plus Edge, Expression, OutputBinding, OutputDeclaration, Variable, and the Channel variants. A few schemas are cross-referenced from reference/llmproxy.yaml (e.g. ModelCapability) — follow llmproxy.yaml#/... refs into that sibling snapshot.

  • Read the reference fixtures in examples/ next to this file — they are known-good, fully validated workflows that show the idioms by example:

    • counter-agent.workflow.json — Ticker → SetVariable → Agent: an agentTask edge with a prompt, an OutputDeclaration in assign mode, an Expression referencing a declared variable, a declaredVariables entry.
    • gpio-pin.workflow.json — Ticker → ReadPin → WritePin: GPIOIN/GPIOOUT channels referenced by id, an OutputBinding in emit mode, and a downstream expression that references a node's emitted output (see Notes — by output id, not the emit name), digital pins.

    Do not rely on any example files outside this skill folder — only these fixtures are guaranteed to exist and stay valid.

  • For the semantic rules the contract shape can't express — which fields are truly required, why a schema-optional argument can still be mandatory — read reference/parameters.md next to this file (§1 presence table, §3 optional vs activationRules). Reach for it on demand, e.g. when validate reports a missing-required-param. Two semantic facts worth knowing up front: validation runs on the deserialized domain, not the raw JSON, so a file can pass check-schema and still fail validate; and a workflow on an older schemaVersion can be migrated with fh-workflow update <file>.

  • Only when the workflow defines or calls a reusable function — i.e. a FunctionCall node and a non-empty top-level functions array — read reference/functions.md next to this file (the functions analog of parameters.md). It covers the semantics the contract shape can't show: a function is a declaration (the signature — name, arguments, returns) plus a body (its own canvas of nodes/edges); on the wire a Function is { functionInfo, outputAssignments, body }; a FunctionCall references its target by functionId and carries the same flat uid-keyed arguments bag every node uses (Expression for inputs, OutputBinding for returns); return values are expressions on the declaration — there is no return node, and a return with no assignment is a hard error. The default sensor→agent→actuator workflows use none of this — skip it entirely unless a reusable function is genuinely in play.

Step 3: Generate the workflow

Where to write it. Use the path the user gave. If they named only a folder, write <name>.workflow.json inside it; if they gave a full path, use it verbatim. If they gave nothing, default to the current working directory as <name>.workflow.json. Always end the filename in .workflow.json — that suffix is the convention the tooling keys off.

Checklist for a clean first draft:

  • All six required top-level fields present (schemaVersion, nodes, edges, functions, declaredVariables, channels); empty arrays are fine.
  • Every node has id, type, position; the type discriminator matches a contract node exactly; required arguments per that node's schema are set.
  • The graph starts at a trigger and every node is reachable from it via ctrl-port edges (see Notes — connectivity is validated).
  • Declare any hardware/MQTT channels and reference them by id from the nodes that use them.
  • Expressions list every variable they use in references.
Show full SKILL.md (632 more words)Show less
Step 4: Validate — mandatory two-gate pipeline, in this order

The gates run in a fixed order, and the order is not optional: the structural schema check must be green before the semantic validator is run at all.

Gate 1 — structural (check-schema). Loop here until it passes.

bash
fh-workflow check-schema <path>

It catches shape errors (wrong type, missing required field, bad enum) with a JSON-pointer path like /nodes/0/arguments. On any non-zero exit: read the diagnostics, fix the file, and run check-schema again. Keep editing the workflow until check-schema exits 0. Do not run validate while the schema check is still failing — a malformed shape must never reach Gate 2.

Gate 2 — semantic (validate). Only once Gate 1 is green.

bash
fh-workflow validate <path>

It catches semantics: missing required parameters, unconnected nodes, type mismatches, dangling references — reported as ✗ [category] message (node …, param …). On any non-zero exit: read the diagnostics, fix the file, and go back to Gate 1 (a semantic fix can change the shape, so re-check the schema first, then validate again). Repeat until validate exits 0.

Cap at ~5 iterations. If errors remain after that, report the outstanding diagnostics honestly instead of claiming success. Never finish with either gate red.

Step 5: Report

Give the path to the validated file plus a short summary (trigger, nodes, data flow).

Then list the consequential assumptions you made — every tier-2 choice from Step 1 you defaulted rather than asked about (LLM model, numeric data types, intervals/thresholds, debounce, QoS, signal types, …), each with the value you picked. Keep mechanical defaults (positions, ids, variable names) out of this list. Close by asking whether any of these values should be changed — plainly, e.g. "Should any of these be adjusted?" — so nothing was decided silently and the user can correct it in one reply.

Finally, point at the natural next steps without doing either automatically:

  • fh-workflow open <path> — inspect and edit the workflow visually.
  • fh-workflow deploy <path> — turn the file into a runnable docker-compose bundle for an edge controller. The command interviews the operator for the concrete values the workflow needs (pins, MQTT brokers, models, keys); the workflow-deploy skill drives that wizard end to end.

Offer both and stop — do not start the deploy yourself. Only proceed when the user opts in, and then go through the workflow-deploy skill rather than calling fh-workflow deploy ad hoc.

Notes for Claude

  • Both gates are mandatory, and check-schema always comes first. Never run validate while the schema check is still red; never finish with either gate red. A workflow that wasn't taken through both gates to exit 0 is not done.
  • The contract is the source of truth. When in doubt about a field, read reference/workflow.yaml (next to this file) — do not trust memory of the schema.
  • Rules the contract can't tell you (the semantic validator enforces them — trust its diagnostics over any assumption):
    • The control port is "ctrl" on both ends of control / agentTask edges.
    • A node only runs if it is reachable from a trigger via ctrl edges; otherwise validate flags "will never run".
    • Some arguments the schema marks optional are semantically required (e.g. a pin node's channel reference, an Agent's model); parameters.md explains which and why. If validate says "missing required parameter", add it even though check-schema passed.
    • To reference a node's emitted output in an expression, use the node's output id (often "output") as the reference varId, not the emit name — the name is only a display alias. The wrong key surfaces as a stale reference in validate. See gpio-pin.workflow.json.
  • Never invent port names or channel ids — wire to ids you actually declared.
  • Deploy only on explicit user opt-in. Generating ends at a validated file; packaging it is the workflow-deploy skill's job. Suggest it, never start it unasked.
  • Discriminators are literal. Every type/mode tag must match the contract exactly, or Gate 1 rejects the whole branch.

© ForestHubAI, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 6 other files in skills/workflow-generate of ForestHubAI/edge-agents.

  • SKILL.md
  • examples/counter-agent.workflow.json
  • examples/gpio-pin.workflow.json
  • reference/functions.md
  • reference/llmproxy.yaml
  • reference/parameters.md
  • reference/workflow.yaml

Open the folder on GitHubat commit dad48b7

Compare with similar skills

Workflow Generate next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Workflow Generate compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Workflow Generate this skillForestHubAI/edge-agents105—~3.2kAutomated safety check: PassAGPL-3.0
Verify TrayscaleDeedleFake/trayscale1.1k—~1.7kAutomated safety check: PassMIT
Browserwingbrowserwing/browserwing1.4k—~1.8kAutomated safety check: PassMIT
Temporal Developerlatitude-dev/latitude-llm4.7k—~1.5kAutomated safety check: PassMIT
Regenerate PgoDeedleFake/trayscale1.1k—~984Automated safety check: PassMIT
Tk Impact Analysistonkeeper/tonkeeper-web444—~3.7kAutomated safety check: PassApache-2.0

Similar skills

  • Verify Trayscale

    DeedleFake/trayscale

    Drive the Trayscale GTK 4 / Libadwaita desktop UI the way a user does.

    1.1k GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • Browserwing

    browserwing/browserwing

    Browser automation platform with 78 built-in scripts and full CLI.

    1.4k GitHub stars~1.8k tokensUpdated 2 mo ago
    Productivity & AutomationAuto-check passed
  • Temporal Developer

    latitude-dev/latitude-llm

    This skill should be used when the user asks to "create a Temporal workflow", "write a Temporal activity", "debug stuck workflow", "fix non-determinism error", "Temporal Python", "Temporal…

    4.7k GitHub stars~1.5k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Regenerate Pgo

    DeedleFake/trayscale

    Regenerate cmd/trayscale/default.pgo by launching an isolated Trayscale, driving representative UI paths under PPROF, then replacing the profile.

    1.1k GitHub stars~984 tokensUpdated today
    Auto-check passed
  • Tk Impact Analysis

    tonkeeper/tonkeeper-web

    Analyze QA regression impact for Tonkeeper Web by comparing the current branch with the relevant release tag, reviewing sources/Web/regress.txt, and recommending test blocks, missing coverage, extra…

    444 GitHub stars~3.7k tokensUpdated 6 days ago
    DevelopmentAuto-check passed
  • Slab

    stencil-hq/slab

    Writing, editing, and rendering Slab documents (.slab) — the declarative design language for app screens, posters, terminal UIs, and interactive components.

    111 GitHub stars~3.1k tokensUpdated 1 mo ago
    Frontend & DesignAuto-check passed

Works with

Questions about Workflow Generate

What does Workflow Generate do?

Generate a validated Edge Agents workflow JSON (.workflow.json) from a natural-language description — the node-graph that runs on Edge Agents edge/IoT agents, built from triggers (timer, startup…. Workflow Generate is an agent skill from ForestHubAI/edge-agents.json) from a natural-language description — the node-graph that runs on Edge Agents edge/IoT agents, built from triggers (timer, startup, pin edge, threshold, MQTT, serial), GPIO/serial/MQTT I/O, LLM Agent nodes, and actuators.

When should I use Workflow Generate?

Workflow Generate fits situations like: GPIO/serial/MQTT I/O; LLM Agent nodes; describes automation; agent behavior in prose and wants a ready-to-run workflow file — e.g.

How do I install Workflow Generate in Claude Code?

Run `npx skills add ForestHubAI/edge-agents --skill workflow-generate -a claude-code`. Or copy the skill folder (skills/workflow-generate in ForestHubAI/edge-agents) into .claude/skills/workflow-generate in your project. Claude Code loads it when a task matches its description.

How do I install Workflow Generate in Codex?

Run `npx skills add ForestHubAI/edge-agents --skill workflow-generate -a codex`. Or copy the skill folder (skills/workflow-generate in ForestHubAI/edge-agents) into .agents/skills/workflow-generate in your project. Codex loads it when a task matches its description.

Can I use Workflow Generate in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ForestHubAI/edge-agents --skill workflow-generate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/workflow-generate, .gemini/skills/workflow-generate, .github/skills/workflow-generate and .opencode/skills/workflow-generate in your project.

What does Workflow Generate need to run?

Going by SKILL.md and its folder, Workflow Generate needs the command-line tools its instructions call (node and npm). Our summary lists: Node.js; Docker.

Does Workflow Generate access the network?

SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Workflow Generate safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Workflow Generate use?

Workflow Generate is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Workflow Generate use?

About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Workflow Generate?

Skills that share tags, products or a category with Workflow Generate: Verify Trayscale (DeedleFake/trayscale, 1.1k stars), Browserwing (browserwing/browserwing, 1.4k stars), Temporal Developer (latitude-dev/latitude-llm, 4.7k stars) and Regenerate Pgo (DeedleFake/trayscale, 1.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Workflow Generate?

ForestHubAI (a GitHub organization) maintains it in ForestHubAI/edge-agents, which has 105 GitHub stars. The repository was last updated on August 24, 2026.

Source: ForestHubAI/edge-agents on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.