claude-code-workflow 6.0.5 → 6.1.1
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/action-planning-agent.md +1 -1
- package/.claude/agents/cli-execution-agent.md +269 -269
- package/.claude/agents/cli-explore-agent.md +182 -182
- package/.claude/agents/context-search-agent.md +582 -582
- package/.claude/agents/memory-bridge.md +93 -93
- package/.claude/commands/cli/cli-init.md +1 -1
- package/.claude/commands/memory/docs-full-cli.md +471 -471
- package/.claude/commands/memory/docs-related-cli.md +386 -386
- package/.claude/commands/memory/docs.md +615 -615
- package/.claude/commands/memory/load.md +1 -1
- package/.claude/commands/memory/update-full.md +332 -332
- package/.claude/commands/memory/update-related.md +5 -5
- package/.claude/commands/workflow/init.md +1 -1
- package/.claude/commands/workflow/lite-fix.md +621 -621
- package/.claude/commands/workflow/lite-plan.md +592 -592
- package/.claude/commands/workflow/tools/context-gather.md +434 -434
- package/.claude/commands/workflow/ui-design/generate.md +504 -504
- package/.claude/commands/workflow/ui-design/import-from-code.md +537 -537
- package/.claude/scripts/classify-folders.sh +4 -0
- package/.claude/scripts/convert_tokens_to_css.sh +4 -0
- package/.claude/scripts/detect_changed_modules.sh +5 -1
- package/.claude/scripts/discover-design-files.sh +87 -83
- package/.claude/scripts/generate_module_docs.sh +717 -713
- package/.claude/scripts/get_modules_by_depth.sh +5 -1
- package/.claude/scripts/ui-generate-preview.sh +4 -0
- package/.claude/scripts/ui-instantiate-prototypes.sh +4 -0
- package/.claude/scripts/update_module_claude.sh +4 -0
- package/.claude/skills/command-guide/index/all-commands.json +1 -12
- package/.claude/skills/command-guide/index/by-category.json +1 -12
- package/.claude/skills/command-guide/index/by-use-case.json +1 -12
- package/.claude/skills/command-guide/index/essential-commands.json +1 -12
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +127 -71
- package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +269 -269
- package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +182 -182
- package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +18 -38
- package/.claude/skills/command-guide/reference/agents/context-search-agent.md +582 -577
- package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
- package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +1 -1
- package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
- package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
- package/.claude/skills/command-guide/reference/commands/memory/docs.md +615 -610
- package/.claude/skills/command-guide/reference/commands/memory/load.md +1 -1
- package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
- package/.claude/skills/command-guide/reference/commands/memory/update-related.md +5 -5
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +299 -451
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +14 -37
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +252 -350
- package/.claude/skills/command-guide/reference/commands/workflow/init.md +2 -2
- package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +52 -0
- package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +621 -602
- package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +46 -36
- package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +18 -58
- package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +22 -52
- package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +19 -48
- package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +25 -5
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +1 -1
- package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +7 -7
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +151 -11
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +4 -4
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +1 -1
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +504 -504
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +537 -537
- package/.claude/workflows/context-search-strategy.md +77 -77
- package/.claude/workflows/tool-strategy.md +90 -71
- package/.claude/workflows/workflow-architecture.md +1 -1
- package/README.md +285 -285
- package/ccw/src/cli.js +7 -0
- package/ccw/src/commands/tool.js +217 -0
- package/ccw/src/core/dashboard-generator.js +18 -3
- package/ccw/src/core/lite-scanner.js +35 -11
- package/ccw/src/core/server.js +531 -46
- package/ccw/src/templates/dashboard-css/01-base.css +161 -0
- package/ccw/src/templates/dashboard-css/02-session.css +726 -0
- package/ccw/src/templates/dashboard-css/03-tasks.css +512 -0
- package/ccw/src/templates/dashboard-css/04-lite-tasks.css +843 -0
- package/ccw/src/templates/dashboard-css/05-context.css +2206 -0
- package/ccw/src/templates/dashboard-css/06-cards.css +1570 -0
- package/ccw/src/templates/dashboard-css/07-managers.css +936 -0
- package/ccw/src/templates/dashboard-css/08-review.css +1266 -0
- package/ccw/src/templates/dashboard-css/09-explorer.css +1397 -0
- package/ccw/src/templates/dashboard-js/components/global-notifications.js +219 -0
- package/ccw/src/templates/dashboard-js/components/hook-manager.js +10 -0
- package/ccw/src/templates/dashboard-js/components/mcp-manager.js +11 -1
- package/ccw/src/templates/dashboard-js/components/navigation.js +11 -5
- package/ccw/src/templates/dashboard-js/components/tabs-context.js +20 -20
- package/ccw/src/templates/dashboard-js/components/tabs-other.js +11 -11
- package/ccw/src/templates/dashboard-js/components/theme.js +29 -1
- package/ccw/src/templates/dashboard-js/main.js +4 -0
- package/ccw/src/templates/dashboard-js/state.js +5 -0
- package/ccw/src/templates/dashboard-js/views/explorer.js +852 -0
- package/ccw/src/templates/dashboard-js/views/home.js +13 -9
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +8 -5
- package/ccw/src/templates/dashboard-js/views/lite-tasks.js +21 -16
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js +90 -19
- package/ccw/src/templates/dashboard-js/views/project-overview.js +15 -11
- package/ccw/src/templates/dashboard-js/views/review-session.js +3 -3
- package/ccw/src/templates/dashboard-js/views/session-detail.js +38 -28
- package/ccw/src/templates/dashboard.html +129 -28
- package/ccw/src/tools/classify-folders.js +204 -0
- package/ccw/src/tools/convert-tokens-to-css.js +250 -0
- package/ccw/src/tools/detect-changed-modules.js +288 -0
- package/ccw/src/tools/discover-design-files.js +134 -0
- package/ccw/src/tools/edit-file.js +266 -0
- package/ccw/src/tools/generate-module-docs.js +416 -0
- package/ccw/src/tools/get-modules-by-depth.js +308 -0
- package/ccw/src/tools/index.js +176 -0
- package/ccw/src/tools/ui-generate-preview.js +327 -0
- package/ccw/src/tools/ui-instantiate-prototypes.js +301 -0
- package/ccw/src/tools/update-module-claude.js +380 -0
- package/package.json +1 -1
- package/.claude/skills/command-guide/reference/commands/workflow/status.md +0 -352
- package/ccw/src/core/server.js.bak +0 -385
- package/ccw/src/core/server_original.bak +0 -385
- package/ccw/src/templates/dashboard.css +0 -8187
- package/ccw/src/templates/dashboard_tailwind.html +0 -42
- package/ccw/src/templates/dashboard_test.html +0 -37
- 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"
|
|
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"
|
|
124
|
-
<span class="session-meta-item"
|
|
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"
|
|
175
|
-
<span class="session-meta-item"
|
|
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"
|
|
181
|
-
${highCount > 0 ? `<span class="finding-count high"
|
|
182
|
-
${mediumCount > 0 ? `<span class="finding-count medium"
|
|
183
|
-
${lowCount > 0 ? `<span class="finding-count low"
|
|
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-
|
|
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
|
-
|
|
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
|
-
<
|
|
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"
|
|
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' ? '
|
|
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"
|
|
60
|
-
<span class="session-meta-item"
|
|
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' ? '
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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
|
}
|
|
@@ -27,9 +27,11 @@ async function renderMcpManager() {
|
|
|
27
27
|
// Separate current project servers and available servers
|
|
28
28
|
const currentProjectServerNames = Object.keys(projectServers);
|
|
29
29
|
|
|
30
|
-
// Separate
|
|
31
|
-
const
|
|
30
|
+
// Separate enterprise, user, and other project servers
|
|
31
|
+
const enterpriseServerEntries = Object.entries(mcpEnterpriseServers || {})
|
|
32
32
|
.filter(([name]) => !currentProjectServerNames.includes(name));
|
|
33
|
+
const userServerEntries = Object.entries(mcpUserServers || {})
|
|
34
|
+
.filter(([name]) => !currentProjectServerNames.includes(name) && !(mcpEnterpriseServers || {})[name]);
|
|
33
35
|
const otherProjectServers = Object.entries(allAvailableServers)
|
|
34
36
|
.filter(([name, info]) => !currentProjectServerNames.includes(name) && !info.isGlobal);
|
|
35
37
|
|
|
@@ -50,7 +52,7 @@ async function renderMcpManager() {
|
|
|
50
52
|
|
|
51
53
|
${currentProjectServerNames.length === 0 ? `
|
|
52
54
|
<div class="mcp-empty-state bg-card border border-border rounded-lg p-6 text-center">
|
|
53
|
-
<div class="text-
|
|
55
|
+
<div class="text-muted-foreground mb-3"><i data-lucide="plug" class="w-10 h-10 mx-auto"></i></div>
|
|
54
56
|
<p class="text-muted-foreground">No MCP servers configured for this project</p>
|
|
55
57
|
<p class="text-sm text-muted-foreground mt-1">Add servers from the available list below</p>
|
|
56
58
|
</div>
|
|
@@ -65,20 +67,40 @@ async function renderMcpManager() {
|
|
|
65
67
|
`}
|
|
66
68
|
</div>
|
|
67
69
|
|
|
68
|
-
<!--
|
|
69
|
-
${
|
|
70
|
+
<!-- Enterprise MCP Servers (Managed) -->
|
|
71
|
+
${enterpriseServerEntries.length > 0 ? `
|
|
70
72
|
<div class="mcp-section mb-6">
|
|
71
73
|
<div class="flex items-center justify-between mb-4">
|
|
72
74
|
<div class="flex items-center gap-2">
|
|
73
|
-
<
|
|
74
|
-
<h3 class="text-lg font-semibold text-foreground">
|
|
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>
|
|
75
78
|
</div>
|
|
76
|
-
<span class="text-sm text-muted-foreground">${
|
|
79
|
+
<span class="text-sm text-muted-foreground">${enterpriseServerEntries.length} servers (read-only)</span>
|
|
77
80
|
</div>
|
|
78
81
|
|
|
79
82
|
<div class="mcp-server-grid grid gap-3">
|
|
80
|
-
${
|
|
81
|
-
return
|
|
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');
|
|
82
104
|
}).join('')}
|
|
83
105
|
</div>
|
|
84
106
|
</div>
|
|
@@ -132,7 +154,7 @@ async function renderMcpManager() {
|
|
|
132
154
|
<tr class="border-b border-border last:border-b-0 ${isCurrentProject ? 'bg-primary/5' : 'hover:bg-hover/50'}">
|
|
133
155
|
<td class="px-4 py-3">
|
|
134
156
|
<div class="flex items-center gap-2 min-w-0">
|
|
135
|
-
<span class="
|
|
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>
|
|
136
158
|
<div class="min-w-0">
|
|
137
159
|
<div class="font-medium text-foreground truncate text-sm" title="${escapeHtml(path)}">
|
|
138
160
|
${escapeHtml(path.split('\\').pop() || path)}
|
|
@@ -175,6 +197,9 @@ async function renderMcpManager() {
|
|
|
175
197
|
|
|
176
198
|
// Attach event listeners for toggle switches
|
|
177
199
|
attachMcpEventListeners();
|
|
200
|
+
|
|
201
|
+
// Initialize Lucide icons
|
|
202
|
+
if (typeof lucide !== 'undefined') lucide.createIcons();
|
|
178
203
|
}
|
|
179
204
|
|
|
180
205
|
function renderMcpServerCard(serverName, serverConfig, isEnabled, isInCurrentProject) {
|
|
@@ -186,7 +211,7 @@ function renderMcpServerCard(serverName, serverConfig, isEnabled, isInCurrentPro
|
|
|
186
211
|
<div class="mcp-server-card bg-card border border-border rounded-lg p-4 hover:shadow-md transition-all ${isEnabled ? '' : 'opacity-60'}">
|
|
187
212
|
<div class="flex items-start justify-between mb-3">
|
|
188
213
|
<div class="flex items-center gap-2">
|
|
189
|
-
<span class="text-
|
|
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>
|
|
190
215
|
<h4 class="font-semibold text-foreground">${escapeHtml(serverName)}</h4>
|
|
191
216
|
</div>
|
|
192
217
|
<label class="mcp-toggle relative inline-flex items-center cursor-pointer">
|
|
@@ -239,7 +264,7 @@ function renderAvailableServerCard(serverName, serverInfo) {
|
|
|
239
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">
|
|
240
265
|
<div class="flex items-start justify-between mb-3">
|
|
241
266
|
<div class="flex items-center gap-2">
|
|
242
|
-
<span class="text-
|
|
267
|
+
<span><i data-lucide="circle-dashed" class="w-5 h-5 text-muted-foreground"></i></span>
|
|
243
268
|
<h4 class="font-semibold text-foreground">${escapeHtml(serverName)}</h4>
|
|
244
269
|
</div>
|
|
245
270
|
<button class="px-3 py-1 text-xs bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity"
|
|
@@ -263,18 +288,19 @@ function renderAvailableServerCard(serverName, serverInfo) {
|
|
|
263
288
|
`;
|
|
264
289
|
}
|
|
265
290
|
|
|
266
|
-
function renderGlobalServerCard(serverName, serverConfig) {
|
|
267
|
-
const command = serverConfig.command || 'N/A';
|
|
291
|
+
function renderGlobalServerCard(serverName, serverConfig, source = 'user') {
|
|
292
|
+
const command = serverConfig.command || serverConfig.url || 'N/A';
|
|
268
293
|
const args = serverConfig.args || [];
|
|
269
294
|
const hasEnv = serverConfig.env && Object.keys(serverConfig.env).length > 0;
|
|
295
|
+
const serverType = serverConfig.type || 'stdio';
|
|
270
296
|
|
|
271
297
|
return `
|
|
272
298
|
<div class="mcp-server-card mcp-server-global bg-card border border-primary/30 rounded-lg p-4 hover:shadow-md transition-all">
|
|
273
299
|
<div class="flex items-start justify-between mb-3">
|
|
274
300
|
<div class="flex items-center gap-2">
|
|
275
|
-
<
|
|
301
|
+
<i data-lucide="user" class="w-5 h-5"></i>
|
|
276
302
|
<h4 class="font-semibold text-foreground">${escapeHtml(serverName)}</h4>
|
|
277
|
-
<span class="text-xs px-2 py-0.5 bg-primary/10 text-primary rounded-full">
|
|
303
|
+
<span class="text-xs px-2 py-0.5 bg-primary/10 text-primary rounded-full">User</span>
|
|
278
304
|
</div>
|
|
279
305
|
<button class="px-3 py-1 text-xs bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity"
|
|
280
306
|
data-server-name="${escapeHtml(serverName)}"
|
|
@@ -286,7 +312,52 @@ function renderGlobalServerCard(serverName, serverConfig) {
|
|
|
286
312
|
|
|
287
313
|
<div class="mcp-server-details text-sm space-y-1">
|
|
288
314
|
<div class="flex items-center gap-2 text-muted-foreground">
|
|
289
|
-
<span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded"
|
|
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>
|
|
290
361
|
<span class="truncate" title="${escapeHtml(command)}">${escapeHtml(command)}</span>
|
|
291
362
|
</div>
|
|
292
363
|
${args.length > 0 ? `
|
|
@@ -302,7 +373,7 @@ function renderGlobalServerCard(serverName, serverConfig) {
|
|
|
302
373
|
</div>
|
|
303
374
|
` : ''}
|
|
304
375
|
<div class="flex items-center gap-2 text-muted-foreground mt-1">
|
|
305
|
-
<span class="text-xs italic">
|
|
376
|
+
<span class="text-xs italic">Managed by organization (highest priority)</span>
|
|
306
377
|
</div>
|
|
307
378
|
</div>
|
|
308
379
|
</div>
|
|
@@ -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-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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: '
|
|
200
|
-
{ key: 'enhancement', label: 'Enhancements', icon: '
|
|
201
|
-
{ key: 'bugfix', label: 'Bug Fixes', icon: '
|
|
202
|
-
{ key: 'refactor', label: 'Refactorings', icon: '
|
|
203
|
-
{ key: 'docs', label: 'Documentation', icon: '
|
|
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"
|
|
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"
|
|
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"
|
|
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
|
` : ''}
|