@cloudcli-ai/cloudcli 1.29.2 → 1.29.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 (140) hide show
  1. package/dist/assets/{index-ByHZ8-LL.css → index-BBAE1OJ_.css} +1 -1
  2. package/dist/assets/{index-Ile1bTCU.js → index-Cyya3LhN.js} +229 -229
  3. package/dist/index.html +2 -2
  4. package/dist-server/server/claude-sdk.js +702 -0
  5. package/dist-server/server/claude-sdk.js.map +1 -0
  6. package/dist-server/server/cli.js +642 -0
  7. package/dist-server/server/cli.js.map +1 -0
  8. package/dist-server/server/constants/config.js +6 -0
  9. package/dist-server/server/constants/config.js.map +1 -0
  10. package/dist-server/server/cursor-cli.js +277 -0
  11. package/dist-server/server/cursor-cli.js.map +1 -0
  12. package/dist-server/server/database/db.js +535 -0
  13. package/dist-server/server/database/db.js.map +1 -0
  14. package/dist-server/server/database/schema.js +97 -0
  15. package/dist-server/server/database/schema.js.map +1 -0
  16. package/dist-server/server/gemini-cli.js +408 -0
  17. package/dist-server/server/gemini-cli.js.map +1 -0
  18. package/dist-server/server/gemini-response-handler.js +72 -0
  19. package/dist-server/server/gemini-response-handler.js.map +1 -0
  20. package/dist-server/server/index.js +2175 -0
  21. package/dist-server/server/index.js.map +1 -0
  22. package/dist-server/server/load-env.js +32 -0
  23. package/dist-server/server/load-env.js.map +1 -0
  24. package/dist-server/server/middleware/auth.js +111 -0
  25. package/dist-server/server/middleware/auth.js.map +1 -0
  26. package/dist-server/server/openai-codex.js +373 -0
  27. package/dist-server/server/openai-codex.js.map +1 -0
  28. package/dist-server/server/projects.js +2325 -0
  29. package/dist-server/server/projects.js.map +1 -0
  30. package/dist-server/server/providers/claude/adapter.js +266 -0
  31. package/dist-server/server/providers/claude/adapter.js.map +1 -0
  32. package/dist-server/server/providers/claude/status.js +121 -0
  33. package/dist-server/server/providers/claude/status.js.map +1 -0
  34. package/dist-server/server/providers/codex/adapter.js +232 -0
  35. package/dist-server/server/providers/codex/adapter.js.map +1 -0
  36. package/dist-server/server/providers/codex/status.js +70 -0
  37. package/dist-server/server/providers/codex/status.js.map +1 -0
  38. package/dist-server/server/providers/cursor/adapter.js +342 -0
  39. package/dist-server/server/providers/cursor/adapter.js.map +1 -0
  40. package/dist-server/server/providers/cursor/status.js +118 -0
  41. package/dist-server/server/providers/cursor/status.js.map +1 -0
  42. package/dist-server/server/providers/gemini/adapter.js +174 -0
  43. package/dist-server/server/providers/gemini/adapter.js.map +1 -0
  44. package/dist-server/server/providers/gemini/status.js +104 -0
  45. package/dist-server/server/providers/gemini/status.js.map +1 -0
  46. package/dist-server/server/providers/registry.js +58 -0
  47. package/dist-server/server/providers/registry.js.map +1 -0
  48. package/dist-server/server/providers/types.js +117 -0
  49. package/dist-server/server/providers/types.js.map +1 -0
  50. package/dist-server/server/providers/utils.js +28 -0
  51. package/dist-server/server/providers/utils.js.map +1 -0
  52. package/dist-server/server/routes/agent.js +1147 -0
  53. package/dist-server/server/routes/agent.js.map +1 -0
  54. package/dist-server/server/routes/auth.js +117 -0
  55. package/dist-server/server/routes/auth.js.map +1 -0
  56. package/dist-server/server/routes/cli-auth.js +25 -0
  57. package/dist-server/server/routes/cli-auth.js.map +1 -0
  58. package/dist-server/server/routes/codex.js +294 -0
  59. package/dist-server/server/routes/codex.js.map +1 -0
  60. package/dist-server/server/routes/commands.js +531 -0
  61. package/dist-server/server/routes/commands.js.map +1 -0
  62. package/dist-server/server/routes/cursor.js +529 -0
  63. package/dist-server/server/routes/cursor.js.map +1 -0
  64. package/dist-server/server/routes/gemini.js +21 -0
  65. package/dist-server/server/routes/gemini.js.map +1 -0
  66. package/dist-server/server/routes/git.js +1259 -0
  67. package/dist-server/server/routes/git.js.map +1 -0
  68. package/dist-server/server/routes/mcp-utils.js +46 -0
  69. package/dist-server/server/routes/mcp-utils.js.map +1 -0
  70. package/dist-server/server/routes/mcp.js +480 -0
  71. package/dist-server/server/routes/mcp.js.map +1 -0
  72. package/dist-server/server/routes/messages.js +56 -0
  73. package/dist-server/server/routes/messages.js.map +1 -0
  74. package/dist-server/server/routes/plugins.js +266 -0
  75. package/dist-server/server/routes/plugins.js.map +1 -0
  76. package/dist-server/server/routes/projects.js +505 -0
  77. package/dist-server/server/routes/projects.js.map +1 -0
  78. package/dist-server/server/routes/settings.js +249 -0
  79. package/dist-server/server/routes/settings.js.map +1 -0
  80. package/dist-server/server/routes/taskmaster.js +1832 -0
  81. package/dist-server/server/routes/taskmaster.js.map +1 -0
  82. package/dist-server/server/routes/user.js +115 -0
  83. package/dist-server/server/routes/user.js.map +1 -0
  84. package/dist-server/server/services/notification-orchestrator.js +177 -0
  85. package/dist-server/server/services/notification-orchestrator.js.map +1 -0
  86. package/dist-server/server/services/vapid-keys.js +26 -0
  87. package/dist-server/server/services/vapid-keys.js.map +1 -0
  88. package/dist-server/server/sessionManager.js +194 -0
  89. package/dist-server/server/sessionManager.js.map +1 -0
  90. package/dist-server/server/utils/colors.js +20 -0
  91. package/dist-server/server/utils/colors.js.map +1 -0
  92. package/dist-server/server/utils/commandParser.js +255 -0
  93. package/dist-server/server/utils/commandParser.js.map +1 -0
  94. package/dist-server/server/utils/frontmatter.js +16 -0
  95. package/dist-server/server/utils/frontmatter.js.map +1 -0
  96. package/dist-server/server/utils/gitConfig.js +36 -0
  97. package/dist-server/server/utils/gitConfig.js.map +1 -0
  98. package/dist-server/server/utils/mcp-detector.js +183 -0
  99. package/dist-server/server/utils/mcp-detector.js.map +1 -0
  100. package/dist-server/server/utils/plugin-loader.js +413 -0
  101. package/dist-server/server/utils/plugin-loader.js.map +1 -0
  102. package/dist-server/server/utils/plugin-process-manager.js +163 -0
  103. package/dist-server/server/utils/plugin-process-manager.js.map +1 -0
  104. package/dist-server/server/utils/runtime-paths.js +30 -0
  105. package/dist-server/server/utils/runtime-paths.js.map +1 -0
  106. package/dist-server/server/utils/taskmaster-websocket.js +118 -0
  107. package/dist-server/server/utils/taskmaster-websocket.js.map +1 -0
  108. package/dist-server/server/utils/url-detection.js +58 -0
  109. package/dist-server/server/utils/url-detection.js.map +1 -0
  110. package/dist-server/shared/modelConstants.js +87 -0
  111. package/dist-server/shared/modelConstants.js.map +1 -0
  112. package/dist-server/shared/networkHosts.js +20 -0
  113. package/dist-server/shared/networkHosts.js.map +1 -0
  114. package/package.json +23 -14
  115. package/server/claude-sdk.js +13 -4
  116. package/server/cli.js +13 -9
  117. package/server/cursor-cli.js +8 -1
  118. package/server/database/db.js +24 -61
  119. package/server/database/schema.js +102 -0
  120. package/server/gemini-cli.js +17 -1
  121. package/server/index.js +20 -96
  122. package/server/load-env.js +11 -6
  123. package/server/openai-codex.js +9 -1
  124. package/server/projects.js +38 -44
  125. package/server/providers/claude/status.js +136 -0
  126. package/server/providers/codex/status.js +78 -0
  127. package/server/providers/cursor/adapter.js +5 -10
  128. package/server/providers/cursor/status.js +128 -0
  129. package/server/providers/gemini/status.js +111 -0
  130. package/server/providers/registry.js +25 -2
  131. package/server/providers/types.js +13 -0
  132. package/server/routes/cli-auth.js +14 -421
  133. package/server/routes/commands.js +6 -4
  134. package/server/routes/cursor.js +6 -240
  135. package/server/tsconfig.json +33 -0
  136. package/server/utils/colors.js +21 -0
  137. package/server/utils/runtime-paths.js +37 -0
  138. package/server/utils/url-detection.js +71 -0
  139. package/shared/modelConstants.js +4 -2
  140. package/server/database/init.sql +0 -99
@@ -0,0 +1,531 @@
1
+ import express from 'express';
2
+ import { promises as fs } from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { CLAUDE_MODELS, CURSOR_MODELS, CODEX_MODELS } from '../../shared/modelConstants.js';
6
+ import { parseFrontmatter } from '../utils/frontmatter.js';
7
+ import { findAppRoot, getModuleDir } from '../utils/runtime-paths.js';
8
+ const __dirname = getModuleDir(import.meta.url);
9
+ // This route reads the top-level package.json for the status command, so it needs the real
10
+ // app root even after compilation moves the route file under dist-server/server/routes.
11
+ const APP_ROOT = findAppRoot(__dirname);
12
+ const router = express.Router();
13
+ /**
14
+ * Recursively scan directory for command files (.md)
15
+ * @param {string} dir - Directory to scan
16
+ * @param {string} baseDir - Base directory for relative paths
17
+ * @param {string} namespace - Namespace for commands (e.g., 'project', 'user')
18
+ * @returns {Promise<Array>} Array of command objects
19
+ */
20
+ async function scanCommandsDirectory(dir, baseDir, namespace) {
21
+ const commands = [];
22
+ try {
23
+ // Check if directory exists
24
+ await fs.access(dir);
25
+ const entries = await fs.readdir(dir, { withFileTypes: true });
26
+ for (const entry of entries) {
27
+ const fullPath = path.join(dir, entry.name);
28
+ if (entry.isDirectory()) {
29
+ // Recursively scan subdirectories
30
+ const subCommands = await scanCommandsDirectory(fullPath, baseDir, namespace);
31
+ commands.push(...subCommands);
32
+ }
33
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
34
+ // Parse markdown file for metadata
35
+ try {
36
+ const content = await fs.readFile(fullPath, 'utf8');
37
+ const { data: frontmatter, content: commandContent } = parseFrontmatter(content);
38
+ // Calculate relative path from baseDir for command name
39
+ const relativePath = path.relative(baseDir, fullPath);
40
+ // Remove .md extension and convert to command name
41
+ const commandName = '/' + relativePath.replace(/\.md$/, '').replace(/\\/g, '/');
42
+ // Extract description from frontmatter or first line of content
43
+ let description = frontmatter.description || '';
44
+ if (!description) {
45
+ const firstLine = commandContent.trim().split('\n')[0];
46
+ description = firstLine.replace(/^#+\s*/, '').trim();
47
+ }
48
+ commands.push({
49
+ name: commandName,
50
+ path: fullPath,
51
+ relativePath,
52
+ description,
53
+ namespace,
54
+ metadata: frontmatter
55
+ });
56
+ }
57
+ catch (err) {
58
+ console.error(`Error parsing command file ${fullPath}:`, err.message);
59
+ }
60
+ }
61
+ }
62
+ }
63
+ catch (err) {
64
+ // Directory doesn't exist or can't be accessed - this is okay
65
+ if (err.code !== 'ENOENT' && err.code !== 'EACCES') {
66
+ console.error(`Error scanning directory ${dir}:`, err.message);
67
+ }
68
+ }
69
+ return commands;
70
+ }
71
+ /**
72
+ * Built-in commands that are always available
73
+ */
74
+ const builtInCommands = [
75
+ {
76
+ name: '/help',
77
+ description: 'Show help documentation for Claude Code',
78
+ namespace: 'builtin',
79
+ metadata: { type: 'builtin' }
80
+ },
81
+ {
82
+ name: '/clear',
83
+ description: 'Clear the conversation history',
84
+ namespace: 'builtin',
85
+ metadata: { type: 'builtin' }
86
+ },
87
+ {
88
+ name: '/model',
89
+ description: 'Switch or view the current AI model',
90
+ namespace: 'builtin',
91
+ metadata: { type: 'builtin' }
92
+ },
93
+ {
94
+ name: '/cost',
95
+ description: 'Display token usage and cost information',
96
+ namespace: 'builtin',
97
+ metadata: { type: 'builtin' }
98
+ },
99
+ {
100
+ name: '/memory',
101
+ description: 'Open CLAUDE.md memory file for editing',
102
+ namespace: 'builtin',
103
+ metadata: { type: 'builtin' }
104
+ },
105
+ {
106
+ name: '/config',
107
+ description: 'Open settings and configuration',
108
+ namespace: 'builtin',
109
+ metadata: { type: 'builtin' }
110
+ },
111
+ {
112
+ name: '/status',
113
+ description: 'Show system status and version information',
114
+ namespace: 'builtin',
115
+ metadata: { type: 'builtin' }
116
+ },
117
+ {
118
+ name: '/rewind',
119
+ description: 'Rewind the conversation to a previous state',
120
+ namespace: 'builtin',
121
+ metadata: { type: 'builtin' }
122
+ }
123
+ ];
124
+ /**
125
+ * Built-in command handlers
126
+ * Each handler returns { type: 'builtin', action: string, data: any }
127
+ */
128
+ const builtInHandlers = {
129
+ '/help': async (args, context) => {
130
+ const helpText = `# Claude Code Commands
131
+
132
+ ## Built-in Commands
133
+
134
+ ${builtInCommands.map(cmd => `### ${cmd.name}
135
+ ${cmd.description}
136
+ `).join('\n')}
137
+
138
+ ## Custom Commands
139
+
140
+ Custom commands can be created in:
141
+ - Project: \`.claude/commands/\` (project-specific)
142
+ - User: \`~/.claude/commands/\` (available in all projects)
143
+
144
+ ### Command Syntax
145
+
146
+ - **Arguments**: Use \`$ARGUMENTS\` for all args or \`$1\`, \`$2\`, etc. for positional
147
+ - **File Includes**: Use \`@filename\` to include file contents
148
+ - **Bash Commands**: Use \`!command\` to execute bash commands
149
+
150
+ ### Examples
151
+
152
+ \`\`\`markdown
153
+ /mycommand arg1 arg2
154
+ \`\`\`
155
+ `;
156
+ return {
157
+ type: 'builtin',
158
+ action: 'help',
159
+ data: {
160
+ content: helpText,
161
+ format: 'markdown'
162
+ }
163
+ };
164
+ },
165
+ '/clear': async (args, context) => {
166
+ return {
167
+ type: 'builtin',
168
+ action: 'clear',
169
+ data: {
170
+ message: 'Conversation history cleared'
171
+ }
172
+ };
173
+ },
174
+ '/model': async (args, context) => {
175
+ // Read available models from centralized constants
176
+ const availableModels = {
177
+ claude: CLAUDE_MODELS.OPTIONS.map(o => o.value),
178
+ cursor: CURSOR_MODELS.OPTIONS.map(o => o.value),
179
+ codex: CODEX_MODELS.OPTIONS.map(o => o.value)
180
+ };
181
+ const currentProvider = context?.provider || 'claude';
182
+ const currentModel = context?.model || CLAUDE_MODELS.DEFAULT;
183
+ return {
184
+ type: 'builtin',
185
+ action: 'model',
186
+ data: {
187
+ current: {
188
+ provider: currentProvider,
189
+ model: currentModel
190
+ },
191
+ available: availableModels,
192
+ message: args.length > 0
193
+ ? `Switching to model: ${args[0]}`
194
+ : `Current model: ${currentModel}`
195
+ }
196
+ };
197
+ },
198
+ '/cost': async (args, context) => {
199
+ const tokenUsage = context?.tokenUsage || {};
200
+ const provider = context?.provider || 'claude';
201
+ const model = context?.model ||
202
+ (provider === 'cursor'
203
+ ? CURSOR_MODELS.DEFAULT
204
+ : provider === 'codex'
205
+ ? CODEX_MODELS.DEFAULT
206
+ : CLAUDE_MODELS.DEFAULT);
207
+ const used = Number(tokenUsage.used ?? tokenUsage.totalUsed ?? tokenUsage.total_tokens ?? 0) || 0;
208
+ const total = Number(tokenUsage.total ??
209
+ tokenUsage.contextWindow ??
210
+ parseInt(process.env.CONTEXT_WINDOW || '160000', 10)) || 160000;
211
+ const percentage = total > 0 ? Number(((used / total) * 100).toFixed(1)) : 0;
212
+ const inputTokensRaw = Number(tokenUsage.inputTokens ??
213
+ tokenUsage.input ??
214
+ tokenUsage.cumulativeInputTokens ??
215
+ tokenUsage.promptTokens ??
216
+ 0) || 0;
217
+ const outputTokens = Number(tokenUsage.outputTokens ??
218
+ tokenUsage.output ??
219
+ tokenUsage.cumulativeOutputTokens ??
220
+ tokenUsage.completionTokens ??
221
+ 0) || 0;
222
+ const cacheTokens = Number(tokenUsage.cacheReadTokens ??
223
+ tokenUsage.cacheCreationTokens ??
224
+ tokenUsage.cacheTokens ??
225
+ tokenUsage.cachedTokens ??
226
+ 0) || 0;
227
+ // If we only have total used tokens, treat them as input for display/estimation.
228
+ const inputTokens = inputTokensRaw > 0 || outputTokens > 0 || cacheTokens > 0 ? inputTokensRaw + cacheTokens : used;
229
+ // Rough default rates by provider (USD / 1M tokens).
230
+ const pricingByProvider = {
231
+ claude: { input: 3, output: 15 },
232
+ cursor: { input: 3, output: 15 },
233
+ codex: { input: 1.5, output: 6 },
234
+ };
235
+ const rates = pricingByProvider[provider] || pricingByProvider.claude;
236
+ const inputCost = (inputTokens / 1_000_000) * rates.input;
237
+ const outputCost = (outputTokens / 1_000_000) * rates.output;
238
+ const totalCost = inputCost + outputCost;
239
+ return {
240
+ type: 'builtin',
241
+ action: 'cost',
242
+ data: {
243
+ tokenUsage: {
244
+ used,
245
+ total,
246
+ percentage,
247
+ },
248
+ cost: {
249
+ input: inputCost.toFixed(4),
250
+ output: outputCost.toFixed(4),
251
+ total: totalCost.toFixed(4),
252
+ },
253
+ model,
254
+ },
255
+ };
256
+ },
257
+ '/status': async (args, context) => {
258
+ // Read version from package.json
259
+ const packageJsonPath = path.join(APP_ROOT, 'package.json');
260
+ let version = 'unknown';
261
+ let packageName = 'claude-code-ui';
262
+ try {
263
+ const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'));
264
+ version = packageJson.version;
265
+ packageName = packageJson.name;
266
+ }
267
+ catch (err) {
268
+ console.error('Error reading package.json:', err);
269
+ }
270
+ const uptime = process.uptime();
271
+ const uptimeMinutes = Math.floor(uptime / 60);
272
+ const uptimeHours = Math.floor(uptimeMinutes / 60);
273
+ const uptimeFormatted = uptimeHours > 0
274
+ ? `${uptimeHours}h ${uptimeMinutes % 60}m`
275
+ : `${uptimeMinutes}m`;
276
+ return {
277
+ type: 'builtin',
278
+ action: 'status',
279
+ data: {
280
+ version,
281
+ packageName,
282
+ uptime: uptimeFormatted,
283
+ uptimeSeconds: Math.floor(uptime),
284
+ model: context?.model || 'claude-sonnet-4.5',
285
+ provider: context?.provider || 'claude',
286
+ nodeVersion: process.version,
287
+ platform: process.platform
288
+ }
289
+ };
290
+ },
291
+ '/memory': async (args, context) => {
292
+ const projectPath = context?.projectPath;
293
+ if (!projectPath) {
294
+ return {
295
+ type: 'builtin',
296
+ action: 'memory',
297
+ data: {
298
+ error: 'No project selected',
299
+ message: 'Please select a project to access its CLAUDE.md file'
300
+ }
301
+ };
302
+ }
303
+ const claudeMdPath = path.join(projectPath, 'CLAUDE.md');
304
+ // Check if CLAUDE.md exists
305
+ let exists = false;
306
+ try {
307
+ await fs.access(claudeMdPath);
308
+ exists = true;
309
+ }
310
+ catch (err) {
311
+ // File doesn't exist
312
+ }
313
+ return {
314
+ type: 'builtin',
315
+ action: 'memory',
316
+ data: {
317
+ path: claudeMdPath,
318
+ exists,
319
+ message: exists
320
+ ? `Opening CLAUDE.md at ${claudeMdPath}`
321
+ : `CLAUDE.md not found at ${claudeMdPath}. Create it to store project-specific instructions.`
322
+ }
323
+ };
324
+ },
325
+ '/config': async (args, context) => {
326
+ return {
327
+ type: 'builtin',
328
+ action: 'config',
329
+ data: {
330
+ message: 'Opening settings...'
331
+ }
332
+ };
333
+ },
334
+ '/rewind': async (args, context) => {
335
+ const steps = args[0] ? parseInt(args[0]) : 1;
336
+ if (isNaN(steps) || steps < 1) {
337
+ return {
338
+ type: 'builtin',
339
+ action: 'rewind',
340
+ data: {
341
+ error: 'Invalid steps parameter',
342
+ message: 'Usage: /rewind [number] - Rewind conversation by N steps (default: 1)'
343
+ }
344
+ };
345
+ }
346
+ return {
347
+ type: 'builtin',
348
+ action: 'rewind',
349
+ data: {
350
+ steps,
351
+ message: `Rewinding conversation by ${steps} step${steps > 1 ? 's' : ''}...`
352
+ }
353
+ };
354
+ }
355
+ };
356
+ /**
357
+ * POST /api/commands/list
358
+ * List all available commands from project and user directories
359
+ */
360
+ router.post('/list', async (req, res) => {
361
+ try {
362
+ const { projectPath } = req.body;
363
+ const allCommands = [...builtInCommands];
364
+ // Scan project-level commands (.claude/commands/)
365
+ if (projectPath) {
366
+ const projectCommandsDir = path.join(projectPath, '.claude', 'commands');
367
+ const projectCommands = await scanCommandsDirectory(projectCommandsDir, projectCommandsDir, 'project');
368
+ allCommands.push(...projectCommands);
369
+ }
370
+ // Scan user-level commands (~/.claude/commands/)
371
+ const homeDir = os.homedir();
372
+ const userCommandsDir = path.join(homeDir, '.claude', 'commands');
373
+ const userCommands = await scanCommandsDirectory(userCommandsDir, userCommandsDir, 'user');
374
+ allCommands.push(...userCommands);
375
+ // Separate built-in and custom commands
376
+ const customCommands = allCommands.filter(cmd => cmd.namespace !== 'builtin');
377
+ // Sort commands alphabetically by name
378
+ customCommands.sort((a, b) => a.name.localeCompare(b.name));
379
+ res.json({
380
+ builtIn: builtInCommands,
381
+ custom: customCommands,
382
+ count: allCommands.length
383
+ });
384
+ }
385
+ catch (error) {
386
+ console.error('Error listing commands:', error);
387
+ res.status(500).json({
388
+ error: 'Failed to list commands',
389
+ message: error.message
390
+ });
391
+ }
392
+ });
393
+ /**
394
+ * POST /api/commands/load
395
+ * Load a specific command file and return its content and metadata
396
+ */
397
+ router.post('/load', async (req, res) => {
398
+ try {
399
+ const { commandPath } = req.body;
400
+ if (!commandPath) {
401
+ return res.status(400).json({
402
+ error: 'Command path is required'
403
+ });
404
+ }
405
+ // Security: Prevent path traversal
406
+ const resolvedPath = path.resolve(commandPath);
407
+ if (!resolvedPath.startsWith(path.resolve(os.homedir())) &&
408
+ !resolvedPath.includes('.claude/commands')) {
409
+ return res.status(403).json({
410
+ error: 'Access denied',
411
+ message: 'Command must be in .claude/commands directory'
412
+ });
413
+ }
414
+ // Read and parse the command file
415
+ const content = await fs.readFile(commandPath, 'utf8');
416
+ const { data: metadata, content: commandContent } = parseFrontmatter(content);
417
+ res.json({
418
+ path: commandPath,
419
+ metadata,
420
+ content: commandContent
421
+ });
422
+ }
423
+ catch (error) {
424
+ if (error.code === 'ENOENT') {
425
+ return res.status(404).json({
426
+ error: 'Command not found',
427
+ message: `Command file not found: ${req.body.commandPath}`
428
+ });
429
+ }
430
+ console.error('Error loading command:', error);
431
+ res.status(500).json({
432
+ error: 'Failed to load command',
433
+ message: error.message
434
+ });
435
+ }
436
+ });
437
+ /**
438
+ * POST /api/commands/execute
439
+ * Execute a command with argument replacement
440
+ * This endpoint prepares the command content but doesn't execute bash commands yet
441
+ * (that will be handled in the command parser utility)
442
+ */
443
+ router.post('/execute', async (req, res) => {
444
+ try {
445
+ const { commandName, commandPath, args = [], context = {} } = req.body;
446
+ if (!commandName) {
447
+ return res.status(400).json({
448
+ error: 'Command name is required'
449
+ });
450
+ }
451
+ // Handle built-in commands
452
+ const handler = builtInHandlers[commandName];
453
+ if (handler) {
454
+ try {
455
+ const result = await handler(args, context);
456
+ return res.json({
457
+ ...result,
458
+ command: commandName
459
+ });
460
+ }
461
+ catch (error) {
462
+ console.error(`Error executing built-in command ${commandName}:`, error);
463
+ return res.status(500).json({
464
+ error: 'Command execution failed',
465
+ message: error.message,
466
+ command: commandName
467
+ });
468
+ }
469
+ }
470
+ // Handle custom commands
471
+ if (!commandPath) {
472
+ return res.status(400).json({
473
+ error: 'Command path is required for custom commands'
474
+ });
475
+ }
476
+ // Load command content
477
+ // Security: validate commandPath is within allowed directories
478
+ {
479
+ const resolvedPath = path.resolve(commandPath);
480
+ const userBase = path.resolve(path.join(os.homedir(), '.claude', 'commands'));
481
+ const projectBase = context?.projectPath
482
+ ? path.resolve(path.join(context.projectPath, '.claude', 'commands'))
483
+ : null;
484
+ const isUnder = (base) => {
485
+ const rel = path.relative(base, resolvedPath);
486
+ return rel !== '' && !rel.startsWith('..') && !path.isAbsolute(rel);
487
+ };
488
+ if (!(isUnder(userBase) || (projectBase && isUnder(projectBase)))) {
489
+ return res.status(403).json({
490
+ error: 'Access denied',
491
+ message: 'Command must be in .claude/commands directory'
492
+ });
493
+ }
494
+ }
495
+ const content = await fs.readFile(commandPath, 'utf8');
496
+ const { data: metadata, content: commandContent } = parseFrontmatter(content);
497
+ // Basic argument replacement (will be enhanced in command parser utility)
498
+ let processedContent = commandContent;
499
+ // Replace $ARGUMENTS with all arguments joined
500
+ const argsString = args.join(' ');
501
+ processedContent = processedContent.replace(/\$ARGUMENTS/g, argsString);
502
+ // Replace $1, $2, etc. with positional arguments
503
+ args.forEach((arg, index) => {
504
+ const placeholder = `$${index + 1}`;
505
+ processedContent = processedContent.replace(new RegExp(`\\${placeholder}\\b`, 'g'), arg);
506
+ });
507
+ res.json({
508
+ type: 'custom',
509
+ command: commandName,
510
+ content: processedContent,
511
+ metadata,
512
+ hasFileIncludes: processedContent.includes('@'),
513
+ hasBashCommands: processedContent.includes('!')
514
+ });
515
+ }
516
+ catch (error) {
517
+ if (error.code === 'ENOENT') {
518
+ return res.status(404).json({
519
+ error: 'Command not found',
520
+ message: `Command file not found: ${req.body.commandPath}`
521
+ });
522
+ }
523
+ console.error('Error executing command:', error);
524
+ res.status(500).json({
525
+ error: 'Failed to execute command',
526
+ message: error.message
527
+ });
528
+ }
529
+ });
530
+ export default router;
531
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../server/routes/commands.js"],"names":[],"mappings":"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"}