claude-code-kanban 4.26.0 → 4.27.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/lib/inline-assets.js +1 -1
- package/lib/parsers.js +113 -0
- package/lib/scratch-files.js +47 -0
- package/package.json +1 -1
- package/public/app.js +496 -83
- package/public/index.html +5 -0
- package/public/style.css +214 -17
- package/server.js +407 -73
package/public/index.html
CHANGED
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>CC Kanban</title>
|
|
7
7
|
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='6' fill='%231a1a1a'/%3E%3Crect x='4' y='6' width='7' height='20' rx='2' fill='%23e8927c'/%3E%3Crect x='13' y='6' width='7' height='14' rx='2' fill='%23e8927c'/%3E%3Crect x='22' y='6' width='7' height='8' rx='2' fill='%23e8927c'/%3E%3C/svg%3E">
|
|
8
|
+
<!-- Chrome uses the SVG only in the tab strip; app windows, shortcuts and the
|
|
9
|
+
history list need a raster icon or they fall back to /favicon.ico and then to
|
|
10
|
+
whatever icon localhost was last seen with, which is a sibling app's. -->
|
|
11
|
+
<link rel="icon" type="image/png" sizes="192x192" href="/icons/icon-192.png">
|
|
12
|
+
<link rel="icon" type="image/png" sizes="512x512" href="/icons/icon-512.png">
|
|
8
13
|
<link rel="manifest" href="/manifest.json">
|
|
9
14
|
<meta name="theme-color" content="#101114" media="(prefers-color-scheme: dark)">
|
|
10
15
|
<meta name="theme-color" content="#e8e6e3" media="(prefers-color-scheme: light)">
|
package/public/style.css
CHANGED
|
@@ -588,6 +588,9 @@ body::before {
|
|
|
588
588
|
|
|
589
589
|
.session-item.kb-selected {
|
|
590
590
|
border-color: var(--accent);
|
|
591
|
+
box-shadow:
|
|
592
|
+
inset 0 0 0 1px var(--accent),
|
|
593
|
+
0 0 10px var(--accent-glow);
|
|
591
594
|
}
|
|
592
595
|
|
|
593
596
|
.session-item.stale {
|
|
@@ -645,7 +648,9 @@ body::before {
|
|
|
645
648
|
padding-right: 22px;
|
|
646
649
|
}
|
|
647
650
|
|
|
648
|
-
.session-indicators .pulse
|
|
651
|
+
.session-indicators .pulse,
|
|
652
|
+
.wf-live-name .pulse {
|
|
653
|
+
flex: none;
|
|
649
654
|
width: 6px;
|
|
650
655
|
height: 6px;
|
|
651
656
|
background: var(--accent);
|
|
@@ -769,7 +774,10 @@ body::before {
|
|
|
769
774
|
transition: width 0.5s ease-out;
|
|
770
775
|
}
|
|
771
776
|
|
|
772
|
-
|
|
777
|
+
/* The live-workflow bar takes the muted fill too: its card already carries a pulsing
|
|
778
|
+
accent dot, and a second accent bar under it shouts. */
|
|
779
|
+
.session-item:not(.active) .progress-fill,
|
|
780
|
+
.wf-live-bar .progress-fill {
|
|
773
781
|
background: color-mix(in srgb, var(--text-tertiary) 55%, transparent);
|
|
774
782
|
}
|
|
775
783
|
|
|
@@ -900,17 +908,6 @@ body::before {
|
|
|
900
908
|
gap: 3px 10px;
|
|
901
909
|
}
|
|
902
910
|
|
|
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
911
|
.zen-scratchpad {
|
|
915
912
|
display: flex;
|
|
916
913
|
align-items: center;
|
|
@@ -3904,6 +3901,7 @@ body::before {
|
|
|
3904
3901
|
}
|
|
3905
3902
|
|
|
3906
3903
|
.linked-doc-list,
|
|
3904
|
+
.scratch-file-list,
|
|
3907
3905
|
.artifact-list {
|
|
3908
3906
|
list-style: none;
|
|
3909
3907
|
padding: 0;
|
|
@@ -3914,6 +3912,7 @@ body::before {
|
|
|
3914
3912
|
}
|
|
3915
3913
|
|
|
3916
3914
|
.linked-doc-item,
|
|
3915
|
+
.scratch-file-item,
|
|
3917
3916
|
.artifact-item {
|
|
3918
3917
|
display: flex;
|
|
3919
3918
|
align-items: baseline;
|
|
@@ -3922,11 +3921,16 @@ body::before {
|
|
|
3922
3921
|
}
|
|
3923
3922
|
|
|
3924
3923
|
.linked-doc-link,
|
|
3924
|
+
.scratch-file-link,
|
|
3925
3925
|
.artifact-link {
|
|
3926
3926
|
color: var(--accent-text);
|
|
3927
3927
|
text-decoration: underline;
|
|
3928
3928
|
text-decoration-style: dotted;
|
|
3929
3929
|
text-underline-offset: 3px;
|
|
3930
|
+
}
|
|
3931
|
+
|
|
3932
|
+
.linked-doc-link,
|
|
3933
|
+
.artifact-link {
|
|
3930
3934
|
flex-shrink: 0;
|
|
3931
3935
|
}
|
|
3932
3936
|
|
|
@@ -3940,21 +3944,87 @@ body::before {
|
|
|
3940
3944
|
min-width: 0;
|
|
3941
3945
|
}
|
|
3942
3946
|
|
|
3947
|
+
.scratch-file-time {
|
|
3948
|
+
color: var(--text-muted);
|
|
3949
|
+
font-size: 11px;
|
|
3950
|
+
opacity: 0.7;
|
|
3951
|
+
white-space: nowrap;
|
|
3952
|
+
flex-shrink: 0;
|
|
3953
|
+
}
|
|
3954
|
+
|
|
3943
3955
|
/* Rides on the shared .row-actions group; only the reveal trigger differs — per row
|
|
3944
3956
|
here, per grid in the session info. margin-left:auto pins the group to the same
|
|
3945
3957
|
right edge however long the names in between are. */
|
|
3946
3958
|
.linked-doc-actions,
|
|
3959
|
+
.scratch-file-actions,
|
|
3947
3960
|
.artifact-actions {
|
|
3948
3961
|
margin-left: auto;
|
|
3949
3962
|
align-self: center;
|
|
3950
3963
|
flex-shrink: 0;
|
|
3964
|
+
/* Two .row-actions buttons wide (22px each, 4px gap), filled from the left, so a
|
|
3965
|
+
row with one action puts it in the same column as the rows that have two. */
|
|
3966
|
+
min-width: 48px;
|
|
3967
|
+
justify-content: flex-start;
|
|
3951
3968
|
}
|
|
3952
3969
|
|
|
3953
3970
|
.linked-doc-item:hover .linked-doc-actions,
|
|
3971
|
+
.scratch-file-item:hover .scratch-file-actions,
|
|
3954
3972
|
.artifact-item:hover .artifact-actions {
|
|
3955
3973
|
opacity: 1;
|
|
3956
3974
|
}
|
|
3957
3975
|
|
|
3976
|
+
/* Hangs off the Scratchpad path row, so it carries no header of its own. */
|
|
3977
|
+
.scratch-files-section {
|
|
3978
|
+
margin-top: 6px;
|
|
3979
|
+
font-size: 11px;
|
|
3980
|
+
}
|
|
3981
|
+
|
|
3982
|
+
.scratch-file-link {
|
|
3983
|
+
background: none;
|
|
3984
|
+
border: none;
|
|
3985
|
+
padding: 0;
|
|
3986
|
+
font: inherit;
|
|
3987
|
+
cursor: pointer;
|
|
3988
|
+
text-align: left;
|
|
3989
|
+
/* A scratch name can be longer than the zen panel is wide; without this it pushes
|
|
3990
|
+
the action buttons out of their column. The full path is on the title. */
|
|
3991
|
+
min-width: 0;
|
|
3992
|
+
overflow: hidden;
|
|
3993
|
+
text-overflow: ellipsis;
|
|
3994
|
+
white-space: nowrap;
|
|
3995
|
+
}
|
|
3996
|
+
|
|
3997
|
+
.scratch-files-more {
|
|
3998
|
+
margin: 6px 0 0;
|
|
3999
|
+
font-size: 11px;
|
|
4000
|
+
}
|
|
4001
|
+
|
|
4002
|
+
/* A folder row wraps so its child list lands on its own full-width line under the
|
|
4003
|
+
name, indented one chevron in. */
|
|
4004
|
+
.scratch-folder-item {
|
|
4005
|
+
flex-wrap: wrap;
|
|
4006
|
+
}
|
|
4007
|
+
|
|
4008
|
+
.scratch-folder-item > .scratch-file-list,
|
|
4009
|
+
.scratch-folder-item > .scratch-folder-empty {
|
|
4010
|
+
flex-basis: 100%;
|
|
4011
|
+
margin-top: 4px;
|
|
4012
|
+
padding-left: 14px;
|
|
4013
|
+
}
|
|
4014
|
+
|
|
4015
|
+
.scratch-folder-empty {
|
|
4016
|
+
color: var(--text-muted);
|
|
4017
|
+
opacity: 0.7;
|
|
4018
|
+
}
|
|
4019
|
+
|
|
4020
|
+
.scratch-folder-toggle {
|
|
4021
|
+
display: inline-flex;
|
|
4022
|
+
align-items: center;
|
|
4023
|
+
gap: 4px;
|
|
4024
|
+
text-decoration: none;
|
|
4025
|
+
color: var(--text-secondary);
|
|
4026
|
+
}
|
|
4027
|
+
|
|
3958
4028
|
/* The × is a glyph, not an svg, so .row-actions button svg does not size it. */
|
|
3959
4029
|
.linked-doc-remove {
|
|
3960
4030
|
font-family: var(--mono);
|
|
@@ -3978,15 +4048,107 @@ body::before {
|
|
|
3978
4048
|
/* A section of the session panel: linked documents, artifacts. */
|
|
3979
4049
|
.panel-section {
|
|
3980
4050
|
margin-bottom: 16px;
|
|
3981
|
-
|
|
4051
|
+
padding-top: 10px;
|
|
4052
|
+
border-top: 1px solid var(--border);
|
|
4053
|
+
font-size: 11px;
|
|
4054
|
+
}
|
|
4055
|
+
|
|
4056
|
+
.linked-docs-section {
|
|
4057
|
+
margin-top: 12px;
|
|
3982
4058
|
}
|
|
3983
4059
|
|
|
3984
4060
|
/* Artifacts are read out of the transcript, so the section renders before the
|
|
3985
4061
|
list arrives and stays in the DOM as the patch target when there is none. */
|
|
3986
|
-
.artifacts-section:empty
|
|
4062
|
+
.artifacts-section:empty,
|
|
4063
|
+
.scratch-files-section:empty,
|
|
4064
|
+
.workflow-live-section:empty {
|
|
3987
4065
|
display: none;
|
|
3988
4066
|
}
|
|
3989
4067
|
|
|
4068
|
+
/* Its own card below the zen panel — the run is live state, not session detail, so it
|
|
4069
|
+
comes and goes on its own while the panel above stays put. */
|
|
4070
|
+
.workflow-live-section {
|
|
4071
|
+
margin-top: 10px;
|
|
4072
|
+
padding: 10px;
|
|
4073
|
+
background: var(--bg-elevated);
|
|
4074
|
+
border: 1px solid var(--border);
|
|
4075
|
+
border-radius: 8px;
|
|
4076
|
+
font-size: 11px;
|
|
4077
|
+
}
|
|
4078
|
+
|
|
4079
|
+
.wf-live {
|
|
4080
|
+
cursor: pointer;
|
|
4081
|
+
}
|
|
4082
|
+
|
|
4083
|
+
.wf-live-name {
|
|
4084
|
+
display: flex;
|
|
4085
|
+
align-items: center;
|
|
4086
|
+
gap: 6px;
|
|
4087
|
+
font-size: 12px;
|
|
4088
|
+
font-weight: 500;
|
|
4089
|
+
color: var(--text-primary);
|
|
4090
|
+
overflow: hidden;
|
|
4091
|
+
text-overflow: ellipsis;
|
|
4092
|
+
white-space: nowrap;
|
|
4093
|
+
}
|
|
4094
|
+
|
|
4095
|
+
.wf-live-bar {
|
|
4096
|
+
margin: 6px 0;
|
|
4097
|
+
}
|
|
4098
|
+
|
|
4099
|
+
.wf-live-phases {
|
|
4100
|
+
display: flex;
|
|
4101
|
+
flex-wrap: wrap;
|
|
4102
|
+
gap: 4px;
|
|
4103
|
+
}
|
|
4104
|
+
|
|
4105
|
+
/* A phase reads as one chip, so the dot goes in ::before rather than costing a span. */
|
|
4106
|
+
.wf-live-phase {
|
|
4107
|
+
display: flex;
|
|
4108
|
+
align-items: center;
|
|
4109
|
+
gap: 4px;
|
|
4110
|
+
padding: 1px 6px;
|
|
4111
|
+
border: 1px solid var(--border);
|
|
4112
|
+
border-radius: 10px;
|
|
4113
|
+
font-size: 10px;
|
|
4114
|
+
color: var(--text-secondary);
|
|
4115
|
+
}
|
|
4116
|
+
|
|
4117
|
+
.wf-live-phase::before {
|
|
4118
|
+
content: '';
|
|
4119
|
+
width: 5px;
|
|
4120
|
+
height: 5px;
|
|
4121
|
+
border-radius: 50%;
|
|
4122
|
+
background: var(--text-muted);
|
|
4123
|
+
}
|
|
4124
|
+
|
|
4125
|
+
.wf-live-phase.running::before {
|
|
4126
|
+
background: var(--accent);
|
|
4127
|
+
animation: pulse 2s ease-in-out infinite;
|
|
4128
|
+
}
|
|
4129
|
+
|
|
4130
|
+
.wf-live-phase.done::before {
|
|
4131
|
+
background: var(--ok, #3fb950);
|
|
4132
|
+
}
|
|
4133
|
+
|
|
4134
|
+
.wf-live-phase.done {
|
|
4135
|
+
color: var(--text-muted);
|
|
4136
|
+
}
|
|
4137
|
+
|
|
4138
|
+
.wf-live-phase-count {
|
|
4139
|
+
font-family: var(--font-mono);
|
|
4140
|
+
}
|
|
4141
|
+
|
|
4142
|
+
.wf-live-running {
|
|
4143
|
+
margin-top: 6px;
|
|
4144
|
+
overflow: hidden;
|
|
4145
|
+
text-overflow: ellipsis;
|
|
4146
|
+
white-space: nowrap;
|
|
4147
|
+
font-family: var(--font-mono);
|
|
4148
|
+
font-size: 10px;
|
|
4149
|
+
color: var(--text-muted);
|
|
4150
|
+
}
|
|
4151
|
+
|
|
3990
4152
|
.panel-section-header {
|
|
3991
4153
|
display: flex;
|
|
3992
4154
|
align-items: center;
|
|
@@ -4555,6 +4717,16 @@ body.light .msg-assistant .msg-text {
|
|
|
4555
4717
|
padding-right: 8px;
|
|
4556
4718
|
}
|
|
4557
4719
|
|
|
4720
|
+
#preview-modal-body .preview-image {
|
|
4721
|
+
display: block;
|
|
4722
|
+
max-width: 100%;
|
|
4723
|
+
max-height: 70vh;
|
|
4724
|
+
margin: 0 auto;
|
|
4725
|
+
border: 1px solid var(--border);
|
|
4726
|
+
border-radius: 4px;
|
|
4727
|
+
background: var(--bg-hover);
|
|
4728
|
+
}
|
|
4729
|
+
|
|
4558
4730
|
#preview-modal-meta {
|
|
4559
4731
|
margin-top: 12px;
|
|
4560
4732
|
font-size: 11px;
|
|
@@ -4598,6 +4770,29 @@ body.light .msg-assistant .msg-text {
|
|
|
4598
4770
|
padding-right: 0;
|
|
4599
4771
|
}
|
|
4600
4772
|
|
|
4773
|
+
/* Source is read line by line, so it keeps its own line breaks and scrolls sideways
|
|
4774
|
+
instead of inheriting the body's `word-break: break-word`. */
|
|
4775
|
+
.preview-source {
|
|
4776
|
+
margin: 0;
|
|
4777
|
+
padding: 10px 12px;
|
|
4778
|
+
background: var(--bg-elevated);
|
|
4779
|
+
border: 1px solid var(--border);
|
|
4780
|
+
border-radius: 6px;
|
|
4781
|
+
overflow-x: auto;
|
|
4782
|
+
font-family: var(--mono);
|
|
4783
|
+
font-size: 12px;
|
|
4784
|
+
line-height: 1.55;
|
|
4785
|
+
white-space: pre;
|
|
4786
|
+
word-break: normal;
|
|
4787
|
+
tab-size: 4;
|
|
4788
|
+
}
|
|
4789
|
+
|
|
4790
|
+
.preview-source code {
|
|
4791
|
+
background: none;
|
|
4792
|
+
padding: 0;
|
|
4793
|
+
font: inherit;
|
|
4794
|
+
}
|
|
4795
|
+
|
|
4601
4796
|
.preview-html-frame {
|
|
4602
4797
|
width: 100%;
|
|
4603
4798
|
height: 100%;
|
|
@@ -5753,7 +5948,8 @@ pre.mermaid svg {
|
|
|
5753
5948
|
|
|
5754
5949
|
.project-group-header .group-chevron,
|
|
5755
5950
|
.session-group-header .group-chevron,
|
|
5756
|
-
.sg-section-toggle .group-chevron
|
|
5951
|
+
.sg-section-toggle .group-chevron,
|
|
5952
|
+
.scratch-folder-toggle .group-chevron {
|
|
5757
5953
|
transition: transform 0.15s ease;
|
|
5758
5954
|
flex-shrink: 0;
|
|
5759
5955
|
display: block;
|
|
@@ -5761,7 +5957,8 @@ pre.mermaid svg {
|
|
|
5761
5957
|
|
|
5762
5958
|
.project-group-header.collapsed .group-chevron,
|
|
5763
5959
|
.session-group-header.collapsed .group-chevron,
|
|
5764
|
-
.sg-section-toggle.collapsed .group-chevron
|
|
5960
|
+
.sg-section-toggle.collapsed .group-chevron,
|
|
5961
|
+
.scratch-folder-toggle.collapsed .group-chevron {
|
|
5765
5962
|
transform: rotate(-90deg);
|
|
5766
5963
|
}
|
|
5767
5964
|
|