@polderlabs/bizar 10.2.0 → 10.4.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/README.md +31 -8
- package/bizar-dash/CONTROL_SURFACES.md +0 -1
- package/bizar-dash/dist/assets/{ActivityFeed-JjmOY2AQ.js → ActivityFeed-DtRtg-JN.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityFeed-JjmOY2AQ.js.map → ActivityFeed-DtRtg-JN.js.map} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-BIIMvGWo.js → ActivityView-CoTXDyU_.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-BIIMvGWo.js.map → ActivityView-CoTXDyU_.js.map} +1 -1
- package/bizar-dash/dist/assets/{AdminView-DRidJtkq.js → AdminView-DNc5Ll7L.js} +1 -1
- package/bizar-dash/dist/assets/{AdminView-DRidJtkq.js.map → AdminView-DNc5Ll7L.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-79l4SBMC.js → AgentActivity-CrX7LmQ6.js} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-79l4SBMC.js.map → AgentActivity-CrX7LmQ6.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentsView-0vT4uPSc.js → AgentsView-Du-G_skK.js} +3 -3
- package/bizar-dash/dist/assets/{AgentsView-0vT4uPSc.js.map → AgentsView-Du-G_skK.js.map} +1 -1
- package/bizar-dash/dist/assets/{Alert-CG5q_s75.js → Alert-B6DjfRFI.js} +1 -1
- package/bizar-dash/dist/assets/{Alert-CG5q_s75.js.map → Alert-B6DjfRFI.js.map} +1 -1
- package/bizar-dash/dist/assets/{ArtifactsView-DM8ZmpR9.js → ArtifactsView-znhN8GTR.js} +1 -1
- package/bizar-dash/dist/assets/{ArtifactsView-DM8ZmpR9.js.map → ArtifactsView-znhN8GTR.js.map} +1 -1
- package/bizar-dash/dist/assets/{AuthView-BveN94MC.js → AuthView-Rk8eKUPr.js} +1 -1
- package/bizar-dash/dist/assets/{AuthView-BveN94MC.js.map → AuthView-Rk8eKUPr.js.map} +1 -1
- package/bizar-dash/dist/assets/{Avatar-ulUPIYTd.js → Avatar-B41upSD1.js} +1 -1
- package/bizar-dash/dist/assets/{Avatar-ulUPIYTd.js.map → Avatar-B41upSD1.js.map} +1 -1
- package/bizar-dash/dist/assets/{BackgroundJobsView-BWErhqFo.js → BackgroundJobsView-BLWuN9qz.js} +1 -1
- package/bizar-dash/dist/assets/{BackgroundJobsView-BWErhqFo.js.map → BackgroundJobsView-BLWuN9qz.js.map} +1 -1
- package/bizar-dash/dist/assets/{BackupView-CnBjzG9N.js → BackupView-CqbtcnuQ.js} +1 -1
- package/bizar-dash/dist/assets/{BackupView-CnBjzG9N.js.map → BackupView-CqbtcnuQ.js.map} +1 -1
- package/bizar-dash/dist/assets/{Card-B0imhxMk.js → Card-rF59wHiO.js} +1 -1
- package/bizar-dash/dist/assets/{Card-B0imhxMk.js.map → Card-rF59wHiO.js.map} +1 -1
- package/bizar-dash/dist/assets/{ChatView-D6zGytzx.js → ChatView-CUriVEgU.js} +1 -1
- package/bizar-dash/dist/assets/{ChatView-D6zGytzx.js.map → ChatView-CUriVEgU.js.map} +1 -1
- package/bizar-dash/dist/assets/{Chip-wwZSGwLE.js → Chip-Dc2KmeWl.js} +1 -1
- package/bizar-dash/dist/assets/{Chip-wwZSGwLE.js.map → Chip-Dc2KmeWl.js.map} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-DK1sOLhi.js → ClaudeSessionsView-CiaHQdDZ.js} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-DK1sOLhi.js.map → ClaudeSessionsView-CiaHQdDZ.js.map} +1 -1
- package/bizar-dash/dist/assets/{ClipboardView-CZ2lYPr0.js → ClipboardView-DdP6aVso.js} +1 -1
- package/bizar-dash/dist/assets/{ClipboardView-CZ2lYPr0.js.map → ClipboardView-DdP6aVso.js.map} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-D-zT9eNA.js → ConfigView-B2ysnTZU.js} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-D-zT9eNA.js.map → ConfigView-B2ysnTZU.js.map} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-BocV68Lb.js → DiagnosticsView-88OZ5k0f.js} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-BocV68Lb.js.map → DiagnosticsView-88OZ5k0f.js.map} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-BVjPI5x7.js → DialogsView-BcqDDCZQ.js} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-BVjPI5x7.js.map → DialogsView-BcqDDCZQ.js.map} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-84gJcZwM.js → DoctorView-BQwqvMAh.js} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-84gJcZwM.js.map → DoctorView-BQwqvMAh.js.map} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-BjgVOrcO.js → EmptyState-D65J5FQN.js} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-BjgVOrcO.js.map → EmptyState-D65J5FQN.js.map} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsView-BJ2TEzF7.js → EnvVarsView-DX-3oGH-.js} +2 -2
- package/bizar-dash/dist/assets/{EnvVarsView-BJ2TEzF7.js.map → EnvVarsView-DX-3oGH-.js.map} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-BE3WBFqF.js → ErrorState-DULZnttJ.js} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-BE3WBFqF.js.map → ErrorState-DULZnttJ.js.map} +1 -1
- package/bizar-dash/dist/assets/{EvalView-BJJ2P-kK.js → EvalView-CpdFu_ID.js} +1 -1
- package/bizar-dash/dist/assets/{EvalView-BJJ2P-kK.js.map → EvalView-CpdFu_ID.js.map} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-pwROHApi.js → GoalsView-Br8oPPfb.js} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-pwROHApi.js.map → GoalsView-Br8oPPfb.js.map} +1 -1
- package/bizar-dash/dist/assets/{Grid-qcvbhx6e.js → Grid-BSXhsCPC.js} +1 -1
- package/bizar-dash/dist/assets/{Grid-qcvbhx6e.js.map → Grid-BSXhsCPC.js.map} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-C7SSOLJA.js → HistoryView-D0J3aoZF.js} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-C7SSOLJA.js.map → HistoryView-D0J3aoZF.js.map} +1 -1
- package/bizar-dash/dist/assets/{Input-Bgzxf_Hu.js → Input-CZmRw5QX.js} +1 -1
- package/bizar-dash/dist/assets/{Input-Bgzxf_Hu.js.map → Input-CZmRw5QX.js.map} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-CbFFksox.js → LibrariesView-B1YX9wzp.js} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-CbFFksox.js.map → LibrariesView-B1YX9wzp.js.map} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-BqDrJbRq.js → LightRAGView-CykR0t9y.js} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-BqDrJbRq.js.map → LightRAGView-CykR0t9y.js.map} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-TjPJrUfY.js → ListHeader-Dpun-r36.js} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-TjPJrUfY.js.map → ListHeader-Dpun-r36.js.map} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-BlTeHLhX.js → MemoryView-BbER5ZKt.js} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-BlTeHLhX.js.map → MemoryView-BbER5ZKt.js.map} +1 -1
- package/bizar-dash/dist/assets/MiscView-DLNEGdML.js +1 -0
- package/bizar-dash/dist/assets/{MiscView-B8QY82Pm.js.map → MiscView-DLNEGdML.js.map} +1 -1
- package/bizar-dash/dist/assets/{ModsView-CvW1OWts.js → ModsView-P7gDeNHM.js} +2 -2
- package/bizar-dash/dist/assets/{ModsView-CvW1OWts.js.map → ModsView-P7gDeNHM.js.map} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-CsBt5U7x.js → NotificationsView-DAm2O0yf.js} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-CsBt5U7x.js.map → NotificationsView-DAm2O0yf.js.map} +1 -1
- package/bizar-dash/dist/assets/ObsidianView-Ci80gnwS.js +1 -0
- package/bizar-dash/dist/assets/{ObsidianView-BCTejEj2.js.map → ObsidianView-Ci80gnwS.js.map} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-BsuPxwnB.js → OverviewView-rriw1GjA.js} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-BsuPxwnB.js.map → OverviewView-rriw1GjA.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-DlZTETEn.js → ProgressBar-BahmeJhP.js} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-DlZTETEn.js.map → ProgressBar-BahmeJhP.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-Soxtmpet.js → ProjectsView-ChzM12bs.js} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-Soxtmpet.js.map → ProjectsView-ChzM12bs.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-DaCEV9pM.js → ProvidersView-BftGn8Cr.js} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-DaCEV9pM.js.map → ProvidersView-BftGn8Cr.js.map} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-DY2ByBj_.js → SchedulesView-CtNxtzN6.js} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-DY2ByBj_.js.map → SchedulesView-CtNxtzN6.js.map} +1 -1
- package/bizar-dash/dist/assets/{Select-Dbd88_n8.js → Select-0VcfTDeL.js} +1 -1
- package/bizar-dash/dist/assets/{Select-Dbd88_n8.js.map → Select-0VcfTDeL.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-CLMNd434.js → SettingsRow-BLic3DQl.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-CLMNd434.js.map → SettingsRow-BLic3DQl.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-b24oFq9x.js → SettingsView-BjS3i4nr.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-b24oFq9x.js.map → SettingsView-BjS3i4nr.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sheet-DnDid58j.js → Sheet-BOProMs2.js} +1 -1
- package/bizar-dash/dist/assets/{Sheet-DnDid58j.js.map → Sheet-BOProMs2.js.map} +1 -1
- package/bizar-dash/dist/assets/{Slider-BJCvKI1I.js → Slider-B0eLEEUt.js} +1 -1
- package/bizar-dash/dist/assets/{Slider-BJCvKI1I.js.map → Slider-B0eLEEUt.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-ktqQLdyb.js → Sparkline-SSrdgyW0.js} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-ktqQLdyb.js.map → Sparkline-SSrdgyW0.js.map} +1 -1
- package/bizar-dash/dist/assets/{Switch-CwXfsDii.js → Switch-B3EQzb_q.js} +1 -1
- package/bizar-dash/dist/assets/{Switch-CwXfsDii.js.map → Switch-B3EQzb_q.js.map} +1 -1
- package/bizar-dash/dist/assets/{TasksView-BHmpzFCf.js → TasksView-SWjF_ZUQ.js} +1 -1
- package/bizar-dash/dist/assets/{TasksView-BHmpzFCf.js.map → TasksView-SWjF_ZUQ.js.map} +1 -1
- package/bizar-dash/dist/assets/{Textarea-BzIAwSlp.js → Textarea-QuofpMlq.js} +1 -1
- package/bizar-dash/dist/assets/{Textarea-BzIAwSlp.js.map → Textarea-QuofpMlq.js.map} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-CSmX9NN0.js → UpdateView-CEHW2nd6.js} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-CSmX9NN0.js.map → UpdateView-CEHW2nd6.js.map} +1 -1
- package/bizar-dash/dist/assets/{UsageView-COyr_Gfi.js → UsageView-BqOw6FBg.js} +1 -1
- package/bizar-dash/dist/assets/{UsageView-COyr_Gfi.js.map → UsageView-BqOw6FBg.js.map} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BzYZ3m-e.js → ViewHeader-B6P-C4GD.js} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BzYZ3m-e.js.map → ViewHeader-B6P-C4GD.js.map} +1 -1
- package/bizar-dash/dist/assets/{VoiceView-D33_xG5t.js → VoiceView-CwrPwWgi.js} +1 -1
- package/bizar-dash/dist/assets/{VoiceView-D33_xG5t.js.map → VoiceView-CwrPwWgi.js.map} +1 -1
- package/bizar-dash/dist/assets/{brain-CM-Vls8r.js → brain-CwZt9Kta.js} +1 -1
- package/bizar-dash/dist/assets/{brain-CM-Vls8r.js.map → brain-CwZt9Kta.js.map} +1 -1
- package/bizar-dash/dist/assets/{calendar-C0lgZk69.js → calendar-C5oK0_nM.js} +1 -1
- package/bizar-dash/dist/assets/{calendar-C0lgZk69.js.map → calendar-C5oK0_nM.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-Bx_hQEBC.js → circle-D1Lc_P2a.js} +1 -1
- package/bizar-dash/dist/assets/{circle-Bx_hQEBC.js.map → circle-D1Lc_P2a.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-DHvsqpw5.js → circle-alert-HdHe7m8K.js} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-DHvsqpw5.js.map → circle-alert-HdHe7m8K.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-check-Bx8wmXR9.js → circle-check-Cs-xoV7R.js} +1 -1
- package/bizar-dash/dist/assets/{circle-check-Bx8wmXR9.js.map → circle-check-Cs-xoV7R.js.map} +1 -1
- package/bizar-dash/dist/assets/{clock-CejGoecX.js → clock-DEIuPV60.js} +1 -1
- package/bizar-dash/dist/assets/{clock-CejGoecX.js.map → clock-DEIuPV60.js.map} +1 -1
- package/bizar-dash/dist/assets/{download-4cEUWue1.js → download-Clkq90Ct.js} +1 -1
- package/bizar-dash/dist/assets/{download-4cEUWue1.js.map → download-Clkq90Ct.js.map} +1 -1
- package/bizar-dash/dist/assets/{external-link-0NqUhI4i.js → external-link-D5tq2o_I.js} +1 -1
- package/bizar-dash/dist/assets/{external-link-0NqUhI4i.js.map → external-link-D5tq2o_I.js.map} +1 -1
- package/bizar-dash/dist/assets/{file-text-yEMkrSoZ.js → file-text-CQ12t7Oc.js} +1 -1
- package/bizar-dash/dist/assets/{file-text-yEMkrSoZ.js.map → file-text-CQ12t7Oc.js.map} +1 -1
- package/bizar-dash/dist/assets/{filter-BXt60zAS.js → filter-BcbE37wP.js} +1 -1
- package/bizar-dash/dist/assets/{filter-BXt60zAS.js.map → filter-BcbE37wP.js.map} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-BjG5lNtR.js → git-pull-request-D1qNDRia.js} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-BjG5lNtR.js.map → git-pull-request-D1qNDRia.js.map} +1 -1
- package/bizar-dash/dist/assets/{main-CokHAXWM.js → main-Cxeu4LhG.js} +28 -33
- package/bizar-dash/dist/assets/main-Cxeu4LhG.js.map +1 -0
- package/bizar-dash/dist/assets/network-DJdvVaHx.js +6 -0
- package/bizar-dash/dist/assets/network-DJdvVaHx.js.map +1 -0
- package/bizar-dash/dist/assets/{pause-CAmulU0F.js → pause-DUn9L5PB.js} +1 -1
- package/bizar-dash/dist/assets/{pause-CAmulU0F.js.map → pause-DUn9L5PB.js.map} +1 -1
- package/bizar-dash/dist/assets/{pencil-eq5IqBmU.js → pencil-DVrBlYV3.js} +1 -1
- package/bizar-dash/dist/assets/{pencil-eq5IqBmU.js.map → pencil-DVrBlYV3.js.map} +1 -1
- package/bizar-dash/dist/assets/{play-BoLrrcBA.js → play-CZjsr3XM.js} +1 -1
- package/bizar-dash/dist/assets/{play-BoLrrcBA.js.map → play-CZjsr3XM.js.map} +1 -1
- package/bizar-dash/dist/assets/{plug-DBrVM9lK.js → plug-BKuyIe5W.js} +1 -1
- package/bizar-dash/dist/assets/{plug-DBrVM9lK.js.map → plug-BKuyIe5W.js.map} +1 -1
- package/bizar-dash/dist/assets/{plus-DENm0hqV.js → plus-77h62zZm.js} +1 -1
- package/bizar-dash/dist/assets/{plus-DENm0hqV.js.map → plus-77h62zZm.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-DLjXF7zE.js → power-DLmx-gCP.js} +1 -1
- package/bizar-dash/dist/assets/{power-DLjXF7zE.js.map → power-DLmx-gCP.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-off-D47cOnG_.js → power-off-BFKzHXic.js} +1 -1
- package/bizar-dash/dist/assets/{power-off-D47cOnG_.js.map → power-off-BFKzHXic.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-DNrXX9gB.js → refresh-ccw-DenGBOcq.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-DNrXX9gB.js.map → refresh-ccw-DenGBOcq.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-CoAHDpeS.js → refresh-cw-ENBVR8hW.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-CoAHDpeS.js.map → refresh-cw-ENBVR8hW.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-ObX5awaG.js → rotate-ccw-MxryaY7q.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-ObX5awaG.js.map → rotate-ccw-MxryaY7q.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-xpPJw9LP.js → rotate-cw-CDOlRtUR.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-xpPJw9LP.js.map → rotate-cw-CDOlRtUR.js.map} +1 -1
- package/bizar-dash/dist/assets/{save-D1iKiJJl.js → save-Db1b-1Uq.js} +1 -1
- package/bizar-dash/dist/assets/{save-D1iKiJJl.js.map → save-Db1b-1Uq.js.map} +1 -1
- package/bizar-dash/dist/assets/{send-BRcAhZUm.js → send-yz6HFZM5.js} +1 -1
- package/bizar-dash/dist/assets/{send-BRcAhZUm.js.map → send-yz6HFZM5.js.map} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-C6vEcK-g.js → shield-alert-DY6RAaC8.js} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-C6vEcK-g.js.map → shield-alert-DY6RAaC8.js.map} +1 -1
- package/bizar-dash/dist/assets/{trash-2-DZDjEnNh.js → trash-2-Cv7U38jw.js} +1 -1
- package/bizar-dash/dist/assets/{trash-2-DZDjEnNh.js.map → trash-2-Cv7U38jw.js.map} +1 -1
- package/bizar-dash/dist/assets/{trending-up-DMj-AJVf.js → trending-up-CRPNagyX.js} +1 -1
- package/bizar-dash/dist/assets/{trending-up-DMj-AJVf.js.map → trending-up-CRPNagyX.js.map} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-_2xe_tl4.js → triangle-alert-tUTXbcEP.js} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-_2xe_tl4.js.map → triangle-alert-tUTXbcEP.js.map} +1 -1
- package/bizar-dash/dist/assets/{upload-DdDljAeV.js → upload-Cq7uTsrT.js} +1 -1
- package/bizar-dash/dist/assets/{upload-DdDljAeV.js.map → upload-Cq7uTsrT.js.map} +1 -1
- package/bizar-dash/dist/assets/{zap-mHsgh0FP.js → zap-5lAQBAPX.js} +1 -1
- package/bizar-dash/dist/assets/{zap-mHsgh0FP.js.map → zap-5lAQBAPX.js.map} +1 -1
- package/bizar-dash/dist/index.html +1 -1
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/bizar-dash/src/server/api.mjs +5 -1
- package/bizar-dash/src/server/routes/update.mjs +48 -21
- package/bizar-dash/src/web/v8/App.tsx +0 -4
- package/bizar-dash/src/web/v8/__tests__/new-views.test.tsx +0 -17
- package/bizar-dash/src/web/v8/shell/Sidebar.tsx +3 -4
- package/bizar-dash/src/web/v8/views/Router.tsx +0 -5
- package/bizar-dash/tests/_update-test-helpers.mjs +13 -0
- package/bizar-dash/tests/update-check.test.mjs +18 -13
- package/bizar-dash/tests/update-packages.test.mjs +154 -0
- package/bizar-dash/tests/update-run.test.mjs +17 -80
- package/cli/banner.mjs +1 -1
- package/cli/bin.mjs +8 -1
- package/cli/bootstrap.mjs +1 -1
- package/cli/commands/claude-cmd.mjs +1 -1
- package/cli/commands/deploy/docker.mjs +0 -3
- package/cli/doctor.mjs +1 -1
- package/cli/install/banner.mjs +67 -0
- package/cli/install/banner.test.mjs +39 -0
- package/cli/install/index.mjs +32 -0
- package/cli/install/index.test.mjs +61 -0
- package/cli/install/paths.mjs +80 -0
- package/cli/install/paths.test.mjs +77 -0
- package/cli/install/plugin.mjs +161 -0
- package/cli/install/postinstall.mjs +111 -0
- package/cli/install.mjs +13 -600
- package/cli/migrate.mjs +157 -0
- package/cli/migrate.test.mjs +85 -0
- package/cli/provision.mjs +615 -1918
- package/cli/provision.test.mjs +1 -1
- package/cli/service-controller.test.mjs +0 -1
- package/cli/service-env.mjs +0 -1
- package/cli/utils.mjs +0 -1
- package/install.sh +54 -466
- package/package.json +1 -1
- package/packages/sdk/dist/mcp/server.js +41 -409
- package/packages/sdk/dist/router/q-learning-router.d.ts +3 -5
- package/packages/sdk/dist/router/q-learning-router.js +9 -5
- package/packages/sdk/package.json +1 -1
- package/scripts/install-curl.sh +17 -0
- package/bizar-dash/dist/assets/HeadroomView-D1UiTYbt.js +0 -11
- package/bizar-dash/dist/assets/HeadroomView-D1UiTYbt.js.map +0 -1
- package/bizar-dash/dist/assets/MiscView-B8QY82Pm.js +0 -1
- package/bizar-dash/dist/assets/ObsidianView-BCTejEj2.js +0 -1
- package/bizar-dash/dist/assets/main-CokHAXWM.js.map +0 -1
- package/bizar-dash/skills/headroom/SKILL.md +0 -94
- package/bizar-dash/src/server/headroom.mjs +0 -649
- package/bizar-dash/src/server/routes/headroom.mjs +0 -126
- package/bizar-dash/src/web/v8/views/Headroom/HeadroomView.tsx +0 -201
- package/bizar-dash/tests/graphify-mod-spawn.node.test.mjs +0 -90
- package/bizar-dash/tests/headroom-install.test.mjs +0 -173
- package/bizar-dash/tests/headroom-settings.test.mjs +0 -126
- package/bizar-dash/tests/headroom-status.test.mjs +0 -117
- package/bizar-dash/tests/v7-archive/mobile-overview.test.tsx +0 -214
- package/bizar-dash/tests/v7-archive/mobile-settings.test.tsx +0 -181
- package/bizar-dash/tests/v7-archive/navigation/CommandPalette.test.tsx +0 -105
- package/bizar-dash/tests/v7-archive/settings-nav.test.tsx +0 -128
- package/bizar-dash/tests/v7-archive/views/Overview.test.tsx +0 -413
- package/cli/commands/headroom.mjs +0 -204
- package/cli/provision-claude.mjs +0 -1176
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/install/banner.mjs
|
|
3
|
+
*
|
|
4
|
+
* Banner, pantheon card, and section heading for the install flow.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
|
|
9
|
+
const RUNE_HELM = `
|
|
10
|
+
██████╗ ██╗██╗ ██╗ █████╗ ██████╗
|
|
11
|
+
██╔══██╗██║██║ ██║██╔══██╗██╔══██╗
|
|
12
|
+
██████╔╝██║███████║███████║██████╔╝
|
|
13
|
+
██╔══██╗██║╚════██║██╔══██║██╔══██╗
|
|
14
|
+
██████╔╝██║ ██║██║ ██║██║ ██║
|
|
15
|
+
╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝
|
|
16
|
+
`;
|
|
17
|
+
|
|
18
|
+
const PANTHEON = `
|
|
19
|
+
╔══════════════════════════════════════════╗
|
|
20
|
+
║ ║
|
|
21
|
+
║ ᛟ Odin ᛗ Mimir ᚹ Heimdall ║
|
|
22
|
+
║ ᚱ Hermod ᚦ Thor ᛏ Tyr ║
|
|
23
|
+
║ ᛉ Vidarr ᚨ Forseti ᛒ Baldr ║
|
|
24
|
+
║ ║
|
|
25
|
+
╚══════════════════════════════════════════╝
|
|
26
|
+
`;
|
|
27
|
+
|
|
28
|
+
const TAGLINE = '14 agents · 6 cost tiers · dashboard · Obsidian vault long-term memory · Mods · Skills CLI';
|
|
29
|
+
|
|
30
|
+
export const palette = {
|
|
31
|
+
primary: chalk.hex('#6366f1'),
|
|
32
|
+
success: chalk.green,
|
|
33
|
+
warn: chalk.yellow,
|
|
34
|
+
error: chalk.red,
|
|
35
|
+
dim: chalk.dim,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Print the Bizar mark + tagline.
|
|
40
|
+
* @param {string} [version] - Optional version string to prepend.
|
|
41
|
+
*/
|
|
42
|
+
export function showBanner(version) {
|
|
43
|
+
if (version) {
|
|
44
|
+
console.log(chalk.bold.hex('#6366f1')(`\n ⚡ BizarHarness v${version}\n`));
|
|
45
|
+
} else {
|
|
46
|
+
console.log(chalk.bold.hex('#6366f1')(RUNE_HELM));
|
|
47
|
+
console.log(chalk.hex('#a855f7')(' Norse Pantheon Agent System for Claude Code'));
|
|
48
|
+
}
|
|
49
|
+
console.log();
|
|
50
|
+
console.log(chalk.dim(` ${TAGLINE}`));
|
|
51
|
+
console.log();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Print the Norse pantheon card. */
|
|
55
|
+
export function showPantheon() {
|
|
56
|
+
console.log(chalk.hex('#312e81')(PANTHEON));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Print a section header divider.
|
|
61
|
+
* @param {string} text - Section title.
|
|
62
|
+
*/
|
|
63
|
+
export function sectionHeading(text) {
|
|
64
|
+
console.log();
|
|
65
|
+
console.log(chalk.bold.hex('#6366f1')(` ── ${text} ──`));
|
|
66
|
+
console.log();
|
|
67
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/install/banner.test.mjs
|
|
3
|
+
*
|
|
4
|
+
* Tests for cli/install/banner.mjs
|
|
5
|
+
*/
|
|
6
|
+
import { test, describe } from 'node:test';
|
|
7
|
+
import assert from 'node:assert/strict';
|
|
8
|
+
import { showBanner, showPantheon, sectionHeading, palette } from './banner.mjs';
|
|
9
|
+
|
|
10
|
+
describe('showBanner()', () => {
|
|
11
|
+
test('does not throw', () => {
|
|
12
|
+
assert.doesNotThrow(() => showBanner());
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test('does not throw with version', () => {
|
|
16
|
+
assert.doesNotThrow(() => showBanner('10.0.0'));
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
describe('palette', () => {
|
|
21
|
+
test('has all 5 required keys', () => {
|
|
22
|
+
const required = ['primary', 'success', 'warn', 'error', 'dim'];
|
|
23
|
+
for (const key of required) {
|
|
24
|
+
assert.ok(key in palette, `missing palette key: ${key}`);
|
|
25
|
+
assert.ok(typeof palette[key] === 'function', `${key} should be a function`);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe('sectionHeading()', () => {
|
|
31
|
+
let output;
|
|
32
|
+
const orig = console.log;
|
|
33
|
+
|
|
34
|
+
test('does not throw', () => {
|
|
35
|
+
assert.doesNotThrow(() => sectionHeading('Test Section'));
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
console.log(' banner.test.mjs loaded — run with: node --test cli/install/banner.test.mjs');
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/install/index.mjs
|
|
3
|
+
*
|
|
4
|
+
* Clean orchestrator: runInstaller() — rewritten as a thin coordinator
|
|
5
|
+
* that delegates to the provisioner.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { runProvision } from '../provision.mjs';
|
|
9
|
+
import { showBanner, sectionHeading } from './banner.mjs';
|
|
10
|
+
import { printInstallLocations } from './paths.mjs';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Thin orchestrator entry point.
|
|
14
|
+
* @param {object} opts
|
|
15
|
+
* @param {boolean} [opts.dryRun]
|
|
16
|
+
* @param {boolean} [opts.force]
|
|
17
|
+
* @param {boolean} [opts.quiet] - Only print the location card
|
|
18
|
+
* @param {string} [opts.mode] - 'install' | 'update'
|
|
19
|
+
*/
|
|
20
|
+
export async function runInstaller(opts = {}) {
|
|
21
|
+
const { dryRun = false, force = false, quiet = false, mode = 'install' } = opts;
|
|
22
|
+
|
|
23
|
+
if (quiet) {
|
|
24
|
+
printInstallLocations({ dryRun, force });
|
|
25
|
+
return { ok: true };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
showBanner();
|
|
29
|
+
printInstallLocations({ dryRun, force });
|
|
30
|
+
|
|
31
|
+
return runProvision({ mode, dryRun, force });
|
|
32
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/install/index.test.mjs
|
|
3
|
+
*
|
|
4
|
+
* Tests for cli/install/index.mjs — runInstaller orchestrator.
|
|
5
|
+
*/
|
|
6
|
+
import { test, describe, beforeEach, afterEach } from 'node:test';
|
|
7
|
+
import assert from 'node:assert/strict';
|
|
8
|
+
import { mkdtempSync, rmSync, existsSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
9
|
+
import { tmpdir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
|
|
12
|
+
const ORIG_HOME = process.env.HOME;
|
|
13
|
+
|
|
14
|
+
function freshHome() {
|
|
15
|
+
const home = mkdtempSync(join(tmpdir(), 'bizar-install-index-'));
|
|
16
|
+
process.env.HOME = home;
|
|
17
|
+
delete process.env.CLAUDE_CONFIG_DIR;
|
|
18
|
+
delete process.env.XDG_CONFIG_HOME;
|
|
19
|
+
return home;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function restoreHome() {
|
|
23
|
+
if (ORIG_HOME === undefined) delete process.env.HOME;
|
|
24
|
+
else process.env.HOME = ORIG_HOME;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
describe('runInstaller()', () => {
|
|
28
|
+
let home;
|
|
29
|
+
|
|
30
|
+
beforeEach(() => { home = freshHome(); });
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
restoreHome();
|
|
33
|
+
if (home) try { rmSync(home, { recursive: true, force: true }); } catch { /* ignore */ }
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('runInstaller({ dryRun: true }) does not write files', async () => {
|
|
37
|
+
const { runInstaller } = await import('./index.mjs');
|
|
38
|
+
const result = await runInstaller({ dryRun: true });
|
|
39
|
+
assert.equal(result.ok, true);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('runInstaller({ quiet: true }) only prints location card', async () => {
|
|
43
|
+
const { runInstaller } = await import('./index.mjs');
|
|
44
|
+
const result = await runInstaller({ quiet: true });
|
|
45
|
+
assert.equal(result.ok, true);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('runInstaller({ force: true }) runs without error', async () => {
|
|
49
|
+
const { runInstaller } = await import('./index.mjs');
|
|
50
|
+
const result = await runInstaller({ force: true, dryRun: true });
|
|
51
|
+
assert.equal(result.ok, true);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('runInstaller({ mode: "update" }) runs without error', async () => {
|
|
55
|
+
const { runInstaller } = await import('./index.mjs');
|
|
56
|
+
const result = await runInstaller({ mode: 'update', dryRun: true });
|
|
57
|
+
assert.equal(result.ok, true);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
console.log(' index.test.mjs loaded — run with: node --test cli/install/index.test.mjs');
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/install/paths.mjs
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for all install paths. Replaces hard-coded
|
|
5
|
+
* path literals scattered throughout the install flow.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
|
|
12
|
+
/** Resolve the Claude Code config directory.
|
|
13
|
+
* 1. `process.env.CLAUDE_CONFIG_DIR`
|
|
14
|
+
* 2. `$HOME/.claude`
|
|
15
|
+
*/
|
|
16
|
+
export function resolveClaudeDir() {
|
|
17
|
+
const HOME = homedir();
|
|
18
|
+
if (process.env.CLAUDE_CONFIG_DIR && process.env.CLAUDE_CONFIG_DIR.trim()) {
|
|
19
|
+
return process.env.CLAUDE_CONFIG_DIR.trim();
|
|
20
|
+
}
|
|
21
|
+
if (process.platform === 'win32') {
|
|
22
|
+
return process.env.APPDATA
|
|
23
|
+
? join(process.env.APPDATA, 'Claude')
|
|
24
|
+
: join(HOME, '.claude');
|
|
25
|
+
}
|
|
26
|
+
return join(HOME, '.claude');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const HOME = homedir();
|
|
30
|
+
const CLAUDE_DIR = resolveClaudeDir();
|
|
31
|
+
const BIZAR_HOME = process.env.BIZAR_HOME
|
|
32
|
+
|| join(process.env.XDG_CONFIG_HOME || join(HOME, '.config'), 'bizar');
|
|
33
|
+
|
|
34
|
+
/** The Bizar runtime state directory (not under ~/.claude/). */
|
|
35
|
+
export { BIZAR_HOME };
|
|
36
|
+
|
|
37
|
+
/** Standard Claude Code subdirectories under CLAUDE_DIR. */
|
|
38
|
+
export const PATHS = {
|
|
39
|
+
claudeDir: CLAUDE_DIR,
|
|
40
|
+
agentsDir: join(CLAUDE_DIR, 'agents'),
|
|
41
|
+
skillsDir: join(CLAUDE_DIR, 'skills'),
|
|
42
|
+
commandsDir: join(CLAUDE_DIR, 'commands'),
|
|
43
|
+
hooksDir: join(CLAUDE_DIR, 'hooks'),
|
|
44
|
+
pluginsDir: join(CLAUDE_DIR, 'plugins'),
|
|
45
|
+
settingsFile: join(CLAUDE_DIR, 'settings.json'),
|
|
46
|
+
bizarHome: BIZAR_HOME,
|
|
47
|
+
servicePid: join(BIZAR_HOME, 'service.pid'),
|
|
48
|
+
dashboardPid: join(BIZAR_HOME, 'dashboard.pid'),
|
|
49
|
+
dashboardPort: join(BIZAR_HOME, 'dashboard.port'),
|
|
50
|
+
installMarker: join(BIZAR_HOME, 'installed.json'),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Render the install-location card to the console.
|
|
55
|
+
* @param {{ dryRun?: boolean, force?: boolean }} [_opts]
|
|
56
|
+
*/
|
|
57
|
+
export function printInstallLocations(_opts = {}) {
|
|
58
|
+
const G = chalk.green;
|
|
59
|
+
const dim = chalk.dim;
|
|
60
|
+
|
|
61
|
+
console.log();
|
|
62
|
+
console.log(chalk.bold('┌─ BizarHarness will install to ─────────────────────────────────────┐'));
|
|
63
|
+
console.log(chalk.bold('│') + ' '.repeat(68) + chalk.bold('│'));
|
|
64
|
+
console.log(chalk.bold('│') + ` Claude Code config ${PATHS.claudeDir}`.padEnd(69) + chalk.bold('│'));
|
|
65
|
+
console.log(chalk.bold('│') + ` ├─ agents/ bundled agents`.padEnd(69) + chalk.bold('│'));
|
|
66
|
+
console.log(chalk.bold('│') + ` ├─ skills/ bundled skill packs`.padEnd(69) + chalk.bold('│'));
|
|
67
|
+
console.log(chalk.bold('│') + ` ├─ commands/ slash commands`.padEnd(69) + chalk.bold('│'));
|
|
68
|
+
console.log(chalk.bold('│') + ` ├─ hooks/ PreToolUse, PostToolUse, …`.padEnd(69) + chalk.bold('│'));
|
|
69
|
+
console.log(chalk.bold('│') + ` ├─ plugins/bizar/ the MCP server`.padEnd(69) + chalk.bold('│'));
|
|
70
|
+
console.log(chalk.bold('│') + ` └─ settings.json scoped permissions + hooks`.padEnd(69) + chalk.bold('│'));
|
|
71
|
+
console.log(chalk.bold('│') + ' '.repeat(68) + chalk.bold('│'));
|
|
72
|
+
console.log(chalk.bold('│') + ` Bizar runtime state ${PATHS.bizarHome}`.padEnd(69) + chalk.bold('│'));
|
|
73
|
+
console.log(chalk.bold('│') + ` ├─ service.pid background daemon PID`.padEnd(69) + chalk.bold('│'));
|
|
74
|
+
console.log(chalk.bold('│') + ` ├─ dashboard.pid dashboard server PID`.padEnd(69) + chalk.bold('│'));
|
|
75
|
+
console.log(chalk.bold('│') + ` └─ installed.json install manifest (version, hash)`.padEnd(69) + chalk.bold('│'));
|
|
76
|
+
console.log(chalk.bold('│') + ' '.repeat(68) + chalk.bold('│'));
|
|
77
|
+
console.log(chalk.bold('│') + ` Override with: ${dim('CLAUDE_CONFIG_DIR=/path/to/dir')}`.padEnd(69) + chalk.bold('│'));
|
|
78
|
+
console.log(chalk.bold('└──────────────────────────────────────────────────────────────────────┘'));
|
|
79
|
+
console.log();
|
|
80
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/install/paths.test.mjs
|
|
3
|
+
*
|
|
4
|
+
* Tests for cli/install/paths.mjs
|
|
5
|
+
*/
|
|
6
|
+
import { test, describe } from 'node:test';
|
|
7
|
+
import assert from 'node:assert/strict';
|
|
8
|
+
import { PATHS, printInstallLocations, resolveClaudeDir } from './paths.mjs';
|
|
9
|
+
|
|
10
|
+
describe('PATHS', () => {
|
|
11
|
+
test('has all required keys', () => {
|
|
12
|
+
const required = [
|
|
13
|
+
'claudeDir', 'agentsDir', 'skillsDir', 'commandsDir',
|
|
14
|
+
'hooksDir', 'pluginsDir', 'settingsFile', 'bizarHome',
|
|
15
|
+
'servicePid', 'dashboardPid', 'dashboardPort', 'installMarker',
|
|
16
|
+
];
|
|
17
|
+
for (const key of required) {
|
|
18
|
+
assert.ok(key in PATHS, `missing key: ${key}`);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('PATHS values are non-empty strings', () => {
|
|
23
|
+
for (const [key, val] of Object.entries(PATHS)) {
|
|
24
|
+
assert.ok(typeof val === 'string' && val.length > 0, `${key} should be non-empty string, got: ${val}`);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('printInstallLocations()', () => {
|
|
30
|
+
test('does not throw', () => {
|
|
31
|
+
assert.doesNotThrow(() => printInstallLocations({ dryRun: false }));
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('output contains ~/.claude', () => {
|
|
35
|
+
let output = '';
|
|
36
|
+
const orig = console.log;
|
|
37
|
+
console.log = (...args) => { output += args.join(' ') + '\n'; };
|
|
38
|
+
try { printInstallLocations({}); } finally { console.log = orig; }
|
|
39
|
+
// Output mentions the Claude config dir — exact form depends on resolved HOME
|
|
40
|
+
assert.ok(output.includes('.claude') || output.includes('/.claude'), 'should mention .claude path');
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
describe('resolveClaudeDir()', () => {
|
|
45
|
+
test('uses CLAUDE_CONFIG_DIR env override', () => {
|
|
46
|
+
const orig = process.env.CLAUDE_CONFIG_DIR;
|
|
47
|
+
process.env.CLAUDE_CONFIG_DIR = '/tmp/my-claude-dir';
|
|
48
|
+
try {
|
|
49
|
+
const dir = resolveClaudeDir();
|
|
50
|
+
assert.equal(dir, '/tmp/my-claude-dir');
|
|
51
|
+
} finally {
|
|
52
|
+
if (orig === undefined) delete process.env.CLAUDE_CONFIG_DIR;
|
|
53
|
+
else process.env.CLAUDE_CONFIG_DIR = orig;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe('idempotency', () => {
|
|
59
|
+
test('two consecutive calls produce same output', () => {
|
|
60
|
+
let out1 = '', out2 = '';
|
|
61
|
+
const orig = console.log;
|
|
62
|
+
const capture = () => { let s = ''; console.log = (...a) => { s += a.join(' ') + '\n'; }; return s; };
|
|
63
|
+
const restore = (s) => { console.log = orig; return s; };
|
|
64
|
+
|
|
65
|
+
const c1 = capture();
|
|
66
|
+
printInstallLocations({});
|
|
67
|
+
out1 = restore(c1);
|
|
68
|
+
|
|
69
|
+
const c2 = capture();
|
|
70
|
+
printInstallLocations({});
|
|
71
|
+
out2 = restore(c2);
|
|
72
|
+
|
|
73
|
+
assert.equal(out1, out2, 'consecutive calls should produce identical output');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
console.log(' paths.test.mjs loaded — run with: node --test cli/install/paths.test.mjs');
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/install/plugin.mjs
|
|
3
|
+
*
|
|
4
|
+
* installPluginFromGlobal() — copied from cli/install.mjs (original ~220 lines).
|
|
5
|
+
* Installs the Bizar plugin from the global npm package into ~/.claude/plugins/bizar/.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import { existsSync, lstatSync, rmSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
import { resolveClaudeDir } from './paths.mjs';
|
|
13
|
+
|
|
14
|
+
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Install the Bizar MCP server from this package's own `plugins/bizar/`
|
|
18
|
+
* directory into `~/.claude/plugins/bizar/`.
|
|
19
|
+
*
|
|
20
|
+
* Symlink guard (v3.12.2): if the dest is a symlink (e.g. created by
|
|
21
|
+
* `bizar dev-link`), do NOT overwrite it. Pass `{ force: true }` to override.
|
|
22
|
+
*
|
|
23
|
+
* node_modules copy: the plugin imports `@polderlabs/bizar-sdk`. After copying
|
|
24
|
+
* the plugin files, this function also copies the source `node_modules/` to the
|
|
25
|
+
* deployed `node_modules/` so Bun can resolve the import.
|
|
26
|
+
*
|
|
27
|
+
* Returns `true` if the plugin was installed (or already in place),
|
|
28
|
+
* `false` otherwise. Never throws.
|
|
29
|
+
*/
|
|
30
|
+
export async function installPluginFromGlobal(opts = {}) {
|
|
31
|
+
const { mkdir, readdir, copyFile } = await import('node:fs/promises');
|
|
32
|
+
|
|
33
|
+
const destDir = join(resolveClaudeDir(), 'plugins', 'bizar');
|
|
34
|
+
let destIsSymlink = false;
|
|
35
|
+
try {
|
|
36
|
+
destIsSymlink = lstatSync(destDir).isSymbolicLink();
|
|
37
|
+
} catch {
|
|
38
|
+
// doesn't exist yet — fine
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (destIsSymlink) {
|
|
42
|
+
if (opts.silent) return true;
|
|
43
|
+
console.log(chalk.yellow(' ⚠ ~/.claude/plugins/bizar is a dev symlink — skipping copy.'));
|
|
44
|
+
console.log(chalk.dim(' Run `bizar dev-unlink` to restore the deployed copy, or pass --force to overwrite.'));
|
|
45
|
+
if (!opts.force) return false;
|
|
46
|
+
rmSync(destDir, { force: true });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let pluginPath;
|
|
50
|
+
if (opts.sourceDir) {
|
|
51
|
+
pluginPath = opts.sourceDir;
|
|
52
|
+
} else {
|
|
53
|
+
pluginPath = join(__dirname, '..', '..', 'plugins', 'bizar');
|
|
54
|
+
}
|
|
55
|
+
if (!existsSync(pluginPath)) {
|
|
56
|
+
console.log(chalk.red(` ✗ Plugin source not found at ${pluginPath}`));
|
|
57
|
+
console.log(chalk.dim(' This package appears to be missing plugins/bizar/. Reinstall:'));
|
|
58
|
+
console.log(chalk.dim(' npm install -g @polderlabs/bizar --force'));
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const distEntry = join(pluginPath, 'dist', 'index.js');
|
|
63
|
+
if (!existsSync(distEntry)) {
|
|
64
|
+
try {
|
|
65
|
+
const { buildPlugin } = await import('../provision.mjs');
|
|
66
|
+
const buildRes = await buildPlugin();
|
|
67
|
+
if (buildRes.ok && !buildRes.skipped) {
|
|
68
|
+
console.log(chalk.dim(` auto-built plugin (${buildRes.message})`));
|
|
69
|
+
} else if (!buildRes.ok) {
|
|
70
|
+
console.log(chalk.yellow(` ⚠ Plugin auto-build failed: ${buildRes.message}`));
|
|
71
|
+
console.log(chalk.dim(' Run `bizar install` from a checkout, or:'));
|
|
72
|
+
console.log(chalk.dim(' npx tsc -p plugins/bizar/tsconfig.json'));
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
} catch (err) {
|
|
76
|
+
console.log(chalk.yellow(` ⚠ Plugin auto-build threw: ${err.message}`));
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
await mkdir(destDir, { recursive: true });
|
|
82
|
+
|
|
83
|
+
async function copyRecursive(srcDir, dstDir) {
|
|
84
|
+
const entries = await readdir(srcDir, { withFileTypes: true });
|
|
85
|
+
for (const entry of entries) {
|
|
86
|
+
const src = join(srcDir, entry.name);
|
|
87
|
+
const dst = join(dstDir, entry.name);
|
|
88
|
+
if (entry.isDirectory()) {
|
|
89
|
+
if (entry.name === 'node_modules' || entry.name === 'dist') continue;
|
|
90
|
+
await mkdir(dst, { recursive: true });
|
|
91
|
+
await copyRecursive(src, dst);
|
|
92
|
+
} else {
|
|
93
|
+
if (entry.name === '.DS_Store' || entry.name.endsWith('.log')) continue;
|
|
94
|
+
await copyFile(src, dst);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
await copyRecursive(pluginPath, destDir);
|
|
101
|
+
console.log(chalk.green(` ✓ Bizar plugin installed from global package`));
|
|
102
|
+
console.log(chalk.dim(` ${pluginPath} → ${destDir}`));
|
|
103
|
+
} catch (err) {
|
|
104
|
+
console.log(chalk.yellow(` ⚠ Failed to copy Bizar plugin: ${err.message}`));
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// node_modules copy — the plugin imports `@polderlabs/bizar-sdk`
|
|
109
|
+
try {
|
|
110
|
+
const srcNmDir = join(pluginPath, 'node_modules');
|
|
111
|
+
if (existsSync(srcNmDir)) {
|
|
112
|
+
const dstNmDir = join(destDir, 'node_modules');
|
|
113
|
+
let dstNmIsSymlink = false;
|
|
114
|
+
try {
|
|
115
|
+
dstNmIsSymlink = lstatSync(dstNmDir).isSymbolicLink();
|
|
116
|
+
} catch { /* doesn't exist — fine */ }
|
|
117
|
+
if (dstNmIsSymlink) {
|
|
118
|
+
console.log(chalk.yellow(` ⚠ ${dstNmDir} is a symlink — refusing to copy node_modules (remove manually).`));
|
|
119
|
+
} else {
|
|
120
|
+
const srcEntries = await readdir(srcNmDir, { withFileTypes: true });
|
|
121
|
+
await mkdir(dstNmDir, { recursive: true });
|
|
122
|
+
async function copyNodeModules(srcDir, dstDir) {
|
|
123
|
+
const entries = await readdir(srcDir, { withFileTypes: true });
|
|
124
|
+
for (const entry of entries) {
|
|
125
|
+
const src = join(srcDir, entry.name);
|
|
126
|
+
const dst = join(dstDir, entry.name);
|
|
127
|
+
if (entry.isDirectory()) {
|
|
128
|
+
await mkdir(dst, { recursive: true });
|
|
129
|
+
await copyNodeModules(src, dst);
|
|
130
|
+
} else {
|
|
131
|
+
await copyFile(src, dst);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
await copyNodeModules(srcNmDir, dstNmDir);
|
|
136
|
+
console.log(chalk.green(` ✓ copied node_modules (${srcEntries.length} packages) to deployed plugin`));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Wire runtime deps (zod, @anthropic-ai/claude-agent-sdk)
|
|
141
|
+
let pluginMain = null;
|
|
142
|
+
try {
|
|
143
|
+
const pkgPath = join(destDir, 'package.json');
|
|
144
|
+
const pkg = JSON.parse(await import('node:fs/promises').then(fs => fs.readFile(pkgPath, 'utf8')));
|
|
145
|
+
pluginMain = pkg.main;
|
|
146
|
+
} catch { /* missing or unreadable */ }
|
|
147
|
+
const needsWiring = typeof pluginMain === 'string' && pluginMain.endsWith('.ts');
|
|
148
|
+
if (needsWiring) {
|
|
149
|
+
try {
|
|
150
|
+
const { wirePluginRuntimeDeps } = await import('../plugin-runtime-deps.mjs');
|
|
151
|
+
await wirePluginRuntimeDeps(destDir);
|
|
152
|
+
} catch (err) {
|
|
153
|
+
console.log(chalk.dim(` ℹ Could not auto-wire runtime deps: ${err.message} (run \`bizar doctor\` to diagnose)`));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
} catch (err) {
|
|
157
|
+
console.log(chalk.yellow(` ⚠ Failed to copy node_modules: ${err.message}`));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/install/postinstall.mjs
|
|
3
|
+
*
|
|
4
|
+
* runPostInstall() — moved verbatim from cli/install.mjs (original ~95 lines).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { existsSync, mkdirSync, copyFileSync } from 'node:fs';
|
|
9
|
+
import { execSync } from 'node:child_process';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { resolveClaudeDir, PATHS } from './paths.mjs';
|
|
12
|
+
|
|
13
|
+
const AGENT_FILES = [
|
|
14
|
+
'odin.md', 'vor.md', 'frigg.md', 'quick.md',
|
|
15
|
+
'mimir.md', 'heimdall.md', 'hermod.md', 'thor.md', 'baldr.md',
|
|
16
|
+
'tyr.md', 'vidarr.md', 'forseti.md',
|
|
17
|
+
'semble-search.md',
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Post-install bootstrap: settings.json template, agents, Semble, Skills CLI.
|
|
22
|
+
* Called by the npm postinstall hook.
|
|
23
|
+
*/
|
|
24
|
+
export async function runPostInstall() {
|
|
25
|
+
const dest = join(resolveClaudeDir(), 'settings.json');
|
|
26
|
+
const templateSrc = join(PATHS.bizarHome, '..', 'config', 'settings.json');
|
|
27
|
+
|
|
28
|
+
// Copy settings.json template if not exists
|
|
29
|
+
if (!existsSync(dest)) {
|
|
30
|
+
if (existsSync(templateSrc)) {
|
|
31
|
+
mkdirSync(resolveClaudeDir(), { recursive: true });
|
|
32
|
+
copyFileSync(templateSrc, dest);
|
|
33
|
+
console.log(' ✓ settings.json bootstrapped from package template');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Ensure Claude config dir exists
|
|
38
|
+
const env = { exists: existsSync(resolveClaudeDir()) };
|
|
39
|
+
if (!env.exists) {
|
|
40
|
+
mkdirSync(resolveClaudeDir(), { recursive: true });
|
|
41
|
+
console.log(`BizarHarness: created ${resolveClaudeDir()}/`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
mkdirSync(PATHS.agentsDir, { recursive: true });
|
|
45
|
+
|
|
46
|
+
for (const file of AGENT_FILES) {
|
|
47
|
+
const src = join(PATHS.bizarHome, '..', 'config', 'agents', file);
|
|
48
|
+
const dst = join(PATHS.agentsDir, file);
|
|
49
|
+
if (!existsSync(dst)) {
|
|
50
|
+
copyFileSync(src, dst);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
console.log('BizarHarness: agents installed.');
|
|
54
|
+
|
|
55
|
+
// Install Semble
|
|
56
|
+
const seemeCmd = (cmd) => {
|
|
57
|
+
try {
|
|
58
|
+
execSync(`command -v ${cmd}`, { stdio: ['ignore', 'pipe', 'ignore'] });
|
|
59
|
+
return true;
|
|
60
|
+
} catch { return false; }
|
|
61
|
+
};
|
|
62
|
+
const semblePresent = seemeCmd('semble');
|
|
63
|
+
if (!semblePresent) {
|
|
64
|
+
console.log('BizarHarness: installing Semble (code search)...');
|
|
65
|
+
try {
|
|
66
|
+
const hasUv = seemeCmd('uv');
|
|
67
|
+
if (!hasUv) {
|
|
68
|
+
if (process.platform === 'win32') {
|
|
69
|
+
execSync('powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"', { stdio: 'pipe', timeout: 60000 });
|
|
70
|
+
} else {
|
|
71
|
+
execSync('curl -LsSf https://astral.sh/uv/install.sh | sh', { stdio: 'pipe', timeout: 60000 });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
execSync('uv tool install "semble[mcp]"', { stdio: 'pipe', timeout: 60000 });
|
|
75
|
+
console.log('BizarHarness: Semble installed.');
|
|
76
|
+
} catch {
|
|
77
|
+
console.log('BizarHarness: Semble install failed. Run `uv tool install "semble[mcp]"` manually.');
|
|
78
|
+
}
|
|
79
|
+
} else {
|
|
80
|
+
console.log('BizarHarness: Semble ready.');
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Install Skills CLI
|
|
84
|
+
const skillsPresent = seemeCmd('skills');
|
|
85
|
+
if (!skillsPresent) {
|
|
86
|
+
console.log('BizarHarness: installing Skills CLI...');
|
|
87
|
+
try {
|
|
88
|
+
execSync('npm install -g skills', { stdio: 'pipe', timeout: 30000 });
|
|
89
|
+
console.log('BizarHarness: Skills CLI installed.');
|
|
90
|
+
} catch {
|
|
91
|
+
console.log('BizarHarness: Skills CLI install failed. Run `npm install -g skills` manually.');
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
console.log('BizarHarness: Skills CLI ready.');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Install core skill pack
|
|
98
|
+
console.log('BizarHarness: installing core skills...');
|
|
99
|
+
try {
|
|
100
|
+
execSync('skills add vercel-labs/skills --all -y', { stdio: 'pipe', timeout: 60000 });
|
|
101
|
+
console.log('BizarHarness: core skills installed.');
|
|
102
|
+
} catch {
|
|
103
|
+
console.log('BizarHarness: core skill install skipped — run `skills add vercel-labs/skills --all -y` manually.');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Install Bizar plugin
|
|
107
|
+
const { installPluginFromGlobal } = await import('./plugin.mjs');
|
|
108
|
+
await installPluginFromGlobal();
|
|
109
|
+
|
|
110
|
+
console.log('Run `bizar` for interactive setup.');
|
|
111
|
+
}
|