claude-code-hub 0.5.0 → 0.6.3

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.
Files changed (3) hide show
  1. package/README.md +10 -0
  2. package/package.json +4 -3
  3. package/server.js +34 -9
package/README.md CHANGED
@@ -31,6 +31,16 @@ npm install && npm install --prefix marketplace && npm install --prefix cck
31
31
  npm start # http://localhost:3455
32
32
  ```
33
33
 
34
+ ## Agent Observability (one-time setup)
35
+
36
+ For the full Kanban experience — agent log, live subagent tracking, waiting-for-user indicators, and context window monitoring — install the hooks:
37
+
38
+ ```bash
39
+ npx claude-code-kanban --install
40
+ ```
41
+
42
+ Without hooks you still get the task board, but no agent activity or live indicators. See the [Kanban README](https://github.com/NikiforovAll/claude-task-viewer#getting-started) for details.
43
+
34
44
  ## Keyboard Shortcuts
35
45
 
36
46
  | Shortcut | Action |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-hub",
3
- "version": "0.5.0",
3
+ "version": "0.6.3",
4
4
  "description": "Unified hub for Claude Code tools — Marketplace + Kanban in one PWA",
5
5
  "main": "server.js",
6
6
  "bin": {
@@ -35,8 +35,9 @@
35
35
  },
36
36
  "homepage": "https://github.com/NikiforovAll/claude-code-hub#readme",
37
37
  "dependencies": {
38
- "claude-code-kanban": "^2.2.0",
39
- "claude-code-marketplace": "^0.5.0",
38
+ "claude-code-cost": "^0.2.0",
39
+ "claude-code-kanban": "^3.0.1",
40
+ "claude-code-marketplace": "^0.5.7",
40
41
  "express": "^4.21.0",
41
42
  "open": "^10.1.0"
42
43
  },
package/server.js CHANGED
@@ -53,18 +53,38 @@ function spawnApp(name, cmd, args, envPort) {
53
53
 
54
54
  function killAll() {
55
55
  for (const child of children) {
56
- if (!child.killed) child.kill();
56
+ if (child.killed) continue;
57
+ if (process.platform === 'win32') {
58
+ spawn('taskkill', ['/pid', String(child.pid), '/f', '/t'], { stdio: 'ignore' });
59
+ } else {
60
+ child.kill();
61
+ }
57
62
  }
58
63
  }
59
64
 
60
- process.on('SIGINT', () => {
61
- killAll();
62
- process.exit(0);
63
- });
64
- process.on('SIGTERM', () => {
65
+ function shutdown() {
65
66
  killAll();
66
67
  process.exit(0);
68
+ }
69
+
70
+ process.on('SIGINT', shutdown);
71
+ process.on('SIGTERM', shutdown);
72
+ process.on('SIGHUP', shutdown);
73
+ process.on('exit', killAll);
74
+
75
+ // Git Bash + tmux on Windows doesn't deliver signals — read stdin directly
76
+ process.stdin.setEncoding('utf8');
77
+ process.stdin.resume();
78
+ process.stdin.on('data', (data) => {
79
+ const d = data.trim().toLowerCase();
80
+ // Ctrl+C (0x03), Ctrl+D (0x04), or typed "q"/"exit"
81
+ if (data.includes('\x03') || data.includes('\x04') || d === 'q' || d === 'exit') {
82
+ console.log('\nShutting down...');
83
+ shutdown();
84
+ }
67
85
  });
86
+ process.stdin.on('end', shutdown);
87
+ process.stdin.on('close', shutdown);
68
88
 
69
89
  function resolveApp(submoduleDir, npmPackage) {
70
90
  const local = path.join(__dirname, submoduleDir, 'server.js');
@@ -99,18 +119,23 @@ app.use(express.static(path.join(__dirname, 'public')));
99
119
 
100
120
  const server = app.listen(HUB_PORT, () => {
101
121
  const actual = server.address().port;
102
- console.log(`Claude Code Hub running at http://localhost:${actual}`);
122
+ printBanner(actual);
103
123
  if (process.argv.includes('--open')) {
104
124
  import('open').then((m) => m.default(`http://localhost:${actual}`));
105
125
  }
106
126
  });
107
127
 
128
+ function printBanner(port) {
129
+ console.log(`Claude Code Hub running at http://localhost:${port}`);
130
+ console.log('Type "q" or "exit" to stop the server');
131
+ }
132
+
108
133
  server.on('error', (err) => {
109
- if (err.code === 'EADDRINUSE') {
134
+ if (err.code === 'EADDRINUSE' || err.code === 'EACCES') {
110
135
  console.log(`Port ${HUB_PORT} in use, trying random port...`);
111
136
  const fallback = app.listen(0, () => {
112
137
  const actual = fallback.address().port;
113
- console.log(`Claude Code Hub running at http://localhost:${actual}`);
138
+ printBanner(actual);
114
139
  if (process.argv.includes('--open')) {
115
140
  import('open').then((m) => m.default(`http://localhost:${actual}`));
116
141
  }