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.
Files changed (111) hide show
  1. package/.claude/agents/issue-plan-agent.md +859 -0
  2. package/.claude/agents/issue-queue-agent.md +702 -0
  3. package/.claude/commands/issue/execute.md +453 -0
  4. package/.claude/commands/issue/manage.md +865 -0
  5. package/.claude/commands/issue/new.md +484 -0
  6. package/.claude/commands/issue/plan.md +421 -0
  7. package/.claude/commands/issue/queue.md +354 -0
  8. package/.claude/commands/{clean.md → workflow/clean.md} +5 -5
  9. package/.claude/commands/workflow/docs/analyze.md +1467 -0
  10. package/.claude/commands/workflow/docs/copyright.md +1265 -0
  11. package/.claude/commands/workflow/execute.md +0 -1
  12. package/.claude/commands/workflow/tools/conflict-resolution.md +76 -240
  13. package/.claude/commands/workflow/tools/context-gather.md +0 -2
  14. package/.claude/commands/workflow/tools/task-generate-agent.md +81 -8
  15. package/.claude/commands/workflow/tools/task-generate-tdd.md +0 -9
  16. package/.claude/commands/workflow/tools/test-context-gather.md +2 -3
  17. package/.claude/commands/workflow/tools/test-task-generate.md +0 -2
  18. package/.claude/skills/_shared/mermaid-utils.md +584 -0
  19. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -2
  20. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +1 -1
  21. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +1 -2
  22. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +1 -8
  23. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +1 -4
  24. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -2
  25. package/.claude/skills/copyright-docs/SKILL.md +132 -0
  26. package/.claude/skills/copyright-docs/phases/01-metadata-collection.md +78 -0
  27. package/.claude/skills/copyright-docs/phases/01.5-project-exploration.md +150 -0
  28. package/.claude/skills/copyright-docs/phases/02-deep-analysis.md +664 -0
  29. package/.claude/skills/copyright-docs/phases/02.5-consolidation.md +192 -0
  30. package/.claude/skills/copyright-docs/phases/04-document-assembly.md +261 -0
  31. package/.claude/skills/copyright-docs/phases/05-compliance-refinement.md +192 -0
  32. package/.claude/skills/copyright-docs/specs/cpcc-requirements.md +121 -0
  33. package/.claude/skills/copyright-docs/templates/agent-base.md +200 -0
  34. package/.claude/skills/project-analyze/SKILL.md +162 -0
  35. package/.claude/skills/project-analyze/phases/01-requirements-discovery.md +79 -0
  36. package/.claude/skills/project-analyze/phases/02-project-exploration.md +176 -0
  37. package/.claude/skills/project-analyze/phases/03-deep-analysis.md +854 -0
  38. package/.claude/skills/project-analyze/phases/03.5-consolidation.md +233 -0
  39. package/.claude/skills/project-analyze/phases/04-report-generation.md +217 -0
  40. package/.claude/skills/project-analyze/phases/05-iterative-refinement.md +124 -0
  41. package/.claude/skills/project-analyze/specs/quality-standards.md +115 -0
  42. package/.claude/skills/project-analyze/specs/writing-style.md +152 -0
  43. package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +79 -65
  44. package/.claude/workflows/cli-templates/schemas/issue-task-jsonl-schema.json +136 -0
  45. package/.claude/workflows/cli-templates/schemas/issues-jsonl-schema.json +74 -0
  46. package/.claude/workflows/cli-templates/schemas/queue-schema.json +136 -0
  47. package/.claude/workflows/cli-templates/schemas/registry-schema.json +94 -0
  48. package/.claude/workflows/cli-templates/schemas/solution-schema.json +120 -0
  49. package/.claude/workflows/cli-templates/schemas/solutions-jsonl-schema.json +125 -0
  50. package/.codex/prompts/issue-execute.md +266 -0
  51. package/README.md +11 -1
  52. package/ccw/dist/cli.d.ts.map +1 -1
  53. package/ccw/dist/cli.js +25 -0
  54. package/ccw/dist/cli.js.map +1 -1
  55. package/ccw/dist/commands/cli.d.ts.map +1 -1
  56. package/ccw/dist/commands/cli.js +46 -8
  57. package/ccw/dist/commands/cli.js.map +1 -1
  58. package/ccw/dist/commands/issue.d.ts +21 -0
  59. package/ccw/dist/commands/issue.d.ts.map +1 -0
  60. package/ccw/dist/commands/issue.js +895 -0
  61. package/ccw/dist/commands/issue.js.map +1 -0
  62. package/ccw/dist/core/dashboard-generator-patch.js +1 -0
  63. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
  64. package/ccw/dist/core/routes/cli-routes.js +2 -2
  65. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  66. package/ccw/dist/core/routes/issue-routes.d.ts +34 -0
  67. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -0
  68. package/ccw/dist/core/routes/issue-routes.js +487 -0
  69. package/ccw/dist/core/routes/issue-routes.js.map +1 -0
  70. package/ccw/dist/core/server.d.ts.map +1 -1
  71. package/ccw/dist/core/server.js +17 -2
  72. package/ccw/dist/core/server.js.map +1 -1
  73. package/ccw/dist/tools/claude-cli-tools.d.ts +7 -3
  74. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  75. package/ccw/dist/tools/claude-cli-tools.js +31 -17
  76. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  77. package/ccw/dist/tools/smart-search.d.ts +25 -0
  78. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  79. package/ccw/dist/tools/smart-search.js +121 -17
  80. package/ccw/dist/tools/smart-search.js.map +1 -1
  81. package/ccw/src/cli.ts +26 -0
  82. package/ccw/src/commands/cli.ts +49 -7
  83. package/ccw/src/commands/issue.ts +1184 -0
  84. package/ccw/src/core/dashboard-generator-patch.ts +1 -0
  85. package/ccw/src/core/routes/cli-routes.ts +3 -3
  86. package/ccw/src/core/routes/issue-routes.ts +559 -0
  87. package/ccw/src/core/server.ts +17 -2
  88. package/ccw/src/templates/dashboard-css/32-issue-manager.css +2544 -0
  89. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +467 -0
  90. package/ccw/src/templates/dashboard-js/components/cli-history.js +40 -13
  91. package/ccw/src/templates/dashboard-js/components/cli-status.js +26 -2
  92. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +461 -0
  93. package/ccw/src/templates/dashboard-js/components/navigation.js +8 -0
  94. package/ccw/src/templates/dashboard-js/components/notifications.js +16 -0
  95. package/ccw/src/templates/dashboard-js/i18n.js +290 -2
  96. package/ccw/src/templates/dashboard-js/views/cli-manager.js +5 -0
  97. package/ccw/src/templates/dashboard-js/views/history.js +19 -4
  98. package/ccw/src/templates/dashboard-js/views/hook-manager.js +11 -5
  99. package/ccw/src/templates/dashboard-js/views/issue-manager.js +1546 -0
  100. package/ccw/src/templates/dashboard.html +55 -0
  101. package/ccw/src/tools/claude-cli-tools.ts +37 -20
  102. package/ccw/src/tools/smart-search.ts +157 -16
  103. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  104. package/codex-lens/src/codexlens/config.py +5 -0
  105. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  106. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  107. package/codex-lens/src/codexlens/search/hybrid_search.py +144 -11
  108. package/codex-lens/src/codexlens/search/ranking.py +267 -1
  109. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
  110. package/codex-lens/src/codexlens/semantic/chunker.py +55 -10
  111. 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
- let url = `/api/cli/history-native?path=${encodeURIComponent(projectPath)}&limit=${limit}`;
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
- const basePath = sourceDir && sourceDir !== '.'
40
- ? projectPath + '/' + sourceDir
41
- : projectPath;
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
- const basePath = sourceDir && sourceDir !== '.'
69
- ? projectPath + '/' + sourceDir
70
- : projectPath;
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
- // Escape sourceDir for use in onclick
141
- const sourceDirEscaped = exec.sourceDir ? exec.sourceDir.replace(/'/g, "\\'") : '';
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('-')[0]}</span>
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
- const basePath = sourceDir && sourceDir !== '.'
435
- ? projectPath + '/' + sourceDir
436
- : projectPath;
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 ace)
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
- showRefreshToast(`Code Index MCP switched to ${provider === 'ace' ? 'ACE (Augment)' : 'CodexLens'}`, 'success');
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();