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