@antistud/handrails-cli 0.1.7 → 0.1.9
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/dist/src/cli/commands/rig.js +22 -8
- package/dist/src/cli/commands/rig.js.map +1 -1
- package/dist/src/cli/index.js +2 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/runner/executors/claude-code.d.ts +2 -0
- package/dist/src/runner/executors/claude-code.js +5 -51
- package/dist/src/runner/executors/claude-code.js.map +1 -1
- package/dist/src/runner/executors/opencode.d.ts +15 -2
- package/dist/src/runner/executors/opencode.js +154 -10
- package/dist/src/runner/executors/opencode.js.map +1 -1
- package/dist/src/runner/executors/types.d.ts +0 -2
- package/dist/src/runner/executors/types.js.map +1 -1
- package/dist/src/runner/index.d.ts +1 -0
- package/dist/src/runner/index.js +18 -3
- package/dist/src/runner/index.js.map +1 -1
- package/dist/src/runner/preflight.d.ts +26 -0
- package/dist/src/runner/preflight.js +231 -0
- package/dist/src/runner/preflight.js.map +1 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +20 -0
- package/dist/src/version.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.registerRigCommand = registerRigCommand;
|
|
4
|
+
const path_1 = require("path");
|
|
4
5
|
const config_1 = require("../../config");
|
|
5
6
|
const runner_1 = require("../../runner");
|
|
7
|
+
const preflight_1 = require("../../runner/preflight");
|
|
8
|
+
const version_1 = require("../../version");
|
|
6
9
|
const VALID_RIG_TYPES = ['claude-code', 'opencode', 'codex'];
|
|
7
10
|
function registerRigCommand(program) {
|
|
8
11
|
program
|
|
@@ -12,7 +15,8 @@ function registerRigCommand(program) {
|
|
|
12
15
|
.option('--rig-key <key>', 'Rig key (from dashboard)')
|
|
13
16
|
.option('--rig-type <type>', `CLI executor to use (${VALID_RIG_TYPES.join(', ')})`)
|
|
14
17
|
.option('--project <path>', 'Project directory (default: current directory)', '.')
|
|
15
|
-
.option('--interval <ms>', 'Heartbeat interval in milliseconds
|
|
18
|
+
.option('--interval <ms>', 'Heartbeat interval in milliseconds (overrides server config)')
|
|
19
|
+
.option('--skip-preflight', 'Skip preflight checks')
|
|
16
20
|
.action(async (options) => {
|
|
17
21
|
const rigKey = options.rigKey || process.env.HANDRAILS_RIG_KEY;
|
|
18
22
|
if (!rigKey && !(0, config_1.isAuthenticated)()) {
|
|
@@ -27,20 +31,30 @@ function registerRigCommand(program) {
|
|
|
27
31
|
const config = (0, config_1.loadConfig)();
|
|
28
32
|
const apiUrl = options.apiUrl || process.env.HANDRAILS_API_URL || config.apiUrl;
|
|
29
33
|
const key = rigKey || config.apiKey;
|
|
34
|
+
const projectPath = (0, path_1.resolve)(options.project);
|
|
30
35
|
console.log('');
|
|
31
|
-
console.log(
|
|
36
|
+
console.log(` Handrails Rig v${(0, version_1.getVersion)()}`);
|
|
32
37
|
console.log(' ============');
|
|
33
38
|
console.log(' "Agents think. Rigs act. Harness keeps everything on track."');
|
|
34
39
|
console.log('');
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
// Run preflight checks
|
|
41
|
+
if (!options.skipPreflight) {
|
|
42
|
+
const preflight = await (0, preflight_1.runPreflight)({
|
|
43
|
+
apiUrl,
|
|
44
|
+
rigKey: key,
|
|
45
|
+
projectPath,
|
|
46
|
+
rigType,
|
|
47
|
+
});
|
|
48
|
+
if (!preflight.ok) {
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
console.log('');
|
|
52
|
+
}
|
|
39
53
|
const rig = new runner_1.AgentRig({
|
|
40
54
|
apiUrl,
|
|
41
55
|
rigKey: key,
|
|
42
|
-
projectPath
|
|
43
|
-
heartbeatInterval: parseInt(options.interval),
|
|
56
|
+
projectPath,
|
|
57
|
+
heartbeatInterval: options.interval ? parseInt(options.interval) : undefined,
|
|
44
58
|
rigType,
|
|
45
59
|
});
|
|
46
60
|
await rig.start();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rig.js","sourceRoot":"","sources":["../../../../src/cli/commands/rig.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"rig.js","sourceRoot":"","sources":["../../../../src/cli/commands/rig.ts"],"names":[],"mappings":";;AAUA,gDA4DC;AArED,+BAA+B;AAC/B,yCAA2D;AAC3D,yCAAwC;AACxC,sDAAsD;AACtD,2CAA2C;AAG3C,MAAM,eAAe,GAAc,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAExE,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,CAAC;SACrD,MAAM,CAAC,mBAAmB,EAAE,wBAAwB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SAClF,MAAM,CAAC,kBAAkB,EAAE,gDAAgD,EAAE,GAAG,CAAC;SACjF,MAAM,CAAC,iBAAiB,EAAE,8DAA8D,CAAC;SACzF,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC/D,IAAI,CAAC,MAAM,IAAI,CAAC,IAAA,wBAAe,GAAE,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,6FAA6F,CAAC,CAAC;YAC7G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAwB,OAAO,CAAC,OAAO,CAAC;QACrD,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,KAAK,CAAC,uBAAuB,OAAO,sBAAsB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,MAAM,CAAC;QAChF,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QACpC,MAAM,WAAW,GAAG,IAAA,cAAO,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAA,oBAAU,GAAE,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,uBAAuB;QACvB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAY,EAAC;gBACnC,MAAM;gBACN,MAAM,EAAE,GAAG;gBACX,WAAW;gBACX,OAAO;aACR,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,iBAAQ,CAAC;YACvB,MAAM;YACN,MAAM,EAAE,GAAG;YACX,WAAW;YACX,iBAAiB,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;YAC5E,OAAO;SACR,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -11,12 +11,13 @@ const daemon_1 = require("./commands/daemon");
|
|
|
11
11
|
const rig_1 = require("./commands/rig");
|
|
12
12
|
const sync_1 = require("./commands/sync");
|
|
13
13
|
const server_1 = require("../mcp/server");
|
|
14
|
+
const version_1 = require("../version");
|
|
14
15
|
function createProgram() {
|
|
15
16
|
const program = new commander_1.Command();
|
|
16
17
|
program
|
|
17
18
|
.name('handrails')
|
|
18
19
|
.description('Power tools for Claude Code — team memory, context sync, and session intelligence')
|
|
19
|
-
.version(
|
|
20
|
+
.version((0, version_1.getVersion)());
|
|
20
21
|
// Register all commands
|
|
21
22
|
(0, login_1.registerLoginCommand)(program);
|
|
22
23
|
(0, init_1.registerInitCommand)(program);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";;AAYA,sCAwDC;AApED,yCAAoC;AACpC,4CAAwD;AACxD,0CAAsD;AACtD,8CAA0D;AAC1D,gDAA4D;AAC5D,8CAA0D;AAC1D,8CAA0D;AAC1D,wCAAoD;AACpD,0CAAsD;AACtD,0CAAqD;AACrD,wCAAwC;AAExC,SAAgB,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,mFAAmF,CAAC;SAChG,OAAO,CAAC,IAAA,oBAAU,GAAE,CAAC,CAAC;IAEzB,wBAAwB;IACxB,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;IAC9B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAC7B,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;IAChC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;IAC5B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAE7B,uCAAuC;IACvC,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,IAAI,6BAAoB,EAAE,CAAC;QAC1C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,wDAAwD;IACxD,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,mBAAmB,EAAE,YAAY,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,+CAA+C;QAC/C,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;QAEhE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;YACpC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;SAC3B,CAAC;QAEF,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -3,5 +3,7 @@ import type { ExecutorInput, ExecutorResult } from './types';
|
|
|
3
3
|
* Execute a task using the locally installed Claude Code CLI.
|
|
4
4
|
*
|
|
5
5
|
* Spawns `claude` with streaming JSON output so we can follow along in real-time.
|
|
6
|
+
* MCP servers (handrails, playwright, etc.) are configured via .mcp.json in the project dir,
|
|
7
|
+
* set up by the preflight step — no per-task injection needed.
|
|
6
8
|
*/
|
|
7
9
|
export declare function executeWithClaudeCode(input: ExecutorInput): Promise<ExecutorResult>;
|
|
@@ -2,19 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.executeWithClaudeCode = executeWithClaudeCode;
|
|
4
4
|
const child_process_1 = require("child_process");
|
|
5
|
-
const fs_1 = require("fs");
|
|
6
|
-
const path_1 = require("path");
|
|
7
|
-
const os_1 = require("os");
|
|
8
5
|
const types_1 = require("./types");
|
|
9
6
|
const logger_1 = require("../logger");
|
|
10
7
|
/**
|
|
11
8
|
* Execute a task using the locally installed Claude Code CLI.
|
|
12
9
|
*
|
|
13
10
|
* Spawns `claude` with streaming JSON output so we can follow along in real-time.
|
|
11
|
+
* MCP servers (handrails, playwright, etc.) are configured via .mcp.json in the project dir,
|
|
12
|
+
* set up by the preflight step — no per-task injection needed.
|
|
14
13
|
*/
|
|
15
14
|
async function executeWithClaudeCode(input) {
|
|
16
15
|
const prompt = (0, types_1.buildPrompt)(input);
|
|
17
|
-
let mcpConfigPath = null;
|
|
18
16
|
return new Promise((resolve) => {
|
|
19
17
|
const chunks = [];
|
|
20
18
|
let stderr = '';
|
|
@@ -30,34 +28,6 @@ async function executeWithClaudeCode(input) {
|
|
|
30
28
|
if (input.allowedTools) {
|
|
31
29
|
args.push('--allowedTools', input.allowedTools.join(','));
|
|
32
30
|
}
|
|
33
|
-
// Generate MCP config so claude can call handrails tools via stdio proxy
|
|
34
|
-
if (input.apiUrl && input.apiKey) {
|
|
35
|
-
try {
|
|
36
|
-
// Resolve the handrails CLI: __dirname is dist/runner/executors, go up 3 to package root
|
|
37
|
-
const cliDistPath = (0, path_1.join)(__dirname, '..', '..', 'bin', 'handrails.js');
|
|
38
|
-
const mcpConfig = {
|
|
39
|
-
mcpServers: {
|
|
40
|
-
handrails: {
|
|
41
|
-
command: "node",
|
|
42
|
-
args: [cliDistPath, "serve"],
|
|
43
|
-
env: {
|
|
44
|
-
HANDRAILS_API_KEY: input.apiKey,
|
|
45
|
-
HANDRAILS_API_URL: input.apiUrl,
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
const tmpDir = (0, fs_1.mkdtempSync)((0, path_1.join)((0, os_1.tmpdir)(), 'handrails-rig-'));
|
|
51
|
-
mcpConfigPath = (0, path_1.join)(tmpDir, 'mcp-config.json');
|
|
52
|
-
(0, fs_1.writeFileSync)(mcpConfigPath, JSON.stringify(mcpConfig, null, 2));
|
|
53
|
-
args.push('--mcp-config', mcpConfigPath);
|
|
54
|
-
logger_1.logger.info(`MCP config: ${mcpConfigPath} (stdio via @handrails/cli serve)`);
|
|
55
|
-
logger_1.logger.debug(`MCP API URL: ${input.apiUrl}`);
|
|
56
|
-
}
|
|
57
|
-
catch (err) {
|
|
58
|
-
logger_1.logger.warn(`Failed to create MCP config: ${err.message}`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
31
|
logger_1.logger.tool(`Spawning: claude -p ... --output-format stream-json --verbose --dangerously-skip-permissions`);
|
|
62
32
|
logger_1.logger.debug(`Allowed tools: ${input.allowedTools ? input.allowedTools.join(', ') : 'all (unrestricted)'}`);
|
|
63
33
|
logger_1.logger.debug(`Prompt length: ${prompt.length} chars`);
|
|
@@ -105,14 +75,6 @@ async function executeWithClaudeCode(input) {
|
|
|
105
75
|
logger_1.logger.debug(`stderr: ${line}`);
|
|
106
76
|
}
|
|
107
77
|
});
|
|
108
|
-
const cleanup = () => {
|
|
109
|
-
if (mcpConfigPath) {
|
|
110
|
-
try {
|
|
111
|
-
(0, fs_1.unlinkSync)(mcpConfigPath);
|
|
112
|
-
}
|
|
113
|
-
catch { /* ignore */ }
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
78
|
child.on('close', (code) => {
|
|
117
79
|
// Process any remaining buffer
|
|
118
80
|
if (lineBuf.trim()) {
|
|
@@ -127,7 +89,6 @@ async function executeWithClaudeCode(input) {
|
|
|
127
89
|
}
|
|
128
90
|
catch { /* ignore */ }
|
|
129
91
|
}
|
|
130
|
-
cleanup();
|
|
131
92
|
logger_1.logger.divider();
|
|
132
93
|
logger_1.logger.info(`Process exited with code ${code}`);
|
|
133
94
|
const output = finalResult || chunks.join('');
|
|
@@ -143,7 +104,6 @@ async function executeWithClaudeCode(input) {
|
|
|
143
104
|
}
|
|
144
105
|
});
|
|
145
106
|
child.on('error', (err) => {
|
|
146
|
-
cleanup();
|
|
147
107
|
logger_1.logger.error(`Failed to spawn process: ${err.message}`);
|
|
148
108
|
resolve({
|
|
149
109
|
status: 'failed',
|
|
@@ -168,9 +128,8 @@ function logStreamEvent(event) {
|
|
|
168
128
|
if (msg.type === 'text' || typeof msg.content === 'string') {
|
|
169
129
|
const text = msg.content || msg.text || '';
|
|
170
130
|
if (text) {
|
|
171
|
-
// Show assistant text output
|
|
172
131
|
for (const line of text.split('\n')) {
|
|
173
|
-
console.log(`
|
|
132
|
+
console.log(` ${line}`);
|
|
174
133
|
}
|
|
175
134
|
}
|
|
176
135
|
}
|
|
@@ -193,7 +152,7 @@ function logStreamEvent(event) {
|
|
|
193
152
|
const outputStr = typeof output === 'string' ? output : JSON.stringify(output);
|
|
194
153
|
const preview = outputStr.length > 300 ? outputStr.substring(0, 300) + '...' : outputStr;
|
|
195
154
|
if (toolName) {
|
|
196
|
-
logger_1.logger.tool(`${toolName}
|
|
155
|
+
logger_1.logger.tool(`${toolName} -> ${preview}`);
|
|
197
156
|
}
|
|
198
157
|
else {
|
|
199
158
|
logger_1.logger.debug(`tool result: ${preview}`);
|
|
@@ -203,7 +162,7 @@ function logStreamEvent(event) {
|
|
|
203
162
|
case 'content_block_start': {
|
|
204
163
|
const block = event.content_block;
|
|
205
164
|
if (block?.type === 'tool_use') {
|
|
206
|
-
logger_1.logger.tool(
|
|
165
|
+
logger_1.logger.tool(`>> ${block.name || 'tool'}`);
|
|
207
166
|
}
|
|
208
167
|
break;
|
|
209
168
|
}
|
|
@@ -212,13 +171,9 @@ function logStreamEvent(event) {
|
|
|
212
171
|
if (delta?.type === 'text_delta' && delta.text) {
|
|
213
172
|
process.stdout.write(delta.text);
|
|
214
173
|
}
|
|
215
|
-
else if (delta?.type === 'input_json_delta' && delta.partial_json) {
|
|
216
|
-
// Tool input streaming - show periodically
|
|
217
|
-
}
|
|
218
174
|
break;
|
|
219
175
|
}
|
|
220
176
|
case 'content_block_stop':
|
|
221
|
-
// Block finished
|
|
222
177
|
break;
|
|
223
178
|
case 'message_start':
|
|
224
179
|
logger_1.logger.debug('Agent thinking...');
|
|
@@ -237,7 +192,6 @@ function logStreamEvent(event) {
|
|
|
237
192
|
logger_1.logger.error(`${event.error?.message || event.message || JSON.stringify(event)}`);
|
|
238
193
|
break;
|
|
239
194
|
default:
|
|
240
|
-
// Log unknown event types for visibility
|
|
241
195
|
if (event.type) {
|
|
242
196
|
logger_1.logger.debug(`event: ${event.type} ${event.subtype || ''}`);
|
|
243
197
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../src/runner/executors/claude-code.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../src/runner/executors/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
import type { ExecutorInput, ExecutorResult } from './types';
|
|
2
2
|
/**
|
|
3
|
-
* Execute a task using OpenCode CLI.
|
|
3
|
+
* Execute a task using the OpenCode CLI (anomalyco/opencode).
|
|
4
4
|
*
|
|
5
5
|
* OpenCode is an open-source terminal AI assistant.
|
|
6
|
-
* Spawns `opencode` with the task prompt in non-interactive mode.
|
|
7
6
|
* https://opencode.ai
|
|
7
|
+
*
|
|
8
|
+
* CLI reference (from `opencode run --help`):
|
|
9
|
+
* opencode run [message..] --format json --dangerously-skip-permissions --file <path>
|
|
10
|
+
*
|
|
11
|
+
* Key notes:
|
|
12
|
+
* - Message is a positional arg (not a flag)
|
|
13
|
+
* - No --system flag — system prompt must go into a file attachment
|
|
14
|
+
* - --file attaches file(s) as context alongside the message
|
|
15
|
+
* - --format json gives JSONL streaming events
|
|
16
|
+
* - --dangerously-skip-permissions auto-approves all tool use
|
|
17
|
+
*
|
|
18
|
+
* Because the combined system prompt + task can be thousands of chars with
|
|
19
|
+
* newlines and special characters, we write it to a temp file and pass it
|
|
20
|
+
* via --file to avoid argument parsing issues with yargs.
|
|
8
21
|
*/
|
|
9
22
|
export declare function executeWithOpenCode(input: ExecutorInput): Promise<ExecutorResult>;
|
|
@@ -2,28 +2,52 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.executeWithOpenCode = executeWithOpenCode;
|
|
4
4
|
const child_process_1 = require("child_process");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const os_1 = require("os");
|
|
5
8
|
const types_1 = require("./types");
|
|
6
9
|
const logger_1 = require("../logger");
|
|
7
10
|
/**
|
|
8
|
-
* Execute a task using OpenCode CLI.
|
|
11
|
+
* Execute a task using the OpenCode CLI (anomalyco/opencode).
|
|
9
12
|
*
|
|
10
13
|
* OpenCode is an open-source terminal AI assistant.
|
|
11
|
-
* Spawns `opencode` with the task prompt in non-interactive mode.
|
|
12
14
|
* https://opencode.ai
|
|
15
|
+
*
|
|
16
|
+
* CLI reference (from `opencode run --help`):
|
|
17
|
+
* opencode run [message..] --format json --dangerously-skip-permissions --file <path>
|
|
18
|
+
*
|
|
19
|
+
* Key notes:
|
|
20
|
+
* - Message is a positional arg (not a flag)
|
|
21
|
+
* - No --system flag — system prompt must go into a file attachment
|
|
22
|
+
* - --file attaches file(s) as context alongside the message
|
|
23
|
+
* - --format json gives JSONL streaming events
|
|
24
|
+
* - --dangerously-skip-permissions auto-approves all tool use
|
|
25
|
+
*
|
|
26
|
+
* Because the combined system prompt + task can be thousands of chars with
|
|
27
|
+
* newlines and special characters, we write it to a temp file and pass it
|
|
28
|
+
* via --file to avoid argument parsing issues with yargs.
|
|
13
29
|
*/
|
|
14
30
|
async function executeWithOpenCode(input) {
|
|
15
31
|
const prompt = (0, types_1.buildPrompt)(input);
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
const
|
|
32
|
+
// Write the full context (system prompt + task) to a temp file
|
|
33
|
+
// because opencode's yargs parser can't handle multi-line positional args
|
|
34
|
+
const fullContext = `# System Prompt\n\n${input.systemPrompt}\n\n---\n\n# Task\n\n${prompt}`;
|
|
35
|
+
const promptFile = (0, path_1.join)((0, os_1.tmpdir)(), `handrails-task-${process.pid}-${Date.now()}.md`);
|
|
36
|
+
(0, fs_1.writeFileSync)(promptFile, fullContext);
|
|
19
37
|
return new Promise((resolve) => {
|
|
20
38
|
const chunks = [];
|
|
21
39
|
let stderr = '';
|
|
40
|
+
let finalOutput = '';
|
|
41
|
+
// Short positional message + attach the full prompt as a file
|
|
22
42
|
const args = [
|
|
23
43
|
'run',
|
|
24
|
-
'--
|
|
44
|
+
'--format', 'json',
|
|
45
|
+
'--dangerously-skip-permissions',
|
|
46
|
+
'--file', promptFile,
|
|
47
|
+
'--', 'Complete the task described in the attached file. Follow the system prompt instructions.',
|
|
25
48
|
];
|
|
26
|
-
logger_1.logger.tool(`Spawning: opencode run --prompt
|
|
49
|
+
logger_1.logger.tool(`Spawning: opencode run --format json --dangerously-skip-permissions --file <prompt.md>`);
|
|
50
|
+
logger_1.logger.debug(`Prompt file: ${promptFile} (${fullContext.length} chars)`);
|
|
27
51
|
logger_1.logger.divider();
|
|
28
52
|
const child = (0, child_process_1.spawn)('opencode', args, {
|
|
29
53
|
cwd: input.projectPath,
|
|
@@ -31,10 +55,38 @@ async function executeWithOpenCode(input) {
|
|
|
31
55
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
32
56
|
});
|
|
33
57
|
logger_1.logger.debug(`Process spawned: PID ${child.pid}`);
|
|
58
|
+
let lineBuf = '';
|
|
34
59
|
child.stdout.on('data', (data) => {
|
|
35
60
|
const text = data.toString();
|
|
36
61
|
chunks.push(text);
|
|
37
|
-
|
|
62
|
+
// Parse streaming JSON events line by line
|
|
63
|
+
lineBuf += text;
|
|
64
|
+
const lines = lineBuf.split('\n');
|
|
65
|
+
lineBuf = lines.pop() || '';
|
|
66
|
+
for (const line of lines) {
|
|
67
|
+
if (!line.trim())
|
|
68
|
+
continue;
|
|
69
|
+
try {
|
|
70
|
+
const event = JSON.parse(line);
|
|
71
|
+
logOpenCodeEvent(event);
|
|
72
|
+
// Capture final output from step_finish or result events
|
|
73
|
+
if (event.type === 'step_finish' && event.output) {
|
|
74
|
+
finalOutput = typeof event.output === 'string'
|
|
75
|
+
? event.output
|
|
76
|
+
: JSON.stringify(event.output);
|
|
77
|
+
}
|
|
78
|
+
if (event.type === 'result' && event.result) {
|
|
79
|
+
finalOutput = typeof event.result === 'string'
|
|
80
|
+
? event.result
|
|
81
|
+
: JSON.stringify(event.result);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
if (line.trim()) {
|
|
86
|
+
logger_1.logger.debug(`raw: ${line.trim()}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
38
90
|
});
|
|
39
91
|
child.stderr.on('data', (data) => {
|
|
40
92
|
const text = data.toString();
|
|
@@ -44,9 +96,32 @@ async function executeWithOpenCode(input) {
|
|
|
44
96
|
}
|
|
45
97
|
});
|
|
46
98
|
child.on('close', (code) => {
|
|
99
|
+
// Clean up temp file
|
|
100
|
+
try {
|
|
101
|
+
(0, fs_1.unlinkSync)(promptFile);
|
|
102
|
+
}
|
|
103
|
+
catch { /* ignore */ }
|
|
104
|
+
// Process any remaining buffer
|
|
105
|
+
if (lineBuf.trim()) {
|
|
106
|
+
try {
|
|
107
|
+
const event = JSON.parse(lineBuf);
|
|
108
|
+
logOpenCodeEvent(event);
|
|
109
|
+
if (event.type === 'step_finish' && event.output) {
|
|
110
|
+
finalOutput = typeof event.output === 'string'
|
|
111
|
+
? event.output
|
|
112
|
+
: JSON.stringify(event.output);
|
|
113
|
+
}
|
|
114
|
+
if (event.type === 'result' && event.result) {
|
|
115
|
+
finalOutput = typeof event.result === 'string'
|
|
116
|
+
? event.result
|
|
117
|
+
: JSON.stringify(event.result);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch { /* ignore */ }
|
|
121
|
+
}
|
|
47
122
|
logger_1.logger.divider();
|
|
48
123
|
logger_1.logger.info(`Process exited with code ${code}`);
|
|
49
|
-
const output = chunks.join('');
|
|
124
|
+
const output = finalOutput || chunks.join('');
|
|
50
125
|
if (code === 0) {
|
|
51
126
|
resolve({ status: 'completed', output: output.trim() });
|
|
52
127
|
}
|
|
@@ -59,13 +134,82 @@ async function executeWithOpenCode(input) {
|
|
|
59
134
|
}
|
|
60
135
|
});
|
|
61
136
|
child.on('error', (err) => {
|
|
137
|
+
// Clean up temp file on error too
|
|
138
|
+
try {
|
|
139
|
+
(0, fs_1.unlinkSync)(promptFile);
|
|
140
|
+
}
|
|
141
|
+
catch { /* ignore */ }
|
|
62
142
|
logger_1.logger.error(`Failed to spawn process: ${err.message}`);
|
|
63
143
|
resolve({
|
|
64
144
|
status: 'failed',
|
|
65
145
|
output: '',
|
|
66
|
-
error: `Failed to spawn OpenCode: ${err.message}. Is 'opencode' installed
|
|
146
|
+
error: `Failed to spawn OpenCode: ${err.message}. Is 'opencode' installed? Install: curl -fsSL https://opencode.ai/install | bash`,
|
|
67
147
|
});
|
|
68
148
|
});
|
|
69
149
|
});
|
|
70
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Log an OpenCode streaming JSON event in a human-readable way.
|
|
153
|
+
*/
|
|
154
|
+
function logOpenCodeEvent(event) {
|
|
155
|
+
const type = event.type || '';
|
|
156
|
+
if (type === 'step_start') {
|
|
157
|
+
logger_1.logger.debug('Agent thinking...');
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (type === 'step_finish') {
|
|
161
|
+
const cost = event.cost ? ` ($${event.cost.toFixed(4)})` : '';
|
|
162
|
+
const tokens = event.tokens ? ` [${event.tokens.input || 0}→${event.tokens.output || 0} tokens]` : '';
|
|
163
|
+
logger_1.logger.debug(`Step finished: ${event.reason || 'done'}${tokens}${cost}`);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (type === 'message.part.updated') {
|
|
167
|
+
if (event.part?.type === 'thinking' || event.part?.type === 'reasoning') {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (event.part?.type === 'text' && event.part?.content) {
|
|
171
|
+
for (const line of event.part.content.split('\n')) {
|
|
172
|
+
console.log(` ${line}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (type === 'tool_use' || event.tool_name || event.name) {
|
|
178
|
+
const toolName = event.tool_name || event.name || 'tool';
|
|
179
|
+
const state = event.state || '';
|
|
180
|
+
if (state === 'running' || !state) {
|
|
181
|
+
logger_1.logger.tool(`${toolName}`);
|
|
182
|
+
}
|
|
183
|
+
else if (state === 'completed') {
|
|
184
|
+
logger_1.logger.debug(`${toolName} completed`);
|
|
185
|
+
}
|
|
186
|
+
else if (state === 'error') {
|
|
187
|
+
logger_1.logger.error(`${toolName} failed: ${event.error || ''}`);
|
|
188
|
+
}
|
|
189
|
+
if (event.input) {
|
|
190
|
+
const inputStr = typeof event.input === 'string' ? event.input : JSON.stringify(event.input);
|
|
191
|
+
const preview = inputStr.length > 200 ? inputStr.substring(0, 200) + '...' : inputStr;
|
|
192
|
+
logger_1.logger.debug(` input: ${preview}`);
|
|
193
|
+
}
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (type === 'tool_result' || type === 'tool_output') {
|
|
197
|
+
const output = event.output || event.content || event.result || '';
|
|
198
|
+
const outputStr = typeof output === 'string' ? output : JSON.stringify(output);
|
|
199
|
+
const preview = outputStr.length > 300 ? outputStr.substring(0, 300) + '...' : outputStr;
|
|
200
|
+
logger_1.logger.debug(`tool result: ${preview}`);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (type === 'error') {
|
|
204
|
+
logger_1.logger.error(`${event.error?.message || event.message || JSON.stringify(event)}`);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (type === 'result') {
|
|
208
|
+
logger_1.logger.success('Task complete');
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (type) {
|
|
212
|
+
logger_1.logger.debug(`event: ${type}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
71
215
|
//# sourceMappingURL=opencode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../../src/runner/executors/opencode.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../../src/runner/executors/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/runner/executors/types.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/runner/executors/types.ts"],"names":[],"mappings":";;AAqBA,kCAuBC;AA3BD;;;GAGG;AACH,SAAgB,WAAW,CAAC,KAAoB;IAC9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IAEhD,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;IAE1G,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/src/runner/index.js
CHANGED
|
@@ -28,8 +28,9 @@ class AgentRig {
|
|
|
28
28
|
this.heartbeatMs = options.heartbeatInterval || 10000;
|
|
29
29
|
this.rigType = options.rigType || 'claude-code';
|
|
30
30
|
this.rigTypeOverride = !!options.rigType;
|
|
31
|
+
this.heartbeatIntervalOverride = !!options.heartbeatInterval;
|
|
31
32
|
this.http = axios_1.default.create({
|
|
32
|
-
baseURL: options.apiUrl,
|
|
33
|
+
baseURL: options.apiUrl.replace(/\/+$/, ''),
|
|
33
34
|
headers: { 'Content-Type': 'application/json' },
|
|
34
35
|
timeout: 30000,
|
|
35
36
|
});
|
|
@@ -53,6 +54,14 @@ class AgentRig {
|
|
|
53
54
|
}
|
|
54
55
|
async start() {
|
|
55
56
|
this.running = true;
|
|
57
|
+
// Do an initial heartbeat to sync server-configured settings (heartbeat_interval, rig_type)
|
|
58
|
+
// before we log the startup banner — so the banner shows accurate values
|
|
59
|
+
try {
|
|
60
|
+
await this.heartbeat();
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
logger_1.logger.debug(`Initial heartbeat: ${err.message}`);
|
|
64
|
+
}
|
|
56
65
|
logger_1.logger.section('Rig Starting');
|
|
57
66
|
logger_1.logger.info(`Rig ID: ${this.rigId}`);
|
|
58
67
|
logger_1.logger.info(`Rig type: ${this.rigType}`);
|
|
@@ -96,6 +105,14 @@ class AgentRig {
|
|
|
96
105
|
}
|
|
97
106
|
this.rigType = response.data.rig_type;
|
|
98
107
|
}
|
|
108
|
+
// Server sends heartbeat_interval (seconds) — adjust polling rate dynamically
|
|
109
|
+
if (response.data.heartbeat_interval && !this.heartbeatIntervalOverride) {
|
|
110
|
+
const serverIntervalMs = response.data.heartbeat_interval * 1000;
|
|
111
|
+
if (serverIntervalMs !== this.heartbeatMs) {
|
|
112
|
+
logger_1.logger.info(`Heartbeat interval updated by server: ${this.heartbeatMs / 1000}s → ${response.data.heartbeat_interval}s`);
|
|
113
|
+
this.heartbeatMs = serverIntervalMs;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
99
116
|
const task = response.data.task;
|
|
100
117
|
if (!task)
|
|
101
118
|
return;
|
|
@@ -159,8 +176,6 @@ class AgentRig {
|
|
|
159
176
|
priorMessages: task.prior_messages,
|
|
160
177
|
priorLearnings: task.prior_learnings,
|
|
161
178
|
projectPath: this.projectPath,
|
|
162
|
-
apiUrl: this.http.defaults.baseURL,
|
|
163
|
-
apiKey: this.rigKey,
|
|
164
179
|
});
|
|
165
180
|
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
166
181
|
logger_1.logger.sectionEnd();
|