@siteboon/claude-code-ui 1.8.2 → 1.8.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.
- package/dist/assets/index-CeR_JfKq.js +895 -0
- package/dist/assets/index-Co7ALK3i.css +32 -0
- package/{index.html → dist/index.html} +2 -1
- package/package.json +6 -1
- package/server/database/auth.db +0 -0
- package/.env.example +0 -12
- package/.nvmrc +0 -1
- package/postcss.config.js +0 -6
- package/src/App.jsx +0 -751
- package/src/components/ChatInterface.jsx +0 -3485
- package/src/components/ClaudeLogo.jsx +0 -11
- package/src/components/ClaudeStatus.jsx +0 -107
- package/src/components/CodeEditor.jsx +0 -422
- package/src/components/CreateTaskModal.jsx +0 -88
- package/src/components/CursorLogo.jsx +0 -9
- package/src/components/DarkModeToggle.jsx +0 -35
- package/src/components/DiffViewer.jsx +0 -41
- package/src/components/ErrorBoundary.jsx +0 -73
- package/src/components/FileTree.jsx +0 -480
- package/src/components/GitPanel.jsx +0 -1283
- package/src/components/ImageViewer.jsx +0 -54
- package/src/components/LoginForm.jsx +0 -110
- package/src/components/MainContent.jsx +0 -577
- package/src/components/MicButton.jsx +0 -272
- package/src/components/MobileNav.jsx +0 -88
- package/src/components/NextTaskBanner.jsx +0 -695
- package/src/components/PRDEditor.jsx +0 -871
- package/src/components/ProtectedRoute.jsx +0 -44
- package/src/components/QuickSettingsPanel.jsx +0 -262
- package/src/components/Settings.jsx +0 -2023
- package/src/components/SetupForm.jsx +0 -135
- package/src/components/Shell.jsx +0 -663
- package/src/components/Sidebar.jsx +0 -1665
- package/src/components/StandaloneShell.jsx +0 -106
- package/src/components/TaskCard.jsx +0 -210
- package/src/components/TaskDetail.jsx +0 -406
- package/src/components/TaskIndicator.jsx +0 -108
- package/src/components/TaskList.jsx +0 -1054
- package/src/components/TaskMasterSetupWizard.jsx +0 -603
- package/src/components/TaskMasterStatus.jsx +0 -86
- package/src/components/TodoList.jsx +0 -91
- package/src/components/Tooltip.jsx +0 -91
- package/src/components/ui/badge.jsx +0 -31
- package/src/components/ui/button.jsx +0 -46
- package/src/components/ui/input.jsx +0 -19
- package/src/components/ui/scroll-area.jsx +0 -23
- package/src/contexts/AuthContext.jsx +0 -158
- package/src/contexts/TaskMasterContext.jsx +0 -324
- package/src/contexts/TasksSettingsContext.jsx +0 -95
- package/src/contexts/ThemeContext.jsx +0 -94
- package/src/contexts/WebSocketContext.jsx +0 -29
- package/src/hooks/useAudioRecorder.js +0 -109
- package/src/hooks/useVersionCheck.js +0 -39
- package/src/index.css +0 -822
- package/src/lib/utils.js +0 -6
- package/src/main.jsx +0 -10
- package/src/utils/api.js +0 -141
- package/src/utils/websocket.js +0 -109
- package/src/utils/whisper.js +0 -37
- package/tailwind.config.js +0 -63
- package/vite.config.js +0 -29
- /package/{public → dist}/convert-icons.md +0 -0
- /package/{public → dist}/favicon.png +0 -0
- /package/{public → dist}/favicon.svg +0 -0
- /package/{public → dist}/generate-icons.js +0 -0
- /package/{public → dist}/icons/claude-ai-icon.svg +0 -0
- /package/{public → dist}/icons/cursor.svg +0 -0
- /package/{public → dist}/icons/generate-icons.md +0 -0
- /package/{public → dist}/icons/icon-128x128.png +0 -0
- /package/{public → dist}/icons/icon-128x128.svg +0 -0
- /package/{public → dist}/icons/icon-144x144.png +0 -0
- /package/{public → dist}/icons/icon-144x144.svg +0 -0
- /package/{public → dist}/icons/icon-152x152.png +0 -0
- /package/{public → dist}/icons/icon-152x152.svg +0 -0
- /package/{public → dist}/icons/icon-192x192.png +0 -0
- /package/{public → dist}/icons/icon-192x192.svg +0 -0
- /package/{public → dist}/icons/icon-384x384.png +0 -0
- /package/{public → dist}/icons/icon-384x384.svg +0 -0
- /package/{public → dist}/icons/icon-512x512.png +0 -0
- /package/{public → dist}/icons/icon-512x512.svg +0 -0
- /package/{public → dist}/icons/icon-72x72.png +0 -0
- /package/{public → dist}/icons/icon-72x72.svg +0 -0
- /package/{public → dist}/icons/icon-96x96.png +0 -0
- /package/{public → dist}/icons/icon-96x96.svg +0 -0
- /package/{public → dist}/icons/icon-template.svg +0 -0
- /package/{public → dist}/logo.svg +0 -0
- /package/{public → dist}/manifest.json +0 -0
- /package/{public → dist}/screenshots/cli-selection.png +0 -0
- /package/{public → dist}/screenshots/desktop-main.png +0 -0
- /package/{public → dist}/screenshots/mobile-chat.png +0 -0
- /package/{public → dist}/screenshots/tools-modal.png +0 -0
- /package/{public → dist}/sw.js +0 -0
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import React, { useState, useEffect } from 'react';
|
|
2
|
-
import Shell from './Shell.jsx';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Generic Shell wrapper that can be used in tabs, modals, and other contexts.
|
|
6
|
-
* Provides a flexible API for both standalone and session-based usage.
|
|
7
|
-
*
|
|
8
|
-
* @param {Object} project - Project object with name, fullPath/path, displayName
|
|
9
|
-
* @param {Object} session - Session object (optional, for tab usage)
|
|
10
|
-
* @param {string} command - Initial command to run (optional)
|
|
11
|
-
* @param {boolean} isActive - Whether the shell is active (for tab usage, default: true)
|
|
12
|
-
* @param {boolean} isPlainShell - Use plain shell mode vs Claude CLI (default: auto-detect)
|
|
13
|
-
* @param {boolean} autoConnect - Whether to auto-connect when mounted (default: true)
|
|
14
|
-
* @param {function} onComplete - Callback when process completes (receives exitCode)
|
|
15
|
-
* @param {function} onClose - Callback for close button (optional)
|
|
16
|
-
* @param {string} title - Custom header title (optional)
|
|
17
|
-
* @param {string} className - Additional CSS classes
|
|
18
|
-
* @param {boolean} showHeader - Whether to show custom header (default: true)
|
|
19
|
-
* @param {boolean} compact - Use compact layout (default: false)
|
|
20
|
-
*/
|
|
21
|
-
function StandaloneShell({
|
|
22
|
-
project,
|
|
23
|
-
session = null,
|
|
24
|
-
command = null,
|
|
25
|
-
isActive = true,
|
|
26
|
-
isPlainShell = null, // Auto-detect: true if command provided, false if session provided
|
|
27
|
-
autoConnect = true,
|
|
28
|
-
onComplete = null,
|
|
29
|
-
onClose = null,
|
|
30
|
-
title = null,
|
|
31
|
-
className = "",
|
|
32
|
-
showHeader = true,
|
|
33
|
-
compact = false
|
|
34
|
-
}) {
|
|
35
|
-
const [isCompleted, setIsCompleted] = useState(false);
|
|
36
|
-
|
|
37
|
-
// Auto-detect isPlainShell based on props
|
|
38
|
-
const shouldUsePlainShell = isPlainShell !== null ? isPlainShell : (command !== null);
|
|
39
|
-
|
|
40
|
-
// Handle process completion
|
|
41
|
-
const handleProcessComplete = (exitCode) => {
|
|
42
|
-
setIsCompleted(true);
|
|
43
|
-
if (onComplete) {
|
|
44
|
-
onComplete(exitCode);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
if (!project) {
|
|
49
|
-
return (
|
|
50
|
-
<div className={`h-full flex items-center justify-center ${className}`}>
|
|
51
|
-
<div className="text-center text-gray-500 dark:text-gray-400">
|
|
52
|
-
<div className="w-16 h-16 mx-auto mb-4 bg-gray-100 dark:bg-gray-800 rounded-full flex items-center justify-center">
|
|
53
|
-
<svg className="w-8 h-8 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
54
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 002 2z" />
|
|
55
|
-
</svg>
|
|
56
|
-
</div>
|
|
57
|
-
<h3 className="text-lg font-semibold mb-2">No Project Selected</h3>
|
|
58
|
-
<p>A project is required to open a shell</p>
|
|
59
|
-
</div>
|
|
60
|
-
</div>
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return (
|
|
65
|
-
<div className={`h-full flex flex-col ${className}`}>
|
|
66
|
-
{/* Optional custom header */}
|
|
67
|
-
{showHeader && title && (
|
|
68
|
-
<div className="flex-shrink-0 bg-gray-800 border-b border-gray-700 px-4 py-2">
|
|
69
|
-
<div className="flex items-center justify-between">
|
|
70
|
-
<div className="flex items-center space-x-2">
|
|
71
|
-
<h3 className="text-sm font-medium text-gray-200">{title}</h3>
|
|
72
|
-
{isCompleted && (
|
|
73
|
-
<span className="text-xs text-green-400">(Completed)</span>
|
|
74
|
-
)}
|
|
75
|
-
</div>
|
|
76
|
-
{onClose && (
|
|
77
|
-
<button
|
|
78
|
-
onClick={onClose}
|
|
79
|
-
className="text-gray-400 hover:text-white"
|
|
80
|
-
title="Close"
|
|
81
|
-
>
|
|
82
|
-
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
83
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
|
|
84
|
-
</svg>
|
|
85
|
-
</button>
|
|
86
|
-
)}
|
|
87
|
-
</div>
|
|
88
|
-
</div>
|
|
89
|
-
)}
|
|
90
|
-
|
|
91
|
-
{/* Shell component wrapper */}
|
|
92
|
-
<div className="flex-1">
|
|
93
|
-
<Shell
|
|
94
|
-
selectedProject={project}
|
|
95
|
-
selectedSession={session}
|
|
96
|
-
isActive={isActive}
|
|
97
|
-
initialCommand={command}
|
|
98
|
-
isPlainShell={shouldUsePlainShell}
|
|
99
|
-
onProcessComplete={handleProcessComplete}
|
|
100
|
-
/>
|
|
101
|
-
</div>
|
|
102
|
-
</div>
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export default StandaloneShell;
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Clock, CheckCircle, Circle, AlertCircle, Pause, X, ArrowRight, ChevronUp, Minus, Flag } from 'lucide-react';
|
|
3
|
-
import { cn } from '../lib/utils';
|
|
4
|
-
import Tooltip from './Tooltip';
|
|
5
|
-
|
|
6
|
-
const TaskCard = ({
|
|
7
|
-
task,
|
|
8
|
-
onClick,
|
|
9
|
-
showParent = false,
|
|
10
|
-
className = ''
|
|
11
|
-
}) => {
|
|
12
|
-
const getStatusConfig = (status) => {
|
|
13
|
-
switch (status) {
|
|
14
|
-
case 'done':
|
|
15
|
-
return {
|
|
16
|
-
icon: CheckCircle,
|
|
17
|
-
bgColor: 'bg-green-50 dark:bg-green-950',
|
|
18
|
-
borderColor: 'border-green-200 dark:border-green-800',
|
|
19
|
-
iconColor: 'text-green-600 dark:text-green-400',
|
|
20
|
-
textColor: 'text-green-900 dark:text-green-100',
|
|
21
|
-
statusText: 'Done'
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
case 'in-progress':
|
|
25
|
-
return {
|
|
26
|
-
icon: Clock,
|
|
27
|
-
bgColor: 'bg-blue-50 dark:bg-blue-950',
|
|
28
|
-
borderColor: 'border-blue-200 dark:border-blue-800',
|
|
29
|
-
iconColor: 'text-blue-600 dark:text-blue-400',
|
|
30
|
-
textColor: 'text-blue-900 dark:text-blue-100',
|
|
31
|
-
statusText: 'In Progress'
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
case 'review':
|
|
35
|
-
return {
|
|
36
|
-
icon: AlertCircle,
|
|
37
|
-
bgColor: 'bg-amber-50 dark:bg-amber-950',
|
|
38
|
-
borderColor: 'border-amber-200 dark:border-amber-800',
|
|
39
|
-
iconColor: 'text-amber-600 dark:text-amber-400',
|
|
40
|
-
textColor: 'text-amber-900 dark:text-amber-100',
|
|
41
|
-
statusText: 'Review'
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
case 'deferred':
|
|
45
|
-
return {
|
|
46
|
-
icon: Pause,
|
|
47
|
-
bgColor: 'bg-gray-50 dark:bg-gray-800',
|
|
48
|
-
borderColor: 'border-gray-200 dark:border-gray-700',
|
|
49
|
-
iconColor: 'text-gray-500 dark:text-gray-400',
|
|
50
|
-
textColor: 'text-gray-700 dark:text-gray-300',
|
|
51
|
-
statusText: 'Deferred'
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
case 'cancelled':
|
|
55
|
-
return {
|
|
56
|
-
icon: X,
|
|
57
|
-
bgColor: 'bg-red-50 dark:bg-red-950',
|
|
58
|
-
borderColor: 'border-red-200 dark:border-red-800',
|
|
59
|
-
iconColor: 'text-red-600 dark:text-red-400',
|
|
60
|
-
textColor: 'text-red-900 dark:text-red-100',
|
|
61
|
-
statusText: 'Cancelled'
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
case 'pending':
|
|
65
|
-
default:
|
|
66
|
-
return {
|
|
67
|
-
icon: Circle,
|
|
68
|
-
bgColor: 'bg-slate-50 dark:bg-slate-800',
|
|
69
|
-
borderColor: 'border-slate-200 dark:border-slate-700',
|
|
70
|
-
iconColor: 'text-slate-500 dark:text-slate-400',
|
|
71
|
-
textColor: 'text-slate-900 dark:text-slate-100',
|
|
72
|
-
statusText: 'Pending'
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
const config = getStatusConfig(task.status);
|
|
78
|
-
const Icon = config.icon;
|
|
79
|
-
|
|
80
|
-
const getPriorityIcon = (priority) => {
|
|
81
|
-
switch (priority) {
|
|
82
|
-
case 'high':
|
|
83
|
-
return (
|
|
84
|
-
<Tooltip content="High Priority">
|
|
85
|
-
<div className="w-4 h-4 bg-red-100 dark:bg-red-900/30 rounded flex items-center justify-center">
|
|
86
|
-
<ChevronUp className="w-2.5 h-2.5 text-red-600 dark:text-red-400" />
|
|
87
|
-
</div>
|
|
88
|
-
</Tooltip>
|
|
89
|
-
);
|
|
90
|
-
case 'medium':
|
|
91
|
-
return (
|
|
92
|
-
<Tooltip content="Medium Priority">
|
|
93
|
-
<div className="w-4 h-4 bg-amber-100 dark:bg-amber-900/30 rounded flex items-center justify-center">
|
|
94
|
-
<Minus className="w-2.5 h-2.5 text-amber-600 dark:text-amber-400" />
|
|
95
|
-
</div>
|
|
96
|
-
</Tooltip>
|
|
97
|
-
);
|
|
98
|
-
case 'low':
|
|
99
|
-
return (
|
|
100
|
-
<Tooltip content="Low Priority">
|
|
101
|
-
<div className="w-4 h-4 bg-blue-100 dark:bg-blue-900/30 rounded flex items-center justify-center">
|
|
102
|
-
<Circle className="w-1.5 h-1.5 text-blue-600 dark:text-blue-400 fill-current" />
|
|
103
|
-
</div>
|
|
104
|
-
</Tooltip>
|
|
105
|
-
);
|
|
106
|
-
default:
|
|
107
|
-
return (
|
|
108
|
-
<Tooltip content="No Priority Set">
|
|
109
|
-
<div className="w-4 h-4 bg-gray-100 dark:bg-gray-800 rounded flex items-center justify-center">
|
|
110
|
-
<Circle className="w-1.5 h-1.5 text-gray-400 dark:text-gray-500" />
|
|
111
|
-
</div>
|
|
112
|
-
</Tooltip>
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
return (
|
|
118
|
-
<div
|
|
119
|
-
className={cn(
|
|
120
|
-
'bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700',
|
|
121
|
-
'hover:shadow-md hover:border-blue-300 dark:hover:border-blue-600 transition-all duration-200 cursor-pointer',
|
|
122
|
-
'p-3 space-y-3',
|
|
123
|
-
onClick && 'hover:-translate-y-0.5',
|
|
124
|
-
className
|
|
125
|
-
)}
|
|
126
|
-
onClick={onClick}
|
|
127
|
-
>
|
|
128
|
-
{/* Header with Task ID, Title, and Priority */}
|
|
129
|
-
<div className="flex items-start justify-between gap-2 mb-2">
|
|
130
|
-
{/* Task ID and Title */}
|
|
131
|
-
<div className="flex-1 min-w-0">
|
|
132
|
-
<div className="flex items-center gap-2 mb-1">
|
|
133
|
-
<Tooltip content={`Task ID: ${task.id}`}>
|
|
134
|
-
<span className="text-xs font-mono text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-700 px-2 py-0.5 rounded">
|
|
135
|
-
{task.id}
|
|
136
|
-
</span>
|
|
137
|
-
</Tooltip>
|
|
138
|
-
</div>
|
|
139
|
-
<h3 className="font-medium text-sm text-gray-900 dark:text-white line-clamp-2 leading-tight">
|
|
140
|
-
{task.title}
|
|
141
|
-
</h3>
|
|
142
|
-
{showParent && task.parentId && (
|
|
143
|
-
<span className="text-xs text-gray-500 dark:text-gray-400 font-medium">
|
|
144
|
-
Task {task.parentId}
|
|
145
|
-
</span>
|
|
146
|
-
)}
|
|
147
|
-
</div>
|
|
148
|
-
|
|
149
|
-
{/* Priority Icon */}
|
|
150
|
-
<div className="flex-shrink-0">
|
|
151
|
-
{getPriorityIcon(task.priority)}
|
|
152
|
-
</div>
|
|
153
|
-
</div>
|
|
154
|
-
|
|
155
|
-
{/* Footer with Dependencies and Status */}
|
|
156
|
-
<div className="flex items-center justify-between">
|
|
157
|
-
{/* Dependencies */}
|
|
158
|
-
<div className="flex items-center">
|
|
159
|
-
{task.dependencies && Array.isArray(task.dependencies) && task.dependencies.length > 0 && (
|
|
160
|
-
<Tooltip content={`Depends on: ${task.dependencies.map(dep => `Task ${dep}`).join(', ')}`}>
|
|
161
|
-
<div className="flex items-center gap-1 text-xs text-amber-600 dark:text-amber-400">
|
|
162
|
-
<ArrowRight className="w-3 h-3" />
|
|
163
|
-
<span>Depends on: {task.dependencies.join(', ')}</span>
|
|
164
|
-
</div>
|
|
165
|
-
</Tooltip>
|
|
166
|
-
)}
|
|
167
|
-
</div>
|
|
168
|
-
|
|
169
|
-
{/* Status Badge */}
|
|
170
|
-
<Tooltip content={`Status: ${config.statusText}`}>
|
|
171
|
-
<div className="flex items-center gap-1">
|
|
172
|
-
<div className={cn('w-2 h-2 rounded-full', config.iconColor.replace('text-', 'bg-'))} />
|
|
173
|
-
<span className={cn('text-xs font-medium', config.textColor)}>
|
|
174
|
-
{config.statusText}
|
|
175
|
-
</span>
|
|
176
|
-
</div>
|
|
177
|
-
</Tooltip>
|
|
178
|
-
</div>
|
|
179
|
-
|
|
180
|
-
{/* Subtask Progress (if applicable) */}
|
|
181
|
-
{task.subtasks && task.subtasks.length > 0 && (
|
|
182
|
-
<div className="ml-3">
|
|
183
|
-
<div className="flex items-center gap-2 mb-1">
|
|
184
|
-
<span className="text-xs text-gray-500 dark:text-gray-400">Progress:</span>
|
|
185
|
-
<Tooltip content={`${task.subtasks.filter(st => st.status === 'done').length} of ${task.subtasks.length} subtasks completed`}>
|
|
186
|
-
<div className="flex-1 bg-gray-200 dark:bg-gray-700 rounded-full h-1.5">
|
|
187
|
-
<div
|
|
188
|
-
className={cn(
|
|
189
|
-
'h-full rounded-full transition-all duration-300',
|
|
190
|
-
task.status === 'done' ? 'bg-green-500' : 'bg-blue-500'
|
|
191
|
-
)}
|
|
192
|
-
style={{
|
|
193
|
-
width: `${Math.round((task.subtasks.filter(st => st.status === 'done').length / task.subtasks.length) * 100)}%`
|
|
194
|
-
}}
|
|
195
|
-
/>
|
|
196
|
-
</div>
|
|
197
|
-
</Tooltip>
|
|
198
|
-
<Tooltip content={`${task.subtasks.filter(st => st.status === 'done').length} completed, ${task.subtasks.filter(st => st.status === 'pending').length} pending, ${task.subtasks.filter(st => st.status === 'in-progress').length} in progress`}>
|
|
199
|
-
<span className="text-xs text-gray-500 dark:text-gray-400">
|
|
200
|
-
{task.subtasks.filter(st => st.status === 'done').length}/{task.subtasks.length}
|
|
201
|
-
</span>
|
|
202
|
-
</Tooltip>
|
|
203
|
-
</div>
|
|
204
|
-
</div>
|
|
205
|
-
)}
|
|
206
|
-
</div>
|
|
207
|
-
);
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
export default TaskCard;
|