claude-code-workflow 6.3.4 → 6.3.6
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/.claude/agents/issue-plan-agent.md +859 -0
- package/.claude/agents/issue-queue-agent.md +702 -0
- package/.claude/commands/issue/execute.md +453 -0
- package/.claude/commands/issue/manage.md +865 -0
- package/.claude/commands/issue/new.md +484 -0
- package/.claude/commands/issue/plan.md +421 -0
- package/.claude/commands/issue/queue.md +354 -0
- package/.claude/commands/{clean.md → workflow/clean.md} +5 -5
- package/.claude/commands/workflow/docs/analyze.md +1467 -0
- package/.claude/commands/workflow/docs/copyright.md +1265 -0
- package/.claude/commands/workflow/execute.md +0 -1
- package/.claude/commands/workflow/tools/conflict-resolution.md +76 -240
- package/.claude/commands/workflow/tools/context-gather.md +0 -2
- package/.claude/commands/workflow/tools/task-generate-agent.md +81 -8
- package/.claude/commands/workflow/tools/task-generate-tdd.md +0 -9
- package/.claude/commands/workflow/tools/test-context-gather.md +2 -3
- package/.claude/commands/workflow/tools/test-task-generate.md +0 -2
- package/.claude/skills/_shared/mermaid-utils.md +584 -0
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -2
- package/.claude/skills/command-guide/reference/commands/workflow/execute.md +1 -1
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +1 -2
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +1 -8
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +1 -4
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -2
- package/.claude/skills/copyright-docs/SKILL.md +132 -0
- package/.claude/skills/copyright-docs/phases/01-metadata-collection.md +78 -0
- package/.claude/skills/copyright-docs/phases/01.5-project-exploration.md +150 -0
- package/.claude/skills/copyright-docs/phases/02-deep-analysis.md +664 -0
- package/.claude/skills/copyright-docs/phases/02.5-consolidation.md +192 -0
- package/.claude/skills/copyright-docs/phases/04-document-assembly.md +261 -0
- package/.claude/skills/copyright-docs/phases/05-compliance-refinement.md +192 -0
- package/.claude/skills/copyright-docs/specs/cpcc-requirements.md +121 -0
- package/.claude/skills/copyright-docs/templates/agent-base.md +200 -0
- package/.claude/skills/project-analyze/SKILL.md +162 -0
- package/.claude/skills/project-analyze/phases/01-requirements-discovery.md +79 -0
- package/.claude/skills/project-analyze/phases/02-project-exploration.md +176 -0
- package/.claude/skills/project-analyze/phases/03-deep-analysis.md +854 -0
- package/.claude/skills/project-analyze/phases/03.5-consolidation.md +233 -0
- package/.claude/skills/project-analyze/phases/04-report-generation.md +217 -0
- package/.claude/skills/project-analyze/phases/05-iterative-refinement.md +124 -0
- package/.claude/skills/project-analyze/specs/quality-standards.md +115 -0
- package/.claude/skills/project-analyze/specs/writing-style.md +152 -0
- package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +79 -65
- package/.claude/workflows/cli-templates/schemas/issue-task-jsonl-schema.json +136 -0
- package/.claude/workflows/cli-templates/schemas/issues-jsonl-schema.json +74 -0
- package/.claude/workflows/cli-templates/schemas/queue-schema.json +136 -0
- package/.claude/workflows/cli-templates/schemas/registry-schema.json +94 -0
- package/.claude/workflows/cli-templates/schemas/solution-schema.json +120 -0
- package/.claude/workflows/cli-templates/schemas/solutions-jsonl-schema.json +125 -0
- package/.codex/prompts/issue-execute.md +266 -0
- package/README.md +11 -1
- package/ccw/dist/cli.d.ts.map +1 -1
- package/ccw/dist/cli.js +25 -0
- package/ccw/dist/cli.js.map +1 -1
- package/ccw/dist/commands/cli.d.ts.map +1 -1
- package/ccw/dist/commands/cli.js +46 -8
- package/ccw/dist/commands/cli.js.map +1 -1
- package/ccw/dist/commands/issue.d.ts +21 -0
- package/ccw/dist/commands/issue.d.ts.map +1 -0
- package/ccw/dist/commands/issue.js +895 -0
- package/ccw/dist/commands/issue.js.map +1 -0
- package/ccw/dist/core/dashboard-generator-patch.js +1 -0
- package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +2 -2
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/issue-routes.d.ts +34 -0
- package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/issue-routes.js +487 -0
- package/ccw/dist/core/routes/issue-routes.js.map +1 -0
- package/ccw/dist/core/server.d.ts.map +1 -1
- package/ccw/dist/core/server.js +17 -2
- package/ccw/dist/core/server.js.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.d.ts +7 -3
- package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.js +31 -17
- package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
- package/ccw/dist/tools/smart-search.d.ts +25 -0
- package/ccw/dist/tools/smart-search.d.ts.map +1 -1
- package/ccw/dist/tools/smart-search.js +121 -17
- package/ccw/dist/tools/smart-search.js.map +1 -1
- package/ccw/src/cli.ts +26 -0
- package/ccw/src/commands/cli.ts +49 -7
- package/ccw/src/commands/issue.ts +1184 -0
- package/ccw/src/core/dashboard-generator-patch.ts +1 -0
- package/ccw/src/core/routes/cli-routes.ts +3 -3
- package/ccw/src/core/routes/issue-routes.ts +559 -0
- package/ccw/src/core/server.ts +17 -2
- package/ccw/src/templates/dashboard-css/32-issue-manager.css +2544 -0
- package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +467 -0
- package/ccw/src/templates/dashboard-js/components/cli-history.js +40 -13
- package/ccw/src/templates/dashboard-js/components/cli-status.js +26 -2
- package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +461 -0
- package/ccw/src/templates/dashboard-js/components/navigation.js +8 -0
- package/ccw/src/templates/dashboard-js/components/notifications.js +16 -0
- package/ccw/src/templates/dashboard-js/i18n.js +290 -2
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +5 -0
- package/ccw/src/templates/dashboard-js/views/history.js +19 -4
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +11 -5
- package/ccw/src/templates/dashboard-js/views/issue-manager.js +1546 -0
- package/ccw/src/templates/dashboard.html +55 -0
- package/ccw/src/tools/claude-cli-tools.ts +37 -20
- package/ccw/src/tools/smart-search.ts +157 -16
- package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/config.py +5 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/hybrid_search.py +144 -11
- package/codex-lens/src/codexlens/search/ranking.py +267 -1
- package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/chunker.py +55 -10
- package/package.json +2 -2
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Stream Viewer Styles
|
|
3
|
+
* Right-side popup panel for viewing CLI streaming output
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* ===== Overlay ===== */
|
|
7
|
+
.cli-stream-overlay {
|
|
8
|
+
position: fixed;
|
|
9
|
+
inset: 0;
|
|
10
|
+
background: rgb(0 0 0 / 0.3);
|
|
11
|
+
z-index: 1050;
|
|
12
|
+
opacity: 0;
|
|
13
|
+
visibility: hidden;
|
|
14
|
+
transition: all 0.3s ease;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.cli-stream-overlay.open {
|
|
18
|
+
opacity: 1;
|
|
19
|
+
visibility: visible;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* ===== Main Panel ===== */
|
|
23
|
+
.cli-stream-viewer {
|
|
24
|
+
position: fixed;
|
|
25
|
+
top: 60px;
|
|
26
|
+
right: 16px;
|
|
27
|
+
width: 650px;
|
|
28
|
+
max-width: calc(100vw - 32px);
|
|
29
|
+
max-height: calc(100vh - 80px);
|
|
30
|
+
background: hsl(var(--card));
|
|
31
|
+
border: 1px solid hsl(var(--border));
|
|
32
|
+
border-radius: 8px;
|
|
33
|
+
box-shadow: 0 8px 32px rgb(0 0 0 / 0.2);
|
|
34
|
+
z-index: 1100;
|
|
35
|
+
display: flex;
|
|
36
|
+
flex-direction: column;
|
|
37
|
+
transform: translateX(calc(100% + 20px));
|
|
38
|
+
opacity: 0;
|
|
39
|
+
visibility: hidden;
|
|
40
|
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.cli-stream-viewer.open {
|
|
44
|
+
transform: translateX(0);
|
|
45
|
+
opacity: 1;
|
|
46
|
+
visibility: visible;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* ===== Header ===== */
|
|
50
|
+
.cli-stream-header {
|
|
51
|
+
display: flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
justify-content: space-between;
|
|
54
|
+
padding: 12px 16px;
|
|
55
|
+
border-bottom: 1px solid hsl(var(--border));
|
|
56
|
+
background: hsl(var(--muted) / 0.3);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.cli-stream-title {
|
|
60
|
+
display: flex;
|
|
61
|
+
align-items: center;
|
|
62
|
+
gap: 8px;
|
|
63
|
+
font-size: 0.875rem;
|
|
64
|
+
font-weight: 600;
|
|
65
|
+
color: hsl(var(--foreground));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.cli-stream-title svg,
|
|
69
|
+
.cli-stream-title i {
|
|
70
|
+
width: 18px;
|
|
71
|
+
height: 18px;
|
|
72
|
+
color: hsl(var(--primary));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.cli-stream-count-badge {
|
|
76
|
+
display: inline-flex;
|
|
77
|
+
align-items: center;
|
|
78
|
+
justify-content: center;
|
|
79
|
+
min-width: 20px;
|
|
80
|
+
height: 20px;
|
|
81
|
+
padding: 0 6px;
|
|
82
|
+
background: hsl(var(--muted));
|
|
83
|
+
color: hsl(var(--muted-foreground));
|
|
84
|
+
border-radius: 10px;
|
|
85
|
+
font-size: 0.6875rem;
|
|
86
|
+
font-weight: 600;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.cli-stream-count-badge.has-running {
|
|
90
|
+
background: hsl(var(--warning));
|
|
91
|
+
color: hsl(var(--warning-foreground, white));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.cli-stream-actions {
|
|
95
|
+
display: flex;
|
|
96
|
+
align-items: center;
|
|
97
|
+
gap: 8px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.cli-stream-action-btn {
|
|
101
|
+
display: flex;
|
|
102
|
+
align-items: center;
|
|
103
|
+
gap: 4px;
|
|
104
|
+
padding: 4px 10px;
|
|
105
|
+
background: transparent;
|
|
106
|
+
border: 1px solid hsl(var(--border));
|
|
107
|
+
border-radius: 4px;
|
|
108
|
+
font-size: 0.75rem;
|
|
109
|
+
color: hsl(var(--muted-foreground));
|
|
110
|
+
cursor: pointer;
|
|
111
|
+
transition: all 0.15s;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.cli-stream-action-btn:hover {
|
|
115
|
+
background: hsl(var(--hover));
|
|
116
|
+
color: hsl(var(--foreground));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.cli-stream-close-btn {
|
|
120
|
+
display: flex;
|
|
121
|
+
align-items: center;
|
|
122
|
+
justify-content: center;
|
|
123
|
+
width: 28px;
|
|
124
|
+
height: 28px;
|
|
125
|
+
padding: 0;
|
|
126
|
+
background: transparent;
|
|
127
|
+
border: none;
|
|
128
|
+
border-radius: 4px;
|
|
129
|
+
font-size: 1.25rem;
|
|
130
|
+
color: hsl(var(--muted-foreground));
|
|
131
|
+
cursor: pointer;
|
|
132
|
+
transition: all 0.15s;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.cli-stream-close-btn:hover {
|
|
136
|
+
background: hsl(var(--destructive) / 0.1);
|
|
137
|
+
color: hsl(var(--destructive));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* ===== Tab Bar ===== */
|
|
141
|
+
.cli-stream-tabs {
|
|
142
|
+
display: flex;
|
|
143
|
+
gap: 2px;
|
|
144
|
+
padding: 8px 12px;
|
|
145
|
+
border-bottom: 1px solid hsl(var(--border));
|
|
146
|
+
background: hsl(var(--muted) / 0.2);
|
|
147
|
+
overflow-x: auto;
|
|
148
|
+
scrollbar-width: thin;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.cli-stream-tabs::-webkit-scrollbar {
|
|
152
|
+
height: 4px;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.cli-stream-tabs::-webkit-scrollbar-thumb {
|
|
156
|
+
background: hsl(var(--border));
|
|
157
|
+
border-radius: 2px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.cli-stream-tab {
|
|
161
|
+
display: flex;
|
|
162
|
+
align-items: center;
|
|
163
|
+
gap: 6px;
|
|
164
|
+
padding: 6px 12px;
|
|
165
|
+
background: transparent;
|
|
166
|
+
border: 1px solid transparent;
|
|
167
|
+
border-radius: 6px;
|
|
168
|
+
font-size: 0.75rem;
|
|
169
|
+
color: hsl(var(--muted-foreground));
|
|
170
|
+
cursor: pointer;
|
|
171
|
+
white-space: nowrap;
|
|
172
|
+
transition: all 0.15s;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.cli-stream-tab:hover {
|
|
176
|
+
background: hsl(var(--hover));
|
|
177
|
+
color: hsl(var(--foreground));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.cli-stream-tab.active {
|
|
181
|
+
background: hsl(var(--card));
|
|
182
|
+
border-color: hsl(var(--primary));
|
|
183
|
+
color: hsl(var(--foreground));
|
|
184
|
+
box-shadow: 0 1px 3px rgb(0 0 0 / 0.1);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.cli-stream-tab-status {
|
|
188
|
+
width: 8px;
|
|
189
|
+
height: 8px;
|
|
190
|
+
border-radius: 50%;
|
|
191
|
+
flex-shrink: 0;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.cli-stream-tab-status.running {
|
|
195
|
+
background: hsl(var(--warning));
|
|
196
|
+
animation: streamStatusPulse 1.5s ease-in-out infinite;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.cli-stream-tab-status.completed {
|
|
200
|
+
background: hsl(var(--success));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.cli-stream-tab-status.error {
|
|
204
|
+
background: hsl(var(--destructive));
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
@keyframes streamStatusPulse {
|
|
208
|
+
0%, 100% { opacity: 1; transform: scale(1); }
|
|
209
|
+
50% { opacity: 0.6; transform: scale(1.2); }
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.cli-stream-tab-tool {
|
|
213
|
+
font-weight: 500;
|
|
214
|
+
text-transform: capitalize;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.cli-stream-tab-mode {
|
|
218
|
+
font-size: 0.625rem;
|
|
219
|
+
padding: 1px 4px;
|
|
220
|
+
background: hsl(var(--muted));
|
|
221
|
+
border-radius: 3px;
|
|
222
|
+
color: hsl(var(--muted-foreground));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.cli-stream-tab-close {
|
|
226
|
+
display: flex;
|
|
227
|
+
align-items: center;
|
|
228
|
+
justify-content: center;
|
|
229
|
+
width: 16px;
|
|
230
|
+
height: 16px;
|
|
231
|
+
margin-left: 4px;
|
|
232
|
+
background: transparent;
|
|
233
|
+
border: none;
|
|
234
|
+
border-radius: 50%;
|
|
235
|
+
font-size: 0.75rem;
|
|
236
|
+
color: hsl(var(--muted-foreground));
|
|
237
|
+
cursor: pointer;
|
|
238
|
+
opacity: 0;
|
|
239
|
+
transition: all 0.15s;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.cli-stream-tab:hover .cli-stream-tab-close {
|
|
243
|
+
opacity: 1;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.cli-stream-tab-close:hover {
|
|
247
|
+
background: hsl(var(--destructive) / 0.2);
|
|
248
|
+
color: hsl(var(--destructive));
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.cli-stream-tab-close.disabled {
|
|
252
|
+
cursor: not-allowed;
|
|
253
|
+
opacity: 0.3 !important;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/* ===== Empty State ===== */
|
|
257
|
+
.cli-stream-empty {
|
|
258
|
+
display: flex;
|
|
259
|
+
flex-direction: column;
|
|
260
|
+
align-items: center;
|
|
261
|
+
justify-content: center;
|
|
262
|
+
padding: 48px 24px;
|
|
263
|
+
color: hsl(var(--muted-foreground));
|
|
264
|
+
text-align: center;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.cli-stream-empty svg,
|
|
268
|
+
.cli-stream-empty i {
|
|
269
|
+
width: 48px;
|
|
270
|
+
height: 48px;
|
|
271
|
+
margin-bottom: 16px;
|
|
272
|
+
opacity: 0.5;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.cli-stream-empty-title {
|
|
276
|
+
font-size: 0.875rem;
|
|
277
|
+
font-weight: 500;
|
|
278
|
+
margin-bottom: 4px;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.cli-stream-empty-hint {
|
|
282
|
+
font-size: 0.75rem;
|
|
283
|
+
opacity: 0.7;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/* ===== Terminal Content ===== */
|
|
287
|
+
.cli-stream-content {
|
|
288
|
+
flex: 1;
|
|
289
|
+
min-height: 300px;
|
|
290
|
+
max-height: 500px;
|
|
291
|
+
overflow-y: auto;
|
|
292
|
+
padding: 12px 16px;
|
|
293
|
+
background: hsl(220 13% 8%);
|
|
294
|
+
font-family: var(--font-mono, 'Consolas', 'Monaco', 'Courier New', monospace);
|
|
295
|
+
font-size: 0.75rem;
|
|
296
|
+
line-height: 1.6;
|
|
297
|
+
scrollbar-width: thin;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.cli-stream-content::-webkit-scrollbar {
|
|
301
|
+
width: 8px;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.cli-stream-content::-webkit-scrollbar-track {
|
|
305
|
+
background: transparent;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.cli-stream-content::-webkit-scrollbar-thumb {
|
|
309
|
+
background: hsl(0 0% 40%);
|
|
310
|
+
border-radius: 4px;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
.cli-stream-line {
|
|
314
|
+
white-space: pre-wrap;
|
|
315
|
+
word-break: break-all;
|
|
316
|
+
margin: 0;
|
|
317
|
+
padding: 0;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.cli-stream-line.stdout {
|
|
321
|
+
color: hsl(0 0% 85%);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
.cli-stream-line.stderr {
|
|
325
|
+
color: hsl(8 75% 65%);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
.cli-stream-line.system {
|
|
329
|
+
color: hsl(210 80% 65%);
|
|
330
|
+
font-style: italic;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.cli-stream-line.info {
|
|
334
|
+
color: hsl(200 80% 70%);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/* Auto-scroll indicator */
|
|
338
|
+
.cli-stream-scroll-btn {
|
|
339
|
+
position: sticky;
|
|
340
|
+
bottom: 8px;
|
|
341
|
+
left: 50%;
|
|
342
|
+
transform: translateX(-50%);
|
|
343
|
+
display: inline-flex;
|
|
344
|
+
align-items: center;
|
|
345
|
+
gap: 4px;
|
|
346
|
+
padding: 4px 12px;
|
|
347
|
+
background: hsl(var(--primary));
|
|
348
|
+
color: white;
|
|
349
|
+
border: none;
|
|
350
|
+
border-radius: 12px;
|
|
351
|
+
font-size: 0.625rem;
|
|
352
|
+
cursor: pointer;
|
|
353
|
+
opacity: 0;
|
|
354
|
+
transition: opacity 0.2s;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
.cli-stream-content.has-new-content .cli-stream-scroll-btn {
|
|
358
|
+
opacity: 1;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/* ===== Status Bar ===== */
|
|
362
|
+
.cli-stream-status {
|
|
363
|
+
display: flex;
|
|
364
|
+
align-items: center;
|
|
365
|
+
justify-content: space-between;
|
|
366
|
+
padding: 8px 16px;
|
|
367
|
+
border-top: 1px solid hsl(var(--border));
|
|
368
|
+
background: hsl(var(--muted) / 0.3);
|
|
369
|
+
font-size: 0.6875rem;
|
|
370
|
+
color: hsl(var(--muted-foreground));
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.cli-stream-status-info {
|
|
374
|
+
display: flex;
|
|
375
|
+
align-items: center;
|
|
376
|
+
gap: 12px;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
.cli-stream-status-item {
|
|
380
|
+
display: flex;
|
|
381
|
+
align-items: center;
|
|
382
|
+
gap: 4px;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
.cli-stream-status-item svg,
|
|
386
|
+
.cli-stream-status-item i {
|
|
387
|
+
width: 12px;
|
|
388
|
+
height: 12px;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
.cli-stream-status-actions {
|
|
392
|
+
display: flex;
|
|
393
|
+
align-items: center;
|
|
394
|
+
gap: 8px;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
.cli-stream-toggle-btn {
|
|
398
|
+
display: flex;
|
|
399
|
+
align-items: center;
|
|
400
|
+
gap: 4px;
|
|
401
|
+
padding: 2px 8px;
|
|
402
|
+
background: transparent;
|
|
403
|
+
border: 1px solid hsl(var(--border));
|
|
404
|
+
border-radius: 3px;
|
|
405
|
+
font-size: 0.625rem;
|
|
406
|
+
color: hsl(var(--muted-foreground));
|
|
407
|
+
cursor: pointer;
|
|
408
|
+
transition: all 0.15s;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
.cli-stream-toggle-btn:hover {
|
|
412
|
+
background: hsl(var(--hover));
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
.cli-stream-toggle-btn.active {
|
|
416
|
+
background: hsl(var(--primary) / 0.1);
|
|
417
|
+
border-color: hsl(var(--primary));
|
|
418
|
+
color: hsl(var(--primary));
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/* ===== Header Button & Badge ===== */
|
|
422
|
+
.cli-stream-btn {
|
|
423
|
+
position: relative;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
.cli-stream-badge {
|
|
427
|
+
position: absolute;
|
|
428
|
+
top: -2px;
|
|
429
|
+
right: -2px;
|
|
430
|
+
min-width: 14px;
|
|
431
|
+
height: 14px;
|
|
432
|
+
padding: 0 4px;
|
|
433
|
+
background: hsl(var(--warning));
|
|
434
|
+
color: white;
|
|
435
|
+
border-radius: 7px;
|
|
436
|
+
font-size: 0.5625rem;
|
|
437
|
+
font-weight: 600;
|
|
438
|
+
display: none;
|
|
439
|
+
align-items: center;
|
|
440
|
+
justify-content: center;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
.cli-stream-badge.has-running {
|
|
444
|
+
display: flex;
|
|
445
|
+
animation: streamBadgePulse 1.5s ease-in-out infinite;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
@keyframes streamBadgePulse {
|
|
449
|
+
0%, 100% { transform: scale(1); }
|
|
450
|
+
50% { transform: scale(1.15); }
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/* ===== Responsive ===== */
|
|
454
|
+
@media (max-width: 768px) {
|
|
455
|
+
.cli-stream-viewer {
|
|
456
|
+
top: 56px;
|
|
457
|
+
right: 8px;
|
|
458
|
+
left: 8px;
|
|
459
|
+
width: auto;
|
|
460
|
+
max-height: calc(100vh - 72px);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
.cli-stream-content {
|
|
464
|
+
min-height: 200px;
|
|
465
|
+
max-height: 350px;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
@@ -15,7 +15,9 @@ async function loadCliHistory(options = {}) {
|
|
|
15
15
|
const { limit = cliHistoryLimit, tool = cliHistoryFilter, status = null } = options;
|
|
16
16
|
|
|
17
17
|
// Use history-native endpoint to get native session info
|
|
18
|
-
|
|
18
|
+
// Use recursiveQueryEnabled setting (from cli-status.js) to control recursive query
|
|
19
|
+
const recursive = typeof recursiveQueryEnabled !== 'undefined' ? recursiveQueryEnabled : true;
|
|
20
|
+
let url = `/api/cli/history-native?path=${encodeURIComponent(projectPath)}&limit=${limit}&recursive=${recursive}`;
|
|
19
21
|
if (tool) url += `&tool=${tool}`;
|
|
20
22
|
if (status) url += `&status=${status}`;
|
|
21
23
|
if (cliHistorySearch) url += `&search=${encodeURIComponent(cliHistorySearch)}`;
|
|
@@ -36,9 +38,12 @@ async function loadCliHistory(options = {}) {
|
|
|
36
38
|
async function loadNativeSessionContent(executionId, sourceDir) {
|
|
37
39
|
try {
|
|
38
40
|
// If sourceDir provided, use it to build the correct path
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
// Check if sourceDir is absolute path (contains : or starts with /)
|
|
42
|
+
let basePath = projectPath;
|
|
43
|
+
if (sourceDir && sourceDir !== '.') {
|
|
44
|
+
const isAbsolute = sourceDir.includes(':') || sourceDir.startsWith('/');
|
|
45
|
+
basePath = isAbsolute ? sourceDir : projectPath + '/' + sourceDir;
|
|
46
|
+
}
|
|
42
47
|
const url = `/api/cli/native-session?path=${encodeURIComponent(basePath)}&id=${encodeURIComponent(executionId)}`;
|
|
43
48
|
const response = await fetch(url);
|
|
44
49
|
if (!response.ok) return null;
|
|
@@ -65,9 +70,12 @@ async function loadEnrichedConversation(executionId) {
|
|
|
65
70
|
async function loadExecutionDetail(executionId, sourceDir) {
|
|
66
71
|
try {
|
|
67
72
|
// If sourceDir provided, use it to build the correct path
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
73
|
+
// Check if sourceDir is absolute path (contains : or starts with /)
|
|
74
|
+
let basePath = projectPath;
|
|
75
|
+
if (sourceDir && sourceDir !== '.') {
|
|
76
|
+
const isAbsolute = sourceDir.includes(':') || sourceDir.startsWith('/');
|
|
77
|
+
basePath = isAbsolute ? sourceDir : projectPath + '/' + sourceDir;
|
|
78
|
+
}
|
|
71
79
|
const url = `/api/cli/execution?path=${encodeURIComponent(basePath)}&id=${encodeURIComponent(executionId)}`;
|
|
72
80
|
const response = await fetch(url);
|
|
73
81
|
if (!response.ok) throw new Error('Execution not found');
|
|
@@ -137,8 +145,9 @@ function renderCliHistory() {
|
|
|
137
145
|
</span>`
|
|
138
146
|
: '';
|
|
139
147
|
|
|
140
|
-
//
|
|
141
|
-
|
|
148
|
+
// Normalize and escape sourceDir for use in onclick
|
|
149
|
+
// Convert backslashes to forward slashes to prevent JS escape issues in onclick
|
|
150
|
+
const sourceDirEscaped = exec.sourceDir ? exec.sourceDir.replace(/\\/g, '/').replace(/'/g, "\\'") : '';
|
|
142
151
|
|
|
143
152
|
return `
|
|
144
153
|
<div class="cli-history-item ${hasNative ? 'has-native' : ''}">
|
|
@@ -155,11 +164,14 @@ function renderCliHistory() {
|
|
|
155
164
|
<div class="cli-history-meta">
|
|
156
165
|
<span><i data-lucide="clock" class="w-3 h-3"></i> ${timeAgo}</span>
|
|
157
166
|
<span><i data-lucide="timer" class="w-3 h-3"></i> ${duration}</span>
|
|
158
|
-
<span><i data-lucide="hash" class="w-3 h-3"></i> ${exec.id.split('-')
|
|
167
|
+
<span title="${exec.id}"><i data-lucide="hash" class="w-3 h-3"></i> ${exec.id.substring(0, 13)}...${exec.id.split('-').pop()}</span>
|
|
159
168
|
${turnBadge}
|
|
160
169
|
</div>
|
|
161
170
|
</div>
|
|
162
171
|
<div class="cli-history-actions">
|
|
172
|
+
<button class="btn-icon" onclick="event.stopPropagation(); copyCliExecutionId('${exec.id}')" title="Copy ID">
|
|
173
|
+
<i data-lucide="copy" class="w-3.5 h-3.5"></i>
|
|
174
|
+
</button>
|
|
163
175
|
${hasNative ? `
|
|
164
176
|
<button class="btn-icon" onclick="event.stopPropagation(); showNativeSessionDetail('${exec.id}', '${sourceDirEscaped}')" title="View Native Session">
|
|
165
177
|
<i data-lucide="file-json" class="w-3.5 h-3.5"></i>
|
|
@@ -431,9 +443,12 @@ function confirmDeleteExecution(executionId, sourceDir) {
|
|
|
431
443
|
async function deleteExecution(executionId, sourceDir) {
|
|
432
444
|
try {
|
|
433
445
|
// Build correct path - use sourceDir if provided for recursive items
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
446
|
+
// Check if sourceDir is absolute path (contains : or starts with /)
|
|
447
|
+
let basePath = projectPath;
|
|
448
|
+
if (sourceDir && sourceDir !== '.') {
|
|
449
|
+
const isAbsolute = sourceDir.includes(':') || sourceDir.startsWith('/');
|
|
450
|
+
basePath = isAbsolute ? sourceDir : projectPath + '/' + sourceDir;
|
|
451
|
+
}
|
|
437
452
|
|
|
438
453
|
const response = await fetch(`/api/cli/execution?path=${encodeURIComponent(basePath)}&id=${encodeURIComponent(executionId)}`, {
|
|
439
454
|
method: 'DELETE'
|
|
@@ -461,6 +476,18 @@ async function deleteExecution(executionId, sourceDir) {
|
|
|
461
476
|
}
|
|
462
477
|
|
|
463
478
|
// ========== Copy Functions ==========
|
|
479
|
+
async function copyCliExecutionId(executionId) {
|
|
480
|
+
if (navigator.clipboard) {
|
|
481
|
+
try {
|
|
482
|
+
await navigator.clipboard.writeText(executionId);
|
|
483
|
+
showRefreshToast('ID copied: ' + executionId, 'success');
|
|
484
|
+
} catch (err) {
|
|
485
|
+
console.error('Failed to copy ID:', err);
|
|
486
|
+
showRefreshToast('Failed to copy ID', 'error');
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
464
491
|
async function copyExecutionPrompt(executionId) {
|
|
465
492
|
const detail = await loadExecutionDetail(executionId);
|
|
466
493
|
if (!detail) {
|
|
@@ -21,9 +21,24 @@ let nativeResumeEnabled = localStorage.getItem('ccw-native-resume') !== 'false';
|
|
|
21
21
|
// Recursive Query settings (for hierarchical storage aggregation)
|
|
22
22
|
let recursiveQueryEnabled = localStorage.getItem('ccw-recursive-query') !== 'false'; // default true
|
|
23
23
|
|
|
24
|
-
// Code Index MCP provider (codexlens or
|
|
24
|
+
// Code Index MCP provider (codexlens, ace, or none)
|
|
25
25
|
let codeIndexMcpProvider = 'codexlens';
|
|
26
26
|
|
|
27
|
+
// ========== Helper Functions ==========
|
|
28
|
+
/**
|
|
29
|
+
* Get the context-tools filename based on provider
|
|
30
|
+
*/
|
|
31
|
+
function getContextToolsFileName(provider) {
|
|
32
|
+
switch (provider) {
|
|
33
|
+
case 'ace':
|
|
34
|
+
return 'context-tools-ace.md';
|
|
35
|
+
case 'none':
|
|
36
|
+
return 'context-tools-none.md';
|
|
37
|
+
default:
|
|
38
|
+
return 'context-tools.md';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
27
42
|
// ========== Initialization ==========
|
|
28
43
|
function initCliStatus() {
|
|
29
44
|
// Load all statuses in one call using aggregated endpoint
|
|
@@ -637,9 +652,17 @@ function renderCliStatus() {
|
|
|
637
652
|
onclick="setCodeIndexMcpProvider('ace')">
|
|
638
653
|
ACE
|
|
639
654
|
</button>
|
|
655
|
+
<button class="code-mcp-btn px-3 py-1.5 text-xs font-medium rounded-md transition-all ${codeIndexMcpProvider === 'none' ? 'bg-primary text-primary-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground'}"
|
|
656
|
+
onclick="setCodeIndexMcpProvider('none')">
|
|
657
|
+
None
|
|
658
|
+
</button>
|
|
640
659
|
</div>
|
|
641
660
|
</div>
|
|
642
661
|
<p class="cli-setting-desc">Code search provider (updates CLAUDE.md context-tools reference)</p>
|
|
662
|
+
<p class="cli-setting-desc text-xs text-muted-foreground mt-1">
|
|
663
|
+
<i data-lucide="file-text" class="w-3 h-3 inline-block mr-1"></i>
|
|
664
|
+
Current: <code class="bg-muted px-1 rounded">${getContextToolsFileName(codeIndexMcpProvider)}</code>
|
|
665
|
+
</p>
|
|
643
666
|
</div>
|
|
644
667
|
</div>
|
|
645
668
|
</div>
|
|
@@ -775,7 +798,8 @@ async function setCodeIndexMcpProvider(provider) {
|
|
|
775
798
|
if (window.claudeCliToolsConfig && window.claudeCliToolsConfig.settings) {
|
|
776
799
|
window.claudeCliToolsConfig.settings.codeIndexMcp = provider;
|
|
777
800
|
}
|
|
778
|
-
|
|
801
|
+
const providerName = provider === 'ace' ? 'ACE (Augment)' : provider === 'none' ? 'None (Built-in only)' : 'CodexLens';
|
|
802
|
+
showRefreshToast(`Code Index MCP switched to ${providerName}`, 'success');
|
|
779
803
|
// Re-render both CLI status and settings section
|
|
780
804
|
if (typeof renderCliStatus === 'function') renderCliStatus();
|
|
781
805
|
if (typeof renderCliSettingsSection === 'function') renderCliSettingsSection();
|