@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.
Files changed (92) hide show
  1. package/dist/assets/index-CeR_JfKq.js +895 -0
  2. package/dist/assets/index-Co7ALK3i.css +32 -0
  3. package/{index.html → dist/index.html} +2 -1
  4. package/package.json +6 -1
  5. package/server/database/auth.db +0 -0
  6. package/.env.example +0 -12
  7. package/.nvmrc +0 -1
  8. package/postcss.config.js +0 -6
  9. package/src/App.jsx +0 -751
  10. package/src/components/ChatInterface.jsx +0 -3485
  11. package/src/components/ClaudeLogo.jsx +0 -11
  12. package/src/components/ClaudeStatus.jsx +0 -107
  13. package/src/components/CodeEditor.jsx +0 -422
  14. package/src/components/CreateTaskModal.jsx +0 -88
  15. package/src/components/CursorLogo.jsx +0 -9
  16. package/src/components/DarkModeToggle.jsx +0 -35
  17. package/src/components/DiffViewer.jsx +0 -41
  18. package/src/components/ErrorBoundary.jsx +0 -73
  19. package/src/components/FileTree.jsx +0 -480
  20. package/src/components/GitPanel.jsx +0 -1283
  21. package/src/components/ImageViewer.jsx +0 -54
  22. package/src/components/LoginForm.jsx +0 -110
  23. package/src/components/MainContent.jsx +0 -577
  24. package/src/components/MicButton.jsx +0 -272
  25. package/src/components/MobileNav.jsx +0 -88
  26. package/src/components/NextTaskBanner.jsx +0 -695
  27. package/src/components/PRDEditor.jsx +0 -871
  28. package/src/components/ProtectedRoute.jsx +0 -44
  29. package/src/components/QuickSettingsPanel.jsx +0 -262
  30. package/src/components/Settings.jsx +0 -2023
  31. package/src/components/SetupForm.jsx +0 -135
  32. package/src/components/Shell.jsx +0 -663
  33. package/src/components/Sidebar.jsx +0 -1665
  34. package/src/components/StandaloneShell.jsx +0 -106
  35. package/src/components/TaskCard.jsx +0 -210
  36. package/src/components/TaskDetail.jsx +0 -406
  37. package/src/components/TaskIndicator.jsx +0 -108
  38. package/src/components/TaskList.jsx +0 -1054
  39. package/src/components/TaskMasterSetupWizard.jsx +0 -603
  40. package/src/components/TaskMasterStatus.jsx +0 -86
  41. package/src/components/TodoList.jsx +0 -91
  42. package/src/components/Tooltip.jsx +0 -91
  43. package/src/components/ui/badge.jsx +0 -31
  44. package/src/components/ui/button.jsx +0 -46
  45. package/src/components/ui/input.jsx +0 -19
  46. package/src/components/ui/scroll-area.jsx +0 -23
  47. package/src/contexts/AuthContext.jsx +0 -158
  48. package/src/contexts/TaskMasterContext.jsx +0 -324
  49. package/src/contexts/TasksSettingsContext.jsx +0 -95
  50. package/src/contexts/ThemeContext.jsx +0 -94
  51. package/src/contexts/WebSocketContext.jsx +0 -29
  52. package/src/hooks/useAudioRecorder.js +0 -109
  53. package/src/hooks/useVersionCheck.js +0 -39
  54. package/src/index.css +0 -822
  55. package/src/lib/utils.js +0 -6
  56. package/src/main.jsx +0 -10
  57. package/src/utils/api.js +0 -141
  58. package/src/utils/websocket.js +0 -109
  59. package/src/utils/whisper.js +0 -37
  60. package/tailwind.config.js +0 -63
  61. package/vite.config.js +0 -29
  62. /package/{public → dist}/convert-icons.md +0 -0
  63. /package/{public → dist}/favicon.png +0 -0
  64. /package/{public → dist}/favicon.svg +0 -0
  65. /package/{public → dist}/generate-icons.js +0 -0
  66. /package/{public → dist}/icons/claude-ai-icon.svg +0 -0
  67. /package/{public → dist}/icons/cursor.svg +0 -0
  68. /package/{public → dist}/icons/generate-icons.md +0 -0
  69. /package/{public → dist}/icons/icon-128x128.png +0 -0
  70. /package/{public → dist}/icons/icon-128x128.svg +0 -0
  71. /package/{public → dist}/icons/icon-144x144.png +0 -0
  72. /package/{public → dist}/icons/icon-144x144.svg +0 -0
  73. /package/{public → dist}/icons/icon-152x152.png +0 -0
  74. /package/{public → dist}/icons/icon-152x152.svg +0 -0
  75. /package/{public → dist}/icons/icon-192x192.png +0 -0
  76. /package/{public → dist}/icons/icon-192x192.svg +0 -0
  77. /package/{public → dist}/icons/icon-384x384.png +0 -0
  78. /package/{public → dist}/icons/icon-384x384.svg +0 -0
  79. /package/{public → dist}/icons/icon-512x512.png +0 -0
  80. /package/{public → dist}/icons/icon-512x512.svg +0 -0
  81. /package/{public → dist}/icons/icon-72x72.png +0 -0
  82. /package/{public → dist}/icons/icon-72x72.svg +0 -0
  83. /package/{public → dist}/icons/icon-96x96.png +0 -0
  84. /package/{public → dist}/icons/icon-96x96.svg +0 -0
  85. /package/{public → dist}/icons/icon-template.svg +0 -0
  86. /package/{public → dist}/logo.svg +0 -0
  87. /package/{public → dist}/manifest.json +0 -0
  88. /package/{public → dist}/screenshots/cli-selection.png +0 -0
  89. /package/{public → dist}/screenshots/desktop-main.png +0 -0
  90. /package/{public → dist}/screenshots/mobile-chat.png +0 -0
  91. /package/{public → dist}/screenshots/tools-modal.png +0 -0
  92. /package/{public → dist}/sw.js +0 -0
package/src/lib/utils.js DELETED
@@ -1,6 +0,0 @@
1
- import { clsx } from "clsx"
2
- import { twMerge } from "tailwind-merge"
3
-
4
- export function cn(...inputs) {
5
- return twMerge(clsx(inputs))
6
- }
package/src/main.jsx DELETED
@@ -1,10 +0,0 @@
1
- import React from 'react'
2
- import ReactDOM from 'react-dom/client'
3
- import App from './App.jsx'
4
- import './index.css'
5
-
6
- ReactDOM.createRoot(document.getElementById('root')).render(
7
- <React.StrictMode>
8
- <App />
9
- </React.StrictMode>,
10
- )
package/src/utils/api.js DELETED
@@ -1,141 +0,0 @@
1
- // Utility function for authenticated API calls
2
- export const authenticatedFetch = (url, options = {}) => {
3
- const token = localStorage.getItem('auth-token');
4
-
5
- const defaultHeaders = {
6
- 'Content-Type': 'application/json',
7
- };
8
-
9
- if (token) {
10
- defaultHeaders['Authorization'] = `Bearer ${token}`;
11
- }
12
-
13
- return fetch(url, {
14
- ...options,
15
- headers: {
16
- ...defaultHeaders,
17
- ...options.headers,
18
- },
19
- });
20
- };
21
-
22
- // API endpoints
23
- export const api = {
24
- // Auth endpoints (no token required)
25
- auth: {
26
- status: () => fetch('/api/auth/status'),
27
- login: (username, password) => fetch('/api/auth/login', {
28
- method: 'POST',
29
- headers: { 'Content-Type': 'application/json' },
30
- body: JSON.stringify({ username, password }),
31
- }),
32
- register: (username, password) => fetch('/api/auth/register', {
33
- method: 'POST',
34
- headers: { 'Content-Type': 'application/json' },
35
- body: JSON.stringify({ username, password }),
36
- }),
37
- user: () => authenticatedFetch('/api/auth/user'),
38
- logout: () => authenticatedFetch('/api/auth/logout', { method: 'POST' }),
39
- },
40
-
41
- // Protected endpoints
42
- config: () => authenticatedFetch('/api/config'),
43
- projects: () => authenticatedFetch('/api/projects'),
44
- sessions: (projectName, limit = 5, offset = 0) =>
45
- authenticatedFetch(`/api/projects/${projectName}/sessions?limit=${limit}&offset=${offset}`),
46
- sessionMessages: (projectName, sessionId, limit = null, offset = 0) => {
47
- const params = new URLSearchParams();
48
- if (limit !== null) {
49
- params.append('limit', limit);
50
- params.append('offset', offset);
51
- }
52
- const queryString = params.toString();
53
- const url = `/api/projects/${projectName}/sessions/${sessionId}/messages${queryString ? `?${queryString}` : ''}`;
54
- return authenticatedFetch(url);
55
- },
56
- renameProject: (projectName, displayName) =>
57
- authenticatedFetch(`/api/projects/${projectName}/rename`, {
58
- method: 'PUT',
59
- body: JSON.stringify({ displayName }),
60
- }),
61
- deleteSession: (projectName, sessionId) =>
62
- authenticatedFetch(`/api/projects/${projectName}/sessions/${sessionId}`, {
63
- method: 'DELETE',
64
- }),
65
- deleteProject: (projectName) =>
66
- authenticatedFetch(`/api/projects/${projectName}`, {
67
- method: 'DELETE',
68
- }),
69
- createProject: (path) =>
70
- authenticatedFetch('/api/projects/create', {
71
- method: 'POST',
72
- body: JSON.stringify({ path }),
73
- }),
74
- readFile: (projectName, filePath) =>
75
- authenticatedFetch(`/api/projects/${projectName}/file?filePath=${encodeURIComponent(filePath)}`),
76
- saveFile: (projectName, filePath, content) =>
77
- authenticatedFetch(`/api/projects/${projectName}/file`, {
78
- method: 'PUT',
79
- body: JSON.stringify({ filePath, content }),
80
- }),
81
- getFiles: (projectName) =>
82
- authenticatedFetch(`/api/projects/${projectName}/files`),
83
- transcribe: (formData) =>
84
- authenticatedFetch('/api/transcribe', {
85
- method: 'POST',
86
- body: formData,
87
- headers: {}, // Let browser set Content-Type for FormData
88
- }),
89
-
90
- // TaskMaster endpoints
91
- taskmaster: {
92
- // Initialize TaskMaster in a project
93
- init: (projectName) =>
94
- authenticatedFetch(`/api/taskmaster/init/${projectName}`, {
95
- method: 'POST',
96
- }),
97
-
98
- // Add a new task
99
- addTask: (projectName, { prompt, title, description, priority, dependencies }) =>
100
- authenticatedFetch(`/api/taskmaster/add-task/${projectName}`, {
101
- method: 'POST',
102
- body: JSON.stringify({ prompt, title, description, priority, dependencies }),
103
- }),
104
-
105
- // Parse PRD to generate tasks
106
- parsePRD: (projectName, { fileName, numTasks, append }) =>
107
- authenticatedFetch(`/api/taskmaster/parse-prd/${projectName}`, {
108
- method: 'POST',
109
- body: JSON.stringify({ fileName, numTasks, append }),
110
- }),
111
-
112
- // Get available PRD templates
113
- getTemplates: () =>
114
- authenticatedFetch('/api/taskmaster/prd-templates'),
115
-
116
- // Apply a PRD template
117
- applyTemplate: (projectName, { templateId, fileName, customizations }) =>
118
- authenticatedFetch(`/api/taskmaster/apply-template/${projectName}`, {
119
- method: 'POST',
120
- body: JSON.stringify({ templateId, fileName, customizations }),
121
- }),
122
-
123
- // Update a task
124
- updateTask: (projectName, taskId, updates) =>
125
- authenticatedFetch(`/api/taskmaster/update-task/${projectName}/${taskId}`, {
126
- method: 'PUT',
127
- body: JSON.stringify(updates),
128
- }),
129
- },
130
-
131
- // Browse filesystem for project suggestions
132
- browseFilesystem: (dirPath = null) => {
133
- const params = new URLSearchParams();
134
- if (dirPath) params.append('path', dirPath);
135
-
136
- return authenticatedFetch(`/api/browse-filesystem?${params}`);
137
- },
138
-
139
- // Generic GET method for any endpoint
140
- get: (endpoint) => authenticatedFetch(`/api${endpoint}`),
141
- };
@@ -1,109 +0,0 @@
1
- import { useState, useEffect, useRef } from 'react';
2
-
3
- export function useWebSocket() {
4
- const [ws, setWs] = useState(null);
5
- const [messages, setMessages] = useState([]);
6
- const [isConnected, setIsConnected] = useState(false);
7
- const reconnectTimeoutRef = useRef(null);
8
-
9
- useEffect(() => {
10
- connect();
11
-
12
- return () => {
13
- if (reconnectTimeoutRef.current) {
14
- clearTimeout(reconnectTimeoutRef.current);
15
- }
16
- if (ws) {
17
- ws.close();
18
- }
19
- };
20
- }, []); // Keep dependency array but add proper cleanup
21
-
22
- const connect = async () => {
23
- try {
24
- // Get authentication token
25
- const token = localStorage.getItem('auth-token');
26
- if (!token) {
27
- console.warn('No authentication token found for WebSocket connection');
28
- return;
29
- }
30
-
31
- // Fetch server configuration to get the correct WebSocket URL
32
- let wsBaseUrl;
33
- try {
34
- const configResponse = await fetch('/api/config', {
35
- headers: {
36
- 'Authorization': `Bearer ${token}`
37
- }
38
- });
39
- const config = await configResponse.json();
40
- wsBaseUrl = config.wsUrl;
41
-
42
- // If the config returns localhost but we're not on localhost, use current host but with API server port
43
- if (wsBaseUrl.includes('localhost') && !window.location.hostname.includes('localhost')) {
44
- console.warn('Config returned localhost, using current host with API server port instead');
45
- const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
46
- // For development, API server is typically on port 3002 when Vite is on 3001
47
- const apiPort = window.location.port === '3001' ? '3002' : window.location.port;
48
- wsBaseUrl = `${protocol}//${window.location.hostname}:${apiPort}`;
49
- }
50
- } catch (error) {
51
- console.warn('Could not fetch server config, falling back to current host with API server port');
52
- const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
53
- // For development, API server is typically on port 3002 when Vite is on 3001
54
- const apiPort = window.location.port === '3001' ? '3002' : window.location.port;
55
- wsBaseUrl = `${protocol}//${window.location.hostname}:${apiPort}`;
56
- }
57
-
58
- // Include token in WebSocket URL as query parameter
59
- const wsUrl = `${wsBaseUrl}/ws?token=${encodeURIComponent(token)}`;
60
- const websocket = new WebSocket(wsUrl);
61
-
62
- websocket.onopen = () => {
63
- setIsConnected(true);
64
- setWs(websocket);
65
- };
66
-
67
- websocket.onmessage = (event) => {
68
- try {
69
- const data = JSON.parse(event.data);
70
- setMessages(prev => [...prev, data]);
71
- } catch (error) {
72
- console.error('Error parsing WebSocket message:', error);
73
- }
74
- };
75
-
76
- websocket.onclose = () => {
77
- setIsConnected(false);
78
- setWs(null);
79
-
80
- // Attempt to reconnect after 3 seconds
81
- reconnectTimeoutRef.current = setTimeout(() => {
82
- connect();
83
- }, 3000);
84
- };
85
-
86
- websocket.onerror = (error) => {
87
- console.error('WebSocket error:', error);
88
- };
89
-
90
- } catch (error) {
91
- console.error('Error creating WebSocket connection:', error);
92
- }
93
- };
94
-
95
- const sendMessage = (message) => {
96
- if (ws && isConnected) {
97
- ws.send(JSON.stringify(message));
98
- } else {
99
- console.warn('WebSocket not connected');
100
- }
101
- };
102
-
103
- return {
104
- ws,
105
- sendMessage,
106
- messages,
107
- isConnected
108
- };
109
- }
@@ -1,37 +0,0 @@
1
- import { api } from './api';
2
-
3
- export async function transcribeWithWhisper(audioBlob, onStatusChange) {
4
- const formData = new FormData();
5
- const fileName = `recording_${Date.now()}.webm`;
6
- const file = new File([audioBlob], fileName, { type: audioBlob.type });
7
-
8
- formData.append('audio', file);
9
-
10
- const whisperMode = window.localStorage.getItem('whisperMode') || 'default';
11
- formData.append('mode', whisperMode);
12
-
13
- try {
14
- // Start with transcribing state
15
- if (onStatusChange) {
16
- onStatusChange('transcribing');
17
- }
18
-
19
- const response = await api.transcribe(formData);
20
-
21
- if (!response.ok) {
22
- const errorData = await response.json().catch(() => ({}));
23
- throw new Error(
24
- errorData.error ||
25
- `Transcription error: ${response.status} ${response.statusText}`
26
- );
27
- }
28
-
29
- const data = await response.json();
30
- return data.text || '';
31
- } catch (error) {
32
- if (error.name === 'TypeError' && error.message.includes('fetch')) {
33
- throw new Error('Cannot connect to server. Please ensure the backend is running.');
34
- }
35
- throw error;
36
- }
37
- }
@@ -1,63 +0,0 @@
1
- /** @type {import('tailwindcss').Config} */
2
- export default {
3
- darkMode: ["class"],
4
- content: [
5
- "./index.html",
6
- "./src/**/*.{js,ts,jsx,tsx}",
7
- ],
8
- theme: {
9
- container: {
10
- center: true,
11
- padding: "2rem",
12
- screens: {
13
- "2xl": "1400px",
14
- },
15
- },
16
- extend: {
17
- colors: {
18
- border: "hsl(var(--border))",
19
- input: "hsl(var(--input))",
20
- ring: "hsl(var(--ring))",
21
- background: "hsl(var(--background))",
22
- foreground: "hsl(var(--foreground))",
23
- primary: {
24
- DEFAULT: "hsl(var(--primary))",
25
- foreground: "hsl(var(--primary-foreground))",
26
- },
27
- secondary: {
28
- DEFAULT: "hsl(var(--secondary))",
29
- foreground: "hsl(var(--secondary-foreground))",
30
- },
31
- destructive: {
32
- DEFAULT: "hsl(var(--destructive))",
33
- foreground: "hsl(var(--destructive-foreground))",
34
- },
35
- muted: {
36
- DEFAULT: "hsl(var(--muted))",
37
- foreground: "hsl(var(--muted-foreground))",
38
- },
39
- accent: {
40
- DEFAULT: "hsl(var(--accent))",
41
- foreground: "hsl(var(--accent-foreground))",
42
- },
43
- popover: {
44
- DEFAULT: "hsl(var(--popover))",
45
- foreground: "hsl(var(--popover-foreground))",
46
- },
47
- card: {
48
- DEFAULT: "hsl(var(--card))",
49
- foreground: "hsl(var(--card-foreground))",
50
- },
51
- },
52
- borderRadius: {
53
- lg: "var(--radius)",
54
- md: "calc(var(--radius) - 2px)",
55
- sm: "calc(var(--radius) - 4px)",
56
- },
57
- spacing: {
58
- 'safe-area-inset-bottom': 'env(safe-area-inset-bottom)',
59
- },
60
- },
61
- },
62
- plugins: [require('@tailwindcss/typography')],
63
- }
package/vite.config.js DELETED
@@ -1,29 +0,0 @@
1
- import { defineConfig, loadEnv } from 'vite'
2
- import react from '@vitejs/plugin-react'
3
-
4
- export default defineConfig(({ command, mode }) => {
5
- // Load env file based on `mode` in the current working directory.
6
- const env = loadEnv(mode, process.cwd(), '')
7
-
8
-
9
- return {
10
- plugins: [react()],
11
- server: {
12
- port: parseInt(env.VITE_PORT) || 5173,
13
- proxy: {
14
- '/api': `http://localhost:${env.PORT || 3001}`,
15
- '/ws': {
16
- target: `ws://localhost:${env.PORT || 3001}`,
17
- ws: true
18
- },
19
- '/shell': {
20
- target: `ws://localhost:${env.PORT || 3002}`,
21
- ws: true
22
- }
23
- }
24
- },
25
- build: {
26
- outDir: 'dist'
27
- }
28
- }
29
- })
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes