@ammduncan/easel 0.2.6 → 0.2.8
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 +12 -0
- package/README.md +15 -5
- package/dist/mcp.js +11 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to easel. This project adheres to [Semantic Versioning](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## 0.2.8 — 2026-05-22
|
|
6
|
+
|
|
7
|
+
### Docs
|
|
8
|
+
- README now documents Codex as a supported client (added in 0.2.5 but missed in the doc pass). "Works with" list, install commands, config-path table, CLI help text, and file map all updated.
|
|
9
|
+
|
|
10
|
+
## 0.2.7 — 2026-05-22
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **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.
|
|
14
|
+
- 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.
|
|
15
|
+
- 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.
|
|
16
|
+
|
|
5
17
|
## 0.2.6 — 2026-05-22
|
|
6
18
|
|
|
7
19
|
### Fixed
|
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ A live browser tab for every AI coding session. Agents push HTML — explanation
|
|
|
15
15
|
└────────────────────────────────────────────┘ └────────────────────────────────────┘
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
Works with **Claude Code**, **Cursor**, **Claude Desktop**, **Windsurf**, and any other MCP-speaking client.
|
|
18
|
+
Works with **Claude Code**, **Cursor**, **Claude Desktop**, **Windsurf**, **Codex**, and any other MCP-speaking client.
|
|
19
19
|
|
|
20
20
|
## Why
|
|
21
21
|
|
|
@@ -33,7 +33,7 @@ npx -y @ammduncan/easel setup
|
|
|
33
33
|
|
|
34
34
|
That registers the MCP at user scope, installs the `using-easel` skill so the agent knows when to push, and adds the `SessionStart` hooks that resolve session IDs and auto-open the tab. Restart Claude Code and you're done.
|
|
35
35
|
|
|
36
|
-
### Cursor / Claude Desktop / Windsurf
|
|
36
|
+
### Cursor / Claude Desktop / Windsurf / Codex
|
|
37
37
|
|
|
38
38
|
One command per client:
|
|
39
39
|
|
|
@@ -41,9 +41,19 @@ One command per client:
|
|
|
41
41
|
npx -y @ammduncan/easel setup --client cursor
|
|
42
42
|
npx -y @ammduncan/easel setup --client claude-desktop
|
|
43
43
|
npx -y @ammduncan/easel setup --client windsurf
|
|
44
|
+
npx -y @ammduncan/easel setup --client codex
|
|
44
45
|
```
|
|
45
46
|
|
|
46
|
-
Each writes the MCP entry to the client's config file
|
|
47
|
+
Each writes the MCP entry to the client's config file:
|
|
48
|
+
|
|
49
|
+
| Client | Config file |
|
|
50
|
+
|---|---|
|
|
51
|
+
| Cursor | `~/.cursor/mcp.json` |
|
|
52
|
+
| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) |
|
|
53
|
+
| Windsurf | `~/.codeium/windsurf/mcp_config.json` |
|
|
54
|
+
| Codex | `~/.codex/config.toml` — plus copies the `using-easel` skill into `~/.codex/skills/` |
|
|
55
|
+
|
|
56
|
+
Restart the client to load the MCP server.
|
|
47
57
|
|
|
48
58
|
### Any other MCP client
|
|
49
59
|
|
|
@@ -122,7 +132,7 @@ easel open ensure server is running, open this session's tab
|
|
|
122
132
|
easel url print this session's URL
|
|
123
133
|
easel config print / set { preset, theme, density }
|
|
124
134
|
easel setup Claude Code: hooks + MCP + skill
|
|
125
|
-
easel setup --client <name> register the MCP in another client (cursor, claude-desktop, windsurf)
|
|
135
|
+
easel setup --client <name> register the MCP in another client (cursor, claude-desktop, windsurf, codex)
|
|
126
136
|
easel restart kill + respawn the HTTP server (handy after a build)
|
|
127
137
|
easel update git pull + build + setup (clone installs only)
|
|
128
138
|
easel server run the HTTP server in the foreground (debug)
|
|
@@ -140,7 +150,7 @@ src/
|
|
|
140
150
|
session-store.ts disk persistence + retention sweep
|
|
141
151
|
session-id.ts 5-tier resolver (env / hook file / transcript scan / synthetic PPID)
|
|
142
152
|
config-store.ts preset / theme / density persistence
|
|
143
|
-
client-setup.ts per-client config writers (cursor, claude-desktop, windsurf)
|
|
153
|
+
client-setup.ts per-client config writers (cursor, claude-desktop, windsurf, codex)
|
|
144
154
|
paths.ts shared constants + legacy-dir migration
|
|
145
155
|
cli.ts `easel open|url|setup|config|server|restart|update|version`
|
|
146
156
|
client/
|
package/dist/mcp.js
CHANGED
|
@@ -122,6 +122,8 @@ export async function main() {
|
|
|
122
122
|
"• One accent color, 3–4 instances max per card. Status colors (red/amber/green) only when state genuinely maps to status.\n\n" +
|
|
123
123
|
"═══ WHEN TO PUSH ═══\n" +
|
|
124
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" +
|
|
125
127
|
"═══ OTHER ═══\n" +
|
|
126
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" +
|
|
127
129
|
"• `<script>` tags trying to mutate the parent window are sandbox-blocked; in-iframe `<script>` (for animations, charts, interactivity) is fine.",
|
|
@@ -138,7 +140,15 @@ export async function main() {
|
|
|
138
140
|
},
|
|
139
141
|
{
|
|
140
142
|
name: TOOL_LABEL,
|
|
141
|
-
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.",
|
|
142
152
|
inputSchema: {
|
|
143
153
|
type: "object",
|
|
144
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.8",
|
|
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",
|