What it is
Umbrella is an installer (Markdown skills into
~/.umbrella or ./.umbrella), a
CLI named umbrella, and a
Node daemon that plans, runs tools (including
MCP), and writes to SQLite—with optional
Telegram, Discord, and
Slack chat bridges and a small HTTP
dashboard.
-
Live
Installer, daemon, SQLite, shell/read/write,
mcp:…calls, chaos recovery, run log + scorecard UI, cron/interval schedules, optional voice transcribe hook. -
IDE
/umb:…in the daemon is simulated; run those flows in Claude / Cursor / Gemini with skills pointed at your.umbrellafolder.
Install
Published package: @benjam16/umbrella (adjust scope if yours differs).
Global CLI
# Install binary globally, then verify ➜ ~ npm install -g @benjam16/umbrella ➜ ~ umbrella --version
Without global install (npx)
# Copy skills, then start the agent ➜ ~ npx @benjam16/umbrella@latest install ➜ ~ npx @benjam16/umbrella@latest agent start
From source
# Clone, deps, build; local skills in ./.umbrella with --local ➜ ~ git clone <repo> && cd Umbrella ➜ Umbrella npm install && npm run build ➜ Umbrella node bin/install.js --claude --local # Dev CLI (TypeScript via tsx; agent still uses dist/) ➜ Umbrella npm run dev -- --version ➜ Umbrella node dist/src/cli.js agent start
CLI
| Command | Effect |
|---|---|
umbrella install |
Interactive install: copy modules and agent runtime into
~/.umbrella or ./.umbrella.
|
umbrella up |
Same as agent start. Optional
--dry-run previews .env +
config.json merge without starting the daemon.
|
umbrella agent start |
Heartbeat: planner → executor → verifier → memory summarize (MCP init, gateways, dashboard if configured). |
umbrella agent status |
Whether ~/.umbrella/agent.pid points at a live process. |
umbrella agent stop |
Sends SIGTERM to the daemon PID. |
umbrella doctor |
Node, pid, SQLite, LLM env, Telegram / Discord / Slack / voice-STT hints, schedules, token budget. |
umbrella config-path |
Prints resolved config.json path. |
umbrella session reset |
Clears ~/.umbrella/session.json (new session on next heartbeat). |
umbrella scaffold cli … |
Shipping template: TypeScript CLI + Vitest + publish workflow
(see examples/SHIPPING.md).
|
IDE
Point Claude, Cursor, or Gemini CLI at
~/.umbrella/skills/ and
~/.umbrella/commands/. Each module’s
SKILL.md describes /umb:… workflows:
coding, lean, tools, memory, orchestrate, secure, observe, flow,
agent-runtime.
The daemon does not use Cursor as an LLM backend; it calls
Anthropic, OpenAI, or Google APIs—or any
OpenAI-compatible endpoint via
UMBRELLA_OPENAI_BASE_URL (e.g. Ollama) plus
UMBRELLA_OLLAMA_MODEL / UMBRELLA_MODEL.
Agent heartbeat
-
Picks a goal: foreground interrupt,
scheduled (
schedule.json→ SQLite), core background, or idle if paused. - Planner emits XML (
<plan>) — LLM or fallback; tool hints include MCP names. - Executor runs each
<task>(optional per-slice subagent if configured). - Verifier checks the last result (heuristics + optional shell hook).
- Learner + skill promotion pipeline; memory compaction optional.
- Optional digest to chat every
UMBRELLA_DIGEST_HEARTBEATScycles.
UMBRELLA_HEARTBEAT_MS defaults to 60000.
UMBRELLA_SCHEDULE_NOTIFY=1 pings the last-used chat after a
scheduled heartbeat finishes.
Memory
SQLite at ~/.umbrella/memory.db: execution results,
chaos events, chat ingests, LLM audit references, etc.
Agent state in the same DB: core goal, foreground
goal, background pause, last Telegram / Discord / Slack channel for
digests. Table umbrella_schedules stores synced
cron/interval jobs from ~/.umbrella/schedule.json.
Executor
| Action | Behavior |
|---|---|
/umb:… |
Simulated in daemon; real runs happen in the IDE. |
shell:… |
Shell (safeguards); failures can trigger chaos recovery if an LLM is configured. |
read:path |
Up to ~2000 chars. |
write:path|body |
Writes file. |
mcp:{…} |
JSON line: server index + name +
arguments when UMBRELLA_MCP_ENABLED=1
and servers are configured.
|
scaffold-cli:{…} |
npm CLI template under UMBRELLA_SHIPPING_ROOT when set.
|
git … / npm … / node … |
Shell with chaos wrapper where applicable. |
| Other text | Optional one-line LLM router → tool, MCP, or shell. |
Chaos & dashboard
Failed shell runs can invoke the Chaos Specialist (LLM + optional
URL text preview via UMBRELLA_WEB_FETCH), retry with
recovery; chaos_event rows in memory. Optional human
approval: UMBRELLA_CHAOS_APPROVE=1 +
POST /api/chaos-approve.
Set UMBRELLA_DASHBOARD_PORT (e.g. 4578) and open
http://127.0.0.1:4578/ — HTML UI plus JSON routes such as
/api/chaos-logs, /api/last-run,
/api/run-log (scorecard), /api/version,
/api/health, /api/schedules,
/api/mcp-tools, /api/tools (built-in + MCP list).
UMB_X402_ENABLED=1 enables a payment-path stub for
quota-style errors.
Chat gateways
All use the same task surface as the HTTP API; messages are handled by the shared command handler. Set only the bridges you need.
| Channel | Setup |
|---|---|
| Telegram |
TELEGRAM_BOT_TOKEN —
/umb … commands; digests and schedule notify use the
last chat that messaged the bot.
|
| Discord |
DISCORD_BOT_TOKEN + Message Content Intent
— !umb … in servers/DMs.
|
| Slack |
Socket Mode: SLACK_BOT_TOKEN,
SLACK_APP_TOKEN,
SLACK_SIGNING_SECRET (all three) —
!umb … same as Discord.
|
HTTP API
When the dashboard port is set, mutating routes expect
Authorization: Bearer <UMBRELLA_INBOUND_SECRET>
(set the secret in your env). Examples below use
4578; change the port to match yours.
# Foreground goal (next heartbeat) ➜ ~ curl -sS -X POST http://127.0.0.1:4578/api/goal \ -H "Authorization: Bearer $UMBRELLA_INBOUND_SECRET" \ -H "Content-Type: application/json" \ -d '{"goal":"Fix flaky test in worker"}' # Unified tool list (no auth) ➜ ~ curl -sS http://127.0.0.1:4578/api/tools # Voice: set UMBRELLA_VOICE_STT to your STT binary first ➜ ~ curl -sS -X POST http://127.0.0.1:4578/api/voice-transcribe \ -H "Authorization: Bearer $UMBRELLA_INBOUND_SECRET" \ -H "Content-Type: application/json" \ -d '{"audioBase64":"<base64>","setForegroundGoal":true}'
See docs/VOICE.md for raw audio upload and limits (6 MiB max).
Environment
Dotenv load order for the daemon: UMBRELLA_DOTENV (if set),
~/.umbrella/.env, optional secrets helper, then
config.json — existing non-empty shell env wins.
| Variable | Purpose |
|---|---|
ANTHROPIC_API_KEY |
Claude |
OPENAI_API_KEY |
OpenAI / Codex-style |
UMBRELLA_OPENAI_BASE_URL |
OpenAI-compatible API (e.g. Ollama /v1) |
UMBRELLA_OLLAMA_MODEL / UMBRELLA_MODEL |
Model id for the active provider |
GEMINI_API_KEY / GOOGLE_API_KEY |
Google AI |
UMBRELLA_LLM_PROVIDER |
anthropic | openai | google | … |
UMBRELLA_MCP_ENABLED |
1 to connect MCP servers from env / file |
UMBRELLA_MCP_SERVERS |
JSON array: stdio command and/or HTTP url (+ headers) |
UMBRELLA_MCP_SERVERS_FILE |
Path to JSON file (merged with env list) |
UMBRELLA_INBOUND_SECRET |
Bearer token for dashboard POST routes |
UMBRELLA_DASHBOARD_PORT |
Local dashboard + JSON API (e.g. 4578) |
TELEGRAM_BOT_TOKEN |
Telegram bot |
DISCORD_BOT_TOKEN |
Discord bot (!umb) |
SLACK_BOT_TOKEN + SLACK_APP_TOKEN + SLACK_SIGNING_SECRET |
Slack Socket Mode (!umb) |
UMBRELLA_VOICE_STT |
Executable: argv[1]=audio file, stdout=transcript |
UMBRELLA_VOICE_STT_TIMEOUT_MS |
STT subprocess timeout (default 120000) |
UMBRELLA_HEARTBEAT_MS |
Daemon loop interval (default 60000) |
UMBRELLA_DIGEST_HEARTBEATS |
Post digest to chat every N heartbeats |
UMBRELLA_SCHEDULE_NOTIFY |
1 — ping chat after scheduled heartbeat |
UMBRELLA_WEB_FETCH |
Allow Chaos specialist URL text preview (allowlist) |
UMBRELLA_SHIPPING_ROOT |
Root for scaffold-cli: agent actions |
UMBRELLA_SUBAGENT_PER_SLICE |
1 + LLM — expand each plan slice via subagent |
UMBRELLA_PLANNER_TOOL_HINTS_MAX_CHARS |
Cap orchestrator MCP/tool block in the planner prompt |
UMB_X402_ENABLED |
Payment stub for quota-style errors |
UMBRELLA_VERIFY_COMMAND |
Shell during verify (exit 0 + heuristic pass) |
UMBRELLA_STUCK_THRESHOLD |
Failures before escalation goal (default 3) |
UMBRELLA_LLM_AUDIT |
Set 0 to disable llm-audit.log |
UMBRELLA_TOKEN_BUDGET_DAILY |
Approximate daily LLM token budget (UTC) |
UMBRELLA_MEMORY_LLM_COMPACT |
Optional memory compaction via LLM |
UMBRELLA_SECRETS_HELPER |
Executable printing JSON env map for empty keys only |
UMBRELLA_MAX_TASK_TOKENS / slice / milestone |
Orchestrator budget hints (env or JSON) |
What’s built in now
-
PID + service UX:
umbrella up/agent start|stop|status,~/.umbrella/agent.pid, single-instance guard,umbrella doctor,session reset,config-path. -
GSD-style orchestration: planner emits
<milestone>→<slice>→<task>; optional per-slice subagent expansion (UMBRELLA_SUBAGENT_PER_SLICE=1+ LLM); tool hints include MCP server indices. -
Stuck-loop guard: similar failures in a row raise an
escalation goal (
UMBRELLA_STUCK_THRESHOLD). -
Verifier hook:
UMBRELLA_VERIFY_COMMAND(e.g.npm test) — exit 0 and text heuristic. -
Run log + tests: JSONL heartbeats with plan/execution
previews;
npm testchecks deterministic plan XML expansion.
Remaining limits (next upgrades)
- Subagent depth: optional slice expansion exists, but not full nested worker farms or isolated sandboxes by default.
-
Chaos / LLM shell risk: model-driven recovery; tighten
shell-policy, containers, or human approval for production. - Verifier: no second “judge” LLM or structured rubric yet.
- Bundled STT/TTS: voice path is external binary + HTTP; no in-process speech yet.