claudedesk 1.0.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 (182) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +431 -0
  3. package/config/repos.example.json +128 -0
  4. package/config/settings.example.json +64 -0
  5. package/config/skills/code-review.md +76 -0
  6. package/config/skills/full-check.md +26 -0
  7. package/config/skills/lint-fix.md +23 -0
  8. package/dist/api/agent-routes.d.ts +2 -0
  9. package/dist/api/agent-routes.d.ts.map +1 -0
  10. package/dist/api/agent-routes.js +251 -0
  11. package/dist/api/agent-routes.js.map +1 -0
  12. package/dist/api/app-routes.d.ts +2 -0
  13. package/dist/api/app-routes.d.ts.map +1 -0
  14. package/dist/api/app-routes.js +150 -0
  15. package/dist/api/app-routes.js.map +1 -0
  16. package/dist/api/docker-routes.d.ts +2 -0
  17. package/dist/api/docker-routes.d.ts.map +1 -0
  18. package/dist/api/docker-routes.js +167 -0
  19. package/dist/api/docker-routes.js.map +1 -0
  20. package/dist/api/middleware.d.ts +6 -0
  21. package/dist/api/middleware.d.ts.map +1 -0
  22. package/dist/api/middleware.js +293 -0
  23. package/dist/api/middleware.js.map +1 -0
  24. package/dist/api/pin-auth.d.ts +65 -0
  25. package/dist/api/pin-auth.d.ts.map +1 -0
  26. package/dist/api/pin-auth.js +218 -0
  27. package/dist/api/pin-auth.js.map +1 -0
  28. package/dist/api/routes.d.ts +2 -0
  29. package/dist/api/routes.d.ts.map +1 -0
  30. package/dist/api/routes.js +473 -0
  31. package/dist/api/routes.js.map +1 -0
  32. package/dist/api/settings-routes.d.ts +2 -0
  33. package/dist/api/settings-routes.d.ts.map +1 -0
  34. package/dist/api/settings-routes.js +570 -0
  35. package/dist/api/settings-routes.js.map +1 -0
  36. package/dist/api/skill-routes.d.ts +2 -0
  37. package/dist/api/skill-routes.d.ts.map +1 -0
  38. package/dist/api/skill-routes.js +88 -0
  39. package/dist/api/skill-routes.js.map +1 -0
  40. package/dist/api/terminal-routes.d.ts +2 -0
  41. package/dist/api/terminal-routes.d.ts.map +1 -0
  42. package/dist/api/terminal-routes.js +3524 -0
  43. package/dist/api/terminal-routes.js.map +1 -0
  44. package/dist/api/tunnel-routes.d.ts +2 -0
  45. package/dist/api/tunnel-routes.d.ts.map +1 -0
  46. package/dist/api/tunnel-routes.js +196 -0
  47. package/dist/api/tunnel-routes.js.map +1 -0
  48. package/dist/api/workspace-routes.d.ts +3 -0
  49. package/dist/api/workspace-routes.d.ts.map +1 -0
  50. package/dist/api/workspace-routes.js +649 -0
  51. package/dist/api/workspace-routes.js.map +1 -0
  52. package/dist/cli.d.ts +3 -0
  53. package/dist/cli.d.ts.map +1 -0
  54. package/dist/cli.js +276 -0
  55. package/dist/cli.js.map +1 -0
  56. package/dist/client/assets/index-B4r0njGe.js +780 -0
  57. package/dist/client/assets/index-CY_9MyE0.css +1 -0
  58. package/dist/client/favicon.svg +5 -0
  59. package/dist/client/icons/icon-192.svg +5 -0
  60. package/dist/client/icons/icon-512.svg +5 -0
  61. package/dist/client/icons/logo-with-message.png +0 -0
  62. package/dist/client/icons/logo.png +0 -0
  63. package/dist/client/index.html +25 -0
  64. package/dist/client/manifest.json +62 -0
  65. package/dist/client/sw.js +243 -0
  66. package/dist/config/agent-usage.d.ts +34 -0
  67. package/dist/config/agent-usage.d.ts.map +1 -0
  68. package/dist/config/agent-usage.js +87 -0
  69. package/dist/config/agent-usage.js.map +1 -0
  70. package/dist/config/repos.d.ts +34 -0
  71. package/dist/config/repos.d.ts.map +1 -0
  72. package/dist/config/repos.js +412 -0
  73. package/dist/config/repos.js.map +1 -0
  74. package/dist/config/settings.d.ts +634 -0
  75. package/dist/config/settings.d.ts.map +1 -0
  76. package/dist/config/settings.js +459 -0
  77. package/dist/config/settings.js.map +1 -0
  78. package/dist/config/skills.d.ts +18 -0
  79. package/dist/config/skills.d.ts.map +1 -0
  80. package/dist/config/skills.js +174 -0
  81. package/dist/config/skills.js.map +1 -0
  82. package/dist/config/workspaces.d.ts +961 -0
  83. package/dist/config/workspaces.d.ts.map +1 -0
  84. package/dist/config/workspaces.js +482 -0
  85. package/dist/config/workspaces.js.map +1 -0
  86. package/dist/core/app-manager.d.ts +85 -0
  87. package/dist/core/app-manager.d.ts.map +1 -0
  88. package/dist/core/app-manager.js +447 -0
  89. package/dist/core/app-manager.js.map +1 -0
  90. package/dist/core/claude-invoker.d.ts +49 -0
  91. package/dist/core/claude-invoker.d.ts.map +1 -0
  92. package/dist/core/claude-invoker.js +583 -0
  93. package/dist/core/claude-invoker.js.map +1 -0
  94. package/dist/core/claude-session-reader.d.ts +25 -0
  95. package/dist/core/claude-session-reader.d.ts.map +1 -0
  96. package/dist/core/claude-session-reader.js +184 -0
  97. package/dist/core/claude-session-reader.js.map +1 -0
  98. package/dist/core/claude-usage-query.d.ts +78 -0
  99. package/dist/core/claude-usage-query.d.ts.map +1 -0
  100. package/dist/core/claude-usage-query.js +294 -0
  101. package/dist/core/claude-usage-query.js.map +1 -0
  102. package/dist/core/git-credential-helper.d.ts +57 -0
  103. package/dist/core/git-credential-helper.d.ts.map +1 -0
  104. package/dist/core/git-credential-helper.js +176 -0
  105. package/dist/core/git-credential-helper.js.map +1 -0
  106. package/dist/core/git-sandbox.d.ts +135 -0
  107. package/dist/core/git-sandbox.d.ts.map +1 -0
  108. package/dist/core/git-sandbox.js +907 -0
  109. package/dist/core/git-sandbox.js.map +1 -0
  110. package/dist/core/github-integration.d.ts +66 -0
  111. package/dist/core/github-integration.d.ts.map +1 -0
  112. package/dist/core/github-integration.js +350 -0
  113. package/dist/core/github-integration.js.map +1 -0
  114. package/dist/core/github-oauth.d.ts +88 -0
  115. package/dist/core/github-oauth.d.ts.map +1 -0
  116. package/dist/core/github-oauth.js +244 -0
  117. package/dist/core/github-oauth.js.map +1 -0
  118. package/dist/core/gitlab-integration.d.ts +66 -0
  119. package/dist/core/gitlab-integration.d.ts.map +1 -0
  120. package/dist/core/gitlab-integration.js +353 -0
  121. package/dist/core/gitlab-integration.js.map +1 -0
  122. package/dist/core/gitlab-oauth.d.ts +100 -0
  123. package/dist/core/gitlab-oauth.d.ts.map +1 -0
  124. package/dist/core/gitlab-oauth.js +366 -0
  125. package/dist/core/gitlab-oauth.js.map +1 -0
  126. package/dist/core/insights-extractor.d.ts +68 -0
  127. package/dist/core/insights-extractor.d.ts.map +1 -0
  128. package/dist/core/insights-extractor.js +402 -0
  129. package/dist/core/insights-extractor.js.map +1 -0
  130. package/dist/core/logger.d.ts +27 -0
  131. package/dist/core/logger.d.ts.map +1 -0
  132. package/dist/core/logger.js +70 -0
  133. package/dist/core/logger.js.map +1 -0
  134. package/dist/core/process-runner.d.ts +27 -0
  135. package/dist/core/process-runner.d.ts.map +1 -0
  136. package/dist/core/process-runner.js +147 -0
  137. package/dist/core/process-runner.js.map +1 -0
  138. package/dist/core/project-detector.d.ts +30 -0
  139. package/dist/core/project-detector.d.ts.map +1 -0
  140. package/dist/core/project-detector.js +482 -0
  141. package/dist/core/project-detector.js.map +1 -0
  142. package/dist/core/qr-generator.d.ts +18 -0
  143. package/dist/core/qr-generator.d.ts.map +1 -0
  144. package/dist/core/qr-generator.js +61 -0
  145. package/dist/core/qr-generator.js.map +1 -0
  146. package/dist/core/remote-tunnel-manager.d.ts +59 -0
  147. package/dist/core/remote-tunnel-manager.d.ts.map +1 -0
  148. package/dist/core/remote-tunnel-manager.js +235 -0
  149. package/dist/core/remote-tunnel-manager.js.map +1 -0
  150. package/dist/core/shared-docker-manager.d.ts +41 -0
  151. package/dist/core/shared-docker-manager.d.ts.map +1 -0
  152. package/dist/core/shared-docker-manager.js +409 -0
  153. package/dist/core/shared-docker-manager.js.map +1 -0
  154. package/dist/core/skill-executor.d.ts +25 -0
  155. package/dist/core/skill-executor.d.ts.map +1 -0
  156. package/dist/core/skill-executor.js +171 -0
  157. package/dist/core/skill-executor.js.map +1 -0
  158. package/dist/core/terminal-session.d.ts +149 -0
  159. package/dist/core/terminal-session.d.ts.map +1 -0
  160. package/dist/core/terminal-session.js +2340 -0
  161. package/dist/core/terminal-session.js.map +1 -0
  162. package/dist/core/tunnel-manager.d.ts +35 -0
  163. package/dist/core/tunnel-manager.d.ts.map +1 -0
  164. package/dist/core/tunnel-manager.js +137 -0
  165. package/dist/core/tunnel-manager.js.map +1 -0
  166. package/dist/core/usage-manager.d.ts +57 -0
  167. package/dist/core/usage-manager.d.ts.map +1 -0
  168. package/dist/core/usage-manager.js +363 -0
  169. package/dist/core/usage-manager.js.map +1 -0
  170. package/dist/core/ws-manager.d.ts +39 -0
  171. package/dist/core/ws-manager.d.ts.map +1 -0
  172. package/dist/core/ws-manager.js +190 -0
  173. package/dist/core/ws-manager.js.map +1 -0
  174. package/dist/index.d.ts +7 -0
  175. package/dist/index.d.ts.map +1 -0
  176. package/dist/index.js +229 -0
  177. package/dist/index.js.map +1 -0
  178. package/dist/types.d.ts +868 -0
  179. package/dist/types.d.ts.map +1 -0
  180. package/dist/types.js +119 -0
  181. package/dist/types.js.map +1 -0
  182. package/package.json +96 -0
package/dist/index.js ADDED
@@ -0,0 +1,229 @@
1
+ import express from 'express';
2
+ import { createServer } from 'http';
3
+ import { join } from 'path';
4
+ import { existsSync } from 'fs';
5
+ import { apiRouter } from './api/routes.js';
6
+ import { terminalRouter } from './api/terminal-routes.js';
7
+ import { appRouter } from './api/app-routes.js';
8
+ import { authMiddleware, rateLimitMiddleware, errorHandler, getAuthToken } from './api/middleware.js';
9
+ import { sharedDockerManager } from './core/shared-docker-manager.js';
10
+ import { settingsManager } from './config/settings.js';
11
+ import { wsManager } from './core/ws-manager.js';
12
+ import { terminalSessionManager } from './core/terminal-session.js';
13
+ import { tunnelManager } from './core/tunnel-manager.js';
14
+ import { appManager } from './core/app-manager.js';
15
+ import { remoteTunnelManager } from './core/remote-tunnel-manager.js';
16
+ let serverInstance = null;
17
+ /**
18
+ * Clean up orphaned terminal worktrees from deleted sessions on startup
19
+ */
20
+ function cleanupOrphanedTerminalWorktrees() {
21
+ console.log('[Startup] Checking for orphaned terminal worktrees...');
22
+ const cleanedCount = terminalSessionManager.cleanupOrphanedWorktrees();
23
+ if (cleanedCount > 0) {
24
+ console.log(`[Startup] Cleaned up ${cleanedCount} orphaned terminal worktree(s)`);
25
+ }
26
+ }
27
+ export async function startServer(options = {}) {
28
+ const PORT = options.port ?? (process.env.CLAUDEDESK_PORT ? parseInt(process.env.CLAUDEDESK_PORT, 10) : 8787);
29
+ const HOST = options.host ?? (process.env.ALLOW_REMOTE === 'true' ? '0.0.0.0' : '127.0.0.1');
30
+ // SEC-02: Warn when remote access is enabled
31
+ if (HOST === '0.0.0.0') {
32
+ console.warn('');
33
+ console.warn('╔════════════════════════════════════════════════════════════════╗');
34
+ console.warn('║ ⚠️ SECURITY WARNING ⚠️ ║');
35
+ console.warn('╠════════════════════════════════════════════════════════════════╣');
36
+ console.warn('║ ALLOW_REMOTE=true: Server is accessible from your network ║');
37
+ console.warn('║ Anyone on your network can access this instance ║');
38
+ console.warn('║ Only use this in trusted network environments ║');
39
+ console.warn('╚════════════════════════════════════════════════════════════════╝');
40
+ console.warn('');
41
+ }
42
+ // Run terminal worktree cleanup on startup
43
+ cleanupOrphanedTerminalWorktrees();
44
+ const app = express();
45
+ // Middleware
46
+ app.use(express.json());
47
+ app.use(authMiddleware);
48
+ app.use(rateLimitMiddleware);
49
+ // API routes
50
+ app.use('/api', apiRouter);
51
+ app.use('/api/terminal', terminalRouter);
52
+ app.use('/api/apps', appRouter);
53
+ // Static UI files - serve from Vite build
54
+ const staticDir = join(process.cwd(), 'dist', 'client');
55
+ if (existsSync(staticDir)) {
56
+ app.use(express.static(staticDir));
57
+ }
58
+ // SPA fallback - serve index.html for non-API routes
59
+ app.get('*', (req, res) => {
60
+ if (!req.path.startsWith('/api')) {
61
+ const indexPath = join(staticDir, 'index.html');
62
+ if (existsSync(indexPath)) {
63
+ res.sendFile(indexPath);
64
+ }
65
+ else {
66
+ res.status(404).send('UI not built. Run: npm run build:client');
67
+ }
68
+ }
69
+ });
70
+ // Error handler
71
+ app.use(errorHandler);
72
+ // Create HTTP server (needed for WebSocket)
73
+ const server = createServer(app);
74
+ serverInstance = server;
75
+ // Initialize WebSocket server
76
+ const authToken = getAuthToken();
77
+ wsManager.initialize(server, authToken);
78
+ // Initialize terminal session manager (loads saved sessions)
79
+ // This is imported above, which triggers initialization
80
+ // Start server
81
+ server.listen(PORT, HOST, async () => {
82
+ // Auto-start Docker services if enabled
83
+ const dockerSettings = settingsManager.getDocker();
84
+ let dockerStatus = 'Docker: disabled';
85
+ if (dockerSettings.enabled && dockerSettings.autoStart) {
86
+ sharedDockerManager.start()
87
+ .then(() => {
88
+ console.log('[Docker] Auto-started shared Docker services');
89
+ })
90
+ .catch((err) => {
91
+ console.warn('[Docker] Failed to auto-start:', err.message);
92
+ });
93
+ dockerStatus = 'Docker: auto-starting...';
94
+ }
95
+ else if (dockerSettings.enabled) {
96
+ dockerStatus = 'Docker: enabled (manual start)';
97
+ }
98
+ // Auto-start remote tunnel if enabled
99
+ const tunnelSettings = settingsManager.getTunnel();
100
+ let tunnelStatus = 'Tunnel: disabled';
101
+ if (tunnelSettings.enabled && tunnelSettings.autoStart) {
102
+ remoteTunnelManager.start()
103
+ .then((result) => {
104
+ if (result.success) {
105
+ console.log('[Tunnel] Auto-started remote access tunnel:', result.url);
106
+ }
107
+ else {
108
+ console.warn('[Tunnel] Failed to auto-start:', result.error);
109
+ }
110
+ })
111
+ .catch((err) => {
112
+ console.warn('[Tunnel] Failed to auto-start:', err.message);
113
+ });
114
+ tunnelStatus = 'Tunnel: auto-starting...';
115
+ }
116
+ else if (tunnelSettings.enabled) {
117
+ tunnelStatus = 'Tunnel: enabled (manual start)';
118
+ }
119
+ const sessionCount = terminalSessionManager.getAllSessions().length;
120
+ const terminalStatus = sessionCount > 0
121
+ ? `Terminal: ${sessionCount} session(s)`
122
+ : 'Terminal: ready';
123
+ const networkInfo = HOST === '0.0.0.0'
124
+ ? `Network: ${HOST}:${PORT} (remote access enabled)`
125
+ : `Network: localhost only`;
126
+ console.log(`
127
+ ╔═══════════════════════════════════════════════════════════╗
128
+ ║ CLAUDEDESK v2.0.0 ║
129
+ ╠═══════════════════════════════════════════════════════════╣
130
+ ║ Server running at: http://localhost:${PORT} ║
131
+ ║ WebSocket: ws://localhost:${PORT}/ws ║
132
+ ║ ${networkInfo.padEnd(43)}║
133
+ ║ ${terminalStatus.padEnd(43)}║
134
+ ║ ${dockerStatus.padEnd(43)}║
135
+ ║ ${tunnelStatus.padEnd(43)}║
136
+ ╚═══════════════════════════════════════════════════════════╝
137
+ `);
138
+ });
139
+ // REL-03: Comprehensive graceful shutdown to prevent orphaned processes
140
+ let isShuttingDown = false;
141
+ async function gracefulShutdown(signal) {
142
+ if (isShuttingDown) {
143
+ console.log(`[Shutdown] Already shutting down, ignoring ${signal}`);
144
+ return;
145
+ }
146
+ isShuttingDown = true;
147
+ console.log(`\n[Shutdown] Received ${signal}, cleaning up...`);
148
+ try {
149
+ // 1. Close WebSocket connections
150
+ console.log('[Shutdown] Closing WebSocket connections...');
151
+ wsManager.shutdown();
152
+ // 2. Stop all running apps
153
+ console.log('[Shutdown] Stopping running apps...');
154
+ await appManager.stopAllApps();
155
+ // 3. Stop all job tunnels (cloudflared processes)
156
+ console.log('[Shutdown] Stopping tunnels...');
157
+ await tunnelManager.stopAllTunnels();
158
+ // 4. Clean up terminal sessions (kills Claude processes)
159
+ console.log('[Shutdown] Cleaning up terminal sessions...');
160
+ const sessions = terminalSessionManager.getAllSessions();
161
+ for (const session of sessions) {
162
+ try {
163
+ await terminalSessionManager.deleteSession(session.id);
164
+ }
165
+ catch (err) {
166
+ console.warn(`[Shutdown] Failed to clean up session ${session.id}:`, err);
167
+ }
168
+ }
169
+ // 5. Stop Docker services if they were auto-started
170
+ const dockerSettings = settingsManager.getDocker();
171
+ if (dockerSettings.enabled && dockerSettings.autoStart) {
172
+ console.log('[Shutdown] Stopping Docker services...');
173
+ try {
174
+ await sharedDockerManager.stop();
175
+ }
176
+ catch (err) {
177
+ console.warn('[Shutdown] Failed to stop Docker:', err);
178
+ }
179
+ }
180
+ // 6. Stop remote tunnel
181
+ console.log('[Shutdown] Stopping remote tunnel...');
182
+ try {
183
+ await remoteTunnelManager.shutdown();
184
+ }
185
+ catch (err) {
186
+ console.warn('[Shutdown] Failed to stop tunnel:', err);
187
+ }
188
+ // 7. Close HTTP server
189
+ console.log('[Shutdown] Closing HTTP server...');
190
+ server.close();
191
+ console.log('[Shutdown] Cleanup complete');
192
+ }
193
+ catch (err) {
194
+ console.error('[Shutdown] Error during cleanup:', err);
195
+ }
196
+ process.exit(0);
197
+ }
198
+ process.on('SIGINT', () => gracefulShutdown('SIGINT'));
199
+ process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
200
+ // Handle uncaught errors to prevent zombie processes
201
+ process.on('uncaughtException', (err) => {
202
+ console.error('[Fatal] Uncaught exception:', err);
203
+ gracefulShutdown('uncaughtException').catch(() => process.exit(1));
204
+ });
205
+ process.on('unhandledRejection', (reason) => {
206
+ console.error('[Fatal] Unhandled rejection:', reason);
207
+ gracefulShutdown('unhandledRejection').catch(() => process.exit(1));
208
+ });
209
+ }
210
+ // Backward compatibility: if this file is run directly, start the server
211
+ // Cross-platform: Windows paths need file:/// prefix, Unix paths get it from the leading /
212
+ const isDirectRun = (() => {
213
+ const scriptPath = process.argv[1]?.replace(/\\/g, '/');
214
+ if (!scriptPath)
215
+ return false;
216
+ // Windows: C:/path needs file:///C:/path (3 slashes)
217
+ // Unix: /path with file:// becomes file:///path (the / in path adds the 3rd slash)
218
+ const fileUrl = /^[a-zA-Z]:/.test(scriptPath)
219
+ ? `file:///${scriptPath}`
220
+ : `file://${scriptPath}`;
221
+ return import.meta.url === fileUrl;
222
+ })();
223
+ if (isDirectRun) {
224
+ startServer().catch((err) => {
225
+ console.error('[Fatal] Failed to start server:', err);
226
+ process.exit(1);
227
+ });
228
+ }
229
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}