@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,242 @@
1
+ /**
2
+ * Configuration management for Agent Farm
3
+ */
4
+ import { existsSync, readFileSync } from 'node:fs';
5
+ import { resolve, dirname } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { execSync } from 'node:child_process';
8
+ import { getProjectPorts } from './port-registry.js';
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+ // Default commands
12
+ const DEFAULT_COMMANDS = {
13
+ architect: 'claude',
14
+ builder: 'claude',
15
+ shell: 'bash',
16
+ };
17
+ // CLI overrides (set via setCliOverrides)
18
+ let cliOverrides = {};
19
+ /**
20
+ * Check if we're in a git worktree and return the main repo root if so
21
+ */
22
+ function getMainRepoFromWorktree(dir) {
23
+ try {
24
+ // Get the common git directory (same for main repo and worktrees)
25
+ const gitCommonDir = execSync('git rev-parse --git-common-dir', {
26
+ cwd: dir,
27
+ encoding: 'utf-8',
28
+ stdio: ['pipe', 'pipe', 'pipe'],
29
+ }).trim();
30
+ // If it's just '.git', we're in the main repo
31
+ if (gitCommonDir === '.git') {
32
+ return null;
33
+ }
34
+ // We're in a worktree - gitCommonDir points to main repo's .git directory
35
+ // e.g., /path/to/main/repo/.git or /path/to/main/repo/.git/worktrees/...
36
+ // The main repo is the parent of .git
37
+ const mainGitDir = resolve(dir, gitCommonDir);
38
+ const mainRepo = dirname(mainGitDir.replace(/\/worktrees\/[^/]+$/, ''));
39
+ return mainRepo;
40
+ }
41
+ catch {
42
+ // Not in a git repo
43
+ return null;
44
+ }
45
+ }
46
+ /**
47
+ * Find the project root by looking for codev/ directory
48
+ * Handles git worktrees by finding the main repository
49
+ */
50
+ function findProjectRoot(startDir = process.cwd()) {
51
+ // First check if we're in a git worktree
52
+ const mainRepo = getMainRepoFromWorktree(startDir);
53
+ if (mainRepo && existsSync(resolve(mainRepo, 'codev'))) {
54
+ return mainRepo;
55
+ }
56
+ let dir = startDir;
57
+ while (dir !== '/') {
58
+ // Check for codev/ directory (indicates project using codev)
59
+ if (existsSync(resolve(dir, 'codev'))) {
60
+ return dir;
61
+ }
62
+ // Check for .git as fallback
63
+ if (existsSync(resolve(dir, '.git'))) {
64
+ return dir;
65
+ }
66
+ dir = dirname(dir);
67
+ }
68
+ // Default to current directory
69
+ return startDir;
70
+ }
71
+ /**
72
+ * Get the agent-farm templates directory
73
+ * Templates are bundled with agent-farm, not in project codev/ directory
74
+ */
75
+ function getTemplatesDir() {
76
+ // 1. Try relative to compiled output (dist/utils/ -> templates/)
77
+ const pkgPath = resolve(__dirname, '../templates');
78
+ if (existsSync(pkgPath)) {
79
+ return pkgPath;
80
+ }
81
+ // 2. Try relative to source (src/utils/ -> templates/)
82
+ const devPath = resolve(__dirname, '../../templates');
83
+ if (existsSync(devPath)) {
84
+ return devPath;
85
+ }
86
+ // Return the expected path even if not found (servers handle their own template lookup)
87
+ return devPath;
88
+ }
89
+ /**
90
+ * Get the servers directory (compiled TypeScript servers)
91
+ */
92
+ function getServersDir() {
93
+ // Servers are compiled to dist/servers/
94
+ const devPath = resolve(__dirname, '../servers');
95
+ if (existsSync(devPath)) {
96
+ return devPath;
97
+ }
98
+ // In npm package, they're alongside other compiled files
99
+ return resolve(__dirname, './servers');
100
+ }
101
+ /**
102
+ * Get the roles directory (from codev/roles/ or config override)
103
+ */
104
+ function getRolesDir(projectRoot, userConfig) {
105
+ // Check config.json override
106
+ if (userConfig?.roles?.dir) {
107
+ const configPath = resolve(projectRoot, userConfig.roles.dir);
108
+ if (existsSync(configPath)) {
109
+ return configPath;
110
+ }
111
+ }
112
+ // Default: codev/roles/ (canonical location)
113
+ const rolesPath = resolve(projectRoot, 'codev/roles');
114
+ if (existsSync(rolesPath)) {
115
+ return rolesPath;
116
+ }
117
+ // Fail fast if roles not found
118
+ throw new Error(`Roles directory not found: ${rolesPath}`);
119
+ }
120
+ /**
121
+ * Load user config.json from project root
122
+ */
123
+ function loadUserConfig(projectRoot) {
124
+ const configPath = resolve(projectRoot, 'codev', 'config.json');
125
+ if (!existsSync(configPath)) {
126
+ return null;
127
+ }
128
+ try {
129
+ const content = readFileSync(configPath, 'utf-8');
130
+ return JSON.parse(content);
131
+ }
132
+ catch (error) {
133
+ throw new Error(`Failed to parse config.json: ${error}`);
134
+ }
135
+ }
136
+ /**
137
+ * Expand environment variables in a string
138
+ * Supports ${VAR} and $VAR syntax
139
+ */
140
+ function expandEnvVars(str) {
141
+ return str.replace(/\$\{([^}]+)\}|\$([A-Za-z_][A-Za-z0-9_]*)/g, (match, braced, unbraced) => {
142
+ const varName = braced || unbraced;
143
+ return process.env[varName] || '';
144
+ });
145
+ }
146
+ /**
147
+ * Convert command (string or array) to string with env var expansion
148
+ */
149
+ function resolveCommand(cmd, defaultCmd) {
150
+ if (!cmd) {
151
+ return defaultCmd;
152
+ }
153
+ if (Array.isArray(cmd)) {
154
+ // Join array elements, handling escaping
155
+ return cmd.map(expandEnvVars).join(' ');
156
+ }
157
+ return expandEnvVars(cmd);
158
+ }
159
+ /**
160
+ * Set CLI overrides for commands
161
+ * These take highest priority in the hierarchy
162
+ */
163
+ export function setCliOverrides(overrides) {
164
+ cliOverrides = { ...overrides };
165
+ }
166
+ /**
167
+ * Get resolved commands following hierarchy: CLI > config.json > defaults
168
+ */
169
+ export function getResolvedCommands(projectRoot) {
170
+ const root = projectRoot || findProjectRoot();
171
+ const userConfig = loadUserConfig(root);
172
+ return {
173
+ architect: cliOverrides.architect ||
174
+ resolveCommand(userConfig?.shell?.architect, DEFAULT_COMMANDS.architect),
175
+ builder: cliOverrides.builder ||
176
+ resolveCommand(userConfig?.shell?.builder, DEFAULT_COMMANDS.builder),
177
+ shell: cliOverrides.shell ||
178
+ resolveCommand(userConfig?.shell?.shell, DEFAULT_COMMANDS.shell),
179
+ };
180
+ }
181
+ // Cached port allocation (set during initialization)
182
+ let cachedPorts = null;
183
+ /**
184
+ * Initialize port allocation (must be called once at startup)
185
+ */
186
+ export function initializePorts() {
187
+ const projectRoot = findProjectRoot();
188
+ const ports = getProjectPorts(projectRoot);
189
+ cachedPorts = {
190
+ dashboardPort: ports.dashboardPort,
191
+ architectPort: ports.architectPort,
192
+ builderPortRange: ports.builderPortRange,
193
+ utilPortRange: ports.utilPortRange,
194
+ annotatePortRange: ports.annotatePortRange,
195
+ };
196
+ }
197
+ /**
198
+ * Build configuration for the current project
199
+ * Note: initializePorts() must be called before using this function
200
+ */
201
+ export function getConfig() {
202
+ const projectRoot = findProjectRoot();
203
+ const codevDir = resolve(projectRoot, 'codev');
204
+ const userConfig = loadUserConfig(projectRoot);
205
+ // Use cached ports or fallback to defaults if not initialized
206
+ const ports = cachedPorts || {
207
+ dashboardPort: 4200,
208
+ architectPort: 4201,
209
+ builderPortRange: [4210, 4229],
210
+ utilPortRange: [4230, 4249],
211
+ annotatePortRange: [4250, 4269],
212
+ };
213
+ return {
214
+ projectRoot,
215
+ codevDir,
216
+ buildersDir: resolve(projectRoot, '.builders'),
217
+ stateDir: resolve(projectRoot, '.agent-farm'),
218
+ templatesDir: getTemplatesDir(),
219
+ serversDir: getServersDir(),
220
+ bundledRolesDir: getRolesDir(projectRoot, userConfig),
221
+ // Ports from global registry (prevents cross-project conflicts)
222
+ dashboardPort: ports.dashboardPort,
223
+ architectPort: ports.architectPort,
224
+ builderPortRange: ports.builderPortRange,
225
+ utilPortRange: ports.utilPortRange,
226
+ annotatePortRange: ports.annotatePortRange,
227
+ };
228
+ }
229
+ /**
230
+ * Ensure required directories exist
231
+ */
232
+ export async function ensureDirectories(config) {
233
+ const { mkdir } = await import('node:fs/promises');
234
+ const dirs = [
235
+ config.buildersDir,
236
+ config.stateDir,
237
+ ];
238
+ for (const dir of dirs) {
239
+ await mkdir(dir, { recursive: true });
240
+ }
241
+ }
242
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/agent-farm/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,mBAAmB;AACnB,MAAM,gBAAgB,GAAG;IACvB,SAAS,EAAE,QAAQ;IACnB,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,MAAM;CACd,CAAC;AAEF,0CAA0C;AAC1C,IAAI,YAAY,GAA8B,EAAE,CAAC;AAEjD;;GAEG;AACH,SAAS,uBAAuB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,kEAAkE;QAClE,MAAM,YAAY,GAAG,QAAQ,CAAC,gCAAgC,EAAE;YAC9D,GAAG,EAAE,GAAG;YACR,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,8CAA8C;QAC9C,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0EAA0E;QAC1E,yEAAyE;QACzE,sCAAsC;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IACvD,yCAAyC;IACzC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,GAAG,GAAG,QAAQ,CAAC;IAEnB,OAAO,GAAG,KAAK,GAAG,EAAE,CAAC;QACnB,6DAA6D;QAC7D,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,6BAA6B;QAC7B,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YACrC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,+BAA+B;IAC/B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe;IACtB,iEAAiE;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,uDAAuD;IACvD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,wFAAwF;IACxF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa;IACpB,wCAAwC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,yDAAyD;IACzD,OAAO,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,WAAmB,EAAE,UAA6B;IACrE,6BAA6B;IAC7B,IAAI,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,+BAA+B;IAC/B,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,WAAmB;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,GAAG,CAAC,OAAO,CAAC,2CAA2C,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QAC1F,MAAM,OAAO,GAAG,MAAM,IAAI,QAAQ,CAAC;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAkC,EAAE,UAAkB;IAC5E,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,yCAAyC;QACzC,OAAO,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAoC;IAClE,YAAY,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAoB;IACtD,MAAM,IAAI,GAAG,WAAW,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAExC,OAAO;QACL,SAAS,EAAE,YAAY,CAAC,SAAS;YACtB,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,CAAC,SAAS,CAAC;QACnF,OAAO,EAAE,YAAY,CAAC,OAAO;YACpB,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;QAC7E,KAAK,EAAE,YAAY,CAAC,KAAK;YAClB,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC;KACxE,CAAC;AACJ,CAAC;AAED,qDAAqD;AACrD,IAAI,WAAW,GAMJ,IAAI,CAAC;AAEhB;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC3C,WAAW,GAAG;QACZ,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;KAC3C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAE/C,8DAA8D;IAC9D,MAAM,KAAK,GAAG,WAAW,IAAI;QAC3B,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAqB;QAClD,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,CAAqB;QAC/C,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAqB;KACpD,CAAC;IAEF,OAAO;QACL,WAAW;QACX,QAAQ;QACR,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC;QAC9C,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC;QAC7C,YAAY,EAAE,eAAe,EAAE;QAC/B,UAAU,EAAE,aAAa,EAAE;QAC3B,eAAe,EAAE,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC;QACrD,gEAAgE;QAChE,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;KAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAEnD,MAAM,IAAI,GAAG;QACX,MAAM,CAAC,WAAW;QAClB,MAAM,CAAC,QAAQ;KAChB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Dependency checking utilities for Agent Farm
3
+ *
4
+ * Verifies that required system dependencies are installed with correct versions.
5
+ */
6
+ export interface Dependency {
7
+ name: string;
8
+ command: string;
9
+ minVersion: string;
10
+ versionCmd: string;
11
+ versionParser: (output: string) => string | null;
12
+ installHint: {
13
+ macos: string;
14
+ linux: string;
15
+ };
16
+ required: boolean;
17
+ }
18
+ /**
19
+ * Core dependencies required for Agent Farm
20
+ */
21
+ export declare const CORE_DEPENDENCIES: Dependency[];
22
+ /**
23
+ * Compare semantic versions
24
+ * Returns: -1 if a < b, 0 if a == b, 1 if a > b
25
+ */
26
+ export declare function compareVersions(a: string, b: string): number;
27
+ export interface DependencyCheckResult {
28
+ name: string;
29
+ installed: boolean;
30
+ version: string | null;
31
+ minVersion: string;
32
+ versionOk: boolean;
33
+ versionUnknown: boolean;
34
+ installHint: string;
35
+ }
36
+ /**
37
+ * Check a single dependency
38
+ */
39
+ export declare function checkDependency(dep: Dependency): Promise<DependencyCheckResult>;
40
+ /**
41
+ * Check all core dependencies required for Agent Farm
42
+ *
43
+ * @param exitOnFailure - If true, calls fatal() on missing required deps (default: true)
44
+ * @returns Array of check results
45
+ */
46
+ export declare function checkCoreDependencies(exitOnFailure?: boolean): Promise<DependencyCheckResult[]>;
47
+ /**
48
+ * Quick check for a single required dependency (for backwards compat)
49
+ */
50
+ export declare function requireDependency(name: string, installHint?: string): Promise<void>;
51
+ //# sourceMappingURL=deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/utils/deps.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACjD,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAAU,EAiEzC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW5D;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAiDrF;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,aAAa,UAAO,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAyClG;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzF"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Dependency checking utilities for Agent Farm
3
+ *
4
+ * Verifies that required system dependencies are installed with correct versions.
5
+ */
6
+ import { run, commandExists } from './shell.js';
7
+ import { logger, fatal } from './logger.js';
8
+ /**
9
+ * Core dependencies required for Agent Farm
10
+ */
11
+ export const CORE_DEPENDENCIES = [
12
+ {
13
+ name: 'Node.js',
14
+ command: 'node',
15
+ minVersion: '18.0.0',
16
+ versionCmd: 'node --version',
17
+ versionParser: (output) => {
18
+ // v18.17.0 -> 18.17.0
19
+ const match = output.match(/v?(\d+\.\d+\.\d+)/);
20
+ return match ? match[1] : null;
21
+ },
22
+ installHint: {
23
+ macos: 'brew install node',
24
+ linux: 'apt install nodejs npm',
25
+ },
26
+ required: true,
27
+ },
28
+ {
29
+ name: 'tmux',
30
+ command: 'tmux',
31
+ minVersion: '3.0',
32
+ versionCmd: 'tmux -V',
33
+ versionParser: (output) => {
34
+ // tmux 3.3a -> 3.3
35
+ const match = output.match(/tmux\s+(\d+\.\d+)/);
36
+ return match ? match[1] : null;
37
+ },
38
+ installHint: {
39
+ macos: 'brew install tmux',
40
+ linux: 'apt install tmux',
41
+ },
42
+ required: true,
43
+ },
44
+ {
45
+ name: 'ttyd',
46
+ command: 'ttyd',
47
+ minVersion: '1.7.0',
48
+ versionCmd: 'ttyd --version',
49
+ versionParser: (output) => {
50
+ // ttyd version 1.7.4-... or just 1.7.4
51
+ const match = output.match(/(\d+\.\d+\.\d+)/);
52
+ return match ? match[1] : null;
53
+ },
54
+ installHint: {
55
+ macos: 'brew install ttyd',
56
+ linux: 'Build from source: https://github.com/tsl0922/ttyd',
57
+ },
58
+ required: true,
59
+ },
60
+ {
61
+ name: 'git',
62
+ command: 'git',
63
+ minVersion: '2.5.0',
64
+ versionCmd: 'git --version',
65
+ versionParser: (output) => {
66
+ // git version 2.39.2 (Apple Git-143)
67
+ const match = output.match(/git version (\d+\.\d+\.\d+)/);
68
+ return match ? match[1] : null;
69
+ },
70
+ installHint: {
71
+ macos: '(pre-installed on macOS)',
72
+ linux: 'apt install git',
73
+ },
74
+ required: true,
75
+ },
76
+ ];
77
+ /**
78
+ * Compare semantic versions
79
+ * Returns: -1 if a < b, 0 if a == b, 1 if a > b
80
+ */
81
+ export function compareVersions(a, b) {
82
+ const partsA = a.split('.').map(Number);
83
+ const partsB = b.split('.').map(Number);
84
+ for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
85
+ const numA = partsA[i] || 0;
86
+ const numB = partsB[i] || 0;
87
+ if (numA < numB)
88
+ return -1;
89
+ if (numA > numB)
90
+ return 1;
91
+ }
92
+ return 0;
93
+ }
94
+ /**
95
+ * Check a single dependency
96
+ */
97
+ export async function checkDependency(dep) {
98
+ const platform = process.platform === 'darwin' ? 'macos' : 'linux';
99
+ const installHint = dep.installHint[platform];
100
+ // Check if command exists
101
+ if (!(await commandExists(dep.command))) {
102
+ return {
103
+ name: dep.name,
104
+ installed: false,
105
+ version: null,
106
+ minVersion: dep.minVersion,
107
+ versionOk: false,
108
+ versionUnknown: false,
109
+ installHint,
110
+ };
111
+ }
112
+ // Get version
113
+ let version = null;
114
+ let versionOk = false;
115
+ let versionUnknown = false;
116
+ try {
117
+ const { stdout, stderr } = await run(dep.versionCmd);
118
+ // Some tools output version to stderr
119
+ const output = stdout || stderr;
120
+ version = dep.versionParser(output);
121
+ if (version) {
122
+ versionOk = compareVersions(version, dep.minVersion) >= 0;
123
+ }
124
+ else {
125
+ // Parser returned null - version unknown
126
+ versionUnknown = true;
127
+ }
128
+ }
129
+ catch {
130
+ // Command exists but version check failed
131
+ version = 'unknown';
132
+ versionUnknown = true;
133
+ }
134
+ return {
135
+ name: dep.name,
136
+ installed: true,
137
+ version,
138
+ minVersion: dep.minVersion,
139
+ versionOk,
140
+ versionUnknown,
141
+ installHint,
142
+ };
143
+ }
144
+ /**
145
+ * Check all core dependencies required for Agent Farm
146
+ *
147
+ * @param exitOnFailure - If true, calls fatal() on missing required deps (default: true)
148
+ * @returns Array of check results
149
+ */
150
+ export async function checkCoreDependencies(exitOnFailure = true) {
151
+ const results = [];
152
+ const failures = [];
153
+ const warnings = [];
154
+ for (const dep of CORE_DEPENDENCIES) {
155
+ const result = await checkDependency(dep);
156
+ results.push(result);
157
+ if (!result.installed) {
158
+ failures.push(`${dep.name} not found. Install with: ${result.installHint}`);
159
+ }
160
+ else if (result.versionUnknown) {
161
+ warnings.push(`${dep.name} version could not be determined (may be incompatible)`);
162
+ }
163
+ else if (!result.versionOk && result.version) {
164
+ failures.push(`${dep.name} version ${result.version} is below minimum ${dep.minVersion}. ` +
165
+ `Upgrade with: ${result.installHint}`);
166
+ }
167
+ }
168
+ // Show warnings first (non-fatal)
169
+ if (warnings.length > 0) {
170
+ logger.warn('Dependency warnings:');
171
+ for (const warning of warnings) {
172
+ logger.warn(` • ${warning}`);
173
+ }
174
+ }
175
+ // Then show failures and exit if requested
176
+ if (failures.length > 0 && exitOnFailure) {
177
+ logger.error('Missing or outdated dependencies:');
178
+ for (const failure of failures) {
179
+ logger.error(` • ${failure}`);
180
+ }
181
+ fatal('Please install missing dependencies and try again.');
182
+ }
183
+ return results;
184
+ }
185
+ /**
186
+ * Quick check for a single required dependency (for backwards compat)
187
+ */
188
+ export async function requireDependency(name, installHint) {
189
+ if (!(await commandExists(name))) {
190
+ const hint = installHint || `Please install ${name}`;
191
+ fatal(`${name} not found. ${hint}`);
192
+ }
193
+ }
194
+ //# sourceMappingURL=deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../../src/agent-farm/utils/deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './config.js';
2
+ export * from './deps.js';
3
+ export * from './logger.js';
4
+ export * from './shell.js';
5
+ export * from './port-registry.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './config.js';
2
+ export * from './deps.js';
3
+ export * from './logger.js';
4
+ export * from './shell.js';
5
+ export * from './port-registry.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent-farm/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Logging utilities for Agent Farm
3
+ */
4
+ export declare const logger: {
5
+ info(message: string): void;
6
+ success(message: string): void;
7
+ warn(message: string): void;
8
+ error(message: string): void;
9
+ debug(message: string): void;
10
+ /**
11
+ * Print a header/title
12
+ */
13
+ header(title: string): void;
14
+ /**
15
+ * Print a key-value pair
16
+ */
17
+ kv(key: string, value: string | number): void;
18
+ /**
19
+ * Print a blank line
20
+ */
21
+ blank(): void;
22
+ /**
23
+ * Print a table row
24
+ */
25
+ row(cols: string[], widths: number[]): void;
26
+ };
27
+ /**
28
+ * Fatal error - logs and exits
29
+ */
30
+ export declare function fatal(message: string): never;
31
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,MAAM;kBACH,MAAM,GAAG,IAAI;qBAIV,MAAM,GAAG,IAAI;kBAIhB,MAAM,GAAG,IAAI;mBAIZ,MAAM,GAAG,IAAI;mBAIb,MAAM,GAAG,IAAI;IAM5B;;OAEG;kBACW,MAAM,GAAG,IAAI;IAM3B;;OAEG;YACK,MAAM,SAAS,MAAM,GAAG,MAAM,GAAG,IAAI;IAI7C;;OAEG;aACM,IAAI;IAIb;;OAEG;cACO,MAAM,EAAE,UAAU,MAAM,EAAE,GAAG,IAAI;CAI5C,CAAC;AAEF;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAG5C"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Logging utilities for Agent Farm
3
+ */
4
+ import chalk from 'chalk';
5
+ export const logger = {
6
+ info(message) {
7
+ console.log(chalk.blue('[info]'), message);
8
+ },
9
+ success(message) {
10
+ console.log(chalk.green('[ok]'), message);
11
+ },
12
+ warn(message) {
13
+ console.log(chalk.yellow('[warn]'), message);
14
+ },
15
+ error(message) {
16
+ console.error(chalk.red('[error]'), message);
17
+ },
18
+ debug(message) {
19
+ if (process.env.DEBUG) {
20
+ console.log(chalk.gray('[debug]'), message);
21
+ }
22
+ },
23
+ /**
24
+ * Print a header/title
25
+ */
26
+ header(title) {
27
+ console.log();
28
+ console.log(chalk.bold(title));
29
+ console.log(chalk.gray('─'.repeat(title.length)));
30
+ },
31
+ /**
32
+ * Print a key-value pair
33
+ */
34
+ kv(key, value) {
35
+ console.log(` ${chalk.gray(key + ':')} ${value}`);
36
+ },
37
+ /**
38
+ * Print a blank line
39
+ */
40
+ blank() {
41
+ console.log();
42
+ },
43
+ /**
44
+ * Print a table row
45
+ */
46
+ row(cols, widths) {
47
+ const padded = cols.map((col, i) => col.padEnd(widths[i] || 10));
48
+ console.log(' ' + padded.join(' '));
49
+ },
50
+ };
51
+ /**
52
+ * Fatal error - logs and exits
53
+ */
54
+ export function fatal(message) {
55
+ logger.error(message);
56
+ process.exit(1);
57
+ }
58
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/agent-farm/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAa;QAClB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,EAAE,CAAC,GAAW,EAAE,KAAsB;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAc,EAAE,MAAgB;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Orphan Handler
3
+ *
4
+ * Detects and handles orphaned tmux sessions from previous agent-farm runs.
5
+ * This prevents resource leaks and ensures clean startup.
6
+ *
7
+ * IMPORTANT: Only cleans up sessions for THIS project (based on port).
8
+ * Sessions from other projects are left alone.
9
+ */
10
+ /**
11
+ * Check for and handle orphaned sessions on startup
12
+ *
13
+ * Returns the number of sessions that were cleaned up.
14
+ */
15
+ export declare function handleOrphanedSessions(options?: {
16
+ kill?: boolean;
17
+ silent?: boolean;
18
+ }): Promise<number>;
19
+ /**
20
+ * Check for stale artifacts from bash script era
21
+ */
22
+ export declare function checkStaleArtifacts(codevDir: string): string[];
23
+ /**
24
+ * Warn about stale artifacts if found
25
+ */
26
+ export declare function warnAboutStaleArtifacts(codevDir: string): void;
27
+ //# sourceMappingURL=orphan-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-handler.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/utils/orphan-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA+DH;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,GAAE;IACpD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACb,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCvB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAU9D"}