claude-code-hub 0.6.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.
- package/package.json +4 -4
- package/server.js +34 -9
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-code-hub",
|
|
3
|
-
"version": "0.6.
|
|
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,9 +35,9 @@
|
|
|
35
35
|
},
|
|
36
36
|
"homepage": "https://github.com/NikiforovAll/claude-code-hub#readme",
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"claude-code-cost": "^0.
|
|
39
|
-
"claude-code-kanban": "^
|
|
40
|
-
"claude-code-marketplace": "^0.5.
|
|
38
|
+
"claude-code-cost": "^0.2.0",
|
|
39
|
+
"claude-code-kanban": "^3.0.1",
|
|
40
|
+
"claude-code-marketplace": "^0.5.7",
|
|
41
41
|
"express": "^4.21.0",
|
|
42
42
|
"open": "^10.1.0"
|
|
43
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
138
|
+
printBanner(actual);
|
|
114
139
|
if (process.argv.includes('--open')) {
|
|
115
140
|
import('open').then((m) => m.default(`http://localhost:${actual}`));
|
|
116
141
|
}
|