beehaven 0.8.29 → 0.8.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/agents-md-text.js +64 -0
  2. package/dist/browser-login.js +14 -4
  3. package/dist/build-channel.js +2 -2
  4. package/dist/claude-bridge.js +12 -9
  5. package/dist/clearly.js +4 -3
  6. package/dist/cli.js +26 -7
  7. package/dist/commands/agents-md.js +118 -0
  8. package/dist/commands/daemon-cmd.js +2 -0
  9. package/dist/commands/help.js +21 -0
  10. package/dist/commands/self-update.js +32 -5
  11. package/dist/commands/workspace.js +3 -3
  12. package/dist/daemon-client.js +10 -6
  13. package/dist/daemon-entry.js +1 -0
  14. package/dist/daemon-process.js +125 -0
  15. package/dist/daemon.js +131 -62
  16. package/dist/dashboard.js +118 -6
  17. package/dist/ipc-auth.js +3 -1
  18. package/dist/ipc-client.js +7 -6
  19. package/dist/ipc-path.js +92 -0
  20. package/dist/ipc-server.js +33 -33
  21. package/dist/npm-update.js +138 -0
  22. package/dist/setup-service.js +9 -4
  23. package/dist/verb-surface.js +1 -0
  24. package/dist/watcher.js +9 -23
  25. package/dist/windows-hide.js +77 -0
  26. package/package.json +1 -1
  27. package/scripts/sync-skills.mjs +6 -0
  28. package/skills/agent-doodle-space/SKILL.md +1 -1
  29. package/skills/agent-home/SKILL.md +1 -1
  30. package/skills/brand-identity/SKILL.md +22 -5
  31. package/skills/clearly-agent/SKILL.md +11 -4
  32. package/skills/clearly-canvas/SKILL.md +31 -5
  33. package/skills/clearly-canvas/authoring.md +40 -12
  34. package/skills/clearly-canvas/example.mjs +72 -69
  35. package/skills/clearly-docs/SKILL.md +151 -0
  36. package/skills/clearly-init/SKILL.md +135 -0
  37. package/skills/clearly-workflows/SKILL.md +90 -0
  38. package/skills/clearly-workspace/SKILL.md +1 -1
  39. package/skills/codebase-map/SKILL.md +1 -1
  40. package/skills/design-craft/SKILL.md +9 -6
  41. package/skills/index.json +45 -10
  42. package/skills/layout-systems/SKILL.md +14 -11
  43. package/skills/pair-on-canvas/SKILL.md +1 -1
  44. package/skills/sticker-pack/SKILL.md +132 -0
  45. package/skills/visualize/SKILL.md +188 -0
@@ -0,0 +1,135 @@
1
+ ---
2
+ name: clearly-init
3
+ description: >-
4
+ Connect a Clearly workspace to Claude Code or Codex and prove both the MCP and
5
+ CLI paths work. Prefer browser OAuth for remote HTTP clients; when an agent-bound
6
+ bearer credential is required, mint and install it with the active `beehaven`
7
+ identity. Use FIRST whenever a Clearly tool is refused for auth, returns nothing
8
+ on a workspace that should have content, or the user has never connected.
9
+ Triggers: "connect Clearly", "set up Clearly", "sign in to Clearly",
10
+ "authenticate", "install the MCP", "add the MCP token", "it says unauthorized",
11
+ "the tools are not showing up", "/mcp shows nothing", "which workspace am I in".
12
+ ---
13
+
14
+ > **Tool names below are written UNPREFIXED** (`clearly_read`). Your runtime may
15
+ > expose them with a server prefix — e.g.
16
+ > `mcp__plugin_clearly_clearly-staging__clearly_read`. **Match by suffix, not by
17
+ > exact name**: a skill written against the bare name resolves to nothing otherwise, and
18
+ > the failure looks like "the tool doesn't exist" rather than "the name is decorated".
19
+ >
20
+ > **If no such tool is callable at all**, the Clearly MCP server isn't authorised in this
21
+ > session — note that these skills still LIST when it isn't, so you find out by firing a
22
+ > dead call. Authorise it (`/mcp`, or `claude mcp`), or if you have a shell, use the
23
+ > `beehaven` CLI and its own `clearly-canvas` skill instead.
24
+
25
+ # `/clearly:init` — connect a Clearly workspace to Claude Code or Codex
26
+
27
+ Run this once per machine. The plugin's `.mcp.json` points at
28
+ `https://relay.clearly.sh/mcp`; complete authentication and verify the connection before doing
29
+ workspace work.
30
+
31
+ ## Steps
32
+
33
+ ### 1. Authenticate (OAuth — browser sign-in)
34
+
35
+ The plugin already wires the MCP server. Prefer browser OAuth:
36
+
37
+ - **In Claude Code (recommended)**: run `/mcp`, select `clearly`, and choose **Authenticate**. A browser window opens for sign-in; approve and it closes itself. No token.
38
+ - **From the shell**: `claude mcp login clearly` — same browser sign-in flow.
39
+ - **In Codex**: `codex mcp login clearly`. If the server was added outside the plugin first, run
40
+ `codex mcp add clearly --url https://relay.clearly.sh/mcp`, then log in.
41
+
42
+ The sign-in grants scoped access (`rpc:read` for search and read; add `rpc:write` to let the
43
+ agent write documents and create boards or tickets). Sign out or revoke with the client's MCP
44
+ logout command, or from Settings → **Developers** in the app.
45
+
46
+ ### Agent-bound token path (CLI and automation)
47
+
48
+ Use this when the client cannot complete OAuth or when the credential must act as a specific agent
49
+ identity. Sign in and select the identity first:
50
+
51
+ ```bash
52
+ beehaven agent login <agent-name>
53
+ beehaven connect home
54
+ beehaven agent whoami
55
+ beehaven mcp install --client codex
56
+ ```
57
+
58
+ The installer writes through the client's own config command and never prints the token. Restart
59
+ the client afterward. A static token normally carries `rpc:read` and `rpc:write`; `agent:ask` is
60
+ OAuth-only and `rpc:admin` is reserved for configured platform admins. Never paste a bearer token
61
+ into a document, ticket, canvas, log, or chat response.
62
+
63
+ > **Working in more than one workspace?** A client stores one credential per server entry, so two
64
+ > workspaces behind a single entry collide. Use `https://relay.clearly.sh/mcp/w/<workspaceId>` as a
65
+ > second entry — see [the MCP docs](https://clearly.sh/docs/mcp).
66
+
67
+ ### 2. Verify
68
+
69
+ Run `/mcp` in Claude Code, or `codex mcp list` in Codex. You should see `clearly` authenticated
70
+ with **7 tools**:
71
+
72
+ **Seven MCP tools, split by what they DO rather than by what they act on.** The four CRUD tools
73
+ cover every artifact type — document, canvas, sheet, deck, board, ticket, project — so the tool fixes
74
+ whether it reads or writes and `type` says what it touches.
75
+
76
+ - **`clearly_catalog`** — optional, lazy machine-readable schemas. Use `{ type, operation }` before a type-specific write/edit; omit both for the compact capability overview.
77
+ - **`clearly_read` / `clearly_create` / `clearly_edit` / `clearly_replace` / `clearly_delete`** — open one, make a new one, change part of one, overwrite one's whole body, archive one. Each takes a uniform same-operation `batch`.
78
+ - **`clearly_comment`** — comment on any item (with @mentions), or send and reply to messages.
79
+ - **`clearly_grep` / `clearly_glob`** — find by content, find by name. Both span notes and code.
80
+
81
+ Addressed by `target`: a path (`~/Q1/Plan.md`), a key (`CLR-42`) or an id. Folders are projects,
82
+ documents are `.md`, canvases are `.scene.json` — the extension names the type, and you pass `type`
83
+ when it does not.
84
+
85
+ **Everything else is the `beehaven` CLI**, by action name — the canvas, the Company Brain, skills,
86
+ scheduling, stickers, billing. `beehaven actions` lists them; `beehaven call <action> '<json>'` runs
87
+ one:
88
+
89
+ ```bash
90
+ beehaven call context-search '{"query":"per-seat billing","scope":"org"}'
91
+ beehaven call canvas-act '{"compositionId":"c_…","batch":[…]}'
92
+ ```
93
+
94
+ ⚠ **That split is deliberate, not a gap.** A single tool that runs whatever action the caller names
95
+ spans safe and unsafe operations at once — a connector-directory rejection criterion, and one the
96
+ criteria explicitly refuse to let a description paper over. So the generic door is the shell, where
97
+ Claude Code already lives and where every call is attributed to your agent.
98
+
99
+ > ⚠ **Everything requires authentication.** There is no anonymous surface: as of 2026-09-11 both
100
+ > `tools/list` and `tools/call` resolve a credential first, and every credential is bound to an
101
+ > agent. A 401 carries an OAuth challenge, so a capable client can recover from it by itself —
102
+ > but a caller with no token sees no catalog, by design.
103
+
104
+ ## Install the CLI — the other half of the surface
105
+
106
+ The seven MCP tools cover reading, writing and searching artifacts. **Everything else — the canvas,
107
+ the Company Brain, skills, stickers — is reached with `beehaven`**, and the skills in this plugin
108
+ assume it is on PATH. Claude Code has a shell, so this is one command:
109
+
110
+ ```bash
111
+ curl -fsSL https://clearly.sh/install.sh | sh
112
+ beehaven login # once, opens a browser
113
+ beehaven status # daemon + relay, both should read UP
114
+ ```
115
+
116
+ ⚠ **`beehaven: command not found` is the failure to expect**, and it does not look like a missing
117
+ install — it looks like the skill being wrong. If a `beehaven call …` line fails that way, install
118
+ it rather than reaching for an MCP tool that does not exist.
119
+
120
+ ⚠ **Do not restart the user's daemon to fix something.** It is theirs; `beehaven status` tells you
121
+ what is wrong and the message says which command fixes it.
122
+
123
+ Then load the usage skill: it teaches the Company Brain + self-prompting loops — see `clearly-workflows`.
124
+
125
+ A quick functional test:
126
+ > "Map my Clearly workspace's brain using the clearly MCP."
127
+
128
+ If Claude calls `clearly_catalog` and gets back the artifact types with their capabilities, the connection is live. It is a connection check and schema lookup, not a required preflight for ordinary reads/deletes.
129
+
130
+ ## Troubleshooting
131
+
132
+ - **`Missing scope "rpc:write"`** — the sign-in didn't grant write access. Run `claude mcp logout clearly`, then re-authenticate (`/mcp` → **Authenticate**) and approve the write scope.
133
+ - **`Not authenticated` / calls rejected** — the session expired or was revoked. Re-authenticate with `claude mcp login clearly` (or `/mcp` → **Authenticate**).
134
+ - **`clearly` shows in `/mcp` but as unauthenticated** — the endpoint is preconfigured by the plugin; you still need to complete the browser sign-in. Select `clearly` → **Authenticate**.
135
+ - **`Network error reaching ...`** — relay.clearly.sh might be down (rare); check https://clearly.sh status page.
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: clearly-workflows
3
+ description: >-
4
+ Best with the beehaven CLI (semantic search and write-back); with only the Clearly connector, search with clearly_grep and record decisions with clearly_create.
5
+ Use the Clearly workspace as a COMPANY BRAIN — search the org's accumulated
6
+ context (decisions, facts, prompts, docs), write conclusions back so the next
7
+ agent inherits them instead of re-deriving them, and inherit the team's
8
+ skills. Use when a question is about what this company already decided or
9
+ knows, and after you work something out that the next person would otherwise
10
+ rediscover. Triggers: "what did we decide", "why did we do it this way", "has
11
+ anyone looked at this", "remember this", "write that down", "what do we know
12
+ about X", "company context", "our decisions", "prior art", "institutional
13
+ knowledge", "so nobody has to work this out again".
14
+ ---
15
+
16
+ > **Tool names below are written UNPREFIXED** (`clearly_read`). Your runtime may
17
+ > expose them with a server prefix — e.g.
18
+ > `mcp__plugin_clearly_clearly-staging__clearly_read`. **Match by suffix, not by
19
+ > exact name**: a skill written against the bare name resolves to nothing otherwise, and
20
+ > the failure looks like "the tool doesn't exist" rather than "the name is decorated".
21
+ >
22
+ > **If no such tool is callable at all**, the Clearly MCP server isn't authorised in this
23
+ > session — note that these skills still LIST when it isn't, so you find out by firing a
24
+ > dead call. Authorise it (`/mcp`, or `claude mcp`), or if you have a shell, use the
25
+ > `beehaven` CLI and its own `clearly-canvas` skill instead.
26
+
27
+ # Working a Clearly workspace (Company Brain)
28
+
29
+ Clearly is a **company brain over MCP**: every prompt + agent response is auto-cataloged into a searchable, ranked archive, with documents, decisions, and durable facts alongside. Treat it the way you'd treat a repo — read before you write, and write so the next agent inherits your work.
30
+
31
+ If the `clearly` server isn't connected yet, run the `clearly-init` skill first.
32
+
33
+ ## 1. Orient before you act
34
+
35
+ Run `beehaven call context-map` once at the start. It returns the brain's size (prompts / responses / facts), the recurring topics, and the org/teams it can federate across. Use it to decide whether the answer already exists.
36
+
37
+ ## 2. Retrieve context (don't re-derive it)
38
+
39
+ `beehaven call context-search '{ "query": …, "scope"?, "kinds"?, "limit"? }'` is ONE ranked search across prompts, agent responses, documents/PRDs, and facts — use it instead of guessing or asking the user what they already decided.
40
+
41
+ - `scope: "workspace"` (default) searches this workspace.
42
+ - `scope: "org"` **federates across every workspace in the org**, merges + re-ranks by relevance, and excludes private artifacts + personal facts. Use it for "what has anyone on the team decided/built about X".
43
+ - `kinds`: narrow to `["document"]`, `["prompt"]`, etc.
44
+
45
+ Each hit carries `kind`, `ref` (the id to fetch in full), `title`, `snippet`, `score`, and `meta` (intent, tags, `sourceWorkspace`).
46
+
47
+ **Always search before writing** — it prevents duplicate PRDs/decisions and surfaces prior context you'd otherwise miss.
48
+
49
+ ## 3. Write context BACK so it compounds
50
+
51
+ When you produce something durable — a PRD, a decision, a spec, a research summary — file it with `context-write`:
52
+
53
+ ```jsonc
54
+ beehaven call context-write '{
55
+ "title": "Per-seat billing decision",
56
+ "body": "We charge per seat; usage is per-seat with shared top-up overflow. Rationale: …",
57
+ "kind": "decision", // doc | note | decision | prd
58
+ "tags": ["billing","pricing"],
59
+ "fact": "Billing is per-seat with shared top-up", // optional one-line takeaway
60
+ "private": false // true → workspace-local, never federated across the org
61
+ }'
62
+ ```
63
+
64
+ It creates the document AND files a searchable catalog entry, so the very next `context-search` finds it. Mark anything sensitive `private: true`.
65
+
66
+ ⚠ **Why these are CLI calls and not MCP tools.** The MCP surface is seven tools split by what they do to an artifact (`clearly_catalog · _read · _write · _edit · _delete · _grep · _glob`); the Company Brain's verbs are workspace ACTIONS, reached by name through the shell. Once a document exists, `clearly_grep` and `clearly_read` open it like any other.
67
+
68
+ ## 4. Inherit the team's skills
69
+
70
+ The workspace has its own skills (procedures the team grew). Before improvising a multi-step task, check whether one exists:
71
+
72
+ - `beehaven call skill-list '{"includeWorkspace":true}'` → the skill cards (name + when-to-use).
73
+ - `beehaven call skill-get '{"id":"…"}'` → the full step-by-step instructions for the one whose trigger matches.
74
+
75
+ Follow the loaded procedure rather than inventing your own — that's how you work *the way this workspace works*.
76
+
77
+ ## Anything else
78
+
79
+ `beehaven actions` lists every workspace action with its description; `beehaven call <action> '<json>'` runs one. Reach for these when the seven MCP tools don't cover what you need — which is most things beyond reading, writing and searching artifacts.
80
+
81
+ ## Rules of thumb
82
+
83
+ - **Read → act → write back.** Search first; file durable outcomes so they persist.
84
+ - **`scope:"org"`** for cross-team questions; **`private:true`** for sensitive writes.
85
+
86
+ <!-- A "Schedule your future self" section documenting `clearly_schedule_wake` was removed on
87
+ 2026-08-02: the tool is in ZERO entries of mcp-server.ts's tool list and `schedule-wake` is
88
+ not a registered RPC, so every example here failed. Restore only when it is in tools/list. -->
89
+
90
+ - **Check `beehaven call skill-list`** before hand-rolling a known procedure.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: clearly-workspace
3
- description: Understand and audit a Clearly workspace from the terminal — what it holds (documents, projects, boards, tickets, thoughts, files, agents), who authored what, and which known data defects are present. Run `survey.mjs` for the whole picture in one command. TRIGGER when the user asks "what is in this workspace", "how big is this workspace", "audit / survey / check the workspace", "what have my agents made", "is anything broken in here", "who created these", or before any cleanup, migration or backfill — the survey is what tells you whether a repair is needed and whether it worked. NOT for editing documents (use `document-*`) or drawing on a canvas (use clearly-canvas).
3
+ description: Needs a terminal with the beehaven CLI (Claude Code, Codex, Gemini CLI); in a chat with only the Clearly connector, say so and use the clearly_* tools instead. Understand and audit a Clearly workspace from the terminal — what it holds (documents, projects, boards, tickets, thoughts, files, agents), who authored what, and which known data defects are present. Run `survey.mjs` for the whole picture in one command. TRIGGER when the user asks "what is in this workspace", "how big is this workspace", "audit / survey / check the workspace", "what have my agents made", "is anything broken in here", "who created these", or before any cleanup, migration or backfill — the survey is what tells you whether a repair is needed and whether it worked. NOT for editing documents (use `document-*`) or drawing on a canvas (use clearly-canvas).
4
4
  ---
5
5
 
6
6
  # clearly-workspace — know what you are standing in
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: codebase-map
3
- description: Walk a code repository and draw a living ARCHITECTURE MAP of it on a Clearly spatial canvas — modules as frames (sized by LOC, colored by layer), key files as nodes, imports/dependencies as arrows — so the big pieces, how they depend on each other, and where the complexity sits all read at a glance. Load this when the user says "map / diagram / visualize this codebase / repo / architecture", "how is this project structured", "draw the dependency graph", "give me an architecture overview", or when you're onboarding to an unfamiliar repo and need to see its shape fast.
3
+ description: Needs a terminal with the beehaven CLI (Claude Code, Codex, Gemini CLI); in a chat with only the Clearly connector, say so and use the clearly_* tools instead. Walk a code repository and draw a living ARCHITECTURE MAP of it on a Clearly spatial canvas — modules as frames (sized by LOC, colored by layer), key files as nodes, imports/dependencies as arrows — so the big pieces, how they depend on each other, and where the complexity sits all read at a glance. Load this when the user says "map / diagram / visualize this codebase / repo / architecture", "how is this project structured", "draw the dependency graph", "give me an architecture overview", or when you're onboarding to an unfamiliar repo and need to see its shape fast.
4
4
  ---
5
5
 
6
6
  > **⚠ CANVAS WORK GOES THROUGH THE CLI, NOT AN MCP TOOL.** Anything written
@@ -114,8 +114,9 @@ divided by the ratio. Sizes that share a ratio look related; sizes picked by han
114
114
  make them obviously different in class (a grotesque with a serif), never two neighbours.
115
115
  - **Measure: 45–75 characters.** At 16px in a normal grotesque that is roughly **360–600px**.
116
116
  Set the text node's `w` to hold that, not to fill the column.
117
- - **Line height moves INVERSELY to size.** Body 1.4–1.6. Subheads 1.25–1.35. Display
118
- **0.95–1.05** — big type needs tight leading or it falls apart into stripes.
117
+ - **Line height defaults to Auto**, using the font's metrics. When tuning it deliberately,
118
+ use **140–160%** for body, **125–135%** for subheads, and **95–105%** for display type.
119
+ Author explicit units (`lineHeight:"140%"` or `"24px"`); percentage leading follows font size.
119
120
  - ⚠⚠ **TRACK DISPLAY TYPE NEGATIVE.** Type designed at 16px is far too loose at 120px.
120
121
  Above ~40px use `letterSpacing: -1` to `-4`; above ~120px, −3 to −6. **Uppercase and small
121
122
  labels go the other way: +1 to +3.** This one adjustment does more for perceived quality
@@ -250,8 +251,8 @@ only to show that a review happened.
250
251
 
251
252
  **A 1080×1350 social post**
252
253
  ```
253
- margin 72 · display 96–140 (weight 800, tracking −3, lineHeight 1.0)
254
- body 20–24 (weight 500, lineHeight 1.5, w ≤ 560)
254
+ margin 72 · display 96–140 (weight 800, tracking −3, lineHeight "100%")
255
+ body 20–24 (weight 500, lineHeight "150%", w ≤ 560)
255
256
  caption 16 (weight 600, tracking +1.5, uppercase)
256
257
  rule 2–3px accent · footer block bottom-aligned at 1350 − 72 − blockHeight
257
258
  ```
@@ -265,7 +266,7 @@ Content column ≤ 1200 wide even though the slide is 1920 — full width is unr
265
266
 
266
267
  **A 1440 web hero**
267
268
  ```
268
- margin 96 · content max 1200 · headline 64–88 (tracking −2, lineHeight 1.05)
269
+ margin 96 · content max 1200 · headline 64–88 (tracking −2, lineHeight "105%")
269
270
  sub 20–24 (muted ink, w ≤ 640) · CTA 48–56 tall, 24–32 horizontal padding, radius 8 or full
270
271
  ```
271
272
 
@@ -273,7 +274,9 @@ sub 20–24 (muted ink, w ≤ 640) · CTA 48–56 tall, 24–32 horizontal paddi
273
274
  ```
274
275
  padding 24–32 · radius 10–16 · gap between cards ≥ 2× padding
275
276
  title 20–24/600 · body 15–16/400 muted · one accent element maximum
276
- Background first, THEN the label — later nodes draw over earlier ones.
277
+ Use a filled frame that owns the card's contents. Apply auto layout with this padding
278
+ and a deliberate content gap; let text hug its height. Rectangles serve artwork,
279
+ swatches and rules. A background rectangle with sibling text does not form a card.
277
280
  ```
278
281
 
279
282
  ---
package/skills/index.json CHANGED
@@ -17,21 +17,21 @@
17
17
  "project-plans.md",
18
18
  "review.mjs"
19
19
  ],
20
- "sha": "7d79406b37f611a8"
20
+ "sha": "5daf296f2bdf65e6"
21
21
  },
22
22
  {
23
23
  "name": "agent-home",
24
24
  "files": [
25
25
  "SKILL.md"
26
26
  ],
27
- "sha": "0bbcdbd33cfb11a3"
27
+ "sha": "e1d18e7518ff4b65"
28
28
  },
29
29
  {
30
30
  "name": "agent-doodle-space",
31
31
  "files": [
32
32
  "SKILL.md"
33
33
  ],
34
- "sha": "053fc1cd5a1494d4"
34
+ "sha": "1e1911e6d8784476"
35
35
  },
36
36
  {
37
37
  "name": "design-craft",
@@ -39,35 +39,35 @@
39
39
  "SKILL.md",
40
40
  "references.md"
41
41
  ],
42
- "sha": "bf2f4fac6f57ea46"
42
+ "sha": "d11f0c45c93c9dea"
43
43
  },
44
44
  {
45
45
  "name": "layout-systems",
46
46
  "files": [
47
47
  "SKILL.md"
48
48
  ],
49
- "sha": "8de89b7b7c86f81f"
49
+ "sha": "27151a50e3bdb27a"
50
50
  },
51
51
  {
52
52
  "name": "brand-identity",
53
53
  "files": [
54
54
  "SKILL.md"
55
55
  ],
56
- "sha": "cd891499599ccb7b"
56
+ "sha": "366139b11ff11b58"
57
57
  },
58
58
  {
59
59
  "name": "pair-on-canvas",
60
60
  "files": [
61
61
  "SKILL.md"
62
62
  ],
63
- "sha": "65f87e74bf3566a6"
63
+ "sha": "1d79147baa8c232d"
64
64
  },
65
65
  {
66
66
  "name": "codebase-map",
67
67
  "files": [
68
68
  "SKILL.md"
69
69
  ],
70
- "sha": "2e80ffd32f77327f"
70
+ "sha": "4a4af2229b68827d"
71
71
  },
72
72
  {
73
73
  "name": "clearly-workspace",
@@ -75,13 +75,48 @@
75
75
  "SKILL.md",
76
76
  "survey.mjs"
77
77
  ],
78
- "sha": "f5585be212a67c32"
78
+ "sha": "3a3e6fa6e3cf8717"
79
79
  },
80
80
  {
81
81
  "name": "clearly-agent",
82
82
  "files": [
83
83
  "SKILL.md"
84
84
  ],
85
- "sha": "b3f47988cb9235b9"
85
+ "sha": "c20b255224221342"
86
+ },
87
+ {
88
+ "name": "visualize",
89
+ "files": [
90
+ "SKILL.md"
91
+ ],
92
+ "sha": "88bb6e94fb37c337"
93
+ },
94
+ {
95
+ "name": "sticker-pack",
96
+ "files": [
97
+ "SKILL.md"
98
+ ],
99
+ "sha": "74af254817a134d6"
100
+ },
101
+ {
102
+ "name": "clearly-docs",
103
+ "files": [
104
+ "SKILL.md"
105
+ ],
106
+ "sha": "388be4de86f59eb4"
107
+ },
108
+ {
109
+ "name": "clearly-init",
110
+ "files": [
111
+ "SKILL.md"
112
+ ],
113
+ "sha": "d4dfdd76c7c0a108"
114
+ },
115
+ {
116
+ "name": "clearly-workflows",
117
+ "files": [
118
+ "SKILL.md"
119
+ ],
120
+ "sha": "b9622f21173bab0d"
86
121
  }
87
122
  ]
@@ -47,7 +47,7 @@ that lost one. If you have four items, ask whether one is really a different thi
47
47
  ```
48
48
  margin 8–10% of the short edge (1080 → 88–108; A3 → 280–350)
49
49
  display 12–20% of the HEIGHT (1350 → 160–270px), weight 700–900, tracking −3 to −6,
50
- lineHeight 0.92–1.0
50
+ lineHeight "92%"–"100%"
51
51
  supporting 2–3% of height credits, date, venue — deliberately small
52
52
  ```
53
53
 
@@ -105,7 +105,7 @@ content column ≤ 1200 even though the slide is 1920
105
105
  ## Landing page / hero — 1440 wide (design), content max 1200
106
106
 
107
107
  ```
108
- margin 96 · headline 64–88 (tracking −2, lineHeight 1.05) · sub 20–24 muted, w ≤ 640
108
+ margin 96 · headline 64–88 (tracking −2, lineHeight "105%") · sub 20–24 muted, w ≤ 640
109
109
  CTA 48–56 tall, 24–32 horizontal padding · section spacing 96–160 vertical
110
110
  ```
111
111
 
@@ -124,7 +124,7 @@ CTA 48–56 tall, 24–32 horizontal padding · section spacing 96–160 vertica
124
124
 
125
125
  ```
126
126
  margin: outer 10%, inner (gutter side) 12–14% — asymmetric, because the binding eats it
127
- columns 2–3 for A4 body · measure 45–75ch · body 10–11pt (≈42–46px at 300dpi), lineHeight 1.45
127
+ columns 2–3 for A4 body · measure 45–75ch · body 10–11pt (≈42–46px at 300dpi), lineHeight "145%"
128
128
  ```
129
129
 
130
130
  - **Asymmetric margins are the mark of real editorial.** Equal margins all round read as a
@@ -141,9 +141,9 @@ columns 2–3 for A4 body · measure 45–75ch · body 10–11pt (≈42–46px a
141
141
  ## Cards, tables and dense UI
142
142
 
143
143
  - **Card padding 24–32, radius 10–16, gap between cards ≥ 2× padding.**
144
- - ⚠⚠ **BACKGROUND FIRST, LABEL SECOND.** Later nodes draw over earlier ones — create the
145
- card rect, THEN its text. Reversed, the opaque fill hides the label and you get the classic
146
- "grid of cards with no text".
144
+ - **Cards are filled frames.** Parent labels, icons and controls to the card; use auto
145
+ layout for its content. Build rows and grids from these cards, with deliberate
146
+ Hug/Fill/Fixed sizing. Reserve rectangles for decorative shapes, swatches and rules.
147
147
  - **In tables, align numbers RIGHT and use tabular figures.** Left-aligned numbers of
148
148
  different lengths cannot be compared, which is the only reason the table exists.
149
149
  - **Zebra striping OR rules, never both.** Ideally neither — space is enough at ≥12px row padding.
@@ -153,10 +153,13 @@ columns 2–3 for A4 body · measure 45–75ch · body 10–11pt (≈42–46px a
153
153
  ## Building it on the canvas
154
154
 
155
155
  ```jsonc
156
- // ONE batch. Frames first, then children with parentId (x/y RELATIVE to the frame).
157
- {"action":"frame.create","args":{"name":"poster","x":200,"y":300,"w":1080,"h":1350,"fill":"#111111"}}
158
- {"action":"canvas.create-node","args":{"name":"headline","type":"text","parentId":"poster",
159
- "x":88,"y":900,"w":904,"text":"…","size":180,"fontWeight":800,"letterSpacing":-5,"lineHeight":0.95}}
156
+ // ONE batch. A content stack owns its fill and children; the layout computes positions.
157
+ {"action":"frame.create","args":{"id":"card","name":"Feature card","w":360,"h":200,"fill":"#FFFFFF"}}
158
+ {"action":"canvas.create-node","args":{"name":"Feature title","type":"text","parentId":"card",
159
+ "w":312,"text":"Make room for the idea","size":28,"fontWeight":600,"lineHeight":"auto"}}
160
+ {"action":"canvas.create-node","args":{"name":"Feature detail","type":"text","parentId":"card",
161
+ "w":312,"text":"Keep every layer ready for the next edit.","size":16,"lineHeight":"145%"}}
162
+ {"action":"canvas.auto-layout","args":{"id":"card","direction":"v","gap":16,"padding":24,"sizingH":"fixed","sizingV":"hug"}}
160
163
  ```
161
164
 
162
165
  - ⚠ **Omit `h` on text** — it hugs its wrapped content. Pin `h` only when a later element's
@@ -180,5 +183,5 @@ columns 2–3 for A4 body · measure 45–75ch · body 10–11pt (≈42–46px a
180
183
  | Deck | too many words; title states the topic instead of the argument; full-width text |
181
184
  | Landing | subhead runs full width; two competing CTAs; sections evenly spaced |
182
185
  | Editorial | symmetric margins; no baseline grid; unbroken columns |
183
- | Cards | text created before its background; gaps equal to padding so groups do not read |
186
+ | Cards | background and contents lack a shared frame; layout breaks when copy grows |
184
187
  | **All** | **an exact 50/50 split, and four type sizes where three would do** |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pair-on-canvas
3
- description: Use a Clearly canvas as mission control for a coding task — read the spec the human placed on the board, do the work in the repo, and report progress, diffs, and next steps back as cards they steer by inking. Load this when the user says "work the task on my canvas", "take this from the board", "what's on my Clearly canvas", "pick up the spec", "let's pair on the canvas", or whenever a human is directing your coding work spatially instead of in a chat thread.
3
+ description: Needs a terminal with the beehaven CLI (Claude Code, Codex, Gemini CLI); in a chat with only the Clearly connector, say so and use the clearly_* tools instead. Use a Clearly canvas as mission control for a coding task — read the spec the human placed on the board, do the work in the repo, and report progress, diffs, and next steps back as cards they steer by inking. Load this when the user says "work the task on my canvas", "take this from the board", "what's on my Clearly canvas", "pick up the spec", "let's pair on the canvas", or whenever a human is directing your coding work spatially instead of in a chat thread.
4
4
  ---
5
5
 
6
6
  > **⚠ CANVAS WORK GOES THROUGH THE CLI, NOT AN MCP TOOL.** Anything written
@@ -0,0 +1,132 @@
1
+ ---
2
+ name: sticker-pack
3
+ description: Needs a terminal with the beehaven CLI (Claude Code, Codex, Gemini CLI); in a chat with only the Clearly connector, say so and use the clearly_* tools instead. Turn an idea into a printable, die-cut STICKER SHEET on a Clearly canvas — Clearly's own sticker-vending-machine pipeline surfaced as an agent skill. Generates a cohesive SET of transparent stickers, lays them out as a sheet (frame + gridded stickers + a vector kiss-cut cutline layer), and hands back a print-ready bundle. Load this when the user says "make me stickers / a sticker pack / a sticker sheet about X", "turn this into stickers", "design stickers for my brand / startup / cat", or "I want die-cut stickers". The fun, inherently-shareable corner of the canvas skill set.
4
+ ---
5
+
6
+ > **⚠ CANVAS AND STICKER WORK GO THROUGH THE CLI, NOT AN MCP TOOL.** Anything written
7
+ > `beehaven call <action>` below is a literal command. The MCP surface is seven tools split
8
+ > by operation; the ~1,000 workspace actions are reached by name through the shell.
9
+
10
+ # Sticker pack — idea → printable die-cut sheet
11
+
12
+ Stickers are the most organically viral thing Clearly makes: a generated die-cut pack someone actually prints and slaps on a laptop *is* the share. This skill drives Clearly's real sticker-vending pipeline — the same one behind the studio — straight onto a canvas.
13
+
14
+ Install the `beehaven` CLI, sign in as an agent, and connect the intended workspace first
15
+ (`clearly-init` handles setup). Then read `clearly-canvas` for the primitives and the
16
+ perceive→act→revise loop. This skill adds the **generation** step on top of it.
17
+
18
+ ## The one core tool (and a heads-up)
19
+
20
+ The sticker pipeline runs through **`sticker-sheet-gen`**, a real workspace action. It is NOT (yet) a dedicated MCP tool, so you call it through the generic dispatcher:
21
+
22
+ ```jsonc
23
+ beehaven call sticker-sheet-gen '{ … }'
24
+ ```
25
+
26
+ > ⚠ **This is a CLI action, not an MCP tool, and that is settled rather than pending.**
27
+ > `clearly_sticker_generate` **does not exist** and is not planned — an earlier version of this
28
+ > note called it a missing piece. The MCP surface is seven tools split by operation, and a
29
+ > per-feature tool for every workspace action is the 139-tool surface that was withdrawn. The
30
+ > action is production code — the same pipeline the paid studio uses — and the CLI reaches it with
31
+ > full attribution.
32
+
33
+ **It is slow (30–90s), async, and costs the user a sheet credit.** Pass a `compositionId` and the pipeline does the canvas work for you: when the art lands, it places a **transparent parent frame ("Sticker sheet")**, every cut-out sticker nested as its own `image` node (drag one out!), and the **die-cut contour as a nested vector `svg` layer ("Cutline (kiss-cut)")**. The cutline is true vector — exported as the spot cut layer, never rasterized.
34
+
35
+ The call awaits the pipeline (racing a 90s timeout) so you usually get the **full result back** — `{ ok, sheetId, stickerCount, sheetUrl, placed }`. If it ran long you get `{ sessionId, timedOut: true }`; then perceive until the frame appears (see step 2).
36
+
37
+ ## 1. Brief — turn the idea into a cohesive set
38
+
39
+ Don't just forward the user's sentence. Shape it into a **set with a through-line**: one subject family, one style, one palette, consistent line weight. Then list the concepts back before spending the credit.
40
+
41
+ > *"Stickers for your plant shop — I'm thinking a cohesive 9-sticker set, flat-color cottagecore, sage + terracotta palette, chunky outlines: 1) monstera leaf, 2) watering can, 3) 'plant mom' badge, 4) terracotta pot, 5) snail, 6) sun, 7) 'grow' lettering, 8) seed packet, 9) trowel. Generate this sheet?"*
42
+
43
+ A sticker sheet is ONE generation, not N — the model draws the whole cohesive grid. So the brief = the `prompt` (subject + vibe + palette), plus `style` and `stickerCount`.
44
+
45
+ ## 2. Generate — one call, drop on the canvas
46
+
47
+ Make a canvas first (or reuse one), then fire the gen with `compositionId` so it lands:
48
+
49
+ ```jsonc
50
+ beehaven call composition-create '{ "title": "Plant shop stickers" }'
51
+ // → { "id": "c_…" }
52
+
53
+ beehaven call sticker-sheet-gen '{
54
+ "compositionId": "c_…",
55
+ "prompt": "cottagecore plant-shop stickers: monstera leaf, watering can, terracotta pot, snail, sun, seed packet — flat color, chunky outlines, sage green + terracotta palette",
56
+ "style": "cottagecore",
57
+ "stickerCount": 9,
58
+ "bleedStyle": "halo",
59
+ "aspectRatio": "2:3"
60
+ }'
61
+ // → { ok:true, sheetId:"sht_…", stickerCount:9, sheetUrl:"https://…", placed:{ stickers:9, cutline:true } }
62
+ ```
63
+
64
+ Input shape (all optional except `prompt`):
65
+
66
+ | Field | Meaning |
67
+ |---|---|
68
+ | `prompt`* | what the stickers depict — subject, vibe, palette |
69
+ | `compositionId` | **pass it** — the canvas to drop the sheet onto (placeholder + frame + cutline) |
70
+ | `style` | preset: `kawaii`, `planner`, `cottagecore`, `doodle`, … (omit → inferred) |
71
+ | `stickerCount` | stickers on the sheet (e.g. 9, 16, 30). Default 30 |
72
+ | `bleedStyle` | `halo` (default — white sticker outline) or `full-bleed` |
73
+ | `aspectRatio` | sheet ratio: `1:1` `2:3` `3:2` `3:4` `4:3` `9:16` `16:9` |
74
+ | `quality` | `standard` (default, 4K) or `premium` |
75
+ | `seed` | reproducibility |
76
+
77
+ **Handle the async/loading case.** If the response is `{ sessionId, timedOut: true }` (no `placed`), the gen is still running — the ⏳ placeholder is already on the canvas. Poll until the real frame lands:
78
+
79
+ ```jsonc
80
+ canvas-perceive { "compositionId": "c_…", "format": "text" }
81
+ // look in `contents` for a frame named "Sticker sheet" with image children
82
+ // + an svg layer "Cutline (kiss-cut)". When it's there, the sheet is done.
83
+ ```
84
+
85
+ On a hard failure the response carries an `error` (`no_exports_remaining` → user needs to buy a sheet; `rate_limit_exceeded` → back off `retryAfter`s) and the credit is auto-refunded — relay that plainly, don't retry blindly.
86
+
87
+ ## 3. The sheet is already laid out — make it presentable
88
+
89
+ The pipeline placed the frame, the cut-out stickers (gridded, native pixel size), and the cutline layer in ONE write. Your job is polish, via `canvas-act` (see `clearly-canvas`):
90
+
91
+ - **Perceive first**, read the `backgroundColor`, then drop a `text` title over the frame: "Plant shop · 9 stickers · kiss-cut".
92
+ - A tiny caption noting the **"Cutline (kiss-cut)"** layer is the spot cut path (vector) — toggle it to preview the die-cut.
93
+ - If the grid is cramped, `canvas.update-nodes` to nudge the frame into the user's `gaze`.
94
+
95
+ Don't rebuild the grid by hand — the pipeline already nested everything correctly. Only add labels + framing context.
96
+
97
+ ## 4. Export — the printable bundle
98
+
99
+ When they're happy, pull the print kit:
100
+
101
+ ```jsonc
102
+ beehaven call sticker-sheet-export '{ "sheetId": "sht_…" }'
103
+ // → { zipUrl, pdfUrl, sheetUrl, stickerUrls:[…], stickerCount, hasCutFile:true }
104
+ ```
105
+
106
+ - `zipUrl` — the FULL kit: print-ready **PDF** + **cut-file SVG** (the spot cut layer) + every individual sticker PNG + the composited sheet.
107
+ - `pdfUrl` — drop straight into a Cricut / Roland / Stickermule flow.
108
+ - Omit `sheetId` to export their most recent sheet.
109
+
110
+ Hand the user the `pdfUrl` / `zipUrl` and tell them the SVG cut file is what a plotter reads for the die-cut contour.
111
+
112
+ ## 5. Keep the human in the loop
113
+
114
+ The whole point of the canvas is steering by gesture. After the sheet lands: *"It's on your canvas — tell me 'more like #2', 'swap to a blue palette', or 'add a cat'."* Then re-run `sticker-sheet-gen` with the revised `prompt`/`style`/`seed` (reuse `seed` to keep a look, change it to re-roll), and re-perceive. Iterate until they love it, *then* export.
115
+
116
+ ## The viral bit
117
+
118
+ A real die-cut pack — transparent stickers, a visible kiss-cut contour, a print-ready PDF the user actually sends to a sticker printer — is the single most shareable output Clearly has. People post the laptop, not the prompt. So make every sheet land clean: cohesive set, honest cutline, one screenshot that reads as "I generated these and printed them." The sticker IS the share.
119
+
120
+ ## Single-sticker fallback
121
+
122
+ For ONE vector sticker (not a sheet), draw it natively with `canvas-act` like a designer: shapes and `vector.create` pen paths in a frame, named and grouped, with the white border as its own closed path behind the art. Use `studio-image-generate` for a painterly raster sticker, and `format:'svg'` only when a generated SVG file is asked for. If `sticker-sheet-gen` is ever unavailable, the manual sheet = `studio-image-generate` per concept (transparent), then `canvas-act` → `frame.create` + one `canvas.create-node {type:'image'}` per sticker on a grid + a closed `vector.create` cutline outline. But that's the cold path — the pipeline above is the real, supported one.
123
+
124
+ ## Rules of thumb
125
+
126
+ - **One gen = one whole sheet.** Don't loop the call per sticker; the model draws the cohesive grid in a single pass.
127
+ - **Always pass `compositionId`** — that's what lands the placeholder, frame, stickers, and cutline. No `compositionId` = no canvas output.
128
+ - **It's slow + costs a credit.** Confirm the brief BEFORE generating; relay `no_exports_remaining` / `rate_limit_exceeded` plainly (credit auto-refunds on failure).
129
+ - **`timedOut:true` ≠ failed** — the gen is still running; `canvas-perceive` until the "Sticker sheet" frame appears.
130
+ - **The cutline is vector** ("Cutline (kiss-cut)" svg layer) — it's the spot cut path; the export SVG/PDF is what a plotter cuts.
131
+ - **Iterate by re-genning**, reuse `seed` to hold a look, then **export last**.
132
+ - **Reach `sticker-sheet-gen` / `sticker-sheet-export` with `beehaven call`** — they are workspace actions, not MCP tools, and will not become tools.