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 CHANGED
@@ -10,9 +10,9 @@
10
10
 
11
11
  <br>
12
12
 
13
- **Hot Sheet** is a lightweight project management tool that runs entirely on your machine. 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.
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 for the user to respond, and Claude is automatically re-triggered with the feedback. Blue dots on project tabs indicate pending feedback.
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 captured to the commands log.
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** — a resizable bottom panel that records all communication: triggers, completions, permission requests, and shell command output. Filter by type, search, and copy entries. Shell commands show a stop button for running processes.
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 (626 tests)
422
- npm run test:e2e # E2E browser tests (120+ 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 626 unit tests (vitest) and 120+ Playwright E2E browser tests, plus smoke tests for production install verification.
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("Replace the ticket's notes JSON. Pass the full notes array as a JSON string."),
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(),