@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 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 (`~/.cursor/mcp.json`, `~/Library/Application Support/Claude/claude_desktop_config.json`, or `~/.codeium/windsurf/mcp_config.json`). Restart the client to load it.
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 or update this Claude session's display label — a short, human phrase that names what the session is about (e.g. 'Roadworthy 401 fix', 'Bulk-add cost items redesign', 'Investigating slow query'). The label appears in the topbar, switcher dropdown, and session index, replacing the cwd basename. Call this proactively whenever the work's theme shifts so the user can navigate sessions by what they ARE, not where they live. Pass an empty string to clear back to cwd basename.",
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.6",
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",