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,305 @@
1
+ ---
2
+ name: x-algorithm
3
+ description: X/Twitter For You feed ranking algorithm - optimize tweets for maximum reach
4
+ metadata:
5
+ tags: twitter, x, algorithm, social, ranking, engagement
6
+ source: https://github.com/xai-org/x-algorithm
7
+ ---
8
+
9
+ # X Algorithm Skill
10
+
11
+ Optimize tweets and threads for the X (Twitter) For You feed algorithm.
12
+
13
+ ## How the Algorithm Works
14
+
15
+ The X For You feed uses a Grok-based Phoenix transformer that predicts engagement probabilities for each tweet. No hand-engineered features—it learns entirely from engagement patterns.
16
+
17
+ ### The Formula
18
+
19
+ ```
20
+ Final Score = Σ (weight × P(action))
21
+ ```
22
+
23
+ Each tweet gets scored by predicting the probability you'll take various actions, then weighting them.
24
+
25
+ ### What It Predicts
26
+
27
+ **Positive signals (boost score):**
28
+ | Signal | What It Measures |
29
+ |--------|------------------|
30
+ | `P(favorite)` | Likelihood of like |
31
+ | `P(reply)` | Likelihood of reply |
32
+ | `P(repost)` | Likelihood of repost |
33
+ | `P(quote)` | Likelihood of quote tweet |
34
+ | `P(click)` | Likelihood of clicking through |
35
+ | `P(profile_click)` | Likelihood of visiting author's profile |
36
+ | `P(video_view)` | Likelihood of watching video |
37
+ | `P(photo_expand)` | Likelihood of expanding image |
38
+ | `P(share)` | Likelihood of sharing externally |
39
+ | `P(dwell)` | Time spent reading/viewing |
40
+ | `P(follow_author)` | Likelihood of following |
41
+
42
+ **Negative signals (reduce score):**
43
+ | Signal | What It Measures |
44
+ |--------|------------------|
45
+ | `P(not_interested)` | Likelihood of "Not interested" |
46
+ | `P(block_author)` | Likelihood of blocking |
47
+ | `P(mute_author)` | Likelihood of muting |
48
+ | `P(report)` | Likelihood of reporting |
49
+
50
+ ### Additional Ranking Factors
51
+
52
+ - **Author Diversity**: Repeated posts from same author get attenuated
53
+ - **Out-of-Network Boost**: Discovered content (not from follows) gets special scoring
54
+ - **Candidate Isolation**: Each tweet scored independently
55
+
56
+ ## Commands
57
+
58
+ ```
59
+ /x-algorithm analyze [tweet] # Score a tweet draft
60
+ /x-algorithm optimize [tweet] # Suggest improvements
61
+ /x-algorithm signals # Show all ranking signals
62
+ /x-algorithm hooks # Generate high-engagement hooks
63
+ ```
64
+
65
+ ## Usage
66
+
67
+ ### Analyzing a Tweet
68
+
69
+ ```
70
+ /x-algorithm analyze "Just shipped a new feature"
71
+
72
+ ANALYSIS:
73
+ ┌─────────────────────────────────────────────────┐
74
+ │ Tweet: "Just shipped a new feature" │
75
+ ├─────────────────────────────────────────────────┤
76
+ │ Predicted signals: │
77
+ │ ├─ P(favorite) LOW - no emotional hook │
78
+ │ ├─ P(reply) LOW - no question/gap │
79
+ │ ├─ P(repost) LOW - no value to share │
80
+ │ ├─ P(quote) LOW - nothing to add to │
81
+ │ ├─ P(dwell) LOW - too short │
82
+ │ └─ P(not_interested) MED - generic update │
83
+ │ │
84
+ │ Overall: WEAK │
85
+ │ │
86
+ │ Issues: │
87
+ │ • No specificity (what feature? why care?) │
88
+ │ • No emotional trigger │
89
+ │ • No reason to engage │
90
+ └─────────────────────────────────────────────────┘
91
+
92
+ Optimize? (yes/no)
93
+ ```
94
+
95
+ ### Optimizing a Tweet
96
+
97
+ ```
98
+ /x-algorithm optimize "Just shipped a new feature"
99
+
100
+ OPTIMIZED VERSIONS:
101
+
102
+ v1 (curiosity gap):
103
+ "The feature everyone asked for just shipped.
104
+
105
+ Took 6 months. Here's why it was worth the wait:"
106
+
107
+ v2 (social proof):
108
+ "1,247 people requested this feature.
109
+
110
+ Today we shipped it.
111
+
112
+ [screenshot]"
113
+
114
+ v3 (contrarian):
115
+ "Everyone said this feature was impossible.
116
+
117
+ We built it anyway.
118
+
119
+ Here's how:"
120
+
121
+ ---
122
+
123
+ Which version, or iterate?
124
+ ```
125
+
126
+ ## Optimization Principles
127
+
128
+ ### Maximize Positive Signals
129
+
130
+ **For P(favorite) - likes:**
131
+ - Strong opinion or take
132
+ - Relatable observation
133
+ - Emotional resonance
134
+ - Beautiful visually
135
+
136
+ **For P(reply) - replies:**
137
+ - Ask a question
138
+ - Create a knowledge gap
139
+ - Be slightly wrong (people love to correct)
140
+ - Request input
141
+
142
+ **For P(repost) - reposts:**
143
+ - Provide shareable value (tips, insights)
144
+ - Create "I wish I said that" moments
145
+ - Make people look smart for sharing
146
+
147
+ **For P(quote) - quotes:**
148
+ - Leave room for commentary
149
+ - Take a stance others want to respond to
150
+ - Share something people want to add context to
151
+
152
+ **For P(dwell) - time on tweet:**
153
+ - Longer, readable content
154
+ - Images that require study
155
+ - Threads with substance
156
+ - Videos
157
+
158
+ **For P(follow) - new followers:**
159
+ - Demonstrate unique expertise
160
+ - Show personality
161
+ - Consistent topic/niche
162
+
163
+ ### Minimize Negative Signals
164
+
165
+ **Avoid P(not_interested):**
166
+ - Don't be generic
167
+ - Don't repeat what everyone says
168
+ - Don't post off-topic
169
+
170
+ **Avoid P(block/mute):**
171
+ - Don't be annoying
172
+ - Don't spam
173
+ - Don't be hostile
174
+ - Don't engage in bad faith
175
+
176
+ **Avoid P(report):**
177
+ - Don't violate ToS
178
+ - Don't harass
179
+ - Don't spread misinfo
180
+
181
+ ## High-Engagement Patterns
182
+
183
+ ### The Hook Patterns
184
+
185
+ ```
186
+ 1. CURIOSITY GAP
187
+ "I spent 3 years learning [X]. Here's what I wish I knew:"
188
+
189
+ 2. CONTRARIAN
190
+ "Unpopular opinion: [hot take]"
191
+
192
+ 3. STORY OPENER
193
+ "In 2019 I was [relatable struggle]. Now I [impressive outcome]."
194
+
195
+ 4. SPECIFIC NUMBER
196
+ "I've [done X] 847 times. Here's what works:"
197
+
198
+ 5. BEFORE/AFTER
199
+ "I used to [common mistake]. Then I learned [insight]."
200
+
201
+ 6. QUESTION
202
+ "What's one thing you wish you learned earlier about [X]?"
203
+ ```
204
+
205
+ ### Thread Structures That Work
206
+
207
+ ```
208
+ LISTICLE:
209
+ "10 [things] about [topic]:"
210
+ → High dwell, easy to repost individual tweets
211
+
212
+ BUILD-UP:
213
+ 1. Hook
214
+ 2. Context
215
+ 3. Insight
216
+ 4. Proof
217
+ 5. Implication
218
+ 6. CTA
219
+ → Maximizes dwell across thread
220
+
221
+ STORY:
222
+ 1. "It was 2AM when..."
223
+ 2. Rising action
224
+ 3. Crisis point
225
+ 4. Resolution
226
+ 5. Lesson
227
+ 6. CTA
228
+ → High engagement, emotional resonance
229
+ ```
230
+
231
+ ### Visual Content
232
+
233
+ ```
234
+ IMAGES:
235
+ - Screenshots > stock photos
236
+ - Before/after comparisons
237
+ - Data visualizations
238
+ - Behind-the-scenes
239
+
240
+ VIDEOS:
241
+ - Hook in first 1-3 seconds
242
+ - Subtitles (most watch muted)
243
+ - Native upload > links
244
+ - <2 min optimal
245
+ ```
246
+
247
+ ## Integration with /content
248
+
249
+ When using `/content thread` or `/content post`, the X algorithm principles are automatically applied:
250
+
251
+ ```
252
+ /content thread "our new pricing model"
253
+
254
+ Applying X algorithm optimization...
255
+ ├─ Hook pattern: SPECIFIC NUMBER
256
+ ├─ Thread structure: BUILD-UP
257
+ ├─ Engagement triggers: curiosity, social proof
258
+ └─ Visual: screenshot recommendation
259
+
260
+ [generates thread with algorithm principles]
261
+ ```
262
+
263
+ ## Author Diversity Consideration
264
+
265
+ The algorithm attenuates repeated authors. Posting strategy matters:
266
+
267
+ ```
268
+ SUBOPTIMAL:
269
+ Post → Post → Post → Post (same hour)
270
+ Algorithm reduces later posts' reach
271
+
272
+ BETTER:
273
+ Post → [gap] → Post → [gap] → Post
274
+ Each post gets full scoring potential
275
+ ```
276
+
277
+ ## Out-of-Network Discovery
278
+
279
+ To reach beyond your followers:
280
+
281
+ ```
282
+ - Quote tweet popular accounts (your take on their content)
283
+ - Reply meaningfully to trending topics
284
+ - Create highly repostable content (others share to their network)
285
+ - Post content that generates quotes (your reach + quoter's reach)
286
+ ```
287
+
288
+ ## Metrics to Watch
289
+
290
+ After posting, monitor:
291
+
292
+ | Metric | What It Tells You |
293
+ |--------|-------------------|
294
+ | Impressions from For You | Algorithm reach |
295
+ | Impressions from profile | Direct followers |
296
+ | Engagement rate | Content quality signal |
297
+ | Quote:Repost ratio | How "discussable" content is |
298
+ | Reply quality | Community engagement depth |
299
+
300
+ ## Source
301
+
302
+ Based on the open-sourced X algorithm:
303
+ https://github.com/xai-org/x-algorithm
304
+
305
+ The algorithm is continuously updated. Check the repo for latest changes.
@@ -0,0 +1,63 @@
1
+ name: dev-team
2
+ description: JFL dev team — focused on code quality, tests, and shipping
3
+
4
+ agents:
5
+ - name: scout
6
+ role: Research and discovery
7
+ description: Researches libraries, APIs, and technical approaches
8
+ model: claude-sonnet-4-6
9
+ skills:
10
+ - search
11
+ - agent-browser
12
+ color: cyan
13
+ health_interval: 5000
14
+
15
+ - name: planner
16
+ role: Architecture and design
17
+ description: Designs systems, writes specs, plans implementation
18
+ model: claude-opus-4-6
19
+ skills:
20
+ - spec
21
+ color: blue
22
+ health_interval: 5000
23
+
24
+ - name: builder
25
+ role: Implementation
26
+ description: Primary coding agent — writes features and fixes bugs
27
+ model: claude-sonnet-4-6
28
+ skills:
29
+ - react-best-practices
30
+ - fly-deploy
31
+ color: green
32
+ default: true
33
+ health_interval: 5000
34
+
35
+ - name: reviewer
36
+ role: Code review
37
+ description: Reviews PRs, finds bugs, suggests improvements
38
+ model: claude-sonnet-4-6
39
+ skills:
40
+ - spec
41
+ color: orange
42
+ health_interval: 5000
43
+
44
+ - name: tester
45
+ role: Testing and validation
46
+ description: Writes tests, runs evals, validates behavior
47
+ model: claude-sonnet-4-6
48
+ skills:
49
+ - eval
50
+ color: yellow
51
+ health_interval: 5000
52
+
53
+ orchestration:
54
+ mode: rpc
55
+ extension: "@jfl/pi/extensions/index.js"
56
+ map_events:
57
+ - eval:scored
58
+ - review:findings
59
+ - task:requested
60
+ - agent:health
61
+ peter_parker:
62
+ enabled: true
63
+ max_iterations: 3
@@ -0,0 +1,79 @@
1
+ name: gtm-team
2
+ description: JFL GTM team — research, planning, building, content, and eval
3
+
4
+ agents:
5
+ - name: scout
6
+ role: Research and discovery
7
+ description: Finds trends, researches competitors, discovers opportunities
8
+ model: claude-sonnet-4-6
9
+ skills:
10
+ - search
11
+ - agent-browser
12
+ - x-algorithm
13
+ color: cyan
14
+ health_interval: 5000
15
+
16
+ - name: planner
17
+ role: Spec and strategy
18
+ description: Turns insights into specs and roadmaps
19
+ model: claude-opus-4-6
20
+ skills:
21
+ - spec
22
+ - startup
23
+ - hud
24
+ color: blue
25
+ health_interval: 5000
26
+
27
+ - name: builder
28
+ role: Implementation
29
+ description: Writes code, runs tests, ships features
30
+ model: claude-sonnet-4-6
31
+ skills:
32
+ - spec
33
+ - react-best-practices
34
+ - fly-deploy
35
+ color: green
36
+ default: true
37
+ health_interval: 5000
38
+
39
+ - name: gtm
40
+ role: Go-to-market
41
+ description: Coordinates launch, outreach, and pipeline
42
+ model: claude-sonnet-4-6
43
+ skills:
44
+ - hud
45
+ - content-creator
46
+ - x-algorithm
47
+ color: orange
48
+ health_interval: 5000
49
+
50
+ - name: content
51
+ role: Content generation
52
+ description: Writes threads, articles, scripts, and one-pagers
53
+ model: claude-sonnet-4-6
54
+ skills:
55
+ - content-creator
56
+ - founder-video
57
+ color: purple
58
+ health_interval: 5000
59
+
60
+ - name: eval
61
+ role: Quality scoring
62
+ description: Runs evals, scores outputs, provides structured feedback
63
+ model: claude-haiku-4-5-20251001
64
+ skills:
65
+ - eval
66
+ color: yellow
67
+ health_interval: 5000
68
+
69
+ orchestration:
70
+ mode: rpc
71
+ extension: "@jfl/pi/extensions/index.js"
72
+ map_events:
73
+ - eval:scored
74
+ - review:findings
75
+ - task:requested
76
+ - agent:health
77
+ peter_parker:
78
+ enabled: true
79
+ max_iterations: 5
@@ -0,0 +1,76 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
3
+ "name": "jfl",
4
+ "vars": {
5
+ "purple": "#7c3aed",
6
+ "purpleDeep": "#6d28d9",
7
+ "cyan": "#06b6d4",
8
+ "blue": "#3b82f6",
9
+ "green": "#10b981",
10
+ "red": "#ef4444",
11
+ "amber": "#f59e0b",
12
+ "gray": "#666666",
13
+ "dimGray": "#444444",
14
+ "surface": "#161616",
15
+ "surfaceDark": "#111111",
16
+ "surfaceDeep": "#0d0d0d"
17
+ },
18
+ "colors": {
19
+ "accent": "purple",
20
+ "border": "purple",
21
+ "borderAccent": "cyan",
22
+ "borderMuted": "gray",
23
+ "success": "green",
24
+ "error": "red",
25
+ "warning": "amber",
26
+ "muted": "gray",
27
+ "dim": "dimGray",
28
+ "text": "",
29
+ "thinkingText": "gray",
30
+ "selectedBg": "#2d2d30",
31
+ "userMessageBg": "#1a1128",
32
+ "userMessageText": "",
33
+ "customMessageBg": "#161620",
34
+ "customMessageText": "",
35
+ "customMessageLabel": "purple",
36
+ "toolPendingBg": "#12121a",
37
+ "toolSuccessBg": "#0f1a14",
38
+ "toolErrorBg": "#1a0f0f",
39
+ "toolTitle": "purple",
40
+ "toolOutput": "",
41
+ "mdHeading": "cyan",
42
+ "mdLink": "purple",
43
+ "mdLinkUrl": "gray",
44
+ "mdCode": "cyan",
45
+ "mdCodeBlock": "",
46
+ "mdCodeBlockBorder": "gray",
47
+ "mdQuote": "gray",
48
+ "mdQuoteBorder": "gray",
49
+ "mdHr": "gray",
50
+ "mdListBullet": "cyan",
51
+ "toolDiffAdded": "green",
52
+ "toolDiffRemoved": "red",
53
+ "toolDiffContext": "gray",
54
+ "syntaxComment": "gray",
55
+ "syntaxKeyword": "purple",
56
+ "syntaxFunction": "cyan",
57
+ "syntaxVariable": "amber",
58
+ "syntaxString": "green",
59
+ "syntaxNumber": "#c084fc",
60
+ "syntaxType": "cyan",
61
+ "syntaxOperator": "purple",
62
+ "syntaxPunctuation": "gray",
63
+ "thinkingOff": "gray",
64
+ "thinkingMinimal": "purple",
65
+ "thinkingLow": "blue",
66
+ "thinkingMedium": "cyan",
67
+ "thinkingHigh": "#c084fc",
68
+ "thinkingXhigh": "red",
69
+ "bashMode": "amber"
70
+ },
71
+ "export": {
72
+ "pageBg": "#0a0a0a",
73
+ "cardBg": "#111111",
74
+ "infoBg": "#1a1128"
75
+ }
76
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "lib": ["ES2022"],
7
+ "outDir": "./dist",
8
+ "rootDir": "./extensions",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "declaration": true,
13
+ "declarationMap": true,
14
+ "sourceMap": true,
15
+ "paths": {
16
+ "../../src/lib/*.js": ["../../src/lib/*.ts"]
17
+ }
18
+ },
19
+ "include": ["extensions/**/*"],
20
+ "exclude": ["node_modules", "dist"]
21
+ }
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env bash
2
+ # collect-tuples.sh — Pull training data from all VMs in a wave
3
+ #
4
+ # Usage:
5
+ # ./scripts/collect-tuples.sh [WAVE_ID]
6
+ #
7
+ # Collects from each agent VM:
8
+ # - training-buffer.jsonl (RL tuples)
9
+ # - eval.jsonl (eval results)
10
+ # - journal/ (experiment logs)
11
+ #
12
+ # Merges all tuples into a single buffer and optionally retrains policy head.
13
+
14
+ set -euo pipefail
15
+
16
+ WAVE_ID=${1:-$(prlctl list -a 2>/dev/null | grep "agent-" | head -1 | sed 's/.*agent-\([0-9]*\)-.*/\1/' || echo "")}
17
+
18
+ if [ -z "${WAVE_ID}" ]; then
19
+ echo "Usage: ./scripts/collect-tuples.sh <WAVE_ID>"
20
+ echo " or ensure agent VMs are running (agent-WAVEID-N)"
21
+ exit 1
22
+ fi
23
+
24
+ TUPLES_DIR="/tmp/jfl-fleet-${WAVE_ID}/tuples"
25
+ mkdir -p "${TUPLES_DIR}"
26
+
27
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
28
+ echo " Collecting tuples — Wave ${WAVE_ID}"
29
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
30
+ echo ""
31
+
32
+ COLLECTED=0
33
+ TOTAL_TUPLES=0
34
+
35
+ for vm in $(prlctl list -a --json 2>/dev/null | python3 -c "import sys,json; [print(v['name']) for v in json.load(sys.stdin) if v['name'].startswith('agent-${WAVE_ID}-')]" 2>/dev/null); do
36
+ echo -n " [${vm}] "
37
+
38
+ # Check if VM is running
39
+ STATUS=$(prlctl status "${vm}" 2>/dev/null | grep -o "running\|stopped" || echo "unknown")
40
+ if [ "${STATUS}" != "running" ] && [ "${STATUS}" != "stopped" ]; then
41
+ echo "SKIP (${STATUS})"
42
+ continue
43
+ fi
44
+
45
+ # Copy training tuples
46
+ prlctl copy-from "${vm}" \
47
+ /tmp/workspace/.jfl/training-buffer.jsonl \
48
+ "${TUPLES_DIR}/${vm}-tuples.jsonl" 2>/dev/null || true
49
+
50
+ # Copy eval results
51
+ prlctl copy-from "${vm}" \
52
+ /tmp/workspace/.jfl/eval.jsonl \
53
+ "${TUPLES_DIR}/${vm}-evals.jsonl" 2>/dev/null || true
54
+
55
+ # Copy journals
56
+ mkdir -p "${TUPLES_DIR}/${vm}-journals"
57
+ prlctl copy-from "${vm}" \
58
+ /tmp/workspace/.jfl/journal/ \
59
+ "${TUPLES_DIR}/${vm}-journals/" 2>/dev/null || true
60
+
61
+ # Copy autoresearch log
62
+ prlctl copy-from "${vm}" \
63
+ /tmp/autoresearch.log \
64
+ "${TUPLES_DIR}/${vm}-autoresearch.log" 2>/dev/null || true
65
+
66
+ if [ -f "${TUPLES_DIR}/${vm}-tuples.jsonl" ]; then
67
+ COUNT=$(wc -l < "${TUPLES_DIR}/${vm}-tuples.jsonl" | tr -d ' ')
68
+ TOTAL_TUPLES=$((TOTAL_TUPLES + COUNT))
69
+ echo "${COUNT} tuples"
70
+ else
71
+ echo "no tuples"
72
+ fi
73
+
74
+ COLLECTED=$((COLLECTED + 1))
75
+ done
76
+
77
+ # Merge all tuples
78
+ MERGED="${TUPLES_DIR}/merged.jsonl"
79
+ cat "${TUPLES_DIR}"/*-tuples.jsonl 2>/dev/null | sort -u > "${MERGED}" || true
80
+ MERGED_COUNT=$(wc -l < "${MERGED}" 2>/dev/null | tr -d ' ' || echo "0")
81
+
82
+ echo ""
83
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
84
+ echo " Collected from ${COLLECTED} VMs"
85
+ echo " Total tuples: ${TOTAL_TUPLES} (${MERGED_COUNT} unique)"
86
+ echo " Merged file: ${MERGED}"
87
+ echo ""
88
+
89
+ # Append to local training buffer
90
+ if [ "${MERGED_COUNT}" -gt 0 ]; then
91
+ LOCAL_BUFFER=".jfl/training-buffer.jsonl"
92
+ BEFORE=$(wc -l < "${LOCAL_BUFFER}" 2>/dev/null | tr -d ' ' || echo "0")
93
+
94
+ # Dedup: only append tuples with IDs not already in local buffer
95
+ if [ -f "${LOCAL_BUFFER}" ]; then
96
+ EXISTING_IDS=$(grep -o '"id":"[^"]*"' "${LOCAL_BUFFER}" | sort -u)
97
+ while IFS= read -r line; do
98
+ TUPLE_ID=$(echo "${line}" | grep -o '"id":"[^"]*"' || echo "")
99
+ if ! echo "${EXISTING_IDS}" | grep -qF "${TUPLE_ID}"; then
100
+ echo "${line}" >> "${LOCAL_BUFFER}"
101
+ fi
102
+ done < "${MERGED}"
103
+ else
104
+ cat "${MERGED}" >> "${LOCAL_BUFFER}"
105
+ fi
106
+
107
+ AFTER=$(wc -l < "${LOCAL_BUFFER}" | tr -d ' ')
108
+ NEW=$((AFTER - BEFORE))
109
+
110
+ echo " Appended ${NEW} new tuples to ${LOCAL_BUFFER}"
111
+ echo " Total local buffer: ${AFTER} tuples"
112
+
113
+ # Check if retrain is warranted
114
+ TRAINED_ON=$(python3 -c "import json; print(json.load(open('.jfl/policy-weights.json'))['trained_on'])" 2>/dev/null || echo "0")
115
+ DELTA=$((AFTER - TRAINED_ON))
116
+
117
+ if [ "${DELTA}" -ge 20 ]; then
118
+ echo ""
119
+ echo " ${DELTA} new tuples since last train (threshold: 20)"
120
+ echo " Retrain: python3 scripts/train-policy-head.py --epochs 200"
121
+ fi
122
+ fi
123
+
124
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env bash
2
+ # destroy-fleet.sh — Tear down all VMs in a wave
3
+ #
4
+ # Usage:
5
+ # ./scripts/destroy-fleet.sh [WAVE_ID]
6
+ #
7
+ # Stops and deletes all agent-WAVEID-* VMs.
8
+ # Run collect-tuples.sh FIRST to save training data.
9
+
10
+ set -euo pipefail
11
+
12
+ WAVE_ID=${1:-""}
13
+
14
+ if [ -z "${WAVE_ID}" ]; then
15
+ echo "Usage: ./scripts/destroy-fleet.sh <WAVE_ID>"
16
+ echo ""
17
+ echo "Active waves:"
18
+ prlctl list -a 2>/dev/null | grep "agent-" | sed 's/.*agent-\([0-9]*\)-.*/ \1/' | sort -u
19
+ exit 1
20
+ fi
21
+
22
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
23
+ echo " Destroying fleet — Wave ${WAVE_ID}"
24
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
25
+
26
+ DESTROYED=0
27
+ for vm in $(prlctl list -a 2>/dev/null | grep "agent-${WAVE_ID}-" | awk '{print $1}'); do
28
+ echo -n " [${vm}] "
29
+ prlctl stop "${vm}" --kill 2>/dev/null || true
30
+ prlctl delete "${vm}" 2>/dev/null || true
31
+ echo "destroyed"
32
+ DESTROYED=$((DESTROYED + 1))
33
+ done
34
+
35
+ echo ""
36
+ echo " Destroyed ${DESTROYED} VMs"
37
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"