jfl 0.4.4 → 0.6.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 (533) hide show
  1. package/dist/commands/context-hub.d.ts +1 -0
  2. package/dist/commands/context-hub.d.ts.map +1 -1
  3. package/dist/commands/context-hub.js +1064 -41
  4. package/dist/commands/context-hub.js.map +1 -1
  5. package/dist/commands/eval.d.ts +1 -1
  6. package/dist/commands/eval.d.ts.map +1 -1
  7. package/dist/commands/eval.js +192 -1
  8. package/dist/commands/eval.js.map +1 -1
  9. package/dist/commands/findings.d.ts +6 -0
  10. package/dist/commands/findings.d.ts.map +1 -0
  11. package/dist/commands/findings.js +203 -0
  12. package/dist/commands/findings.js.map +1 -0
  13. package/dist/commands/hud.d.ts.map +1 -1
  14. package/dist/commands/hud.js +47 -9
  15. package/dist/commands/hud.js.map +1 -1
  16. package/dist/commands/ide.d.ts +27 -0
  17. package/dist/commands/ide.d.ts.map +1 -0
  18. package/dist/commands/ide.js +546 -0
  19. package/dist/commands/ide.js.map +1 -0
  20. package/dist/commands/onboard.d.ts.map +1 -1
  21. package/dist/commands/onboard.js +212 -2
  22. package/dist/commands/onboard.js.map +1 -1
  23. package/dist/commands/openclaw.d.ts +3 -0
  24. package/dist/commands/openclaw.d.ts.map +1 -1
  25. package/dist/commands/openclaw.js +76 -2
  26. package/dist/commands/openclaw.js.map +1 -1
  27. package/dist/commands/peter.d.ts +3 -0
  28. package/dist/commands/peter.d.ts.map +1 -1
  29. package/dist/commands/peter.js +1168 -58
  30. package/dist/commands/peter.js.map +1 -1
  31. package/dist/commands/pi-fleet.d.ts +18 -0
  32. package/dist/commands/pi-fleet.d.ts.map +1 -0
  33. package/dist/commands/pi-fleet.js +382 -0
  34. package/dist/commands/pi-fleet.js.map +1 -0
  35. package/dist/commands/pi.d.ts.map +1 -1
  36. package/dist/commands/pi.js +18 -3
  37. package/dist/commands/pi.js.map +1 -1
  38. package/dist/commands/scope.d.ts.map +1 -1
  39. package/dist/commands/scope.js +90 -1
  40. package/dist/commands/scope.js.map +1 -1
  41. package/dist/commands/services.d.ts.map +1 -1
  42. package/dist/commands/services.js +18 -0
  43. package/dist/commands/services.js.map +1 -1
  44. package/dist/commands/setup.d.ts +12 -0
  45. package/dist/commands/setup.d.ts.map +1 -0
  46. package/dist/commands/setup.js +322 -0
  47. package/dist/commands/setup.js.map +1 -0
  48. package/dist/commands/status.d.ts.map +1 -1
  49. package/dist/commands/status.js +22 -4
  50. package/dist/commands/status.js.map +1 -1
  51. package/dist/commands/train.d.ts +33 -0
  52. package/dist/commands/train.d.ts.map +1 -0
  53. package/dist/commands/train.js +510 -0
  54. package/dist/commands/train.js.map +1 -0
  55. package/dist/commands/verify.d.ts +14 -0
  56. package/dist/commands/verify.d.ts.map +1 -0
  57. package/dist/commands/verify.js +276 -0
  58. package/dist/commands/verify.js.map +1 -0
  59. package/dist/commands/viz.d.ts.map +1 -1
  60. package/dist/commands/viz.js +417 -0
  61. package/dist/commands/viz.js.map +1 -1
  62. package/dist/dashboard-static/assets/index-CW9ZxqX8.css +1 -0
  63. package/dist/dashboard-static/assets/index-DNN__p4K.js +121 -0
  64. package/dist/dashboard-static/index.html +2 -2
  65. package/dist/index.js +324 -64
  66. package/dist/index.js.map +1 -1
  67. package/dist/lib/agent-config.d.ts +52 -0
  68. package/dist/lib/agent-config.d.ts.map +1 -0
  69. package/dist/lib/agent-config.js +231 -0
  70. package/dist/lib/agent-config.js.map +1 -0
  71. package/dist/lib/agent-generator.d.ts +10 -0
  72. package/dist/lib/agent-generator.d.ts.map +1 -1
  73. package/dist/lib/agent-generator.js +64 -10
  74. package/dist/lib/agent-generator.js.map +1 -1
  75. package/dist/lib/agent-session.d.ts +104 -0
  76. package/dist/lib/agent-session.d.ts.map +1 -0
  77. package/dist/lib/agent-session.js +635 -0
  78. package/dist/lib/agent-session.js.map +1 -0
  79. package/dist/lib/eval-snapshot.d.ts +47 -0
  80. package/dist/lib/eval-snapshot.d.ts.map +1 -0
  81. package/dist/lib/eval-snapshot.js +315 -0
  82. package/dist/lib/eval-snapshot.js.map +1 -0
  83. package/dist/lib/eval-store.d.ts +5 -0
  84. package/dist/lib/eval-store.d.ts.map +1 -1
  85. package/dist/lib/eval-store.js +33 -3
  86. package/dist/lib/eval-store.js.map +1 -1
  87. package/dist/lib/findings-engine.d.ts +51 -0
  88. package/dist/lib/findings-engine.d.ts.map +1 -0
  89. package/dist/lib/findings-engine.js +338 -0
  90. package/dist/lib/findings-engine.js.map +1 -0
  91. package/dist/lib/flow-engine.d.ts +8 -0
  92. package/dist/lib/flow-engine.d.ts.map +1 -1
  93. package/dist/lib/flow-engine.js +84 -2
  94. package/dist/lib/flow-engine.js.map +1 -1
  95. package/dist/lib/hub-client.d.ts +1 -0
  96. package/dist/lib/hub-client.d.ts.map +1 -1
  97. package/dist/lib/hub-client.js +33 -6
  98. package/dist/lib/hub-client.js.map +1 -1
  99. package/dist/lib/ide-panes.d.ts +58 -0
  100. package/dist/lib/ide-panes.d.ts.map +1 -0
  101. package/dist/lib/ide-panes.js +508 -0
  102. package/dist/lib/ide-panes.js.map +1 -0
  103. package/dist/lib/memory-db.js +4 -4
  104. package/dist/lib/memory-db.js.map +1 -1
  105. package/dist/lib/memory-indexer.d.ts.map +1 -1
  106. package/dist/lib/memory-indexer.js +3 -0
  107. package/dist/lib/memory-indexer.js.map +1 -1
  108. package/dist/lib/memory-search.d.ts +148 -4
  109. package/dist/lib/memory-search.d.ts.map +1 -1
  110. package/dist/lib/memory-search.js +496 -58
  111. package/dist/lib/memory-search.js.map +1 -1
  112. package/dist/lib/meta-orchestrator.d.ts +104 -0
  113. package/dist/lib/meta-orchestrator.d.ts.map +1 -0
  114. package/dist/lib/meta-orchestrator.js +373 -0
  115. package/dist/lib/meta-orchestrator.js.map +1 -0
  116. package/dist/lib/peer-agent-generator.d.ts.map +1 -1
  117. package/dist/lib/peer-agent-generator.js +43 -19
  118. package/dist/lib/peer-agent-generator.js.map +1 -1
  119. package/dist/lib/pi-sky/bridge.d.ts +55 -0
  120. package/dist/lib/pi-sky/bridge.d.ts.map +1 -0
  121. package/dist/lib/pi-sky/bridge.js +264 -0
  122. package/dist/lib/pi-sky/bridge.js.map +1 -0
  123. package/dist/lib/pi-sky/cost-monitor.d.ts +21 -0
  124. package/dist/lib/pi-sky/cost-monitor.d.ts.map +1 -0
  125. package/dist/lib/pi-sky/cost-monitor.js +126 -0
  126. package/dist/lib/pi-sky/cost-monitor.js.map +1 -0
  127. package/dist/lib/pi-sky/eval-sweep.d.ts +27 -0
  128. package/dist/lib/pi-sky/eval-sweep.d.ts.map +1 -0
  129. package/dist/lib/pi-sky/eval-sweep.js +141 -0
  130. package/dist/lib/pi-sky/eval-sweep.js.map +1 -0
  131. package/dist/lib/pi-sky/event-router.d.ts +32 -0
  132. package/dist/lib/pi-sky/event-router.d.ts.map +1 -0
  133. package/dist/lib/pi-sky/event-router.js +176 -0
  134. package/dist/lib/pi-sky/event-router.js.map +1 -0
  135. package/dist/lib/pi-sky/experiment.d.ts +9 -0
  136. package/dist/lib/pi-sky/experiment.d.ts.map +1 -0
  137. package/dist/lib/pi-sky/experiment.js +83 -0
  138. package/dist/lib/pi-sky/experiment.js.map +1 -0
  139. package/dist/lib/pi-sky/index.d.ts +16 -0
  140. package/dist/lib/pi-sky/index.d.ts.map +1 -0
  141. package/dist/lib/pi-sky/index.js +16 -0
  142. package/dist/lib/pi-sky/index.js.map +1 -0
  143. package/dist/lib/pi-sky/stratus-gate.d.ts +28 -0
  144. package/dist/lib/pi-sky/stratus-gate.d.ts.map +1 -0
  145. package/dist/lib/pi-sky/stratus-gate.js +61 -0
  146. package/dist/lib/pi-sky/stratus-gate.js.map +1 -0
  147. package/dist/lib/pi-sky/swarm.d.ts +28 -0
  148. package/dist/lib/pi-sky/swarm.d.ts.map +1 -0
  149. package/dist/lib/pi-sky/swarm.js +208 -0
  150. package/dist/lib/pi-sky/swarm.js.map +1 -0
  151. package/dist/lib/pi-sky/types.d.ts +139 -0
  152. package/dist/lib/pi-sky/types.d.ts.map +1 -0
  153. package/dist/lib/pi-sky/types.js +2 -0
  154. package/dist/lib/pi-sky/types.js.map +1 -0
  155. package/dist/lib/pi-sky/voice-bridge.d.ts +20 -0
  156. package/dist/lib/pi-sky/voice-bridge.d.ts.map +1 -0
  157. package/dist/lib/pi-sky/voice-bridge.js +91 -0
  158. package/dist/lib/pi-sky/voice-bridge.js.map +1 -0
  159. package/dist/lib/policy-head.d.ts +40 -0
  160. package/dist/lib/policy-head.d.ts.map +1 -0
  161. package/dist/lib/policy-head.js +234 -0
  162. package/dist/lib/policy-head.js.map +1 -0
  163. package/dist/lib/predictor.d.ts +10 -0
  164. package/dist/lib/predictor.d.ts.map +1 -1
  165. package/dist/lib/predictor.js +46 -7
  166. package/dist/lib/predictor.js.map +1 -1
  167. package/dist/lib/replay-buffer.d.ts +93 -0
  168. package/dist/lib/replay-buffer.d.ts.map +1 -0
  169. package/dist/lib/replay-buffer.js +302 -0
  170. package/dist/lib/replay-buffer.js.map +1 -0
  171. package/dist/lib/sentinel-rl.d.ts +97 -0
  172. package/dist/lib/sentinel-rl.d.ts.map +1 -0
  173. package/dist/lib/sentinel-rl.js +430 -0
  174. package/dist/lib/sentinel-rl.js.map +1 -0
  175. package/dist/lib/session-lock.d.ts +61 -0
  176. package/dist/lib/session-lock.d.ts.map +1 -0
  177. package/dist/lib/session-lock.js +438 -0
  178. package/dist/lib/session-lock.js.map +1 -0
  179. package/dist/lib/setup/agent-generator.d.ts +18 -0
  180. package/dist/lib/setup/agent-generator.d.ts.map +1 -0
  181. package/dist/lib/setup/agent-generator.js +114 -0
  182. package/dist/lib/setup/agent-generator.js.map +1 -0
  183. package/dist/lib/setup/context-analyzer.d.ts +16 -0
  184. package/dist/lib/setup/context-analyzer.d.ts.map +1 -0
  185. package/dist/lib/setup/context-analyzer.js +112 -0
  186. package/dist/lib/setup/context-analyzer.js.map +1 -0
  187. package/dist/lib/setup/doc-auditor.d.ts +54 -0
  188. package/dist/lib/setup/doc-auditor.d.ts.map +1 -0
  189. package/dist/lib/setup/doc-auditor.js +629 -0
  190. package/dist/lib/setup/doc-auditor.js.map +1 -0
  191. package/dist/lib/setup/domain-generator.d.ts +7 -0
  192. package/dist/lib/setup/domain-generator.d.ts.map +1 -0
  193. package/dist/lib/setup/domain-generator.js +58 -0
  194. package/dist/lib/setup/domain-generator.js.map +1 -0
  195. package/dist/lib/setup/smart-eval-generator.d.ts +38 -0
  196. package/dist/lib/setup/smart-eval-generator.d.ts.map +1 -0
  197. package/dist/lib/setup/smart-eval-generator.js +378 -0
  198. package/dist/lib/setup/smart-eval-generator.js.map +1 -0
  199. package/dist/lib/setup/smart-recommender.d.ts +63 -0
  200. package/dist/lib/setup/smart-recommender.d.ts.map +1 -0
  201. package/dist/lib/setup/smart-recommender.js +329 -0
  202. package/dist/lib/setup/smart-recommender.js.map +1 -0
  203. package/dist/lib/setup/spec-generator.d.ts +63 -0
  204. package/dist/lib/setup/spec-generator.d.ts.map +1 -0
  205. package/dist/lib/setup/spec-generator.js +310 -0
  206. package/dist/lib/setup/spec-generator.js.map +1 -0
  207. package/dist/lib/setup/violation-agent-generator.d.ts +32 -0
  208. package/dist/lib/setup/violation-agent-generator.d.ts.map +1 -0
  209. package/dist/lib/setup/violation-agent-generator.js +255 -0
  210. package/dist/lib/setup/violation-agent-generator.js.map +1 -0
  211. package/dist/lib/stratus-client.d.ts +1 -0
  212. package/dist/lib/stratus-client.d.ts.map +1 -1
  213. package/dist/lib/stratus-client.js +24 -2
  214. package/dist/lib/stratus-client.js.map +1 -1
  215. package/dist/lib/telemetry-agent-v2.d.ts +128 -0
  216. package/dist/lib/telemetry-agent-v2.d.ts.map +1 -0
  217. package/dist/lib/telemetry-agent-v2.js +1042 -0
  218. package/dist/lib/telemetry-agent-v2.js.map +1 -0
  219. package/dist/lib/telemetry-agent.d.ts.map +1 -1
  220. package/dist/lib/telemetry-agent.js +27 -6
  221. package/dist/lib/telemetry-agent.js.map +1 -1
  222. package/dist/lib/telemetry-digest.d.ts.map +1 -1
  223. package/dist/lib/telemetry-digest.js +27 -5
  224. package/dist/lib/telemetry-digest.js.map +1 -1
  225. package/dist/lib/telemetry.d.ts.map +1 -1
  226. package/dist/lib/telemetry.js +29 -4
  227. package/dist/lib/telemetry.js.map +1 -1
  228. package/dist/lib/text-preprocessing.d.ts +83 -0
  229. package/dist/lib/text-preprocessing.d.ts.map +1 -0
  230. package/dist/lib/text-preprocessing.js +261 -0
  231. package/dist/lib/text-preprocessing.js.map +1 -0
  232. package/dist/lib/training-buffer.d.ts +86 -0
  233. package/dist/lib/training-buffer.d.ts.map +1 -0
  234. package/dist/lib/training-buffer.js +139 -0
  235. package/dist/lib/training-buffer.js.map +1 -0
  236. package/dist/lib/tuple-miner.d.ts +30 -0
  237. package/dist/lib/tuple-miner.d.ts.map +1 -0
  238. package/dist/lib/tuple-miner.js +427 -0
  239. package/dist/lib/tuple-miner.js.map +1 -0
  240. package/dist/lib/vm-backend.d.ts +72 -0
  241. package/dist/lib/vm-backend.d.ts.map +1 -0
  242. package/dist/lib/vm-backend.js +175 -0
  243. package/dist/lib/vm-backend.js.map +1 -0
  244. package/dist/lib/workspace/backend.d.ts +53 -0
  245. package/dist/lib/workspace/backend.d.ts.map +1 -0
  246. package/dist/lib/workspace/backend.js +37 -0
  247. package/dist/lib/workspace/backend.js.map +1 -0
  248. package/dist/lib/workspace/cmux-adapter.d.ts +46 -0
  249. package/dist/lib/workspace/cmux-adapter.d.ts.map +1 -0
  250. package/dist/lib/workspace/cmux-adapter.js +261 -0
  251. package/dist/lib/workspace/cmux-adapter.js.map +1 -0
  252. package/dist/lib/workspace/data-pipeline.d.ts +35 -0
  253. package/dist/lib/workspace/data-pipeline.d.ts.map +1 -0
  254. package/dist/lib/workspace/data-pipeline.js +463 -0
  255. package/dist/lib/workspace/data-pipeline.js.map +1 -0
  256. package/dist/lib/workspace/engine.d.ts +64 -0
  257. package/dist/lib/workspace/engine.d.ts.map +1 -0
  258. package/dist/lib/workspace/engine.js +397 -0
  259. package/dist/lib/workspace/engine.js.map +1 -0
  260. package/dist/lib/workspace/notifications.d.ts +14 -0
  261. package/dist/lib/workspace/notifications.d.ts.map +1 -0
  262. package/dist/lib/workspace/notifications.js +41 -0
  263. package/dist/lib/workspace/notifications.js.map +1 -0
  264. package/dist/lib/workspace/surface-registry.d.ts +49 -0
  265. package/dist/lib/workspace/surface-registry.d.ts.map +1 -0
  266. package/dist/lib/workspace/surface-registry.js +217 -0
  267. package/dist/lib/workspace/surface-registry.js.map +1 -0
  268. package/dist/lib/workspace/surface-type.d.ts +153 -0
  269. package/dist/lib/workspace/surface-type.d.ts.map +1 -0
  270. package/dist/lib/workspace/surface-type.js +9 -0
  271. package/dist/lib/workspace/surface-type.js.map +1 -0
  272. package/dist/lib/workspace/surfaces/agent-overview.d.ts +16 -0
  273. package/dist/lib/workspace/surfaces/agent-overview.d.ts.map +1 -0
  274. package/dist/lib/workspace/surfaces/agent-overview.js +116 -0
  275. package/dist/lib/workspace/surfaces/agent-overview.js.map +1 -0
  276. package/dist/lib/workspace/surfaces/agent.d.ts +16 -0
  277. package/dist/lib/workspace/surfaces/agent.d.ts.map +1 -0
  278. package/dist/lib/workspace/surfaces/agent.js +112 -0
  279. package/dist/lib/workspace/surfaces/agent.js.map +1 -0
  280. package/dist/lib/workspace/surfaces/claude.d.ts +15 -0
  281. package/dist/lib/workspace/surfaces/claude.d.ts.map +1 -0
  282. package/dist/lib/workspace/surfaces/claude.js +23 -0
  283. package/dist/lib/workspace/surfaces/claude.js.map +1 -0
  284. package/dist/lib/workspace/surfaces/dashboard.d.ts +21 -0
  285. package/dist/lib/workspace/surfaces/dashboard.d.ts.map +1 -0
  286. package/dist/lib/workspace/surfaces/dashboard.js +32 -0
  287. package/dist/lib/workspace/surfaces/dashboard.js.map +1 -0
  288. package/dist/lib/workspace/surfaces/eval.d.ts +15 -0
  289. package/dist/lib/workspace/surfaces/eval.d.ts.map +1 -0
  290. package/dist/lib/workspace/surfaces/eval.js +42 -0
  291. package/dist/lib/workspace/surfaces/eval.js.map +1 -0
  292. package/dist/lib/workspace/surfaces/event-stream.d.ts +16 -0
  293. package/dist/lib/workspace/surfaces/event-stream.d.ts.map +1 -0
  294. package/dist/lib/workspace/surfaces/event-stream.js +40 -0
  295. package/dist/lib/workspace/surfaces/event-stream.js.map +1 -0
  296. package/dist/lib/workspace/surfaces/flow.d.ts +16 -0
  297. package/dist/lib/workspace/surfaces/flow.d.ts.map +1 -0
  298. package/dist/lib/workspace/surfaces/flow.js +49 -0
  299. package/dist/lib/workspace/surfaces/flow.js.map +1 -0
  300. package/dist/lib/workspace/surfaces/index.d.ts +16 -0
  301. package/dist/lib/workspace/surfaces/index.d.ts.map +1 -0
  302. package/dist/lib/workspace/surfaces/index.js +16 -0
  303. package/dist/lib/workspace/surfaces/index.js.map +1 -0
  304. package/dist/lib/workspace/surfaces/portfolio.d.ts +16 -0
  305. package/dist/lib/workspace/surfaces/portfolio.d.ts.map +1 -0
  306. package/dist/lib/workspace/surfaces/portfolio.js +102 -0
  307. package/dist/lib/workspace/surfaces/portfolio.js.map +1 -0
  308. package/dist/lib/workspace/surfaces/service.d.ts +16 -0
  309. package/dist/lib/workspace/surfaces/service.d.ts.map +1 -0
  310. package/dist/lib/workspace/surfaces/service.js +45 -0
  311. package/dist/lib/workspace/surfaces/service.js.map +1 -0
  312. package/dist/lib/workspace/surfaces/shell.d.ts +15 -0
  313. package/dist/lib/workspace/surfaces/shell.d.ts.map +1 -0
  314. package/dist/lib/workspace/surfaces/shell.js +19 -0
  315. package/dist/lib/workspace/surfaces/shell.js.map +1 -0
  316. package/dist/lib/workspace/surfaces/telemetry.d.ts +16 -0
  317. package/dist/lib/workspace/surfaces/telemetry.d.ts.map +1 -0
  318. package/dist/lib/workspace/surfaces/telemetry.js +48 -0
  319. package/dist/lib/workspace/surfaces/telemetry.js.map +1 -0
  320. package/dist/lib/workspace/surfaces/topology.d.ts +15 -0
  321. package/dist/lib/workspace/surfaces/topology.d.ts.map +1 -0
  322. package/dist/lib/workspace/surfaces/topology.js +19 -0
  323. package/dist/lib/workspace/surfaces/topology.js.map +1 -0
  324. package/dist/lib/workspace/surfaces/training.d.ts +16 -0
  325. package/dist/lib/workspace/surfaces/training.d.ts.map +1 -0
  326. package/dist/lib/workspace/surfaces/training.js +22 -0
  327. package/dist/lib/workspace/surfaces/training.js.map +1 -0
  328. package/dist/lib/workspace/tmux-adapter.d.ts +27 -0
  329. package/dist/lib/workspace/tmux-adapter.d.ts.map +1 -0
  330. package/dist/lib/workspace/tmux-adapter.js +106 -0
  331. package/dist/lib/workspace/tmux-adapter.js.map +1 -0
  332. package/dist/mcp/context-hub-mcp.js +7 -24
  333. package/dist/mcp/context-hub-mcp.js.map +1 -1
  334. package/dist/types/flows.d.ts +2 -0
  335. package/dist/types/flows.d.ts.map +1 -1
  336. package/dist/types/ide.d.ts +49 -0
  337. package/dist/types/ide.d.ts.map +1 -0
  338. package/dist/types/ide.js +5 -0
  339. package/dist/types/ide.js.map +1 -0
  340. package/dist/types/platform-digest.d.ts +228 -0
  341. package/dist/types/platform-digest.d.ts.map +1 -0
  342. package/dist/types/platform-digest.js +5 -0
  343. package/dist/types/platform-digest.js.map +1 -0
  344. package/dist/types/telemetry-digest.d.ts +2 -0
  345. package/dist/types/telemetry-digest.d.ts.map +1 -1
  346. package/dist/utils/ensure-project.d.ts +1 -0
  347. package/dist/utils/ensure-project.d.ts.map +1 -1
  348. package/dist/utils/ensure-project.js +19 -7
  349. package/dist/utils/ensure-project.js.map +1 -1
  350. package/dist/utils/jfl-config.d.ts +1 -0
  351. package/dist/utils/jfl-config.d.ts.map +1 -1
  352. package/dist/utils/jfl-config.js +19 -1
  353. package/dist/utils/jfl-config.js.map +1 -1
  354. package/dist/utils/jfl-paths.d.ts +5 -0
  355. package/dist/utils/jfl-paths.d.ts.map +1 -1
  356. package/dist/utils/jfl-paths.js +25 -3
  357. package/dist/utils/jfl-paths.js.map +1 -1
  358. package/package.json +3 -2
  359. package/packages/pi/AGENTS.md +112 -0
  360. package/packages/pi/extensions/agent-grid.ts +191 -0
  361. package/packages/pi/extensions/agent-names.ts +178 -0
  362. package/packages/pi/extensions/autoresearch.ts +427 -0
  363. package/packages/pi/extensions/bookmarks.ts +85 -0
  364. package/packages/pi/extensions/context.ts +184 -0
  365. package/packages/pi/extensions/crm-tool.ts +61 -0
  366. package/packages/pi/extensions/eval-tool.ts +224 -0
  367. package/packages/pi/extensions/eval.ts +60 -0
  368. package/packages/pi/extensions/footer.ts +239 -0
  369. package/packages/pi/extensions/hub-resolver.ts +63 -0
  370. package/packages/pi/extensions/hud-tool.ts +145 -0
  371. package/packages/pi/extensions/index.ts +405 -0
  372. package/packages/pi/extensions/journal.ts +224 -0
  373. package/packages/pi/extensions/map-bridge.ts +178 -0
  374. package/packages/pi/extensions/memory-tool.ts +73 -0
  375. package/packages/pi/extensions/notifications.ts +73 -0
  376. package/packages/pi/extensions/peter-parker.ts +202 -0
  377. package/packages/pi/extensions/policy-head-tool.ts +276 -0
  378. package/packages/pi/extensions/portfolio-bridge.ts +90 -0
  379. package/packages/pi/extensions/session.ts +142 -0
  380. package/packages/pi/extensions/shortcuts.ts +259 -0
  381. package/packages/pi/extensions/stratus-bridge.ts +115 -0
  382. package/packages/pi/extensions/synopsis-tool.ts +83 -0
  383. package/packages/pi/extensions/tool-renderers.ts +353 -0
  384. package/packages/pi/extensions/training-buffer-tool.ts +368 -0
  385. package/packages/pi/extensions/types.ts +163 -0
  386. package/packages/pi/package-lock.json +346 -0
  387. package/packages/pi/package.json +44 -0
  388. package/packages/pi/skills/agent-browser/SKILL.md +116 -0
  389. package/packages/pi/skills/brand-architect/SKILL.md +240 -0
  390. package/packages/pi/skills/brand-architect/config.yaml +137 -0
  391. package/packages/pi/skills/campaign-hud/config.yaml +112 -0
  392. package/packages/pi/skills/content-creator/SKILL.md +294 -0
  393. package/packages/pi/skills/context/SKILL.md +65 -0
  394. package/packages/pi/skills/debug/MULTI_AGENT.md +360 -0
  395. package/packages/pi/skills/debug/SKILL.md +554 -0
  396. package/packages/pi/skills/end/SKILL.md +1782 -0
  397. package/packages/pi/skills/eval/SKILL.md +75 -0
  398. package/packages/pi/skills/fly-deploy/SKILL.md +676 -0
  399. package/packages/pi/skills/founder-video/SKILL.md +467 -0
  400. package/packages/pi/skills/hud/SKILL.md +160 -0
  401. package/packages/pi/skills/orchestrate/SKILL.md +74 -0
  402. package/packages/pi/skills/pi-agents/SKILL.md +78 -0
  403. package/packages/pi/skills/react-best-practices/AGENTS.md +2249 -0
  404. package/packages/pi/skills/react-best-practices/README.md +123 -0
  405. package/packages/pi/skills/react-best-practices/SKILL.md +125 -0
  406. package/packages/pi/skills/react-best-practices/metadata.json +15 -0
  407. package/packages/pi/skills/react-best-practices/rules/_sections.md +46 -0
  408. package/packages/pi/skills/react-best-practices/rules/_template.md +28 -0
  409. package/packages/pi/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  410. package/packages/pi/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  411. package/packages/pi/skills/react-best-practices/rules/async-api-routes.md +38 -0
  412. package/packages/pi/skills/react-best-practices/rules/async-defer-await.md +80 -0
  413. package/packages/pi/skills/react-best-practices/rules/async-dependencies.md +36 -0
  414. package/packages/pi/skills/react-best-practices/rules/async-parallel.md +28 -0
  415. package/packages/pi/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  416. package/packages/pi/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  417. package/packages/pi/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  418. package/packages/pi/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  419. package/packages/pi/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  420. package/packages/pi/skills/react-best-practices/rules/bundle-preload.md +50 -0
  421. package/packages/pi/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  422. package/packages/pi/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  423. package/packages/pi/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  424. package/packages/pi/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  425. package/packages/pi/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  426. package/packages/pi/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  427. package/packages/pi/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  428. package/packages/pi/skills/react-best-practices/rules/js-early-exit.md +50 -0
  429. package/packages/pi/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  430. package/packages/pi/skills/react-best-practices/rules/js-index-maps.md +37 -0
  431. package/packages/pi/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  432. package/packages/pi/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  433. package/packages/pi/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  434. package/packages/pi/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  435. package/packages/pi/skills/react-best-practices/rules/rendering-activity.md +26 -0
  436. package/packages/pi/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  437. package/packages/pi/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  438. package/packages/pi/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  439. package/packages/pi/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  440. package/packages/pi/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  441. package/packages/pi/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  442. package/packages/pi/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  443. package/packages/pi/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  444. package/packages/pi/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  445. package/packages/pi/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  446. package/packages/pi/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  447. package/packages/pi/skills/react-best-practices/rules/rerender-memo.md +44 -0
  448. package/packages/pi/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  449. package/packages/pi/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  450. package/packages/pi/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  451. package/packages/pi/skills/react-best-practices/rules/server-cache-react.md +26 -0
  452. package/packages/pi/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
  453. package/packages/pi/skills/react-best-practices/rules/server-serialization.md +38 -0
  454. package/packages/pi/skills/remotion-best-practices/SKILL.md +43 -0
  455. package/packages/pi/skills/remotion-best-practices/rules/3d.md +86 -0
  456. package/packages/pi/skills/remotion-best-practices/rules/animations.md +29 -0
  457. package/packages/pi/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  458. package/packages/pi/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  459. package/packages/pi/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
  460. package/packages/pi/skills/remotion-best-practices/rules/assets.md +78 -0
  461. package/packages/pi/skills/remotion-best-practices/rules/audio.md +172 -0
  462. package/packages/pi/skills/remotion-best-practices/rules/calculate-metadata.md +104 -0
  463. package/packages/pi/skills/remotion-best-practices/rules/can-decode.md +75 -0
  464. package/packages/pi/skills/remotion-best-practices/rules/charts.md +58 -0
  465. package/packages/pi/skills/remotion-best-practices/rules/compositions.md +146 -0
  466. package/packages/pi/skills/remotion-best-practices/rules/display-captions.md +126 -0
  467. package/packages/pi/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  468. package/packages/pi/skills/remotion-best-practices/rules/fonts.md +152 -0
  469. package/packages/pi/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  470. package/packages/pi/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  471. package/packages/pi/skills/remotion-best-practices/rules/get-video-duration.md +58 -0
  472. package/packages/pi/skills/remotion-best-practices/rules/gifs.md +138 -0
  473. package/packages/pi/skills/remotion-best-practices/rules/images.md +130 -0
  474. package/packages/pi/skills/remotion-best-practices/rules/import-srt-captions.md +67 -0
  475. package/packages/pi/skills/remotion-best-practices/rules/lottie.md +68 -0
  476. package/packages/pi/skills/remotion-best-practices/rules/measuring-dom-nodes.md +35 -0
  477. package/packages/pi/skills/remotion-best-practices/rules/measuring-text.md +143 -0
  478. package/packages/pi/skills/remotion-best-practices/rules/sequencing.md +106 -0
  479. package/packages/pi/skills/remotion-best-practices/rules/tailwind.md +11 -0
  480. package/packages/pi/skills/remotion-best-practices/rules/text-animations.md +20 -0
  481. package/packages/pi/skills/remotion-best-practices/rules/timing.md +179 -0
  482. package/packages/pi/skills/remotion-best-practices/rules/transcribe-captions.md +19 -0
  483. package/packages/pi/skills/remotion-best-practices/rules/transitions.md +122 -0
  484. package/packages/pi/skills/remotion-best-practices/rules/trimming.md +53 -0
  485. package/packages/pi/skills/remotion-best-practices/rules/videos.md +171 -0
  486. package/packages/pi/skills/search/SKILL.md +220 -0
  487. package/packages/pi/skills/spec/SKILL.md +377 -0
  488. package/packages/pi/skills/startup/SKILL.md +315 -0
  489. package/packages/pi/skills/web-architect/SKILL.md +309 -0
  490. package/packages/pi/skills/x-algorithm/SKILL.md +305 -0
  491. package/packages/pi/teams/dev-team.yaml +63 -0
  492. package/packages/pi/teams/gtm-team.yaml +79 -0
  493. package/packages/pi/themes/jfl.theme.json +76 -0
  494. package/packages/pi/tsconfig.json +21 -0
  495. package/scripts/collect-tuples.sh +124 -0
  496. package/scripts/destroy-fleet.sh +37 -0
  497. package/scripts/jfl-ide.sh +48 -0
  498. package/scripts/session/session-cleanup.sh +4 -11
  499. package/scripts/session/session-init.sh +6 -0
  500. package/scripts/session/session-sync.sh +25 -0
  501. package/scripts/setup-branch-protection.sh +106 -0
  502. package/scripts/spawn-fleet.sh +144 -0
  503. package/scripts/train/requirements.txt +5 -0
  504. package/scripts/train/train-policy-head.py +477 -0
  505. package/scripts/train/v2/dataset.py +81 -0
  506. package/scripts/train/v2/domain.json +18 -0
  507. package/scripts/train/v2/eval.py +196 -0
  508. package/scripts/train/v2/generate_data.py +219 -0
  509. package/scripts/train/v2/infer.py +188 -0
  510. package/scripts/train/v2/model.py +112 -0
  511. package/scripts/train/v2/precompute.py +132 -0
  512. package/scripts/train/v2/train.py +302 -0
  513. package/scripts/train/v2/transform_buffer.py +227 -0
  514. package/scripts/train/v2/validate_data.py +115 -0
  515. package/scripts/train-policy-head.py +434 -0
  516. package/scripts/vm-swarm/README.md +301 -0
  517. package/scripts/vm-swarm/collect-tuples.sh +331 -0
  518. package/scripts/vm-swarm/create-base-template.sh +339 -0
  519. package/scripts/vm-swarm/kill-fleet.sh +204 -0
  520. package/scripts/vm-swarm/monitor-fleet.sh +346 -0
  521. package/scripts/vm-swarm/spawn-fleet.sh +304 -0
  522. package/template/.claude/settings.json +2 -15
  523. package/template/.github/workflows/jfl-eval.yml +6 -1
  524. package/template/.github/workflows/jfl-review.yml +4 -0
  525. package/template/scripts/session/session-cleanup.sh +2 -11
  526. package/template/scripts/session/session-end-hub.sh +72 -0
  527. package/template/scripts/session/session-end.sh +69 -6
  528. package/template/scripts/session/session-init.sh +55 -30
  529. package/template/scripts/session/session-lock.sh +464 -0
  530. package/template/scripts/session/session-start-hub.sh +105 -0
  531. package/template/templates/service-agent/workflows/jfl-eval.yml +19 -0
  532. package/dist/dashboard-static/assets/index-B6kRK9Rq.js +0 -116
  533. package/dist/dashboard-static/assets/index-BpdKJPLu.css +0 -1
@@ -0,0 +1,301 @@
1
+ # VM Swarm — Parallel Agent Fleet for JFL
2
+
3
+ Run multiple AI agent instances in parallel using Parallels Desktop VMs.
4
+ Each VM is a full macOS environment with JFL installed, capable of running
5
+ autoresearch, fuzz testing, or evaluation independently.
6
+
7
+ ## Architecture
8
+
9
+ ```
10
+ ┌─────────────────────────────────────────────────────────────────┐
11
+ │ Host Machine │
12
+ │ │
13
+ │ ┌────────────────────────────────────────────────────────────┐ │
14
+ │ │ VM Swarm Controller │ │
15
+ │ │ spawn-fleet.sh │ monitor-fleet.sh │ collect-tuples.sh │ │
16
+ │ └────────────────────────────────────────────────────────────┘ │
17
+ │ │ │
18
+ │ ┌───────────────┼───────────────┐ │
19
+ │ ▼ ▼ ▼ │
20
+ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
21
+ │ │ jfl-agent-1 │ │ jfl-agent-2 │ │ jfl-agent-N │ │
22
+ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │
23
+ │ │ │ jfl-cli │ │ │ │ jfl-cli │ │ │ │ jfl-cli │ │ │
24
+ │ │ │ claude-code│ │ │ │ claude-code│ │ │ │ claude-code│ │ │
25
+ │ │ │ autoresearch│ │ │ │ fuzz tests │ │ │ │ eval │ │ │
26
+ │ │ └────────────┘ │ │ └────────────┘ │ │ └────────────┘ │ │
27
+ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │
28
+ │ │ │ training- │ │ │ │ training- │ │ │ │ training- │ │ │
29
+ │ │ │ buffer.jsonl│ │ │ │ buffer.jsonl│ │ │ │ buffer.jsonl│ │ │
30
+ │ │ └────────────┘ │ │ └────────────┘ │ │ └────────────┘ │ │
31
+ │ └──────────────────┘ └──────────────────┘ └──────────────────┘ │
32
+ │ │ │ │ │
33
+ │ └───────────────┼───────────────┘ │
34
+ │ ▼ │
35
+ │ ┌──────────────────┐ │
36
+ │ │ Merged Training │ │
37
+ │ │ Buffer (Host) │ │
38
+ │ └──────────────────┘ │
39
+ └─────────────────────────────────────────────────────────────────┘
40
+ ```
41
+
42
+ ## Prerequisites
43
+
44
+ ### Hardware
45
+ - Mac with Apple Silicon (M1/M2/M3) or Intel
46
+ - 32GB+ RAM recommended (8GB per VM)
47
+ - 100GB+ free disk space
48
+
49
+ ### Software
50
+ - **Parallels Desktop Pro** (required for `prlctl` command)
51
+ - Standard edition does NOT include prlctl
52
+ - Business or Pro license required
53
+ - macOS Sonoma or later (for VMs)
54
+ - Node.js 18+ on host
55
+
56
+ ### Kernel Configuration (Important!)
57
+
58
+ By default, macOS limits virtualization memory. For large fleets, increase the limit:
59
+
60
+ ```bash
61
+ # Check current limit
62
+ sysctl kern.hv_apple_isa_vm_quota
63
+
64
+ # Increase to 255GB (temporary, until reboot)
65
+ sudo sysctl -w kern.hv_apple_isa_vm_quota=255
66
+
67
+ # Make permanent (requires SIP disabled or MDM)
68
+ # Add to /Library/Preferences/SystemConfiguration/com.apple.Boot.plist
69
+ ```
70
+
71
+ ## Quick Start
72
+
73
+ ### 1. Create Base Template
74
+
75
+ First, create a VM template with all dependencies:
76
+
77
+ ```bash
78
+ # From an existing macOS VM
79
+ ./create-base-template.sh --from-existing "macOS 14"
80
+
81
+ # Or from a macOS installer ISO
82
+ ./create-base-template.sh --from-iso "/path/to/InstallmacOS.iso"
83
+ ```
84
+
85
+ This creates a VM named `jfl-agent-base` with:
86
+ - Node.js + npm
87
+ - Git
88
+ - Claude Code
89
+ - jfl-cli (linked globally)
90
+ - jfl-platform, jfl-template repos
91
+ - Your `.env` file (for STRATUS keys)
92
+
93
+ ### 2. Spawn Fleet
94
+
95
+ Spawn multiple VMs from the template:
96
+
97
+ ```bash
98
+ # Default: 5 VMs running autoresearch
99
+ ./spawn-fleet.sh
100
+
101
+ # Custom count and task
102
+ ./spawn-fleet.sh 10 jfl-agent-base autoresearch
103
+ ./spawn-fleet.sh 4 jfl-agent-base fuzz
104
+ ./spawn-fleet.sh 3 jfl-agent-base eval
105
+ ```
106
+
107
+ Task types:
108
+ - `autoresearch` — Each VM researches a different repo/service
109
+ - `fuzz` — Each VM runs a different fuzz test suite
110
+ - `eval` — Each VM runs evaluation with different profiles
111
+
112
+ ### 3. Monitor Progress
113
+
114
+ Watch fleet status in real-time:
115
+
116
+ ```bash
117
+ # One-time check
118
+ ./monitor-fleet.sh
119
+
120
+ # Continuous monitoring (refreshes every 10s)
121
+ ./monitor-fleet.sh --watch
122
+
123
+ # JSON output (for scripting)
124
+ ./monitor-fleet.sh --json
125
+ ```
126
+
127
+ Output shows:
128
+ - VM status (running/stopped)
129
+ - Current task
130
+ - Uptime
131
+ - Latest eval score
132
+ - Training tuple count
133
+
134
+ ### 4. Collect Training Data
135
+
136
+ Aggregate training tuples from all VMs:
137
+
138
+ ```bash
139
+ ./collect-tuples.sh
140
+
141
+ # Verbose mode
142
+ ./collect-tuples.sh --verbose
143
+
144
+ # Dry run (don't merge)
145
+ ./collect-tuples.sh --dry-run
146
+ ```
147
+
148
+ This:
149
+ - Copies `.jfl/training-buffer.jsonl` from each VM
150
+ - Merges into host's training buffer
151
+ - Deduplicates by tuple ID
152
+ - Reports per-VM counts and overall stats
153
+
154
+ ### 5. Stop Fleet
155
+
156
+ Stop and optionally delete the VMs:
157
+
158
+ ```bash
159
+ # Stop all VMs (keep them for later)
160
+ ./kill-fleet.sh
161
+
162
+ # Stop and delete clones (keeps template)
163
+ ./kill-fleet.sh --delete
164
+
165
+ # Collect tuples before killing
166
+ ./kill-fleet.sh --collect
167
+
168
+ # Force kill (no graceful shutdown)
169
+ ./kill-fleet.sh --force
170
+ ```
171
+
172
+ ## Workflow Examples
173
+
174
+ ### Parallel Autoresearch
175
+
176
+ Run autoresearch across multiple code areas simultaneously:
177
+
178
+ ```bash
179
+ # Spawn 5 VMs, each researching different parts of the codebase
180
+ ./spawn-fleet.sh 5 jfl-agent-base autoresearch
181
+
182
+ # VMs will research:
183
+ # - VM 1: jfl-cli/src/commands
184
+ # - VM 2: jfl-cli/src/lib
185
+ # - VM 3: jfl-platform/packages/memory
186
+ # - VM 4: jfl-platform/packages/eval
187
+ # - VM 5: jfl-template/knowledge
188
+
189
+ # Monitor progress
190
+ ./monitor-fleet.sh --watch
191
+
192
+ # After ~1 hour, collect training tuples
193
+ ./collect-tuples.sh
194
+
195
+ # Clean up
196
+ ./kill-fleet.sh --delete
197
+ ```
198
+
199
+ ### Parallel Fuzz Testing
200
+
201
+ Run all fuzz test suites in parallel:
202
+
203
+ ```bash
204
+ ./spawn-fleet.sh 4 jfl-agent-base fuzz
205
+
206
+ # VMs will run:
207
+ # - VM 1: fuzz-scope tests
208
+ # - VM 2: fuzz-events tests
209
+ # - VM 3: fuzz-training tests
210
+ # - VM 4: fuzz-hub-api tests
211
+
212
+ ./monitor-fleet.sh --watch
213
+ ```
214
+
215
+ ### Overnight Training Run
216
+
217
+ Set up a long-running training session:
218
+
219
+ ```bash
220
+ # Start fleet
221
+ ./spawn-fleet.sh 10 jfl-agent-base autoresearch
222
+
223
+ # Set up periodic collection (run in separate terminal)
224
+ while true; do
225
+ sleep 3600 # Every hour
226
+ ./collect-tuples.sh
227
+ done
228
+
229
+ # Or use cron:
230
+ # 0 * * * * /path/to/collect-tuples.sh >> /tmp/collect.log 2>&1
231
+ ```
232
+
233
+ ## File Locations
234
+
235
+ | File | Purpose |
236
+ |------|---------|
237
+ | `.jfl/vm-fleet/` | Fleet logs and state |
238
+ | `.jfl/vm-fleet/vm-N.log` | Log for VM N |
239
+ | `.jfl/vm-fleet/running-tasks` | Current task assignments |
240
+ | `.jfl/vm-fleet/fleet-started` | Fleet start timestamp |
241
+ | `.jfl/vm-fleet/collected/` | Collected training buffers |
242
+ | `.jfl/training-buffer.jsonl` | Merged training data |
243
+
244
+ ## Troubleshooting
245
+
246
+ ### "prlctl not found"
247
+
248
+ Install Parallels Desktop Pro. The standard edition doesn't include prlctl.
249
+
250
+ ### "VM quota exceeded"
251
+
252
+ Increase the VM memory quota:
253
+ ```bash
254
+ sudo sysctl -w kern.hv_apple_isa_vm_quota=255
255
+ ```
256
+
257
+ ### VM won't start
258
+
259
+ Check available resources:
260
+ ```bash
261
+ # See running VMs
262
+ prlctl list -a
263
+
264
+ # Check VM details
265
+ prlctl list -i jfl-agent-1
266
+ ```
267
+
268
+ ### Collect fails
269
+
270
+ Ensure VMs are running and have generated training data:
271
+ ```bash
272
+ # Check if buffer exists in VM
273
+ prlctl exec jfl-agent-1 ls -la /workspace/jfl-cli/.jfl/
274
+ ```
275
+
276
+ ### Template creation fails
277
+
278
+ If creating from ISO, manual macOS installation is required:
279
+ 1. Run `create-base-template.sh --from-iso <path>`
280
+ 2. Complete macOS Setup Assistant in the VM
281
+ 3. Run `create-base-template.sh --setup-only` to install dependencies
282
+
283
+ ## Resource Usage
284
+
285
+ Approximate resource usage per VM:
286
+ - CPU: 4 cores
287
+ - RAM: 8GB
288
+ - Disk: 20GB (linked clone from template)
289
+
290
+ For a 5-VM fleet:
291
+ - CPU: 20 cores utilized
292
+ - RAM: 40GB
293
+ - Disk: 50GB base + 100GB template
294
+
295
+ ## Tips
296
+
297
+ 1. **Start small** — Test with 2-3 VMs before scaling up
298
+ 2. **Use linked clones** — spawn-fleet.sh uses linked clones by default (fast, space-efficient)
299
+ 3. **Collect often** — Run `collect-tuples.sh` periodically to avoid data loss if VMs crash
300
+ 4. **Monitor costs** — Each VM running Claude Code incurs API costs
301
+ 5. **Clean up** — Delete unused VMs to free disk space
@@ -0,0 +1,331 @@
1
+ #!/bin/bash
2
+ #
3
+ # collect-tuples.sh — Collect training tuples from fleet VMs
4
+ #
5
+ # Copies training buffer files from all running VMs, merges them
6
+ # with deduplication, and stores in the host's training buffer.
7
+ #
8
+ # Usage:
9
+ # ./collect-tuples.sh # Collect from all VMs
10
+ # ./collect-tuples.sh --dry-run # Show what would be collected
11
+ # ./collect-tuples.sh --output /path # Custom output directory
12
+ #
13
+
14
+ set -euo pipefail
15
+
16
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
17
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
18
+ COLLECT_DIR="$PROJECT_ROOT/.jfl/vm-fleet/collected"
19
+ MERGED_FILE="$PROJECT_ROOT/.jfl/training-buffer.jsonl"
20
+
21
+ # Options
22
+ DRY_RUN=false
23
+ OUTPUT_DIR=""
24
+
25
+ # Colors
26
+ RED='\033[0;31m'
27
+ GREEN='\033[0;32m'
28
+ YELLOW='\033[1;33m'
29
+ BLUE='\033[0;34m'
30
+ CYAN='\033[0;36m'
31
+ NC='\033[0m'
32
+
33
+ log() { echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1"; }
34
+ success() { echo -e "${GREEN}[$(date '+%H:%M:%S')] ✓${NC} $1"; }
35
+ warn() { echo -e "${YELLOW}[$(date '+%H:%M:%S')] ⚠${NC} $1"; }
36
+ error() { echo -e "${RED}[$(date '+%H:%M:%S')] ✗${NC} $1"; }
37
+
38
+ # Parse arguments
39
+ while [[ $# -gt 0 ]]; do
40
+ case "$1" in
41
+ --dry-run|-d)
42
+ DRY_RUN=true
43
+ shift
44
+ ;;
45
+ --output|-o)
46
+ OUTPUT_DIR="$2"
47
+ shift 2
48
+ ;;
49
+ --help|-h)
50
+ echo "Usage: $0 [options]"
51
+ echo ""
52
+ echo "Options:"
53
+ echo " --dry-run, -d Show what would be collected"
54
+ echo " --output, -o <dir> Custom output directory"
55
+ echo ""
56
+ exit 0
57
+ ;;
58
+ *)
59
+ error "Unknown option: $1"
60
+ exit 1
61
+ ;;
62
+ esac
63
+ done
64
+
65
+ if [[ -n "$OUTPUT_DIR" ]]; then
66
+ COLLECT_DIR="$OUTPUT_DIR"
67
+ fi
68
+
69
+ # Get all running agent VMs
70
+ get_running_vms() {
71
+ prlctl list -o name,status 2>/dev/null | grep 'running' | grep 'jfl-agent-' | awk '{print $1}' | sort -V
72
+ }
73
+
74
+ # Copy training buffer from a single VM
75
+ copy_from_vm() {
76
+ local vm_name=$1
77
+ local vm_index
78
+ vm_index=$(echo "$vm_name" | grep -oE '[0-9]+$' || echo "0")
79
+ local output_file="$COLLECT_DIR/tuples-${vm_name}.jsonl"
80
+
81
+ log "Collecting from $vm_name..."
82
+
83
+ if [[ "$DRY_RUN" == true ]]; then
84
+ log " [DRY RUN] Would copy .jfl/training-buffer.jsonl"
85
+ return 0
86
+ fi
87
+
88
+ # Try multiple possible locations
89
+ local buffer_paths=(
90
+ "/workspace/jfl-cli/.jfl/training-buffer.jsonl"
91
+ "/workspace/jfl-platform/.jfl/training-buffer.jsonl"
92
+ "$HOME/.jfl/training-buffer.jsonl"
93
+ )
94
+
95
+ for buffer_path in "${buffer_paths[@]}"; do
96
+ if prlctl exec "$vm_name" test -f "$buffer_path" 2>/dev/null; then
97
+ log " Found buffer at: $buffer_path"
98
+
99
+ # Copy file content
100
+ prlctl exec "$vm_name" cat "$buffer_path" > "$output_file" 2>/dev/null
101
+
102
+ local count
103
+ count=$(wc -l < "$output_file" | tr -d ' ')
104
+
105
+ if [[ "$count" -gt 0 ]]; then
106
+ success " Collected $count tuples from $vm_name"
107
+ return 0
108
+ fi
109
+ fi
110
+ done
111
+
112
+ # Also check for any autoresearch results
113
+ local ar_results
114
+ ar_results=$(prlctl exec "$vm_name" /bin/bash -c '
115
+ find /workspace -name "autoresearch-*.log" -type f 2>/dev/null | head -5
116
+ ' 2>/dev/null || true)
117
+
118
+ if [[ -n "$ar_results" ]]; then
119
+ log " Found autoresearch logs: $ar_results"
120
+ fi
121
+
122
+ warn " No training buffer found in $vm_name"
123
+ return 1
124
+ }
125
+
126
+ # Merge all collected files with deduplication
127
+ merge_tuples() {
128
+ log "Merging collected tuples..."
129
+
130
+ if [[ "$DRY_RUN" == true ]]; then
131
+ log "[DRY RUN] Would merge files from $COLLECT_DIR"
132
+ return 0
133
+ fi
134
+
135
+ local collected_files
136
+ collected_files=$(find "$COLLECT_DIR" -name "tuples-*.jsonl" -type f 2>/dev/null)
137
+
138
+ if [[ -z "$collected_files" ]]; then
139
+ warn "No tuple files to merge"
140
+ return 0
141
+ fi
142
+
143
+ local temp_file
144
+ temp_file=$(mktemp)
145
+
146
+ # Combine all files
147
+ for file in $collected_files; do
148
+ if [[ -f "$file" ]]; then
149
+ cat "$file" >> "$temp_file"
150
+ fi
151
+ done
152
+
153
+ # Deduplicate by id field
154
+ local before_count
155
+ before_count=$(wc -l < "$temp_file" | tr -d ' ')
156
+
157
+ # Use jq if available for proper deduplication, otherwise simple sort -u
158
+ if command -v jq &> /dev/null; then
159
+ # Extract id, sort by id, dedupe
160
+ sort -t'"' -k4 "$temp_file" | uniq > "${temp_file}.sorted"
161
+ mv "${temp_file}.sorted" "$temp_file"
162
+ else
163
+ sort -u "$temp_file" > "${temp_file}.sorted"
164
+ mv "${temp_file}.sorted" "$temp_file"
165
+ fi
166
+
167
+ local after_count
168
+ after_count=$(wc -l < "$temp_file" | tr -d ' ')
169
+ local dupes=$((before_count - after_count))
170
+
171
+ # Append to main buffer (avoiding duplicates with existing entries)
172
+ if [[ -f "$MERGED_FILE" ]]; then
173
+ # Combine with existing and dedupe again
174
+ cat "$MERGED_FILE" "$temp_file" > "${temp_file}.combined"
175
+
176
+ if command -v jq &> /dev/null; then
177
+ # Dedupe by id field
178
+ sort -t'"' -k4 "${temp_file}.combined" | uniq > "$MERGED_FILE"
179
+ else
180
+ sort -u "${temp_file}.combined" > "$MERGED_FILE"
181
+ fi
182
+
183
+ rm -f "${temp_file}.combined"
184
+ else
185
+ mkdir -p "$(dirname "$MERGED_FILE")"
186
+ mv "$temp_file" "$MERGED_FILE"
187
+ fi
188
+
189
+ local final_count
190
+ final_count=$(wc -l < "$MERGED_FILE" | tr -d ' ')
191
+
192
+ success "Merged tuples: $after_count new entries ($dupes duplicates removed)"
193
+ success "Total in buffer: $final_count entries"
194
+
195
+ rm -f "$temp_file"
196
+ }
197
+
198
+ # Also collect logs and other artifacts
199
+ collect_artifacts() {
200
+ local vms=$1
201
+
202
+ log "Collecting additional artifacts..."
203
+
204
+ if [[ "$DRY_RUN" == true ]]; then
205
+ log "[DRY RUN] Would collect logs and artifacts"
206
+ return 0
207
+ fi
208
+
209
+ local artifacts_dir="$COLLECT_DIR/artifacts"
210
+ mkdir -p "$artifacts_dir"
211
+
212
+ while IFS= read -r vm_name; do
213
+ [[ -n "$vm_name" ]] || continue
214
+
215
+ # Collect autoresearch logs
216
+ prlctl exec "$vm_name" /bin/bash -c '
217
+ find /workspace -name "autoresearch-*.log" -type f 2>/dev/null
218
+ ' 2>/dev/null | while read -r log_path; do
219
+ if [[ -n "$log_path" ]]; then
220
+ local basename
221
+ basename=$(basename "$log_path")
222
+ prlctl exec "$vm_name" cat "$log_path" > "$artifacts_dir/${vm_name}-${basename}" 2>/dev/null || true
223
+ fi
224
+ done
225
+
226
+ # Collect fuzz test results
227
+ prlctl exec "$vm_name" /bin/bash -c '
228
+ find /workspace -name "fuzz-*.log" -type f 2>/dev/null
229
+ ' 2>/dev/null | while read -r log_path; do
230
+ if [[ -n "$log_path" ]]; then
231
+ local basename
232
+ basename=$(basename "$log_path")
233
+ prlctl exec "$vm_name" cat "$log_path" > "$artifacts_dir/${vm_name}-${basename}" 2>/dev/null || true
234
+ fi
235
+ done
236
+
237
+ done <<< "$vms"
238
+
239
+ local artifact_count
240
+ artifact_count=$(find "$artifacts_dir" -type f 2>/dev/null | wc -l | tr -d ' ')
241
+
242
+ if [[ "$artifact_count" -gt 0 ]]; then
243
+ success "Collected $artifact_count artifacts"
244
+ fi
245
+ }
246
+
247
+ print_summary() {
248
+ echo ""
249
+ echo "═══════════════════════════════════════════════════════════"
250
+ success "Collection complete!"
251
+ echo "═══════════════════════════════════════════════════════════"
252
+ echo ""
253
+ echo "Collected files: $COLLECT_DIR/"
254
+
255
+ if [[ -d "$COLLECT_DIR" ]] && [[ "$DRY_RUN" != true ]]; then
256
+ echo ""
257
+ echo "Contents:"
258
+ ls -la "$COLLECT_DIR/" 2>/dev/null | head -10
259
+ fi
260
+
261
+ if [[ -f "$MERGED_FILE" ]]; then
262
+ local count
263
+ count=$(wc -l < "$MERGED_FILE" | tr -d ' ')
264
+ echo ""
265
+ echo "Merged buffer: $MERGED_FILE ($count entries)"
266
+ fi
267
+
268
+ echo ""
269
+ echo "Next steps:"
270
+ echo " • View tuples: jfl training stats"
271
+ echo " • Export for training: jfl training export"
272
+ echo " • Run evaluation: jfl eval run"
273
+ echo ""
274
+ }
275
+
276
+ main() {
277
+ echo ""
278
+ echo "═══════════════════════════════════════════════════════════"
279
+ echo " JFL Fleet Tuple Collector"
280
+ echo "═══════════════════════════════════════════════════════════"
281
+ echo ""
282
+
283
+ if ! command -v prlctl &> /dev/null; then
284
+ error "prlctl not found. Install Parallels Desktop Pro."
285
+ exit 1
286
+ fi
287
+
288
+ local vms
289
+ vms=$(get_running_vms)
290
+
291
+ if [[ -z "$vms" ]]; then
292
+ warn "No running jfl-agent VMs found"
293
+ echo ""
294
+ echo "Start a fleet first:"
295
+ echo " ./spawn-fleet.sh 5 jfl-agent-base autoresearch"
296
+ echo ""
297
+ exit 0
298
+ fi
299
+
300
+ local vm_count
301
+ vm_count=$(echo "$vms" | wc -l | tr -d ' ')
302
+
303
+ log "Found $vm_count running agent VMs"
304
+
305
+ # Create collection directory
306
+ if [[ "$DRY_RUN" != true ]]; then
307
+ mkdir -p "$COLLECT_DIR"
308
+ fi
309
+
310
+ # Collect from each VM
311
+ local collected=0
312
+ while IFS= read -r vm_name; do
313
+ [[ -n "$vm_name" ]] || continue
314
+
315
+ if copy_from_vm "$vm_name"; then
316
+ collected=$((collected + 1))
317
+ fi
318
+ done <<< "$vms"
319
+
320
+ echo ""
321
+
322
+ # Merge all collected tuples
323
+ merge_tuples
324
+
325
+ # Collect additional artifacts
326
+ collect_artifacts "$vms"
327
+
328
+ print_summary
329
+ }
330
+
331
+ main