Install
openclaw skills install javis-brainstormingCreates a to-do card with a ready-to-paste prompt that hands off recent transcript data to Claude’s content-brainstorming skill for idea organization.
openclaw skills install javis-brainstormingTurn a brainstorm-worthy voice/keyboard unit into a generic to-do card whose
prompthands off to Claude'scontent-brainstormingskill. The skill does no brainstorming itself — it detects a discernible goal/request in a transcript, composes a ready-to-paste Claude prompt, and writes atype="todo"card. iOS renders that card generically (calendar-style, Confirm / Discard) in the Calendar tab; Confirm copiespayload.promptto the clipboard so you can paste it into Claude. Fetch the last 24 hours of transcript data by default.
brainstorm route — no approve-to-run card (see "How this skill is invoked").
<userId>is optional. Omit it and it defaults toself. Each HiJavis user runs in their own openclaw container, soselfis correctly isolated; the gateway token (not the userId) authenticates every server call.
# Step 1 — fetch recent transcripts as JSON (the agent reads this and composes a card)
node scripts/brainstorming.js fetch [--hours N] [--limit N]
# Step 1 (dispatcher run) — fetch ONE completed unit (the auto-run dispatcher unit)
node scripts/brainstorming.js fetch --session <sessionId> [--hours N] # audio unit
node scripts/brainstorming.js fetch --kbd-input <inputId> [--hours N] # keyboard unit
# Step 2 — push: pipe the composed to-do-card JSON to stdin; dedups (seen) + writes type=todo pending
echo '<todo-card-json>' | node scripts/brainstorming.js push
A two-step pipeline mirroring calendar-extractor: the script does the I/O
(fetch transcripts, dedup, write the card), the agent/LLM does the reasoning
(decide there is a brainstorm-worthy unit, extract its goal/request, and compose the
hand-off prompt). Nothing is hardcoded — the agent reads the fetched transcript and
emits one to-do-card JSON object.
Fetch — node scripts/brainstorming.js <userId> fetch issues
GET http://javis-server:8000/api/transcripts/recent?since=…&limit=… with the
OPENCLAW_GATEWAY_TOKEN bearer and prints
{ "reference_time": LOCAL-wall-clock (zoneless, in tz), "reference_date": "YYYY-MM-DD", "reference_weekday": "Thursday", "reference_time_utc": ISO8601, "tz": IANA, "sessions": [ { session_id, started_at, ended_at, transcript, source } ] }.
If fetch fails, returns invalid JSON, or yields zero sessions, output nothing and
do not push; report the failure only if the user asked for a diagnostic.
Compose — the agent reads that JSON and decides whether there is a discernible goal and request. If there is none, emit no card (silence is a valid detector outcome). If there is, produce one to-do-card JSON object:
{
"title": "Intro Javis to the OpenClaw community",
"goal": "introduce Javis to the OpenClaw community, for non-engineer users",
"subtitle": "Brainstorm · 2 sessions",
"request": [
"an attention hook",
"a step-by-step demo/onboarding flow",
"an explanation for the open-source community",
"concise skill examples & use cases"
],
"key_points": ["…optional notes the agent pulled from the transcript…"],
"source_refs": ["<session_id>", "<session_id>"]
}
title, goal, request[], and source_refs[] are the bracketed fields. The
push script composes the ready-to-paste prompt from them using the fixed
template below (the agent may instead supply an explicit prompt field to override
it; if absent, the template is used). icon defaults to 🧠; subtitle defaults
to Brainstorm / Brainstorm · N sessions.
Push — pipe the card JSON into node scripts/brainstorming.js <userId> push. The script:
data/users/<userId>.json → seen map, 30-day TTL),POST /api/skill/data with
type="todo", merge="upsert", status="pending", and
payload = { icon, title, subtitle?, prompt, source_refs[] } (icon/title/prompt
required) — see references/todo-card-contract.md for the general contract,POST /api/agent/push nudge so the user notices the new
card in the Calendar tab.payload.prompt)push composes this from the card's bracketed fields; the rest is literal. This is
what Confirm copies to the clipboard:
I want to <GOAL — e.g. introduce Javis to the OpenClaw community, for non-engineer users>.
Source: my Javis voice note(s), session_id(s): <id…>. Before we start, pull the full
transcript via the javis_mcp connector (get_transcript_tool / search_transcripts_tool).
Please produce:
- <REQUEST item 1 — e.g. an attention hook>
- <REQUEST item 2 — e.g. a step-by-step demo/onboarding flow>
- <REQUEST item 3 — e.g. an explanation for the open-source community>
- <REQUEST item 4 — e.g. concise skill examples & use cases>
Run the content-brainstorming flow: ask me clarifying questions one at a time,
inventory the source material, then produce a structured brief before drafting.
This closes the loop: the openclaw brainstorming skill hands off to the Claude-side
content-brainstorming skill, with javis_mcp pulling the source transcript.
This skill has two triggers (dispatcher auto-run and manual).
brainstorm
route matches, the server claims run-once (DispatchRouteExecuted (user, unit, route)) and AUTO-RUNS this skill directly — there is no approve-to-run proposal
card. It runs in the user's container with a prompt of the form
Run /brainstorming for <unit>. Deliverable: …, where the deliverable text is the
dispatcher's classification carried as an advisory HINT. The agent parses
<unit> (audio:<session_id> or kbd:<keyboard_input.id>), runs
fetch --session <id> / fetch --kbd-input <id>, composes the card, and pushes it.
The human gate is not running the skill — it is Confirm/Discard on the produced
to-do card. The skill does not self-gate — the server owns run-once.fetch
(last 24h by default) → composes → pushes. Repeating the ask re-runs composition on
the window; the seen map still prevents writing the same card twice.The route contract the javis-server team must satisfy is declared in this file's
metadata.routes block and documented in references/todo-card-contract.md (which
also carries the general to-do card contract shared by all to-do-emitting skills).
fetch, fs, path); no npm install is needed for the script runtime.payload.prompt) and pastes it into the interactive content-brainstorming flow./api/skill/data carries
status: "pending"; iOS renders it dashed (purple accent) in the Calendar tab with
Confirm · Discard. Confirm copies payload.prompt to the clipboard and marks
the row confirmed; Discard deletes it. There is no approve-to-run proposal card./api/skill/data but cannot read it back (GET /api/skill/data requires a Clerk
JWT), so novelty is decided by the local seen map ({ "<dedup_key>": "<ts>" } in
data/users/<userId>.json, 30-day TTL-pruned); the server write is a best-effort
mirror. The to-do dedup_key is title|hash(goal) — re-brainstorming the same unit
toward a new goal is a genuinely new card.tz field on the
fetch payload → the TZ environment variable → the system zone. To-do rows carry
no date (start_at/end_at absent), so the anchor is informational only — it
lets the agent resolve "today" coherently if the goal references it.scripts/todo-card.js is the reusable Layer-1 helper:
any future skill can require it to build + POST a type="todo" card without
re-implementing the contract. brainstorming.js is its first consumer.-, _ (path-traversal guard in data.js).