hotsheet 0.17.0-beta.16 → 0.17.0-beta.19
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/README.md +34 -13
- package/dist/channel.js +7 -2
- package/dist/cli.js +292 -27
- package/dist/client/app.global.js +108 -108
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
|
|
11
11
|
<br>
|
|
12
12
|
|
|
13
|
-
**Hot Sheet** is a
|
|
13
|
+
**Hot Sheet** is a local-first project management tool wired into your AI coding workflow. Create tickets with a bullet-list interface, drag them into priority order, and your AI tools automatically get a structured worklist they can act on. A real PTY-backed terminal lives in the footer drawer — switch to the dashboard view to see every terminal across every project as a tile grid — so you can keep an eye on dev servers, tests, and the AI's own Claude Code session from the same window.
|
|
14
14
|
|
|
15
|
-
No cloud. No logins. No JIRA. Just tickets and a tight feedback loop.
|
|
15
|
+
No cloud. No logins. No JIRA. Just tickets, terminals, and a tight feedback loop.
|
|
16
16
|
|
|
17
17
|
<br>
|
|
18
18
|
|
|
@@ -96,20 +96,36 @@ The loop stays tight because the AI always knows what to work on next — and yo
|
|
|
96
96
|
<img src="docs/demo-5.png" alt="Multiple tickets selected with the batch toolbar and context menu" width="900">
|
|
97
97
|
</p>
|
|
98
98
|
|
|
99
|
-
**Detail panel** — side or bottom orientation (toggle in the toolbar), resizable, collapsible. Shows category, priority, status, and Up Next in a compact grid, plus title, details, tags, attachments, and editable notes. Click a note to edit inline; right-click to delete.
|
|
99
|
+
**Detail panel** — side or bottom orientation (toggle in the toolbar), resizable, collapsible. Shows category, priority, status, and Up Next in a compact grid, plus title, details, tags, attachments, and editable notes. Click a note to edit inline; right-click to delete. **Reader mode** (book icon) opens any note — or the details body — in a distraction-free overlay that you can step through with chevrons or arrow keys without re-clicking the icon.
|
|
100
100
|
|
|
101
101
|
<p align="center">
|
|
102
102
|
<img src="docs/demo-6.png" alt="Detail panel in bottom orientation showing ticket details, tags, and notes" width="900">
|
|
103
103
|
</p>
|
|
104
104
|
|
|
105
|
+
**Embedded terminal** — a real PTY-backed terminal lives in the footer drawer next to the commands log. Configure multiple named terminals per project (dev server, tests, build, a Claude session, anything else), each with its own theme, font, and per-terminal shell-history pool — up-arrow on the dev-server tab won't surface the commit messages you typed on the deploy tab. **11 curated themes** (Default, Dracula, Solarized Dark/Light, Nord, Gruvbox, Monokai, One Dark, Tomorrow Night, GitHub Dark/Light) and 11 monospaced font choices, settable as a project default OR per-terminal via the gear popover. Right-click tabs to close, drag-to-reorder, single + button to spawn a one-off dynamic terminal. A macOS-Terminal.app-style quit-confirm catches Cmd+Q when long-running processes (claude, npm dev, anything heavier than an idle shell) are alive so you don't lose them by accident.
|
|
106
|
+
|
|
107
|
+
**Shell integration that earns its keep** — xterm.js renders the buffer and Hot Sheet parses every standard shell-integration escape: **OSC 7** drives a cwd-aware toolbar chip you can click to open the working directory in Finder/Explorer; **OSC 8** makes hyperlinks emitted by `gh`, `cargo`, `ls --hyperlink=auto`, etc. actually clickable; **OSC 9** fires desktop toasts AND native OS notifications (system Notification Center / tray) when the window is backgrounded; **OSC 133** marks every prompt with a gutter glyph, supports `Cmd+Up`/`Cmd+Down` to jump between commands, and a hover popover with **Copy command** / **Copy output** / **Rerun** / **Ask Claude about this** buttons. A bell character (`\x07`) bounces the terminal tab and persists an accent outline until you visit it — and bells fired in **another project's** terminal surface as a dot on that project's tab so you don't miss them.
|
|
108
|
+
|
|
109
|
+
**Terminal dashboard** — click the `square-terminal` button in the toolbar to enter a dedicated full-window view showing every terminal across every registered project as a grid of 4:3 tiles. Tiles stay live (xterm + scrollback + PTY all preserved); bells bounce the tile and outline it; the column-count slider scales the whole grid from "one giant tile" to "10-per-row dense overview." **Single-click** a tile to magnify it to ~70% viewport with keyboard input; **double-click** to enter a dedicated full-pane view that resizes the PTY to fit. **Shift+Cmd+Arrow** (macOS) / **Shift+Ctrl+Arrow** (Linux/Windows) walks to the next-magnified-target tile in the indicated direction — perfect for cycling through a row of build/test pipelines. **Hide / Show Terminals** with named **visibility groupings** (e.g. "claude only", "server logs", "single app") so you can switch contexts without re-toggling rows. A **flow layout mode** flattens projects into a single tagged grid; **sectioned mode** groups by project. Off-screen tiles unmount their xterm to keep memory tame; the PTY stays alive server-side so the bytes are waiting when you scroll back.
|
|
110
|
+
|
|
105
111
|
**Unread indicators** — when tickets are created or updated externally (by AI tools, sync plugins, or the API), a blue dot appears next to the title. Your own edits in the UI never trigger unread status. Mark as Read/Unread from the context menu or batch toolbar. Tickets are automatically marked as read when you open them in the detail panel.
|
|
106
112
|
|
|
113
|
+
**Git status tracker** — auto-detected sidebar chip shows your current branch, dirty-file count, and ahead/behind upstream commits. Click to expand a popover with the file lists; one-click `git fetch` updates remote counts without leaving Hot Sheet. Silent no-op for non-git projects.
|
|
114
|
+
|
|
107
115
|
**Stats dashboard** — click the sidebar widget to open a full analytics page with throughput charts, created-vs-completed trends, cumulative flow diagram, category breakdown, and cycle time scatter plot. Hover any chart for detailed tooltips.
|
|
108
116
|
|
|
109
117
|
<p align="center">
|
|
110
118
|
<img src="docs/demo-8.png" alt="Stats dashboard showing throughput, flow, and cycle time charts" width="900">
|
|
111
119
|
</p>
|
|
112
120
|
|
|
121
|
+
<p align="center">
|
|
122
|
+
<img src="docs/demo-11.png" alt="Embedded terminal in the footer drawer with named tabs for dev server, tests, and Claude" width="900">
|
|
123
|
+
</p>
|
|
124
|
+
|
|
125
|
+
<p align="center">
|
|
126
|
+
<img src="docs/demo-12.png" alt="Terminal dashboard view showing every terminal across every registered project as a tile grid" width="900">
|
|
127
|
+
</p>
|
|
128
|
+
|
|
113
129
|
**Multi-project tabs** — open multiple projects in a single window. Each project remembers its own sidebar view, settings, sort preferences, and layout. Tabs appear automatically when you register a second project via Open Folder (`Cmd+O`). Drag tabs to reorder, right-click for close options and "Show in Finder," switch with `Cmd+Shift+[/]`.
|
|
114
130
|
|
|
115
131
|
<p align="center">
|
|
@@ -124,15 +140,16 @@ The loop stays tight because the AI always knows what to work on next — and yo
|
|
|
124
140
|
- **Up Next flag** — star tickets to add them to the AI worklist
|
|
125
141
|
- **Drag and drop** — drag tickets onto sidebar views to change category, priority, or status; drop files onto the detail panel to attach; reorder project tabs and custom views
|
|
126
142
|
- **Right-click context menus** — full context menu on tickets with category/priority/status submenus, tags, duplicate, mark as read/unread, backlog, archive, delete
|
|
127
|
-
- **Search** — full-text search across ticket titles, details, ticket numbers, and tags
|
|
143
|
+
- **Search** — full-text search across ticket titles, details, ticket numbers, and tags. When matches sit in the backlog or archive, gray "Include N backlog / N archive" rows surface under the search bar so you can mix them in with one click without leaving the current view
|
|
144
|
+
- **Ticket cross-references** — `HS-NNNN`-style references inside notes, details, and reader-mode become clickable links that open a stacking modal showing the referenced ticket; click another reference inside that modal to push it onto the stack
|
|
128
145
|
- **Print** — print the dashboard, all tickets, selected tickets, or individual tickets in checklist, summary, or full-detail format
|
|
129
146
|
- **Keyboard-driven** — `Enter` to create, `Cmd+I/B/F/R/K/G` for categories, `Alt+1-5` for priority, `Cmd+D` for Up Next, `Delete` to trash, `Cmd+P` to print, `Cmd+Z/Shift+Z` for undo/redo
|
|
130
147
|
- **Undo/redo** — `Cmd+Z` and `Cmd+Shift+Z` for all operations including notes, batch changes, and deletions
|
|
131
148
|
- **Animated transitions** — smooth FLIP animations when tickets reorder after property changes
|
|
132
149
|
- **Copy / cut / paste** — `Cmd+C` copies selected tickets (formatted text to clipboard + structured data for paste), `Cmd+X` cuts, `Cmd+V` pastes into the current project with title dedup. Works across projects.
|
|
133
|
-
- **File attachments** — attach files via file picker or drag-and-drop onto the detail panel, reveal in file manager
|
|
150
|
+
- **File attachments** — attach files via file picker or drag-and-drop onto the detail panel, reveal in file manager. Feedback-dialog drafts also save their attachments — Save Draft persists files alongside the text so you can pick up where you left off.
|
|
134
151
|
- **Markdown sync** — `worklist.md` and `open-tickets.md` auto-generated on every change
|
|
135
|
-
- **Automatic backups** — tiered snapshots (every 5 min, hourly, daily) with preview-before-restore recovery
|
|
152
|
+
- **Automatic backups** — tiered snapshots (every 5 min, hourly, daily) with preview-before-restore recovery. A **Database Repair** panel in Settings can find a working backup automatically and run `pg_resetwal` if the live cluster ever needs it.
|
|
136
153
|
- **Auto-cleanup** — verified tickets auto-archive after a configurable number of days; trashed tickets auto-delete
|
|
137
154
|
- **Portable settings** — all project settings stored in `settings.json` for easy copying between projects
|
|
138
155
|
- **App icon variants** — 9 icon variants to choose from in Settings, applied instantly to the dock icon
|
|
@@ -173,10 +190,11 @@ Hot Sheet can push events directly to a running Claude Code session via MCP chan
|
|
|
173
190
|
- **Play button** — appears in the sidebar. Single-click sends the worklist to Claude on demand. Pending worklist changes are flushed immediately so the AI always reads up-to-date data.
|
|
174
191
|
- **Auto mode** — double-click the play button to enable automatic mode. Claude is triggered immediately, then continues monitoring for new Up Next items with debounce. Exponential backoff prevents runaway retries.
|
|
175
192
|
- **Auto-prioritize** — when no tickets are flagged as Up Next, Claude automatically evaluates open tickets and picks the most important ones to work on.
|
|
176
|
-
- **Feedback loop** — Claude can request user input by adding notes prefixed with `FEEDBACK NEEDED:` or `IMMEDIATE FEEDBACK NEEDED:`. A dialog appears in the UI
|
|
177
|
-
- **Custom commands** — create named buttons that send custom prompts to Claude **or run shell commands** directly. Organize into collapsible groups. Toggle between "Claude Code" and "Shell" targets per command. Shell commands execute server-side with stdout/stderr
|
|
178
|
-
- **Permission relay** — when Claude needs tool approval (Bash, Edit, etc.), a full-screen overlay shows the tool name and command preview with Allow/Deny/Dismiss buttons — no need to switch to the terminal.
|
|
179
|
-
- **Commands log** —
|
|
193
|
+
- **Feedback loop** — Claude can request user input by adding notes prefixed with `FEEDBACK NEEDED:` or `IMMEDIATE FEEDBACK NEEDED:`. A rich dialog appears in the UI with inline-response slots between every prompt block, a catch-all field, and file attachment support. Save Draft to come back later (text + attachments survive); Submit re-triggers Claude with your response. Blue dots on project tabs indicate pending feedback.
|
|
194
|
+
- **Custom commands** — create named buttons that send custom prompts to Claude **or run shell commands** directly. Organize into collapsible groups. Toggle between "Claude Code" and "Shell" targets per command. Shell commands execute server-side with stdout/stderr streamed to the commands log in real time.
|
|
195
|
+
- **Permission relay** — when Claude needs tool approval (Bash, Edit, etc.), a full-screen overlay shows the tool name and command preview with Allow/Deny/Dismiss buttons — no need to switch to the terminal. Per-project **allow-rules** can auto-approve specific tool+pattern pairs (e.g. always allow `Bash:npm test`) so trusted commands skip the overlay entirely.
|
|
196
|
+
- **Commands log + embedded terminal** — the footer drawer hosts both a resizable commands log (every trigger, completion, permission request, shell output) AND tabs for any number of project-scoped terminals. Hop between an `npm run dev` terminal, the Claude session, and the audit log without leaving Hot Sheet.
|
|
197
|
+
- **MCP tools** — Claude Code sees Hot Sheet as a connected MCP server with schema-validated tools: `hotsheet_create_ticket`, `hotsheet_update_ticket`, `hotsheet_query_tickets`, `hotsheet_batch`, `hotsheet_signal_done`, `hotsheet_request_feedback`, and 8 more. Tickets, notes, and attachments all round-trip without the AI hand-crafting curl commands.
|
|
180
198
|
- **Status indicator** — shows "Claude working" / "Shell running" / idle in the footer.
|
|
181
199
|
|
|
182
200
|
Requires Claude Code v2.1.80+ with channel support. See [docs/12-claude-channel.md](docs/12-claude-channel.md) for setup details.
|
|
@@ -418,8 +436,9 @@ npm install
|
|
|
418
436
|
|
|
419
437
|
npm run dev # Build client assets, then run via tsx
|
|
420
438
|
npm run build # Build to dist/cli.js
|
|
421
|
-
npm test # Unit tests with coverage (
|
|
422
|
-
npm run test:e2e # E2E browser tests (
|
|
439
|
+
npm test # Unit tests with coverage (3000+ tests)
|
|
440
|
+
npm run test:e2e # E2E browser tests (375 tests) — fails on unexpected console errors / pageerrors / 4xx-5xx responses by default (HS-8435 / HS-8436)
|
|
441
|
+
STRICT_E2E_ERRORS=0 npm run test:e2e # Local debugging only — opt out of the unexpected-event gate
|
|
423
442
|
npm run test:fast # Unit + fast E2E (skips GitHub plugin tests)
|
|
424
443
|
npm run test:all # Merged coverage report (unit + E2E)
|
|
425
444
|
npm run lint # ESLint
|
|
@@ -427,7 +446,9 @@ npm run clean # Remove dist and caches
|
|
|
427
446
|
npm link # Symlink for global 'hotsheet' command
|
|
428
447
|
```
|
|
429
448
|
|
|
430
|
-
The project has comprehensive test coverage with
|
|
449
|
+
The project has comprehensive test coverage with 3000+ unit tests (vitest) and 375 Playwright E2E browser tests, plus smoke tests for production install verification.
|
|
450
|
+
|
|
451
|
+
The E2E suite carries an error-capture fixture (HS-8435 / HS-8436, `e2e/coverage-fixture.ts`) that fails any test with an unexpected `console.error` / `pageerror` / 4xx-5xx response event. Specs that legitimately expect an error opt in via the per-test `errorCapture.allowErrors([patterns])` fixture helper (add a code comment explaining why); global noise lives in the `GLOBAL_ERROR_ALLOWLIST` constant. Set `STRICT_E2E_ERRORS=0` for local debugging only — CI should always run with the strict default.
|
|
431
452
|
|
|
432
453
|
---
|
|
433
454
|
|
package/dist/channel.js
CHANGED
|
@@ -34288,7 +34288,12 @@ var DashboardConfigSchema = external_exports3.object({
|
|
|
34288
34288
|
layoutMode: external_exports3.enum(["sectioned", "flow"]).optional(),
|
|
34289
34289
|
columnsPerRow: external_exports3.number().optional(),
|
|
34290
34290
|
visibilityGroupings: external_exports3.array(VisibilityGroupingSchema).optional(),
|
|
34291
|
-
activeVisibilityGroupingId: external_exports3.string().optional()
|
|
34291
|
+
activeVisibilityGroupingId: external_exports3.string().optional(),
|
|
34292
|
+
// HS-8424 — HS-8406 added per-scope active-grouping selection on the
|
|
34293
|
+
// client; without it here, the `.strict()` parser rejected every
|
|
34294
|
+
// visibility PATCH (the client always sends both keys), so no toggle
|
|
34295
|
+
// made after HS-8406 landed could persist across relaunches.
|
|
34296
|
+
activeVisibilityGroupingIdByScope: external_exports3.record(external_exports3.string(), external_exports3.string()).optional()
|
|
34292
34297
|
}).strict();
|
|
34293
34298
|
var GlobalConfigSchema = external_exports3.object({
|
|
34294
34299
|
channelEnabled: external_exports3.boolean().optional(),
|
|
@@ -34369,7 +34374,7 @@ async function proxyRequest(settings, path, init, fetchFn) {
|
|
|
34369
34374
|
var UpdateTicketInputSchema = external_exports3.object({
|
|
34370
34375
|
id: external_exports3.number().int().describe("Ticket id (numeric, e.g. 42)"),
|
|
34371
34376
|
status: TicketStatusSchema.optional(),
|
|
34372
|
-
notes: external_exports3.string().optional().describe(
|
|
34377
|
+
notes: external_exports3.string().optional().describe('Append a new note. Pass the markdown body as a plain string (NOT a JSON array \u2014 the server wraps the text in `{id, text, created_at}` automatically). HS-8427 \u2014 if you mistakenly pass a JSON-stringified note array like `[{"text":"..."}]`, the server unwraps it defensively so the body renders correctly, but plain text is the documented + preferred shape.'),
|
|
34373
34378
|
priority: TicketPrioritySchema.optional(),
|
|
34374
34379
|
category: external_exports3.string().optional().describe('Category id (e.g. "bug", "feature", "task", "issue")'),
|
|
34375
34380
|
up_next: external_exports3.boolean().optional(),
|