claude-code-kanban 4.12.0 → 4.13.0

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
@@ -8,9 +8,7 @@
8
8
 
9
9
  > Watch Claude Code work, in real time.
10
10
 
11
- ![Dark mode](assets/screenshot-dark-v2.png)
12
-
13
- ![Light mode](assets/screenshot-light-v2.png)
11
+ ![Kanban board with session log](assets/shot-session-log.png)
14
12
 
15
13
  ## Getting Started
16
14
 
@@ -22,11 +20,7 @@ Hooks enable subagent tracking, waiting-for-user detection, and session activity
22
20
  npx claude-code-kanban --install
23
21
  ```
24
22
 
25
- This will:
26
- - Copy `agent-spy.sh` to `~/.claude/hooks/` (requires `jq`)
27
- - Add `SubagentStart`, `SubagentStop`, `TeammateIdle`, and `PostToolUse` hooks to `~/.claude/settings.json`
28
-
29
- All changes are non-destructive — existing settings are preserved.
23
+ Non-destructive — existing settings in `~/.claude/settings.json` are preserved. Uninstall anytime with `npx claude-code-kanban --uninstall`.
30
24
 
31
25
  ### 2. Start the dashboard
32
26
 
@@ -34,72 +28,34 @@ All changes are non-destructive — existing settings are preserved.
34
28
  npx claude-code-kanban --open
35
29
  ```
36
30
 
37
- Open http://localhost:3541 (or use `--open` to auto-launch the browser).
38
-
39
31
  ### 3. Use Claude Code as usual
40
32
 
41
- Tasks, agents, and messages appear on the board automatically. No changes to your Claude Code workflow needed.
42
-
43
- > To uninstall hooks: `npx claude-code-kanban --uninstall`
33
+ Tasks, agents, and messages appear on the board automatically Claude Code writes task files and conversation logs to `~/.claude`, the dashboard watches them and streams updates to the browser via SSE. It never directs Claude's work.
44
34
 
45
35
  ## Features
46
36
 
47
37
  - **Real-time Kanban board** — Tasks move through Pending → In Progress → Completed as Claude works
48
- - **Agent log** — Live subagent tracking (start/stop/idle) with prompts, duration, and status
49
- - **Session message log** — Browse recent messages, tool calls, and model info (`Shift+L`)
38
+ - **Session log** — The full conversation timeline: prompts, replies, tool calls and results (`Shift+L`)
39
+ - **Agent log** — Live subagent tracking with prompts, duration, status, and idle detection
40
+ - **Task detail panel** — Full description, notes, blockedBy/blocks dependencies, inline editing
41
+ - **Follow & pin** — Follow the latest message live (`Shift+M`), pin the messages that matter
42
+ - **Tool stats & impact** — Per-session tool usage breakdown and file impact
50
43
  - **Waiting-for-user indicators** — Amber highlight on sessions needing permission or input
51
- - **Plan correlation** — Plan sessions linked to their implementation sessions
52
44
  - **Agent teams** — Color-coded team members, owner filtering, member count badges
53
- - **Task dependencies** — See blockedBy/blocks relationships and the critical path
54
- - **Live activity feed** — Stream of all in-progress tasks across every session
55
- - **Session management** — Fuzzy search, project/branch display, active/stale session styling
56
- - **Cleanup** — Delete tasks (with dependency checks) or bulk-delete entire sessions
57
- - **Keyboard shortcuts** — Press `?` for help; `Shift+M` for live message follow
58
-
59
- ## Configuration
60
-
61
- ```bash
62
- PORT=8080 npx claude-code-kanban # Custom port
63
- npx claude-code-kanban --open # Auto-open browser
64
- npx claude-code-kanban --dir=~/.claude-work # Custom Claude config dir
65
- ```
66
-
67
- If port 3541 is in use, the server falls back to a random available port.
68
-
69
- ### Global install
70
-
71
- ```bash
72
- npm install -g claude-code-kanban
73
- claude-code-kanban --open
74
- ```
75
-
76
- ## How It Works
45
+ - **17 color themes** — Dracula, Nord, Catppuccin, Gruvbox, Tokyo Night, and more each in light and dark
46
+ - **Storage manager** — Inspect disk usage and clean up stale sessions and tasks
47
+ - **Keyboard-first** — Press `?` for the full shortcut reference
77
48
 
78
- Claude Code writes task files to `~/.claude/tasks/` and conversation logs to `~/.claude/projects/`. The dashboard watches these directories with [chokidar](https://github.com/paulmillr/chokidar) and pushes updates to the browser via Server-Sent Events (SSE). Nothing is modified — the dashboard is read-only.
49
+ ![Session info](assets/shot-session-info.png)
79
50
 
80
- **Tasks** are picked up automatically from Claude Code's native task system (TodoWrite). No hooks needed.
51
+ ![Subagent preview](assets/shot-subagent-preview.png)
81
52
 
82
- **Hooks** extend observability beyond tasks. When installed, lightweight shell scripts fire on Claude Code lifecycle events and write JSON markers that the dashboard picks up:
53
+ ![Theme picker](assets/shot-theme-picker.png)
83
54
 
84
- | Hook event | What it enables |
85
- |------------|----------------|
86
- | `SubagentStart` / `SubagentStop` | Agent log — see subagent spawns, durations, prompts |
87
- | `TeammateIdle` | Idle detection for team member agents |
88
- | `PostToolUse` | Waiting-for-user detection (permission prompts, AskUserQuestion) |
89
55
 
90
56
  ## Context Window Monitoring
91
57
 
92
- Track real-time context window usage for each Claude Code session directly in the dashboard sidebar and detail panel.
93
-
94
- ### Setup
95
-
96
- The installer copies `context-status.sh` alongside the agent hooks:
97
-
98
- ```bash
99
- npx claude-code-kanban --install
100
- ```
101
-
102
- Then add it to your statusline in `~/.claude/settings.json`:
58
+ Per-session context usage bars, token/cost breakdowns, and model info in the sidebar and detail panel. The installer copies `context-status.sh` — wire it into your statusline in `~/.claude/settings.json`:
103
59
 
104
60
  ```json
105
61
  {
@@ -111,27 +67,17 @@ Then add it to your statusline in `~/.claude/settings.json`:
111
67
  }
112
68
  ```
113
69
 
114
- The script pipes through your existing statusline still works. It just writes a snapshot to `~/.claude/context-status/{sessionId}.json` on each update.
115
-
116
- ### What you get
70
+ The script pipes through, so your existing statusline keeps working.
117
71
 
118
- - **Sidebar bar** — compact context usage bar per session with color thresholds (green → yellow → orange → red) and a 200K token marker
119
- - **Detail panel** — input/output token breakdown, cache read tokens, cost, duration, API time, lines added/removed, and model name
120
- - Only shown for active or pinned sessions
121
-
122
- ## FAQ
123
-
124
- **Does this control Claude?**
125
- No. The viewer only observes — it never writes to task files or directs Claude's work.
126
-
127
- **Does it work with agent teams?**
128
- Yes. Team sessions are auto-detected with color-coded members and owner filtering.
72
+ ## Configuration
129
73
 
130
- **Does it require Claude Code to be running?**
131
- No. You can browse past sessions anytime. Live updates resume when Claude starts working again.
74
+ ```bash
75
+ PORT=8080 npx claude-code-kanban # Custom port (falls back if busy)
76
+ npx claude-code-kanban --open # Auto-open browser
77
+ npx claude-code-kanban --dir=~/.claude-work # Custom Claude config dir
78
+ ```
132
79
 
133
- **What happens without hooks?**
134
- The Kanban board still shows tasks, but you won't see the agent log, waiting-for-user indicators, or live session activity. Run `npx claude-code-kanban --install` for the full experience.
80
+ Global install: `npm install -g claude-code-kanban`, then `claude-code-kanban --open`.
135
81
 
136
82
  ## License
137
83
 
package/lib/parsers.js CHANGED
@@ -1029,14 +1029,15 @@ const CACHED_IMAGE_MIME = {
1029
1029
  png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif', webp: 'image/webp',
1030
1030
  };
1031
1031
 
1032
- // Serve pasted image N from ~/.claude/image-cache/<sessionId>/. The cached file may
1032
+ // Serve pasted image N from <claudeDir>/image-cache/<sessionId>/. The cached file may
1033
1033
  // be any image format, so resolve it by index rather than assuming .png. sessionId
1034
1034
  // is validated to a bare id to prevent path traversal.
1035
- function readCachedImage(sessionId, n) {
1035
+ function readCachedImage(sessionId, n, claudeDir) {
1036
1036
  const idx = Number(n);
1037
1037
  if (!sessionId || !/^[A-Za-z0-9._-]+$/.test(sessionId)) return null;
1038
1038
  if (!Number.isInteger(idx) || idx < 0) return null;
1039
- const dir = path.join(require('os').homedir(), '.claude', 'image-cache', sessionId);
1039
+ const baseDir = claudeDir || path.join(require('os').homedir(), '.claude');
1040
+ const dir = path.join(baseDir, 'image-cache', sessionId);
1040
1041
  try {
1041
1042
  const match = readdirSync(dir).find((f) => {
1042
1043
  const dot = f.lastIndexOf('.');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-kanban",
3
- "version": "4.12.0",
3
+ "version": "4.13.0",
4
4
  "description": "A web-based Kanban board for viewing Claude Code tasks with agent teams support",
5
5
  "main": "server.js",
6
6
  "bin": {
package/server.js CHANGED
@@ -54,7 +54,7 @@ function getClaudeDir() {
54
54
  return dir.startsWith('~') ? dir.replace('~', os.homedir()) : dir;
55
55
  }
56
56
  }
57
- return process.env.CLAUDE_DIR || path.join(os.homedir(), '.claude');
57
+ return process.env.CLAUDE_CONFIG_DIR || process.env.CLAUDE_DIR || path.join(os.homedir(), '.claude');
58
58
  }
59
59
 
60
60
  function getArgUrl(argName, envName) {
@@ -2110,7 +2110,7 @@ app.get('/api/sessions/:sessionId/tool-result-image/:toolUseId/:n', (req, res) =
2110
2110
  });
2111
2111
 
2112
2112
  app.get('/api/sessions/:sessionId/cached-image/:n', (req, res) => {
2113
- const img = readCachedImage(req.params.sessionId, req.params.n);
2113
+ const img = readCachedImage(req.params.sessionId, req.params.n, CLAUDE_DIR);
2114
2114
  if (!img) return res.status(404).end();
2115
2115
  res.setHeader('Content-Type', img.mediaType);
2116
2116
  res.setHeader('Cache-Control', 'no-store');