@antistud/handrails-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/bin/handrails-rig.d.ts +9 -0
  2. package/dist/bin/handrails-rig.js +19 -0
  3. package/dist/bin/handrails-rig.js.map +1 -0
  4. package/dist/bin/handrails.d.ts +2 -0
  5. package/dist/bin/handrails.js +10 -0
  6. package/dist/bin/handrails.js.map +1 -0
  7. package/dist/src/bridge/daemon.d.ts +50 -0
  8. package/dist/src/bridge/daemon.js +319 -0
  9. package/dist/src/bridge/daemon.js.map +1 -0
  10. package/dist/src/claude/context-manager.d.ts +41 -0
  11. package/dist/src/claude/context-manager.js +184 -0
  12. package/dist/src/claude/context-manager.js.map +1 -0
  13. package/dist/src/claude/reader.d.ts +17 -0
  14. package/dist/src/claude/reader.js +186 -0
  15. package/dist/src/claude/reader.js.map +1 -0
  16. package/dist/src/cli/commands/config.d.ts +2 -0
  17. package/dist/src/cli/commands/config.js +59 -0
  18. package/dist/src/cli/commands/config.js.map +1 -0
  19. package/dist/src/cli/commands/context.d.ts +2 -0
  20. package/dist/src/cli/commands/context.js +158 -0
  21. package/dist/src/cli/commands/context.js.map +1 -0
  22. package/dist/src/cli/commands/daemon.d.ts +2 -0
  23. package/dist/src/cli/commands/daemon.js +29 -0
  24. package/dist/src/cli/commands/daemon.js.map +1 -0
  25. package/dist/src/cli/commands/init.d.ts +2 -0
  26. package/dist/src/cli/commands/init.js +197 -0
  27. package/dist/src/cli/commands/init.js.map +1 -0
  28. package/dist/src/cli/commands/login.d.ts +2 -0
  29. package/dist/src/cli/commands/login.js +87 -0
  30. package/dist/src/cli/commands/login.js.map +1 -0
  31. package/dist/src/cli/commands/rig.d.ts +2 -0
  32. package/dist/src/cli/commands/rig.js +49 -0
  33. package/dist/src/cli/commands/rig.js.map +1 -0
  34. package/dist/src/cli/commands/status.d.ts +2 -0
  35. package/dist/src/cli/commands/status.js +119 -0
  36. package/dist/src/cli/commands/status.js.map +1 -0
  37. package/dist/src/cli/commands/sync.d.ts +2 -0
  38. package/dist/src/cli/commands/sync.js +149 -0
  39. package/dist/src/cli/commands/sync.js.map +1 -0
  40. package/dist/src/cli/index.d.ts +2 -0
  41. package/dist/src/cli/index.js +62 -0
  42. package/dist/src/cli/index.js.map +1 -0
  43. package/dist/src/config/index.d.ts +20 -0
  44. package/dist/src/config/index.js +131 -0
  45. package/dist/src/config/index.js.map +1 -0
  46. package/dist/src/config/schema.d.ts +59 -0
  47. package/dist/src/config/schema.js +14 -0
  48. package/dist/src/config/schema.js.map +1 -0
  49. package/dist/src/handrails/auth.d.ts +15 -0
  50. package/dist/src/handrails/auth.js +80 -0
  51. package/dist/src/handrails/auth.js.map +1 -0
  52. package/dist/src/handrails/client.d.ts +100 -0
  53. package/dist/src/handrails/client.js +135 -0
  54. package/dist/src/handrails/client.js.map +1 -0
  55. package/dist/src/index.d.ts +5 -0
  56. package/dist/src/index.js +34 -0
  57. package/dist/src/index.js.map +1 -0
  58. package/dist/src/mcp/server.d.ts +10 -0
  59. package/dist/src/mcp/server.js +167 -0
  60. package/dist/src/mcp/server.js.map +1 -0
  61. package/dist/src/mcp/tools/context-tools.d.ts +8 -0
  62. package/dist/src/mcp/tools/context-tools.js +111 -0
  63. package/dist/src/mcp/tools/context-tools.js.map +1 -0
  64. package/dist/src/mcp/tools/sync-tools.d.ts +9 -0
  65. package/dist/src/mcp/tools/sync-tools.js +170 -0
  66. package/dist/src/mcp/tools/sync-tools.js.map +1 -0
  67. package/dist/src/runner/executor.d.ts +8 -0
  68. package/dist/src/runner/executor.js +39 -0
  69. package/dist/src/runner/executor.js.map +1 -0
  70. package/dist/src/runner/executors/claude-code.d.ts +7 -0
  71. package/dist/src/runner/executors/claude-code.js +247 -0
  72. package/dist/src/runner/executors/claude-code.js.map +1 -0
  73. package/dist/src/runner/executors/codex.d.ts +9 -0
  74. package/dist/src/runner/executors/codex.js +72 -0
  75. package/dist/src/runner/executors/codex.js.map +1 -0
  76. package/dist/src/runner/executors/opencode.d.ts +9 -0
  77. package/dist/src/runner/executors/opencode.js +71 -0
  78. package/dist/src/runner/executors/opencode.js.map +1 -0
  79. package/dist/src/runner/executors/types.d.ts +24 -0
  80. package/dist/src/runner/executors/types.js +27 -0
  81. package/dist/src/runner/executors/types.js.map +1 -0
  82. package/dist/src/runner/index.d.ts +34 -0
  83. package/dist/src/runner/index.js +234 -0
  84. package/dist/src/runner/index.js.map +1 -0
  85. package/dist/src/runner/logger.d.ts +14 -0
  86. package/dist/src/runner/logger.js +35 -0
  87. package/dist/src/runner/logger.js.map +1 -0
  88. package/dist/src/workflow/engine.d.ts +44 -0
  89. package/dist/src/workflow/engine.js +383 -0
  90. package/dist/src/workflow/engine.js.map +1 -0
  91. package/dist/tsconfig.tsbuildinfo +1 -0
  92. package/package.json +46 -0
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeWithClaudeCode = executeWithClaudeCode;
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
+ const types_1 = require("./types");
9
+ const logger_1 = require("../logger");
10
+ /**
11
+ * Execute a task using the locally installed Claude Code CLI.
12
+ *
13
+ * Spawns `claude` with streaming JSON output so we can follow along in real-time.
14
+ */
15
+ async function executeWithClaudeCode(input) {
16
+ const prompt = (0, types_1.buildPrompt)(input);
17
+ let mcpConfigPath = null;
18
+ return new Promise((resolve) => {
19
+ const chunks = [];
20
+ let stderr = '';
21
+ let finalResult = '';
22
+ const args = [
23
+ '-p', prompt,
24
+ '--system-prompt', input.systemPrompt,
25
+ '--output-format', 'stream-json',
26
+ '--verbose',
27
+ '--dangerously-skip-permissions',
28
+ ];
29
+ // Only restrict tools if explicitly specified
30
+ if (input.allowedTools) {
31
+ args.push('--allowedTools', input.allowedTools.join(','));
32
+ }
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
+ logger_1.logger.tool(`Spawning: claude -p ... --output-format stream-json --verbose --dangerously-skip-permissions`);
62
+ logger_1.logger.debug(`Allowed tools: ${input.allowedTools ? input.allowedTools.join(', ') : 'all (unrestricted)'}`);
63
+ logger_1.logger.debug(`Prompt length: ${prompt.length} chars`);
64
+ logger_1.logger.debug(`System prompt length: ${input.systemPrompt.length} chars`);
65
+ logger_1.logger.divider();
66
+ const child = (0, child_process_1.spawn)('claude', args, {
67
+ cwd: input.projectPath,
68
+ env: { ...process.env },
69
+ stdio: ['ignore', 'pipe', 'pipe'],
70
+ });
71
+ logger_1.logger.debug(`Process spawned: PID ${child.pid}`);
72
+ let lineBuf = '';
73
+ child.stdout.on('data', (data) => {
74
+ const text = data.toString();
75
+ chunks.push(text);
76
+ // Parse streaming JSON events line by line
77
+ lineBuf += text;
78
+ const lines = lineBuf.split('\n');
79
+ lineBuf = lines.pop() || '';
80
+ for (const line of lines) {
81
+ if (!line.trim())
82
+ continue;
83
+ try {
84
+ const event = JSON.parse(line);
85
+ logStreamEvent(event);
86
+ // Capture the final result text
87
+ if (event.type === 'result' && event.result) {
88
+ finalResult = typeof event.result === 'string'
89
+ ? event.result
90
+ : JSON.stringify(event.result);
91
+ }
92
+ }
93
+ catch {
94
+ // Not JSON, log raw
95
+ if (line.trim()) {
96
+ logger_1.logger.debug(`raw: ${line.trim()}`);
97
+ }
98
+ }
99
+ }
100
+ });
101
+ child.stderr.on('data', (data) => {
102
+ const text = data.toString();
103
+ stderr += text;
104
+ for (const line of text.split('\n').filter(Boolean)) {
105
+ logger_1.logger.debug(`stderr: ${line}`);
106
+ }
107
+ });
108
+ const cleanup = () => {
109
+ if (mcpConfigPath) {
110
+ try {
111
+ (0, fs_1.unlinkSync)(mcpConfigPath);
112
+ }
113
+ catch { /* ignore */ }
114
+ }
115
+ };
116
+ child.on('close', (code) => {
117
+ // Process any remaining buffer
118
+ if (lineBuf.trim()) {
119
+ try {
120
+ const event = JSON.parse(lineBuf);
121
+ logStreamEvent(event);
122
+ if (event.type === 'result' && event.result) {
123
+ finalResult = typeof event.result === 'string'
124
+ ? event.result
125
+ : JSON.stringify(event.result);
126
+ }
127
+ }
128
+ catch { /* ignore */ }
129
+ }
130
+ cleanup();
131
+ logger_1.logger.divider();
132
+ logger_1.logger.info(`Process exited with code ${code}`);
133
+ const output = finalResult || chunks.join('');
134
+ if (code === 0) {
135
+ resolve({ status: 'completed', output: output.trim() });
136
+ }
137
+ else {
138
+ resolve({
139
+ status: 'failed',
140
+ output: output.trim(),
141
+ error: stderr.trim() || `Claude Code exited with code ${code}`,
142
+ });
143
+ }
144
+ });
145
+ child.on('error', (err) => {
146
+ cleanup();
147
+ logger_1.logger.error(`Failed to spawn process: ${err.message}`);
148
+ resolve({
149
+ status: 'failed',
150
+ output: '',
151
+ error: `Failed to spawn Claude Code: ${err.message}. Is 'claude' installed and in PATH?`,
152
+ });
153
+ });
154
+ });
155
+ }
156
+ /**
157
+ * Log a streaming JSON event from the claude CLI in a human-readable way.
158
+ */
159
+ function logStreamEvent(event) {
160
+ switch (event.type) {
161
+ case 'system':
162
+ logger_1.logger.info(`${event.subtype || 'system'}: ${event.message || JSON.stringify(event)}`);
163
+ break;
164
+ case 'assistant': {
165
+ const msg = event.message;
166
+ if (!msg)
167
+ break;
168
+ if (msg.type === 'text' || typeof msg.content === 'string') {
169
+ const text = msg.content || msg.text || '';
170
+ if (text) {
171
+ // Show assistant text output
172
+ for (const line of text.split('\n')) {
173
+ console.log(` 💬 ${line}`);
174
+ }
175
+ }
176
+ }
177
+ else if (msg.type === 'tool_use' || msg.tool_name) {
178
+ const toolName = msg.tool_name || msg.name || 'unknown';
179
+ const toolInput = msg.tool_input || msg.input;
180
+ logger_1.logger.tool(`${toolName}`);
181
+ if (toolInput) {
182
+ const inputStr = typeof toolInput === 'string' ? toolInput : JSON.stringify(toolInput);
183
+ const preview = inputStr.length > 200 ? inputStr.substring(0, 200) + '...' : inputStr;
184
+ logger_1.logger.debug(` input: ${preview}`);
185
+ }
186
+ }
187
+ break;
188
+ }
189
+ case 'tool_result':
190
+ case 'tool_output': {
191
+ const toolName = event.tool_name || event.name || '';
192
+ const output = event.output || event.content || event.result || '';
193
+ const outputStr = typeof output === 'string' ? output : JSON.stringify(output);
194
+ const preview = outputStr.length > 300 ? outputStr.substring(0, 300) + '...' : outputStr;
195
+ if (toolName) {
196
+ logger_1.logger.tool(`${toolName} → ${preview}`);
197
+ }
198
+ else {
199
+ logger_1.logger.debug(`tool result: ${preview}`);
200
+ }
201
+ break;
202
+ }
203
+ case 'content_block_start': {
204
+ const block = event.content_block;
205
+ if (block?.type === 'tool_use') {
206
+ logger_1.logger.tool(`▶ ${block.name || 'tool'}`);
207
+ }
208
+ break;
209
+ }
210
+ case 'content_block_delta': {
211
+ const delta = event.delta;
212
+ if (delta?.type === 'text_delta' && delta.text) {
213
+ process.stdout.write(delta.text);
214
+ }
215
+ else if (delta?.type === 'input_json_delta' && delta.partial_json) {
216
+ // Tool input streaming - show periodically
217
+ }
218
+ break;
219
+ }
220
+ case 'content_block_stop':
221
+ // Block finished
222
+ break;
223
+ case 'message_start':
224
+ logger_1.logger.debug('Agent thinking...');
225
+ break;
226
+ case 'message_delta':
227
+ if (event.delta?.stop_reason) {
228
+ logger_1.logger.debug(`Stop reason: ${event.delta.stop_reason}`);
229
+ }
230
+ break;
231
+ case 'message_stop':
232
+ break;
233
+ case 'result':
234
+ logger_1.logger.success('Task complete');
235
+ break;
236
+ case 'error':
237
+ logger_1.logger.error(`${event.error?.message || event.message || JSON.stringify(event)}`);
238
+ break;
239
+ default:
240
+ // Log unknown event types for visibility
241
+ if (event.type) {
242
+ logger_1.logger.debug(`event: ${event.type} ${event.subtype || ''}`);
243
+ }
244
+ break;
245
+ }
246
+ }
247
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../src/runner/executors/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ExecutorInput, ExecutorResult } from './types';
2
+ /**
3
+ * Execute a task using OpenAI Codex CLI.
4
+ *
5
+ * Codex is OpenAI's terminal coding agent.
6
+ * Spawns `codex` in quiet/non-interactive mode with full-auto approval.
7
+ * https://github.com/openai/codex
8
+ */
9
+ export declare function executeWithCodex(input: ExecutorInput): Promise<ExecutorResult>;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeWithCodex = executeWithCodex;
4
+ const child_process_1 = require("child_process");
5
+ const types_1 = require("./types");
6
+ const logger_1 = require("../logger");
7
+ /**
8
+ * Execute a task using OpenAI Codex CLI.
9
+ *
10
+ * Codex is OpenAI's terminal coding agent.
11
+ * Spawns `codex` in quiet/non-interactive mode with full-auto approval.
12
+ * https://github.com/openai/codex
13
+ */
14
+ async function executeWithCodex(input) {
15
+ const prompt = (0, types_1.buildPrompt)(input);
16
+ // Prepend system prompt context into the prompt since codex
17
+ // uses --instructions for file-based instructions only
18
+ const fullPrompt = `${input.systemPrompt}\n\n---\n\n${prompt}`;
19
+ return new Promise((resolve) => {
20
+ const chunks = [];
21
+ let stderr = '';
22
+ const args = [
23
+ '--quiet',
24
+ '--approval-mode', 'full-auto',
25
+ fullPrompt,
26
+ ];
27
+ logger_1.logger.tool(`Spawning: codex --quiet --approval-mode full-auto "<${fullPrompt.length} chars>"`);
28
+ logger_1.logger.divider();
29
+ const child = (0, child_process_1.spawn)('codex', args, {
30
+ cwd: input.projectPath,
31
+ env: { ...process.env },
32
+ stdio: ['pipe', 'pipe', 'pipe'],
33
+ });
34
+ logger_1.logger.debug(`Process spawned: PID ${child.pid}`);
35
+ child.stdout.on('data', (data) => {
36
+ const text = data.toString();
37
+ chunks.push(text);
38
+ process.stdout.write(text);
39
+ });
40
+ child.stderr.on('data', (data) => {
41
+ const text = data.toString();
42
+ stderr += text;
43
+ for (const line of text.split('\n').filter(Boolean)) {
44
+ logger_1.logger.debug(`stderr: ${line}`);
45
+ }
46
+ });
47
+ child.on('close', (code) => {
48
+ logger_1.logger.divider();
49
+ logger_1.logger.info(`Process exited with code ${code}`);
50
+ const output = chunks.join('');
51
+ if (code === 0) {
52
+ resolve({ status: 'completed', output: output.trim() });
53
+ }
54
+ else {
55
+ resolve({
56
+ status: 'failed',
57
+ output: output.trim(),
58
+ error: stderr.trim() || `Codex exited with code ${code}`,
59
+ });
60
+ }
61
+ });
62
+ child.on('error', (err) => {
63
+ logger_1.logger.error(`Failed to spawn process: ${err.message}`);
64
+ resolve({
65
+ status: 'failed',
66
+ output: '',
67
+ error: `Failed to spawn Codex: ${err.message}. Is 'codex' installed and in PATH?`,
68
+ });
69
+ });
70
+ });
71
+ }
72
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../src/runner/executors/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ExecutorInput, ExecutorResult } from './types';
2
+ /**
3
+ * Execute a task using OpenCode CLI.
4
+ *
5
+ * OpenCode is an open-source terminal AI assistant.
6
+ * Spawns `opencode` with the task prompt in non-interactive mode.
7
+ * https://opencode.ai
8
+ */
9
+ export declare function executeWithOpenCode(input: ExecutorInput): Promise<ExecutorResult>;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeWithOpenCode = executeWithOpenCode;
4
+ const child_process_1 = require("child_process");
5
+ const types_1 = require("./types");
6
+ const logger_1 = require("../logger");
7
+ /**
8
+ * Execute a task using OpenCode CLI.
9
+ *
10
+ * OpenCode is an open-source terminal AI assistant.
11
+ * Spawns `opencode` with the task prompt in non-interactive mode.
12
+ * https://opencode.ai
13
+ */
14
+ async function executeWithOpenCode(input) {
15
+ const prompt = (0, types_1.buildPrompt)(input);
16
+ // Prepend system prompt context into the prompt since opencode
17
+ // doesn't have a separate --system-prompt flag
18
+ const fullPrompt = `${input.systemPrompt}\n\n---\n\n${prompt}`;
19
+ return new Promise((resolve) => {
20
+ const chunks = [];
21
+ let stderr = '';
22
+ const args = [
23
+ 'run',
24
+ '--prompt', fullPrompt,
25
+ ];
26
+ logger_1.logger.tool(`Spawning: opencode run --prompt "<${fullPrompt.length} chars>"`);
27
+ logger_1.logger.divider();
28
+ const child = (0, child_process_1.spawn)('opencode', args, {
29
+ cwd: input.projectPath,
30
+ env: { ...process.env },
31
+ stdio: ['pipe', 'pipe', 'pipe'],
32
+ });
33
+ logger_1.logger.debug(`Process spawned: PID ${child.pid}`);
34
+ child.stdout.on('data', (data) => {
35
+ const text = data.toString();
36
+ chunks.push(text);
37
+ process.stdout.write(text);
38
+ });
39
+ child.stderr.on('data', (data) => {
40
+ const text = data.toString();
41
+ stderr += text;
42
+ for (const line of text.split('\n').filter(Boolean)) {
43
+ logger_1.logger.debug(`stderr: ${line}`);
44
+ }
45
+ });
46
+ child.on('close', (code) => {
47
+ logger_1.logger.divider();
48
+ logger_1.logger.info(`Process exited with code ${code}`);
49
+ const output = chunks.join('');
50
+ if (code === 0) {
51
+ resolve({ status: 'completed', output: output.trim() });
52
+ }
53
+ else {
54
+ resolve({
55
+ status: 'failed',
56
+ output: output.trim(),
57
+ error: stderr.trim() || `OpenCode exited with code ${code}`,
58
+ });
59
+ }
60
+ });
61
+ child.on('error', (err) => {
62
+ logger_1.logger.error(`Failed to spawn process: ${err.message}`);
63
+ resolve({
64
+ status: 'failed',
65
+ output: '',
66
+ error: `Failed to spawn OpenCode: ${err.message}. Is 'opencode' installed and in PATH?`,
67
+ });
68
+ });
69
+ });
70
+ }
71
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../../src/runner/executors/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type RigType = 'claude-code' | 'opencode' | 'codex';
2
+ export interface ExecutorInput {
3
+ systemPrompt: string;
4
+ taskDescription: string;
5
+ priorMessages: Array<{
6
+ role: string;
7
+ content: string;
8
+ }>;
9
+ priorLearnings: string[];
10
+ projectPath: string;
11
+ allowedTools?: string[];
12
+ apiUrl?: string;
13
+ apiKey?: string;
14
+ }
15
+ export interface ExecutorResult {
16
+ status: 'completed' | 'failed';
17
+ output: string;
18
+ error?: string;
19
+ }
20
+ /**
21
+ * Build a plain-text prompt from the task payload.
22
+ * Shared across all executors.
23
+ */
24
+ export declare function buildPrompt(input: ExecutorInput): string;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildPrompt = buildPrompt;
4
+ /**
5
+ * Build a plain-text prompt from the task payload.
6
+ * Shared across all executors.
7
+ */
8
+ function buildPrompt(input) {
9
+ const parts = [];
10
+ parts.push(`## Task\n${input.taskDescription}`);
11
+ if (input.priorLearnings.length > 0) {
12
+ parts.push('\n## Prior Learnings');
13
+ for (const learning of input.priorLearnings) {
14
+ parts.push(`- ${learning}`);
15
+ }
16
+ }
17
+ if (input.priorMessages.length > 0) {
18
+ parts.push('\n## Prior Context');
19
+ for (const msg of input.priorMessages.slice(-5)) {
20
+ parts.push(`[${msg.role}]: ${msg.content.substring(0, 500)}`);
21
+ }
22
+ }
23
+ parts.push('\n## Instructions');
24
+ parts.push('Complete this task thoroughly. When done, provide a clear summary of what was accomplished.');
25
+ return parts.join('\n');
26
+ }
27
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/runner/executors/types.ts"],"names":[],"mappings":";;AAuBA,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"}
@@ -0,0 +1,34 @@
1
+ import { RigType } from './executor';
2
+ export interface RigOptions {
3
+ apiUrl: string;
4
+ rigKey: string;
5
+ projectPath: string;
6
+ heartbeatInterval?: number;
7
+ rigType?: RigType;
8
+ }
9
+ /**
10
+ * AgentRig — stateless executor.
11
+ *
12
+ * "Agents think. Rigs act. Harness keeps everything on track."
13
+ *
14
+ * Polls the Handrails server for tasks, executes them with local Claude Code,
15
+ * and reports results back. All state lives on the server.
16
+ */
17
+ export declare class AgentRig {
18
+ private http;
19
+ private rigId;
20
+ private rigKey;
21
+ private projectPath;
22
+ private heartbeatMs;
23
+ private running;
24
+ private currentSessionId;
25
+ private rigType;
26
+ private rigTypeOverride;
27
+ private heartbeatCount;
28
+ constructor(options: RigOptions);
29
+ start(): Promise<void>;
30
+ private heartbeat;
31
+ private executeTask;
32
+ private reportProgress;
33
+ private sleep;
34
+ }