agentleFS
TeamHelix-AITeamHelix-AI/helix/skills/helix-stream/SKILL.md

stream

Skill1 starsChanged 2 months agoApache-2.0View on GitHub

Stream live updates and visualizations to the Helix Stream dashboard — a watch-first browser surface where the agent pushes status tiles and a feed of rich cards during autonomous sessions; the user watches, drops steering notes, holds the brake, and answers rare inline questions. Use when the user says "/helix-stream", "open a stream", "stream this session", or wants to watch long autonomous work (feature builds, test runs, incident monitoring, refactors, /loop sessions) from the browser. Sibling of helix-canvas (deciding) and helix-loop (gauntlet); Stream is for watching.

3 other projects use a version of this.

Adopted by

Most recently taken up by

  • Other versions3 projects use a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 3

    1. simota/agent-skills★ 96same name
    2. GetStream/agent-skills★ 21same name
    3. nnawar706/fluento★ 0same name

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • In this repository12 other files it gives its agents.

The file

We split this skill into the rules it gives an agent

7 rules. 0 are common, 2 are distinctive, and 5 are very specific to this project.

  • 0

    Common

    Most of the 3 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    If HELIX_ORCHESTRATOR_RUN_ID or HELIX_SKILL_CREDENTIAL_FILE is set, this skill runs in Helix Console.

    line 11
  2. Very specific:

    Use the normal helix <surface> up, push, state, and wait commands.

    line 13
  3. Very specific:

    Do not start local servers or Fleet, open a browser, curl localhost, use --local, log in, or change profiles/projects.

    line 14
  4. Distinctive:

    Before proposing anything, read the rails that bind this project on this surface:

    line 69
  5. Distinctive:

    No threadId anywhere. Unknown types render as a raw-payload fallback.

    line 116
  6. Very specific:

    Drain between steps: run wait with a short timeout between work chunks (or check after each push — the push response cursor tells you …

    line 127
  7. Very specific:

    Only when genuinely blocked.

    line 148

“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Helix Stream

Orchestrator cloud context (check before setup)

If HELIX_ORCHESTRATOR_RUN_ID or HELIX_SKILL_CREDENTIAL_FILE is set, this skill runs in Helix Console. This section takes precedence over local setup and browser instructions below.

  • First call the plugin's bin/helix orchestrator-protocol (Windows: bin/helix.cmd orchestrator-protocol). It must print 1. Otherwise stop with an actionable request to update the Helix plugin/CLI; never run an older binary's setup commands.
  • Use the normal helix <surface> up, push, state, and wait commands. The CLI selects cloud transport and the assigned project automatically. Keep the same slug within this task.
  • Do not start local servers or Fleet, open a browser, curl localhost, use --local, log in, or change profiles/projects. Do not read or print the credential file. Do not remove the injected environment variables.
  • up returns the Console session URL. Use that URL wherever the local instructions request Board/Fleet links. Events go to Console; human responses and gate approvals still come from the person through the normal wait protocol.
  • On cloud or compatibility errors, report the error. Never fall back to local mode. Outside this context, follow the local behavior below unchanged.

The work is autonomous; dialogue is the exception. You stream tiles and feed cards; the user watches, may drop a note anytime, holds the brake, and answers your rare inline questions. The append-only event log is the record. Boundary (ratified): Stream = nothing is asked of the user by default · Canvas = the dialogue is the work · Loop = the human holds the bar.

Setup

Three verbs, never more:

# start server, open browser; auto-restarts stale servers on the same port
${CLAUDE_PLUGIN_ROOT}/bin/helix stream up   --stream <slug> --agent <name> --model <model-id> [--dir <projectDir>] [--no-open]
#   --agent: your product name, lowercase (claude, codex, …)
#   --model: your exact model id (e.g. claude-fable-5) — Fleet shows and filters by these

# card JSON on stdin -> {cardId, cursor}; existing id -> update
${CLAUDE_PLUGIN_ROOT}/bin/helix stream push --stream <slug> [--dir]   # card JSON (one object, or an array of them) on stdin

# exit 0 delta, 3 timeout, 4 no-viewer, 5 down
# --wake-on user returns only when a human acted
${CLAUDE_PLUGIN_ROOT}/bin/helix stream wait --stream <slug> --since <cursor> [--timeout <s>] [--card <id>] [--dir] [--wake-on user]

On Windows, ${CLAUDE_PLUGIN_ROOT}\bin\helix.cmd in place of bin/helix; the rest of the command is the same.

  • up opens the browser itself, from inside the binary. --no-open is for headless or scripted runs — never a way around a permission prompt. If a prompt is declined, hand the user ! open <url> and carry on.
  • up also brings up Fleet (mission control) when it is down, and returns fleet: {url, started}. Hand the user both links in one line — Board: <url> · Fleet: <fleet.url> — so they know the overview is there. up never opens Fleet in the browser; the user follows the link.

Data: ~/.helix/stream/<project>/<slug>/ (SQLite event log + server.json) — one home for the whole machine, never inside a repo. Streams are per-session: one task, one stream — pick a fresh slug per session (e.g. the task's short name). Always pass --dir with the project root in scripts/background sessions (cwd is not reliable). Snapshot: curl -s http://127.0.0.1:<port>/api/state.

Shell discipline (same as siblings): always call the binary by its full path — a shell variable or function holding it stops the skill's pre-approval from matching, and every call then prompts. Heredocs (<<'EOF') for push payloads, never echo.

Rails first

Before proposing anything, read the rails that bind this project on this surface:

${CLAUDE_PLUGIN_ROOT}/bin/helix rails for --surface stream

What comes back is not advice — it is the standard the work is held to. Cite rail ids when you act on them; full text with helix rails get <id>. Details in the helix-rails skill.

What you push

Re-pushing an existing id updates in place. status is a singleton (the server forces id: "status").

Tiles — pinned dashboard, update in place, keep them honest all session:

typepayload
status{text, phase?} — what you are doing RIGHT NOW
progress{label, done, total}
metric{tiles:[{label, value, unit?, delta?, tone?:"good"|"bad"|"neutral"}]}
tasks{items:[{label, state?:"pending"|"active"|"done"}]} — read-only plan
chartcanvas chart payload + "zone":"tile" to pin (charts default to feed)

Feed — chronological cards; payloads identical to Helix Canvas types: update ({markdown}), code, diff, terminal, test-report, api, commit, image, chart, table, diagram, plus:

  • milestone {label} — section break; push one when a phase completes.
  • question / options — the escape hatch (see below).
  • artifact {path, status?:"forming"|"stable"|"done"} — a deliverable (report, doc, generated file). Write the file with Write/Edit; the stream watches it live. Shows in the feed AND collects under the artifacts tab. Advance status with update pushes.
  • Any feed card may carry payload.tone: "good"|"bad"|"neutral" — use bad for failures, good for wins; it colors the card edge.
  • delete {cardId} works; there are no threads and no edges.

Actions — native toolbar/tabs, never a bare link in prose:

  • action {label, url, preview?:boolean} — with preview: true it becomes a tab embedding the URL (dev servers, dashboards); without, a ↗ toolbar button opening a new browser tab (docs, PRs). Push one the moment a dev server is up. Re-push same id to update; delete removes the button/tab when the server goes away.

No threadId anywhere. Unknown types render as a raw-payload fallback.

The rhythm

  1. up with a fresh slug; push status + tasks (the plan) immediately — the user's first glance must answer "what is it doing and what's the plan".
  2. Work. Push an update/code/test-report/... at every meaningful step — a feed the user reads after 20 minutes away should tell the story without them asking. Push milestone between phases. Update status, progress, and metric tiles as you go; a stale status tile is a bug.
  3. Drain between steps: run wait with a short timeout between work chunks (or check after each push — the push response cursor tells you nothing about user events; always wait --since your last drained cursor). React to every user event within one cycle.
  4. Exit 4 (no-viewer) is fine — Stream is ambient; keep working and keep pushing. Do NOT stop streaming because nobody is watching; the feed is also the record they read later.

User events in your delta (origin:"user")

  • note.added {text, cardId?} — a steering note; acknowledge it in the feed (an update referencing it) and obey it. Notes are the primary steering channel.
  • brake {action:"pause"|"resume"|"stop"} — architecture, not a suggestion: on pause, finish the current atomic step, push a status update saying you're holding, and wait until resume or stop; on stop, wind down cleanly and summarize.
  • response.added — an answer to an inline question.

Inline questions (the escape hatch — use sparingly)

Only when genuinely blocked. Push a question/options card with payload.default (what you'll do if unanswered) and payload.windowS. Then KEEP WORKING on other parts; check with wait --card <id> --timeout <s> between chunks. When the window closes unanswered, proceed with the default and say so in an update. Never push rounds of questions — that's a Canvas session; if real collaboration is needed, say so and suggest switching.

Server operations

  • A stale server restarts on the same port when you run ${CLAUDE_PLUGIN_ROOT}/bin/helix stream up again. The event log survives restarts.
  • App render failures arrive in your delta as client.error — fix them.
  • Kill by pid, never by name. pkill -f "helix stream serve" matches every stream server on the machine — other projects, other people's sessions, runs in the middle of their work. It looks local and is not. Read the pid instead: kill "$(sed -n 's/.*"pid": *\([0-9]*\).*/\1/p' ~/.helix/stream/<project>/<slug>/server.json)".

End of session — linger, don't vanish

  1. Push a final milestone ("done") + closing update with the summary, set status to idle, mark all tasks done/skipped. Outcomes become surfaces: action cards for anything running (preview tab for the dev server), artifact cards for anything written (report, doc).
  2. Then keep a wait armed — indefinitely. The user often reads the finished feed and reacts — a note arriving after "done" is a request, not noise. Quiet cycles and no-viewer results do NOT end the session: the last tool call of every turn, "done" included, is an endless wait launched with run_in_background, so any late note, brake, or answer re-invokes you. NEVER end the session with an undrained delta.
# LAST tool call of the turn — Bash with run_in_background: true
${CLAUDE_PLUGIN_ROOT}/bin/helix stream wait --stream <slug> --dir <projectDir> --since <cursor> --timeout 3600 --wake-on user

--wake-on user holds through viewer churn and a closed tab, returning only when a human acted. Exit 0 wakes you with the delta; 5 means the server died — restart it on the same port and re-arm. 3 is a quiet hour, not an ending.

Bake $SLUG, $PROJECT, and the last drained $CURSOR into the command — background calls share no shell state. The session ends only when the user says so (a stop brake or an explicit done in the terminal); only then stop re-arming. 3. The stream stays reopenable via up with the same slug; say so in the terminal summary.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.