@cluesmith/codev 2.0.3 → 2.0.6
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/dashboard/dist/assets/index-B-s8BA2l.js +135 -0
- package/dashboard/dist/assets/index-B-s8BA2l.js.map +1 -0
- package/dashboard/dist/assets/index-DB2AxRP7.css +32 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +31 -13
- package/dist/agent-farm/cli.js.map +1 -1
- package/dist/agent-farm/commands/attach.d.ts +19 -0
- package/dist/agent-farm/commands/attach.d.ts.map +1 -1
- package/dist/agent-farm/commands/attach.js +172 -12
- package/dist/agent-farm/commands/attach.js.map +1 -1
- package/dist/agent-farm/commands/send.d.ts +22 -2
- package/dist/agent-farm/commands/send.d.ts.map +1 -1
- package/dist/agent-farm/commands/send.js +97 -178
- package/dist/agent-farm/commands/send.js.map +1 -1
- package/dist/agent-farm/commands/spawn-roles.d.ts +3 -9
- package/dist/agent-farm/commands/spawn-roles.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn-roles.js +14 -53
- package/dist/agent-farm/commands/spawn-roles.js.map +1 -1
- package/dist/agent-farm/commands/spawn-worktree.d.ts +10 -16
- package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn-worktree.js +24 -5
- package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
- package/dist/agent-farm/commands/spawn.d.ts +8 -6
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +180 -66
- package/dist/agent-farm/commands/spawn.js.map +1 -1
- package/dist/agent-farm/commands/status.d.ts.map +1 -1
- package/dist/agent-farm/commands/status.js +1 -12
- package/dist/agent-farm/commands/status.js.map +1 -1
- package/dist/agent-farm/lib/tower-client.d.ts +16 -6
- package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
- package/dist/agent-farm/lib/tower-client.js +25 -0
- package/dist/agent-farm/lib/tower-client.js.map +1 -1
- package/dist/agent-farm/servers/overview.d.ts +111 -0
- package/dist/agent-farm/servers/overview.d.ts.map +1 -0
- package/dist/agent-farm/servers/overview.js +385 -0
- package/dist/agent-farm/servers/overview.js.map +1 -0
- package/dist/agent-farm/servers/tower-instances.d.ts +1 -3
- package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-instances.js +10 -13
- package/dist/agent-farm/servers/tower-instances.js.map +1 -1
- package/dist/agent-farm/servers/tower-messages.d.ts +87 -0
- package/dist/agent-farm/servers/tower-messages.d.ts.map +1 -0
- package/dist/agent-farm/servers/tower-messages.js +202 -0
- package/dist/agent-farm/servers/tower-messages.js.map +1 -0
- package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-routes.js +164 -17
- package/dist/agent-farm/servers/tower-routes.js.map +1 -1
- package/dist/agent-farm/servers/tower-server.js +27 -2
- package/dist/agent-farm/servers/tower-server.js.map +1 -1
- package/dist/agent-farm/servers/tower-terminals.d.ts +8 -2
- package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-terminals.js +125 -80
- package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
- package/dist/agent-farm/servers/tower-types.d.ts +0 -2
- package/dist/agent-farm/servers/tower-types.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-websocket.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-websocket.js +25 -4
- package/dist/agent-farm/servers/tower-websocket.js.map +1 -1
- package/dist/agent-farm/types.d.ts +3 -4
- package/dist/agent-farm/types.d.ts.map +1 -1
- package/dist/agent-farm/utils/agent-names.d.ts +85 -0
- package/dist/agent-farm/utils/agent-names.d.ts.map +1 -0
- package/dist/agent-farm/utils/agent-names.js +140 -0
- package/dist/agent-farm/utils/agent-names.js.map +1 -0
- package/dist/agent-farm/utils/message-format.d.ts +17 -0
- package/dist/agent-farm/utils/message-format.d.ts.map +1 -0
- package/dist/agent-farm/utils/message-format.js +41 -0
- package/dist/agent-farm/utils/message-format.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +26 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +1 -13
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/consult/index.d.ts +25 -1
- package/dist/commands/consult/index.d.ts.map +1 -1
- package/dist/commands/consult/index.js +251 -39
- package/dist/commands/consult/index.js.map +1 -1
- package/dist/commands/consult/metrics.d.ts +90 -0
- package/dist/commands/consult/metrics.d.ts.map +1 -0
- package/dist/commands/consult/metrics.js +203 -0
- package/dist/commands/consult/metrics.js.map +1 -0
- package/dist/commands/consult/stats.d.ts +18 -0
- package/dist/commands/consult/stats.d.ts.map +1 -0
- package/dist/commands/consult/stats.js +150 -0
- package/dist/commands/consult/stats.js.map +1 -0
- package/dist/commands/consult/usage-extractor.d.ts +38 -0
- package/dist/commands/consult/usage-extractor.d.ts.map +1 -0
- package/dist/commands/consult/usage-extractor.js +99 -0
- package/dist/commands/consult/usage-extractor.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +5 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -13
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/porch/next.d.ts.map +1 -1
- package/dist/commands/porch/next.js +53 -62
- package/dist/commands/porch/next.js.map +1 -1
- package/dist/commands/porch/prompts.d.ts +10 -1
- package/dist/commands/porch/prompts.d.ts.map +1 -1
- package/dist/commands/porch/prompts.js +50 -26
- package/dist/commands/porch/prompts.js.map +1 -1
- package/dist/commands/porch/protocol.js +2 -2
- package/dist/commands/porch/state.d.ts.map +1 -1
- package/dist/commands/porch/state.js +3 -1
- package/dist/commands/porch/state.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +0 -10
- package/dist/commands/update.js.map +1 -1
- package/dist/lib/github.d.ts +81 -0
- package/dist/lib/github.d.ts.map +1 -0
- package/dist/lib/github.js +141 -0
- package/dist/lib/github.js.map +1 -0
- package/dist/lib/scaffold.d.ts +0 -21
- package/dist/lib/scaffold.d.ts.map +1 -1
- package/dist/lib/scaffold.js +0 -57
- package/dist/lib/scaffold.js.map +1 -1
- package/dist/terminal/index.d.ts +14 -0
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +12 -0
- package/dist/terminal/index.js.map +1 -1
- package/dist/terminal/pty-manager.d.ts.map +1 -1
- package/dist/terminal/pty-manager.js +7 -4
- package/dist/terminal/pty-manager.js.map +1 -1
- package/dist/terminal/pty-session.js +3 -3
- package/dist/terminal/pty-session.js.map +1 -1
- package/dist/terminal/session-manager.d.ts +64 -0
- package/dist/terminal/session-manager.d.ts.map +1 -1
- package/dist/terminal/session-manager.js +299 -10
- package/dist/terminal/session-manager.js.map +1 -1
- package/dist/terminal/shellper-client.d.ts +2 -1
- package/dist/terminal/shellper-client.d.ts.map +1 -1
- package/dist/terminal/shellper-client.js +4 -2
- package/dist/terminal/shellper-client.js.map +1 -1
- package/dist/terminal/shellper-main.js +33 -4
- package/dist/terminal/shellper-main.js.map +1 -1
- package/dist/terminal/shellper-process.d.ts +24 -7
- package/dist/terminal/shellper-process.d.ts.map +1 -1
- package/dist/terminal/shellper-process.js +139 -36
- package/dist/terminal/shellper-process.js.map +1 -1
- package/dist/terminal/shellper-protocol.d.ts +1 -0
- package/dist/terminal/shellper-protocol.d.ts.map +1 -1
- package/dist/terminal/shellper-protocol.js.map +1 -1
- package/package.json +4 -1
- package/skeleton/.claude/skills/af/SKILL.md +7 -7
- package/skeleton/.claude/skills/consult/SKILL.md +1 -1
- package/skeleton/builders.md +2 -2
- package/skeleton/maintain/.gitkeep +1 -1
- package/skeleton/porch/prompts/specify.md +1 -1
- package/skeleton/protocols/bugfix/prompts/pr.md +15 -4
- package/skeleton/protocols/experiment/protocol.md +17 -17
- package/skeleton/protocols/maintain/prompts/audit.md +2 -2
- package/skeleton/protocols/maintain/prompts/sync.md +1 -1
- package/skeleton/protocols/maintain/prompts/verify.md +1 -1
- package/skeleton/protocols/maintain/protocol.md +8 -9
- package/skeleton/protocols/maintain/templates/maintenance-run.md +2 -2
- package/skeleton/protocols/spir/protocol.json +5 -5
- package/skeleton/protocols/spir/protocol.md +8 -8
- package/skeleton/protocols/tick/protocol.md +31 -31
- package/skeleton/resources/commands/agent-farm.md +14 -14
- package/skeleton/resources/commands/codev.md +0 -1
- package/skeleton/resources/commands/consult.md +3 -3
- package/skeleton/resources/spikes.md +3 -3
- package/skeleton/resources/workflow-reference.md +14 -14
- package/skeleton/roles/architect.md +25 -25
- package/skeleton/roles/builder.md +1 -1
- package/skeleton/roles/consultant.md +6 -0
- package/skeleton/templates/AGENTS.md +5 -5
- package/skeleton/templates/CLAUDE.md +5 -5
- package/skeleton/templates/lifecycle.md +9 -9
- package/templates/open.html +6 -3
- package/templates/tower.html +1 -41
- package/dashboard/dist/assets/index-4n9zpWLY.css +0 -32
- package/dashboard/dist/assets/index-UsH9ixz1.js +0 -136
- package/dashboard/dist/assets/index-UsH9ixz1.js.map +0 -1
- package/dist/agent-farm/utils/gate-status.d.ts +0 -16
- package/dist/agent-farm/utils/gate-status.d.ts.map +0 -1
- package/dist/agent-farm/utils/gate-status.js +0 -79
- package/dist/agent-farm/utils/gate-status.js.map +0 -1
- package/skeleton/templates/projectlist-archive.md +0 -21
- package/skeleton/templates/projectlist.md +0 -147
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Send command - send
|
|
2
|
+
* Send command - send messages to agents via Tower POST /api/send endpoint.
|
|
3
|
+
* Spec 0110: Messaging Infrastructure — Phase 4
|
|
4
|
+
*
|
|
5
|
+
* Delegates address resolution, message formatting, and terminal writing
|
|
6
|
+
* to the Tower server. The CLI handles file reading, workspace detection,
|
|
7
|
+
* and argument parsing.
|
|
3
8
|
*/
|
|
4
9
|
import { readFileSync } from 'node:fs';
|
|
5
10
|
import { existsSync } from 'node:fs';
|
|
@@ -7,91 +12,12 @@ import { dirname, join } from 'node:path';
|
|
|
7
12
|
import { logger, fatal } from '../utils/logger.js';
|
|
8
13
|
import { loadState } from '../state.js';
|
|
9
14
|
import { TowerClient } from '../lib/tower-client.js';
|
|
10
|
-
import { getConfig } from '../utils/index.js';
|
|
11
15
|
const MAX_FILE_SIZE = 48 * 1024; // 48KB limit per spec
|
|
12
|
-
/**
|
|
13
|
-
* Format message from architect to builder
|
|
14
|
-
*/
|
|
15
|
-
function formatArchitectMessage(message, fileContent, raw = false) {
|
|
16
|
-
let content = message;
|
|
17
|
-
if (fileContent) {
|
|
18
|
-
content += '\n\nAttached content:\n```\n' + fileContent + '\n```';
|
|
19
|
-
}
|
|
20
|
-
if (raw) {
|
|
21
|
-
return content;
|
|
22
|
-
}
|
|
23
|
-
// Structured format helps Claude identify Architect instructions
|
|
24
|
-
const timestamp = new Date().toISOString();
|
|
25
|
-
return `### [ARCHITECT INSTRUCTION | ${timestamp}] ###
|
|
26
|
-
${content}
|
|
27
|
-
###############################`;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Format message from builder to architect
|
|
31
|
-
*/
|
|
32
|
-
function formatBuilderMessage(builderId, message, fileContent, raw = false) {
|
|
33
|
-
let content = message;
|
|
34
|
-
if (fileContent) {
|
|
35
|
-
content += '\n\nAttached content:\n```\n' + fileContent + '\n```';
|
|
36
|
-
}
|
|
37
|
-
if (raw) {
|
|
38
|
-
return content;
|
|
39
|
-
}
|
|
40
|
-
// Structured format helps Claude identify Builder messages
|
|
41
|
-
const timestamp = new Date().toISOString();
|
|
42
|
-
return `### [BUILDER ${builderId} MESSAGE | ${timestamp}] ###
|
|
43
|
-
${content}
|
|
44
|
-
###############################`;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Send a message to a specific builder via Tower API
|
|
48
|
-
*/
|
|
49
|
-
async function sendToBuilder(builderId, message, options) {
|
|
50
|
-
const state = loadState();
|
|
51
|
-
const builder = state.builders.find((b) => b.id === builderId);
|
|
52
|
-
if (!builder) {
|
|
53
|
-
throw new Error(`Builder ${builderId} not found. Use 'af status' to see active builders.`);
|
|
54
|
-
}
|
|
55
|
-
if (!builder.terminalId) {
|
|
56
|
-
throw new Error(`Builder ${builderId} has no terminal session.`);
|
|
57
|
-
}
|
|
58
|
-
const client = new TowerClient();
|
|
59
|
-
const towerRunning = await client.isRunning();
|
|
60
|
-
if (!towerRunning) {
|
|
61
|
-
throw new Error('Tower is not running. Start it with: af tower start');
|
|
62
|
-
}
|
|
63
|
-
// Optional: Send Ctrl+C first to interrupt any running process
|
|
64
|
-
if (options.interrupt) {
|
|
65
|
-
await client.writeTerminal(builder.terminalId, '\x03'); // Ctrl+C
|
|
66
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
67
|
-
}
|
|
68
|
-
// Load file content if specified
|
|
69
|
-
let fileContent;
|
|
70
|
-
if (options.file) {
|
|
71
|
-
if (!existsSync(options.file)) {
|
|
72
|
-
throw new Error(`File not found: ${options.file}`);
|
|
73
|
-
}
|
|
74
|
-
const fileBuffer = readFileSync(options.file);
|
|
75
|
-
if (fileBuffer.length > MAX_FILE_SIZE) {
|
|
76
|
-
throw new Error(`File too large: ${fileBuffer.length} bytes (max ${MAX_FILE_SIZE} bytes / 48KB)`);
|
|
77
|
-
}
|
|
78
|
-
fileContent = fileBuffer.toString('utf-8');
|
|
79
|
-
}
|
|
80
|
-
// Format the message
|
|
81
|
-
const formattedMessage = formatArchitectMessage(message, fileContent, options.raw);
|
|
82
|
-
// Send via Tower API
|
|
83
|
-
await client.writeTerminal(builder.terminalId, formattedMessage);
|
|
84
|
-
// Send Enter to submit (unless --no-enter)
|
|
85
|
-
if (!options.noEnter) {
|
|
86
|
-
await client.writeTerminal(builder.terminalId, '\r');
|
|
87
|
-
}
|
|
88
|
-
logger.debug(`Sent to ${builderId}: ${message.substring(0, 50)}...`);
|
|
89
|
-
}
|
|
90
16
|
/**
|
|
91
17
|
* Detect workspace root from CWD by walking up to find .git or af-config.json.
|
|
92
18
|
* Builder worktrees are at .builders/<id>/ which is inside the workspace root.
|
|
93
19
|
*/
|
|
94
|
-
function detectWorkspaceRoot() {
|
|
20
|
+
export function detectWorkspaceRoot() {
|
|
95
21
|
let dir = process.cwd();
|
|
96
22
|
// If inside .builders/<id>/, the workspace root is two levels up
|
|
97
23
|
const buildersMatch = dir.match(/^(.+?)\/\.builders\/[^/]+/);
|
|
@@ -109,65 +35,56 @@ function detectWorkspaceRoot() {
|
|
|
109
35
|
return null;
|
|
110
36
|
}
|
|
111
37
|
/**
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
* We query the Tower's project status endpoint to find the architect terminal.
|
|
38
|
+
* Detect the current builder ID from worktree path.
|
|
39
|
+
* Looks up the canonical builder ID from state.db by matching worktree path.
|
|
40
|
+
* Falls back to the worktree directory name if no match in state.db.
|
|
41
|
+
* Returns null if not in a builder worktree.
|
|
117
42
|
*/
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
if (
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
43
|
+
export function detectCurrentBuilderId() {
|
|
44
|
+
const cwd = process.cwd();
|
|
45
|
+
// Builder worktrees are at .builders/<dir-name>/
|
|
46
|
+
const match = cwd.match(/\.builders\/([^/]+)/);
|
|
47
|
+
if (!match)
|
|
48
|
+
return null;
|
|
49
|
+
const worktreeDirName = match[1];
|
|
50
|
+
// Look up the canonical builder ID from state.db by matching worktree path
|
|
51
|
+
const state = loadState();
|
|
52
|
+
const builder = state.builders.find(b => {
|
|
53
|
+
if (!b.worktree)
|
|
54
|
+
return false;
|
|
55
|
+
// Match on the worktree directory name (last segment of the path)
|
|
56
|
+
const builderWorktreeDir = b.worktree.split('/').pop();
|
|
57
|
+
return builderWorktreeDir === worktreeDirName;
|
|
58
|
+
});
|
|
59
|
+
return builder ? builder.id : worktreeDirName;
|
|
129
60
|
}
|
|
130
61
|
/**
|
|
131
|
-
*
|
|
62
|
+
* Read file content for --file flag, with size validation.
|
|
132
63
|
*/
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
const towerRunning = await client.isRunning();
|
|
137
|
-
if (!towerRunning) {
|
|
138
|
-
throw new Error('Tower is not running. Start it with: af tower start');
|
|
64
|
+
function readFileContent(filePath) {
|
|
65
|
+
if (!existsSync(filePath)) {
|
|
66
|
+
throw new Error(`File not found: ${filePath}`);
|
|
139
67
|
}
|
|
140
|
-
|
|
141
|
-
if (
|
|
142
|
-
|
|
143
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
68
|
+
const fileBuffer = readFileSync(filePath);
|
|
69
|
+
if (fileBuffer.length > MAX_FILE_SIZE) {
|
|
70
|
+
throw new Error(`File too large: ${fileBuffer.length} bytes (max ${MAX_FILE_SIZE} bytes / 48KB)`);
|
|
144
71
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
fileContent = fileBuffer.toString('utf-8');
|
|
156
|
-
}
|
|
157
|
-
// Format the message (from builder)
|
|
158
|
-
const formattedMessage = formatBuilderMessage(fromBuilderId, message, fileContent, options.raw);
|
|
159
|
-
// Send via Tower API
|
|
160
|
-
await client.writeTerminal(terminalId, formattedMessage);
|
|
161
|
-
// Send Enter to submit (unless --no-enter)
|
|
162
|
-
if (!options.noEnter) {
|
|
163
|
-
await client.writeTerminal(terminalId, '\r');
|
|
72
|
+
return fileBuffer.toString('utf-8');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Read message from stdin
|
|
76
|
+
*/
|
|
77
|
+
async function readStdin() {
|
|
78
|
+
const chunks = [];
|
|
79
|
+
for await (const chunk of process.stdin) {
|
|
80
|
+
chunks.push(chunk);
|
|
164
81
|
}
|
|
165
|
-
|
|
82
|
+
return Buffer.concat(chunks).toString('utf-8').trim();
|
|
166
83
|
}
|
|
167
84
|
/**
|
|
168
|
-
* Send a message to all builders
|
|
85
|
+
* Send a message to all builders via Tower API.
|
|
169
86
|
*/
|
|
170
|
-
async function sendToAll(message, options) {
|
|
87
|
+
async function sendToAll(client, message, workspace, from, options) {
|
|
171
88
|
const state = loadState();
|
|
172
89
|
const results = { sent: [], failed: [] };
|
|
173
90
|
if (state.builders.length === 0) {
|
|
@@ -176,7 +93,17 @@ async function sendToAll(message, options) {
|
|
|
176
93
|
}
|
|
177
94
|
for (const builder of state.builders) {
|
|
178
95
|
try {
|
|
179
|
-
await
|
|
96
|
+
const result = await client.sendMessage(builder.id, message, {
|
|
97
|
+
from,
|
|
98
|
+
workspace,
|
|
99
|
+
fromWorkspace: workspace,
|
|
100
|
+
raw: options.raw,
|
|
101
|
+
noEnter: options.noEnter,
|
|
102
|
+
interrupt: options.interrupt,
|
|
103
|
+
});
|
|
104
|
+
if (!result.ok) {
|
|
105
|
+
throw new Error(result.error || 'Unknown error');
|
|
106
|
+
}
|
|
180
107
|
results.sent.push(builder.id);
|
|
181
108
|
}
|
|
182
109
|
catch (error) {
|
|
@@ -187,36 +114,19 @@ async function sendToAll(message, options) {
|
|
|
187
114
|
return results;
|
|
188
115
|
}
|
|
189
116
|
/**
|
|
190
|
-
*
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
for await (const chunk of process.stdin) {
|
|
195
|
-
chunks.push(chunk);
|
|
196
|
-
}
|
|
197
|
-
return Buffer.concat(chunks).toString('utf-8').trim();
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Detect the current builder ID from worktree path
|
|
201
|
-
* Returns null if not in a builder worktree
|
|
202
|
-
*/
|
|
203
|
-
function detectCurrentBuilderId() {
|
|
204
|
-
const cwd = process.cwd();
|
|
205
|
-
// Builder worktrees are at .builders/<id>/
|
|
206
|
-
const match = cwd.match(/\.builders\/([^/]+)/);
|
|
207
|
-
return match ? match[1] : null;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Main send command handler
|
|
117
|
+
* Main send command handler.
|
|
118
|
+
*
|
|
119
|
+
* Delegates to Tower's POST /api/send for address resolution, formatting,
|
|
120
|
+
* and terminal writing. Supports [project:]agent addressing.
|
|
211
121
|
*/
|
|
212
122
|
export async function send(options) {
|
|
213
123
|
// Determine the message
|
|
214
124
|
let message = options.message;
|
|
215
|
-
let
|
|
125
|
+
let target = options.builder;
|
|
216
126
|
// When using --all, the first positional arg (builder) is actually the message
|
|
217
|
-
if (options.all &&
|
|
218
|
-
message =
|
|
219
|
-
|
|
127
|
+
if (options.all && target && !message) {
|
|
128
|
+
message = target;
|
|
129
|
+
target = undefined;
|
|
220
130
|
}
|
|
221
131
|
// Handle stdin input (message is "-")
|
|
222
132
|
if (message === '-') {
|
|
@@ -226,32 +136,31 @@ export async function send(options) {
|
|
|
226
136
|
if (!message) {
|
|
227
137
|
fatal('No message provided. Usage: af send <builder> "message" or af send --all "message"');
|
|
228
138
|
}
|
|
229
|
-
if (!options.all && !
|
|
139
|
+
if (!options.all && !target) {
|
|
230
140
|
fatal('Must specify a builder ID or use --all flag. Usage: af send <builder> "message"');
|
|
231
141
|
}
|
|
232
|
-
if (options.all &&
|
|
142
|
+
if (options.all && target) {
|
|
233
143
|
fatal('Cannot use --all with a specific builder ID.');
|
|
234
144
|
}
|
|
145
|
+
// Append file content to message if --file specified
|
|
146
|
+
if (options.file) {
|
|
147
|
+
const fileContent = readFileContent(options.file);
|
|
148
|
+
message = message + '\n\nAttached content:\n```\n' + fileContent + '\n```';
|
|
149
|
+
}
|
|
235
150
|
logger.header('Sending Instruction');
|
|
236
|
-
//
|
|
237
|
-
const
|
|
238
|
-
if
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
await sendToArchitect(currentBuilderId, message, options);
|
|
246
|
-
logger.success(`Message sent to architect from builder ${currentBuilderId}`);
|
|
247
|
-
}
|
|
248
|
-
catch (error) {
|
|
249
|
-
fatal(error instanceof Error ? error.message : String(error));
|
|
250
|
-
}
|
|
151
|
+
// Detect workspace for target resolution and sender provenance
|
|
152
|
+
const workspace = detectWorkspaceRoot() ?? undefined;
|
|
153
|
+
// Detect sender identity (builder ID if in a worktree, otherwise 'architect')
|
|
154
|
+
const from = detectCurrentBuilderId() ?? 'architect';
|
|
155
|
+
// Ensure Tower is running
|
|
156
|
+
const client = new TowerClient();
|
|
157
|
+
const towerRunning = await client.isRunning();
|
|
158
|
+
if (!towerRunning) {
|
|
159
|
+
fatal('Tower is not running. Start it with: af tower start');
|
|
251
160
|
}
|
|
252
|
-
|
|
161
|
+
if (options.all) {
|
|
253
162
|
// Broadcast to all builders
|
|
254
|
-
const results = await sendToAll(message, options);
|
|
163
|
+
const results = await sendToAll(client, message, workspace, from, options);
|
|
255
164
|
if (results.sent.length > 0) {
|
|
256
165
|
logger.success(`Sent to ${results.sent.length} builder(s): ${results.sent.join(', ')}`);
|
|
257
166
|
}
|
|
@@ -260,10 +169,20 @@ export async function send(options) {
|
|
|
260
169
|
}
|
|
261
170
|
}
|
|
262
171
|
else {
|
|
263
|
-
// Send to specific builder
|
|
172
|
+
// Send to specific target (architect, builder, or cross-project address)
|
|
264
173
|
try {
|
|
265
|
-
await
|
|
266
|
-
|
|
174
|
+
const result = await client.sendMessage(target, message, {
|
|
175
|
+
from,
|
|
176
|
+
workspace,
|
|
177
|
+
fromWorkspace: workspace,
|
|
178
|
+
raw: options.raw,
|
|
179
|
+
noEnter: options.noEnter,
|
|
180
|
+
interrupt: options.interrupt,
|
|
181
|
+
});
|
|
182
|
+
if (!result.ok) {
|
|
183
|
+
throw new Error(result.error || 'Unknown error');
|
|
184
|
+
}
|
|
185
|
+
logger.success(`Message sent to ${result.resolvedTo ?? target}`);
|
|
267
186
|
}
|
|
268
187
|
catch (error) {
|
|
269
188
|
fatal(error instanceof Error ? error.message : String(error));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/send.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/send.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,7 +53,9 @@ export declare function loadProtocolRole(config: Config, protocolName: string):
|
|
|
53
53
|
source: string;
|
|
54
54
|
} | null;
|
|
55
55
|
/**
|
|
56
|
-
* Find a spec file by project ID
|
|
56
|
+
* Find a spec file by project ID.
|
|
57
|
+
* Handles legacy zero-padded IDs: `af spawn 76` matches `0076-feature.md`.
|
|
58
|
+
* Strips leading zeros from both the input ID and spec file prefixes for comparison.
|
|
57
59
|
*/
|
|
58
60
|
export declare function findSpecFile(codevDir: string, projectId: string): Promise<string | null>;
|
|
59
61
|
/**
|
|
@@ -64,14 +66,6 @@ export declare function validateProtocol(config: Config, protocolName: string):
|
|
|
64
66
|
* Load and parse a protocol.json file
|
|
65
67
|
*/
|
|
66
68
|
export declare function loadProtocol(config: Config, protocolName: string): ProtocolDefinition | null;
|
|
67
|
-
/**
|
|
68
|
-
* Resolve which protocol to use based on precedence:
|
|
69
|
-
* 1. Explicit --protocol flag when used as override (with other input modes)
|
|
70
|
-
* 2. Explicit --use-protocol flag (backwards compatibility)
|
|
71
|
-
* 3. Spec file **Protocol**: header (for --project mode)
|
|
72
|
-
* 4. Hardcoded defaults (spir for specs, bugfix for issues)
|
|
73
|
-
*/
|
|
74
|
-
export declare function resolveProtocol(options: SpawnOptions, config: Config): Promise<string>;
|
|
75
69
|
/**
|
|
76
70
|
* Resolve the builder mode (strict vs soft)
|
|
77
71
|
* Precedence: explicit flags > protocol defaults > input type defaults
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn-roles.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/commands/spawn-roles.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"spawn-roles.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/commands/spawn-roles.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAS5E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAyBjF;AA0DD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,eAAe,GACvB,MAAM,CASR;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAS5D;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOjH;AAMD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2B9F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAqB3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAY5F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,kBAAkB,GAAG,IAAI,GAClC,QAAQ,GAAG,MAAM,CAcnB"}
|
|
@@ -10,6 +10,7 @@ import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
|
10
10
|
import { readdir } from 'node:fs/promises';
|
|
11
11
|
import { logger, fatal } from '../utils/logger.js';
|
|
12
12
|
import { loadRolePrompt } from '../utils/roles.js';
|
|
13
|
+
import { stripLeadingZeros } from '../utils/agent-names.js';
|
|
13
14
|
/**
|
|
14
15
|
* Get nested value from object using dot notation
|
|
15
16
|
*/
|
|
@@ -147,7 +148,9 @@ export function loadProtocolRole(config, protocolName) {
|
|
|
147
148
|
// Protocol Resolution
|
|
148
149
|
// =============================================================================
|
|
149
150
|
/**
|
|
150
|
-
* Find a spec file by project ID
|
|
151
|
+
* Find a spec file by project ID.
|
|
152
|
+
* Handles legacy zero-padded IDs: `af spawn 76` matches `0076-feature.md`.
|
|
153
|
+
* Strips leading zeros from both the input ID and spec file prefixes for comparison.
|
|
151
154
|
*/
|
|
152
155
|
export async function findSpecFile(codevDir, projectId) {
|
|
153
156
|
const specsDir = resolve(codevDir, 'specs');
|
|
@@ -155,15 +158,19 @@ export async function findSpecFile(codevDir, projectId) {
|
|
|
155
158
|
return null;
|
|
156
159
|
}
|
|
157
160
|
const files = await readdir(specsDir);
|
|
158
|
-
|
|
161
|
+
const strippedId = stripLeadingZeros(projectId);
|
|
162
|
+
// Try exact match first (e.g., projectId="0076" matches "0076-feature.md")
|
|
159
163
|
for (const file of files) {
|
|
160
|
-
if (file.startsWith(projectId) && file.endsWith('.md')) {
|
|
164
|
+
if (file.startsWith(projectId + '-') && file.endsWith('.md')) {
|
|
161
165
|
return resolve(specsDir, file);
|
|
162
166
|
}
|
|
163
167
|
}
|
|
164
|
-
// Try
|
|
168
|
+
// Try zero-stripped match (e.g., projectId="76" matches "0076-feature.md")
|
|
165
169
|
for (const file of files) {
|
|
166
|
-
if (file.
|
|
170
|
+
if (!file.endsWith('.md'))
|
|
171
|
+
continue;
|
|
172
|
+
const filePrefix = file.split('-')[0];
|
|
173
|
+
if (stripLeadingZeros(filePrefix) === strippedId) {
|
|
167
174
|
return resolve(specsDir, file);
|
|
168
175
|
}
|
|
169
176
|
}
|
|
@@ -209,53 +216,6 @@ export function loadProtocol(config, protocolName) {
|
|
|
209
216
|
return null;
|
|
210
217
|
}
|
|
211
218
|
}
|
|
212
|
-
/**
|
|
213
|
-
* Resolve which protocol to use based on precedence:
|
|
214
|
-
* 1. Explicit --protocol flag when used as override (with other input modes)
|
|
215
|
-
* 2. Explicit --use-protocol flag (backwards compatibility)
|
|
216
|
-
* 3. Spec file **Protocol**: header (for --project mode)
|
|
217
|
-
* 4. Hardcoded defaults (spir for specs, bugfix for issues)
|
|
218
|
-
*/
|
|
219
|
-
export async function resolveProtocol(options, config) {
|
|
220
|
-
const inputModes = [
|
|
221
|
-
options.project, options.task, options.shell, options.worktree, options.issue,
|
|
222
|
-
].filter(Boolean);
|
|
223
|
-
const protocolAsOverride = options.protocol && inputModes.length > 0;
|
|
224
|
-
if (protocolAsOverride) {
|
|
225
|
-
validateProtocol(config, options.protocol);
|
|
226
|
-
return options.protocol.toLowerCase();
|
|
227
|
-
}
|
|
228
|
-
if (options.useProtocol) {
|
|
229
|
-
validateProtocol(config, options.useProtocol);
|
|
230
|
-
return options.useProtocol.toLowerCase();
|
|
231
|
-
}
|
|
232
|
-
if (options.project) {
|
|
233
|
-
const specFile = await findSpecFile(config.codevDir, options.project);
|
|
234
|
-
if (specFile) {
|
|
235
|
-
const specContent = readFileSync(specFile, 'utf-8');
|
|
236
|
-
const match = specContent.match(/\*\*Protocol\*\*:\s*(\w+)/i);
|
|
237
|
-
if (match) {
|
|
238
|
-
const protocolFromSpec = match[1].toLowerCase();
|
|
239
|
-
try {
|
|
240
|
-
validateProtocol(config, protocolFromSpec);
|
|
241
|
-
return protocolFromSpec;
|
|
242
|
-
}
|
|
243
|
-
catch {
|
|
244
|
-
logger.warn(`Warning: Protocol "${match[1]}" from spec not found, using default`);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
if (options.project)
|
|
250
|
-
return 'spir';
|
|
251
|
-
if (options.issue)
|
|
252
|
-
return 'bugfix';
|
|
253
|
-
if (options.protocol)
|
|
254
|
-
return options.protocol.toLowerCase();
|
|
255
|
-
if (options.task)
|
|
256
|
-
return 'spir';
|
|
257
|
-
return 'spir';
|
|
258
|
-
}
|
|
259
219
|
/**
|
|
260
220
|
* Resolve the builder mode (strict vs soft)
|
|
261
221
|
* Precedence: explicit flags > protocol defaults > input type defaults
|
|
@@ -271,7 +231,8 @@ export function resolveMode(options, protocol) {
|
|
|
271
231
|
if (protocol?.defaults?.mode) {
|
|
272
232
|
return protocol.defaults.mode;
|
|
273
233
|
}
|
|
274
|
-
|
|
234
|
+
// Issue-based spawns with non-bugfix protocol default to strict
|
|
235
|
+
if (options.issueNumber && options.protocol !== 'bugfix')
|
|
275
236
|
return 'strict';
|
|
276
237
|
return 'soft';
|
|
277
238
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn-roles.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/spawn-roles.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"spawn-roles.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/spawn-roles.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* and terminal session creation via the Tower REST API.
|
|
8
8
|
*/
|
|
9
9
|
import type { Config, ProtocolDefinition } from '../types.js';
|
|
10
|
+
import { type GitHubIssue } from '../../lib/github.js';
|
|
10
11
|
export declare const DEFAULT_TOWER_PORT = 4100;
|
|
11
12
|
/**
|
|
12
13
|
* Check for required dependencies
|
|
@@ -21,27 +22,20 @@ export declare function createWorktree(config: Config, branchName: string, workt
|
|
|
21
22
|
* Non-fatal: logs a warning on failure since the builder can still init manually.
|
|
22
23
|
*/
|
|
23
24
|
export declare function initPorchInWorktree(worktreePath: string, protocol: string, projectId: string, projectName: string): Promise<void>;
|
|
24
|
-
|
|
25
|
-
* GitHub issue structure from gh issue view --json
|
|
26
|
-
*/
|
|
27
|
-
export interface GitHubIssue {
|
|
28
|
-
title: string;
|
|
29
|
-
body: string;
|
|
30
|
-
state: string;
|
|
31
|
-
comments: Array<{
|
|
32
|
-
body: string;
|
|
33
|
-
createdAt: string;
|
|
34
|
-
author: {
|
|
35
|
-
login: string;
|
|
36
|
-
};
|
|
37
|
-
}>;
|
|
38
|
-
}
|
|
25
|
+
export type { GitHubIssue } from '../../lib/github.js';
|
|
39
26
|
/**
|
|
40
27
|
* Generate a slug from an issue title (max 30 chars, lowercase, alphanumeric + hyphens)
|
|
41
28
|
*/
|
|
42
29
|
export declare function slugify(title: string): string;
|
|
43
30
|
/**
|
|
44
|
-
*
|
|
31
|
+
* Find an existing bugfix worktree directory for a given issue number.
|
|
32
|
+
* Scans the builders directory for directories matching `bugfix-{issueNumber}-*`.
|
|
33
|
+
* Returns the directory name if found, or null if no match exists.
|
|
34
|
+
*/
|
|
35
|
+
export declare function findExistingBugfixWorktree(buildersDir: string, issueNumber: number): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Fetch a GitHub issue via gh CLI (fatal on failure).
|
|
38
|
+
* Delegates to shared github utility but wraps with fatal() for spawn context.
|
|
45
39
|
*/
|
|
46
40
|
export declare function fetchGitHubIssue(issueNumber: number): Promise<GitHubIssue>;
|
|
47
41
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn-worktree.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/commands/spawn-worktree.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"spawn-worktree.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/commands/spawn-worktree.ts"],"names":[],"mappings":"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"}
|