jfl 0.4.4 → 0.5.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 (427) hide show
  1. package/dist/commands/context-hub.d.ts.map +1 -1
  2. package/dist/commands/context-hub.js +818 -39
  3. package/dist/commands/context-hub.js.map +1 -1
  4. package/dist/commands/eval.d.ts +1 -1
  5. package/dist/commands/eval.d.ts.map +1 -1
  6. package/dist/commands/eval.js +192 -1
  7. package/dist/commands/eval.js.map +1 -1
  8. package/dist/commands/findings.d.ts +6 -0
  9. package/dist/commands/findings.d.ts.map +1 -0
  10. package/dist/commands/findings.js +203 -0
  11. package/dist/commands/findings.js.map +1 -0
  12. package/dist/commands/hud.d.ts.map +1 -1
  13. package/dist/commands/hud.js +47 -9
  14. package/dist/commands/hud.js.map +1 -1
  15. package/dist/commands/ide.d.ts +27 -0
  16. package/dist/commands/ide.d.ts.map +1 -0
  17. package/dist/commands/ide.js +546 -0
  18. package/dist/commands/ide.js.map +1 -0
  19. package/dist/commands/onboard.d.ts.map +1 -1
  20. package/dist/commands/onboard.js +212 -2
  21. package/dist/commands/onboard.js.map +1 -1
  22. package/dist/commands/openclaw.d.ts +3 -0
  23. package/dist/commands/openclaw.d.ts.map +1 -1
  24. package/dist/commands/openclaw.js +76 -2
  25. package/dist/commands/openclaw.js.map +1 -1
  26. package/dist/commands/peter.d.ts +1 -0
  27. package/dist/commands/peter.d.ts.map +1 -1
  28. package/dist/commands/peter.js +935 -15
  29. package/dist/commands/peter.js.map +1 -1
  30. package/dist/commands/pi-fleet.d.ts +18 -0
  31. package/dist/commands/pi-fleet.d.ts.map +1 -0
  32. package/dist/commands/pi-fleet.js +382 -0
  33. package/dist/commands/pi-fleet.js.map +1 -0
  34. package/dist/commands/pi.d.ts.map +1 -1
  35. package/dist/commands/pi.js +18 -3
  36. package/dist/commands/pi.js.map +1 -1
  37. package/dist/commands/scope.d.ts.map +1 -1
  38. package/dist/commands/scope.js +90 -1
  39. package/dist/commands/scope.js.map +1 -1
  40. package/dist/commands/services.d.ts.map +1 -1
  41. package/dist/commands/services.js +18 -0
  42. package/dist/commands/services.js.map +1 -1
  43. package/dist/commands/status.d.ts.map +1 -1
  44. package/dist/commands/status.js +22 -4
  45. package/dist/commands/status.js.map +1 -1
  46. package/dist/commands/viz.d.ts.map +1 -1
  47. package/dist/commands/viz.js +417 -0
  48. package/dist/commands/viz.js.map +1 -1
  49. package/dist/dashboard-static/assets/index-B6b867Pv.js +121 -0
  50. package/dist/dashboard-static/assets/index-Y4BrqxV-.css +1 -0
  51. package/dist/dashboard-static/index.html +2 -2
  52. package/dist/index.js +225 -61
  53. package/dist/index.js.map +1 -1
  54. package/dist/lib/agent-config.d.ts +52 -0
  55. package/dist/lib/agent-config.d.ts.map +1 -0
  56. package/dist/lib/agent-config.js +231 -0
  57. package/dist/lib/agent-config.js.map +1 -0
  58. package/dist/lib/agent-generator.d.ts +10 -0
  59. package/dist/lib/agent-generator.d.ts.map +1 -1
  60. package/dist/lib/agent-generator.js +64 -10
  61. package/dist/lib/agent-generator.js.map +1 -1
  62. package/dist/lib/agent-session.d.ts +104 -0
  63. package/dist/lib/agent-session.d.ts.map +1 -0
  64. package/dist/lib/agent-session.js +627 -0
  65. package/dist/lib/agent-session.js.map +1 -0
  66. package/dist/lib/eval-snapshot.d.ts +47 -0
  67. package/dist/lib/eval-snapshot.d.ts.map +1 -0
  68. package/dist/lib/eval-snapshot.js +315 -0
  69. package/dist/lib/eval-snapshot.js.map +1 -0
  70. package/dist/lib/eval-store.d.ts +5 -0
  71. package/dist/lib/eval-store.d.ts.map +1 -1
  72. package/dist/lib/eval-store.js +33 -3
  73. package/dist/lib/eval-store.js.map +1 -1
  74. package/dist/lib/findings-engine.d.ts +51 -0
  75. package/dist/lib/findings-engine.d.ts.map +1 -0
  76. package/dist/lib/findings-engine.js +338 -0
  77. package/dist/lib/findings-engine.js.map +1 -0
  78. package/dist/lib/flow-engine.d.ts +8 -0
  79. package/dist/lib/flow-engine.d.ts.map +1 -1
  80. package/dist/lib/flow-engine.js +84 -2
  81. package/dist/lib/flow-engine.js.map +1 -1
  82. package/dist/lib/hub-client.d.ts +1 -0
  83. package/dist/lib/hub-client.d.ts.map +1 -1
  84. package/dist/lib/hub-client.js +33 -6
  85. package/dist/lib/hub-client.js.map +1 -1
  86. package/dist/lib/ide-panes.d.ts +58 -0
  87. package/dist/lib/ide-panes.d.ts.map +1 -0
  88. package/dist/lib/ide-panes.js +508 -0
  89. package/dist/lib/ide-panes.js.map +1 -0
  90. package/dist/lib/memory-db.js +4 -4
  91. package/dist/lib/memory-db.js.map +1 -1
  92. package/dist/lib/memory-indexer.d.ts.map +1 -1
  93. package/dist/lib/memory-indexer.js +3 -0
  94. package/dist/lib/memory-indexer.js.map +1 -1
  95. package/dist/lib/memory-search.d.ts +148 -4
  96. package/dist/lib/memory-search.d.ts.map +1 -1
  97. package/dist/lib/memory-search.js +496 -58
  98. package/dist/lib/memory-search.js.map +1 -1
  99. package/dist/lib/meta-orchestrator.d.ts +104 -0
  100. package/dist/lib/meta-orchestrator.d.ts.map +1 -0
  101. package/dist/lib/meta-orchestrator.js +373 -0
  102. package/dist/lib/meta-orchestrator.js.map +1 -0
  103. package/dist/lib/peer-agent-generator.d.ts.map +1 -1
  104. package/dist/lib/peer-agent-generator.js +43 -19
  105. package/dist/lib/peer-agent-generator.js.map +1 -1
  106. package/dist/lib/policy-head.d.ts +25 -0
  107. package/dist/lib/policy-head.d.ts.map +1 -0
  108. package/dist/lib/policy-head.js +136 -0
  109. package/dist/lib/policy-head.js.map +1 -0
  110. package/dist/lib/replay-buffer.d.ts +93 -0
  111. package/dist/lib/replay-buffer.d.ts.map +1 -0
  112. package/dist/lib/replay-buffer.js +302 -0
  113. package/dist/lib/replay-buffer.js.map +1 -0
  114. package/dist/lib/sentinel-rl.d.ts +97 -0
  115. package/dist/lib/sentinel-rl.d.ts.map +1 -0
  116. package/dist/lib/sentinel-rl.js +430 -0
  117. package/dist/lib/sentinel-rl.js.map +1 -0
  118. package/dist/lib/session-lock.d.ts +61 -0
  119. package/dist/lib/session-lock.d.ts.map +1 -0
  120. package/dist/lib/session-lock.js +438 -0
  121. package/dist/lib/session-lock.js.map +1 -0
  122. package/dist/lib/stratus-client.d.ts +1 -0
  123. package/dist/lib/stratus-client.d.ts.map +1 -1
  124. package/dist/lib/stratus-client.js +24 -2
  125. package/dist/lib/stratus-client.js.map +1 -1
  126. package/dist/lib/telemetry-agent-v2.d.ts +128 -0
  127. package/dist/lib/telemetry-agent-v2.d.ts.map +1 -0
  128. package/dist/lib/telemetry-agent-v2.js +1042 -0
  129. package/dist/lib/telemetry-agent-v2.js.map +1 -0
  130. package/dist/lib/telemetry-agent.d.ts.map +1 -1
  131. package/dist/lib/telemetry-agent.js +27 -6
  132. package/dist/lib/telemetry-agent.js.map +1 -1
  133. package/dist/lib/telemetry-digest.d.ts.map +1 -1
  134. package/dist/lib/telemetry-digest.js +27 -5
  135. package/dist/lib/telemetry-digest.js.map +1 -1
  136. package/dist/lib/telemetry.d.ts.map +1 -1
  137. package/dist/lib/telemetry.js +29 -4
  138. package/dist/lib/telemetry.js.map +1 -1
  139. package/dist/lib/text-preprocessing.d.ts +83 -0
  140. package/dist/lib/text-preprocessing.d.ts.map +1 -0
  141. package/dist/lib/text-preprocessing.js +261 -0
  142. package/dist/lib/text-preprocessing.js.map +1 -0
  143. package/dist/lib/training-buffer.d.ts +86 -0
  144. package/dist/lib/training-buffer.d.ts.map +1 -0
  145. package/dist/lib/training-buffer.js +139 -0
  146. package/dist/lib/training-buffer.js.map +1 -0
  147. package/dist/lib/tuple-miner.d.ts +30 -0
  148. package/dist/lib/tuple-miner.d.ts.map +1 -0
  149. package/dist/lib/tuple-miner.js +427 -0
  150. package/dist/lib/tuple-miner.js.map +1 -0
  151. package/dist/lib/vm-backend.d.ts +72 -0
  152. package/dist/lib/vm-backend.d.ts.map +1 -0
  153. package/dist/lib/vm-backend.js +175 -0
  154. package/dist/lib/vm-backend.js.map +1 -0
  155. package/dist/lib/workspace/backend.d.ts +53 -0
  156. package/dist/lib/workspace/backend.d.ts.map +1 -0
  157. package/dist/lib/workspace/backend.js +37 -0
  158. package/dist/lib/workspace/backend.js.map +1 -0
  159. package/dist/lib/workspace/cmux-adapter.d.ts +46 -0
  160. package/dist/lib/workspace/cmux-adapter.d.ts.map +1 -0
  161. package/dist/lib/workspace/cmux-adapter.js +261 -0
  162. package/dist/lib/workspace/cmux-adapter.js.map +1 -0
  163. package/dist/lib/workspace/data-pipeline.d.ts +35 -0
  164. package/dist/lib/workspace/data-pipeline.d.ts.map +1 -0
  165. package/dist/lib/workspace/data-pipeline.js +463 -0
  166. package/dist/lib/workspace/data-pipeline.js.map +1 -0
  167. package/dist/lib/workspace/engine.d.ts +64 -0
  168. package/dist/lib/workspace/engine.d.ts.map +1 -0
  169. package/dist/lib/workspace/engine.js +397 -0
  170. package/dist/lib/workspace/engine.js.map +1 -0
  171. package/dist/lib/workspace/notifications.d.ts +14 -0
  172. package/dist/lib/workspace/notifications.d.ts.map +1 -0
  173. package/dist/lib/workspace/notifications.js +41 -0
  174. package/dist/lib/workspace/notifications.js.map +1 -0
  175. package/dist/lib/workspace/surface-registry.d.ts +49 -0
  176. package/dist/lib/workspace/surface-registry.d.ts.map +1 -0
  177. package/dist/lib/workspace/surface-registry.js +217 -0
  178. package/dist/lib/workspace/surface-registry.js.map +1 -0
  179. package/dist/lib/workspace/surface-type.d.ts +153 -0
  180. package/dist/lib/workspace/surface-type.d.ts.map +1 -0
  181. package/dist/lib/workspace/surface-type.js +9 -0
  182. package/dist/lib/workspace/surface-type.js.map +1 -0
  183. package/dist/lib/workspace/surfaces/agent-overview.d.ts +16 -0
  184. package/dist/lib/workspace/surfaces/agent-overview.d.ts.map +1 -0
  185. package/dist/lib/workspace/surfaces/agent-overview.js +116 -0
  186. package/dist/lib/workspace/surfaces/agent-overview.js.map +1 -0
  187. package/dist/lib/workspace/surfaces/agent.d.ts +16 -0
  188. package/dist/lib/workspace/surfaces/agent.d.ts.map +1 -0
  189. package/dist/lib/workspace/surfaces/agent.js +112 -0
  190. package/dist/lib/workspace/surfaces/agent.js.map +1 -0
  191. package/dist/lib/workspace/surfaces/claude.d.ts +15 -0
  192. package/dist/lib/workspace/surfaces/claude.d.ts.map +1 -0
  193. package/dist/lib/workspace/surfaces/claude.js +23 -0
  194. package/dist/lib/workspace/surfaces/claude.js.map +1 -0
  195. package/dist/lib/workspace/surfaces/dashboard.d.ts +21 -0
  196. package/dist/lib/workspace/surfaces/dashboard.d.ts.map +1 -0
  197. package/dist/lib/workspace/surfaces/dashboard.js +32 -0
  198. package/dist/lib/workspace/surfaces/dashboard.js.map +1 -0
  199. package/dist/lib/workspace/surfaces/eval.d.ts +15 -0
  200. package/dist/lib/workspace/surfaces/eval.d.ts.map +1 -0
  201. package/dist/lib/workspace/surfaces/eval.js +42 -0
  202. package/dist/lib/workspace/surfaces/eval.js.map +1 -0
  203. package/dist/lib/workspace/surfaces/event-stream.d.ts +16 -0
  204. package/dist/lib/workspace/surfaces/event-stream.d.ts.map +1 -0
  205. package/dist/lib/workspace/surfaces/event-stream.js +40 -0
  206. package/dist/lib/workspace/surfaces/event-stream.js.map +1 -0
  207. package/dist/lib/workspace/surfaces/flow.d.ts +16 -0
  208. package/dist/lib/workspace/surfaces/flow.d.ts.map +1 -0
  209. package/dist/lib/workspace/surfaces/flow.js +49 -0
  210. package/dist/lib/workspace/surfaces/flow.js.map +1 -0
  211. package/dist/lib/workspace/surfaces/index.d.ts +16 -0
  212. package/dist/lib/workspace/surfaces/index.d.ts.map +1 -0
  213. package/dist/lib/workspace/surfaces/index.js +16 -0
  214. package/dist/lib/workspace/surfaces/index.js.map +1 -0
  215. package/dist/lib/workspace/surfaces/portfolio.d.ts +16 -0
  216. package/dist/lib/workspace/surfaces/portfolio.d.ts.map +1 -0
  217. package/dist/lib/workspace/surfaces/portfolio.js +102 -0
  218. package/dist/lib/workspace/surfaces/portfolio.js.map +1 -0
  219. package/dist/lib/workspace/surfaces/service.d.ts +16 -0
  220. package/dist/lib/workspace/surfaces/service.d.ts.map +1 -0
  221. package/dist/lib/workspace/surfaces/service.js +45 -0
  222. package/dist/lib/workspace/surfaces/service.js.map +1 -0
  223. package/dist/lib/workspace/surfaces/shell.d.ts +15 -0
  224. package/dist/lib/workspace/surfaces/shell.d.ts.map +1 -0
  225. package/dist/lib/workspace/surfaces/shell.js +19 -0
  226. package/dist/lib/workspace/surfaces/shell.js.map +1 -0
  227. package/dist/lib/workspace/surfaces/telemetry.d.ts +16 -0
  228. package/dist/lib/workspace/surfaces/telemetry.d.ts.map +1 -0
  229. package/dist/lib/workspace/surfaces/telemetry.js +48 -0
  230. package/dist/lib/workspace/surfaces/telemetry.js.map +1 -0
  231. package/dist/lib/workspace/surfaces/topology.d.ts +15 -0
  232. package/dist/lib/workspace/surfaces/topology.d.ts.map +1 -0
  233. package/dist/lib/workspace/surfaces/topology.js +19 -0
  234. package/dist/lib/workspace/surfaces/topology.js.map +1 -0
  235. package/dist/lib/workspace/surfaces/training.d.ts +16 -0
  236. package/dist/lib/workspace/surfaces/training.d.ts.map +1 -0
  237. package/dist/lib/workspace/surfaces/training.js +22 -0
  238. package/dist/lib/workspace/surfaces/training.js.map +1 -0
  239. package/dist/lib/workspace/tmux-adapter.d.ts +27 -0
  240. package/dist/lib/workspace/tmux-adapter.d.ts.map +1 -0
  241. package/dist/lib/workspace/tmux-adapter.js +106 -0
  242. package/dist/lib/workspace/tmux-adapter.js.map +1 -0
  243. package/dist/mcp/context-hub-mcp.js +7 -24
  244. package/dist/mcp/context-hub-mcp.js.map +1 -1
  245. package/dist/types/flows.d.ts +2 -0
  246. package/dist/types/flows.d.ts.map +1 -1
  247. package/dist/types/ide.d.ts +49 -0
  248. package/dist/types/ide.d.ts.map +1 -0
  249. package/dist/types/ide.js +5 -0
  250. package/dist/types/ide.js.map +1 -0
  251. package/dist/types/platform-digest.d.ts +228 -0
  252. package/dist/types/platform-digest.d.ts.map +1 -0
  253. package/dist/types/platform-digest.js +5 -0
  254. package/dist/types/platform-digest.js.map +1 -0
  255. package/dist/types/telemetry-digest.d.ts +2 -0
  256. package/dist/types/telemetry-digest.d.ts.map +1 -1
  257. package/dist/utils/ensure-project.d.ts +1 -0
  258. package/dist/utils/ensure-project.d.ts.map +1 -1
  259. package/dist/utils/ensure-project.js +19 -7
  260. package/dist/utils/ensure-project.js.map +1 -1
  261. package/dist/utils/jfl-config.d.ts +1 -0
  262. package/dist/utils/jfl-config.d.ts.map +1 -1
  263. package/dist/utils/jfl-config.js +19 -1
  264. package/dist/utils/jfl-config.js.map +1 -1
  265. package/dist/utils/jfl-paths.d.ts +5 -0
  266. package/dist/utils/jfl-paths.d.ts.map +1 -1
  267. package/dist/utils/jfl-paths.js +25 -3
  268. package/dist/utils/jfl-paths.js.map +1 -1
  269. package/package.json +3 -2
  270. package/packages/pi/AGENTS.md +112 -0
  271. package/packages/pi/extensions/agent-grid.ts +191 -0
  272. package/packages/pi/extensions/agent-names.ts +178 -0
  273. package/packages/pi/extensions/autoresearch.ts +427 -0
  274. package/packages/pi/extensions/bookmarks.ts +85 -0
  275. package/packages/pi/extensions/context.ts +151 -0
  276. package/packages/pi/extensions/crm-tool.ts +61 -0
  277. package/packages/pi/extensions/eval-tool.ts +224 -0
  278. package/packages/pi/extensions/eval.ts +60 -0
  279. package/packages/pi/extensions/footer.ts +239 -0
  280. package/packages/pi/extensions/hud-tool.ts +145 -0
  281. package/packages/pi/extensions/index.ts +392 -0
  282. package/packages/pi/extensions/journal.ts +224 -0
  283. package/packages/pi/extensions/map-bridge.ts +178 -0
  284. package/packages/pi/extensions/memory-tool.ts +68 -0
  285. package/packages/pi/extensions/notifications.ts +73 -0
  286. package/packages/pi/extensions/peter-parker.ts +202 -0
  287. package/packages/pi/extensions/policy-head-tool.ts +276 -0
  288. package/packages/pi/extensions/portfolio-bridge.ts +90 -0
  289. package/packages/pi/extensions/session.ts +90 -0
  290. package/packages/pi/extensions/shortcuts.ts +259 -0
  291. package/packages/pi/extensions/stratus-bridge.ts +115 -0
  292. package/packages/pi/extensions/synopsis-tool.ts +83 -0
  293. package/packages/pi/extensions/tool-renderers.ts +352 -0
  294. package/packages/pi/extensions/training-buffer-tool.ts +368 -0
  295. package/packages/pi/extensions/types.ts +163 -0
  296. package/packages/pi/package-lock.json +346 -0
  297. package/packages/pi/package.json +44 -0
  298. package/packages/pi/skills/agent-browser/SKILL.md +116 -0
  299. package/packages/pi/skills/brand-architect/SKILL.md +240 -0
  300. package/packages/pi/skills/brand-architect/config.yaml +137 -0
  301. package/packages/pi/skills/campaign-hud/config.yaml +112 -0
  302. package/packages/pi/skills/content-creator/SKILL.md +294 -0
  303. package/packages/pi/skills/context/SKILL.md +65 -0
  304. package/packages/pi/skills/debug/MULTI_AGENT.md +360 -0
  305. package/packages/pi/skills/debug/SKILL.md +554 -0
  306. package/packages/pi/skills/end/SKILL.md +1782 -0
  307. package/packages/pi/skills/eval/SKILL.md +75 -0
  308. package/packages/pi/skills/fly-deploy/SKILL.md +676 -0
  309. package/packages/pi/skills/founder-video/SKILL.md +467 -0
  310. package/packages/pi/skills/hud/SKILL.md +160 -0
  311. package/packages/pi/skills/orchestrate/SKILL.md +74 -0
  312. package/packages/pi/skills/pi-agents/SKILL.md +78 -0
  313. package/packages/pi/skills/react-best-practices/AGENTS.md +2249 -0
  314. package/packages/pi/skills/react-best-practices/README.md +123 -0
  315. package/packages/pi/skills/react-best-practices/SKILL.md +125 -0
  316. package/packages/pi/skills/react-best-practices/metadata.json +15 -0
  317. package/packages/pi/skills/react-best-practices/rules/_sections.md +46 -0
  318. package/packages/pi/skills/react-best-practices/rules/_template.md +28 -0
  319. package/packages/pi/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  320. package/packages/pi/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  321. package/packages/pi/skills/react-best-practices/rules/async-api-routes.md +38 -0
  322. package/packages/pi/skills/react-best-practices/rules/async-defer-await.md +80 -0
  323. package/packages/pi/skills/react-best-practices/rules/async-dependencies.md +36 -0
  324. package/packages/pi/skills/react-best-practices/rules/async-parallel.md +28 -0
  325. package/packages/pi/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  326. package/packages/pi/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  327. package/packages/pi/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  328. package/packages/pi/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  329. package/packages/pi/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  330. package/packages/pi/skills/react-best-practices/rules/bundle-preload.md +50 -0
  331. package/packages/pi/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  332. package/packages/pi/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  333. package/packages/pi/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  334. package/packages/pi/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  335. package/packages/pi/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  336. package/packages/pi/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  337. package/packages/pi/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  338. package/packages/pi/skills/react-best-practices/rules/js-early-exit.md +50 -0
  339. package/packages/pi/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  340. package/packages/pi/skills/react-best-practices/rules/js-index-maps.md +37 -0
  341. package/packages/pi/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  342. package/packages/pi/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  343. package/packages/pi/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  344. package/packages/pi/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  345. package/packages/pi/skills/react-best-practices/rules/rendering-activity.md +26 -0
  346. package/packages/pi/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  347. package/packages/pi/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  348. package/packages/pi/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  349. package/packages/pi/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  350. package/packages/pi/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  351. package/packages/pi/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  352. package/packages/pi/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  353. package/packages/pi/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  354. package/packages/pi/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  355. package/packages/pi/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  356. package/packages/pi/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  357. package/packages/pi/skills/react-best-practices/rules/rerender-memo.md +44 -0
  358. package/packages/pi/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  359. package/packages/pi/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  360. package/packages/pi/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  361. package/packages/pi/skills/react-best-practices/rules/server-cache-react.md +26 -0
  362. package/packages/pi/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
  363. package/packages/pi/skills/react-best-practices/rules/server-serialization.md +38 -0
  364. package/packages/pi/skills/remotion-best-practices/SKILL.md +43 -0
  365. package/packages/pi/skills/remotion-best-practices/rules/3d.md +86 -0
  366. package/packages/pi/skills/remotion-best-practices/rules/animations.md +29 -0
  367. package/packages/pi/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  368. package/packages/pi/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  369. package/packages/pi/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
  370. package/packages/pi/skills/remotion-best-practices/rules/assets.md +78 -0
  371. package/packages/pi/skills/remotion-best-practices/rules/audio.md +172 -0
  372. package/packages/pi/skills/remotion-best-practices/rules/calculate-metadata.md +104 -0
  373. package/packages/pi/skills/remotion-best-practices/rules/can-decode.md +75 -0
  374. package/packages/pi/skills/remotion-best-practices/rules/charts.md +58 -0
  375. package/packages/pi/skills/remotion-best-practices/rules/compositions.md +146 -0
  376. package/packages/pi/skills/remotion-best-practices/rules/display-captions.md +126 -0
  377. package/packages/pi/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  378. package/packages/pi/skills/remotion-best-practices/rules/fonts.md +152 -0
  379. package/packages/pi/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  380. package/packages/pi/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  381. package/packages/pi/skills/remotion-best-practices/rules/get-video-duration.md +58 -0
  382. package/packages/pi/skills/remotion-best-practices/rules/gifs.md +138 -0
  383. package/packages/pi/skills/remotion-best-practices/rules/images.md +130 -0
  384. package/packages/pi/skills/remotion-best-practices/rules/import-srt-captions.md +67 -0
  385. package/packages/pi/skills/remotion-best-practices/rules/lottie.md +68 -0
  386. package/packages/pi/skills/remotion-best-practices/rules/measuring-dom-nodes.md +35 -0
  387. package/packages/pi/skills/remotion-best-practices/rules/measuring-text.md +143 -0
  388. package/packages/pi/skills/remotion-best-practices/rules/sequencing.md +106 -0
  389. package/packages/pi/skills/remotion-best-practices/rules/tailwind.md +11 -0
  390. package/packages/pi/skills/remotion-best-practices/rules/text-animations.md +20 -0
  391. package/packages/pi/skills/remotion-best-practices/rules/timing.md +179 -0
  392. package/packages/pi/skills/remotion-best-practices/rules/transcribe-captions.md +19 -0
  393. package/packages/pi/skills/remotion-best-practices/rules/transitions.md +122 -0
  394. package/packages/pi/skills/remotion-best-practices/rules/trimming.md +53 -0
  395. package/packages/pi/skills/remotion-best-practices/rules/videos.md +171 -0
  396. package/packages/pi/skills/search/SKILL.md +220 -0
  397. package/packages/pi/skills/spec/SKILL.md +377 -0
  398. package/packages/pi/skills/startup/SKILL.md +315 -0
  399. package/packages/pi/skills/web-architect/SKILL.md +309 -0
  400. package/packages/pi/skills/x-algorithm/SKILL.md +305 -0
  401. package/packages/pi/teams/dev-team.yaml +63 -0
  402. package/packages/pi/teams/gtm-team.yaml +79 -0
  403. package/packages/pi/themes/jfl.theme.json +76 -0
  404. package/packages/pi/tsconfig.json +21 -0
  405. package/scripts/collect-tuples.sh +124 -0
  406. package/scripts/destroy-fleet.sh +37 -0
  407. package/scripts/jfl-ide.sh +48 -0
  408. package/scripts/session/session-cleanup.sh +4 -11
  409. package/scripts/session/session-init.sh +6 -0
  410. package/scripts/session/session-sync.sh +25 -0
  411. package/scripts/setup-branch-protection.sh +106 -0
  412. package/scripts/spawn-fleet.sh +144 -0
  413. package/scripts/train-policy-head.py +434 -0
  414. package/scripts/vm-swarm/README.md +301 -0
  415. package/scripts/vm-swarm/collect-tuples.sh +331 -0
  416. package/scripts/vm-swarm/create-base-template.sh +339 -0
  417. package/scripts/vm-swarm/kill-fleet.sh +204 -0
  418. package/scripts/vm-swarm/monitor-fleet.sh +346 -0
  419. package/scripts/vm-swarm/spawn-fleet.sh +304 -0
  420. package/template/.github/workflows/jfl-eval.yml +6 -1
  421. package/template/.github/workflows/jfl-review.yml +4 -0
  422. package/template/scripts/session/session-end.sh +69 -6
  423. package/template/scripts/session/session-init.sh +55 -30
  424. package/template/scripts/session/session-lock.sh +464 -0
  425. package/template/templates/service-agent/workflows/jfl-eval.yml +19 -0
  426. package/dist/dashboard-static/assets/index-B6kRK9Rq.js +0 -116
  427. package/dist/dashboard-static/assets/index-BpdKJPLu.css +0 -1
@@ -0,0 +1,346 @@
1
+ #!/bin/bash
2
+ #
3
+ # monitor-fleet.sh — Monitor status of running agent fleet
4
+ #
5
+ # Shows status, current task, and scores for each VM in the fleet.
6
+ # Can run in continuous mode for live monitoring.
7
+ #
8
+ # Usage:
9
+ # ./monitor-fleet.sh # One-time status check
10
+ # ./monitor-fleet.sh --watch # Continuous monitoring (2s refresh)
11
+ # ./monitor-fleet.sh --watch 5 # Custom refresh interval
12
+ # ./monitor-fleet.sh --verbose # Show more details per VM
13
+ #
14
+
15
+ set -euo pipefail
16
+
17
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
19
+ LOG_DIR="$PROJECT_ROOT/.jfl/vm-fleet"
20
+
21
+ # Options
22
+ WATCH_MODE=false
23
+ REFRESH_INTERVAL=2
24
+ VERBOSE=false
25
+
26
+ # Colors
27
+ RED='\033[0;31m'
28
+ GREEN='\033[0;32m'
29
+ YELLOW='\033[1;33m'
30
+ BLUE='\033[0;34m'
31
+ CYAN='\033[0;36m'
32
+ BOLD='\033[1m'
33
+ DIM='\033[2m'
34
+ NC='\033[0m'
35
+
36
+ # Parse arguments
37
+ while [[ $# -gt 0 ]]; do
38
+ case "$1" in
39
+ --watch|-w)
40
+ WATCH_MODE=true
41
+ if [[ "${2:-}" =~ ^[0-9]+$ ]]; then
42
+ REFRESH_INTERVAL="$2"
43
+ shift
44
+ fi
45
+ shift
46
+ ;;
47
+ --verbose|-v)
48
+ VERBOSE=true
49
+ shift
50
+ ;;
51
+ --help|-h)
52
+ echo "Usage: $0 [options]"
53
+ echo ""
54
+ echo "Options:"
55
+ echo " --watch, -w [seconds] Continuous monitoring (default: 2s)"
56
+ echo " --verbose, -v Show more details per VM"
57
+ echo ""
58
+ exit 0
59
+ ;;
60
+ *)
61
+ echo "Unknown option: $1"
62
+ exit 1
63
+ ;;
64
+ esac
65
+ done
66
+
67
+ # Get all agent VMs (running and stopped)
68
+ get_all_vms() {
69
+ prlctl list --all -o name,status 2>/dev/null | grep 'jfl-agent-' | sort -V
70
+ }
71
+
72
+ # Get VM status
73
+ get_vm_status() {
74
+ local vm_name=$1
75
+ prlctl status "$vm_name" 2>/dev/null | grep -oE 'running|stopped|suspended|paused' || echo "unknown"
76
+ }
77
+
78
+ # Get task info from running tasks file
79
+ get_task_info() {
80
+ local vm_name=$1
81
+
82
+ if [[ -f "$LOG_DIR/running-tasks" ]]; then
83
+ grep "^$vm_name:" "$LOG_DIR/running-tasks" 2>/dev/null | cut -d: -f2- | head -1
84
+ else
85
+ echo "-"
86
+ fi
87
+ }
88
+
89
+ # Get latest score/progress from VM
90
+ get_vm_score() {
91
+ local vm_name=$1
92
+ local status=$2
93
+
94
+ if [[ "$status" != "running" ]]; then
95
+ echo "-"
96
+ return
97
+ fi
98
+
99
+ # Try to get score from training buffer or eval results
100
+ local score
101
+ score=$(prlctl exec "$vm_name" /bin/bash -c '
102
+ if [[ -f /workspace/jfl-cli/.jfl/training-buffer.jsonl ]]; then
103
+ tail -1 /workspace/jfl-cli/.jfl/training-buffer.jsonl 2>/dev/null | \
104
+ grep -oE "composite_delta\":[0-9.-]+" | cut -d: -f2 | head -1
105
+ fi
106
+ ' 2>/dev/null || echo "")
107
+
108
+ if [[ -n "$score" ]]; then
109
+ echo "$score"
110
+ else
111
+ echo "-"
112
+ fi
113
+ }
114
+
115
+ # Get tuple count from VM
116
+ get_tuple_count() {
117
+ local vm_name=$1
118
+ local status=$2
119
+
120
+ if [[ "$status" != "running" ]]; then
121
+ echo "-"
122
+ return
123
+ fi
124
+
125
+ local count
126
+ count=$(prlctl exec "$vm_name" /bin/bash -c '
127
+ if [[ -f /workspace/jfl-cli/.jfl/training-buffer.jsonl ]]; then
128
+ wc -l < /workspace/jfl-cli/.jfl/training-buffer.jsonl 2>/dev/null | tr -d " "
129
+ else
130
+ echo "0"
131
+ fi
132
+ ' 2>/dev/null || echo "0")
133
+
134
+ echo "$count"
135
+ }
136
+
137
+ # Get process status in VM
138
+ get_process_status() {
139
+ local vm_name=$1
140
+
141
+ prlctl exec "$vm_name" /bin/bash -c '
142
+ # Check for running jfl/node processes
143
+ procs=$(ps aux | grep -E "jfl|node|npm" | grep -v grep | wc -l | tr -d " ")
144
+ echo "$procs processes"
145
+ ' 2>/dev/null || echo "?"
146
+ }
147
+
148
+ # Format status with color
149
+ format_status() {
150
+ local status=$1
151
+
152
+ case "$status" in
153
+ running)
154
+ echo -e "${GREEN}●${NC} running"
155
+ ;;
156
+ stopped)
157
+ echo -e "${RED}○${NC} stopped"
158
+ ;;
159
+ suspended)
160
+ echo -e "${YELLOW}◐${NC} suspended"
161
+ ;;
162
+ paused)
163
+ echo -e "${YELLOW}◑${NC} paused"
164
+ ;;
165
+ *)
166
+ echo -e "${DIM}?${NC} $status"
167
+ ;;
168
+ esac
169
+ }
170
+
171
+ # Format score with color
172
+ format_score() {
173
+ local score=$1
174
+
175
+ if [[ "$score" == "-" ]]; then
176
+ echo -e "${DIM}${score}${NC}"
177
+ return
178
+ fi
179
+
180
+ # Color based on positive/negative
181
+ if [[ "$score" =~ ^- ]]; then
182
+ echo -e "${RED}${score}${NC}"
183
+ else
184
+ echo -e "${GREEN}+${score}${NC}"
185
+ fi
186
+ }
187
+
188
+ # Print header
189
+ print_header() {
190
+ clear
191
+ echo ""
192
+ echo -e "${BOLD}═══════════════════════════════════════════════════════════${NC}"
193
+ echo -e "${BOLD} JFL Agent Fleet Monitor${NC}"
194
+ echo -e "${BOLD}═══════════════════════════════════════════════════════════${NC}"
195
+ echo ""
196
+
197
+ # Show fleet start time if available
198
+ if [[ -f "$LOG_DIR/fleet-started" ]]; then
199
+ local started
200
+ started=$(cat "$LOG_DIR/fleet-started")
201
+ echo -e " ${DIM}Fleet started: $started${NC}"
202
+ echo ""
203
+ fi
204
+ }
205
+
206
+ # Print fleet summary
207
+ print_summary() {
208
+ local vms=$1
209
+
210
+ local total=0
211
+ local running=0
212
+ local stopped=0
213
+
214
+ while IFS= read -r line; do
215
+ [[ -n "$line" ]] || continue
216
+ total=$((total + 1))
217
+
218
+ if echo "$line" | grep -q 'running'; then
219
+ running=$((running + 1))
220
+ else
221
+ stopped=$((stopped + 1))
222
+ fi
223
+ done <<< "$vms"
224
+
225
+ echo -e " ${CYAN}Total VMs:${NC} $total ${GREEN}Running:${NC} $running ${RED}Stopped:${NC} $stopped"
226
+ echo ""
227
+ }
228
+
229
+ # Print VM table
230
+ print_vm_table() {
231
+ local vms=$1
232
+
233
+ # Table header
234
+ printf " ${BOLD}%-16s %-14s %-20s %-10s %-8s${NC}\n" \
235
+ "VM" "STATUS" "TASK" "SCORE" "TUPLES"
236
+ echo -e " ${DIM}$(printf '─%.0s' {1..70})${NC}"
237
+
238
+ while IFS= read -r line; do
239
+ [[ -n "$line" ]] || continue
240
+
241
+ local vm_name
242
+ vm_name=$(echo "$line" | awk '{print $1}')
243
+ local status
244
+ status=$(echo "$line" | awk '{print $NF}')
245
+
246
+ local task_info
247
+ task_info=$(get_task_info "$vm_name")
248
+ local score
249
+ score=$(get_vm_score "$vm_name" "$status")
250
+ local tuples
251
+ tuples=$(get_tuple_count "$vm_name" "$status")
252
+
253
+ # Truncate task info if too long
254
+ if [[ ${#task_info} -gt 18 ]]; then
255
+ task_info="${task_info:0:15}..."
256
+ fi
257
+
258
+ printf " %-16s " "$vm_name"
259
+ printf "%-14b " "$(format_status "$status")"
260
+ printf "%-20s " "$task_info"
261
+ printf "%-10b " "$(format_score "$score")"
262
+ printf "%-8s\n" "$tuples"
263
+
264
+ # Verbose mode: show more details
265
+ if [[ "$VERBOSE" == true ]] && [[ "$status" == "running" ]]; then
266
+ local procs
267
+ procs=$(get_process_status "$vm_name")
268
+ echo -e " ${DIM}├─ Processes: $procs${NC}"
269
+
270
+ if [[ -f "$LOG_DIR/vm-${vm_name##*-}.log" ]]; then
271
+ local last_log
272
+ last_log=$(tail -1 "$LOG_DIR/vm-${vm_name##*-}.log" 2>/dev/null | cut -c1-60)
273
+ if [[ -n "$last_log" ]]; then
274
+ echo -e " ${DIM}└─ Last log: ${last_log}...${NC}"
275
+ fi
276
+ fi
277
+ fi
278
+
279
+ done <<< "$vms"
280
+ }
281
+
282
+ # Print actions
283
+ print_actions() {
284
+ echo ""
285
+ echo -e " ${DIM}Actions:${NC}"
286
+ echo -e " ${CYAN}c${NC} - Collect tuples ${CYAN}k${NC} - Kill fleet"
287
+ echo -e " ${CYAN}l${NC} - View logs ${CYAN}q${NC} - Quit"
288
+ echo ""
289
+ }
290
+
291
+ # Print footer in watch mode
292
+ print_footer() {
293
+ echo ""
294
+ echo -e " ${DIM}Refreshing every ${REFRESH_INTERVAL}s. Press Ctrl+C to exit.${NC}"
295
+ }
296
+
297
+ # Main display function
298
+ display() {
299
+ local vms
300
+ vms=$(get_all_vms)
301
+
302
+ print_header
303
+
304
+ if [[ -z "$vms" ]]; then
305
+ echo -e " ${YELLOW}No jfl-agent VMs found${NC}"
306
+ echo ""
307
+ echo " Start a fleet:"
308
+ echo " ./spawn-fleet.sh 5 jfl-agent-base autoresearch"
309
+ echo ""
310
+ return
311
+ fi
312
+
313
+ print_summary "$vms"
314
+ print_vm_table "$vms"
315
+
316
+ if [[ "$WATCH_MODE" != true ]]; then
317
+ print_actions
318
+ else
319
+ print_footer
320
+ fi
321
+ }
322
+
323
+ # Watch mode loop
324
+ watch_loop() {
325
+ trap 'echo ""; echo "Exiting..."; exit 0' INT
326
+
327
+ while true; do
328
+ display
329
+ sleep "$REFRESH_INTERVAL"
330
+ done
331
+ }
332
+
333
+ main() {
334
+ if ! command -v prlctl &> /dev/null; then
335
+ echo "prlctl not found. Install Parallels Desktop Pro."
336
+ exit 1
337
+ fi
338
+
339
+ if [[ "$WATCH_MODE" == true ]]; then
340
+ watch_loop
341
+ else
342
+ display
343
+ fi
344
+ }
345
+
346
+ main
@@ -0,0 +1,304 @@
1
+ #!/bin/bash
2
+ #
3
+ # spawn-fleet.sh — Spawn a fleet of agent VMs from base template
4
+ #
5
+ # Clones the base template N times and runs specified task type in each.
6
+ #
7
+ # Usage:
8
+ # ./spawn-fleet.sh [count] [template] [task-type]
9
+ # ./spawn-fleet.sh 5 jfl-agent-base autoresearch
10
+ # ./spawn-fleet.sh 3 jfl-agent-base fuzz
11
+ # ./spawn-fleet.sh 2 jfl-agent-base eval
12
+ #
13
+ # Task types:
14
+ # autoresearch - Each VM gets a different repo/service to research
15
+ # fuzz - Each VM runs a different fuzz test suite
16
+ # eval - Each VM runs evaluation with different parameters
17
+ #
18
+
19
+ set -euo pipefail
20
+
21
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
22
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
23
+ LOG_DIR="$PROJECT_ROOT/.jfl/vm-fleet"
24
+
25
+ # Defaults
26
+ DEFAULT_COUNT=5
27
+ DEFAULT_TEMPLATE="jfl-agent-base"
28
+ DEFAULT_TASK="autoresearch"
29
+
30
+ # Colors
31
+ RED='\033[0;31m'
32
+ GREEN='\033[0;32m'
33
+ YELLOW='\033[1;33m'
34
+ BLUE='\033[0;34m'
35
+ CYAN='\033[0;36m'
36
+ NC='\033[0m'
37
+
38
+ log() { echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1"; }
39
+ success() { echo -e "${GREEN}[$(date '+%H:%M:%S')] ✓${NC} $1"; }
40
+ warn() { echo -e "${YELLOW}[$(date '+%H:%M:%S')] ⚠${NC} $1"; }
41
+ error() { echo -e "${RED}[$(date '+%H:%M:%S')] ✗${NC} $1"; exit 1; }
42
+
43
+ # Parse arguments
44
+ COUNT="${1:-$DEFAULT_COUNT}"
45
+ TEMPLATE="${2:-$DEFAULT_TEMPLATE}"
46
+ TASK_TYPE="${3:-$DEFAULT_TASK}"
47
+
48
+ # Autoresearch targets (different repos/services for each VM)
49
+ AUTORESEARCH_TARGETS=(
50
+ "jfl-cli:src/commands"
51
+ "jfl-cli:src/lib"
52
+ "jfl-platform:packages/memory"
53
+ "jfl-platform:packages/eval"
54
+ "jfl-template:knowledge"
55
+ )
56
+
57
+ # Fuzz test suites (different tests for each VM)
58
+ FUZZ_SUITES=(
59
+ "fuzz-scope"
60
+ "fuzz-events"
61
+ "fuzz-training"
62
+ "fuzz-hub-api"
63
+ )
64
+
65
+ # Eval configurations
66
+ EVAL_CONFIGS=(
67
+ "default"
68
+ "quality-first"
69
+ "cost-optimized"
70
+ )
71
+
72
+ check_prerequisites() {
73
+ if ! command -v prlctl &> /dev/null; then
74
+ error "prlctl not found. Install Parallels Desktop Pro."
75
+ fi
76
+
77
+ if ! prlctl list --all | grep -q "$TEMPLATE"; then
78
+ error "Template '$TEMPLATE' not found. Run create-base-template.sh first."
79
+ fi
80
+ }
81
+
82
+ create_log_dir() {
83
+ mkdir -p "$LOG_DIR"
84
+ # Create timestamp file for this fleet run
85
+ echo "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" > "$LOG_DIR/fleet-started"
86
+ }
87
+
88
+ clone_vm() {
89
+ local index=$1
90
+ local vm_name="jfl-agent-${index}"
91
+
92
+ log "Creating VM: $vm_name"
93
+
94
+ # Check if VM already exists
95
+ if prlctl list --all | grep -q "$vm_name"; then
96
+ warn "VM $vm_name exists, stopping and deleting..."
97
+ prlctl stop "$vm_name" --kill 2>/dev/null || true
98
+ sleep 2
99
+ prlctl delete "$vm_name" 2>/dev/null || true
100
+ fi
101
+
102
+ # Clone from template (linked clone for speed)
103
+ prlctl clone "$TEMPLATE" --name "$vm_name" --linked
104
+
105
+ success "Created $vm_name"
106
+ }
107
+
108
+ start_vm() {
109
+ local vm_name=$1
110
+
111
+ log "Starting VM: $vm_name"
112
+ prlctl start "$vm_name"
113
+
114
+ # Wait for VM to be ready
115
+ local max_wait=60
116
+ local waited=0
117
+ while [[ $waited -lt $max_wait ]]; do
118
+ if prlctl exec "$vm_name" echo "ready" &> /dev/null; then
119
+ success "VM $vm_name is ready"
120
+ return 0
121
+ fi
122
+ sleep 2
123
+ waited=$((waited + 2))
124
+ done
125
+
126
+ warn "VM $vm_name may not be fully ready"
127
+ }
128
+
129
+ run_task_in_vm() {
130
+ local vm_name=$1
131
+ local index=$2
132
+ local log_file="$LOG_DIR/vm-${index}.log"
133
+
134
+ log "Starting task '$TASK_TYPE' in $vm_name"
135
+
136
+ case "$TASK_TYPE" in
137
+ autoresearch)
138
+ run_autoresearch "$vm_name" "$index" "$log_file"
139
+ ;;
140
+ fuzz)
141
+ run_fuzz "$vm_name" "$index" "$log_file"
142
+ ;;
143
+ eval)
144
+ run_eval "$vm_name" "$index" "$log_file"
145
+ ;;
146
+ *)
147
+ error "Unknown task type: $TASK_TYPE"
148
+ ;;
149
+ esac
150
+ }
151
+
152
+ run_autoresearch() {
153
+ local vm_name=$1
154
+ local index=$2
155
+ local log_file=$3
156
+
157
+ # Get target for this VM (cycle through targets)
158
+ local target_index=$((index % ${#AUTORESEARCH_TARGETS[@]}))
159
+ local target="${AUTORESEARCH_TARGETS[$target_index]}"
160
+ local repo="${target%%:*}"
161
+ local focus="${target##*:}"
162
+
163
+ log "VM $index: autoresearch on $repo ($focus)"
164
+
165
+ # Run autoresearch in background inside VM
166
+ prlctl exec "$vm_name" /bin/bash -c "
167
+ export PATH=\"\$PATH:/opt/homebrew/bin\"
168
+ cd /workspace/$repo
169
+
170
+ # Run autoresearch with the focus area
171
+ nohup jfl autoresearch --focus '$focus' \
172
+ > /workspace/autoresearch-$index.log 2>&1 &
173
+ echo \$! > /workspace/autoresearch-$index.pid
174
+
175
+ echo 'Autoresearch started for $repo ($focus)'
176
+ " > "$log_file" 2>&1 &
177
+
178
+ echo "$vm_name:$target:$!" >> "$LOG_DIR/running-tasks"
179
+ }
180
+
181
+ run_fuzz() {
182
+ local vm_name=$1
183
+ local index=$2
184
+ local log_file=$3
185
+
186
+ # Get fuzz suite for this VM
187
+ local suite_index=$((index % ${#FUZZ_SUITES[@]}))
188
+ local suite="${FUZZ_SUITES[$suite_index]}"
189
+
190
+ log "VM $index: running fuzz suite '$suite'"
191
+
192
+ prlctl exec "$vm_name" /bin/bash -c "
193
+ export PATH=\"\$PATH:/opt/homebrew/bin\"
194
+ cd /workspace/jfl-cli
195
+
196
+ # Run specific fuzz test suite
197
+ nohup npx jest --testPathPattern='$suite' --silent \
198
+ > /workspace/fuzz-$index.log 2>&1 &
199
+ echo \$! > /workspace/fuzz-$index.pid
200
+
201
+ echo 'Fuzz suite $suite started'
202
+ " > "$log_file" 2>&1 &
203
+
204
+ echo "$vm_name:fuzz:$suite:$!" >> "$LOG_DIR/running-tasks"
205
+ }
206
+
207
+ run_eval() {
208
+ local vm_name=$1
209
+ local index=$2
210
+ local log_file=$3
211
+
212
+ # Get eval config for this VM
213
+ local config_index=$((index % ${#EVAL_CONFIGS[@]}))
214
+ local config="${EVAL_CONFIGS[$config_index]}"
215
+
216
+ log "VM $index: running eval with config '$config'"
217
+
218
+ prlctl exec "$vm_name" /bin/bash -c "
219
+ export PATH=\"\$PATH:/opt/homebrew/bin\"
220
+ cd /workspace/jfl-cli
221
+
222
+ # Run evaluation
223
+ nohup jfl eval run --profile '$config' \
224
+ > /workspace/eval-$index.log 2>&1 &
225
+ echo \$! > /workspace/eval-$index.pid
226
+
227
+ echo 'Eval started with profile $config'
228
+ " > "$log_file" 2>&1 &
229
+
230
+ echo "$vm_name:eval:$config:$!" >> "$LOG_DIR/running-tasks"
231
+ }
232
+
233
+ print_summary() {
234
+ echo ""
235
+ echo "═══════════════════════════════════════════════════════════"
236
+ success "Fleet spawned successfully!"
237
+ echo "═══════════════════════════════════════════════════════════"
238
+ echo ""
239
+ echo "VMs started: $COUNT"
240
+ echo "Template: $TEMPLATE"
241
+ echo "Task type: $TASK_TYPE"
242
+ echo "Log dir: $LOG_DIR"
243
+ echo ""
244
+ echo "Running VMs:"
245
+
246
+ for i in $(seq 1 "$COUNT"); do
247
+ local vm_name="jfl-agent-${i}"
248
+ local status
249
+ status=$(prlctl status "$vm_name" 2>/dev/null | grep -o 'running\|stopped' || echo "unknown")
250
+ echo " • $vm_name: $status"
251
+ done
252
+
253
+ echo ""
254
+ echo "Commands:"
255
+ echo " Monitor: ./monitor-fleet.sh"
256
+ echo " Collect: ./collect-tuples.sh"
257
+ echo " Kill: ./kill-fleet.sh"
258
+ echo ""
259
+ echo "View logs:"
260
+ echo " tail -f $LOG_DIR/vm-1.log"
261
+ echo ""
262
+ }
263
+
264
+ main() {
265
+ echo ""
266
+ echo "═══════════════════════════════════════════════════════════"
267
+ echo " JFL Agent Fleet Spawner"
268
+ echo "═══════════════════════════════════════════════════════════"
269
+ echo ""
270
+ echo "Count: $COUNT"
271
+ echo "Template: $TEMPLATE"
272
+ echo "Task: $TASK_TYPE"
273
+ echo ""
274
+
275
+ check_prerequisites
276
+ create_log_dir
277
+
278
+ # Clear previous running tasks
279
+ rm -f "$LOG_DIR/running-tasks"
280
+ touch "$LOG_DIR/running-tasks"
281
+
282
+ # Clone and start each VM
283
+ for i in $(seq 1 "$COUNT"); do
284
+ clone_vm "$i"
285
+ done
286
+
287
+ echo ""
288
+
289
+ # Start VMs (can be parallelized)
290
+ for i in $(seq 1 "$COUNT"); do
291
+ start_vm "jfl-agent-${i}"
292
+ done
293
+
294
+ echo ""
295
+
296
+ # Run tasks in each VM
297
+ for i in $(seq 1 "$COUNT"); do
298
+ run_task_in_vm "jfl-agent-${i}" "$i"
299
+ done
300
+
301
+ print_summary
302
+ }
303
+
304
+ main
@@ -352,7 +352,12 @@ jobs:
352
352
  {"ts":"$(date -u +%Y-%m-%dT%H:%M:%S.000Z)","type":"eval:scored","source":"ci","data":{"agent":"$AGENT","composite":${{ steps.pr_eval.outputs.score }},"baseline":${{ steps.baseline.outputs.score }},"delta":${{ steps.delta.outputs.delta }},"improved":"${{ steps.delta.outputs.improved }}","pr_number":${{ github.event.pull_request.number }},"branch":"${{ github.head_ref }}","run_url":"${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}","quality_score":${{ steps.ai_eval.outputs.quality_score }},"dim_correctness":${{ steps.ai_eval.outputs.dim_correctness }},"dim_coverage":${{ steps.ai_eval.outputs.dim_coverage }},"dim_architecture":${{ steps.ai_eval.outputs.dim_architecture }},"dim_value":${{ steps.ai_eval.outputs.dim_value }}}}
353
353
  EOF
354
354
 
355
- git add .jfl/eval.jsonl .jfl/service-events.jsonl
355
+ # Write training tuple for policy head
356
+ cat >> .jfl/training-buffer.jsonl << EOF
357
+ {"id":"tb_ci_${{ github.run_id }}","v":1,"ts":"$(date -u +%Y-%m-%dT%H:%M:%SZ)","agent":"$AGENT","state":{"composite_score":${{ steps.baseline.outputs.score }},"dimension_scores":{},"tests_passing":${{ steps.baseline.outputs.passing }},"tests_total":${{ steps.baseline.outputs.total }},"trajectory_length":0,"recent_deltas":[],"agent":"$AGENT"},"action":{"type":"experiment","description":"${{ github.event.pull_request.title }}","files_affected":[],"scope":"medium","branch":"${{ github.head_ref }}"},"reward":{"composite_delta":${{ steps.delta.outputs.delta }},"dimension_deltas":{},"tests_added":${{ steps.delta.outputs.tests_added }},"quality_score":${{ steps.ai_eval.outputs.quality_score }},"improved":${{ steps.delta.outputs.improved }},"prediction_error":0},"metadata":{"pr_number":${{ github.event.pull_request.number }},"branch":"${{ github.head_ref }}","eval_run_id":"${{ github.run_id }}","prediction_id":"$PRED_ID","source":"ci"}}
358
+ EOF
359
+
360
+ git add .jfl/eval.jsonl .jfl/service-events.jsonl .jfl/training-buffer.jsonl
356
361
  git add .jfl/predictions/ 2>/dev/null || true
357
362
  git commit -m "eval: scored PR #${{ github.event.pull_request.number }} (composite=${{ steps.pr_eval.outputs.score }}, delta=${{ steps.delta.outputs.delta }})"
358
363
  git push origin ${{ github.head_ref }}
@@ -327,6 +327,10 @@ jobs:
327
327
  echo "Red findings detected — requesting changes"
328
328
  gh pr review ${{ github.event.pull_request.number }} --request-changes \
329
329
  --body "JFL AI Review: ${{ steps.findings.outputs.red_count }} blocker(s) found. Address red findings before merge."
330
+ else
331
+ echo "No blockers — approving (dismisses any previous CHANGES_REQUESTED)"
332
+ gh pr review ${{ github.event.pull_request.number }} --approve \
333
+ --body "JFL AI Review: Clean. No blockers found."
330
334
  fi
331
335
 
332
336
  - name: Post review:findings event to hub