claude-code-workflow 6.1.1 → 6.1.4

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.
@@ -136,6 +136,13 @@ function showLiteTaskDetailPage(sessionKey) {
136
136
  <span class="tab-icon"><i data-lucide="ruler" class="w-4 h-4"></i></span>
137
137
  <span class="tab-text">Plan</span>
138
138
  </button>
139
+ ${session.type === 'lite-fix' ? `
140
+ <button class="detail-tab" data-tab="diagnoses" onclick="switchLiteDetailTab('diagnoses')">
141
+ <span class="tab-icon"><i data-lucide="stethoscope" class="w-4 h-4"></i></span>
142
+ <span class="tab-text">Diagnoses</span>
143
+ ${session.diagnoses?.items?.length ? `<span class="tab-count">${session.diagnoses.items.length}</span>` : ''}
144
+ </button>
145
+ ` : ''}
139
146
  <button class="detail-tab" data-tab="context" onclick="switchLiteDetailTab('context')">
140
147
  <span class="tab-icon"><i data-lucide="package" class="w-4 h-4"></i></span>
141
148
  <span class="tab-text">Context</span>
@@ -196,6 +203,17 @@ function switchLiteDetailTab(tabName) {
196
203
  break;
197
204
  case 'plan':
198
205
  contentArea.innerHTML = renderLitePlanTab(session);
206
+ // Re-initialize collapsible sections for plan tab
207
+ setTimeout(() => {
208
+ initCollapsibleSections(contentArea);
209
+ }, 50);
210
+ break;
211
+ case 'diagnoses':
212
+ contentArea.innerHTML = renderDiagnosesTab(session);
213
+ // Re-initialize collapsible sections for diagnoses tab
214
+ setTimeout(() => {
215
+ initCollapsibleSections(contentArea);
216
+ }, 50);
199
217
  break;
200
218
  case 'context':
201
219
  loadAndRenderLiteContextTab(session, contentArea);
@@ -287,13 +305,14 @@ function openTaskDrawerForLite(sessionId, taskId) {
287
305
 
288
306
  function renderLitePlanTab(session) {
289
307
  const plan = session.plan;
308
+ const isFixPlan = session.type === 'lite-fix';
290
309
 
291
310
  if (!plan) {
292
311
  return `
293
312
  <div class="tab-empty-state">
294
313
  <div class="empty-icon"><i data-lucide="ruler" class="w-12 h-12"></i></div>
295
314
  <div class="empty-title">No Plan Data</div>
296
- <div class="empty-text">No plan.json found for this session.</div>
315
+ <div class="empty-text">No ${isFixPlan ? 'fix-plan.json' : 'plan.json'} found for this session.</div>
297
316
  </div>
298
317
  `;
299
318
  }
@@ -308,6 +327,22 @@ function renderLitePlanTab(session) {
308
327
  </div>
309
328
  ` : ''}
310
329
 
330
+ <!-- Root Cause (fix-plan specific) -->
331
+ ${plan.root_cause ? `
332
+ <div class="plan-section">
333
+ <h4 class="plan-section-title"><i data-lucide="search" class="w-4 h-4 inline mr-1"></i> Root Cause</h4>
334
+ <p class="plan-root-cause-text">${escapeHtml(plan.root_cause)}</p>
335
+ </div>
336
+ ` : ''}
337
+
338
+ <!-- Strategy (fix-plan specific) -->
339
+ ${plan.strategy ? `
340
+ <div class="plan-section">
341
+ <h4 class="plan-section-title"><i data-lucide="route" class="w-4 h-4 inline mr-1"></i> Fix Strategy</h4>
342
+ <p class="plan-strategy-text">${escapeHtml(plan.strategy)}</p>
343
+ </div>
344
+ ` : ''}
345
+
311
346
  <!-- Approach -->
312
347
  ${plan.approach ? `
313
348
  <div class="plan-section">
@@ -316,6 +351,14 @@ function renderLitePlanTab(session) {
316
351
  </div>
317
352
  ` : ''}
318
353
 
354
+ <!-- User Requirements (fix-plan specific) -->
355
+ ${plan.user_requirements ? `
356
+ <div class="plan-section">
357
+ <h4 class="plan-section-title"><i data-lucide="user" class="w-4 h-4 inline mr-1"></i> User Requirements</h4>
358
+ <p class="plan-requirements-text">${escapeHtml(plan.user_requirements)}</p>
359
+ </div>
360
+ ` : ''}
361
+
319
362
  <!-- Focus Paths -->
320
363
  ${plan.focus_paths?.length ? `
321
364
  <div class="plan-section">
@@ -330,16 +373,74 @@ function renderLitePlanTab(session) {
330
373
  <div class="plan-section">
331
374
  <h4 class="plan-section-title"><i data-lucide="info" class="w-4 h-4 inline mr-1"></i> Metadata</h4>
332
375
  <div class="plan-meta-grid">
376
+ ${plan.severity ? `<div class="meta-item"><span class="meta-label">Severity:</span> <span class="severity-badge ${escapeHtml(plan.severity)}">${escapeHtml(plan.severity)}</span></div>` : ''}
377
+ ${plan.risk_level ? `<div class="meta-item"><span class="meta-label">Risk Level:</span> <span class="risk-badge ${escapeHtml(plan.risk_level)}">${escapeHtml(plan.risk_level)}</span></div>` : ''}
333
378
  ${plan.estimated_time ? `<div class="meta-item"><span class="meta-label">Estimated Time:</span> ${escapeHtml(plan.estimated_time)}</div>` : ''}
334
379
  ${plan.complexity ? `<div class="meta-item"><span class="meta-label">Complexity:</span> ${escapeHtml(plan.complexity)}</div>` : ''}
335
380
  ${plan.recommended_execution ? `<div class="meta-item"><span class="meta-label">Execution:</span> ${escapeHtml(plan.recommended_execution)}</div>` : ''}
336
381
  </div>
337
382
  </div>
338
383
 
384
+ <!-- Fix Tasks Summary (fix-plan specific) -->
385
+ ${plan.tasks?.length ? `
386
+ <div class="plan-section">
387
+ <h4 class="plan-section-title"><i data-lucide="list-checks" class="w-4 h-4 inline mr-1"></i> Fix Tasks (${plan.tasks.length})</h4>
388
+ <div class="fix-tasks-summary">
389
+ ${plan.tasks.map((task, idx) => `
390
+ <div class="fix-task-summary-item collapsible-section">
391
+ <div class="collapsible-header">
392
+ <span class="collapse-icon">▶</span>
393
+ <span class="task-num">#${idx + 1}</span>
394
+ <span class="task-title-brief">${escapeHtml(task.title || task.summary || 'Untitled')}</span>
395
+ ${task.scope ? `<span class="task-scope-badge">${escapeHtml(task.scope)}</span>` : ''}
396
+ </div>
397
+ <div class="collapsible-content collapsed">
398
+ ${task.modification_points?.length ? `
399
+ <div class="task-detail-section">
400
+ <strong>Modification Points:</strong>
401
+ <ul class="mod-points-list">
402
+ ${task.modification_points.map(mp => `
403
+ <li>
404
+ <code>${escapeHtml(mp.file || '')}</code>
405
+ ${mp.function_name ? `<span class="func-name">→ ${escapeHtml(mp.function_name)}</span>` : ''}
406
+ ${mp.change_type ? `<span class="change-type">(${escapeHtml(mp.change_type)})</span>` : ''}
407
+ </li>
408
+ `).join('')}
409
+ </ul>
410
+ </div>
411
+ ` : ''}
412
+ ${task.implementation?.length ? `
413
+ <div class="task-detail-section">
414
+ <strong>Implementation Steps:</strong>
415
+ <ol class="impl-steps-list">
416
+ ${task.implementation.map(step => `<li>${escapeHtml(step)}</li>`).join('')}
417
+ </ol>
418
+ </div>
419
+ ` : ''}
420
+ ${task.verification?.length ? `
421
+ <div class="task-detail-section">
422
+ <strong>Verification:</strong>
423
+ <ul class="verify-list">
424
+ ${task.verification.map(v => `<li>${escapeHtml(v)}</li>`).join('')}
425
+ </ul>
426
+ </div>
427
+ ` : ''}
428
+ </div>
429
+ </div>
430
+ `).join('')}
431
+ </div>
432
+ </div>
433
+ ` : ''}
434
+
339
435
  <!-- Raw JSON -->
340
- <div class="plan-section">
341
- <h4 class="plan-section-title">{ } Raw JSON</h4>
342
- <pre class="json-content">${escapeHtml(JSON.stringify(plan, null, 2))}</pre>
436
+ <div class="plan-section collapsible-section">
437
+ <div class="collapsible-header">
438
+ <span class="collapse-icon">▶</span>
439
+ <span class="section-label">{ } Raw JSON</span>
440
+ </div>
441
+ <div class="collapsible-content collapsed">
442
+ <pre class="json-content">${escapeHtml(JSON.stringify(plan, null, 2))}</pre>
443
+ </div>
343
444
  </div>
344
445
  </div>
345
446
  `;
@@ -393,3 +494,192 @@ async function loadAndRenderLiteSummaryTab(session, contentArea) {
393
494
  contentArea.innerHTML = `<div class="tab-error">Failed to load summaries: ${err.message}</div>`;
394
495
  }
395
496
  }
497
+
498
+ // ============================================
499
+ // DIAGNOSES TAB RENDERING (lite-fix specific)
500
+ // ============================================
501
+
502
+ function renderDiagnosesTab(session) {
503
+ const diagnoses = session.diagnoses;
504
+
505
+ if (!diagnoses || (!diagnoses.manifest && diagnoses.items?.length === 0)) {
506
+ return `
507
+ <div class="tab-empty-state">
508
+ <div class="empty-icon"><i data-lucide="stethoscope" class="w-12 h-12"></i></div>
509
+ <div class="empty-title">No Diagnoses</div>
510
+ <div class="empty-text">No diagnosis-*.json files found for this session.</div>
511
+ </div>
512
+ `;
513
+ }
514
+
515
+ let sections = [];
516
+
517
+ // Manifest summary (if available)
518
+ if (diagnoses.manifest) {
519
+ sections.push(`
520
+ <div class="diagnoses-manifest-section">
521
+ <h4 class="diagnoses-section-title"><i data-lucide="clipboard-check" class="w-4 h-4 inline mr-1"></i> Diagnosis Summary</h4>
522
+ <div class="manifest-meta-grid">
523
+ ${diagnoses.manifest.total_diagnoses ? `<div class="meta-item"><span class="meta-label">Total Diagnoses:</span> ${diagnoses.manifest.total_diagnoses}</div>` : ''}
524
+ ${diagnoses.manifest.diagnosis_angles ? `<div class="meta-item"><span class="meta-label">Angles:</span> ${diagnoses.manifest.diagnosis_angles.join(', ')}</div>` : ''}
525
+ ${diagnoses.manifest.created_at ? `<div class="meta-item"><span class="meta-label">Created:</span> ${formatDate(diagnoses.manifest.created_at)}</div>` : ''}
526
+ </div>
527
+ </div>
528
+ `);
529
+ }
530
+
531
+ // Individual diagnosis items
532
+ if (diagnoses.items && diagnoses.items.length > 0) {
533
+ const diagnosisCards = diagnoses.items.map(diag => renderDiagnosisCard(diag)).join('');
534
+ sections.push(`
535
+ <div class="diagnoses-items-section">
536
+ <h4 class="diagnoses-section-title"><i data-lucide="search" class="w-4 h-4 inline mr-1"></i> Diagnosis Details (${diagnoses.items.length})</h4>
537
+ <div class="diagnoses-grid">
538
+ ${diagnosisCards}
539
+ </div>
540
+ </div>
541
+ `);
542
+ }
543
+
544
+ return `<div class="diagnoses-tab-content">${sections.join('')}</div>`;
545
+ }
546
+
547
+ function renderDiagnosisCard(diag) {
548
+ const diagJsonId = `diag-json-${diag.id}`.replace(/[^a-zA-Z0-9-]/g, '-');
549
+ taskJsonStore[diagJsonId] = diag;
550
+
551
+ return `
552
+ <div class="diagnosis-card collapsible-section">
553
+ <div class="collapsible-header diagnosis-header">
554
+ <span class="collapse-icon">▶</span>
555
+ <span class="diagnosis-id"><i data-lucide="file-search" class="w-4 h-4 inline mr-1"></i>${escapeHtml(diag.id)}</span>
556
+ <button class="btn-view-json" onclick="event.stopPropagation(); showJsonModal('${diagJsonId}', '${escapeHtml(diag.id)}')">{ } JSON</button>
557
+ </div>
558
+ <div class="collapsible-content collapsed">
559
+ ${renderDiagnosisContent(diag)}
560
+ </div>
561
+ </div>
562
+ `;
563
+ }
564
+
565
+ function renderDiagnosisContent(diag) {
566
+ let content = [];
567
+
568
+ // Summary/Overview
569
+ if (diag.summary || diag.overview) {
570
+ content.push(`
571
+ <div class="diag-section">
572
+ <strong>Summary:</strong>
573
+ <p>${escapeHtml(diag.summary || diag.overview)}</p>
574
+ </div>
575
+ `);
576
+ }
577
+
578
+ // Root Cause Analysis
579
+ if (diag.root_cause || diag.root_cause_analysis) {
580
+ content.push(`
581
+ <div class="diag-section">
582
+ <strong>Root Cause:</strong>
583
+ <p>${escapeHtml(diag.root_cause || diag.root_cause_analysis)}</p>
584
+ </div>
585
+ `);
586
+ }
587
+
588
+ // Issues/Findings
589
+ if (diag.issues && Array.isArray(diag.issues)) {
590
+ content.push(`
591
+ <div class="diag-section">
592
+ <strong>Issues Found (${diag.issues.length}):</strong>
593
+ <ul class="issues-list">
594
+ ${diag.issues.map(issue => `
595
+ <li class="issue-item">
596
+ ${typeof issue === 'string' ? escapeHtml(issue) : `
597
+ <div class="issue-title">${escapeHtml(issue.title || issue.description || 'Unknown')}</div>
598
+ ${issue.location ? `<div class="issue-location"><code>${escapeHtml(issue.location)}</code></div>` : ''}
599
+ ${issue.severity ? `<span class="severity-badge ${issue.severity}">${escapeHtml(issue.severity)}</span>` : ''}
600
+ `}
601
+ </li>
602
+ `).join('')}
603
+ </ul>
604
+ </div>
605
+ `);
606
+ }
607
+
608
+ // Affected Files
609
+ if (diag.affected_files && Array.isArray(diag.affected_files)) {
610
+ content.push(`
611
+ <div class="diag-section">
612
+ <strong>Affected Files:</strong>
613
+ <div class="path-tags">
614
+ ${diag.affected_files.map(f => `<span class="path-tag">${escapeHtml(typeof f === 'string' ? f : f.path || f.file)}</span>`).join('')}
615
+ </div>
616
+ </div>
617
+ `);
618
+ }
619
+
620
+ // API Contracts (for api-contracts diagnosis)
621
+ if (diag.contracts && Array.isArray(diag.contracts)) {
622
+ content.push(`
623
+ <div class="diag-section">
624
+ <strong>API Contracts (${diag.contracts.length}):</strong>
625
+ <div class="contracts-list">
626
+ ${diag.contracts.map(contract => `
627
+ <div class="contract-item">
628
+ <div class="contract-header">
629
+ <span class="contract-endpoint">${escapeHtml(contract.endpoint || contract.name || 'Unknown')}</span>
630
+ ${contract.method ? `<span class="contract-method">${escapeHtml(contract.method)}</span>` : ''}
631
+ </div>
632
+ ${contract.description ? `<div class="contract-desc">${escapeHtml(contract.description)}</div>` : ''}
633
+ ${contract.issues?.length ? `<div class="contract-issues">${contract.issues.length} issue(s)</div>` : ''}
634
+ </div>
635
+ `).join('')}
636
+ </div>
637
+ </div>
638
+ `);
639
+ }
640
+
641
+ // Dataflow Analysis (for dataflow diagnosis)
642
+ if (diag.dataflow || diag.data_flow) {
643
+ const df = diag.dataflow || diag.data_flow;
644
+ content.push(`
645
+ <div class="diag-section">
646
+ <strong>Data Flow Analysis:</strong>
647
+ ${typeof df === 'string' ? `<p>${escapeHtml(df)}</p>` : `
648
+ <div class="dataflow-details">
649
+ ${df.source ? `<div class="df-item"><span class="df-label">Source:</span> ${escapeHtml(df.source)}</div>` : ''}
650
+ ${df.sink ? `<div class="df-item"><span class="df-label">Sink:</span> ${escapeHtml(df.sink)}</div>` : ''}
651
+ ${df.transformations?.length ? `
652
+ <div class="df-item">
653
+ <span class="df-label">Transformations:</span>
654
+ <ol class="df-transforms">${df.transformations.map(t => `<li>${escapeHtml(t)}</li>`).join('')}</ol>
655
+ </div>
656
+ ` : ''}
657
+ </div>
658
+ `}
659
+ </div>
660
+ `);
661
+ }
662
+
663
+ // Recommendations
664
+ if (diag.recommendations && Array.isArray(diag.recommendations)) {
665
+ content.push(`
666
+ <div class="diag-section">
667
+ <strong>Recommendations:</strong>
668
+ <ol class="recommendations-list">
669
+ ${diag.recommendations.map(rec => `<li>${escapeHtml(typeof rec === 'string' ? rec : rec.description || rec.action)}</li>`).join('')}
670
+ </ol>
671
+ </div>
672
+ `);
673
+ }
674
+
675
+ // If no specific content was rendered, show raw JSON preview
676
+ if (content.length === 0) {
677
+ content.push(`
678
+ <div class="diag-section">
679
+ <pre class="json-content">${escapeHtml(JSON.stringify(diag, null, 2))}</pre>
680
+ </div>
681
+ `);
682
+ }
683
+
684
+ return content.join('');
685
+ }
package/package.json CHANGED
@@ -1,67 +1,67 @@
1
- {
2
- "name": "claude-code-workflow",
3
- "version": "6.1.1",
4
- "description": "JSON-driven multi-agent development framework with intelligent CLI orchestration (Gemini/Qwen/Codex), context-first architecture, and automated workflow execution",
5
- "type": "module",
6
- "main": "ccw/src/index.js",
7
- "bin": {
8
- "ccw": "./ccw/bin/ccw.js"
9
- },
10
- "scripts": {
11
- "start": "node ccw/bin/ccw.js",
12
- "test": "node --test",
13
- "prepublishOnly": "echo 'Ready to publish @dyw/claude-code-workflow'"
14
- },
15
- "keywords": [
16
- "claude",
17
- "workflow",
18
- "ai",
19
- "cli",
20
- "dashboard",
21
- "code-review",
22
- "automation",
23
- "development"
24
- ],
25
- "author": "dyw",
26
- "license": "MIT",
27
- "engines": {
28
- "node": ">=16.0.0"
29
- },
30
- "dependencies": {
31
- "boxen": "^7.1.0",
32
- "chalk": "^5.3.0",
33
- "commander": "^11.0.0",
34
- "figlet": "^1.7.0",
35
- "glob": "^10.3.0",
36
- "gradient-string": "^2.0.2",
37
- "inquirer": "^9.2.0",
38
- "open": "^9.1.0",
39
- "ora": "^7.0.0"
40
- },
41
- "files": [
42
- "ccw/bin/",
43
- "ccw/src/",
44
- "ccw/package.json",
45
- ".claude/agents/",
46
- ".claude/commands/",
47
- ".claude/output-styles/",
48
- ".claude/workflows/",
49
- ".claude/scripts/",
50
- ".claude/prompt-templates/",
51
- ".claude/python_script/",
52
- ".claude/skills/",
53
- ".codex/",
54
- ".gemini/",
55
- ".qwen/",
56
- "CLAUDE.md",
57
- "README.md"
58
- ],
59
- "repository": {
60
- "type": "git",
61
- "url": "git+https://github.com/catlog22/Claude-Code-Workflow.git"
62
- },
63
- "bugs": {
64
- "url": "https://github.com/catlog22/Claude-Code-Workflow/issues"
65
- },
66
- "homepage": "https://github.com/catlog22/Claude-Code-Workflow#readme"
67
- }
1
+ {
2
+ "name": "claude-code-workflow",
3
+ "version": "6.1.4",
4
+ "description": "JSON-driven multi-agent development framework with intelligent CLI orchestration (Gemini/Qwen/Codex), context-first architecture, and automated workflow execution",
5
+ "type": "module",
6
+ "main": "ccw/src/index.js",
7
+ "bin": {
8
+ "ccw": "./ccw/bin/ccw.js"
9
+ },
10
+ "scripts": {
11
+ "start": "node ccw/bin/ccw.js",
12
+ "test": "node --test",
13
+ "prepublishOnly": "echo 'Ready to publish @dyw/claude-code-workflow'"
14
+ },
15
+ "keywords": [
16
+ "claude",
17
+ "workflow",
18
+ "ai",
19
+ "cli",
20
+ "dashboard",
21
+ "code-review",
22
+ "automation",
23
+ "development"
24
+ ],
25
+ "author": "dyw",
26
+ "license": "MIT",
27
+ "engines": {
28
+ "node": ">=16.0.0"
29
+ },
30
+ "dependencies": {
31
+ "boxen": "^7.1.0",
32
+ "chalk": "^5.3.0",
33
+ "commander": "^11.0.0",
34
+ "figlet": "^1.7.0",
35
+ "glob": "^10.3.0",
36
+ "gradient-string": "^2.0.2",
37
+ "inquirer": "^9.2.0",
38
+ "open": "^9.1.0",
39
+ "ora": "^7.0.0"
40
+ },
41
+ "files": [
42
+ "ccw/bin/",
43
+ "ccw/src/",
44
+ "ccw/package.json",
45
+ ".claude/agents/",
46
+ ".claude/commands/",
47
+ ".claude/output-styles/",
48
+ ".claude/workflows/",
49
+ ".claude/scripts/",
50
+ ".claude/prompt-templates/",
51
+ ".claude/python_script/",
52
+ ".claude/skills/",
53
+ ".codex/",
54
+ ".gemini/",
55
+ ".qwen/",
56
+ "CLAUDE.md",
57
+ "README.md"
58
+ ],
59
+ "repository": {
60
+ "type": "git",
61
+ "url": "git+https://github.com/catlog22/Claude-Code-Workflow.git"
62
+ },
63
+ "bugs": {
64
+ "url": "https://github.com/catlog22/Claude-Code-Workflow/issues"
65
+ },
66
+ "homepage": "https://github.com/catlog22/Claude-Code-Workflow#readme"
67
+ }