claude-code-workflow 6.0.4 → 6.1.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.
Files changed (120) hide show
  1. package/.claude/agents/action-planning-agent.md +1 -1
  2. package/.claude/agents/cli-execution-agent.md +269 -269
  3. package/.claude/agents/cli-explore-agent.md +182 -182
  4. package/.claude/agents/context-search-agent.md +582 -582
  5. package/.claude/agents/memory-bridge.md +93 -93
  6. package/.claude/commands/cli/cli-init.md +1 -1
  7. package/.claude/commands/memory/docs-full-cli.md +471 -471
  8. package/.claude/commands/memory/docs-related-cli.md +386 -386
  9. package/.claude/commands/memory/docs.md +615 -615
  10. package/.claude/commands/memory/load.md +1 -1
  11. package/.claude/commands/memory/update-full.md +332 -332
  12. package/.claude/commands/memory/update-related.md +5 -5
  13. package/.claude/commands/workflow/init.md +1 -1
  14. package/.claude/commands/workflow/lite-fix.md +621 -621
  15. package/.claude/commands/workflow/lite-plan.md +592 -592
  16. package/.claude/commands/workflow/tools/context-gather.md +434 -434
  17. package/.claude/commands/workflow/ui-design/generate.md +504 -504
  18. package/.claude/commands/workflow/ui-design/import-from-code.md +537 -537
  19. package/.claude/scripts/classify-folders.sh +4 -0
  20. package/.claude/scripts/convert_tokens_to_css.sh +4 -0
  21. package/.claude/scripts/detect_changed_modules.sh +5 -1
  22. package/.claude/scripts/discover-design-files.sh +87 -83
  23. package/.claude/scripts/generate_module_docs.sh +717 -713
  24. package/.claude/scripts/get_modules_by_depth.sh +5 -1
  25. package/.claude/scripts/ui-generate-preview.sh +4 -0
  26. package/.claude/scripts/ui-instantiate-prototypes.sh +4 -0
  27. package/.claude/scripts/update_module_claude.sh +4 -0
  28. package/.claude/skills/command-guide/index/all-commands.json +1 -12
  29. package/.claude/skills/command-guide/index/by-category.json +1 -12
  30. package/.claude/skills/command-guide/index/by-use-case.json +1 -12
  31. package/.claude/skills/command-guide/index/essential-commands.json +1 -12
  32. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +127 -71
  33. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +269 -269
  34. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +182 -182
  35. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +18 -38
  36. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +582 -577
  37. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
  38. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +1 -1
  39. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
  40. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
  41. package/.claude/skills/command-guide/reference/commands/memory/docs.md +615 -610
  42. package/.claude/skills/command-guide/reference/commands/memory/load.md +1 -1
  43. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
  44. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +5 -5
  45. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +299 -451
  46. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +14 -37
  47. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +252 -350
  48. package/.claude/skills/command-guide/reference/commands/workflow/init.md +2 -2
  49. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +52 -0
  50. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +621 -602
  51. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +46 -36
  52. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +18 -58
  53. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +22 -52
  54. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +19 -48
  55. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +25 -5
  56. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +1 -1
  57. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +7 -7
  58. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
  59. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +151 -11
  60. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +4 -4
  61. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +1 -1
  62. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +504 -504
  63. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +537 -537
  64. package/.claude/workflows/context-search-strategy.md +77 -77
  65. package/.claude/workflows/tool-strategy.md +90 -71
  66. package/.claude/workflows/workflow-architecture.md +1 -1
  67. package/ccw/package.json +6 -6
  68. package/ccw/src/cli.js +16 -0
  69. package/ccw/src/commands/stop.js +101 -0
  70. package/ccw/src/commands/tool.js +181 -0
  71. package/ccw/src/core/dashboard-generator.js +18 -3
  72. package/ccw/src/core/lite-scanner.js +35 -11
  73. package/ccw/src/core/server.js +583 -17
  74. package/ccw/src/templates/dashboard-css/01-base.css +161 -0
  75. package/ccw/src/templates/dashboard-css/02-session.css +726 -0
  76. package/ccw/src/templates/dashboard-css/03-tasks.css +512 -0
  77. package/ccw/src/templates/dashboard-css/04-lite-tasks.css +843 -0
  78. package/ccw/src/templates/dashboard-css/05-context.css +2206 -0
  79. package/ccw/src/templates/dashboard-css/06-cards.css +1570 -0
  80. package/ccw/src/templates/dashboard-css/07-managers.css +936 -0
  81. package/ccw/src/templates/dashboard-css/08-review.css +1266 -0
  82. package/ccw/src/templates/dashboard-css/09-explorer.css +1397 -0
  83. package/ccw/src/templates/dashboard-js/components/global-notifications.js +219 -0
  84. package/ccw/src/templates/dashboard-js/components/hook-manager.js +10 -0
  85. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +24 -2
  86. package/ccw/src/templates/dashboard-js/components/navigation.js +11 -5
  87. package/ccw/src/templates/dashboard-js/components/tabs-context.js +20 -20
  88. package/ccw/src/templates/dashboard-js/components/tabs-other.js +11 -11
  89. package/ccw/src/templates/dashboard-js/components/theme.js +29 -1
  90. package/ccw/src/templates/dashboard-js/main.js +4 -0
  91. package/ccw/src/templates/dashboard-js/state.js +5 -0
  92. package/ccw/src/templates/dashboard-js/views/explorer.js +852 -0
  93. package/ccw/src/templates/dashboard-js/views/home.js +13 -9
  94. package/ccw/src/templates/dashboard-js/views/hook-manager.js +8 -5
  95. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +21 -16
  96. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +148 -8
  97. package/ccw/src/templates/dashboard-js/views/project-overview.js +15 -11
  98. package/ccw/src/templates/dashboard-js/views/review-session.js +3 -3
  99. package/ccw/src/templates/dashboard-js/views/session-detail.js +38 -28
  100. package/ccw/src/templates/dashboard.html +129 -28
  101. package/ccw/src/tools/classify-folders.js +204 -0
  102. package/ccw/src/tools/convert-tokens-to-css.js +250 -0
  103. package/ccw/src/tools/detect-changed-modules.js +288 -0
  104. package/ccw/src/tools/discover-design-files.js +134 -0
  105. package/ccw/src/tools/edit-file.js +266 -0
  106. package/ccw/src/tools/generate-module-docs.js +416 -0
  107. package/ccw/src/tools/get-modules-by-depth.js +308 -0
  108. package/ccw/src/tools/index.js +176 -0
  109. package/ccw/src/tools/ui-generate-preview.js +327 -0
  110. package/ccw/src/tools/ui-instantiate-prototypes.js +301 -0
  111. package/ccw/src/tools/update-module-claude.js +380 -0
  112. package/ccw/src/utils/browser-launcher.js +15 -4
  113. package/package.json +1 -1
  114. package/.claude/skills/command-guide/reference/commands/workflow/status.md +0 -352
  115. package/ccw/src/core/server.js.bak +0 -385
  116. package/ccw/src/core/server_original.bak +0 -385
  117. package/ccw/src/templates/dashboard.css +0 -8114
  118. package/ccw/src/templates/dashboard_tailwind.html +0 -42
  119. package/ccw/src/templates/dashboard_test.html +0 -37
  120. package/ccw/src/templates/tailwind-base.css +0 -212
@@ -73,15 +73,19 @@ function renderSessions() {
73
73
  if (sessions.length === 0) {
74
74
  container.innerHTML = `
75
75
  <div class="empty-state" style="grid-column: 1/-1;">
76
- <div class="empty-icon">📭</div>
76
+ <div class="empty-icon"><i data-lucide="inbox" class="w-12 h-12"></i></div>
77
77
  <div class="empty-title">No Sessions Found</div>
78
78
  <div class="empty-text">No workflow sessions match your current filter.</div>
79
79
  </div>
80
80
  `;
81
+ if (typeof lucide !== 'undefined') lucide.createIcons();
81
82
  return;
82
83
  }
83
84
 
84
85
  container.innerHTML = `<div class="sessions-grid">${sessions.map(session => renderSessionCard(session)).join('')}</div>`;
86
+
87
+ // Initialize Lucide icons after rendering
88
+ if (typeof lucide !== 'undefined') lucide.createIcons();
85
89
  }
86
90
 
87
91
  function renderSessionCard(session) {
@@ -120,8 +124,8 @@ function renderSessionCard(session) {
120
124
  </div>
121
125
  <div class="session-body">
122
126
  <div class="session-meta">
123
- <span class="session-meta-item">📅 ${formatDate(date)}</span>
124
- <span class="session-meta-item">📋 ${taskCount} tasks</span>
127
+ <span class="session-meta-item"><i data-lucide="calendar" class="w-3.5 h-3.5 inline mr-1"></i>${formatDate(date)}</span>
128
+ <span class="session-meta-item"><i data-lucide="list-checks" class="w-3.5 h-3.5 inline mr-1"></i>${taskCount} tasks</span>
125
129
  </div>
126
130
  ${taskCount > 0 ? `
127
131
  <div class="progress-container">
@@ -171,16 +175,16 @@ function renderReviewSessionCard(session, sessionKey, typeBadge, isActive, date)
171
175
  </div>
172
176
  <div class="session-body">
173
177
  <div class="session-meta">
174
- <span class="session-meta-item">📅 ${formatDate(date)}</span>
175
- <span class="session-meta-item">🔍 ${totalFindings} findings</span>
178
+ <span class="session-meta-item"><i data-lucide="calendar" class="w-3.5 h-3.5 inline mr-1"></i>${formatDate(date)}</span>
179
+ <span class="session-meta-item"><i data-lucide="search" class="w-3.5 h-3.5 inline mr-1"></i>${totalFindings} findings</span>
176
180
  </div>
177
181
  ${totalFindings > 0 ? `
178
182
  <div class="review-findings-summary">
179
183
  <div class="findings-severity-row">
180
- ${criticalCount > 0 ? `<span class="finding-count critical">🔴 ${criticalCount}</span>` : ''}
181
- ${highCount > 0 ? `<span class="finding-count high">🟠 ${highCount}</span>` : ''}
182
- ${mediumCount > 0 ? `<span class="finding-count medium">🟡 ${mediumCount}</span>` : ''}
183
- ${lowCount > 0 ? `<span class="finding-count low">🟢 ${lowCount}</span>` : ''}
184
+ ${criticalCount > 0 ? `<span class="finding-count critical"><i data-lucide="alert-circle" class="w-3 h-3 inline"></i> ${criticalCount}</span>` : ''}
185
+ ${highCount > 0 ? `<span class="finding-count high"><i data-lucide="alert-triangle" class="w-3 h-3 inline"></i> ${highCount}</span>` : ''}
186
+ ${mediumCount > 0 ? `<span class="finding-count medium"><i data-lucide="info" class="w-3 h-3 inline"></i> ${mediumCount}</span>` : ''}
187
+ ${lowCount > 0 ? `<span class="finding-count low"><i data-lucide="check-circle" class="w-3 h-3 inline"></i> ${lowCount}</span>` : ''}
184
188
  </div>
185
189
  <div class="dimensions-info">
186
190
  ${dimensions.length} dimensions
@@ -41,7 +41,7 @@ async function renderHookManager() {
41
41
 
42
42
  ${projectHookCount === 0 ? `
43
43
  <div class="hook-empty-state bg-card border border-border rounded-lg p-6 text-center">
44
- <div class="text-3xl mb-3">🪝</div>
44
+ <div class="text-muted-foreground mb-3"><i data-lucide="webhook" class="w-10 h-10 mx-auto"></i></div>
45
45
  <p class="text-muted-foreground">No hooks configured for this project</p>
46
46
  <p class="text-sm text-muted-foreground mt-1">Create a hook to automate actions on tool usage</p>
47
47
  </div>
@@ -133,6 +133,9 @@ async function renderHookManager() {
133
133
 
134
134
  // Attach event listeners
135
135
  attachHookEventListeners();
136
+
137
+ // Initialize Lucide icons
138
+ if (typeof lucide !== 'undefined') lucide.createIcons();
136
139
  }
137
140
 
138
141
  function countHooks(hooks) {
@@ -160,7 +163,7 @@ function renderHooksByEvent(hooks, scope) {
160
163
  <div class="hook-card bg-card border border-border rounded-lg p-4 hover:shadow-md transition-all">
161
164
  <div class="flex items-start justify-between mb-3">
162
165
  <div class="flex items-center gap-2">
163
- <span class="text-xl">${getHookEventIcon(event)}</span>
166
+ ${getHookEventIconLucide(event)}
164
167
  <div>
165
168
  <h4 class="font-semibold text-foreground">${event}</h4>
166
169
  <p class="text-xs text-muted-foreground">${getHookEventDescription(event)}</p>
@@ -173,7 +176,7 @@ function renderHooksByEvent(hooks, scope) {
173
176
  data-index="${index}"
174
177
  data-action="edit"
175
178
  title="Edit hook">
176
- ✏️
179
+ <i data-lucide="pencil" class="w-4 h-4"></i>
177
180
  </button>
178
181
  <button class="p-1.5 text-muted-foreground hover:text-destructive hover:bg-destructive/10 rounded transition-colors"
179
182
  data-scope="${scope}"
@@ -181,7 +184,7 @@ function renderHooksByEvent(hooks, scope) {
181
184
  data-index="${index}"
182
185
  data-action="delete"
183
186
  title="Delete hook">
184
- 🗑️
187
+ <i data-lucide="trash-2" class="w-4 h-4"></i>
185
188
  </button>
186
189
  </div>
187
190
  </div>
@@ -215,7 +218,7 @@ function renderQuickInstallCard(templateId, title, description, event, matcher)
215
218
  <div class="hook-template-card bg-card border border-border rounded-lg p-4 hover:shadow-md transition-all ${isInstalled ? 'border-success bg-success-light/30' : ''}">
216
219
  <div class="flex items-start justify-between mb-3">
217
220
  <div class="flex items-center gap-2">
218
- <span class="text-xl">${isInstalled ? '✅' : '🪝'}</span>
221
+ ${isInstalled ? '<i data-lucide="check-circle" class="w-5 h-5 text-success"></i>' : '<i data-lucide="webhook" class="w-5 h-5"></i>'}
219
222
  <div>
220
223
  <h4 class="font-semibold text-foreground">${escapeHtml(title)}</h4>
221
224
  <p class="text-xs text-muted-foreground">${escapeHtml(description)}</p>
@@ -14,15 +14,19 @@ function renderLiteTasks() {
14
14
  if (sessions.length === 0) {
15
15
  container.innerHTML = `
16
16
  <div class="empty-state">
17
- <div class="empty-icon">⚡</div>
17
+ <div class="empty-icon"><i data-lucide="zap" class="w-12 h-12"></i></div>
18
18
  <div class="empty-title">No ${currentLiteType} Sessions</div>
19
19
  <div class="empty-text">No sessions found in .workflow/.${currentLiteType}/</div>
20
20
  </div>
21
21
  `;
22
+ if (typeof lucide !== 'undefined') lucide.createIcons();
22
23
  return;
23
24
  }
24
25
 
25
26
  container.innerHTML = `<div class="sessions-grid">${sessions.map(session => renderLiteTaskCard(session)).join('')}</div>`;
27
+
28
+ // Initialize Lucide icons
29
+ if (typeof lucide !== 'undefined') lucide.createIcons();
26
30
 
27
31
  // Initialize collapsible sections
28
32
  document.querySelectorAll('.collapsible-header').forEach(header => {
@@ -51,13 +55,13 @@ function renderLiteTaskCard(session) {
51
55
  <div class="session-header">
52
56
  <div class="session-title">${escapeHtml(session.id)}</div>
53
57
  <span class="session-status ${session.type}">
54
- ${session.type === 'lite-plan' ? '📝 PLAN' : '🔧 FIX'}
58
+ ${session.type === 'lite-plan' ? '<i data-lucide="file-edit" class="w-3 h-3 inline"></i> PLAN' : '<i data-lucide="wrench" class="w-3 h-3 inline"></i> FIX'}
55
59
  </span>
56
60
  </div>
57
61
  <div class="session-body">
58
62
  <div class="session-meta">
59
- <span class="session-meta-item">📅 ${formatDate(session.createdAt)}</span>
60
- <span class="session-meta-item">📋 ${tasks.length} tasks</span>
63
+ <span class="session-meta-item"><i data-lucide="calendar" class="w-3.5 h-3.5 inline mr-1"></i>${formatDate(session.createdAt)}</span>
64
+ <span class="session-meta-item"><i data-lucide="list-checks" class="w-3.5 h-3.5 inline mr-1"></i>${tasks.length} tasks</span>
61
65
  </div>
62
66
  </div>
63
67
  </div>
@@ -102,7 +106,7 @@ function showLiteTaskDetailPage(sessionKey) {
102
106
  <span>Back to ${session.type === 'lite-plan' ? 'Lite Plan' : 'Lite Fix'}</span>
103
107
  </button>
104
108
  <div class="detail-title-row">
105
- <h2 class="detail-session-id">${session.type === 'lite-plan' ? '📝' : '🔧'} ${escapeHtml(session.id)}</h2>
109
+ <h2 class="detail-session-id">${session.type === 'lite-plan' ? '<i data-lucide="file-edit" class="w-5 h-5 inline mr-2"></i>' : '<i data-lucide="wrench" class="w-5 h-5 inline mr-2"></i>'} ${escapeHtml(session.id)}</h2>
106
110
  <div class="detail-badges">
107
111
  <span class="session-type-badge ${session.type}">${session.type}</span>
108
112
  </div>
@@ -124,20 +128,20 @@ function showLiteTaskDetailPage(sessionKey) {
124
128
  <!-- Tab Navigation -->
125
129
  <div class="detail-tabs">
126
130
  <button class="detail-tab active" data-tab="tasks" onclick="switchLiteDetailTab('tasks')">
127
- <span class="tab-icon">📋</span>
131
+ <span class="tab-icon"><i data-lucide="list-checks" class="w-4 h-4"></i></span>
128
132
  <span class="tab-text">Tasks</span>
129
133
  <span class="tab-count">${tasks.length}</span>
130
134
  </button>
131
135
  <button class="detail-tab" data-tab="plan" onclick="switchLiteDetailTab('plan')">
132
- <span class="tab-icon">📐</span>
136
+ <span class="tab-icon"><i data-lucide="ruler" class="w-4 h-4"></i></span>
133
137
  <span class="tab-text">Plan</span>
134
138
  </button>
135
139
  <button class="detail-tab" data-tab="context" onclick="switchLiteDetailTab('context')">
136
- <span class="tab-icon">📦</span>
140
+ <span class="tab-icon"><i data-lucide="package" class="w-4 h-4"></i></span>
137
141
  <span class="tab-text">Context</span>
138
142
  </button>
139
143
  <button class="detail-tab" data-tab="summary" onclick="switchLiteDetailTab('summary')">
140
- <span class="tab-icon">📝</span>
144
+ <span class="tab-icon"><i data-lucide="file-text" class="w-4 h-4"></i></span>
141
145
  <span class="tab-text">Summary</span>
142
146
  </button>
143
147
  </div>
@@ -209,7 +213,7 @@ function renderLiteTasksTab(session, tasks, completed, inProgress, pending) {
209
213
  if (tasks.length === 0) {
210
214
  return `
211
215
  <div class="tab-empty-state">
212
- <div class="empty-icon">📋</div>
216
+ <div class="empty-icon"><i data-lucide="clipboard-list" class="w-12 h-12"></i></div>
213
217
  <div class="empty-title">No Tasks</div>
214
218
  <div class="empty-text">This session has no tasks defined.</div>
215
219
  </div>
@@ -287,7 +291,7 @@ function renderLitePlanTab(session) {
287
291
  if (!plan) {
288
292
  return `
289
293
  <div class="tab-empty-state">
290
- <div class="empty-icon">📐</div>
294
+ <div class="empty-icon"><i data-lucide="ruler" class="w-12 h-12"></i></div>
291
295
  <div class="empty-title">No Plan Data</div>
292
296
  <div class="empty-text">No plan.json found for this session.</div>
293
297
  </div>
@@ -299,7 +303,7 @@ function renderLitePlanTab(session) {
299
303
  <!-- Summary -->
300
304
  ${plan.summary ? `
301
305
  <div class="plan-section">
302
- <h4 class="plan-section-title">📋 Summary</h4>
306
+ <h4 class="plan-section-title"><i data-lucide="clipboard-list" class="w-4 h-4 inline mr-1"></i> Summary</h4>
303
307
  <p class="plan-summary-text">${escapeHtml(plan.summary)}</p>
304
308
  </div>
305
309
  ` : ''}
@@ -307,7 +311,7 @@ function renderLitePlanTab(session) {
307
311
  <!-- Approach -->
308
312
  ${plan.approach ? `
309
313
  <div class="plan-section">
310
- <h4 class="plan-section-title">🎯 Approach</h4>
314
+ <h4 class="plan-section-title"><i data-lucide="target" class="w-4 h-4 inline mr-1"></i> Approach</h4>
311
315
  <p class="plan-approach-text">${escapeHtml(plan.approach)}</p>
312
316
  </div>
313
317
  ` : ''}
@@ -315,7 +319,7 @@ function renderLitePlanTab(session) {
315
319
  <!-- Focus Paths -->
316
320
  ${plan.focus_paths?.length ? `
317
321
  <div class="plan-section">
318
- <h4 class="plan-section-title">📁 Focus Paths</h4>
322
+ <h4 class="plan-section-title"><i data-lucide="folder" class="w-4 h-4 inline mr-1"></i> Focus Paths</h4>
319
323
  <div class="path-tags">
320
324
  ${plan.focus_paths.map(p => `<span class="path-tag">${escapeHtml(p)}</span>`).join('')}
321
325
  </div>
@@ -324,7 +328,7 @@ function renderLitePlanTab(session) {
324
328
 
325
329
  <!-- Metadata -->
326
330
  <div class="plan-section">
327
- <h4 class="plan-section-title">ℹ️ Metadata</h4>
331
+ <h4 class="plan-section-title"><i data-lucide="info" class="w-4 h-4 inline mr-1"></i> Metadata</h4>
328
332
  <div class="plan-meta-grid">
329
333
  ${plan.estimated_time ? `<div class="meta-item"><span class="meta-label">Estimated Time:</span> ${escapeHtml(plan.estimated_time)}</div>` : ''}
330
334
  ${plan.complexity ? `<div class="meta-item"><span class="meta-label">Complexity:</span> ${escapeHtml(plan.complexity)}</div>` : ''}
@@ -379,11 +383,12 @@ async function loadAndRenderLiteSummaryTab(session, contentArea) {
379
383
  // Fallback
380
384
  contentArea.innerHTML = `
381
385
  <div class="tab-empty-state">
382
- <div class="empty-icon">📝</div>
386
+ <div class="empty-icon"><i data-lucide="file-text" class="w-12 h-12"></i></div>
383
387
  <div class="empty-title">No Summaries</div>
384
388
  <div class="empty-text">No summaries found in .summaries/</div>
385
389
  </div>
386
390
  `;
391
+ if (typeof lucide !== 'undefined') lucide.createIcons();
387
392
  } catch (err) {
388
393
  contentArea.innerHTML = `<div class="tab-error">Failed to load summaries: ${err.message}</div>`;
389
394
  }
@@ -26,8 +26,14 @@ async function renderMcpManager() {
26
26
 
27
27
  // Separate current project servers and available servers
28
28
  const currentProjectServerNames = Object.keys(projectServers);
29
- const otherAvailableServers = Object.entries(allAvailableServers)
29
+
30
+ // Separate enterprise, user, and other project servers
31
+ const enterpriseServerEntries = Object.entries(mcpEnterpriseServers || {})
30
32
  .filter(([name]) => !currentProjectServerNames.includes(name));
33
+ const userServerEntries = Object.entries(mcpUserServers || {})
34
+ .filter(([name]) => !currentProjectServerNames.includes(name) && !(mcpEnterpriseServers || {})[name]);
35
+ const otherProjectServers = Object.entries(allAvailableServers)
36
+ .filter(([name, info]) => !currentProjectServerNames.includes(name) && !info.isGlobal);
31
37
 
32
38
  container.innerHTML = `
33
39
  <div class="mcp-manager">
@@ -46,7 +52,7 @@ async function renderMcpManager() {
46
52
 
47
53
  ${currentProjectServerNames.length === 0 ? `
48
54
  <div class="mcp-empty-state bg-card border border-border rounded-lg p-6 text-center">
49
- <div class="text-3xl mb-3">🔌</div>
55
+ <div class="text-muted-foreground mb-3"><i data-lucide="plug" class="w-10 h-10 mx-auto"></i></div>
50
56
  <p class="text-muted-foreground">No MCP servers configured for this project</p>
51
57
  <p class="text-sm text-muted-foreground mt-1">Add servers from the available list below</p>
52
58
  </div>
@@ -61,20 +67,59 @@ async function renderMcpManager() {
61
67
  `}
62
68
  </div>
63
69
 
70
+ <!-- Enterprise MCP Servers (Managed) -->
71
+ ${enterpriseServerEntries.length > 0 ? `
72
+ <div class="mcp-section mb-6">
73
+ <div class="flex items-center justify-between mb-4">
74
+ <div class="flex items-center gap-2">
75
+ <i data-lucide="building-2" class="w-5 h-5"></i>
76
+ <h3 class="text-lg font-semibold text-foreground">Enterprise MCP Servers</h3>
77
+ <span class="text-xs px-2 py-0.5 bg-warning/20 text-warning rounded-full">Managed</span>
78
+ </div>
79
+ <span class="text-sm text-muted-foreground">${enterpriseServerEntries.length} servers (read-only)</span>
80
+ </div>
81
+
82
+ <div class="mcp-server-grid grid gap-3">
83
+ ${enterpriseServerEntries.map(([serverName, serverConfig]) => {
84
+ return renderEnterpriseServerCard(serverName, serverConfig);
85
+ }).join('')}
86
+ </div>
87
+ </div>
88
+ ` : ''}
89
+
90
+ <!-- User MCP Servers -->
91
+ ${userServerEntries.length > 0 ? `
92
+ <div class="mcp-section mb-6">
93
+ <div class="flex items-center justify-between mb-4">
94
+ <div class="flex items-center gap-2">
95
+ <i data-lucide="user" class="w-5 h-5"></i>
96
+ <h3 class="text-lg font-semibold text-foreground">User MCP Servers</h3>
97
+ </div>
98
+ <span class="text-sm text-muted-foreground">${userServerEntries.length} servers from ~/.claude.json</span>
99
+ </div>
100
+
101
+ <div class="mcp-server-grid grid gap-3">
102
+ ${userServerEntries.map(([serverName, serverConfig]) => {
103
+ return renderGlobalServerCard(serverName, serverConfig, 'user');
104
+ }).join('')}
105
+ </div>
106
+ </div>
107
+ ` : ''}
108
+
64
109
  <!-- Available MCP Servers from Other Projects -->
65
110
  <div class="mcp-section">
66
111
  <div class="flex items-center justify-between mb-4">
67
112
  <h3 class="text-lg font-semibold text-foreground">Available from Other Projects</h3>
68
- <span class="text-sm text-muted-foreground">${otherAvailableServers.length} servers available</span>
113
+ <span class="text-sm text-muted-foreground">${otherProjectServers.length} servers available</span>
69
114
  </div>
70
115
 
71
- ${otherAvailableServers.length === 0 ? `
116
+ ${otherProjectServers.length === 0 ? `
72
117
  <div class="mcp-empty-state bg-card border border-border rounded-lg p-6 text-center">
73
118
  <p class="text-muted-foreground">No additional MCP servers found in other projects</p>
74
119
  </div>
75
120
  ` : `
76
121
  <div class="mcp-server-grid grid gap-3">
77
- ${otherAvailableServers.map(([serverName, serverInfo]) => {
122
+ ${otherProjectServers.map(([serverName, serverInfo]) => {
78
123
  return renderAvailableServerCard(serverName, serverInfo);
79
124
  }).join('')}
80
125
  </div>
@@ -109,7 +154,7 @@ async function renderMcpManager() {
109
154
  <tr class="border-b border-border last:border-b-0 ${isCurrentProject ? 'bg-primary/5' : 'hover:bg-hover/50'}">
110
155
  <td class="px-4 py-3">
111
156
  <div class="flex items-center gap-2 min-w-0">
112
- <span class="text-base shrink-0">${isCurrentProject ? '📍' : '📁'}</span>
157
+ <span class="shrink-0">${isCurrentProject ? '<i data-lucide="map-pin" class="w-4 h-4 text-primary"></i>' : '<i data-lucide="folder" class="w-4 h-4"></i>'}</span>
113
158
  <div class="min-w-0">
114
159
  <div class="font-medium text-foreground truncate text-sm" title="${escapeHtml(path)}">
115
160
  ${escapeHtml(path.split('\\').pop() || path)}
@@ -152,6 +197,9 @@ async function renderMcpManager() {
152
197
 
153
198
  // Attach event listeners for toggle switches
154
199
  attachMcpEventListeners();
200
+
201
+ // Initialize Lucide icons
202
+ if (typeof lucide !== 'undefined') lucide.createIcons();
155
203
  }
156
204
 
157
205
  function renderMcpServerCard(serverName, serverConfig, isEnabled, isInCurrentProject) {
@@ -163,7 +211,7 @@ function renderMcpServerCard(serverName, serverConfig, isEnabled, isInCurrentPro
163
211
  <div class="mcp-server-card bg-card border border-border rounded-lg p-4 hover:shadow-md transition-all ${isEnabled ? '' : 'opacity-60'}">
164
212
  <div class="flex items-start justify-between mb-3">
165
213
  <div class="flex items-center gap-2">
166
- <span class="text-xl">${isEnabled ? '🟢' : '🔴'}</span>
214
+ <span>${isEnabled ? '<i data-lucide="check-circle" class="w-5 h-5 text-success"></i>' : '<i data-lucide="x-circle" class="w-5 h-5 text-destructive"></i>'}</span>
167
215
  <h4 class="font-semibold text-foreground">${escapeHtml(serverName)}</h4>
168
216
  </div>
169
217
  <label class="mcp-toggle relative inline-flex items-center cursor-pointer">
@@ -216,7 +264,7 @@ function renderAvailableServerCard(serverName, serverInfo) {
216
264
  <div class="mcp-server-card mcp-server-available bg-card border border-border border-dashed rounded-lg p-4 hover:shadow-md hover:border-solid transition-all">
217
265
  <div class="flex items-start justify-between mb-3">
218
266
  <div class="flex items-center gap-2">
219
- <span class="text-xl">⚪</span>
267
+ <span><i data-lucide="circle-dashed" class="w-5 h-5 text-muted-foreground"></i></span>
220
268
  <h4 class="font-semibold text-foreground">${escapeHtml(serverName)}</h4>
221
269
  </div>
222
270
  <button class="px-3 py-1 text-xs bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity"
@@ -240,6 +288,98 @@ function renderAvailableServerCard(serverName, serverInfo) {
240
288
  `;
241
289
  }
242
290
 
291
+ function renderGlobalServerCard(serverName, serverConfig, source = 'user') {
292
+ const command = serverConfig.command || serverConfig.url || 'N/A';
293
+ const args = serverConfig.args || [];
294
+ const hasEnv = serverConfig.env && Object.keys(serverConfig.env).length > 0;
295
+ const serverType = serverConfig.type || 'stdio';
296
+
297
+ return `
298
+ <div class="mcp-server-card mcp-server-global bg-card border border-primary/30 rounded-lg p-4 hover:shadow-md transition-all">
299
+ <div class="flex items-start justify-between mb-3">
300
+ <div class="flex items-center gap-2">
301
+ <i data-lucide="user" class="w-5 h-5"></i>
302
+ <h4 class="font-semibold text-foreground">${escapeHtml(serverName)}</h4>
303
+ <span class="text-xs px-2 py-0.5 bg-primary/10 text-primary rounded-full">User</span>
304
+ </div>
305
+ <button class="px-3 py-1 text-xs bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity"
306
+ data-server-name="${escapeHtml(serverName)}"
307
+ data-server-config='${JSON.stringify(serverConfig).replace(/'/g, "&#39;")}'
308
+ data-action="add">
309
+ Add to Project
310
+ </button>
311
+ </div>
312
+
313
+ <div class="mcp-server-details text-sm space-y-1">
314
+ <div class="flex items-center gap-2 text-muted-foreground">
315
+ <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${serverType === 'stdio' ? 'cmd' : 'url'}</span>
316
+ <span class="truncate" title="${escapeHtml(command)}">${escapeHtml(command)}</span>
317
+ </div>
318
+ ${args.length > 0 ? `
319
+ <div class="flex items-start gap-2 text-muted-foreground">
320
+ <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">args</span>
321
+ <span class="text-xs font-mono truncate" title="${escapeHtml(args.join(' '))}">${escapeHtml(args.slice(0, 3).join(' '))}${args.length > 3 ? '...' : ''}</span>
322
+ </div>
323
+ ` : ''}
324
+ ${hasEnv ? `
325
+ <div class="flex items-center gap-2 text-muted-foreground">
326
+ <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">env</span>
327
+ <span class="text-xs">${Object.keys(serverConfig.env).length} variables</span>
328
+ </div>
329
+ ` : ''}
330
+ <div class="flex items-center gap-2 text-muted-foreground mt-1">
331
+ <span class="text-xs italic">Available to all projects from ~/.claude.json</span>
332
+ </div>
333
+ </div>
334
+ </div>
335
+ `;
336
+ }
337
+
338
+ function renderEnterpriseServerCard(serverName, serverConfig) {
339
+ const command = serverConfig.command || serverConfig.url || 'N/A';
340
+ const args = serverConfig.args || [];
341
+ const hasEnv = serverConfig.env && Object.keys(serverConfig.env).length > 0;
342
+ const serverType = serverConfig.type || 'stdio';
343
+
344
+ return `
345
+ <div class="mcp-server-card mcp-server-enterprise bg-card border border-warning/30 rounded-lg p-4 hover:shadow-md transition-all">
346
+ <div class="flex items-start justify-between mb-3">
347
+ <div class="flex items-center gap-2">
348
+ <i data-lucide="building-2" class="w-5 h-5"></i>
349
+ <h4 class="font-semibold text-foreground">${escapeHtml(serverName)}</h4>
350
+ <span class="text-xs px-2 py-0.5 bg-warning/20 text-warning rounded-full">Enterprise</span>
351
+ <i data-lucide="lock" class="w-3 h-3 text-muted-foreground"></i>
352
+ </div>
353
+ <span class="px-3 py-1 text-xs bg-muted text-muted-foreground rounded cursor-not-allowed">
354
+ Read-only
355
+ </span>
356
+ </div>
357
+
358
+ <div class="mcp-server-details text-sm space-y-1">
359
+ <div class="flex items-center gap-2 text-muted-foreground">
360
+ <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${serverType === 'stdio' ? 'cmd' : 'url'}</span>
361
+ <span class="truncate" title="${escapeHtml(command)}">${escapeHtml(command)}</span>
362
+ </div>
363
+ ${args.length > 0 ? `
364
+ <div class="flex items-start gap-2 text-muted-foreground">
365
+ <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">args</span>
366
+ <span class="text-xs font-mono truncate" title="${escapeHtml(args.join(' '))}">${escapeHtml(args.slice(0, 3).join(' '))}${args.length > 3 ? '...' : ''}</span>
367
+ </div>
368
+ ` : ''}
369
+ ${hasEnv ? `
370
+ <div class="flex items-center gap-2 text-muted-foreground">
371
+ <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">env</span>
372
+ <span class="text-xs">${Object.keys(serverConfig.env).length} variables</span>
373
+ </div>
374
+ ` : ''}
375
+ <div class="flex items-center gap-2 text-muted-foreground mt-1">
376
+ <span class="text-xs italic">Managed by organization (highest priority)</span>
377
+ </div>
378
+ </div>
379
+ </div>
380
+ `;
381
+ }
382
+
243
383
  function attachMcpEventListeners() {
244
384
  // Toggle switches
245
385
  document.querySelectorAll('.mcp-server-card input[data-action="toggle"]').forEach(input => {
@@ -12,13 +12,14 @@ function renderProjectOverview() {
12
12
  if (!project) {
13
13
  container.innerHTML = `
14
14
  <div class="flex flex-col items-center justify-center py-16 text-center">
15
- <div class="text-6xl mb-4">📋</div>
15
+ <div class="text-muted-foreground mb-4"><i data-lucide="clipboard-list" class="w-16 h-16"></i></div>
16
16
  <h3 class="text-xl font-semibold text-foreground mb-2">No Project Overview</h3>
17
17
  <p class="text-muted-foreground mb-4">
18
18
  Run <code class="px-2 py-1 bg-muted rounded text-sm font-mono">/workflow:init</code> to initialize project analysis
19
19
  </p>
20
20
  </div>
21
21
  `;
22
+ if (typeof lucide !== 'undefined') lucide.createIcons();
22
23
  return;
23
24
  }
24
25
 
@@ -40,7 +41,7 @@ function renderProjectOverview() {
40
41
  <!-- Technology Stack -->
41
42
  <div class="bg-card border border-border rounded-lg p-6 mb-6">
42
43
  <h3 class="text-lg font-semibold text-foreground mb-4 flex items-center gap-2">
43
- <span>💻</span> Technology Stack
44
+ <i data-lucide="code-2" class="w-5 h-5"></i> Technology Stack
44
45
  </h3>
45
46
 
46
47
  <!-- Languages -->
@@ -91,7 +92,7 @@ function renderProjectOverview() {
91
92
  <!-- Architecture -->
92
93
  <div class="bg-card border border-border rounded-lg p-6 mb-6">
93
94
  <h3 class="text-lg font-semibold text-foreground mb-4 flex items-center gap-2">
94
- <span>🏗️</span> Architecture
95
+ <i data-lucide="blocks" class="w-5 h-5"></i> Architecture
95
96
  </h3>
96
97
 
97
98
  <div class="grid grid-cols-1 md:grid-cols-3 gap-5">
@@ -128,7 +129,7 @@ function renderProjectOverview() {
128
129
  <!-- Key Components -->
129
130
  <div class="bg-card border border-border rounded-lg p-6 mb-6">
130
131
  <h3 class="text-lg font-semibold text-foreground mb-4 flex items-center gap-2">
131
- <span>⚙️</span> Key Components
132
+ <i data-lucide="component" class="w-5 h-5"></i> Key Components
132
133
  </h3>
133
134
 
134
135
  ${project.keyComponents.length > 0 ? `
@@ -162,7 +163,7 @@ function renderProjectOverview() {
162
163
  <!-- Development Index -->
163
164
  <div class="bg-card border border-border rounded-lg p-6 mb-6">
164
165
  <h3 class="text-lg font-semibold text-foreground mb-4 flex items-center gap-2">
165
- <span>📝</span> Development History
166
+ <i data-lucide="git-branch" class="w-5 h-5"></i> Development History
166
167
  </h3>
167
168
 
168
169
  ${renderDevelopmentIndex(project.developmentIndex)}
@@ -171,7 +172,7 @@ function renderProjectOverview() {
171
172
  <!-- Statistics -->
172
173
  <div class="bg-card border border-border rounded-lg p-6">
173
174
  <h3 class="text-lg font-semibold text-foreground mb-4 flex items-center gap-2">
174
- <span>📊</span> Statistics
175
+ <i data-lucide="bar-chart-3" class="w-5 h-5"></i> Statistics
175
176
  </h3>
176
177
 
177
178
  <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
@@ -190,17 +191,20 @@ function renderProjectOverview() {
190
191
  </div>
191
192
  </div>
192
193
  `;
194
+
195
+ // Initialize Lucide icons
196
+ if (typeof lucide !== 'undefined') lucide.createIcons();
193
197
  }
194
198
 
195
199
  function renderDevelopmentIndex(devIndex) {
196
200
  if (!devIndex) return '<p class="text-muted-foreground text-sm">No development history available</p>';
197
201
 
198
202
  const categories = [
199
- { key: 'feature', label: 'Features', icon: '', badgeClass: 'bg-primary-light text-primary' },
200
- { key: 'enhancement', label: 'Enhancements', icon: '', badgeClass: 'bg-success-light text-success' },
201
- { key: 'bugfix', label: 'Bug Fixes', icon: '🐛', badgeClass: 'bg-destructive/10 text-destructive' },
202
- { key: 'refactor', label: 'Refactorings', icon: '🔧', badgeClass: 'bg-warning-light text-warning' },
203
- { key: 'docs', label: 'Documentation', icon: '📚', badgeClass: 'bg-muted text-muted-foreground' }
203
+ { key: 'feature', label: 'Features', icon: '<i data-lucide="sparkles" class="w-4 h-4 inline"></i>', badgeClass: 'bg-primary-light text-primary' },
204
+ { key: 'enhancement', label: 'Enhancements', icon: '<i data-lucide="zap" class="w-4 h-4 inline"></i>', badgeClass: 'bg-success-light text-success' },
205
+ { key: 'bugfix', label: 'Bug Fixes', icon: '<i data-lucide="bug" class="w-4 h-4 inline"></i>', badgeClass: 'bg-destructive/10 text-destructive' },
206
+ { key: 'refactor', label: 'Refactorings', icon: '<i data-lucide="wrench" class="w-4 h-4 inline"></i>', badgeClass: 'bg-warning-light text-warning' },
207
+ { key: 'docs', label: 'Documentation', icon: '<i data-lucide="book-open" class="w-4 h-4 inline"></i>', badgeClass: 'bg-muted text-muted-foreground' }
204
208
  ];
205
209
 
206
210
  const totalEntries = categories.reduce((sum, cat) => sum + (devIndex[cat.key]?.length || 0), 0);
@@ -113,7 +113,7 @@ function renderReviewSessionDetailPage(session) {
113
113
  <div class="summary-label">High</div>
114
114
  </div>
115
115
  <div class="summary-card">
116
- <div class="summary-icon">📋</div>
116
+ <div class="summary-icon">🎯</div>
117
117
  <div class="summary-value">${dimensions.length}</div>
118
118
  <div class="summary-label">Dimensions</div>
119
119
  </div>
@@ -329,7 +329,7 @@ function previewReviewSessionFinding(findingId) {
329
329
 
330
330
  ${finding.file ? `
331
331
  <div class="preview-section">
332
- <div class="preview-section-title">📄 Location</div>
332
+ <div class="preview-section-title">📍 Location</div>
333
333
  <div class="preview-location">
334
334
  <code>${escapeHtml(finding.file)}${finding.line ? ':' + finding.line : ''}</code>
335
335
  </div>
@@ -359,7 +359,7 @@ function previewReviewSessionFinding(findingId) {
359
359
 
360
360
  ${finding.root_cause ? `
361
361
  <div class="preview-section">
362
- <div class="preview-section-title">🔍 Root Cause</div>
362
+ <div class="preview-section-title">🎯 Root Cause</div>
363
363
  <div class="preview-root-cause">${escapeHtml(finding.root_cause)}</div>
364
364
  </div>
365
365
  ` : ''}