Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion plugins/brains/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "brains",
"description": "Your memory layer: Gmail, Calendar, Drive, and prior Claude conversations as queryable pages, with reflexive recall, hook-driven turn-by-turn capture and inbox delivery, and boards/automations/workflows on top.",
"version": "2.9.2",
"version": "2.9.3",
"author": {
"name": "brains (ssvlabs)"
},
Expand Down
2 changes: 1 addition & 1 deletion plugins/brains/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "brains",
"version": "2.9.2",
"version": "2.9.3",
"description": "Your personal memory layer for Codex: query Gmail, Calendar, Drive, and prior conversations, then build boards, automations, and workflows.",
"author": {
"name": "brains (ssvlabs)",
Expand Down
16 changes: 8 additions & 8 deletions plugins/brains/generated/capability-catalog.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,34 @@
"artifacts": [
{
"capability_id": "integration-actions",
"catalog_sha256": "f93159bc3af5e891ae4b31c82178535242783c5419a07cd76b5aa3598ff299a7",
"catalog_sha256": "1af48091ed8bc4b9485b0b04b1c8e166b5deb1db84785394e4c127a1922c91dd",
"artifact_path": "plugins/brains/skills/brains-write/SKILL.md",
"artifact_sha256": "c289803f96c35dcfd5347e46177c009850dfdc4b42579a770ea6516d0c60e2af"
},
{
"capability_id": "brains-features",
"catalog_sha256": "9976952657698137f1ab4cb0d9eb547555e0c966659632cc4d14e5797d66830b",
"catalog_sha256": "679169b9e149e2a072d3761617a28d231ad2be884740f7dc6a4c5e0e05faf4a2",
"artifact_path": "plugins/brains/skills/brains-build/SKILL.md",
"artifact_sha256": "95261ee804b3b3cae4f42231264aafa64c96753dce71ab851fad6f97eed37c48"
"artifact_sha256": "e912d7f77a1cc7b8a62ef86f9fa40e8f175e7c9bfaebc6674df34ca66dfa2217"
},
{
"capability_id": "procedure:board",
"catalog_sha256": "d9242158554683b1b18ac2f26ebfecf6c0d42c00e480524be2e6ee35df1fb879",
"artifact_path": "plugins/brains/skills/brains-board/SKILL.md",
"artifact_sha256": "bfc28da5ef20ec559fe10bd9b21d2d7ca673de5533f012bd9cfaa3947241cf6f"
"artifact_sha256": "d7ea8d401d7742ef060377e9c4d1d93e5f8327dc2932306b29d766caf749b344"
},
{
"capability_id": "procedure:automation",
"catalog_sha256": "ea1e883788e138e39b80627e5a14d6ac35dc7f658b4628e7e32084bb6620fe8b",
"catalog_sha256": "25a7694ffe3089a60aa7d9561bd09d83d47b169846cea9f4953103895de50427",
"artifact_path": "plugins/brains/skills/brains-automation/SKILL.md",
"artifact_sha256": "c91cc266c317a5d2ae479594ecad0e5048970d7431139777ea61f401bb4e9cc6"
"artifact_sha256": "f10c567b6fb56aedea34a86b9716b8af80c490f7d148bb2fe7cf44c16bda0fae"
},
{
"capability_id": "procedure:workflow",
"catalog_sha256": "ec1f5989adae2630f16879299f05cc79c6aabfd9897c968c69618882b35f1278",
"artifact_path": "plugins/brains/skills/brains-workflow/SKILL.md",
"artifact_sha256": "b22814fd630ed78964d54440ec327e3aebcde8c812aaa9985fff9c4d345d3f09"
"artifact_sha256": "349aed79785c6345d120348d7283c00401032d3afa46ca6199c5cb67ae7e4a3e"
}
],
"source_commit": "6fb7b2356592b4e5313176cc55d6d06cb3130e31"
"source_commit": "d9d09bd82d8c16128a67429d46b658c78ac82788"
}
68 changes: 34 additions & 34 deletions plugins/brains/skills/brains-automation/SKILL.md

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions plugins/brains/skills/brains-board/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ You're helping the user build a well-structured board. Your job is to turn what
- **Respect the escape hatch.** If the user says "just build it" / "whatever you think" / "you decide" at any point, build the current best draft immediately with sensible defaults and skip every remaining question.
- **Infer, don't ask, the structure.** Columns, whether it's one dataset or several, relationships — you work these out and show them. Don't ask "what columns?" or "does anything connect?" — decide and present it; the user corrects if wrong.
- **Plain language until the proposal.** Don't say "schema", "column type", "dataset" before the proposal — talk about "what you want to track" and "things that connect".
- **Use the same MCP namespace that returned this playbook.** Tool names below are written without an `mcp__<server>__` prefix. If you called this as `mcp__brains__create_board_flow`, use `mcp__brains__*` for every downstream call (`create_board`, `list_my_integrations`, `append_board_rows`, `create_board_skill`, `set_dashboard`, `search`, `query`, `get_page`, `create_automation_flow`). Do not mix namespaces.
- **Use the same MCP namespace that returned this playbook.** Tool names below are written without an `mcp__<server>__` prefix. If you called this as `mcp__brains__create_board_flow`, use `mcp__brains__*` for every downstream call (`create_board`, `list_my_integrations`, `append_board_rows`, `create_board_skill`, `set_dashboard`, `search`, `query`, `get_page`, `create_agent_flow`). Do not mix namespaces.

## Flow state — one line, every turn

Expand Down Expand Up @@ -111,9 +111,9 @@ The new board id is in the response. Open it fire-and-forget so the user sees it

Act on the source you proposed:

- **Integration, connected:** offer to keep it fresh — `create_automation_flow` to wire a sync agent — and/or seed once now (`fetch_from_integration` or `search`/`query` → `append_board_rows`).
- **Integration, connected:** offer to keep it fresh — `create_agent_flow` to wire a sync agent — and/or seed once now (`fetch_from_integration` or `search`/`query` → `append_board_rows`).
- **Integration, NOT connected:** surface a connect prompt naming the integration and why (*"Connect GitHub and this board stays in sync with your PRs."*). On a surface that supports it, emit it as a connect card (the UI shows the integration's icon + a Connect button — follow your surface instructions); on plain text, give the connect link/instruction in one line. After they connect, wire/seed. If they decline, leave the board manual and note it can be wired later.
- **Agent:** run `create_automation_flow` to build the writer.
- **Agent:** run `create_agent_flow` to build the writer.
- **Manual:** offer a one-time seed — (a) pull from the user's brain pages (`search`/`query` → `get_page` → `append_board_rows`, cite sources briefly), (b) they paste rows, or (c) skip.

Don't make this a wall — one offer, act on the answer, move on.
Expand Down
2 changes: 1 addition & 1 deletion plugins/brains/skills/brains-build/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Don't restate that artifact here — open it.
| **Bulk upload** | Load a large or arbitrary-format file into a board without reading it into context. | `create_import_grant` → `bulk_append_rows` |
| **Dashboard** | A live, interactive view of a board that you author as a full HTML app. | `get_dashboard` → `set_dashboard` |
| **Page** | A first-class note in a brain. | `create_page` |
| **Automation** | A sandboxed TS program on a cron schedule with a scoped token. | `create_automation_flow` if your client exposes it (follow the playbook it returns), otherwise the Agents page (`/agents`) |
| **Automation** | A sandboxed TS program on a cron schedule with a scoped token. | `create_agent_flow` if your client exposes it (follow the playbook it returns), otherwise the Agents page (`/agents`) |
| **Recurring brief / digest** | Install a prebuilt automation that sends a recurring summary instead of scaffolding one. | `list_recipes` → `install_recipe` |
| **Workflow** | A goal container: charter, KPIs, deadlines, roster, an owned board and template automations. | `create_workflow_flow` if your client exposes it (follow the playbook it returns), otherwise `create_workflow` |
| **Mini-site** | Static sandboxed HTML on a brain — a deck, a one-pager, a shareable link. | `create_mini_site` |
Expand Down
8 changes: 4 additions & 4 deletions plugins/brains/skills/brains-workflow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ Do NOT hand off to the user yet — Step 8.5 must run first.

A template that renders cleanly is not the same as a template that runs cleanly. Render-time substitution can still produce source that fails on a missing tool grant, a board row shape the template assumed, an empty roster the cron summary crashes on, or a typo in a field name. **Never tell the user the workflow is ready until each attached agent has actually executed once.** Templates are not exempt — they're more likely to silently break than hand-written source, because the user never read them.

For each `automation_id` returned by `create_workflow`, call `run_automation_once` with:
For each `automation_id` returned by `create_workflow`, call `run_agent_once` with:

- `automation_id` — the id from the array
- `dry_run: true` — execute the source against a real trigger payload but suppress outbound writes; same hook as the admin Dry-Run button
Expand All @@ -150,8 +150,8 @@ Read each result:
| `status` | What to do |
|---|---|
| `succeeded` | Note one line of `stdout` to confirm intent (e.g. *"progress_scorer: scored 0/4 KPIs, no slip"*). Continue. |
| `partial` | Exit 0 but stderr non-empty — the template caught errors and kept going. Treat as a failure for smoke-test purposes: show the user the `stderr` tail, patch via `update_automation` (usually a retry/backoff around the failing call), and re-run. Don't continue until it goes fully green. |
| `failed` / `killed` | Show the user the `error` field + tail of `stderr`. Common shapes: tool-grant mismatch (`tool 'X' not in grants`), empty roster (`Cannot read properties of undefined`), missing field on the freshly-created board. Patch via `update_automation` and re-run `run_automation_once`. Two failures on the same agent → stop and ask the user how to proceed, don't guess a third fix. |
| `partial` | Exit 0 but stderr non-empty — the template caught errors and kept going. Treat as a failure for smoke-test purposes: show the user the `stderr` tail, patch via `update_agent` (usually a retry/backoff around the failing call), and re-run. Don't continue until it goes fully green. |
| `failed` / `killed` | Show the user the `error` field + tail of `stderr`. Common shapes: tool-grant mismatch (`tool 'X' not in grants`), empty roster (`Cannot read properties of undefined`), missing field on the freshly-created board. Patch via `update_agent` and re-run `run_agent_once`. Two failures on the same agent → stop and ask the user how to proceed, don't guess a third fix. |
| `skipped` | Source bailed early (e.g. *"no tasks due in window"* for task_nudger on a brand-new workflow with zero tasks). Expected for an empty workflow; confirm with the user that the skip reason matches the trigger payload that fired, then continue. |
| `queued` / `running` (timed out — `timed_out: true`) | Run didn't reach a terminal status before `wait_seconds`. The response carries `timeout_reason` + a `next_step` line — **surface `next_step` verbatim** for this template (don't roll your own triage table) and continue. Don't claim success. |

Expand All @@ -174,5 +174,5 @@ Only after Step 8.5 is complete: hand the user the `workflow_url` and `dashboard
- **Be assertive on templates.** Recommend all three; do not enumerate-and-ask unless the user pushes back.
- **Every workflow has a dashboard.** It's mandatory — `create_workflow` always provisions one.
- **Always end in a single `create_workflow` call.** Do not try to wire agents, boards, or dashboards manually — the tool handles provisioning.
- **Templates only.** No hand-rolled agent source in this flow — that's what create_automation_flow is for.
- **Templates only.** No hand-rolled agent source in this flow — that's what create_agent_flow is for.
- **Smoke-test every attached agent before hand-off.** Step 8.5 is mandatory; a "template" agent can fail at runtime exactly like a hand-rolled one, and the user has not read the rendered source. Don't claim a workflow is ready until every attached agent has executed once.
Loading
Loading