@ammduncan/easel 0.2.5 → 0.2.7
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.
- package/CHANGELOG.md +13 -0
- package/dist/mcp.js +18 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to easel. This project adheres to [Semantic Versioning](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## 0.2.7 — 2026-05-22
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **Agents in non-Claude-Code clients (Claude Desktop, Cursor, etc.) weren't calling the `label` tool**, so their sessions stayed named after the cwd basename of wherever the client spawned the MCP child (often `home` or the user's username — unfindable in the switcher). Claude Code agents do call it because the `SessionStart` hook injects a strong "label NO LATER than your first push" directive; non-CC clients only see tool descriptions, and the old descriptions didn't carry the same urgency.
|
|
9
|
+
- The `label` tool description is now imperative: "as soon as the user's intent is clear, NO LATER than your first push", with format rules (1–8 words, sentence case, name the artefact not the verb) and good/bad examples.
|
|
10
|
+
- The `push` tool description now has a dedicated "BEFORE YOUR FIRST PUSH — LABEL THE SESSION" section that cross-references `label`, so agents see the cue at the moment they're about to push.
|
|
11
|
+
|
|
12
|
+
## 0.2.6 — 2026-05-22
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
- **Locked-mode containers (terminal mockups, code blocks, brand-color heros) had invisible text in light mode** when pushed from non-Claude-Code clients. The push tool description's "inverse rule" was stated in prose but had no copy-paste code example — and the wrap/card example used `light-dark()` while the agent then applied the same pattern to a locked-dark terminal, leaving its inner text on `color: inherit` (which resolved to the wrap's dark text in light mode → dark text on dark bg).
|
|
16
|
+
- Added a second copy-paste starter block specifically for locked-mode containers, showing the canonical pattern (`background: #0f172a; color: #e6edf3;` + re-scoping `color: inherit` to children). Right next to the adaptive wrap/card pattern so the agent can't miss the difference.
|
|
17
|
+
|
|
5
18
|
## 0.2.5 — 2026-05-22
|
|
6
19
|
|
|
7
20
|
### Added
|
package/dist/mcp.js
CHANGED
|
@@ -91,11 +91,17 @@ export async function main() {
|
|
|
91
91
|
"• Use `light-dark()` for ALL text colors, card backgrounds, borders, and decorative shades. Add `:root { color-scheme: light dark; }` so the function resolves. Hardcoded `color: #475569` goes invisible in dark mode; hardcoded `border: 1px solid #e5e5e5` becomes a hard white line.\n" +
|
|
92
92
|
"• After setting `.wrap { color: light-dark(...); }`, re-scope `color: inherit` to every descendant so child elements don't fall back to the host's default.\n" +
|
|
93
93
|
"• Inverse rule: if you DO paint a fixed background on a container (a code block locked to dark, a brand-color hero), you MUST also set its text color AND re-scope `color: inherit` to its children. Background and text are a pair.\n\n" +
|
|
94
|
-
"═══ COPY-PASTE STARTER ═══\n" +
|
|
94
|
+
"═══ COPY-PASTE STARTER (adaptive) ═══\n" +
|
|
95
95
|
" :root { color-scheme: light dark; }\n" +
|
|
96
96
|
" .wrap { color: light-dark(#111, #e8e8e8); padding: 56px 48px; font-family: -apple-system, 'Inter', system-ui, sans-serif; max-width: 820px; }\n" +
|
|
97
97
|
" .wrap *, .wrap h1, .wrap h2, .wrap h3, .wrap p, .wrap li, .wrap span { color: inherit; }\n" +
|
|
98
98
|
" .card { background: light-dark(#fff, #161616); border: 1px solid light-dark(#e0d9c3, #2a2a2a); border-radius: 12px; padding: 24px; }\n\n" +
|
|
99
|
+
"═══ COPY-PASTE STARTER (LOCKED-MODE container — terminal, code block, brand hero) ═══\n" +
|
|
100
|
+
"If a container has a FIXED background (not `light-dark()`), you MUST set its own text color AND re-scope `color: inherit` to its children. Otherwise the children inherit `light-dark(...)` from `.wrap` and the text flips to the wrong shade in one mode (e.g. dark text on a locked-dark terminal in light host mode → invisible). This is the #1 thing that goes wrong on terminals and code blocks.\n" +
|
|
101
|
+
" .terminal { background: #0f172a; color: #e6edf3; border-radius: 12px; padding: 20px 24px; font-family: ui-monospace, 'SF Mono', Menlo, monospace; font-size: 13.5px; line-height: 1.7; }\n" +
|
|
102
|
+
" .terminal *, .terminal span, .terminal pre { color: inherit; }\n" +
|
|
103
|
+
" .terminal .muted { color: #94a3b8; }\n" +
|
|
104
|
+
" .terminal .accent { color: #6ee7b7; }\n\n" +
|
|
99
105
|
"═══ TYPOGRAPHY (presentation scale, NOT dashboard) ═══\n" +
|
|
100
106
|
"• Hero title: 44–52px, weight 500, letter-spacing -0.025em\n" +
|
|
101
107
|
"• Section titles: 28–36px, weight 500\n" +
|
|
@@ -116,6 +122,8 @@ export async function main() {
|
|
|
116
122
|
"• One accent color, 3–4 instances max per card. Status colors (red/amber/green) only when state genuinely maps to status.\n\n" +
|
|
117
123
|
"═══ WHEN TO PUSH ═══\n" +
|
|
118
124
|
"A response that would otherwise contain: >2 paragraphs of explanation, any UI mockup, a diagram, a code diff, a ≥3-option comparison, or a multi-step progress view. Do NOT ask permission — push proactively. After pushing, reply in chat with ONE LINE: 'pushed to easel ↗ — #<index>'. Don't restate the card's content.\n\n" +
|
|
125
|
+
"═══ BEFORE YOUR FIRST PUSH — LABEL THE SESSION ═══\n" +
|
|
126
|
+
"Sessions without a label show up in the session switcher as the cwd basename (often something useless like 'ammielyawson' or 'home'), which is unfindable when the user has multiple tabs open. If you haven't called the `label` tool yet in this session, CALL IT NOW before pushing — pass a 1–8 word sentence-case name that describes what the session is about (good: 'SSE explainer', 'Onboarding flow comparison'; bad: 'Helping the user', 'Pushing some cards'). Re-call `label` when the work's theme shifts meaningfully.\n\n" +
|
|
119
127
|
"═══ OTHER ═══\n" +
|
|
120
128
|
"• Pass full HTML only — no Markdown. The iframe injects baseline typography so plain `<h1>/<p>` works without extra CSS, but for anything multi-section define your own `<style>` block.\n" +
|
|
121
129
|
"• `<script>` tags trying to mutate the parent window are sandbox-blocked; in-iframe `<script>` (for animations, charts, interactivity) is fine.",
|
|
@@ -132,7 +140,15 @@ export async function main() {
|
|
|
132
140
|
},
|
|
133
141
|
{
|
|
134
142
|
name: TOOL_LABEL,
|
|
135
|
-
description: "Set
|
|
143
|
+
description: "Set this session's display label — a short, human phrase that names what the chat is about (e.g. 'Roadworthy 401 fix', 'SSE explainer', 'Onboarding flow comparison'). The label replaces the cwd basename in the topbar, switcher dropdown, and session index, making the user's tabs findable.\n\n" +
|
|
144
|
+
"CALL THIS PROACTIVELY:\n" +
|
|
145
|
+
"• As soon as the user's intent is clear in this chat — and NO LATER than your first `push`.\n" +
|
|
146
|
+
"• Without a label, the session shows up as the cwd basename (often something useless like 'home' or 'ammielyawson' for desktop clients), which is unfindable when the user has multiple chat tabs open.\n" +
|
|
147
|
+
"• Re-call whenever the work's theme shifts meaningfully (e.g. user pivots from 'auth flow design' to 'session cleanup').\n\n" +
|
|
148
|
+
"FORMAT:\n" +
|
|
149
|
+
"• 1–8 words, sentence case, no trailing punctuation.\n" +
|
|
150
|
+
"• Name the ARTEFACT, not the verb. Good: 'RegistrationNumberInput extraction', 'SSE explainer', 'Onboarding A/B'. Bad: 'Extracting RegistrationNumberInput', 'Helping with onboarding', 'Pushing some cards'.\n\n" +
|
|
151
|
+
"Pass an empty string to clear back to the cwd basename.",
|
|
136
152
|
inputSchema: {
|
|
137
153
|
type: "object",
|
|
138
154
|
properties: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ammduncan/easel",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "A live browser tab for every Claude Code (and MCP) session. The push MCP tool appends HTML cards to a scrolling feed you keep open in split-screen.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|