@ttfw/envoi 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/README.md +238 -0
- package/dist/commands/app.d.ts +2 -0
- package/dist/commands/app.d.ts.map +1 -0
- package/dist/commands/app.js +31 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/autonomy.d.ts +6 -0
- package/dist/commands/autonomy.d.ts.map +1 -0
- package/dist/commands/autonomy.js +89 -0
- package/dist/commands/autonomy.js.map +1 -0
- package/dist/commands/builder.d.ts +13 -0
- package/dist/commands/builder.d.ts.map +1 -0
- package/dist/commands/builder.js +142 -0
- package/dist/commands/builder.js.map +1 -0
- package/dist/commands/idea.d.ts +12 -0
- package/dist/commands/idea.d.ts.map +1 -0
- package/dist/commands/idea.js +79 -0
- package/dist/commands/idea.js.map +1 -0
- package/dist/commands/init.d.ts +18 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +423 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mode.d.ts +13 -0
- package/dist/commands/mode.d.ts.map +1 -0
- package/dist/commands/mode.js +96 -0
- package/dist/commands/mode.js.map +1 -0
- package/dist/commands/onboard.d.ts +37 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +743 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/pr-note.d.ts +8 -0
- package/dist/commands/pr-note.d.ts.map +1 -0
- package/dist/commands/pr-note.js +27 -0
- package/dist/commands/pr-note.js.map +1 -0
- package/dist/commands/undo.d.ts +7 -0
- package/dist/commands/undo.d.ts.map +1 -0
- package/dist/commands/undo.js +59 -0
- package/dist/commands/undo.js.map +1 -0
- package/dist/commands/update.d.ts +24 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +248 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/constants/report_codes.d.ts +29 -0
- package/dist/constants/report_codes.d.ts.map +1 -0
- package/dist/constants/report_codes.js +69 -0
- package/dist/constants/report_codes.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +675 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/autonomy.d.ts +16 -0
- package/dist/lib/autonomy.d.ts.map +1 -0
- package/dist/lib/autonomy.js +38 -0
- package/dist/lib/autonomy.js.map +1 -0
- package/dist/lib/blocked.d.ts +87 -0
- package/dist/lib/blocked.d.ts.map +1 -0
- package/dist/lib/blocked.js +134 -0
- package/dist/lib/blocked.js.map +1 -0
- package/dist/lib/branding.d.ts +13 -0
- package/dist/lib/branding.d.ts.map +1 -0
- package/dist/lib/branding.js +19 -0
- package/dist/lib/branding.js.map +1 -0
- package/dist/lib/claude.d.ts +42 -0
- package/dist/lib/claude.d.ts.map +1 -0
- package/dist/lib/claude.js +291 -0
- package/dist/lib/claude.js.map +1 -0
- package/dist/lib/config.d.ts +71 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +410 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/diff.d.ts +150 -0
- package/dist/lib/diff.d.ts.map +1 -0
- package/dist/lib/diff.js +257 -0
- package/dist/lib/diff.js.map +1 -0
- package/dist/lib/doctor.d.ts +67 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +211 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/fingerprint.d.ts +27 -0
- package/dist/lib/fingerprint.d.ts.map +1 -0
- package/dist/lib/fingerprint.js +116 -0
- package/dist/lib/fingerprint.js.map +1 -0
- package/dist/lib/fs.d.ts +93 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +179 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/git.d.ts +177 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +355 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/git_branching.d.ts +84 -0
- package/dist/lib/git_branching.d.ts.map +1 -0
- package/dist/lib/git_branching.js +327 -0
- package/dist/lib/git_branching.js.map +1 -0
- package/dist/lib/gitignore.d.ts +26 -0
- package/dist/lib/gitignore.d.ts.map +1 -0
- package/dist/lib/gitignore.js +119 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/guardrails.d.ts +232 -0
- package/dist/lib/guardrails.d.ts.map +1 -0
- package/dist/lib/guardrails.js +323 -0
- package/dist/lib/guardrails.js.map +1 -0
- package/dist/lib/history.d.ts +110 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +236 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/index.d.ts +29 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +29 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/json-extract.d.ts +42 -0
- package/dist/lib/json-extract.d.ts.map +1 -0
- package/dist/lib/json-extract.js +201 -0
- package/dist/lib/json-extract.js.map +1 -0
- package/dist/lib/judge.d.ts +237 -0
- package/dist/lib/judge.d.ts.map +1 -0
- package/dist/lib/judge.js +501 -0
- package/dist/lib/judge.js.map +1 -0
- package/dist/lib/lock.d.ts +79 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +254 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/migration.d.ts +9 -0
- package/dist/lib/migration.d.ts.map +1 -0
- package/dist/lib/migration.js +74 -0
- package/dist/lib/migration.js.map +1 -0
- package/dist/lib/paths.d.ts +18 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +27 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/preflight.d.ts +33 -0
- package/dist/lib/preflight.d.ts.map +1 -0
- package/dist/lib/preflight.js +177 -0
- package/dist/lib/preflight.js.map +1 -0
- package/dist/lib/prompt_budget.d.ts +18 -0
- package/dist/lib/prompt_budget.d.ts.map +1 -0
- package/dist/lib/prompt_budget.js +36 -0
- package/dist/lib/prompt_budget.js.map +1 -0
- package/dist/lib/report.d.ts +102 -0
- package/dist/lib/report.d.ts.map +1 -0
- package/dist/lib/report.js +347 -0
- package/dist/lib/report.js.map +1 -0
- package/dist/lib/reviewer-flow.d.ts +80 -0
- package/dist/lib/reviewer-flow.d.ts.map +1 -0
- package/dist/lib/reviewer-flow.js +138 -0
- package/dist/lib/reviewer-flow.js.map +1 -0
- package/dist/lib/reviewer.d.ts +53 -0
- package/dist/lib/reviewer.d.ts.map +1 -0
- package/dist/lib/reviewer.js +199 -0
- package/dist/lib/reviewer.js.map +1 -0
- package/dist/lib/risk.d.ts +127 -0
- package/dist/lib/risk.d.ts.map +1 -0
- package/dist/lib/risk.js +192 -0
- package/dist/lib/risk.js.map +1 -0
- package/dist/lib/rollback.d.ts +143 -0
- package/dist/lib/rollback.d.ts.map +1 -0
- package/dist/lib/rollback.js +244 -0
- package/dist/lib/rollback.js.map +1 -0
- package/dist/lib/schema.d.ts +47 -0
- package/dist/lib/schema.d.ts.map +1 -0
- package/dist/lib/schema.js +91 -0
- package/dist/lib/schema.js.map +1 -0
- package/dist/lib/scope.d.ts +89 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +135 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/self_update.d.ts +13 -0
- package/dist/lib/self_update.d.ts.map +1 -0
- package/dist/lib/self_update.js +172 -0
- package/dist/lib/self_update.js.map +1 -0
- package/dist/lib/state.d.ts +143 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +258 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/tick.d.ts +310 -0
- package/dist/lib/tick.d.ts.map +1 -0
- package/dist/lib/tick.js +424 -0
- package/dist/lib/tick.js.map +1 -0
- package/dist/lib/transport.d.ts +145 -0
- package/dist/lib/transport.d.ts.map +1 -0
- package/dist/lib/transport.js +237 -0
- package/dist/lib/transport.js.map +1 -0
- package/dist/lib/verdict_labels.d.ts +5 -0
- package/dist/lib/verdict_labels.d.ts.map +1 -0
- package/dist/lib/verdict_labels.js +25 -0
- package/dist/lib/verdict_labels.js.map +1 -0
- package/dist/lib/verify-safety.d.ts +63 -0
- package/dist/lib/verify-safety.d.ts.map +1 -0
- package/dist/lib/verify-safety.js +123 -0
- package/dist/lib/verify-safety.js.map +1 -0
- package/dist/lib/verify.d.ts +139 -0
- package/dist/lib/verify.d.ts.map +1 -0
- package/dist/lib/verify.js +311 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/lib/workspace_state.d.ts +79 -0
- package/dist/lib/workspace_state.d.ts.map +1 -0
- package/dist/lib/workspace_state.js +283 -0
- package/dist/lib/workspace_state.js.map +1 -0
- package/dist/runner/builder.d.ts +58 -0
- package/dist/runner/builder.d.ts.map +1 -0
- package/dist/runner/builder.js +775 -0
- package/dist/runner/builder.js.map +1 -0
- package/dist/runner/builder_parse.d.ts +37 -0
- package/dist/runner/builder_parse.d.ts.map +1 -0
- package/dist/runner/builder_parse.js +76 -0
- package/dist/runner/builder_parse.js.map +1 -0
- package/dist/runner/index.d.ts +9 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +7 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/loop.d.ts +51 -0
- package/dist/runner/loop.d.ts.map +1 -0
- package/dist/runner/loop.js +221 -0
- package/dist/runner/loop.js.map +1 -0
- package/dist/runner/orchestrator.d.ts +67 -0
- package/dist/runner/orchestrator.d.ts.map +1 -0
- package/dist/runner/orchestrator.js +376 -0
- package/dist/runner/orchestrator.js.map +1 -0
- package/dist/runner/tick.d.ts +10 -0
- package/dist/runner/tick.d.ts.map +1 -0
- package/dist/runner/tick.js +1639 -0
- package/dist/runner/tick.js.map +1 -0
- package/dist/types/blocked.d.ts +52 -0
- package/dist/types/blocked.d.ts.map +1 -0
- package/dist/types/blocked.js +8 -0
- package/dist/types/blocked.js.map +1 -0
- package/dist/types/builder.d.ts +25 -0
- package/dist/types/builder.d.ts.map +1 -0
- package/dist/types/builder.js +7 -0
- package/dist/types/builder.js.map +1 -0
- package/dist/types/claude.d.ts +86 -0
- package/dist/types/claude.d.ts.map +1 -0
- package/dist/types/claude.js +48 -0
- package/dist/types/claude.js.map +1 -0
- package/dist/types/config.d.ts +384 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lock.d.ts +21 -0
- package/dist/types/lock.d.ts.map +1 -0
- package/dist/types/lock.js +8 -0
- package/dist/types/lock.js.map +1 -0
- package/dist/types/preflight.d.ts +49 -0
- package/dist/types/preflight.d.ts.map +1 -0
- package/dist/types/preflight.js +8 -0
- package/dist/types/preflight.js.map +1 -0
- package/dist/types/report.d.ts +161 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +8 -0
- package/dist/types/report.js.map +1 -0
- package/dist/types/reviewer.d.ts +66 -0
- package/dist/types/reviewer.d.ts.map +1 -0
- package/dist/types/reviewer.js +5 -0
- package/dist/types/reviewer.js.map +1 -0
- package/dist/types/state.d.ts +124 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +20 -0
- package/dist/types/state.js.map +1 -0
- package/dist/types/task.d.ts +117 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +7 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/workspace_state.d.ts +125 -0
- package/dist/types/workspace_state.d.ts.map +1 -0
- package/dist/types/workspace_state.js +10 -0
- package/dist/types/workspace_state.js.map +1 -0
- package/envoi.config.json +191 -0
- package/package.json +52 -0
- package/relais/prompts/.gitkeep +0 -0
- package/relais/prompts/builder.system.txt +13 -0
- package/relais/prompts/builder.user.txt +15 -0
- package/relais/prompts/orchestrator.system.txt +37 -0
- package/relais/prompts/orchestrator.user.txt +34 -0
- package/relais/prompts/reviewer.system.txt +33 -0
- package/relais/prompts/reviewer.user.txt +35 -0
- package/relais/schemas/.gitkeep +0 -0
- package/relais/schemas/builder_result.schema.json +29 -0
- package/relais/schemas/report.schema.json +195 -0
- package/relais/schemas/reviewer_result.schema.json +70 -0
- package/relais/schemas/task.schema.json +155 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code CLI wrapper for invoking Claude with proper flags.
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to build CLI arguments, spawn processes, and parse responses.
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { ClaudeError, InterruptedError } from '../types/claude.js';
|
|
8
|
+
function isDebugEnabled() {
|
|
9
|
+
return process.env.ENVOI_DEBUG === '1';
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Builds CLI arguments array from config and invocation parameters.
|
|
13
|
+
*
|
|
14
|
+
* @param config - Claude Code CLI configuration
|
|
15
|
+
* @param invocation - Invocation parameters
|
|
16
|
+
* @returns Array of CLI arguments
|
|
17
|
+
*/
|
|
18
|
+
export function buildClaudeArgs(config, invocation) {
|
|
19
|
+
const args = [
|
|
20
|
+
'--print', // non-interactive output
|
|
21
|
+
'--output-format',
|
|
22
|
+
config.output_format,
|
|
23
|
+
'--max-turns',
|
|
24
|
+
invocation.maxTurns.toString(),
|
|
25
|
+
'--no-session-persistence', // always
|
|
26
|
+
'--permission-mode',
|
|
27
|
+
invocation.permissionMode,
|
|
28
|
+
'--model',
|
|
29
|
+
invocation.model,
|
|
30
|
+
];
|
|
31
|
+
// Add optional allowedTools flag
|
|
32
|
+
if (invocation.allowedTools) {
|
|
33
|
+
args.push('--allowedTools', invocation.allowedTools);
|
|
34
|
+
}
|
|
35
|
+
// Add optional system-prompt flag
|
|
36
|
+
if (invocation.systemPrompt) {
|
|
37
|
+
args.push('--system-prompt', invocation.systemPrompt);
|
|
38
|
+
}
|
|
39
|
+
// Add the prompt as the last argument
|
|
40
|
+
args.push(invocation.prompt);
|
|
41
|
+
return args;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parses the JSON response from Claude Code CLI and extracts the result.
|
|
45
|
+
*
|
|
46
|
+
* The CLI returns a JSON wrapper with format: { result: 'model output', ... }
|
|
47
|
+
* This function extracts the .result field as the actual model text.
|
|
48
|
+
*
|
|
49
|
+
* When the CLI returns an error response (e.g., error_max_turns), the result
|
|
50
|
+
* field may be missing. In such cases, this function returns an empty result
|
|
51
|
+
* so callers can handle the situation gracefully.
|
|
52
|
+
*
|
|
53
|
+
* @param stdout - Standard output from CLI process
|
|
54
|
+
* @returns Parsed result object with result field and optional subtype for errors
|
|
55
|
+
* @throws {Error} If JSON parsing fails
|
|
56
|
+
*/
|
|
57
|
+
function toNumberOrNull(value) {
|
|
58
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
59
|
+
}
|
|
60
|
+
function parseUsageShape(candidate) {
|
|
61
|
+
if (typeof candidate !== 'object' || candidate === null)
|
|
62
|
+
return null;
|
|
63
|
+
const usage = candidate;
|
|
64
|
+
const input = toNumberOrNull(usage.input_tokens) ??
|
|
65
|
+
toNumberOrNull(usage.prompt_tokens) ??
|
|
66
|
+
toNumberOrNull(usage.inputTokens);
|
|
67
|
+
const output = toNumberOrNull(usage.output_tokens) ??
|
|
68
|
+
toNumberOrNull(usage.completion_tokens) ??
|
|
69
|
+
toNumberOrNull(usage.outputTokens);
|
|
70
|
+
const total = toNumberOrNull(usage.total_tokens) ?? toNumberOrNull(usage.totalTokens);
|
|
71
|
+
const cacheCreation = toNumberOrNull(usage.cache_creation_input_tokens);
|
|
72
|
+
const cacheRead = toNumberOrNull(usage.cache_read_input_tokens);
|
|
73
|
+
const computedTotal = total ??
|
|
74
|
+
(input !== null && output !== null ? input + output : null);
|
|
75
|
+
const hasAnyValue = input !== null ||
|
|
76
|
+
output !== null ||
|
|
77
|
+
computedTotal !== null ||
|
|
78
|
+
cacheCreation !== null ||
|
|
79
|
+
cacheRead !== null;
|
|
80
|
+
if (!hasAnyValue)
|
|
81
|
+
return null;
|
|
82
|
+
return {
|
|
83
|
+
input_tokens: input,
|
|
84
|
+
output_tokens: output,
|
|
85
|
+
total_tokens: computedTotal,
|
|
86
|
+
cache_creation_input_tokens: cacheCreation,
|
|
87
|
+
cache_read_input_tokens: cacheRead,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function extractTokenUsage(raw) {
|
|
91
|
+
const candidates = [
|
|
92
|
+
raw.usage,
|
|
93
|
+
raw.token_usage,
|
|
94
|
+
raw.metrics,
|
|
95
|
+
raw.metrics?.usage,
|
|
96
|
+
raw.message?.usage,
|
|
97
|
+
];
|
|
98
|
+
for (const candidate of candidates) {
|
|
99
|
+
const usage = parseUsageShape(candidate);
|
|
100
|
+
if (usage)
|
|
101
|
+
return usage;
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
export function parseClaudeResponse(stdout) {
|
|
106
|
+
let parsed;
|
|
107
|
+
try {
|
|
108
|
+
parsed = JSON.parse(stdout);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
throw new Error(`Failed to parse JSON response: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
}
|
|
113
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
114
|
+
throw new Error('Parsed response is not an object');
|
|
115
|
+
}
|
|
116
|
+
const obj = parsed;
|
|
117
|
+
// Handle CLI error responses (e.g., error_max_turns) that lack a result field
|
|
118
|
+
// Return empty result so callers can handle based on subtype
|
|
119
|
+
if (typeof obj.result !== 'string') {
|
|
120
|
+
const subtype = typeof obj.subtype === 'string' ? obj.subtype : undefined;
|
|
121
|
+
const tokenUsage = extractTokenUsage(obj);
|
|
122
|
+
if (isDebugEnabled()) {
|
|
123
|
+
console.log(`[CLAUDE_DEBUG] No result field in response, subtype=${subtype}`);
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
result: '',
|
|
127
|
+
raw: parsed,
|
|
128
|
+
subtype,
|
|
129
|
+
tokenUsage,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
const tokenUsage = extractTokenUsage(obj);
|
|
133
|
+
return {
|
|
134
|
+
result: obj.result,
|
|
135
|
+
raw: parsed,
|
|
136
|
+
subtype: typeof obj.subtype === 'string' ? obj.subtype : undefined,
|
|
137
|
+
tokenUsage,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Invokes Claude Code CLI with the given configuration and invocation parameters.
|
|
142
|
+
*
|
|
143
|
+
* @param config - Claude Code CLI configuration
|
|
144
|
+
* @param invocation - Invocation parameters including prompt, model, etc.
|
|
145
|
+
* @returns Promise resolving to ClaudeResponse with parsed output
|
|
146
|
+
* @throws {ClaudeError} If invocation fails or times out
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```typescript
|
|
150
|
+
* const response = await invokeClaudeCode(config, {
|
|
151
|
+
* prompt: 'Hello, Claude!',
|
|
152
|
+
* maxTurns: 1,
|
|
153
|
+
* permissionMode: 'plan',
|
|
154
|
+
* model: 'claude-3-5-sonnet-20241022',
|
|
155
|
+
* timeout: 60000
|
|
156
|
+
* });
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
export async function invokeClaudeCode(config, invocation) {
|
|
160
|
+
// Short-circuit if already aborted
|
|
161
|
+
if (invocation.signal?.aborted) {
|
|
162
|
+
throw new InterruptedError('Claude Code invocation aborted by signal');
|
|
163
|
+
}
|
|
164
|
+
const startTime = Date.now();
|
|
165
|
+
const args = buildClaudeArgs(config, invocation);
|
|
166
|
+
return new Promise((resolve, reject) => {
|
|
167
|
+
let stdout = '';
|
|
168
|
+
let stderr = '';
|
|
169
|
+
let timeoutId = null;
|
|
170
|
+
let aborted = false;
|
|
171
|
+
let abortHandler = null;
|
|
172
|
+
let exited = false;
|
|
173
|
+
let killTimerId = null;
|
|
174
|
+
// Spawn the process
|
|
175
|
+
const child = spawn(config.command, args, {
|
|
176
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
177
|
+
});
|
|
178
|
+
if (isDebugEnabled()) {
|
|
179
|
+
console.log(`[CLAUDE_DEBUG] Spawned PID: ${child.pid}`);
|
|
180
|
+
}
|
|
181
|
+
// Close stdin: we always pass prompt via argv; prevents cli waiting on stdin
|
|
182
|
+
child.stdin?.end();
|
|
183
|
+
// Cleanup function to remove all listeners and timers
|
|
184
|
+
const cleanup = () => {
|
|
185
|
+
if (timeoutId) {
|
|
186
|
+
clearTimeout(timeoutId);
|
|
187
|
+
timeoutId = null;
|
|
188
|
+
}
|
|
189
|
+
if (killTimerId) {
|
|
190
|
+
clearTimeout(killTimerId);
|
|
191
|
+
killTimerId = null;
|
|
192
|
+
}
|
|
193
|
+
if (abortHandler && invocation.signal) {
|
|
194
|
+
invocation.signal.removeEventListener('abort', abortHandler);
|
|
195
|
+
abortHandler = null;
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
// Track if child has exited
|
|
199
|
+
child.on('exit', (code, signal) => {
|
|
200
|
+
if (isDebugEnabled()) {
|
|
201
|
+
console.log(`[CLAUDE_DEBUG] Exit: code=${code}, signal=${signal}`);
|
|
202
|
+
}
|
|
203
|
+
exited = true;
|
|
204
|
+
// Clear the SIGKILL escalation timer if child exited
|
|
205
|
+
if (killTimerId) {
|
|
206
|
+
clearTimeout(killTimerId);
|
|
207
|
+
killTimerId = null;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// Handle abort signal
|
|
211
|
+
if (invocation.signal) {
|
|
212
|
+
abortHandler = () => {
|
|
213
|
+
if (aborted)
|
|
214
|
+
return;
|
|
215
|
+
aborted = true;
|
|
216
|
+
cleanup();
|
|
217
|
+
child.kill('SIGTERM');
|
|
218
|
+
// Force kill after 1 second if still alive
|
|
219
|
+
killTimerId = setTimeout(() => {
|
|
220
|
+
if (!exited)
|
|
221
|
+
child.kill('SIGKILL');
|
|
222
|
+
}, 1000);
|
|
223
|
+
reject(new InterruptedError('Claude Code invocation aborted by signal'));
|
|
224
|
+
};
|
|
225
|
+
invocation.signal.addEventListener('abort', abortHandler, { once: true });
|
|
226
|
+
}
|
|
227
|
+
// Set up timeout
|
|
228
|
+
if (invocation.timeout > 0) {
|
|
229
|
+
timeoutId = setTimeout(() => {
|
|
230
|
+
cleanup();
|
|
231
|
+
child.kill('SIGTERM');
|
|
232
|
+
reject(new ClaudeError(`Claude Code CLI invocation timed out after ${invocation.timeout}ms`, 124, // Standard timeout exit code
|
|
233
|
+
stderr));
|
|
234
|
+
}, invocation.timeout);
|
|
235
|
+
}
|
|
236
|
+
// Capture stdout
|
|
237
|
+
child.stdout?.on('data', (data) => {
|
|
238
|
+
stdout += data.toString();
|
|
239
|
+
});
|
|
240
|
+
// Capture stderr
|
|
241
|
+
child.stderr?.on('data', (data) => {
|
|
242
|
+
stderr += data.toString();
|
|
243
|
+
});
|
|
244
|
+
// Handle process completion
|
|
245
|
+
child.on('close', (code) => {
|
|
246
|
+
// If we were aborted, error was already handled
|
|
247
|
+
if (aborted) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
cleanup();
|
|
251
|
+
const durationMs = Date.now() - startTime;
|
|
252
|
+
const exitCode = code ?? 0;
|
|
253
|
+
// If process was killed by timeout, error was already handled
|
|
254
|
+
if (code === null && !aborted) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
try {
|
|
258
|
+
// Parse the JSON response
|
|
259
|
+
const parsed = parseClaudeResponse(stdout);
|
|
260
|
+
// If result is empty and we have an error subtype, treat as failure
|
|
261
|
+
// Common subtypes: error_max_turns, error_during_execution
|
|
262
|
+
const isErrorSubtype = parsed.subtype?.startsWith('error_') ?? false;
|
|
263
|
+
const effectiveSuccess = exitCode === 0 && !isErrorSubtype;
|
|
264
|
+
resolve({
|
|
265
|
+
success: effectiveSuccess,
|
|
266
|
+
result: effectiveSuccess ? parsed.result : (parsed.result || null),
|
|
267
|
+
raw: parsed.raw,
|
|
268
|
+
exitCode,
|
|
269
|
+
durationMs,
|
|
270
|
+
stderr,
|
|
271
|
+
tokenUsage: parsed.tokenUsage,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
if (isDebugEnabled()) {
|
|
276
|
+
console.log(`[CLAUDE_DEBUG] Parse failed. stdout (first 2000 chars):\n${stdout.slice(0, 2000)}`);
|
|
277
|
+
}
|
|
278
|
+
reject(new ClaudeError(`Failed to parse Claude response: ${error instanceof Error ? error.message : String(error)}`, exitCode, stderr, error instanceof Error ? error : undefined));
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
// Handle process errors
|
|
282
|
+
child.on('error', (error) => {
|
|
283
|
+
if (aborted) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
cleanup();
|
|
287
|
+
reject(new ClaudeError(`Failed to spawn Claude Code CLI process: ${error.message}`, 1, stderr, error));
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/lib/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loading and validation utilities.
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to load, find, and validate Envoi config files.
|
|
5
|
+
*/
|
|
6
|
+
import type { EnvoiConfig } from '../types/config.js';
|
|
7
|
+
/** Default configuration file name */
|
|
8
|
+
export declare const CONFIG_FILE_NAME = "envoi.config.json";
|
|
9
|
+
export declare const LEGACY_CONFIG_NAME = "relais.config.json";
|
|
10
|
+
/**
|
|
11
|
+
* Error thrown when configuration loading or validation fails.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ConfigError extends Error {
|
|
14
|
+
readonly configPath?: string | undefined;
|
|
15
|
+
readonly cause?: Error | undefined;
|
|
16
|
+
constructor(message: string, configPath?: string | undefined, cause?: Error | undefined);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Searches for a configuration file by walking upward from the current directory.
|
|
20
|
+
* Stops at the filesystem root if not found.
|
|
21
|
+
*
|
|
22
|
+
* @returns Path to the config file if found, null otherwise
|
|
23
|
+
*/
|
|
24
|
+
export declare function findConfigFile(): Promise<string | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Gets the repository root directory (where the config file is located).
|
|
27
|
+
* If configPath is provided, returns its directory. Otherwise, searches upward
|
|
28
|
+
* from the current directory.
|
|
29
|
+
*
|
|
30
|
+
* @param configPath - Optional path to the config file. If provided, returns its directory.
|
|
31
|
+
* @returns Path to the repository root directory, or null if config not found
|
|
32
|
+
*/
|
|
33
|
+
export declare function getRepoRoot(configPath?: string): Promise<string | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Changes the current working directory to the repository root.
|
|
36
|
+
* This ensures that relative paths in config (workspace_dir, lockfile, etc.)
|
|
37
|
+
* resolve correctly regardless of where the command was invoked from.
|
|
38
|
+
*
|
|
39
|
+
* @param configPath - Optional path to the config file. If not provided, searches upward.
|
|
40
|
+
* @throws {ConfigError} If the config file cannot be found
|
|
41
|
+
*/
|
|
42
|
+
export declare function chdirToRepoRoot(configPath?: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Validates that an object conforms to the EnvoiConfig interface.
|
|
45
|
+
*
|
|
46
|
+
* This performs structural validation to ensure all required fields are present
|
|
47
|
+
* and have the expected types.
|
|
48
|
+
*
|
|
49
|
+
* @param config - The object to validate
|
|
50
|
+
* @returns True if the object is a valid EnvoiConfig
|
|
51
|
+
*/
|
|
52
|
+
export declare function validateConfig(config: unknown): config is EnvoiConfig;
|
|
53
|
+
/**
|
|
54
|
+
* Loads and validates an Envoi configuration file.
|
|
55
|
+
*
|
|
56
|
+
* @param configPath - Optional path to the config file. If not provided,
|
|
57
|
+
* searches upward for a known config file name.
|
|
58
|
+
* @returns The validated configuration object
|
|
59
|
+
* @throws {ConfigError} If the config file cannot be found, read, or is invalid
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* // Load from default location
|
|
64
|
+
* const config = await loadConfig();
|
|
65
|
+
*
|
|
66
|
+
* // Load from specific path
|
|
67
|
+
* const config = await loadConfig('/path/to/envoi.config.json');
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare function loadConfig(configPath?: string): Promise<EnvoiConfig>;
|
|
71
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQtD,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,sBAA2B,CAAC;AACzD,eAAO,MAAM,kBAAkB,uBAA0B,CAAC;AAE1D;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;aAGlB,UAAU,CAAC,EAAE,MAAM;aACnB,KAAK,CAAC,EAAE,KAAK;gBAF7B,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuB7D;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW7E;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASxE;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,WAAW,CA4NrE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAuC1E"}
|