claude-code-kanban 4.24.0 → 4.26.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 +4 -2
- package/cli.js +1 -1
- package/install.js +30 -10
- package/lib/approvals.js +34 -3
- package/lib/claude-dir.js +53 -0
- package/lib/open-editor.js +4 -1
- package/lib/parsers.js +118 -4
- package/package.json +1 -1
- package/plugin/plugins/claude-code-kanban/.claude-plugin/plugin.json +1 -1
- package/plugin/plugins/claude-code-kanban/scripts/agent-spy.sh +2 -2
- package/plugin/plugins/claude-code-kanban/scripts/approval-gate.sh +58 -23
- package/plugin/plugins/claude-code-kanban/scripts/context-status.sh +2 -2
- package/plugin/plugins/claude-code-kanban/scripts/postman.js +2 -1
- package/public/app.js +428 -126
- package/public/index.html +21 -3
- package/public/style.css +216 -17
- package/server.js +141 -46
package/public/index.html
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/styles/github.min.css" id="hljs-theme-light" disabled>
|
|
23
23
|
<script defer src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/highlight.min.js"></script>
|
|
24
24
|
<script defer src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
|
|
25
|
+
<script>window.__STORAGE_NS__ = null;</script>
|
|
25
26
|
<script defer src="/app.js"></script>
|
|
26
27
|
</head>
|
|
27
28
|
<body>
|
|
@@ -59,6 +60,20 @@
|
|
|
59
60
|
<span class="section-header-label">Sessions</span>
|
|
60
61
|
<span id="filter-summary" class="filter-summary" title=""></span>
|
|
61
62
|
<span class="section-header-actions">
|
|
63
|
+
<button
|
|
64
|
+
id="zen-mode-btn"
|
|
65
|
+
class="icon-btn section-btn"
|
|
66
|
+
onclick="event.stopPropagation(); toggleZenMode()"
|
|
67
|
+
title="Zen mode: current session only (Shift+Z)"
|
|
68
|
+
aria-label="Zen mode: current session only"
|
|
69
|
+
aria-pressed="false"
|
|
70
|
+
>
|
|
71
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
72
|
+
<circle cx="12" cy="12" r="7"/>
|
|
73
|
+
<circle cx="12" cy="12" r="2"/>
|
|
74
|
+
<path d="M12 1v3M12 20v3M1 12h3M20 12h3"/>
|
|
75
|
+
</svg>
|
|
76
|
+
</button>
|
|
62
77
|
<button
|
|
63
78
|
id="filter-menu-btn"
|
|
64
79
|
class="icon-btn section-btn"
|
|
@@ -355,7 +370,7 @@
|
|
|
355
370
|
</svg>
|
|
356
371
|
</button>
|
|
357
372
|
</div>
|
|
358
|
-
<div class="modal-body
|
|
373
|
+
<div class="modal-body">
|
|
359
374
|
<dl class="shortcuts" id="help-shortcuts"></dl>
|
|
360
375
|
</div>
|
|
361
376
|
</div>
|
|
@@ -611,8 +626,11 @@
|
|
|
611
626
|
<div id="session-picker-modal" class="modal-overlay top-aligned" onclick="closeSessionPicker()">
|
|
612
627
|
<div class="modal session-picker" onclick="event.stopPropagation()">
|
|
613
628
|
<input type="text" id="session-picker-input" class="form-input sp-input" placeholder="Jump to session..." autocomplete="off" spellcheck="false">
|
|
614
|
-
<div
|
|
615
|
-
|
|
629
|
+
<div class="sp-body">
|
|
630
|
+
<div id="session-picker-list" class="sp-list"></div>
|
|
631
|
+
<div id="session-picker-peek" class="sp-peek"></div>
|
|
632
|
+
</div>
|
|
633
|
+
<div class="sp-hint"><kbd>↑</kbd><kbd>↓</kbd> move · <kbd>Enter</kbd> open · <kbd>Ctrl</kbd><kbd>Space</kbd> peek · <kbd>Esc</kbd> close</div>
|
|
616
634
|
</div>
|
|
617
635
|
</div>
|
|
618
636
|
|
package/public/style.css
CHANGED
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
--bg-surface: #16181c;
|
|
10
10
|
--bg-elevated: #1e2025;
|
|
11
11
|
--bg-hover: #282a30;
|
|
12
|
+
/* Selection reads as a recess against the darker surface here, but light theme's deep tone
|
|
13
|
+
sits within a shade of the sidebar, so there it has to rise instead. */
|
|
14
|
+
--session-active-bg: var(--bg-deep);
|
|
12
15
|
--border: #363840;
|
|
13
16
|
--text-primary: #f0f1f3;
|
|
14
17
|
--text-secondary: #c2c4c9;
|
|
@@ -440,7 +443,8 @@ body::before {
|
|
|
440
443
|
}
|
|
441
444
|
|
|
442
445
|
/* Ember only while something is actually filtered — at rest the funnel is just chrome. */
|
|
443
|
-
.icon-btn.section-btn.has-filters
|
|
446
|
+
.icon-btn.section-btn.has-filters,
|
|
447
|
+
.icon-btn.section-btn.active {
|
|
444
448
|
color: var(--accent-text);
|
|
445
449
|
}
|
|
446
450
|
|
|
@@ -575,17 +579,15 @@ body::before {
|
|
|
575
579
|
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
576
580
|
}
|
|
577
581
|
|
|
578
|
-
/* `.active` is the open session, `.kb-selected` the keyboard cursor.
|
|
579
|
-
|
|
582
|
+
/* `.active` is the open session, `.kb-selected` the keyboard cursor. They own different
|
|
583
|
+
properties — fill and border — so the cursor landing on the open session adds to it
|
|
584
|
+
instead of replacing how it looks. */
|
|
580
585
|
.session-item.active {
|
|
581
|
-
background: var(--bg
|
|
582
|
-
border-color: var(--accent);
|
|
586
|
+
background: var(--session-active-bg);
|
|
583
587
|
}
|
|
584
588
|
|
|
585
589
|
.session-item.kb-selected {
|
|
586
|
-
background: var(--bg-elevated);
|
|
587
590
|
border-color: var(--accent);
|
|
588
|
-
box-shadow: 0 0 0 1px var(--accent-dim);
|
|
589
591
|
}
|
|
590
592
|
|
|
591
593
|
.session-item.stale {
|
|
@@ -633,7 +635,8 @@ body::before {
|
|
|
633
635
|
}
|
|
634
636
|
|
|
635
637
|
.session-name {
|
|
636
|
-
font-size:
|
|
638
|
+
font-size: 14px;
|
|
639
|
+
font-weight: 500;
|
|
637
640
|
color: var(--text-primary);
|
|
638
641
|
white-space: nowrap;
|
|
639
642
|
overflow: hidden;
|
|
@@ -671,6 +674,26 @@ body::before {
|
|
|
671
674
|
overflow: hidden;
|
|
672
675
|
}
|
|
673
676
|
|
|
677
|
+
/* inline-block, not inline-flex: a flex box ignores text-overflow, so a long worktree name
|
|
678
|
+
ran past the card edge instead of truncating. */
|
|
679
|
+
.wt-chip {
|
|
680
|
+
display: inline-block;
|
|
681
|
+
max-width: 60%;
|
|
682
|
+
margin-left: 5px;
|
|
683
|
+
padding: 0 5px;
|
|
684
|
+
border: 1px solid var(--accent-dim);
|
|
685
|
+
border-radius: 999px;
|
|
686
|
+
background: var(--accent-dim);
|
|
687
|
+
color: var(--accent-text);
|
|
688
|
+
font-family: var(--mono);
|
|
689
|
+
font-size: 9px;
|
|
690
|
+
line-height: 14px;
|
|
691
|
+
vertical-align: middle;
|
|
692
|
+
white-space: nowrap;
|
|
693
|
+
overflow: hidden;
|
|
694
|
+
text-overflow: ellipsis;
|
|
695
|
+
}
|
|
696
|
+
|
|
674
697
|
.session-branch {
|
|
675
698
|
font-size: 10px;
|
|
676
699
|
color: var(--text-secondary);
|
|
@@ -858,6 +881,68 @@ body::before {
|
|
|
858
881
|
color: var(--text-secondary);
|
|
859
882
|
}
|
|
860
883
|
|
|
884
|
+
/* Zen view: the sidebar holds one card, so the usage detail that normally lives behind the
|
|
885
|
+
info modal gets rendered underneath it. */
|
|
886
|
+
.zen-panel {
|
|
887
|
+
margin-top: 10px;
|
|
888
|
+
/* No bottom padding: the linked-docs section that always closes the panel carries its own. */
|
|
889
|
+
padding: 10px 10px 0;
|
|
890
|
+
background: var(--bg-elevated);
|
|
891
|
+
border: 1px solid var(--border);
|
|
892
|
+
border-radius: 8px;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
.zen-panel .detail-context {
|
|
896
|
+
margin-bottom: 0;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
.zen-panel .detail-context-stats {
|
|
900
|
+
gap: 3px 10px;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
.zen-panel .linked-docs-section {
|
|
904
|
+
margin-top: 12px;
|
|
905
|
+
padding-top: 10px;
|
|
906
|
+
border-top: 1px solid var(--border);
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
.zen-panel .artifacts-section {
|
|
910
|
+
padding-top: 10px;
|
|
911
|
+
border-top: 1px solid var(--border);
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
.zen-scratchpad {
|
|
915
|
+
display: flex;
|
|
916
|
+
align-items: center;
|
|
917
|
+
gap: 8px;
|
|
918
|
+
margin-top: 12px;
|
|
919
|
+
padding-top: 10px;
|
|
920
|
+
border-top: 1px solid var(--border);
|
|
921
|
+
font-size: 11px;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
.zen-scratchpad-label {
|
|
925
|
+
font-weight: 500;
|
|
926
|
+
color: var(--text-muted);
|
|
927
|
+
text-transform: uppercase;
|
|
928
|
+
letter-spacing: 0.5px;
|
|
929
|
+
white-space: nowrap;
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
.zen-scratchpad-path {
|
|
933
|
+
flex: 1;
|
|
934
|
+
min-width: 0;
|
|
935
|
+
overflow: hidden;
|
|
936
|
+
text-overflow: ellipsis;
|
|
937
|
+
white-space: nowrap;
|
|
938
|
+
font-family: var(--font-mono);
|
|
939
|
+
color: var(--text-secondary);
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
.zen-panel:hover .row-actions {
|
|
943
|
+
opacity: 1;
|
|
944
|
+
}
|
|
945
|
+
|
|
861
946
|
.session-time {
|
|
862
947
|
font-size: 11px;
|
|
863
948
|
font-weight: 450;
|
|
@@ -2264,7 +2349,8 @@ body::before {
|
|
|
2264
2349
|
flex-direction: column;
|
|
2265
2350
|
}
|
|
2266
2351
|
#team-modal .modal-body,
|
|
2267
|
-
#agent-modal .modal-body
|
|
2352
|
+
#agent-modal .modal-body,
|
|
2353
|
+
.modal-help .modal-body {
|
|
2268
2354
|
flex: 1 1 auto;
|
|
2269
2355
|
overflow-y: auto;
|
|
2270
2356
|
min-height: 0;
|
|
@@ -2349,7 +2435,6 @@ body::before {
|
|
|
2349
2435
|
padding: 10px 14px;
|
|
2350
2436
|
background: var(--bg-elevated);
|
|
2351
2437
|
border: 1px solid var(--border);
|
|
2352
|
-
border-left: 3px solid var(--warning);
|
|
2353
2438
|
border-radius: 8px;
|
|
2354
2439
|
}
|
|
2355
2440
|
.info-goal-head {
|
|
@@ -3818,7 +3903,8 @@ body::before {
|
|
|
3818
3903
|
color: var(--text-primary);
|
|
3819
3904
|
}
|
|
3820
3905
|
|
|
3821
|
-
.linked-doc-list
|
|
3906
|
+
.linked-doc-list,
|
|
3907
|
+
.artifact-list {
|
|
3822
3908
|
list-style: none;
|
|
3823
3909
|
padding: 0;
|
|
3824
3910
|
margin: 0;
|
|
@@ -3827,14 +3913,16 @@ body::before {
|
|
|
3827
3913
|
gap: 4px;
|
|
3828
3914
|
}
|
|
3829
3915
|
|
|
3830
|
-
.linked-doc-item
|
|
3916
|
+
.linked-doc-item,
|
|
3917
|
+
.artifact-item {
|
|
3831
3918
|
display: flex;
|
|
3832
3919
|
align-items: baseline;
|
|
3833
3920
|
gap: 8px;
|
|
3834
3921
|
min-width: 0;
|
|
3835
3922
|
}
|
|
3836
3923
|
|
|
3837
|
-
.linked-doc-link
|
|
3924
|
+
.linked-doc-link,
|
|
3925
|
+
.artifact-link {
|
|
3838
3926
|
color: var(--accent-text);
|
|
3839
3927
|
text-decoration: underline;
|
|
3840
3928
|
text-decoration-style: dotted;
|
|
@@ -3855,13 +3943,15 @@ body::before {
|
|
|
3855
3943
|
/* Rides on the shared .row-actions group; only the reveal trigger differs — per row
|
|
3856
3944
|
here, per grid in the session info. margin-left:auto pins the group to the same
|
|
3857
3945
|
right edge however long the names in between are. */
|
|
3858
|
-
.linked-doc-actions
|
|
3946
|
+
.linked-doc-actions,
|
|
3947
|
+
.artifact-actions {
|
|
3859
3948
|
margin-left: auto;
|
|
3860
3949
|
align-self: center;
|
|
3861
3950
|
flex-shrink: 0;
|
|
3862
3951
|
}
|
|
3863
3952
|
|
|
3864
|
-
.linked-doc-item:hover .linked-doc-actions
|
|
3953
|
+
.linked-doc-item:hover .linked-doc-actions,
|
|
3954
|
+
.artifact-item:hover .artifact-actions {
|
|
3865
3955
|
opacity: 1;
|
|
3866
3956
|
}
|
|
3867
3957
|
|
|
@@ -3885,7 +3975,55 @@ body::before {
|
|
|
3885
3975
|
text-decoration-style: dashed;
|
|
3886
3976
|
}
|
|
3887
3977
|
|
|
3888
|
-
|
|
3978
|
+
/* A section of the session panel: linked documents, artifacts. */
|
|
3979
|
+
.panel-section {
|
|
3980
|
+
margin-bottom: 16px;
|
|
3981
|
+
font-size: 12px;
|
|
3982
|
+
}
|
|
3983
|
+
|
|
3984
|
+
/* Artifacts are read out of the transcript, so the section renders before the
|
|
3985
|
+
list arrives and stays in the DOM as the patch target when there is none. */
|
|
3986
|
+
.artifacts-section:empty {
|
|
3987
|
+
display: none;
|
|
3988
|
+
}
|
|
3989
|
+
|
|
3990
|
+
.panel-section-header {
|
|
3991
|
+
display: flex;
|
|
3992
|
+
align-items: center;
|
|
3993
|
+
gap: 6px;
|
|
3994
|
+
margin-bottom: 6px;
|
|
3995
|
+
font-size: 11px;
|
|
3996
|
+
font-weight: 500;
|
|
3997
|
+
color: var(--text-muted);
|
|
3998
|
+
text-transform: uppercase;
|
|
3999
|
+
letter-spacing: 0.5px;
|
|
4000
|
+
}
|
|
4001
|
+
|
|
4002
|
+
.panel-section-header svg {
|
|
4003
|
+
width: 12px;
|
|
4004
|
+
height: 12px;
|
|
4005
|
+
}
|
|
4006
|
+
|
|
4007
|
+
.panel-section-count {
|
|
4008
|
+
background: var(--bg-elevated);
|
|
4009
|
+
border: 1px solid var(--border);
|
|
4010
|
+
border-radius: 10px;
|
|
4011
|
+
padding: 0 6px;
|
|
4012
|
+
font-size: 10px;
|
|
4013
|
+
color: var(--text-secondary);
|
|
4014
|
+
}
|
|
4015
|
+
|
|
4016
|
+
/* The artifact title is a URL away from the reader, so it truncates where a file
|
|
4017
|
+
name, which the linked-doc row shows in full, does not. */
|
|
4018
|
+
.artifact-link {
|
|
4019
|
+
overflow: hidden;
|
|
4020
|
+
text-overflow: ellipsis;
|
|
4021
|
+
white-space: nowrap;
|
|
4022
|
+
min-width: 0;
|
|
4023
|
+
}
|
|
4024
|
+
|
|
4025
|
+
.linked-docs-empty,
|
|
4026
|
+
.zen-panel-empty {
|
|
3889
4027
|
color: var(--text-muted);
|
|
3890
4028
|
font-size: 11px;
|
|
3891
4029
|
font-style: italic;
|
|
@@ -4122,6 +4260,7 @@ body.light {
|
|
|
4122
4260
|
--bg-surface: #efede9;
|
|
4123
4261
|
--bg-elevated: #fbfaf9;
|
|
4124
4262
|
--bg-hover: #d2d0cc;
|
|
4263
|
+
--session-active-bg: var(--bg-elevated);
|
|
4125
4264
|
--border: #cfcbc4;
|
|
4126
4265
|
--text-primary: #0a0a0a;
|
|
4127
4266
|
--text-secondary: #444444;
|
|
@@ -4519,8 +4658,21 @@ body.light .msg-assistant .msg-text {
|
|
|
4519
4658
|
max-width: 440px;
|
|
4520
4659
|
}
|
|
4521
4660
|
|
|
4661
|
+
/* Reference card, not reading material: it stays out of the modal zoom, uses the app's
|
|
4662
|
+
small type, and scrolls its body (rule shared with #team-modal) instead of growing past
|
|
4663
|
+
the viewport cap. */
|
|
4522
4664
|
.modal-help {
|
|
4523
|
-
max-width:
|
|
4665
|
+
max-width: 900px;
|
|
4666
|
+
padding: 16px 20px 20px;
|
|
4667
|
+
display: flex;
|
|
4668
|
+
flex-direction: column;
|
|
4669
|
+
font-size: 13px;
|
|
4670
|
+
}
|
|
4671
|
+
.modal-help .modal-header {
|
|
4672
|
+
margin-bottom: 8px;
|
|
4673
|
+
}
|
|
4674
|
+
.modal-help .modal-title {
|
|
4675
|
+
font-size: 14px;
|
|
4524
4676
|
}
|
|
4525
4677
|
|
|
4526
4678
|
/* One shared grid for both halves (key | label | spacer | key | label): each key
|
|
@@ -4844,13 +4996,59 @@ select.form-input option:checked {
|
|
|
4844
4996
|
font-size: 13px;
|
|
4845
4997
|
}
|
|
4846
4998
|
|
|
4999
|
+
.modal.session-picker.peeking {
|
|
5000
|
+
max-width: 1240px;
|
|
5001
|
+
}
|
|
5002
|
+
|
|
5003
|
+
.sp-body {
|
|
5004
|
+
display: flex;
|
|
5005
|
+
gap: 10px;
|
|
5006
|
+
min-height: 0;
|
|
5007
|
+
}
|
|
5008
|
+
|
|
5009
|
+
.sp-body > * {
|
|
5010
|
+
min-width: 0;
|
|
5011
|
+
}
|
|
5012
|
+
|
|
4847
5013
|
.sp-list {
|
|
5014
|
+
flex: 1;
|
|
4848
5015
|
overflow-y: auto;
|
|
4849
5016
|
display: flex;
|
|
4850
5017
|
flex-direction: column;
|
|
4851
5018
|
gap: 2px;
|
|
4852
5019
|
}
|
|
4853
5020
|
|
|
5021
|
+
.sp-peek {
|
|
5022
|
+
flex: 0 0 42%;
|
|
5023
|
+
overflow-y: auto;
|
|
5024
|
+
border-left: 1px solid var(--border);
|
|
5025
|
+
padding-left: 10px;
|
|
5026
|
+
}
|
|
5027
|
+
|
|
5028
|
+
.modal.session-picker:not(.peeking) .sp-peek {
|
|
5029
|
+
display: none;
|
|
5030
|
+
}
|
|
5031
|
+
|
|
5032
|
+
.sp-peek-title {
|
|
5033
|
+
display: flex;
|
|
5034
|
+
align-items: center;
|
|
5035
|
+
justify-content: space-between;
|
|
5036
|
+
gap: 8px;
|
|
5037
|
+
margin-bottom: 6px;
|
|
5038
|
+
font-family: var(--mono);
|
|
5039
|
+
font-size: 11px;
|
|
5040
|
+
color: var(--text-muted);
|
|
5041
|
+
white-space: nowrap;
|
|
5042
|
+
overflow: hidden;
|
|
5043
|
+
text-overflow: ellipsis;
|
|
5044
|
+
}
|
|
5045
|
+
|
|
5046
|
+
/* Row clicks open the live panel's detail modal by index, which means nothing
|
|
5047
|
+
for a peeked session. The renderer's readOnly mode already drops the buttons. */
|
|
5048
|
+
.sp-peek-items {
|
|
5049
|
+
pointer-events: none;
|
|
5050
|
+
}
|
|
5051
|
+
|
|
4854
5052
|
.sp-row {
|
|
4855
5053
|
display: flex;
|
|
4856
5054
|
align-items: center;
|
|
@@ -5391,6 +5589,7 @@ select.form-input option:checked {
|
|
|
5391
5589
|
--bg-surface: #efede9;
|
|
5392
5590
|
--bg-elevated: #fbfaf9;
|
|
5393
5591
|
--bg-hover: #d2d0cc;
|
|
5592
|
+
--session-active-bg: var(--bg-elevated);
|
|
5394
5593
|
--border: #cfcbc4;
|
|
5395
5594
|
--text-primary: #0a0a0a;
|
|
5396
5595
|
--text-secondary: #444444;
|