@cluesmith/codev 2.0.0-rc.24 → 2.0.0-rc.25
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/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +52 -52
- package/dist/agent-farm/cli.js.map +1 -1
- package/dist/agent-farm/commands/consult.js +1 -1
- package/dist/agent-farm/commands/consult.js.map +1 -1
- package/dist/agent-farm/commands/index.d.ts +1 -2
- package/dist/agent-farm/commands/index.d.ts.map +1 -1
- package/dist/agent-farm/commands/index.js +1 -2
- package/dist/agent-farm/commands/index.js.map +1 -1
- package/dist/agent-farm/commands/{util.d.ts → shell.d.ts} +4 -4
- package/dist/agent-farm/commands/shell.d.ts.map +1 -0
- package/dist/agent-farm/commands/{util.js → shell.js} +4 -4
- package/dist/agent-farm/commands/shell.js.map +1 -0
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +361 -66
- package/dist/agent-farm/commands/spawn.js.map +1 -1
- package/dist/agent-farm/commands/start.js +5 -4
- package/dist/agent-farm/commands/start.js.map +1 -1
- package/dist/agent-farm/commands/tower.d.ts.map +1 -1
- package/dist/agent-farm/commands/tower.js +2 -1
- package/dist/agent-farm/commands/tower.js.map +1 -1
- package/dist/agent-farm/hq-connector.d.ts +2 -2
- package/dist/agent-farm/hq-connector.js +2 -2
- package/dist/agent-farm/servers/dashboard-server.js +153 -6
- package/dist/agent-farm/servers/dashboard-server.js.map +1 -1
- package/dist/agent-farm/servers/tower-server.js +374 -0
- package/dist/agent-farm/servers/tower-server.js.map +1 -1
- package/dist/agent-farm/types.d.ts +38 -0
- package/dist/agent-farm/types.d.ts.map +1 -1
- package/dist/agent-farm/utils/notifications.d.ts +30 -0
- package/dist/agent-farm/utils/notifications.d.ts.map +1 -0
- package/dist/agent-farm/utils/notifications.js +121 -0
- package/dist/agent-farm/utils/notifications.js.map +1 -0
- package/dist/agent-farm/utils/server-utils.d.ts +2 -1
- package/dist/agent-farm/utils/server-utils.d.ts.map +1 -1
- package/dist/agent-farm/utils/server-utils.js +11 -1
- package/dist/agent-farm/utils/server-utils.js.map +1 -1
- package/dist/agent-farm/utils/shell.d.ts +1 -0
- package/dist/agent-farm/utils/shell.d.ts.map +1 -1
- package/dist/agent-farm/utils/shell.js +2 -0
- package/dist/agent-farm/utils/shell.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +0 -37
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.js +3 -3
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/porch/run.d.ts.map +1 -1
- package/dist/commands/porch/run.js +5 -0
- package/dist/commands/porch/run.js.map +1 -1
- package/package.json +3 -1
- package/skeleton/protocol-schema.json +282 -0
- package/skeleton/protocols/bugfix/builder-prompt.md +49 -0
- package/skeleton/protocols/bugfix/protocol.json +13 -1
- package/skeleton/protocols/experiment/builder-prompt.md +47 -0
- package/skeleton/protocols/experiment/protocol.json +101 -0
- package/skeleton/protocols/maintain/builder-prompt.md +41 -0
- package/skeleton/protocols/maintain/protocol.json +114 -0
- package/skeleton/protocols/protocol-schema.json +53 -0
- package/skeleton/protocols/spider/builder-prompt.md +53 -0
- package/skeleton/protocols/spider/protocol.json +7 -1
- package/skeleton/protocols/tick/builder-prompt.md +51 -0
- package/skeleton/protocols/tick/protocol.json +6 -1
- package/skeleton/resources/commands/agent-farm.md +23 -41
- package/skeleton/resources/commands/overview.md +5 -5
- package/skeleton/resources/workflow-reference.md +2 -2
- package/skeleton/roles/architect.md +49 -33
- package/skeleton/roles/builder.md +77 -108
- package/skeleton/templates/cheatsheet.md +4 -2
- package/templates/tower.html +455 -14
- package/dist/agent-farm/commands/kickoff.d.ts +0 -20
- package/dist/agent-farm/commands/kickoff.d.ts.map +0 -1
- package/dist/agent-farm/commands/kickoff.js +0 -343
- package/dist/agent-farm/commands/kickoff.js.map +0 -1
- package/dist/agent-farm/commands/tutorial.d.ts +0 -10
- package/dist/agent-farm/commands/tutorial.d.ts.map +0 -1
- package/dist/agent-farm/commands/tutorial.js +0 -49
- package/dist/agent-farm/commands/tutorial.js.map +0 -1
- package/dist/agent-farm/commands/util.d.ts.map +0 -1
- package/dist/agent-farm/commands/util.js.map +0 -1
- package/dist/agent-farm/tutorial/index.d.ts +0 -8
- package/dist/agent-farm/tutorial/index.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/index.js +0 -8
- package/dist/agent-farm/tutorial/index.js.map +0 -1
- package/dist/agent-farm/tutorial/prompts.d.ts +0 -57
- package/dist/agent-farm/tutorial/prompts.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/prompts.js +0 -147
- package/dist/agent-farm/tutorial/prompts.js.map +0 -1
- package/dist/agent-farm/tutorial/runner.d.ts +0 -52
- package/dist/agent-farm/tutorial/runner.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/runner.js +0 -204
- package/dist/agent-farm/tutorial/runner.js.map +0 -1
- package/dist/agent-farm/tutorial/state.d.ts +0 -26
- package/dist/agent-farm/tutorial/state.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/state.js +0 -89
- package/dist/agent-farm/tutorial/state.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/first-spec.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/first-spec.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/first-spec.js +0 -136
- package/dist/agent-farm/tutorial/steps/first-spec.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/implementation.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/implementation.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/implementation.js +0 -76
- package/dist/agent-farm/tutorial/steps/implementation.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/index.d.ts +0 -10
- package/dist/agent-farm/tutorial/steps/index.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/index.js +0 -10
- package/dist/agent-farm/tutorial/steps/index.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/planning.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/planning.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/planning.js +0 -143
- package/dist/agent-farm/tutorial/steps/planning.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/review.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/review.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/review.js +0 -78
- package/dist/agent-farm/tutorial/steps/review.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/setup.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/setup.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/setup.js +0 -126
- package/dist/agent-farm/tutorial/steps/setup.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/welcome.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/welcome.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/welcome.js +0 -50
- package/dist/agent-farm/tutorial/steps/welcome.js.map +0 -1
- package/dist/commands/tower.d.ts +0 -16
- package/dist/commands/tower.d.ts.map +0 -1
- package/dist/commands/tower.js +0 -21
- package/dist/commands/tower.js.map +0 -1
|
@@ -1,343 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Kickoff command - Start a new protocol-driven project
|
|
3
|
-
*
|
|
4
|
-
* This command combines:
|
|
5
|
-
* 1. Creating a git worktree
|
|
6
|
-
* 2. Initializing porch state
|
|
7
|
-
* 3. Starting the porch loop in the builder
|
|
8
|
-
*/
|
|
9
|
-
import { resolve, basename } from 'node:path';
|
|
10
|
-
import { existsSync, readFileSync, symlinkSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
11
|
-
import { readdir } from 'node:fs/promises';
|
|
12
|
-
import { getConfig, ensureDirectories } from '../utils/index.js';
|
|
13
|
-
import { logger, fatal } from '../utils/logger.js';
|
|
14
|
-
import { run, commandExists, findAvailablePort, spawnTtyd } from '../utils/shell.js';
|
|
15
|
-
import { loadState, upsertBuilder } from '../state.js';
|
|
16
|
-
/**
|
|
17
|
-
* Get project name from config
|
|
18
|
-
*/
|
|
19
|
-
function getProjectName(config) {
|
|
20
|
-
return basename(config.projectRoot);
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Get tmux session name
|
|
24
|
-
*/
|
|
25
|
-
function getSessionName(config, builderId) {
|
|
26
|
-
return `builder-${getProjectName(config)}-${builderId}`;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Find an available port
|
|
30
|
-
*/
|
|
31
|
-
async function findFreePort(config) {
|
|
32
|
-
const state = loadState();
|
|
33
|
-
const usedPorts = new Set();
|
|
34
|
-
for (const b of state.builders || []) {
|
|
35
|
-
if (b.port)
|
|
36
|
-
usedPorts.add(b.port);
|
|
37
|
-
}
|
|
38
|
-
let port = config.builderPortRange[0];
|
|
39
|
-
while (usedPorts.has(port)) {
|
|
40
|
-
port++;
|
|
41
|
-
}
|
|
42
|
-
return findAvailablePort(port);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Find spec file by project ID
|
|
46
|
-
*/
|
|
47
|
-
async function findSpecFile(codevDir, projectId) {
|
|
48
|
-
const specsDir = resolve(codevDir, 'specs');
|
|
49
|
-
if (!existsSync(specsDir)) {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
const files = await readdir(specsDir);
|
|
53
|
-
for (const file of files) {
|
|
54
|
-
if (file.startsWith(projectId) && file.endsWith('.md')) {
|
|
55
|
-
return resolve(specsDir, file);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
for (const file of files) {
|
|
59
|
-
if (file.startsWith(projectId + '-') && file.endsWith('.md')) {
|
|
60
|
-
return resolve(specsDir, file);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
async function findPorchState(codevDir, projectId) {
|
|
66
|
-
const projectsDir = resolve(codevDir, 'projects');
|
|
67
|
-
if (!existsSync(projectsDir)) {
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
const dirs = await readdir(projectsDir);
|
|
71
|
-
for (const dir of dirs) {
|
|
72
|
-
if (dir.startsWith(`${projectId}-`)) {
|
|
73
|
-
const statusPath = resolve(projectsDir, dir, 'status.yaml');
|
|
74
|
-
if (existsSync(statusPath)) {
|
|
75
|
-
const content = readFileSync(statusPath, 'utf-8');
|
|
76
|
-
// Simple YAML parsing for the fields we need
|
|
77
|
-
const idMatch = content.match(/^id:\s*"?([^"\n]+)"?/m);
|
|
78
|
-
const titleMatch = content.match(/^title:\s*"?([^"\n]+)"?/m);
|
|
79
|
-
const protocolMatch = content.match(/^protocol:\s*"?([^"\n]+)"?/m);
|
|
80
|
-
const stateMatch = content.match(/^state:\s*"?([^"\n]+)"?/m);
|
|
81
|
-
if (idMatch && titleMatch) {
|
|
82
|
-
return {
|
|
83
|
-
id: idMatch[1],
|
|
84
|
-
title: titleMatch[1],
|
|
85
|
-
protocol: protocolMatch?.[1] || 'spider',
|
|
86
|
-
state: stateMatch?.[1] || 'unknown',
|
|
87
|
-
statusPath,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Create git branch and worktree
|
|
97
|
-
*/
|
|
98
|
-
async function createWorktree(config, branchName, worktreePath) {
|
|
99
|
-
logger.info('Creating branch...');
|
|
100
|
-
try {
|
|
101
|
-
await run(`git branch ${branchName}`, { cwd: config.projectRoot });
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
logger.debug('Branch may already exist');
|
|
105
|
-
}
|
|
106
|
-
logger.info('Creating worktree...');
|
|
107
|
-
try {
|
|
108
|
-
await run(`git worktree add "${worktreePath}" ${branchName}`, { cwd: config.projectRoot });
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
fatal(`Failed to create worktree: ${error}`);
|
|
112
|
-
}
|
|
113
|
-
// Symlink .env
|
|
114
|
-
const rootEnvPath = resolve(config.projectRoot, '.env');
|
|
115
|
-
const worktreeEnvPath = resolve(worktreePath, '.env');
|
|
116
|
-
if (existsSync(rootEnvPath) && !existsSync(worktreeEnvPath)) {
|
|
117
|
-
try {
|
|
118
|
-
symlinkSync(rootEnvPath, worktreeEnvPath);
|
|
119
|
-
logger.info('Linked .env from project root');
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
logger.debug('Failed to symlink .env');
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Check dependencies
|
|
128
|
-
*/
|
|
129
|
-
async function checkDependencies() {
|
|
130
|
-
if (!(await commandExists('git'))) {
|
|
131
|
-
fatal('git not found');
|
|
132
|
-
}
|
|
133
|
-
if (!(await commandExists('ttyd'))) {
|
|
134
|
-
fatal('ttyd not found. Install with: brew install ttyd');
|
|
135
|
-
}
|
|
136
|
-
if (!(await commandExists('porch'))) {
|
|
137
|
-
logger.warn('porch command not found in PATH. Falling back to codev porch.');
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Get porch command
|
|
142
|
-
* When running from the codev source repo, use the local build for latest fixes
|
|
143
|
-
*/
|
|
144
|
-
async function getPorchCommand(config) {
|
|
145
|
-
// Check if we're in the codev source repo - use local build
|
|
146
|
-
const localPorch = resolve(config.projectRoot, 'packages/codev/bin/porch.js');
|
|
147
|
-
if (existsSync(localPorch)) {
|
|
148
|
-
return `node "${localPorch}"`;
|
|
149
|
-
}
|
|
150
|
-
if (await commandExists('porch')) {
|
|
151
|
-
return 'porch';
|
|
152
|
-
}
|
|
153
|
-
return 'codev porch';
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Kickoff a new protocol-driven project
|
|
157
|
-
*/
|
|
158
|
-
export async function kickoff(options) {
|
|
159
|
-
const { project: projectId, title, protocol: protocolName = 'spider', resume } = options;
|
|
160
|
-
const config = getConfig();
|
|
161
|
-
// Find spec file OR porch state
|
|
162
|
-
const specFile = await findSpecFile(config.codevDir, projectId);
|
|
163
|
-
let porchState = await findPorchState(config.codevDir, projectId);
|
|
164
|
-
// Need either a spec, porch state, or title to proceed
|
|
165
|
-
if (!specFile && !porchState && !title) {
|
|
166
|
-
fatal(`No spec or porch state found for project: ${projectId}\n` +
|
|
167
|
-
`Either:\n` +
|
|
168
|
-
` 1. Create a spec file (codev/specs/${projectId}-*.md)\n` +
|
|
169
|
-
` 2. Provide a title: af kickoff -p ${projectId} --title "feature-name"\n` +
|
|
170
|
-
` 3. Initialize porch manually: porch init ${protocolName} ${projectId} <project-name>`);
|
|
171
|
-
}
|
|
172
|
-
// Derive the project title from spec, porch state, or provided title
|
|
173
|
-
const projectTitle = specFile
|
|
174
|
-
? basename(specFile, '.md').replace(/^\d+-/, '') // Strip leading number from spec filename
|
|
175
|
-
: porchState?.title || title;
|
|
176
|
-
// Derive names from spec or porch state or title
|
|
177
|
-
const specName = specFile ? basename(specFile, '.md') : `${projectId}-${projectTitle}`;
|
|
178
|
-
const builderId = projectId;
|
|
179
|
-
const safeName = projectTitle.toLowerCase().replace(/[^a-z0-9_-]/g, '-').replace(/-+/g, '-');
|
|
180
|
-
const actualProtocol = porchState?.protocol || protocolName;
|
|
181
|
-
// Use worktrees/ directory with protocol-prefixed naming per spec 0073
|
|
182
|
-
const worktreesDir = resolve(config.projectRoot, 'worktrees');
|
|
183
|
-
const worktreeName = `${actualProtocol.toLowerCase()}_${projectId}_${safeName}`;
|
|
184
|
-
const branchName = `builder/${projectId}-${safeName}`;
|
|
185
|
-
const worktreePath = resolve(worktreesDir, worktreeName);
|
|
186
|
-
// Check if porch state already exists
|
|
187
|
-
const hasExistingState = !!porchState;
|
|
188
|
-
logger.header(`Kickoff Builder ${builderId}`);
|
|
189
|
-
logger.kv('Spec', specFile || '(to be created)');
|
|
190
|
-
logger.kv('Protocol', (porchState?.protocol || protocolName).toUpperCase());
|
|
191
|
-
logger.kv('Branch', branchName);
|
|
192
|
-
logger.kv('Worktree', worktreePath);
|
|
193
|
-
logger.kv('Porch State', hasExistingState ? 'exists (resume)' : 'new');
|
|
194
|
-
await ensureDirectories(config);
|
|
195
|
-
await checkDependencies();
|
|
196
|
-
// Ensure worktrees directory exists
|
|
197
|
-
if (!existsSync(worktreesDir)) {
|
|
198
|
-
const { mkdir } = await import('node:fs/promises');
|
|
199
|
-
await mkdir(worktreesDir, { recursive: true });
|
|
200
|
-
}
|
|
201
|
-
// Check if worktree already exists
|
|
202
|
-
if (existsSync(worktreePath)) {
|
|
203
|
-
if (resume) {
|
|
204
|
-
logger.info('Resuming existing worktree');
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
fatal(`Worktree already exists at ${worktreePath}\nUse --resume to continue, or run: af cleanup --project ${projectId}`);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
await createWorktree(config, branchName, worktreePath);
|
|
212
|
-
}
|
|
213
|
-
const porchCmd = await getPorchCommand(config);
|
|
214
|
-
// Initialize porch state if not resuming existing
|
|
215
|
-
// IMPORTANT: Run from worktree so state is created there, not in main project
|
|
216
|
-
if (!hasExistingState && !resume) {
|
|
217
|
-
logger.info('Initializing porch state...');
|
|
218
|
-
try {
|
|
219
|
-
await run(`${porchCmd} init ${protocolName} ${projectId} "${safeName}"`, {
|
|
220
|
-
cwd: worktreePath,
|
|
221
|
-
});
|
|
222
|
-
logger.success('Porch state initialized');
|
|
223
|
-
}
|
|
224
|
-
catch (error) {
|
|
225
|
-
logger.warn(`Failed to initialize porch state: ${error}`);
|
|
226
|
-
logger.info('Builder will start without porch orchestration');
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
// Start builder session
|
|
230
|
-
const port = await findFreePort(config);
|
|
231
|
-
const sessionName = getSessionName(config, builderId);
|
|
232
|
-
// Create .af directory for launch scripts
|
|
233
|
-
const afDir = resolve(worktreePath, '.af');
|
|
234
|
-
if (!existsSync(afDir)) {
|
|
235
|
-
mkdirSync(afDir, { recursive: true });
|
|
236
|
-
}
|
|
237
|
-
// Create the builder role that instructs Claude to run porch
|
|
238
|
-
const builderRole = `You are a Builder agent working on project ${projectId}.
|
|
239
|
-
|
|
240
|
-
Your job is to execute the porch protocol loop until completion.
|
|
241
|
-
|
|
242
|
-
## Instructions
|
|
243
|
-
|
|
244
|
-
Run this command repeatedly until the protocol is complete:
|
|
245
|
-
|
|
246
|
-
\`\`\`bash
|
|
247
|
-
${porchCmd} run ${projectId} --single-iteration
|
|
248
|
-
\`\`\`
|
|
249
|
-
|
|
250
|
-
The \`--single-iteration\` flag runs ONE build-verify cycle then exits. This gives the architect visibility into each iteration's output.
|
|
251
|
-
|
|
252
|
-
After each run:
|
|
253
|
-
1. If porch prints "🎉 PROTOCOL COMPLETE" - you're done, exit
|
|
254
|
-
2. If porch is waiting for a gate approval - wait for the architect to approve
|
|
255
|
-
3. If porch exits with code 10 (AWAITING_INPUT) - inner Claude needs answers
|
|
256
|
-
4. If porch prints "[--single-iteration] ... Exiting" - review the output, then run the command again
|
|
257
|
-
5. Otherwise - run the command again
|
|
258
|
-
|
|
259
|
-
## Reviewing Output Between Iterations
|
|
260
|
-
|
|
261
|
-
After each iteration, **briefly review** what happened:
|
|
262
|
-
- What phase are we in?
|
|
263
|
-
- Did reviewers approve or request changes?
|
|
264
|
-
- What feedback was given?
|
|
265
|
-
- Is there anything blocking progress?
|
|
266
|
-
|
|
267
|
-
Then continue with the next iteration unless blocked.
|
|
268
|
-
|
|
269
|
-
## Handling AWAITING_INPUT (exit code 10)
|
|
270
|
-
|
|
271
|
-
When porch exits with code 10, it means the protocol needs human input (clarifying questions).
|
|
272
|
-
|
|
273
|
-
**CRITICAL: Do NOT answer these questions yourself.** You are an AI - you must not make up answers to questions intended for humans.
|
|
274
|
-
|
|
275
|
-
Instead:
|
|
276
|
-
1. Report that you are BLOCKED waiting for human input
|
|
277
|
-
2. Display the question clearly so the architect can see it
|
|
278
|
-
3. Wait for the architect to provide answers via \`af send\` or PR comments
|
|
279
|
-
|
|
280
|
-
The architect will run:
|
|
281
|
-
\`\`\`bash
|
|
282
|
-
${porchCmd} run ${projectId} --answer '{"response": "Human's answer here..."}'
|
|
283
|
-
\`\`\`
|
|
284
|
-
|
|
285
|
-
Do NOT run this command yourself with made-up answers.
|
|
286
|
-
|
|
287
|
-
Keep running the porch loop. Do not stop until the protocol is complete or you hit a gate that requires approval.`;
|
|
288
|
-
const rolePath = resolve(afDir, 'builder-role.md');
|
|
289
|
-
writeFileSync(rolePath, builderRole);
|
|
290
|
-
// Create launch script that starts Claude with the builder role and initial task
|
|
291
|
-
const initialTask = `Run the porch protocol loop now: ${porchCmd} run ${projectId}`;
|
|
292
|
-
const launchScript = resolve(afDir, 'launch.sh');
|
|
293
|
-
writeFileSync(launchScript, `#!/bin/bash
|
|
294
|
-
cd "${worktreePath}"
|
|
295
|
-
exec claude --dangerously-skip-permissions --append-system-prompt "$(cat '${rolePath}')" "${initialTask}"
|
|
296
|
-
`, { mode: 0o755 });
|
|
297
|
-
logger.info('Creating tmux session...');
|
|
298
|
-
// Create tmux session running the launch script (starts Claude automatically)
|
|
299
|
-
await run(`tmux new-session -d -s "${sessionName}" -x 200 -y 50 -c "${worktreePath}" "${launchScript}"`);
|
|
300
|
-
await run(`tmux set-option -t "${sessionName}" status off`);
|
|
301
|
-
await run('tmux set -g mouse on');
|
|
302
|
-
await run('tmux set -g set-clipboard on');
|
|
303
|
-
await run('tmux set -g allow-passthrough on');
|
|
304
|
-
// Copy selection to clipboard when mouse is released (pbcopy for macOS)
|
|
305
|
-
await run('tmux bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"');
|
|
306
|
-
await run('tmux bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"');
|
|
307
|
-
// Small delay to ensure tmux session is fully initialized before ttyd attaches
|
|
308
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
309
|
-
// Start ttyd
|
|
310
|
-
logger.info('Starting builder terminal...');
|
|
311
|
-
const customIndexPath = resolve(config.templatesDir, 'ttyd-index.html');
|
|
312
|
-
const hasCustomIndex = existsSync(customIndexPath);
|
|
313
|
-
const ttydProcess = spawnTtyd({
|
|
314
|
-
port,
|
|
315
|
-
sessionName,
|
|
316
|
-
cwd: worktreePath,
|
|
317
|
-
customIndexPath: hasCustomIndex ? customIndexPath : undefined,
|
|
318
|
-
});
|
|
319
|
-
if (!ttydProcess?.pid) {
|
|
320
|
-
fatal('Failed to start ttyd process');
|
|
321
|
-
}
|
|
322
|
-
const builder = {
|
|
323
|
-
id: builderId,
|
|
324
|
-
name: specName,
|
|
325
|
-
port,
|
|
326
|
-
pid: ttydProcess.pid,
|
|
327
|
-
status: 'spawning',
|
|
328
|
-
phase: 'init',
|
|
329
|
-
worktree: worktreePath,
|
|
330
|
-
branch: branchName,
|
|
331
|
-
tmuxSession: sessionName,
|
|
332
|
-
type: 'spec',
|
|
333
|
-
};
|
|
334
|
-
upsertBuilder(builder);
|
|
335
|
-
logger.blank();
|
|
336
|
-
logger.success(`Builder ${builderId} started!`);
|
|
337
|
-
logger.kv('Terminal', `http://localhost:${port}`);
|
|
338
|
-
logger.kv('Worktree', worktreePath);
|
|
339
|
-
logger.blank();
|
|
340
|
-
logger.info('Claude is running the porch protocol loop.');
|
|
341
|
-
logger.info('Watch the terminal or check status with: af status');
|
|
342
|
-
}
|
|
343
|
-
//# sourceMappingURL=kickoff.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kickoff.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/kickoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tutorial command handler
|
|
3
|
-
* Interactive onboarding for new users
|
|
4
|
-
*/
|
|
5
|
-
import type { TutorialOptions } from '../types.js';
|
|
6
|
-
/**
|
|
7
|
-
* Main tutorial command
|
|
8
|
-
*/
|
|
9
|
-
export declare function tutorial(options: TutorialOptions): Promise<void>;
|
|
10
|
-
//# sourceMappingURL=tutorial.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tutorial.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/commands/tutorial.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAyBnD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBtE"}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tutorial command handler
|
|
3
|
-
* Interactive onboarding for new users
|
|
4
|
-
*/
|
|
5
|
-
import { logger } from '../utils/logger.js';
|
|
6
|
-
import { resetTutorialState } from '../tutorial/state.js';
|
|
7
|
-
import { runTutorial, showStatus, skipCurrentStep } from '../tutorial/runner.js';
|
|
8
|
-
// Import all tutorial steps
|
|
9
|
-
import { welcomeStep } from '../tutorial/steps/welcome.js';
|
|
10
|
-
import { setupStep } from '../tutorial/steps/setup.js';
|
|
11
|
-
import { firstSpecStep } from '../tutorial/steps/first-spec.js';
|
|
12
|
-
import { planningStep } from '../tutorial/steps/planning.js';
|
|
13
|
-
import { implementationStep } from '../tutorial/steps/implementation.js';
|
|
14
|
-
import { reviewStep } from '../tutorial/steps/review.js';
|
|
15
|
-
/**
|
|
16
|
-
* All tutorial steps in order
|
|
17
|
-
*/
|
|
18
|
-
const TUTORIAL_STEPS = [
|
|
19
|
-
welcomeStep,
|
|
20
|
-
setupStep,
|
|
21
|
-
firstSpecStep,
|
|
22
|
-
planningStep,
|
|
23
|
-
implementationStep,
|
|
24
|
-
reviewStep,
|
|
25
|
-
];
|
|
26
|
-
/**
|
|
27
|
-
* Main tutorial command
|
|
28
|
-
*/
|
|
29
|
-
export async function tutorial(options) {
|
|
30
|
-
// Handle --reset flag
|
|
31
|
-
if (options.reset) {
|
|
32
|
-
await resetTutorialState();
|
|
33
|
-
logger.success('Tutorial progress reset. Run `af tutorial` to start fresh.');
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
// Handle --status flag
|
|
37
|
-
if (options.status) {
|
|
38
|
-
await showStatus(TUTORIAL_STEPS);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
// Handle --skip flag
|
|
42
|
-
if (options.skip) {
|
|
43
|
-
await skipCurrentStep(TUTORIAL_STEPS);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
// Default: run the tutorial
|
|
47
|
-
await runTutorial(TUTORIAL_STEPS);
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=tutorial.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tutorial.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/tutorial.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAa,MAAM,uBAAuB,CAAC;AAE5F,4BAA4B;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD;;GAEG;AACH,MAAM,cAAc,GAAW;IAC7B,WAAW;IACX,SAAS;IACT,aAAa;IACb,YAAY;IACZ,kBAAkB;IAClB,UAAU;CACX,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB;IACrD,sBAAsB;IACtB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,kBAAkB,EAAE,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;QAC7E,OAAO;IACT,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,qBAAqB;IACrB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,eAAe,CAAC,cAAc,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,4BAA4B;IAC5B,MAAM,WAAW,CAAC,cAAc,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/commands/util.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuCD;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkEnE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/tutorial/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent-farm/tutorial/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Simple prompt utilities for the tutorial
|
|
3
|
-
* Uses readline for interactive input
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Ask a yes/no confirmation question
|
|
7
|
-
*/
|
|
8
|
-
export declare function confirm(message: string, defaultValue?: boolean): Promise<boolean>;
|
|
9
|
-
/**
|
|
10
|
-
* Ask for free-form text input
|
|
11
|
-
*/
|
|
12
|
-
export declare function prompt(message: string, defaultValue?: string): Promise<string>;
|
|
13
|
-
/**
|
|
14
|
-
* Ask user to select from a list of options
|
|
15
|
-
*/
|
|
16
|
-
export declare function select(message: string, options: string[]): Promise<string>;
|
|
17
|
-
/**
|
|
18
|
-
* Wait for user to press Enter to continue
|
|
19
|
-
*/
|
|
20
|
-
export declare function pressEnter(message?: string): Promise<void>;
|
|
21
|
-
/**
|
|
22
|
-
* Print a section header
|
|
23
|
-
*/
|
|
24
|
-
export declare function section(title: string): void;
|
|
25
|
-
/**
|
|
26
|
-
* Print content text (with proper wrapping)
|
|
27
|
-
*/
|
|
28
|
-
export declare function content(text: string): void;
|
|
29
|
-
/**
|
|
30
|
-
* Print a bullet point
|
|
31
|
-
*/
|
|
32
|
-
export declare function bullet(text: string): void;
|
|
33
|
-
/**
|
|
34
|
-
* Print a numbered step
|
|
35
|
-
*/
|
|
36
|
-
export declare function step(num: number, text: string): void;
|
|
37
|
-
/**
|
|
38
|
-
* Print highlighted text (e.g., for commands)
|
|
39
|
-
*/
|
|
40
|
-
export declare function highlight(text: string): void;
|
|
41
|
-
/**
|
|
42
|
-
* Print a success message
|
|
43
|
-
*/
|
|
44
|
-
export declare function success(text: string): void;
|
|
45
|
-
/**
|
|
46
|
-
* Print a warning message
|
|
47
|
-
*/
|
|
48
|
-
export declare function warn(text: string): void;
|
|
49
|
-
/**
|
|
50
|
-
* Print an info message
|
|
51
|
-
*/
|
|
52
|
-
export declare function info(text: string): void;
|
|
53
|
-
/**
|
|
54
|
-
* Print a code block
|
|
55
|
-
*/
|
|
56
|
-
export declare function code(text: string): void;
|
|
57
|
-
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/tutorial/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAepF;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWpF;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBhF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,SAA+B,GAAG,OAAO,CAAC,IAAI,CAAC,CAStF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAM3C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOvC"}
|