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.
- package/LICENSE +21 -0
- package/README.md +431 -0
- package/config/repos.example.json +128 -0
- package/config/settings.example.json +64 -0
- package/config/skills/code-review.md +76 -0
- package/config/skills/full-check.md +26 -0
- package/config/skills/lint-fix.md +23 -0
- package/dist/api/agent-routes.d.ts +2 -0
- package/dist/api/agent-routes.d.ts.map +1 -0
- package/dist/api/agent-routes.js +251 -0
- package/dist/api/agent-routes.js.map +1 -0
- package/dist/api/app-routes.d.ts +2 -0
- package/dist/api/app-routes.d.ts.map +1 -0
- package/dist/api/app-routes.js +150 -0
- package/dist/api/app-routes.js.map +1 -0
- package/dist/api/docker-routes.d.ts +2 -0
- package/dist/api/docker-routes.d.ts.map +1 -0
- package/dist/api/docker-routes.js +167 -0
- package/dist/api/docker-routes.js.map +1 -0
- package/dist/api/middleware.d.ts +6 -0
- package/dist/api/middleware.d.ts.map +1 -0
- package/dist/api/middleware.js +293 -0
- package/dist/api/middleware.js.map +1 -0
- package/dist/api/pin-auth.d.ts +65 -0
- package/dist/api/pin-auth.d.ts.map +1 -0
- package/dist/api/pin-auth.js +218 -0
- package/dist/api/pin-auth.js.map +1 -0
- package/dist/api/routes.d.ts +2 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +473 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/api/settings-routes.d.ts +2 -0
- package/dist/api/settings-routes.d.ts.map +1 -0
- package/dist/api/settings-routes.js +570 -0
- package/dist/api/settings-routes.js.map +1 -0
- package/dist/api/skill-routes.d.ts +2 -0
- package/dist/api/skill-routes.d.ts.map +1 -0
- package/dist/api/skill-routes.js +88 -0
- package/dist/api/skill-routes.js.map +1 -0
- package/dist/api/terminal-routes.d.ts +2 -0
- package/dist/api/terminal-routes.d.ts.map +1 -0
- package/dist/api/terminal-routes.js +3524 -0
- package/dist/api/terminal-routes.js.map +1 -0
- package/dist/api/tunnel-routes.d.ts +2 -0
- package/dist/api/tunnel-routes.d.ts.map +1 -0
- package/dist/api/tunnel-routes.js +196 -0
- package/dist/api/tunnel-routes.js.map +1 -0
- package/dist/api/workspace-routes.d.ts +3 -0
- package/dist/api/workspace-routes.d.ts.map +1 -0
- package/dist/api/workspace-routes.js +649 -0
- package/dist/api/workspace-routes.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +276 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/assets/index-B4r0njGe.js +780 -0
- package/dist/client/assets/index-CY_9MyE0.css +1 -0
- package/dist/client/favicon.svg +5 -0
- package/dist/client/icons/icon-192.svg +5 -0
- package/dist/client/icons/icon-512.svg +5 -0
- package/dist/client/icons/logo-with-message.png +0 -0
- package/dist/client/icons/logo.png +0 -0
- package/dist/client/index.html +25 -0
- package/dist/client/manifest.json +62 -0
- package/dist/client/sw.js +243 -0
- package/dist/config/agent-usage.d.ts +34 -0
- package/dist/config/agent-usage.d.ts.map +1 -0
- package/dist/config/agent-usage.js +87 -0
- package/dist/config/agent-usage.js.map +1 -0
- package/dist/config/repos.d.ts +34 -0
- package/dist/config/repos.d.ts.map +1 -0
- package/dist/config/repos.js +412 -0
- package/dist/config/repos.js.map +1 -0
- package/dist/config/settings.d.ts +634 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +459 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/config/skills.d.ts +18 -0
- package/dist/config/skills.d.ts.map +1 -0
- package/dist/config/skills.js +174 -0
- package/dist/config/skills.js.map +1 -0
- package/dist/config/workspaces.d.ts +961 -0
- package/dist/config/workspaces.d.ts.map +1 -0
- package/dist/config/workspaces.js +482 -0
- package/dist/config/workspaces.js.map +1 -0
- package/dist/core/app-manager.d.ts +85 -0
- package/dist/core/app-manager.d.ts.map +1 -0
- package/dist/core/app-manager.js +447 -0
- package/dist/core/app-manager.js.map +1 -0
- package/dist/core/claude-invoker.d.ts +49 -0
- package/dist/core/claude-invoker.d.ts.map +1 -0
- package/dist/core/claude-invoker.js +583 -0
- package/dist/core/claude-invoker.js.map +1 -0
- package/dist/core/claude-session-reader.d.ts +25 -0
- package/dist/core/claude-session-reader.d.ts.map +1 -0
- package/dist/core/claude-session-reader.js +184 -0
- package/dist/core/claude-session-reader.js.map +1 -0
- package/dist/core/claude-usage-query.d.ts +78 -0
- package/dist/core/claude-usage-query.d.ts.map +1 -0
- package/dist/core/claude-usage-query.js +294 -0
- package/dist/core/claude-usage-query.js.map +1 -0
- package/dist/core/git-credential-helper.d.ts +57 -0
- package/dist/core/git-credential-helper.d.ts.map +1 -0
- package/dist/core/git-credential-helper.js +176 -0
- package/dist/core/git-credential-helper.js.map +1 -0
- package/dist/core/git-sandbox.d.ts +135 -0
- package/dist/core/git-sandbox.d.ts.map +1 -0
- package/dist/core/git-sandbox.js +907 -0
- package/dist/core/git-sandbox.js.map +1 -0
- package/dist/core/github-integration.d.ts +66 -0
- package/dist/core/github-integration.d.ts.map +1 -0
- package/dist/core/github-integration.js +350 -0
- package/dist/core/github-integration.js.map +1 -0
- package/dist/core/github-oauth.d.ts +88 -0
- package/dist/core/github-oauth.d.ts.map +1 -0
- package/dist/core/github-oauth.js +244 -0
- package/dist/core/github-oauth.js.map +1 -0
- package/dist/core/gitlab-integration.d.ts +66 -0
- package/dist/core/gitlab-integration.d.ts.map +1 -0
- package/dist/core/gitlab-integration.js +353 -0
- package/dist/core/gitlab-integration.js.map +1 -0
- package/dist/core/gitlab-oauth.d.ts +100 -0
- package/dist/core/gitlab-oauth.d.ts.map +1 -0
- package/dist/core/gitlab-oauth.js +366 -0
- package/dist/core/gitlab-oauth.js.map +1 -0
- package/dist/core/insights-extractor.d.ts +68 -0
- package/dist/core/insights-extractor.d.ts.map +1 -0
- package/dist/core/insights-extractor.js +402 -0
- package/dist/core/insights-extractor.js.map +1 -0
- package/dist/core/logger.d.ts +27 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +70 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/process-runner.d.ts +27 -0
- package/dist/core/process-runner.d.ts.map +1 -0
- package/dist/core/process-runner.js +147 -0
- package/dist/core/process-runner.js.map +1 -0
- package/dist/core/project-detector.d.ts +30 -0
- package/dist/core/project-detector.d.ts.map +1 -0
- package/dist/core/project-detector.js +482 -0
- package/dist/core/project-detector.js.map +1 -0
- package/dist/core/qr-generator.d.ts +18 -0
- package/dist/core/qr-generator.d.ts.map +1 -0
- package/dist/core/qr-generator.js +61 -0
- package/dist/core/qr-generator.js.map +1 -0
- package/dist/core/remote-tunnel-manager.d.ts +59 -0
- package/dist/core/remote-tunnel-manager.d.ts.map +1 -0
- package/dist/core/remote-tunnel-manager.js +235 -0
- package/dist/core/remote-tunnel-manager.js.map +1 -0
- package/dist/core/shared-docker-manager.d.ts +41 -0
- package/dist/core/shared-docker-manager.d.ts.map +1 -0
- package/dist/core/shared-docker-manager.js +409 -0
- package/dist/core/shared-docker-manager.js.map +1 -0
- package/dist/core/skill-executor.d.ts +25 -0
- package/dist/core/skill-executor.d.ts.map +1 -0
- package/dist/core/skill-executor.js +171 -0
- package/dist/core/skill-executor.js.map +1 -0
- package/dist/core/terminal-session.d.ts +149 -0
- package/dist/core/terminal-session.d.ts.map +1 -0
- package/dist/core/terminal-session.js +2340 -0
- package/dist/core/terminal-session.js.map +1 -0
- package/dist/core/tunnel-manager.d.ts +35 -0
- package/dist/core/tunnel-manager.d.ts.map +1 -0
- package/dist/core/tunnel-manager.js +137 -0
- package/dist/core/tunnel-manager.js.map +1 -0
- package/dist/core/usage-manager.d.ts +57 -0
- package/dist/core/usage-manager.d.ts.map +1 -0
- package/dist/core/usage-manager.js +363 -0
- package/dist/core/usage-manager.js.map +1 -0
- package/dist/core/ws-manager.d.ts +39 -0
- package/dist/core/ws-manager.d.ts.map +1 -0
- package/dist/core/ws-manager.js +190 -0
- package/dist/core/ws-manager.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +229 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +868 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +119 -0
- package/dist/types.js.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1,583 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { writeFileSync, mkdirSync, existsSync, appendFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { sharedDockerManager } from './shared-docker-manager.js';
|
|
5
|
+
import { workspaceManager } from '../config/workspaces.js';
|
|
6
|
+
import { settingsManager } from '../config/settings.js';
|
|
7
|
+
import { getGitCredentialEnv, cleanupGitCredentialEnv } from './git-credential-helper.js';
|
|
8
|
+
/**
|
|
9
|
+
* Get a clean PATH that excludes claudedesk's node_modules to prevent dependency conflicts
|
|
10
|
+
* This ensures Claude Code and child processes use the project's own dependencies
|
|
11
|
+
*/
|
|
12
|
+
function getCleanPath() {
|
|
13
|
+
const currentPath = process.env.PATH || process.env.Path || '';
|
|
14
|
+
const pathSep = process.platform === 'win32' ? ';' : ':';
|
|
15
|
+
const claudedeskDir = process.cwd(); // ClaudeDesk's working directory
|
|
16
|
+
// Filter out paths that contain claudedesk's node_modules
|
|
17
|
+
const cleanPaths = currentPath.split(pathSep).filter(p => {
|
|
18
|
+
const normalized = p.toLowerCase().replace(/\\/g, '/');
|
|
19
|
+
const claudedeskNormalized = claudedeskDir.toLowerCase().replace(/\\/g, '/');
|
|
20
|
+
// Remove claudedesk's node_modules/.bin from PATH
|
|
21
|
+
return !normalized.includes(`${claudedeskNormalized}/node_modules`);
|
|
22
|
+
});
|
|
23
|
+
return cleanPaths.join(pathSep);
|
|
24
|
+
}
|
|
25
|
+
export class ClaudeInvoker {
|
|
26
|
+
// Parse a stream-json line and extract relevant event info
|
|
27
|
+
parseStreamLine(line) {
|
|
28
|
+
try {
|
|
29
|
+
const data = JSON.parse(line);
|
|
30
|
+
// Handle different event types from Claude Code stream-json
|
|
31
|
+
// See: https://docs.anthropic.com/en/docs/claude-code
|
|
32
|
+
// Message start - contains model info
|
|
33
|
+
if (data.type === 'message_start' && data.message?.model) {
|
|
34
|
+
return {
|
|
35
|
+
type: 'model_info',
|
|
36
|
+
model: data.message.model,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Content block with text
|
|
40
|
+
if (data.type === 'content_block_delta' && data.delta?.type === 'text_delta') {
|
|
41
|
+
return {
|
|
42
|
+
type: 'text',
|
|
43
|
+
content: data.delta.text,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Tool use start
|
|
47
|
+
if (data.type === 'content_block_start' && data.content_block?.type === 'tool_use') {
|
|
48
|
+
return {
|
|
49
|
+
type: 'tool_use',
|
|
50
|
+
toolName: data.content_block.name,
|
|
51
|
+
toolInput: data.content_block.input,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Assistant message with tool use (alternative format)
|
|
55
|
+
if (data.type === 'assistant' && data.message?.content) {
|
|
56
|
+
for (const block of data.message.content) {
|
|
57
|
+
if (block.type === 'tool_use') {
|
|
58
|
+
return {
|
|
59
|
+
type: 'tool_use',
|
|
60
|
+
toolName: block.name,
|
|
61
|
+
toolInput: block.input,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (block.type === 'text' && block.text) {
|
|
65
|
+
return {
|
|
66
|
+
type: 'text',
|
|
67
|
+
content: block.text,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Result/completion - includes session_id for resuming conversations and usage stats
|
|
73
|
+
if (data.type === 'result') {
|
|
74
|
+
return {
|
|
75
|
+
type: 'result',
|
|
76
|
+
content: typeof data.result === 'string' ? data.result : JSON.stringify(data.result),
|
|
77
|
+
isComplete: true,
|
|
78
|
+
sessionId: data.session_id, // Claude Code session ID for --resume
|
|
79
|
+
// Usage tracking fields
|
|
80
|
+
usage: data.usage ? {
|
|
81
|
+
inputTokens: data.usage.input_tokens || 0,
|
|
82
|
+
outputTokens: data.usage.output_tokens || 0,
|
|
83
|
+
cacheCreationInputTokens: data.usage.cache_creation_input_tokens,
|
|
84
|
+
cacheReadInputTokens: data.usage.cache_read_input_tokens,
|
|
85
|
+
} : undefined,
|
|
86
|
+
model: data.model,
|
|
87
|
+
costUsd: data.cost_usd,
|
|
88
|
+
durationMs: data.duration_ms,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Message stop
|
|
92
|
+
if (data.type === 'message_stop') {
|
|
93
|
+
return {
|
|
94
|
+
type: 'result',
|
|
95
|
+
isComplete: true,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// Error
|
|
99
|
+
if (data.type === 'error') {
|
|
100
|
+
return {
|
|
101
|
+
type: 'error',
|
|
102
|
+
content: data.error?.message || JSON.stringify(data.error),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Not valid JSON, ignore
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Format tool input for display
|
|
113
|
+
formatToolActivity(toolName, toolInput) {
|
|
114
|
+
const input = toolInput;
|
|
115
|
+
switch (toolName) {
|
|
116
|
+
case 'Read':
|
|
117
|
+
return `Reading ${input?.file_path || 'file'}...`;
|
|
118
|
+
case 'Edit':
|
|
119
|
+
return `Editing ${input?.file_path || 'file'}...`;
|
|
120
|
+
case 'Write':
|
|
121
|
+
return `Writing ${input?.file_path || 'file'}...`;
|
|
122
|
+
case 'Bash':
|
|
123
|
+
const cmd = String(input?.command || '').slice(0, 50);
|
|
124
|
+
return `Running: ${cmd}${cmd.length >= 50 ? '...' : ''}`;
|
|
125
|
+
case 'Glob':
|
|
126
|
+
return `Searching for ${input?.pattern || 'files'}...`;
|
|
127
|
+
case 'Grep':
|
|
128
|
+
return `Searching for "${input?.pattern || 'pattern'}"...`;
|
|
129
|
+
case 'Task':
|
|
130
|
+
return `Running task...`;
|
|
131
|
+
case 'TodoWrite':
|
|
132
|
+
return `Updating tasks...`;
|
|
133
|
+
default:
|
|
134
|
+
return `Using ${toolName}...`;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async invoke(options) {
|
|
138
|
+
const { repoPath, prompt, artifactsDir, onProcessStart } = options;
|
|
139
|
+
console.log(`[ClaudeInvoker] Starting Claude in ${repoPath}`);
|
|
140
|
+
console.log(`[ClaudeInvoker] Prompt length: ${prompt.length} chars`);
|
|
141
|
+
// Ensure artifacts directory exists
|
|
142
|
+
const claudeDir = join(artifactsDir, 'claude');
|
|
143
|
+
if (!existsSync(claudeDir)) {
|
|
144
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
145
|
+
}
|
|
146
|
+
// Write prompt to file for reference
|
|
147
|
+
const promptFile = join(claudeDir, 'prompt.md');
|
|
148
|
+
writeFileSync(promptFile, prompt);
|
|
149
|
+
// Initialize output file for streaming
|
|
150
|
+
const outputFile = join(claudeDir, 'output.txt');
|
|
151
|
+
const stderrFile = join(claudeDir, 'stderr.txt');
|
|
152
|
+
writeFileSync(outputFile, ''); // Create empty file for streaming
|
|
153
|
+
return new Promise((resolve) => {
|
|
154
|
+
let rawOutput = '';
|
|
155
|
+
let textOutput = ''; // Accumulated text content only
|
|
156
|
+
let errorOutput = '';
|
|
157
|
+
let lineBuffer = ''; // Buffer for incomplete JSON lines
|
|
158
|
+
let currentModel = ''; // Track model from message_start event
|
|
159
|
+
// SEC-04: Resolve permission mode (workspace override > global setting)
|
|
160
|
+
const workspace = workspaceManager.getWorkspaceForRepo(repoPath);
|
|
161
|
+
const globalSettings = settingsManager.getClaude();
|
|
162
|
+
const permissionMode = workspace?.claudePermissionMode ?? globalSettings.permissionMode ?? 'autonomous';
|
|
163
|
+
console.log(`[ClaudeInvoker] Permission mode: ${permissionMode}`);
|
|
164
|
+
// Invoke Claude Code CLI
|
|
165
|
+
// Using --output-format stream-json to get streaming events
|
|
166
|
+
// --verbose is required for stream-json format
|
|
167
|
+
// -p enables print mode (non-interactive)
|
|
168
|
+
// Passing prompt via stdin to avoid command line escaping issues
|
|
169
|
+
const args = [
|
|
170
|
+
'-p',
|
|
171
|
+
'--output-format', 'stream-json',
|
|
172
|
+
'--verbose',
|
|
173
|
+
];
|
|
174
|
+
// SEC-04: Apply permission mode
|
|
175
|
+
if (permissionMode === 'autonomous') {
|
|
176
|
+
// Autonomous mode: skip all permission prompts
|
|
177
|
+
args.unshift('--dangerously-skip-permissions');
|
|
178
|
+
}
|
|
179
|
+
else if (permissionMode === 'read-only') {
|
|
180
|
+
// Read-only mode: allow only safe read tools
|
|
181
|
+
args.unshift('--allowedTools', 'Read,Glob,Grep,WebFetch,WebSearch');
|
|
182
|
+
}
|
|
183
|
+
// Add --resume flag if resuming a session
|
|
184
|
+
if (options.resumeSessionId) {
|
|
185
|
+
args.push('--resume', options.resumeSessionId);
|
|
186
|
+
console.log(`[ClaudeInvoker] Resuming session: ${options.resumeSessionId}`);
|
|
187
|
+
}
|
|
188
|
+
// Add --agent flag if using an agent
|
|
189
|
+
if (options.agentId) {
|
|
190
|
+
args.push('--agent', options.agentId);
|
|
191
|
+
console.log(`[ClaudeInvoker] Using agent: ${options.agentId}`);
|
|
192
|
+
}
|
|
193
|
+
// Read prompt from stdin
|
|
194
|
+
args.push('-');
|
|
195
|
+
console.log(`[ClaudeInvoker] Running: claude ${args.join(' ')} (prompt via stdin)`);
|
|
196
|
+
// Use clean PATH to prevent claudedesk's dependencies from being picked up by Claude Code
|
|
197
|
+
const cleanPath = getCleanPath();
|
|
198
|
+
let cleanEnv = {
|
|
199
|
+
...process.env,
|
|
200
|
+
PATH: cleanPath,
|
|
201
|
+
Path: cleanPath, // Windows uses 'Path'
|
|
202
|
+
};
|
|
203
|
+
// Inject git credentials if workspace has OAuth tokens
|
|
204
|
+
let gitCredEnv = null;
|
|
205
|
+
const gitCreds = workspaceManager.getGitCredentialsForRepo(repoPath);
|
|
206
|
+
if (gitCreds.token && gitCreds.platform) {
|
|
207
|
+
gitCredEnv = getGitCredentialEnv(gitCreds.token, gitCreds.platform, gitCreds.username || undefined);
|
|
208
|
+
cleanEnv = { ...cleanEnv, ...gitCredEnv };
|
|
209
|
+
console.log(`[ClaudeInvoker] Injecting ${gitCreds.platform} credentials for git operations`);
|
|
210
|
+
}
|
|
211
|
+
const proc = spawn('claude', args, {
|
|
212
|
+
cwd: repoPath,
|
|
213
|
+
env: cleanEnv,
|
|
214
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
215
|
+
shell: true,
|
|
216
|
+
});
|
|
217
|
+
console.log(`[ClaudeInvoker] Process spawned, PID: ${proc.pid}`);
|
|
218
|
+
// Call onProcessStart callback for cancellation tracking
|
|
219
|
+
if (onProcessStart) {
|
|
220
|
+
onProcessStart(proc);
|
|
221
|
+
}
|
|
222
|
+
// Write prompt to stdin and close it
|
|
223
|
+
if (proc.stdin) {
|
|
224
|
+
proc.stdin.write(prompt);
|
|
225
|
+
proc.stdin.end();
|
|
226
|
+
console.log(`[ClaudeInvoker] Prompt written to stdin`);
|
|
227
|
+
}
|
|
228
|
+
proc.stdout?.on('data', (data) => {
|
|
229
|
+
const text = data.toString();
|
|
230
|
+
rawOutput += text;
|
|
231
|
+
// Stream raw output to file
|
|
232
|
+
appendFileSync(outputFile, text);
|
|
233
|
+
// Legacy callback for raw output
|
|
234
|
+
if (options.onStreamChunk) {
|
|
235
|
+
options.onStreamChunk(text, 'stdout');
|
|
236
|
+
}
|
|
237
|
+
// Parse stream-json lines
|
|
238
|
+
lineBuffer += text;
|
|
239
|
+
const lines = lineBuffer.split('\n');
|
|
240
|
+
lineBuffer = lines.pop() || ''; // Keep incomplete line in buffer
|
|
241
|
+
for (const line of lines) {
|
|
242
|
+
if (!line.trim())
|
|
243
|
+
continue;
|
|
244
|
+
const event = this.parseStreamLine(line);
|
|
245
|
+
if (event) {
|
|
246
|
+
// Capture model from message_start event
|
|
247
|
+
if (event.type === 'model_info' && event.model) {
|
|
248
|
+
currentModel = event.model;
|
|
249
|
+
console.log(`[ClaudeInvoker] Captured model: ${currentModel}`);
|
|
250
|
+
}
|
|
251
|
+
// Inject captured model into result events
|
|
252
|
+
if (event.type === 'result' && !event.model && currentModel) {
|
|
253
|
+
event.model = currentModel;
|
|
254
|
+
}
|
|
255
|
+
// Accumulate text content
|
|
256
|
+
if (event.type === 'text' && event.content) {
|
|
257
|
+
textOutput += event.content;
|
|
258
|
+
}
|
|
259
|
+
// Format tool activity for display
|
|
260
|
+
if (event.type === 'tool_use' && event.toolName) {
|
|
261
|
+
event.content = this.formatToolActivity(event.toolName, event.toolInput);
|
|
262
|
+
}
|
|
263
|
+
// Call event callback
|
|
264
|
+
if (options.onStreamEvent) {
|
|
265
|
+
options.onStreamEvent(event);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// Log first bit of output to show progress
|
|
270
|
+
if (rawOutput.length <= 500) {
|
|
271
|
+
console.log(`[ClaudeInvoker] stdout: ${text.slice(0, 200)}`);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
proc.stderr?.on('data', (data) => {
|
|
275
|
+
const text = data.toString();
|
|
276
|
+
errorOutput += text;
|
|
277
|
+
// Stream stderr to file in real-time
|
|
278
|
+
appendFileSync(stderrFile, text);
|
|
279
|
+
// Call streaming callback if provided
|
|
280
|
+
if (options.onStreamChunk) {
|
|
281
|
+
options.onStreamChunk(text, 'stderr');
|
|
282
|
+
}
|
|
283
|
+
console.log(`[ClaudeInvoker] stderr: ${text.slice(0, 200)}`);
|
|
284
|
+
});
|
|
285
|
+
proc.on('close', (code) => {
|
|
286
|
+
console.log(`[ClaudeInvoker] Process closed with code ${code}`);
|
|
287
|
+
// Clean up git credential helper script if created
|
|
288
|
+
if (gitCredEnv) {
|
|
289
|
+
cleanupGitCredentialEnv(gitCredEnv);
|
|
290
|
+
}
|
|
291
|
+
// Process any remaining buffer
|
|
292
|
+
if (lineBuffer.trim()) {
|
|
293
|
+
const event = this.parseStreamLine(lineBuffer);
|
|
294
|
+
if (event) {
|
|
295
|
+
// Capture model if in buffer
|
|
296
|
+
if (event.type === 'model_info' && event.model) {
|
|
297
|
+
currentModel = event.model;
|
|
298
|
+
}
|
|
299
|
+
// Inject model into result
|
|
300
|
+
if (event.type === 'result' && !event.model && currentModel) {
|
|
301
|
+
event.model = currentModel;
|
|
302
|
+
}
|
|
303
|
+
if (event.type === 'text' && event.content) {
|
|
304
|
+
textOutput += event.content;
|
|
305
|
+
}
|
|
306
|
+
if (options.onStreamEvent) {
|
|
307
|
+
options.onStreamEvent(event);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Signal completion
|
|
312
|
+
if (options.onStreamEvent) {
|
|
313
|
+
options.onStreamEvent({ type: 'result', isComplete: true });
|
|
314
|
+
}
|
|
315
|
+
// Write output to file
|
|
316
|
+
writeFileSync(join(claudeDir, 'output.txt'), textOutput || rawOutput);
|
|
317
|
+
if (errorOutput) {
|
|
318
|
+
writeFileSync(join(claudeDir, 'stderr.txt'), errorOutput);
|
|
319
|
+
}
|
|
320
|
+
if (code !== 0) {
|
|
321
|
+
console.log(`[ClaudeInvoker] Failed: exit code ${code}`);
|
|
322
|
+
resolve({
|
|
323
|
+
success: false,
|
|
324
|
+
output: textOutput || rawOutput,
|
|
325
|
+
error: errorOutput || `Claude Code exited with code ${code}`,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
console.log(`[ClaudeInvoker] Success!`);
|
|
330
|
+
resolve({
|
|
331
|
+
success: true,
|
|
332
|
+
output: textOutput || rawOutput,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
proc.on('error', (err) => {
|
|
337
|
+
// Clean up git credential helper script if created
|
|
338
|
+
if (gitCredEnv) {
|
|
339
|
+
cleanupGitCredentialEnv(gitCredEnv);
|
|
340
|
+
}
|
|
341
|
+
resolve({
|
|
342
|
+
success: false,
|
|
343
|
+
output: textOutput || rawOutput,
|
|
344
|
+
error: `Failed to invoke Claude Code: ${err.message}`,
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
// Generate a prompt for fixing build/test failures
|
|
350
|
+
generateFixPrompt(repoId, failedStep, logs, goal) {
|
|
351
|
+
const sections = [
|
|
352
|
+
this.getCommitGuidelines(),
|
|
353
|
+
'',
|
|
354
|
+
`# Task: Fix ${failedStep} failure in ${repoId}`,
|
|
355
|
+
'',
|
|
356
|
+
'## Goal',
|
|
357
|
+
goal || `Fix the ${failedStep} step so it passes successfully.`,
|
|
358
|
+
'',
|
|
359
|
+
'## Failed Step Output',
|
|
360
|
+
'```',
|
|
361
|
+
logs.slice(-5000), // Last 5000 chars to avoid token limits
|
|
362
|
+
'```',
|
|
363
|
+
'',
|
|
364
|
+
];
|
|
365
|
+
// Add Docker services context if available
|
|
366
|
+
const dockerContext = sharedDockerManager.getDockerServicesContext();
|
|
367
|
+
if (dockerContext) {
|
|
368
|
+
sections.push(dockerContext, '');
|
|
369
|
+
}
|
|
370
|
+
// Add autonomy requirements
|
|
371
|
+
sections.push(this.getAutonomyInstructions(), '');
|
|
372
|
+
sections.push('## Instructions', '1. Analyze the error output above', '2. Identify the root cause of the failure', '3. Set up any missing infrastructure (databases, env files, etc.)', '4. Make the minimal necessary changes to fix the issue', '5. Do NOT make unrelated changes or refactoring', '6. Ensure changes are production-ready', '', '## Constraints', '- Only modify files within this repository', '- Do not delete any critical files', '- Preserve existing functionality', '- Keep changes minimal and focused');
|
|
373
|
+
return sections.join('\n');
|
|
374
|
+
}
|
|
375
|
+
// Generate a prompt for implementing a feature
|
|
376
|
+
generateFeaturePrompt(repoId, featureDescription, additionalContext) {
|
|
377
|
+
const sections = [
|
|
378
|
+
this.getCommitGuidelines(),
|
|
379
|
+
'',
|
|
380
|
+
`# Task: Implement feature in ${repoId}`,
|
|
381
|
+
'',
|
|
382
|
+
'## Feature Description',
|
|
383
|
+
featureDescription,
|
|
384
|
+
'',
|
|
385
|
+
];
|
|
386
|
+
// Add Docker services context if available
|
|
387
|
+
const dockerContext = sharedDockerManager.getDockerServicesContext();
|
|
388
|
+
if (dockerContext) {
|
|
389
|
+
sections.push(dockerContext, '');
|
|
390
|
+
}
|
|
391
|
+
// Add autonomy requirements
|
|
392
|
+
sections.push(this.getAutonomyInstructions(), '');
|
|
393
|
+
if (additionalContext) {
|
|
394
|
+
sections.push('## Additional Context', additionalContext, '');
|
|
395
|
+
}
|
|
396
|
+
sections.push('## Instructions', '1. Understand the existing codebase structure', '2. Implement the feature following existing patterns', '3. Set up any required infrastructure (databases, env files, etc.)', '4. Add appropriate error handling', '5. Keep the implementation focused and minimal', '', '## Constraints', '- Only modify files within this repository', '- Follow existing code style and patterns', '- Do not add unnecessary dependencies', '- Ensure the code is production-ready');
|
|
397
|
+
return sections.join('\n');
|
|
398
|
+
}
|
|
399
|
+
// Wrap any prompt in plan-only mode
|
|
400
|
+
generatePlanPrompt(originalPrompt) {
|
|
401
|
+
return `${originalPrompt}
|
|
402
|
+
|
|
403
|
+
## PLANNING MODE - DO NOT IMPLEMENT YET
|
|
404
|
+
|
|
405
|
+
You are in PLANNING MODE. Do NOT make any code changes or modify files.
|
|
406
|
+
|
|
407
|
+
Instead, provide:
|
|
408
|
+
1. **PLAN**: A detailed step-by-step plan of what you will do
|
|
409
|
+
2. **FILES**: List of files you will create/modify
|
|
410
|
+
3. **QUESTIONS**: Any clarifying questions (use format below)
|
|
411
|
+
|
|
412
|
+
### Question Format
|
|
413
|
+
If you have questions, output them exactly like this:
|
|
414
|
+
\`\`\`questions
|
|
415
|
+
[QUESTION]: What should the button text say?
|
|
416
|
+
[QUESTION]: Should this feature be behind a feature flag?
|
|
417
|
+
\`\`\`
|
|
418
|
+
|
|
419
|
+
After your plan is approved, you will be called again to implement it.`;
|
|
420
|
+
}
|
|
421
|
+
// Generate an execution prompt that includes the approved plan and user answers
|
|
422
|
+
generateExecutionPrompt(originalPrompt, planOutput, answers, additionalContext) {
|
|
423
|
+
const sections = [originalPrompt, ''];
|
|
424
|
+
sections.push('## APPROVED PLAN');
|
|
425
|
+
sections.push('The following plan was approved. Implement it now:');
|
|
426
|
+
sections.push('');
|
|
427
|
+
sections.push(planOutput);
|
|
428
|
+
sections.push('');
|
|
429
|
+
if (Object.keys(answers).length > 0) {
|
|
430
|
+
sections.push('## ANSWERS TO YOUR QUESTIONS');
|
|
431
|
+
for (const [question, answer] of Object.entries(answers)) {
|
|
432
|
+
sections.push(`**Q:** ${question}`);
|
|
433
|
+
sections.push(`**A:** ${answer}`);
|
|
434
|
+
sections.push('');
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
if (additionalContext) {
|
|
438
|
+
sections.push('## ADDITIONAL CONTEXT FROM USER');
|
|
439
|
+
sections.push(additionalContext);
|
|
440
|
+
sections.push('');
|
|
441
|
+
}
|
|
442
|
+
sections.push('## NOW IMPLEMENT THE PLAN');
|
|
443
|
+
sections.push('Execute the approved plan above. Make the code changes now.');
|
|
444
|
+
sections.push('');
|
|
445
|
+
sections.push('**REMINDER:** You are in FULLY AUTONOMOUS mode. Do ALL the work yourself including:');
|
|
446
|
+
sections.push('- Creating databases, running migrations, seeding data');
|
|
447
|
+
sections.push('- Creating/updating .env files with required environment variables');
|
|
448
|
+
sections.push('- Installing dependencies, creating directories');
|
|
449
|
+
sections.push('- Never output instructions for the user to follow - DO IT YOURSELF.');
|
|
450
|
+
return sections.join('\n');
|
|
451
|
+
}
|
|
452
|
+
// Parse questions from Claude's plan output
|
|
453
|
+
parseQuestionsFromOutput(output) {
|
|
454
|
+
const questionBlock = output.match(/```questions\n([\s\S]*?)```/);
|
|
455
|
+
if (!questionBlock)
|
|
456
|
+
return [];
|
|
457
|
+
const questions = questionBlock[1]
|
|
458
|
+
.split('\n')
|
|
459
|
+
.filter(line => line.startsWith('[QUESTION]:'))
|
|
460
|
+
.map(line => line.replace('[QUESTION]:', '').trim())
|
|
461
|
+
.filter(q => q.length > 0);
|
|
462
|
+
return questions;
|
|
463
|
+
}
|
|
464
|
+
// Generate autonomy instructions for prompts
|
|
465
|
+
getAutonomyInstructions() {
|
|
466
|
+
return `## Autonomy Requirements - DO ALL THE WORK YOURSELF
|
|
467
|
+
|
|
468
|
+
You are running in FULLY AUTONOMOUS mode. Complete ALL tasks yourself without asking the user to do anything.
|
|
469
|
+
|
|
470
|
+
**You MUST do these things yourself (never instruct the user):**
|
|
471
|
+
- Create databases: Use \`psql\`, \`createdb\`, or run SQL commands directly
|
|
472
|
+
- Create/update .env files: Write the file with all required environment variables
|
|
473
|
+
- Run migrations: Execute migration commands directly
|
|
474
|
+
- Install dependencies: Run npm/yarn/pip install as needed
|
|
475
|
+
- Create directories: Use mkdir for any needed folders
|
|
476
|
+
- Seed data: Run seed scripts or insert initial data
|
|
477
|
+
- Start services: Run any required startup commands
|
|
478
|
+
- Configure connections: Set up database connections, API keys, etc.
|
|
479
|
+
|
|
480
|
+
**CRITICAL: Never output instructions for the user to follow. If something needs to be done, DO IT YOURSELF.**
|
|
481
|
+
|
|
482
|
+
## ⚠️ CRITICAL SAFETY RULES - PORTS 8787 AND 5173 ARE FORBIDDEN ⚠️
|
|
483
|
+
|
|
484
|
+
You are running inside ClaudeDesk, which uses ports 8787 (API) and 5173 (UI). If you kill these ports, you will crash the system.
|
|
485
|
+
|
|
486
|
+
**ABSOLUTELY FORBIDDEN COMMANDS:**
|
|
487
|
+
- \`npx kill-port 8787\` - WILL CRASH CLAUDEDESK
|
|
488
|
+
- \`npx kill-port 5173\` - WILL CRASH CLAUDEDESK
|
|
489
|
+
- \`taskkill /IM node.exe /F\` - WILL CRASH CLAUDEDESK (kills ALL Node)
|
|
490
|
+
- \`pkill node\` or \`killall node\` - WILL CRASH CLAUDEDESK
|
|
491
|
+
- Any command that kills processes on port 8787 or 5173
|
|
492
|
+
- Any command that kills all Node.js processes
|
|
493
|
+
|
|
494
|
+
**SAFE ALTERNATIVES for stopping apps:**
|
|
495
|
+
- Kill by specific PID: \`taskkill /PID 12345 /F\`
|
|
496
|
+
- Kill specific port (NOT 8787 or 5173): \`npx kill-port 3000\`
|
|
497
|
+
- Stop Docker: \`docker stop container-name\`
|
|
498
|
+
|
|
499
|
+
**Before killing ANY port, verify it is NOT 8787 or 5173.**
|
|
500
|
+
|
|
501
|
+
Example - WRONG approach:
|
|
502
|
+
"You need to create the database by running: createdb myapp"
|
|
503
|
+
|
|
504
|
+
Example - CORRECT approach:
|
|
505
|
+
*Actually run the createdb command to create the database*
|
|
506
|
+
|
|
507
|
+
## Git Commit Guidelines
|
|
508
|
+
|
|
509
|
+
When committing changes, follow these rules:
|
|
510
|
+
- **Keep commit messages SHORT** - max 72 characters for the subject line
|
|
511
|
+
- **Summarize the change**, don't include error logs or verbose output
|
|
512
|
+
- **Focus on WHAT changed**, not the full debugging history
|
|
513
|
+
- **Never include logs, stack traces, or error output** in commit messages
|
|
514
|
+
|
|
515
|
+
Example - WRONG commit message:
|
|
516
|
+
\`git commit -m "Fix error: [10:19:37] Starting npm... ERROR: Cannot find module... [500 lines of logs]"\`
|
|
517
|
+
|
|
518
|
+
Example - CORRECT commit message:
|
|
519
|
+
\`git commit -m "Fix missing @alloc/quick-lru dependency for TailwindCSS"\``;
|
|
520
|
+
}
|
|
521
|
+
// Get prominent commit guidelines to place at TOP of prompts
|
|
522
|
+
getCommitGuidelines() {
|
|
523
|
+
return `## CRITICAL: Git Commit Rules
|
|
524
|
+
**COMMIT MESSAGES MUST BE SHORT** - Maximum 50 characters for subject line.
|
|
525
|
+
- Summarize the change in a few words
|
|
526
|
+
- NEVER include logs, errors, or verbose output
|
|
527
|
+
- Example: "Fix missing database migration"`;
|
|
528
|
+
}
|
|
529
|
+
// Best practices learned from debugging sessions
|
|
530
|
+
getBestPracticesGuidelines() {
|
|
531
|
+
return `## Best Practices (MUST FOLLOW)
|
|
532
|
+
|
|
533
|
+
### Environment Variables
|
|
534
|
+
- **DO NOT add .env to .gitignore** - commit it with safe dev defaults (localhost, dev passwords)
|
|
535
|
+
- Use .env.example as a reference template if needed
|
|
536
|
+
- Environment variables should work out-of-the-box for local development
|
|
537
|
+
- Example DATABASE_URL: \`postgresql://claudedesk:claudedesk_dev@localhost:5432/myapp\`
|
|
538
|
+
|
|
539
|
+
### Prisma (if using database)
|
|
540
|
+
- Use \`prisma.config.ts\` for Prisma 7.x projects with driver adapters
|
|
541
|
+
- Schema location: \`prisma/schema.prisma\` (or \`apps/api/prisma/schema.prisma\` for monorepos)
|
|
542
|
+
- Run \`prisma db push\` for development database sync
|
|
543
|
+
- Do NOT use deprecated flags like \`--skip-generate\`
|
|
544
|
+
|
|
545
|
+
### Multi-Service / Monorepo Projects
|
|
546
|
+
- Use environment variables for inter-service communication
|
|
547
|
+
- Vite proxy config should use \`process.env.API_PORT || 3001\`, NOT hardcoded ports
|
|
548
|
+
- Backend should read port from \`API_PORT\` or \`PORT\` env var
|
|
549
|
+
- Example vite.config.ts proxy:
|
|
550
|
+
\`\`\`
|
|
551
|
+
proxy: { '/api': { target: \`http://localhost:\${process.env.API_PORT || 3001}\` } }
|
|
552
|
+
\`\`\`
|
|
553
|
+
|
|
554
|
+
### API Best Practices
|
|
555
|
+
- Always include a health check endpoint at \`/api/health\` or \`/health\`
|
|
556
|
+
- Use retry logic for database connections on startup (database may not be ready immediately)
|
|
557
|
+
- Return JSON with \`{ status: 'ok' }\` for health checks
|
|
558
|
+
- Use environment variable for port: \`process.env.API_PORT || process.env.PORT || 3001\``;
|
|
559
|
+
}
|
|
560
|
+
// Generate a prompt for creating a new repository
|
|
561
|
+
generateCreateRepoPrompt(repoName, templateId, description, scaffoldedFiles) {
|
|
562
|
+
const sections = [
|
|
563
|
+
this.getCommitGuidelines(),
|
|
564
|
+
'',
|
|
565
|
+
`# Task: Create ${repoName} from ${templateId} template`,
|
|
566
|
+
'',
|
|
567
|
+
'## Project Description',
|
|
568
|
+
description,
|
|
569
|
+
'',
|
|
570
|
+
this.getBestPracticesGuidelines(),
|
|
571
|
+
'',
|
|
572
|
+
this.getAutonomyInstructions(),
|
|
573
|
+
'',
|
|
574
|
+
];
|
|
575
|
+
if (scaffoldedFiles && scaffoldedFiles.length > 0) {
|
|
576
|
+
sections.push('## Already Scaffolded Files', 'These files are already created from the template:', scaffoldedFiles.map(f => `- ${f}`).join('\n'), '', 'Build upon these files. Do not recreate them unless necessary.', '');
|
|
577
|
+
}
|
|
578
|
+
sections.push('## Requirements', '1. Implement the project based on the description above', '2. Ensure the project builds and runs without errors', '3. Follow all best practices guidelines above', '4. Create a working application that passes health/proof checks', '5. Commit your changes with short, descriptive commit messages');
|
|
579
|
+
return sections.join('\n');
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
export const claudeInvoker = new ClaudeInvoker();
|
|
583
|
+
//# sourceMappingURL=claude-invoker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-invoker.js","sourceRoot":"","sources":["../../src/core/claude-invoker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ClaudeSession {
|
|
2
|
+
id: string;
|
|
3
|
+
summary: string;
|
|
4
|
+
timestamp: Date;
|
|
5
|
+
messageCount: number;
|
|
6
|
+
branch?: string;
|
|
7
|
+
filePath: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Read all Claude sessions for a given repository path
|
|
11
|
+
*/
|
|
12
|
+
export declare function getClaudeSessions(repoPath: string): ClaudeSession[];
|
|
13
|
+
/**
|
|
14
|
+
* Format relative time (e.g., "10 minutes ago", "3 days ago")
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatRelativeTime(date: Date): string;
|
|
17
|
+
/**
|
|
18
|
+
* Format session list for display (similar to Claude Code's /resume output)
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatSessionList(sessions: ClaudeSession[], limit?: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* Get a specific session by index (1-based) or ID
|
|
23
|
+
*/
|
|
24
|
+
export declare function getSessionByRef(sessions: ClaudeSession[], ref: string): ClaudeSession | undefined;
|
|
25
|
+
//# sourceMappingURL=claude-session-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-session-reader.d.ts","sourceRoot":"","sources":["../../src/core/claude-session-reader.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAyBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CA6GnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAerD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM,CA6BvF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CASjG"}
|