@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.
Files changed (245) hide show
  1. package/bin/af.js +8 -0
  2. package/bin/codev.js +4 -0
  3. package/bin/consult.js +7 -0
  4. package/dist/agent-farm/cli.d.ts +11 -0
  5. package/dist/agent-farm/cli.d.ts.map +1 -0
  6. package/dist/agent-farm/cli.js +359 -0
  7. package/dist/agent-farm/cli.js.map +1 -0
  8. package/dist/agent-farm/commands/cleanup.d.ts +12 -0
  9. package/dist/agent-farm/commands/cleanup.d.ts.map +1 -0
  10. package/dist/agent-farm/commands/cleanup.js +154 -0
  11. package/dist/agent-farm/commands/cleanup.js.map +1 -0
  12. package/dist/agent-farm/commands/db.d.ts +38 -0
  13. package/dist/agent-farm/commands/db.d.ts.map +1 -0
  14. package/dist/agent-farm/commands/db.js +133 -0
  15. package/dist/agent-farm/commands/db.js.map +1 -0
  16. package/dist/agent-farm/commands/index.d.ts +11 -0
  17. package/dist/agent-farm/commands/index.d.ts.map +1 -0
  18. package/dist/agent-farm/commands/index.js +11 -0
  19. package/dist/agent-farm/commands/index.js.map +1 -0
  20. package/dist/agent-farm/commands/open.d.ts +15 -0
  21. package/dist/agent-farm/commands/open.d.ts.map +1 -0
  22. package/dist/agent-farm/commands/open.js +118 -0
  23. package/dist/agent-farm/commands/open.js.map +1 -0
  24. package/dist/agent-farm/commands/rename.d.ts +13 -0
  25. package/dist/agent-farm/commands/rename.d.ts.map +1 -0
  26. package/dist/agent-farm/commands/rename.js +33 -0
  27. package/dist/agent-farm/commands/rename.js.map +1 -0
  28. package/dist/agent-farm/commands/send.d.ts +9 -0
  29. package/dist/agent-farm/commands/send.d.ts.map +1 -0
  30. package/dist/agent-farm/commands/send.js +282 -0
  31. package/dist/agent-farm/commands/send.js.map +1 -0
  32. package/dist/agent-farm/commands/spawn.d.ts +15 -0
  33. package/dist/agent-farm/commands/spawn.d.ts.map +1 -0
  34. package/dist/agent-farm/commands/spawn.js +575 -0
  35. package/dist/agent-farm/commands/spawn.js.map +1 -0
  36. package/dist/agent-farm/commands/start.d.ts +9 -0
  37. package/dist/agent-farm/commands/start.d.ts.map +1 -0
  38. package/dist/agent-farm/commands/start.js +175 -0
  39. package/dist/agent-farm/commands/start.js.map +1 -0
  40. package/dist/agent-farm/commands/status.d.ts +8 -0
  41. package/dist/agent-farm/commands/status.d.ts.map +1 -0
  42. package/dist/agent-farm/commands/status.js +123 -0
  43. package/dist/agent-farm/commands/status.js.map +1 -0
  44. package/dist/agent-farm/commands/stop.d.ts +8 -0
  45. package/dist/agent-farm/commands/stop.d.ts.map +1 -0
  46. package/dist/agent-farm/commands/stop.js +76 -0
  47. package/dist/agent-farm/commands/stop.js.map +1 -0
  48. package/dist/agent-farm/commands/tower.d.ts +19 -0
  49. package/dist/agent-farm/commands/tower.d.ts.map +1 -0
  50. package/dist/agent-farm/commands/tower.js +125 -0
  51. package/dist/agent-farm/commands/tower.js.map +1 -0
  52. package/dist/agent-farm/commands/tutorial.d.ts +10 -0
  53. package/dist/agent-farm/commands/tutorial.d.ts.map +1 -0
  54. package/dist/agent-farm/commands/tutorial.js +49 -0
  55. package/dist/agent-farm/commands/tutorial.js.map +1 -0
  56. package/dist/agent-farm/commands/util.d.ts +15 -0
  57. package/dist/agent-farm/commands/util.d.ts.map +1 -0
  58. package/dist/agent-farm/commands/util.js +108 -0
  59. package/dist/agent-farm/commands/util.js.map +1 -0
  60. package/dist/agent-farm/db/errors.d.ts +17 -0
  61. package/dist/agent-farm/db/errors.d.ts.map +1 -0
  62. package/dist/agent-farm/db/errors.js +46 -0
  63. package/dist/agent-farm/db/errors.js.map +1 -0
  64. package/dist/agent-farm/db/index.d.ts +41 -0
  65. package/dist/agent-farm/db/index.d.ts.map +1 -0
  66. package/dist/agent-farm/db/index.js +168 -0
  67. package/dist/agent-farm/db/index.js.map +1 -0
  68. package/dist/agent-farm/db/migrate.d.ts +15 -0
  69. package/dist/agent-farm/db/migrate.d.ts.map +1 -0
  70. package/dist/agent-farm/db/migrate.js +137 -0
  71. package/dist/agent-farm/db/migrate.js.map +1 -0
  72. package/dist/agent-farm/db/schema.d.ts +16 -0
  73. package/dist/agent-farm/db/schema.d.ts.map +1 -0
  74. package/dist/agent-farm/db/schema.js +103 -0
  75. package/dist/agent-farm/db/schema.js.map +1 -0
  76. package/dist/agent-farm/db/types.d.ts +87 -0
  77. package/dist/agent-farm/db/types.d.ts.map +1 -0
  78. package/dist/agent-farm/db/types.js +65 -0
  79. package/dist/agent-farm/db/types.js.map +1 -0
  80. package/dist/agent-farm/index.d.ts +7 -0
  81. package/dist/agent-farm/index.d.ts.map +1 -0
  82. package/dist/agent-farm/index.js +373 -0
  83. package/dist/agent-farm/index.js.map +1 -0
  84. package/dist/agent-farm/servers/annotate-server.d.ts +9 -0
  85. package/dist/agent-farm/servers/annotate-server.d.ts.map +1 -0
  86. package/dist/agent-farm/servers/annotate-server.js +136 -0
  87. package/dist/agent-farm/servers/annotate-server.js.map +1 -0
  88. package/dist/agent-farm/servers/dashboard-server.d.ts +9 -0
  89. package/dist/agent-farm/servers/dashboard-server.d.ts.map +1 -0
  90. package/dist/agent-farm/servers/dashboard-server.js +939 -0
  91. package/dist/agent-farm/servers/dashboard-server.js.map +1 -0
  92. package/dist/agent-farm/servers/tower-server.d.ts +9 -0
  93. package/dist/agent-farm/servers/tower-server.d.ts.map +1 -0
  94. package/dist/agent-farm/servers/tower-server.js +463 -0
  95. package/dist/agent-farm/servers/tower-server.js.map +1 -0
  96. package/dist/agent-farm/state.d.ts +93 -0
  97. package/dist/agent-farm/state.d.ts.map +1 -0
  98. package/dist/agent-farm/state.js +253 -0
  99. package/dist/agent-farm/state.js.map +1 -0
  100. package/dist/agent-farm/tutorial/index.d.ts +8 -0
  101. package/dist/agent-farm/tutorial/index.d.ts.map +1 -0
  102. package/dist/agent-farm/tutorial/index.js +8 -0
  103. package/dist/agent-farm/tutorial/index.js.map +1 -0
  104. package/dist/agent-farm/tutorial/prompts.d.ts +57 -0
  105. package/dist/agent-farm/tutorial/prompts.d.ts.map +1 -0
  106. package/dist/agent-farm/tutorial/prompts.js +147 -0
  107. package/dist/agent-farm/tutorial/prompts.js.map +1 -0
  108. package/dist/agent-farm/tutorial/runner.d.ts +52 -0
  109. package/dist/agent-farm/tutorial/runner.d.ts.map +1 -0
  110. package/dist/agent-farm/tutorial/runner.js +204 -0
  111. package/dist/agent-farm/tutorial/runner.js.map +1 -0
  112. package/dist/agent-farm/tutorial/state.d.ts +26 -0
  113. package/dist/agent-farm/tutorial/state.d.ts.map +1 -0
  114. package/dist/agent-farm/tutorial/state.js +89 -0
  115. package/dist/agent-farm/tutorial/state.js.map +1 -0
  116. package/dist/agent-farm/tutorial/steps/first-spec.d.ts +7 -0
  117. package/dist/agent-farm/tutorial/steps/first-spec.d.ts.map +1 -0
  118. package/dist/agent-farm/tutorial/steps/first-spec.js +136 -0
  119. package/dist/agent-farm/tutorial/steps/first-spec.js.map +1 -0
  120. package/dist/agent-farm/tutorial/steps/implementation.d.ts +7 -0
  121. package/dist/agent-farm/tutorial/steps/implementation.d.ts.map +1 -0
  122. package/dist/agent-farm/tutorial/steps/implementation.js +76 -0
  123. package/dist/agent-farm/tutorial/steps/implementation.js.map +1 -0
  124. package/dist/agent-farm/tutorial/steps/index.d.ts +10 -0
  125. package/dist/agent-farm/tutorial/steps/index.d.ts.map +1 -0
  126. package/dist/agent-farm/tutorial/steps/index.js +10 -0
  127. package/dist/agent-farm/tutorial/steps/index.js.map +1 -0
  128. package/dist/agent-farm/tutorial/steps/planning.d.ts +7 -0
  129. package/dist/agent-farm/tutorial/steps/planning.d.ts.map +1 -0
  130. package/dist/agent-farm/tutorial/steps/planning.js +143 -0
  131. package/dist/agent-farm/tutorial/steps/planning.js.map +1 -0
  132. package/dist/agent-farm/tutorial/steps/review.d.ts +7 -0
  133. package/dist/agent-farm/tutorial/steps/review.d.ts.map +1 -0
  134. package/dist/agent-farm/tutorial/steps/review.js +78 -0
  135. package/dist/agent-farm/tutorial/steps/review.js.map +1 -0
  136. package/dist/agent-farm/tutorial/steps/setup.d.ts +7 -0
  137. package/dist/agent-farm/tutorial/steps/setup.d.ts.map +1 -0
  138. package/dist/agent-farm/tutorial/steps/setup.js +126 -0
  139. package/dist/agent-farm/tutorial/steps/setup.js.map +1 -0
  140. package/dist/agent-farm/tutorial/steps/welcome.d.ts +7 -0
  141. package/dist/agent-farm/tutorial/steps/welcome.d.ts.map +1 -0
  142. package/dist/agent-farm/tutorial/steps/welcome.js +50 -0
  143. package/dist/agent-farm/tutorial/steps/welcome.js.map +1 -0
  144. package/dist/agent-farm/types.d.ts +131 -0
  145. package/dist/agent-farm/types.d.ts.map +1 -0
  146. package/dist/agent-farm/types.js +5 -0
  147. package/dist/agent-farm/types.js.map +1 -0
  148. package/dist/agent-farm/utils/config.d.ts +27 -0
  149. package/dist/agent-farm/utils/config.d.ts.map +1 -0
  150. package/dist/agent-farm/utils/config.js +242 -0
  151. package/dist/agent-farm/utils/config.js.map +1 -0
  152. package/dist/agent-farm/utils/deps.d.ts +51 -0
  153. package/dist/agent-farm/utils/deps.d.ts.map +1 -0
  154. package/dist/agent-farm/utils/deps.js +194 -0
  155. package/dist/agent-farm/utils/deps.js.map +1 -0
  156. package/dist/agent-farm/utils/index.d.ts +6 -0
  157. package/dist/agent-farm/utils/index.d.ts.map +1 -0
  158. package/dist/agent-farm/utils/index.js +6 -0
  159. package/dist/agent-farm/utils/index.js.map +1 -0
  160. package/dist/agent-farm/utils/logger.d.ts +31 -0
  161. package/dist/agent-farm/utils/logger.d.ts.map +1 -0
  162. package/dist/agent-farm/utils/logger.js +58 -0
  163. package/dist/agent-farm/utils/logger.js.map +1 -0
  164. package/dist/agent-farm/utils/orphan-handler.d.ts +27 -0
  165. package/dist/agent-farm/utils/orphan-handler.d.ts.map +1 -0
  166. package/dist/agent-farm/utils/orphan-handler.js +127 -0
  167. package/dist/agent-farm/utils/orphan-handler.js.map +1 -0
  168. package/dist/agent-farm/utils/port-registry.d.ts +58 -0
  169. package/dist/agent-farm/utils/port-registry.d.ts.map +1 -0
  170. package/dist/agent-farm/utils/port-registry.js +149 -0
  171. package/dist/agent-farm/utils/port-registry.js.map +1 -0
  172. package/dist/agent-farm/utils/shell.d.ts +45 -0
  173. package/dist/agent-farm/utils/shell.d.ts.map +1 -0
  174. package/dist/agent-farm/utils/shell.js +120 -0
  175. package/dist/agent-farm/utils/shell.js.map +1 -0
  176. package/dist/cli.d.ts +10 -0
  177. package/dist/cli.d.ts.map +1 -0
  178. package/dist/cli.js +160 -0
  179. package/dist/cli.js.map +1 -0
  180. package/dist/commands/adopt.d.ts +12 -0
  181. package/dist/commands/adopt.d.ts.map +1 -0
  182. package/dist/commands/adopt.js +178 -0
  183. package/dist/commands/adopt.js.map +1 -0
  184. package/dist/commands/consult/index.d.ts +17 -0
  185. package/dist/commands/consult/index.d.ts.map +1 -0
  186. package/dist/commands/consult/index.js +405 -0
  187. package/dist/commands/consult/index.js.map +1 -0
  188. package/dist/commands/doctor.d.ts +10 -0
  189. package/dist/commands/doctor.d.ts.map +1 -0
  190. package/dist/commands/doctor.js +346 -0
  191. package/dist/commands/doctor.js.map +1 -0
  192. package/dist/commands/init.d.ts +12 -0
  193. package/dist/commands/init.d.ts.map +1 -0
  194. package/dist/commands/init.js +167 -0
  195. package/dist/commands/init.js.map +1 -0
  196. package/dist/commands/tower.d.ts +16 -0
  197. package/dist/commands/tower.d.ts.map +1 -0
  198. package/dist/commands/tower.js +21 -0
  199. package/dist/commands/tower.js.map +1 -0
  200. package/dist/commands/update.d.ts +13 -0
  201. package/dist/commands/update.d.ts.map +1 -0
  202. package/dist/commands/update.js +137 -0
  203. package/dist/commands/update.js.map +1 -0
  204. package/dist/lib/templates.d.ts +57 -0
  205. package/dist/lib/templates.d.ts.map +1 -0
  206. package/dist/lib/templates.js +205 -0
  207. package/dist/lib/templates.js.map +1 -0
  208. package/package.json +55 -0
  209. package/templates/AGENTS.md +49 -0
  210. package/templates/CLAUDE.md +47 -0
  211. package/templates/DEPENDENCIES.md +344 -0
  212. package/templates/agents/architecture-documenter.md +189 -0
  213. package/templates/agents/codev-updater.md +276 -0
  214. package/templates/agents/spider-protocol-updater.md +118 -0
  215. package/templates/annotate.html +903 -0
  216. package/templates/bin/agent-farm +18 -0
  217. package/templates/bin/annotate-server.js +140 -0
  218. package/templates/bin/codev-doctor +335 -0
  219. package/templates/builders.md +30 -0
  220. package/templates/config.json +7 -0
  221. package/templates/dashboard-split.html +1679 -0
  222. package/templates/dashboard.html +149 -0
  223. package/templates/plans/.gitkeep +0 -0
  224. package/templates/protocols/experiment/protocol.md +229 -0
  225. package/templates/protocols/experiment/templates/notes.md +97 -0
  226. package/templates/protocols/maintain/protocol.md +235 -0
  227. package/templates/protocols/spider/protocol.md +639 -0
  228. package/templates/protocols/spider/templates/plan.md +169 -0
  229. package/templates/protocols/spider/templates/review.md +207 -0
  230. package/templates/protocols/spider/templates/spec.md +140 -0
  231. package/templates/protocols/spider-solo/protocol.md +619 -0
  232. package/templates/protocols/spider-solo/templates/plan.md +169 -0
  233. package/templates/protocols/spider-solo/templates/review.md +207 -0
  234. package/templates/protocols/spider-solo/templates/spec.md +140 -0
  235. package/templates/protocols/tick/protocol.md +250 -0
  236. package/templates/protocols/tick/templates/plan.md +67 -0
  237. package/templates/protocols/tick/templates/review.md +90 -0
  238. package/templates/protocols/tick/templates/spec.md +61 -0
  239. package/templates/reviews/.gitkeep +0 -0
  240. package/templates/roles/architect.md +230 -0
  241. package/templates/roles/builder.md +175 -0
  242. package/templates/roles/consultant.md +27 -0
  243. package/templates/specs/.gitkeep +0 -0
  244. package/templates/templates/projectlist.md +129 -0
  245. 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,8 @@
1
+ /**
2
+ * Status command - shows status of all agents
3
+ */
4
+ /**
5
+ * Display status of all agent farm processes
6
+ */
7
+ export declare function status(): Promise<void>;
8
+ //# sourceMappingURL=status.d.ts.map
@@ -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,8 @@
1
+ /**
2
+ * Stop command - stops all agent farm processes
3
+ */
4
+ /**
5
+ * Stop all agent farm processes
6
+ */
7
+ export declare function stop(): Promise<void>;
8
+ //# sourceMappingURL=stop.d.ts.map
@@ -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":"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"}
@@ -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"}