@cluesmith/codev 1.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.
- package/bin/af.js +8 -0
- package/bin/codev.js +4 -0
- package/bin/consult.js +7 -0
- package/dist/agent-farm/cli.d.ts +11 -0
- package/dist/agent-farm/cli.d.ts.map +1 -0
- package/dist/agent-farm/cli.js +359 -0
- package/dist/agent-farm/cli.js.map +1 -0
- package/dist/agent-farm/commands/cleanup.d.ts +12 -0
- package/dist/agent-farm/commands/cleanup.d.ts.map +1 -0
- package/dist/agent-farm/commands/cleanup.js +154 -0
- package/dist/agent-farm/commands/cleanup.js.map +1 -0
- package/dist/agent-farm/commands/db.d.ts +38 -0
- package/dist/agent-farm/commands/db.d.ts.map +1 -0
- package/dist/agent-farm/commands/db.js +133 -0
- package/dist/agent-farm/commands/db.js.map +1 -0
- package/dist/agent-farm/commands/index.d.ts +11 -0
- package/dist/agent-farm/commands/index.d.ts.map +1 -0
- package/dist/agent-farm/commands/index.js +11 -0
- package/dist/agent-farm/commands/index.js.map +1 -0
- package/dist/agent-farm/commands/open.d.ts +15 -0
- package/dist/agent-farm/commands/open.d.ts.map +1 -0
- package/dist/agent-farm/commands/open.js +118 -0
- package/dist/agent-farm/commands/open.js.map +1 -0
- package/dist/agent-farm/commands/rename.d.ts +13 -0
- package/dist/agent-farm/commands/rename.d.ts.map +1 -0
- package/dist/agent-farm/commands/rename.js +33 -0
- package/dist/agent-farm/commands/rename.js.map +1 -0
- package/dist/agent-farm/commands/send.d.ts +9 -0
- package/dist/agent-farm/commands/send.d.ts.map +1 -0
- package/dist/agent-farm/commands/send.js +282 -0
- package/dist/agent-farm/commands/send.js.map +1 -0
- package/dist/agent-farm/commands/spawn.d.ts +15 -0
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -0
- package/dist/agent-farm/commands/spawn.js +575 -0
- package/dist/agent-farm/commands/spawn.js.map +1 -0
- package/dist/agent-farm/commands/start.d.ts +9 -0
- package/dist/agent-farm/commands/start.d.ts.map +1 -0
- package/dist/agent-farm/commands/start.js +175 -0
- package/dist/agent-farm/commands/start.js.map +1 -0
- package/dist/agent-farm/commands/status.d.ts +8 -0
- package/dist/agent-farm/commands/status.d.ts.map +1 -0
- package/dist/agent-farm/commands/status.js +123 -0
- package/dist/agent-farm/commands/status.js.map +1 -0
- package/dist/agent-farm/commands/stop.d.ts +8 -0
- package/dist/agent-farm/commands/stop.d.ts.map +1 -0
- package/dist/agent-farm/commands/stop.js +76 -0
- package/dist/agent-farm/commands/stop.js.map +1 -0
- package/dist/agent-farm/commands/tower.d.ts +19 -0
- package/dist/agent-farm/commands/tower.d.ts.map +1 -0
- package/dist/agent-farm/commands/tower.js +125 -0
- package/dist/agent-farm/commands/tower.js.map +1 -0
- package/dist/agent-farm/commands/tutorial.d.ts +10 -0
- package/dist/agent-farm/commands/tutorial.d.ts.map +1 -0
- package/dist/agent-farm/commands/tutorial.js +49 -0
- package/dist/agent-farm/commands/tutorial.js.map +1 -0
- package/dist/agent-farm/commands/util.d.ts +15 -0
- package/dist/agent-farm/commands/util.d.ts.map +1 -0
- package/dist/agent-farm/commands/util.js +108 -0
- package/dist/agent-farm/commands/util.js.map +1 -0
- package/dist/agent-farm/db/errors.d.ts +17 -0
- package/dist/agent-farm/db/errors.d.ts.map +1 -0
- package/dist/agent-farm/db/errors.js +46 -0
- package/dist/agent-farm/db/errors.js.map +1 -0
- package/dist/agent-farm/db/index.d.ts +41 -0
- package/dist/agent-farm/db/index.d.ts.map +1 -0
- package/dist/agent-farm/db/index.js +168 -0
- package/dist/agent-farm/db/index.js.map +1 -0
- package/dist/agent-farm/db/migrate.d.ts +15 -0
- package/dist/agent-farm/db/migrate.d.ts.map +1 -0
- package/dist/agent-farm/db/migrate.js +137 -0
- package/dist/agent-farm/db/migrate.js.map +1 -0
- package/dist/agent-farm/db/schema.d.ts +16 -0
- package/dist/agent-farm/db/schema.d.ts.map +1 -0
- package/dist/agent-farm/db/schema.js +103 -0
- package/dist/agent-farm/db/schema.js.map +1 -0
- package/dist/agent-farm/db/types.d.ts +87 -0
- package/dist/agent-farm/db/types.d.ts.map +1 -0
- package/dist/agent-farm/db/types.js +65 -0
- package/dist/agent-farm/db/types.js.map +1 -0
- package/dist/agent-farm/index.d.ts +7 -0
- package/dist/agent-farm/index.d.ts.map +1 -0
- package/dist/agent-farm/index.js +373 -0
- package/dist/agent-farm/index.js.map +1 -0
- package/dist/agent-farm/servers/annotate-server.d.ts +9 -0
- package/dist/agent-farm/servers/annotate-server.d.ts.map +1 -0
- package/dist/agent-farm/servers/annotate-server.js +136 -0
- package/dist/agent-farm/servers/annotate-server.js.map +1 -0
- package/dist/agent-farm/servers/dashboard-server.d.ts +9 -0
- package/dist/agent-farm/servers/dashboard-server.d.ts.map +1 -0
- package/dist/agent-farm/servers/dashboard-server.js +939 -0
- package/dist/agent-farm/servers/dashboard-server.js.map +1 -0
- package/dist/agent-farm/servers/tower-server.d.ts +9 -0
- package/dist/agent-farm/servers/tower-server.d.ts.map +1 -0
- package/dist/agent-farm/servers/tower-server.js +463 -0
- package/dist/agent-farm/servers/tower-server.js.map +1 -0
- package/dist/agent-farm/state.d.ts +93 -0
- package/dist/agent-farm/state.d.ts.map +1 -0
- package/dist/agent-farm/state.js +253 -0
- package/dist/agent-farm/state.js.map +1 -0
- package/dist/agent-farm/tutorial/index.d.ts +8 -0
- package/dist/agent-farm/tutorial/index.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/index.js +8 -0
- package/dist/agent-farm/tutorial/index.js.map +1 -0
- package/dist/agent-farm/tutorial/prompts.d.ts +57 -0
- package/dist/agent-farm/tutorial/prompts.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/prompts.js +147 -0
- package/dist/agent-farm/tutorial/prompts.js.map +1 -0
- package/dist/agent-farm/tutorial/runner.d.ts +52 -0
- package/dist/agent-farm/tutorial/runner.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/runner.js +204 -0
- package/dist/agent-farm/tutorial/runner.js.map +1 -0
- package/dist/agent-farm/tutorial/state.d.ts +26 -0
- package/dist/agent-farm/tutorial/state.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/state.js +89 -0
- package/dist/agent-farm/tutorial/state.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/first-spec.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/first-spec.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/first-spec.js +136 -0
- package/dist/agent-farm/tutorial/steps/first-spec.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/implementation.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/implementation.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/implementation.js +76 -0
- package/dist/agent-farm/tutorial/steps/implementation.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/index.d.ts +10 -0
- package/dist/agent-farm/tutorial/steps/index.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/index.js +10 -0
- package/dist/agent-farm/tutorial/steps/index.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/planning.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/planning.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/planning.js +143 -0
- package/dist/agent-farm/tutorial/steps/planning.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/review.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/review.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/review.js +78 -0
- package/dist/agent-farm/tutorial/steps/review.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/setup.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/setup.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/setup.js +126 -0
- package/dist/agent-farm/tutorial/steps/setup.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/welcome.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/welcome.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/welcome.js +50 -0
- package/dist/agent-farm/tutorial/steps/welcome.js.map +1 -0
- package/dist/agent-farm/types.d.ts +131 -0
- package/dist/agent-farm/types.d.ts.map +1 -0
- package/dist/agent-farm/types.js +5 -0
- package/dist/agent-farm/types.js.map +1 -0
- package/dist/agent-farm/utils/config.d.ts +27 -0
- package/dist/agent-farm/utils/config.d.ts.map +1 -0
- package/dist/agent-farm/utils/config.js +242 -0
- package/dist/agent-farm/utils/config.js.map +1 -0
- package/dist/agent-farm/utils/deps.d.ts +51 -0
- package/dist/agent-farm/utils/deps.d.ts.map +1 -0
- package/dist/agent-farm/utils/deps.js +194 -0
- package/dist/agent-farm/utils/deps.js.map +1 -0
- package/dist/agent-farm/utils/index.d.ts +6 -0
- package/dist/agent-farm/utils/index.d.ts.map +1 -0
- package/dist/agent-farm/utils/index.js +6 -0
- package/dist/agent-farm/utils/index.js.map +1 -0
- package/dist/agent-farm/utils/logger.d.ts +31 -0
- package/dist/agent-farm/utils/logger.d.ts.map +1 -0
- package/dist/agent-farm/utils/logger.js +58 -0
- package/dist/agent-farm/utils/logger.js.map +1 -0
- package/dist/agent-farm/utils/orphan-handler.d.ts +27 -0
- package/dist/agent-farm/utils/orphan-handler.d.ts.map +1 -0
- package/dist/agent-farm/utils/orphan-handler.js +127 -0
- package/dist/agent-farm/utils/orphan-handler.js.map +1 -0
- package/dist/agent-farm/utils/port-registry.d.ts +58 -0
- package/dist/agent-farm/utils/port-registry.d.ts.map +1 -0
- package/dist/agent-farm/utils/port-registry.js +149 -0
- package/dist/agent-farm/utils/port-registry.js.map +1 -0
- package/dist/agent-farm/utils/shell.d.ts +45 -0
- package/dist/agent-farm/utils/shell.d.ts.map +1 -0
- package/dist/agent-farm/utils/shell.js +120 -0
- package/dist/agent-farm/utils/shell.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +160 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/adopt.d.ts +12 -0
- package/dist/commands/adopt.d.ts.map +1 -0
- package/dist/commands/adopt.js +178 -0
- package/dist/commands/adopt.js.map +1 -0
- package/dist/commands/consult/index.d.ts +17 -0
- package/dist/commands/consult/index.d.ts.map +1 -0
- package/dist/commands/consult/index.js +405 -0
- package/dist/commands/consult/index.js.map +1 -0
- package/dist/commands/doctor.d.ts +10 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +346 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +167 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/tower.d.ts +16 -0
- package/dist/commands/tower.d.ts.map +1 -0
- package/dist/commands/tower.js +21 -0
- package/dist/commands/tower.js.map +1 -0
- package/dist/commands/update.d.ts +13 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +137 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/lib/templates.d.ts +57 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +205 -0
- package/dist/lib/templates.js.map +1 -0
- package/package.json +55 -0
- package/templates/AGENTS.md +49 -0
- package/templates/CLAUDE.md +47 -0
- package/templates/DEPENDENCIES.md +344 -0
- package/templates/agents/architecture-documenter.md +189 -0
- package/templates/agents/codev-updater.md +276 -0
- package/templates/agents/spider-protocol-updater.md +118 -0
- package/templates/annotate.html +903 -0
- package/templates/bin/agent-farm +18 -0
- package/templates/bin/annotate-server.js +140 -0
- package/templates/bin/codev-doctor +335 -0
- package/templates/builders.md +30 -0
- package/templates/config.json +7 -0
- package/templates/dashboard-split.html +1679 -0
- package/templates/dashboard.html +149 -0
- package/templates/plans/.gitkeep +0 -0
- package/templates/protocols/experiment/protocol.md +229 -0
- package/templates/protocols/experiment/templates/notes.md +97 -0
- package/templates/protocols/maintain/protocol.md +235 -0
- package/templates/protocols/spider/protocol.md +639 -0
- package/templates/protocols/spider/templates/plan.md +169 -0
- package/templates/protocols/spider/templates/review.md +207 -0
- package/templates/protocols/spider/templates/spec.md +140 -0
- package/templates/protocols/spider-solo/protocol.md +619 -0
- package/templates/protocols/spider-solo/templates/plan.md +169 -0
- package/templates/protocols/spider-solo/templates/review.md +207 -0
- package/templates/protocols/spider-solo/templates/spec.md +140 -0
- package/templates/protocols/tick/protocol.md +250 -0
- package/templates/protocols/tick/templates/plan.md +67 -0
- package/templates/protocols/tick/templates/review.md +90 -0
- package/templates/protocols/tick/templates/spec.md +61 -0
- package/templates/reviews/.gitkeep +0 -0
- package/templates/roles/architect.md +230 -0
- package/templates/roles/builder.md +175 -0
- package/templates/roles/consultant.md +27 -0
- package/templates/specs/.gitkeep +0 -0
- package/templates/templates/projectlist.md +129 -0
- package/templates/tower.html +1032 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Start command - launches the architect dashboard
|
|
3
|
+
*/
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
6
|
+
import { getConfig, ensureDirectories } from '../utils/index.js';
|
|
7
|
+
import { logger, fatal } from '../utils/logger.js';
|
|
8
|
+
import { spawnDetached, commandExists, openBrowser, run } from '../utils/shell.js';
|
|
9
|
+
import { checkCoreDependencies } from '../utils/deps.js';
|
|
10
|
+
import { loadState, setArchitect } from '../state.js';
|
|
11
|
+
import { handleOrphanedSessions, warnAboutStaleArtifacts } from '../utils/orphan-handler.js';
|
|
12
|
+
/**
|
|
13
|
+
* Find and load a role file - tries local codev/roles/ first, falls back to bundled
|
|
14
|
+
*/
|
|
15
|
+
function loadRolePrompt(config, roleName) {
|
|
16
|
+
// Try local project first
|
|
17
|
+
const localPath = resolve(config.codevDir, 'roles', `${roleName}.md`);
|
|
18
|
+
if (existsSync(localPath)) {
|
|
19
|
+
return { content: readFileSync(localPath, 'utf-8'), source: 'local' };
|
|
20
|
+
}
|
|
21
|
+
// Fall back to bundled
|
|
22
|
+
const bundledPath = resolve(config.bundledRolesDir, `${roleName}.md`);
|
|
23
|
+
if (existsSync(bundledPath)) {
|
|
24
|
+
return { content: readFileSync(bundledPath, 'utf-8'), source: 'bundled' };
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Start the architect dashboard
|
|
30
|
+
*/
|
|
31
|
+
export async function start(options = {}) {
|
|
32
|
+
const config = getConfig();
|
|
33
|
+
// Check for and clean up orphaned tmux sessions
|
|
34
|
+
await handleOrphanedSessions({ kill: true });
|
|
35
|
+
// Warn about stale artifacts from bash-era
|
|
36
|
+
warnAboutStaleArtifacts(config.codevDir);
|
|
37
|
+
// Check if already running
|
|
38
|
+
const state = loadState();
|
|
39
|
+
if (state.architect) {
|
|
40
|
+
logger.warn(`Architect already running on port ${state.architect.port}`);
|
|
41
|
+
logger.info(`Dashboard: http://localhost:${config.dashboardPort}`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Ensure directories exist
|
|
45
|
+
await ensureDirectories(config);
|
|
46
|
+
// Check all core dependencies (node, tmux, ttyd, git)
|
|
47
|
+
await checkCoreDependencies();
|
|
48
|
+
// Command is passed from index.ts (already resolved via CLI > config.json > default)
|
|
49
|
+
let cmd = options.cmd || 'claude';
|
|
50
|
+
// Check if base command exists before we wrap it in a launch script
|
|
51
|
+
const baseCmdName = cmd.split(' ')[0];
|
|
52
|
+
if (!(await commandExists(baseCmdName))) {
|
|
53
|
+
fatal(`Command not found: ${baseCmdName}`);
|
|
54
|
+
}
|
|
55
|
+
// Load architect role if available and not disabled
|
|
56
|
+
if (!options.noRole) {
|
|
57
|
+
const role = loadRolePrompt(config, 'architect');
|
|
58
|
+
if (role) {
|
|
59
|
+
// Write role to a file and create a launch script to avoid shell escaping issues
|
|
60
|
+
// The architect.md file contains backticks, $variables, and other shell-sensitive chars
|
|
61
|
+
const roleFile = resolve(config.stateDir, 'architect-role.md');
|
|
62
|
+
writeFileSync(roleFile, role.content, 'utf-8');
|
|
63
|
+
const launchScript = resolve(config.stateDir, 'launch-architect.sh');
|
|
64
|
+
writeFileSync(launchScript, `#!/bin/bash
|
|
65
|
+
cd "${config.projectRoot}"
|
|
66
|
+
exec ${cmd} --append-system-prompt "$(cat '${roleFile}')"
|
|
67
|
+
`, { mode: 0o755 });
|
|
68
|
+
cmd = launchScript;
|
|
69
|
+
logger.info(`Loaded architect role (${role.source})`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Find available port for architect terminal
|
|
73
|
+
let architectPort = config.architectPort;
|
|
74
|
+
if (options.port !== undefined) {
|
|
75
|
+
const parsedPort = Number(options.port);
|
|
76
|
+
if (!Number.isFinite(parsedPort) || parsedPort < 1024 || parsedPort > 65535) {
|
|
77
|
+
fatal(`Invalid port: ${options.port}. Must be a number between 1024-65535`);
|
|
78
|
+
}
|
|
79
|
+
architectPort = parsedPort;
|
|
80
|
+
}
|
|
81
|
+
logger.header('Starting Agent Farm');
|
|
82
|
+
logger.kv('Project', config.projectRoot);
|
|
83
|
+
logger.kv('Command', cmd);
|
|
84
|
+
logger.kv('Port', architectPort);
|
|
85
|
+
// Start architect in tmux session for persistence
|
|
86
|
+
// Use port in session name to ensure uniqueness across projects
|
|
87
|
+
const sessionName = `af-architect-${architectPort}`;
|
|
88
|
+
// Kill any existing session
|
|
89
|
+
try {
|
|
90
|
+
await run(`tmux kill-session -t ${sessionName} 2>/dev/null || true`);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Ignore
|
|
94
|
+
}
|
|
95
|
+
// Create tmux session with the command
|
|
96
|
+
await run(`tmux new-session -d -s ${sessionName} -x 200 -y 50 '${cmd}'`, { cwd: config.projectRoot });
|
|
97
|
+
await run(`tmux set-option -t ${sessionName} -g mouse on`);
|
|
98
|
+
await run(`tmux set-option -t ${sessionName} -g set-clipboard on`);
|
|
99
|
+
await run(`tmux set-option -t ${sessionName} -g allow-passthrough on`);
|
|
100
|
+
// Copy selection to clipboard when mouse is released (pbcopy for macOS)
|
|
101
|
+
await run(`tmux bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"`);
|
|
102
|
+
await run(`tmux bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"`);
|
|
103
|
+
// Start ttyd attached to the tmux session
|
|
104
|
+
// Use custom index.html for file path click-to-open functionality (optional)
|
|
105
|
+
const customIndexPath = resolve(config.templatesDir, 'ttyd-index.html');
|
|
106
|
+
const ttydArgs = [
|
|
107
|
+
'-W',
|
|
108
|
+
'-p', String(architectPort),
|
|
109
|
+
'-t', 'theme={"background":"#000000"}',
|
|
110
|
+
'-t', 'rightClickSelectsWord=true', // Enable word selection on right-click for better UX
|
|
111
|
+
];
|
|
112
|
+
// Add custom index if it exists
|
|
113
|
+
if (existsSync(customIndexPath)) {
|
|
114
|
+
ttydArgs.push('-I', customIndexPath);
|
|
115
|
+
logger.info('Using custom terminal with file click support');
|
|
116
|
+
}
|
|
117
|
+
ttydArgs.push('tmux', 'attach-session', '-t', sessionName);
|
|
118
|
+
const ttydProcess = spawnDetached('ttyd', ttydArgs, {
|
|
119
|
+
cwd: config.projectRoot,
|
|
120
|
+
});
|
|
121
|
+
if (!ttydProcess.pid) {
|
|
122
|
+
fatal('Failed to start ttyd process');
|
|
123
|
+
}
|
|
124
|
+
// Save architect state
|
|
125
|
+
const architectState = {
|
|
126
|
+
port: architectPort,
|
|
127
|
+
pid: ttydProcess.pid,
|
|
128
|
+
cmd,
|
|
129
|
+
startedAt: new Date().toISOString(),
|
|
130
|
+
tmuxSession: sessionName,
|
|
131
|
+
};
|
|
132
|
+
setArchitect(architectState);
|
|
133
|
+
// Wait a moment for ttyd to start
|
|
134
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
135
|
+
// Start the dashboard server on the main port
|
|
136
|
+
const dashboardPort = config.dashboardPort;
|
|
137
|
+
await startDashboard(config.projectRoot, dashboardPort, architectPort);
|
|
138
|
+
logger.blank();
|
|
139
|
+
logger.success('Agent Farm started!');
|
|
140
|
+
logger.kv('Dashboard', `http://localhost:${dashboardPort}`);
|
|
141
|
+
// Open dashboard in browser
|
|
142
|
+
await openBrowser(`http://localhost:${dashboardPort}`);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Start the dashboard HTTP server
|
|
146
|
+
*/
|
|
147
|
+
async function startDashboard(projectRoot, port, _architectPort) {
|
|
148
|
+
const config = getConfig();
|
|
149
|
+
// Try TypeScript source first (dev mode), then compiled JS
|
|
150
|
+
const tsScript = resolve(config.serversDir, 'dashboard-server.ts');
|
|
151
|
+
const jsScript = resolve(config.serversDir, 'dashboard-server.js');
|
|
152
|
+
let command;
|
|
153
|
+
let args;
|
|
154
|
+
if (existsSync(tsScript)) {
|
|
155
|
+
// Dev mode: run with tsx
|
|
156
|
+
command = 'npx';
|
|
157
|
+
args = ['tsx', tsScript, String(port)];
|
|
158
|
+
}
|
|
159
|
+
else if (existsSync(jsScript)) {
|
|
160
|
+
// Prod mode: run compiled JS
|
|
161
|
+
command = 'node';
|
|
162
|
+
args = [jsScript, String(port)];
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
logger.warn('Dashboard server not found, skipping dashboard');
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const serverProcess = spawnDetached(command, args, {
|
|
169
|
+
cwd: projectRoot,
|
|
170
|
+
});
|
|
171
|
+
if (!serverProcess.pid) {
|
|
172
|
+
logger.warn('Failed to start dashboard server');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA2F5C"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status command - shows status of all agents
|
|
3
|
+
*/
|
|
4
|
+
import { loadState } from '../state.js';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
import { isProcessRunning } from '../utils/shell.js';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
/**
|
|
9
|
+
* Display status of all agent farm processes
|
|
10
|
+
*/
|
|
11
|
+
export async function status() {
|
|
12
|
+
const state = loadState();
|
|
13
|
+
logger.header('Agent Farm Status');
|
|
14
|
+
// Architect status
|
|
15
|
+
if (state.architect) {
|
|
16
|
+
const running = await isProcessRunning(state.architect.pid);
|
|
17
|
+
const statusText = running ? chalk.green('running') : chalk.red('stopped');
|
|
18
|
+
logger.kv('Architect', `${statusText} (PID: ${state.architect.pid}, port: ${state.architect.port})`);
|
|
19
|
+
logger.kv(' Command', state.architect.cmd);
|
|
20
|
+
logger.kv(' Started', state.architect.startedAt);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
logger.kv('Architect', chalk.gray('not running'));
|
|
24
|
+
}
|
|
25
|
+
logger.blank();
|
|
26
|
+
// Builders
|
|
27
|
+
if (state.builders.length > 0) {
|
|
28
|
+
logger.info('Builders:');
|
|
29
|
+
const widths = [12, 20, 10, 12, 10, 6];
|
|
30
|
+
logger.row(['ID', 'Name', 'Type', 'Status', 'Phase', 'Port'], widths);
|
|
31
|
+
logger.row(['──', '────', '────', '──────', '─────', '────'], widths);
|
|
32
|
+
for (const builder of state.builders) {
|
|
33
|
+
const running = await isProcessRunning(builder.pid);
|
|
34
|
+
const statusColor = getStatusColor(builder.status, running);
|
|
35
|
+
const typeColor = getTypeColor(builder.type || 'spec');
|
|
36
|
+
logger.row([
|
|
37
|
+
builder.id,
|
|
38
|
+
builder.name.substring(0, 18),
|
|
39
|
+
typeColor(builder.type || 'spec'),
|
|
40
|
+
statusColor(builder.status),
|
|
41
|
+
builder.phase.substring(0, 8),
|
|
42
|
+
String(builder.port),
|
|
43
|
+
], widths);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
logger.info('Builders: none');
|
|
48
|
+
}
|
|
49
|
+
logger.blank();
|
|
50
|
+
// Utils
|
|
51
|
+
if (state.utils.length > 0) {
|
|
52
|
+
logger.info('Utility Terminals:');
|
|
53
|
+
const widths = [8, 20, 8];
|
|
54
|
+
logger.row(['ID', 'Name', 'Port'], widths);
|
|
55
|
+
logger.row(['──', '────', '────'], widths);
|
|
56
|
+
for (const util of state.utils) {
|
|
57
|
+
const running = await isProcessRunning(util.pid);
|
|
58
|
+
const name = running ? util.name : chalk.gray(util.name + ' (stopped)');
|
|
59
|
+
logger.row([
|
|
60
|
+
util.id,
|
|
61
|
+
name.substring(0, 18),
|
|
62
|
+
String(util.port),
|
|
63
|
+
], widths);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
logger.info('Utility Terminals: none');
|
|
68
|
+
}
|
|
69
|
+
logger.blank();
|
|
70
|
+
// Annotations
|
|
71
|
+
if (state.annotations.length > 0) {
|
|
72
|
+
logger.info('Annotations:');
|
|
73
|
+
const widths = [8, 30, 8];
|
|
74
|
+
logger.row(['ID', 'File', 'Port'], widths);
|
|
75
|
+
logger.row(['──', '────', '────'], widths);
|
|
76
|
+
for (const annotation of state.annotations) {
|
|
77
|
+
const running = await isProcessRunning(annotation.pid);
|
|
78
|
+
const file = running ? annotation.file : chalk.gray(annotation.file + ' (stopped)');
|
|
79
|
+
logger.row([
|
|
80
|
+
annotation.id,
|
|
81
|
+
file.substring(0, 28),
|
|
82
|
+
String(annotation.port),
|
|
83
|
+
], widths);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
logger.info('Annotations: none');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function getStatusColor(status, running) {
|
|
91
|
+
if (!running) {
|
|
92
|
+
return chalk.gray;
|
|
93
|
+
}
|
|
94
|
+
switch (status) {
|
|
95
|
+
case 'implementing':
|
|
96
|
+
return chalk.blue;
|
|
97
|
+
case 'blocked':
|
|
98
|
+
return chalk.yellow;
|
|
99
|
+
case 'pr-ready':
|
|
100
|
+
return chalk.green;
|
|
101
|
+
case 'complete':
|
|
102
|
+
return chalk.green;
|
|
103
|
+
default:
|
|
104
|
+
return chalk.white;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function getTypeColor(type) {
|
|
108
|
+
switch (type) {
|
|
109
|
+
case 'spec':
|
|
110
|
+
return chalk.cyan;
|
|
111
|
+
case 'task':
|
|
112
|
+
return chalk.magenta;
|
|
113
|
+
case 'protocol':
|
|
114
|
+
return chalk.yellow;
|
|
115
|
+
case 'worktree':
|
|
116
|
+
return chalk.blue;
|
|
117
|
+
case 'shell':
|
|
118
|
+
return chalk.gray;
|
|
119
|
+
default:
|
|
120
|
+
return chalk.white;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/commands/stop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAoE1C"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stop command - stops all agent farm processes
|
|
3
|
+
*/
|
|
4
|
+
import { loadState, clearState } from '../state.js';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
import { killProcess, isProcessRunning } from '../utils/shell.js';
|
|
7
|
+
/**
|
|
8
|
+
* Stop all agent farm processes
|
|
9
|
+
*/
|
|
10
|
+
export async function stop() {
|
|
11
|
+
const state = loadState();
|
|
12
|
+
logger.header('Stopping Agent Farm');
|
|
13
|
+
let stopped = 0;
|
|
14
|
+
// Stop architect
|
|
15
|
+
if (state.architect) {
|
|
16
|
+
logger.info(`Stopping architect (PID: ${state.architect.pid})`);
|
|
17
|
+
try {
|
|
18
|
+
if (await isProcessRunning(state.architect.pid)) {
|
|
19
|
+
await killProcess(state.architect.pid);
|
|
20
|
+
stopped++;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
logger.warn(`Failed to stop architect: ${error}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Stop all builders
|
|
28
|
+
for (const builder of state.builders) {
|
|
29
|
+
logger.info(`Stopping builder ${builder.id} (PID: ${builder.pid})`);
|
|
30
|
+
try {
|
|
31
|
+
if (await isProcessRunning(builder.pid)) {
|
|
32
|
+
await killProcess(builder.pid);
|
|
33
|
+
stopped++;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
logger.warn(`Failed to stop builder ${builder.id}: ${error}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Stop all utils
|
|
41
|
+
for (const util of state.utils) {
|
|
42
|
+
logger.info(`Stopping util ${util.id} (PID: ${util.pid})`);
|
|
43
|
+
try {
|
|
44
|
+
if (await isProcessRunning(util.pid)) {
|
|
45
|
+
await killProcess(util.pid);
|
|
46
|
+
stopped++;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logger.warn(`Failed to stop util ${util.id}: ${error}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Stop all annotations
|
|
54
|
+
for (const annotation of state.annotations) {
|
|
55
|
+
logger.info(`Stopping annotation ${annotation.id} (PID: ${annotation.pid})`);
|
|
56
|
+
try {
|
|
57
|
+
if (await isProcessRunning(annotation.pid)) {
|
|
58
|
+
await killProcess(annotation.pid);
|
|
59
|
+
stopped++;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
logger.warn(`Failed to stop annotation ${annotation.id}: ${error}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Clear state
|
|
67
|
+
clearState();
|
|
68
|
+
logger.blank();
|
|
69
|
+
if (stopped > 0) {
|
|
70
|
+
logger.success(`Stopped ${stopped} process(es)`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
logger.info('No processes were running');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/stop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tower command - launches the tower dashboard showing all instances
|
|
3
|
+
*/
|
|
4
|
+
export interface TowerStartOptions {
|
|
5
|
+
port?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface TowerStopOptions {
|
|
8
|
+
port?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Start the tower dashboard
|
|
12
|
+
*/
|
|
13
|
+
export declare function towerStart(options?: TowerStartOptions): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Stop the tower dashboard
|
|
16
|
+
*/
|
|
17
|
+
export declare function towerStop(options?: TowerStopOptions): Promise<void>;
|
|
18
|
+
export declare const tower: typeof towerStart;
|
|
19
|
+
//# sourceMappingURL=tower.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tower.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/commands/tower.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAsCD;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD/E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB7E;AAGD,eAAO,MAAM,KAAK,mBAAa,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tower command - launches the tower dashboard showing all instances
|
|
3
|
+
*/
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import net from 'node:net';
|
|
7
|
+
import { logger, fatal } from '../utils/logger.js';
|
|
8
|
+
import { spawnDetached, openBrowser } from '../utils/shell.js';
|
|
9
|
+
import { getConfig } from '../utils/config.js';
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
// Default port for tower dashboard
|
|
12
|
+
const DEFAULT_TOWER_PORT = 4100;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a port is already in use
|
|
15
|
+
*/
|
|
16
|
+
async function isPortInUse(port) {
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const server = net.createServer();
|
|
19
|
+
server.once('error', (err) => {
|
|
20
|
+
if (err.code === 'EADDRINUSE') {
|
|
21
|
+
resolve(true);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
resolve(false);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
server.once('listening', () => {
|
|
28
|
+
server.close(() => resolve(false));
|
|
29
|
+
});
|
|
30
|
+
server.listen(port, '127.0.0.1');
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get all PIDs of processes listening on a port
|
|
35
|
+
*/
|
|
36
|
+
function getProcessesOnPort(port) {
|
|
37
|
+
try {
|
|
38
|
+
const result = execSync(`lsof -ti :${port} 2>/dev/null`, { encoding: 'utf-8' });
|
|
39
|
+
return result
|
|
40
|
+
.trim()
|
|
41
|
+
.split('\n')
|
|
42
|
+
.map((line) => parseInt(line, 10))
|
|
43
|
+
.filter((pid) => !isNaN(pid));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Start the tower dashboard
|
|
51
|
+
*/
|
|
52
|
+
export async function towerStart(options = {}) {
|
|
53
|
+
const port = options.port || DEFAULT_TOWER_PORT;
|
|
54
|
+
// Check if already running
|
|
55
|
+
if (await isPortInUse(port)) {
|
|
56
|
+
const dashboardUrl = `http://localhost:${port}`;
|
|
57
|
+
logger.info(`Tower already running at ${dashboardUrl}`);
|
|
58
|
+
await openBrowser(dashboardUrl);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const config = getConfig();
|
|
62
|
+
// Find tower server script
|
|
63
|
+
const tsScript = resolve(config.serversDir, 'tower-server.ts');
|
|
64
|
+
const jsScript = resolve(config.serversDir, 'tower-server.js');
|
|
65
|
+
let command;
|
|
66
|
+
let args;
|
|
67
|
+
if (existsSync(tsScript)) {
|
|
68
|
+
// Dev mode: run with tsx
|
|
69
|
+
command = 'npx';
|
|
70
|
+
args = ['tsx', tsScript, String(port)];
|
|
71
|
+
}
|
|
72
|
+
else if (existsSync(jsScript)) {
|
|
73
|
+
// Prod mode: run compiled JS
|
|
74
|
+
command = 'node';
|
|
75
|
+
args = [jsScript, String(port)];
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
fatal('Tower server not found');
|
|
79
|
+
}
|
|
80
|
+
logger.header('Starting Tower');
|
|
81
|
+
logger.kv('Port', port);
|
|
82
|
+
// Start tower server
|
|
83
|
+
const serverProcess = spawnDetached(command, args, {
|
|
84
|
+
cwd: process.cwd(),
|
|
85
|
+
});
|
|
86
|
+
if (!serverProcess.pid) {
|
|
87
|
+
fatal('Failed to start tower server');
|
|
88
|
+
}
|
|
89
|
+
// Wait a moment for server to start
|
|
90
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
91
|
+
const dashboardUrl = `http://localhost:${port}`;
|
|
92
|
+
logger.blank();
|
|
93
|
+
logger.success('Tower started!');
|
|
94
|
+
logger.kv('Dashboard', dashboardUrl);
|
|
95
|
+
// Open in browser
|
|
96
|
+
await openBrowser(dashboardUrl);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Stop the tower dashboard
|
|
100
|
+
*/
|
|
101
|
+
export async function towerStop(options = {}) {
|
|
102
|
+
const port = options.port || DEFAULT_TOWER_PORT;
|
|
103
|
+
logger.header('Stopping Tower');
|
|
104
|
+
const pids = getProcessesOnPort(port);
|
|
105
|
+
if (pids.length === 0) {
|
|
106
|
+
logger.info('Tower is not running');
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
let stopped = 0;
|
|
110
|
+
for (const pid of pids) {
|
|
111
|
+
try {
|
|
112
|
+
process.kill(pid, 'SIGTERM');
|
|
113
|
+
stopped++;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Process may have already exited
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (stopped > 0) {
|
|
120
|
+
logger.success(`Tower stopped (${stopped} process${stopped > 1 ? 'es' : ''}: PIDs ${pids.join(', ')})`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Legacy export for backward compatibility
|
|
124
|
+
export const tower = towerStart;
|
|
125
|
+
//# sourceMappingURL=tower.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tower.js","sourceRoot":"","sources":["../../../src/agent-farm/commands/tower.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,mCAAmC;AACnC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAUhC;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAClD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,IAAI,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAChF,OAAO,MAAM;aACV,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;aACjC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA6B,EAAE;IAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,kBAAkB,CAAC;IAEhD,2BAA2B;IAC3B,IAAI,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,oBAAoB,IAAI,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;QACxD,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAE/D,IAAI,OAAe,CAAC;IACpB,IAAI,IAAc,CAAC;IAEnB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,yBAAyB;QACzB,OAAO,GAAG,KAAK,CAAC;QAChB,IAAI,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;SAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,6BAA6B;QAC7B,OAAO,GAAG,MAAM,CAAC;QACjB,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAExB,qBAAqB;IACrB,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE;QACjD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;KACnB,CAAC,CAAC;IAEH,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACxC,CAAC;IAED,oCAAoC;IACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAEzD,MAAM,YAAY,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAEhD,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAErC,kBAAkB;IAClB,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAA4B,EAAE;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,kBAAkB,CAAC;IAEhD,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,kBAAkB,OAAO,WAAW,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1G,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|