claude-code-hub 0.21.0 → 0.22.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/package.json +5 -5
- package/public/app.js +18 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-code-hub",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "Unified hub for Claude Code tools — Marketplace + Kanban in one PWA",
|
|
5
5
|
"main": "server.js",
|
|
6
6
|
"bin": {
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
},
|
|
36
36
|
"homepage": "https://github.com/NikiforovAll/claude-code-hub#readme",
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"claude-code-cost": "^0.12.
|
|
39
|
-
"claude-code-kanban": "^4.
|
|
40
|
-
"claude-code-marketplace": "^0.12.
|
|
41
|
-
"claude-code-memory-explorer": "^0.9.
|
|
38
|
+
"claude-code-cost": "^0.12.1",
|
|
39
|
+
"claude-code-kanban": "^4.17.0",
|
|
40
|
+
"claude-code-marketplace": "^0.12.1",
|
|
41
|
+
"claude-code-memory-explorer": "^0.9.1",
|
|
42
42
|
"express": "^4.21.0",
|
|
43
43
|
"open": "^10.1.0"
|
|
44
44
|
},
|
package/public/app.js
CHANGED
|
@@ -227,8 +227,15 @@ function listenKeys() {
|
|
|
227
227
|
return;
|
|
228
228
|
}
|
|
229
229
|
// While the palette is open the input owns the keyboard — don't let tab shortcuts fire
|
|
230
|
-
// mid-path (Alt+digit especially, since Windows paths contain digits).
|
|
231
|
-
|
|
230
|
+
// mid-path (Alt+digit especially, since Windows paths contain digits). Escape still closes:
|
|
231
|
+
// bound here as well as on the input so it works wherever focus landed in the hub document.
|
|
232
|
+
if (palette.open) {
|
|
233
|
+
if (e.key === 'Escape') {
|
|
234
|
+
e.preventDefault();
|
|
235
|
+
closePalette();
|
|
236
|
+
}
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
232
239
|
if (e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey) {
|
|
233
240
|
const digit = parseInt(e.key, 10);
|
|
234
241
|
if (digit >= 1 && digit <= 9) {
|
|
@@ -417,6 +424,10 @@ function openPalette() {
|
|
|
417
424
|
palette.sel = 0;
|
|
418
425
|
input.value = '';
|
|
419
426
|
document.getElementById('palette').hidden = false;
|
|
427
|
+
// Ctrl+Alt+P usually arrives forwarded from a focused iframe. Without inert the sub-app can keep
|
|
428
|
+
// or take focus back, and then Escape is handled inside it — the palette stays open and only the
|
|
429
|
+
// sub-app's own focus visibly changes.
|
|
430
|
+
setIframesInert(true);
|
|
420
431
|
renderPalette();
|
|
421
432
|
input.focus();
|
|
422
433
|
// Stale-while-revalidate: the cached list renders instantly, recency refreshes when this lands.
|
|
@@ -430,9 +441,14 @@ function openPalette() {
|
|
|
430
441
|
function closePalette() {
|
|
431
442
|
palette.open = false;
|
|
432
443
|
document.getElementById('palette').hidden = true;
|
|
444
|
+
setIframesInert(false);
|
|
433
445
|
iframes[activeApp]?.focus();
|
|
434
446
|
}
|
|
435
447
|
|
|
448
|
+
function setIframesInert(on) {
|
|
449
|
+
for (const iframe of Object.values(iframes)) iframe.inert = on;
|
|
450
|
+
}
|
|
451
|
+
|
|
436
452
|
function movePaletteSel(delta) {
|
|
437
453
|
const n = palette.rows.length;
|
|
438
454
|
if (n === 0) return;
|