@polderlabs/bizar 10.2.0 → 10.3.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-xXiUCZLB.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityFeed-JjmOY2AQ.js.map → ActivityFeed-xXiUCZLB.js.map} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-BIIMvGWo.js → ActivityView-nOYhCp3h.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-BIIMvGWo.js.map → ActivityView-nOYhCp3h.js.map} +1 -1
- package/bizar-dash/dist/assets/{AdminView-DRidJtkq.js → AdminView-Coi4V3sq.js} +1 -1
- package/bizar-dash/dist/assets/{AdminView-DRidJtkq.js.map → AdminView-Coi4V3sq.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-79l4SBMC.js → AgentActivity-nEri4lbx.js} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-79l4SBMC.js.map → AgentActivity-nEri4lbx.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentsView-0vT4uPSc.js → AgentsView-ByiIJ0ej.js} +3 -3
- package/bizar-dash/dist/assets/{AgentsView-0vT4uPSc.js.map → AgentsView-ByiIJ0ej.js.map} +1 -1
- package/bizar-dash/dist/assets/{Alert-CG5q_s75.js → Alert-Dg_Vwxh5.js} +1 -1
- package/bizar-dash/dist/assets/{Alert-CG5q_s75.js.map → Alert-Dg_Vwxh5.js.map} +1 -1
- package/bizar-dash/dist/assets/{ArtifactsView-DM8ZmpR9.js → ArtifactsView-CGclRNnz.js} +1 -1
- package/bizar-dash/dist/assets/{ArtifactsView-DM8ZmpR9.js.map → ArtifactsView-CGclRNnz.js.map} +1 -1
- package/bizar-dash/dist/assets/{AuthView-BveN94MC.js → AuthView-utVm6M3D.js} +1 -1
- package/bizar-dash/dist/assets/{AuthView-BveN94MC.js.map → AuthView-utVm6M3D.js.map} +1 -1
- package/bizar-dash/dist/assets/{Avatar-ulUPIYTd.js → Avatar-CXDZdKy4.js} +1 -1
- package/bizar-dash/dist/assets/{Avatar-ulUPIYTd.js.map → Avatar-CXDZdKy4.js.map} +1 -1
- package/bizar-dash/dist/assets/{BackgroundJobsView-BWErhqFo.js → BackgroundJobsView-j603pz6o.js} +1 -1
- package/bizar-dash/dist/assets/{BackgroundJobsView-BWErhqFo.js.map → BackgroundJobsView-j603pz6o.js.map} +1 -1
- package/bizar-dash/dist/assets/{BackupView-CnBjzG9N.js → BackupView-DgvnntTE.js} +1 -1
- package/bizar-dash/dist/assets/{BackupView-CnBjzG9N.js.map → BackupView-DgvnntTE.js.map} +1 -1
- package/bizar-dash/dist/assets/{Card-B0imhxMk.js → Card-D9019JOD.js} +1 -1
- package/bizar-dash/dist/assets/{Card-B0imhxMk.js.map → Card-D9019JOD.js.map} +1 -1
- package/bizar-dash/dist/assets/{ChatView-D6zGytzx.js → ChatView-C0cTgj5d.js} +1 -1
- package/bizar-dash/dist/assets/{ChatView-D6zGytzx.js.map → ChatView-C0cTgj5d.js.map} +1 -1
- package/bizar-dash/dist/assets/{Chip-wwZSGwLE.js → Chip-DQtalZ4y.js} +1 -1
- package/bizar-dash/dist/assets/{Chip-wwZSGwLE.js.map → Chip-DQtalZ4y.js.map} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-DK1sOLhi.js → ClaudeSessionsView-H3Bqjo6b.js} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-DK1sOLhi.js.map → ClaudeSessionsView-H3Bqjo6b.js.map} +1 -1
- package/bizar-dash/dist/assets/{ClipboardView-CZ2lYPr0.js → ClipboardView-BAguaKbx.js} +1 -1
- package/bizar-dash/dist/assets/{ClipboardView-CZ2lYPr0.js.map → ClipboardView-BAguaKbx.js.map} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-D-zT9eNA.js → ConfigView-DWHJgoe8.js} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-D-zT9eNA.js.map → ConfigView-DWHJgoe8.js.map} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-BocV68Lb.js → DiagnosticsView-oCT624hk.js} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-BocV68Lb.js.map → DiagnosticsView-oCT624hk.js.map} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-BVjPI5x7.js → DialogsView-CqHNals_.js} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-BVjPI5x7.js.map → DialogsView-CqHNals_.js.map} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-84gJcZwM.js → DoctorView-6kfQq_Mx.js} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-84gJcZwM.js.map → DoctorView-6kfQq_Mx.js.map} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-BjgVOrcO.js → EmptyState-DLmtBX_6.js} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-BjgVOrcO.js.map → EmptyState-DLmtBX_6.js.map} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsView-BJ2TEzF7.js → EnvVarsView-DySOXlP1.js} +2 -2
- package/bizar-dash/dist/assets/{EnvVarsView-BJ2TEzF7.js.map → EnvVarsView-DySOXlP1.js.map} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-BE3WBFqF.js → ErrorState-Bump8diE.js} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-BE3WBFqF.js.map → ErrorState-Bump8diE.js.map} +1 -1
- package/bizar-dash/dist/assets/{EvalView-BJJ2P-kK.js → EvalView-FnZ5d93z.js} +1 -1
- package/bizar-dash/dist/assets/{EvalView-BJJ2P-kK.js.map → EvalView-FnZ5d93z.js.map} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-pwROHApi.js → GoalsView-C4m1WnVv.js} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-pwROHApi.js.map → GoalsView-C4m1WnVv.js.map} +1 -1
- package/bizar-dash/dist/assets/{Grid-qcvbhx6e.js → Grid-dEnoGGws.js} +1 -1
- package/bizar-dash/dist/assets/{Grid-qcvbhx6e.js.map → Grid-dEnoGGws.js.map} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-C7SSOLJA.js → HistoryView-xdRybjZ2.js} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-C7SSOLJA.js.map → HistoryView-xdRybjZ2.js.map} +1 -1
- package/bizar-dash/dist/assets/{Input-Bgzxf_Hu.js → Input-BSa3lh_-.js} +1 -1
- package/bizar-dash/dist/assets/{Input-Bgzxf_Hu.js.map → Input-BSa3lh_-.js.map} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-CbFFksox.js → LibrariesView-1zR04Eci.js} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-CbFFksox.js.map → LibrariesView-1zR04Eci.js.map} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-BqDrJbRq.js → LightRAGView-PubmA9oL.js} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-BqDrJbRq.js.map → LightRAGView-PubmA9oL.js.map} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-TjPJrUfY.js → ListHeader-Ak9WJd39.js} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-TjPJrUfY.js.map → ListHeader-Ak9WJd39.js.map} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-BlTeHLhX.js → MemoryView-DBGpuETw.js} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-BlTeHLhX.js.map → MemoryView-DBGpuETw.js.map} +1 -1
- package/bizar-dash/dist/assets/MiscView-DufqBHkX.js +1 -0
- package/bizar-dash/dist/assets/{MiscView-B8QY82Pm.js.map → MiscView-DufqBHkX.js.map} +1 -1
- package/bizar-dash/dist/assets/{ModsView-CvW1OWts.js → ModsView-DcX6eVU2.js} +2 -2
- package/bizar-dash/dist/assets/{ModsView-CvW1OWts.js.map → ModsView-DcX6eVU2.js.map} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-CsBt5U7x.js → NotificationsView-B8IhHRQC.js} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-CsBt5U7x.js.map → NotificationsView-B8IhHRQC.js.map} +1 -1
- package/bizar-dash/dist/assets/ObsidianView-DEuk65zS.js +1 -0
- package/bizar-dash/dist/assets/{ObsidianView-BCTejEj2.js.map → ObsidianView-DEuk65zS.js.map} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-BsuPxwnB.js → OverviewView-CTI2spTd.js} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-BsuPxwnB.js.map → OverviewView-CTI2spTd.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-DlZTETEn.js → ProgressBar-D3lkz42E.js} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-DlZTETEn.js.map → ProgressBar-D3lkz42E.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-Soxtmpet.js → ProjectsView-Du0LzE7A.js} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-Soxtmpet.js.map → ProjectsView-Du0LzE7A.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-DaCEV9pM.js → ProvidersView-5bCgXwBo.js} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-DaCEV9pM.js.map → ProvidersView-5bCgXwBo.js.map} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-DY2ByBj_.js → SchedulesView-DFHdIz5P.js} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-DY2ByBj_.js.map → SchedulesView-DFHdIz5P.js.map} +1 -1
- package/bizar-dash/dist/assets/{Select-Dbd88_n8.js → Select-C8EJj4NM.js} +1 -1
- package/bizar-dash/dist/assets/{Select-Dbd88_n8.js.map → Select-C8EJj4NM.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-CLMNd434.js → SettingsRow-BdOOmYMD.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-CLMNd434.js.map → SettingsRow-BdOOmYMD.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-b24oFq9x.js → SettingsView-CqwQ6Knv.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-b24oFq9x.js.map → SettingsView-CqwQ6Knv.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sheet-DnDid58j.js → Sheet-Cztsvgse.js} +1 -1
- package/bizar-dash/dist/assets/{Sheet-DnDid58j.js.map → Sheet-Cztsvgse.js.map} +1 -1
- package/bizar-dash/dist/assets/{Slider-BJCvKI1I.js → Slider-BexNfF6K.js} +1 -1
- package/bizar-dash/dist/assets/{Slider-BJCvKI1I.js.map → Slider-BexNfF6K.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-ktqQLdyb.js → Sparkline-CLZBtvsN.js} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-ktqQLdyb.js.map → Sparkline-CLZBtvsN.js.map} +1 -1
- package/bizar-dash/dist/assets/{Switch-CwXfsDii.js → Switch-B1tiRwNK.js} +1 -1
- package/bizar-dash/dist/assets/{Switch-CwXfsDii.js.map → Switch-B1tiRwNK.js.map} +1 -1
- package/bizar-dash/dist/assets/{TasksView-BHmpzFCf.js → TasksView-CT0fPlos.js} +1 -1
- package/bizar-dash/dist/assets/{TasksView-BHmpzFCf.js.map → TasksView-CT0fPlos.js.map} +1 -1
- package/bizar-dash/dist/assets/{Textarea-BzIAwSlp.js → Textarea-D_TPpVMy.js} +1 -1
- package/bizar-dash/dist/assets/{Textarea-BzIAwSlp.js.map → Textarea-D_TPpVMy.js.map} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-CSmX9NN0.js → UpdateView-tD2q2OhW.js} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-CSmX9NN0.js.map → UpdateView-tD2q2OhW.js.map} +1 -1
- package/bizar-dash/dist/assets/{UsageView-COyr_Gfi.js → UsageView-B4BuAFKA.js} +1 -1
- package/bizar-dash/dist/assets/{UsageView-COyr_Gfi.js.map → UsageView-B4BuAFKA.js.map} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BzYZ3m-e.js → ViewHeader-V_SzbUpw.js} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BzYZ3m-e.js.map → ViewHeader-V_SzbUpw.js.map} +1 -1
- package/bizar-dash/dist/assets/{VoiceView-D33_xG5t.js → VoiceView-D3vb5OM2.js} +1 -1
- package/bizar-dash/dist/assets/{VoiceView-D33_xG5t.js.map → VoiceView-D3vb5OM2.js.map} +1 -1
- package/bizar-dash/dist/assets/{brain-CM-Vls8r.js → brain-BmfWcitQ.js} +1 -1
- package/bizar-dash/dist/assets/{brain-CM-Vls8r.js.map → brain-BmfWcitQ.js.map} +1 -1
- package/bizar-dash/dist/assets/{calendar-C0lgZk69.js → calendar-VntJUzFB.js} +1 -1
- package/bizar-dash/dist/assets/{calendar-C0lgZk69.js.map → calendar-VntJUzFB.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-Bx_hQEBC.js → circle-KrQQySeK.js} +1 -1
- package/bizar-dash/dist/assets/{circle-Bx_hQEBC.js.map → circle-KrQQySeK.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-DHvsqpw5.js → circle-alert-CQ9MLygI.js} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-DHvsqpw5.js.map → circle-alert-CQ9MLygI.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-check-Bx8wmXR9.js → circle-check-COtVgsWw.js} +1 -1
- package/bizar-dash/dist/assets/{circle-check-Bx8wmXR9.js.map → circle-check-COtVgsWw.js.map} +1 -1
- package/bizar-dash/dist/assets/{clock-CejGoecX.js → clock-C0GlM4qp.js} +1 -1
- package/bizar-dash/dist/assets/{clock-CejGoecX.js.map → clock-C0GlM4qp.js.map} +1 -1
- package/bizar-dash/dist/assets/{download-4cEUWue1.js → download-CW4DmtRe.js} +1 -1
- package/bizar-dash/dist/assets/{download-4cEUWue1.js.map → download-CW4DmtRe.js.map} +1 -1
- package/bizar-dash/dist/assets/{external-link-0NqUhI4i.js → external-link-CAOnh_DH.js} +1 -1
- package/bizar-dash/dist/assets/{external-link-0NqUhI4i.js.map → external-link-CAOnh_DH.js.map} +1 -1
- package/bizar-dash/dist/assets/{file-text-yEMkrSoZ.js → file-text-CS1jB_oV.js} +1 -1
- package/bizar-dash/dist/assets/{file-text-yEMkrSoZ.js.map → file-text-CS1jB_oV.js.map} +1 -1
- package/bizar-dash/dist/assets/{filter-BXt60zAS.js → filter-DyQbml3L.js} +1 -1
- package/bizar-dash/dist/assets/{filter-BXt60zAS.js.map → filter-DyQbml3L.js.map} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-BjG5lNtR.js → git-pull-request-Co6gYfba.js} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-BjG5lNtR.js.map → git-pull-request-Co6gYfba.js.map} +1 -1
- package/bizar-dash/dist/assets/{main-CokHAXWM.js → main-CyAIirBB.js} +28 -33
- package/bizar-dash/dist/assets/main-CyAIirBB.js.map +1 -0
- package/bizar-dash/dist/assets/network-CDn43Gsj.js +6 -0
- package/bizar-dash/dist/assets/network-CDn43Gsj.js.map +1 -0
- package/bizar-dash/dist/assets/{pause-CAmulU0F.js → pause-CKYjSTGX.js} +1 -1
- package/bizar-dash/dist/assets/{pause-CAmulU0F.js.map → pause-CKYjSTGX.js.map} +1 -1
- package/bizar-dash/dist/assets/{pencil-eq5IqBmU.js → pencil-BUJ2DpWs.js} +1 -1
- package/bizar-dash/dist/assets/{pencil-eq5IqBmU.js.map → pencil-BUJ2DpWs.js.map} +1 -1
- package/bizar-dash/dist/assets/{play-BoLrrcBA.js → play-CGxZWqtW.js} +1 -1
- package/bizar-dash/dist/assets/{play-BoLrrcBA.js.map → play-CGxZWqtW.js.map} +1 -1
- package/bizar-dash/dist/assets/{plug-DBrVM9lK.js → plug-CQYGgGSy.js} +1 -1
- package/bizar-dash/dist/assets/{plug-DBrVM9lK.js.map → plug-CQYGgGSy.js.map} +1 -1
- package/bizar-dash/dist/assets/{plus-DENm0hqV.js → plus-fFxt-8z5.js} +1 -1
- package/bizar-dash/dist/assets/{plus-DENm0hqV.js.map → plus-fFxt-8z5.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-DLjXF7zE.js → power-Cjgy2KsI.js} +1 -1
- package/bizar-dash/dist/assets/{power-DLjXF7zE.js.map → power-Cjgy2KsI.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-off-D47cOnG_.js → power-off-B81hLRah.js} +1 -1
- package/bizar-dash/dist/assets/{power-off-D47cOnG_.js.map → power-off-B81hLRah.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-DNrXX9gB.js → refresh-ccw-BCXx86xp.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-DNrXX9gB.js.map → refresh-ccw-BCXx86xp.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-CoAHDpeS.js → refresh-cw-COTg1nZo.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-CoAHDpeS.js.map → refresh-cw-COTg1nZo.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-ObX5awaG.js → rotate-ccw-BZrEVc0Z.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-ObX5awaG.js.map → rotate-ccw-BZrEVc0Z.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-xpPJw9LP.js → rotate-cw-CsTtaLV2.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-xpPJw9LP.js.map → rotate-cw-CsTtaLV2.js.map} +1 -1
- package/bizar-dash/dist/assets/{save-D1iKiJJl.js → save-DtMTge1F.js} +1 -1
- package/bizar-dash/dist/assets/{save-D1iKiJJl.js.map → save-DtMTge1F.js.map} +1 -1
- package/bizar-dash/dist/assets/{send-BRcAhZUm.js → send-DyBhyk8t.js} +1 -1
- package/bizar-dash/dist/assets/{send-BRcAhZUm.js.map → send-DyBhyk8t.js.map} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-C6vEcK-g.js → shield-alert-BPGJlRF8.js} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-C6vEcK-g.js.map → shield-alert-BPGJlRF8.js.map} +1 -1
- package/bizar-dash/dist/assets/{trash-2-DZDjEnNh.js → trash-2-2NsyTU8c.js} +1 -1
- package/bizar-dash/dist/assets/{trash-2-DZDjEnNh.js.map → trash-2-2NsyTU8c.js.map} +1 -1
- package/bizar-dash/dist/assets/{trending-up-DMj-AJVf.js → trending-up-BXwP23VK.js} +1 -1
- package/bizar-dash/dist/assets/{trending-up-DMj-AJVf.js.map → trending-up-BXwP23VK.js.map} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-_2xe_tl4.js → triangle-alert-DFmQ_RXN.js} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-_2xe_tl4.js.map → triangle-alert-DFmQ_RXN.js.map} +1 -1
- package/bizar-dash/dist/assets/{upload-DdDljAeV.js → upload-Cj-HYRYV.js} +1 -1
- package/bizar-dash/dist/assets/{upload-DdDljAeV.js.map → upload-Cj-HYRYV.js.map} +1 -1
- package/bizar-dash/dist/assets/{zap-mHsgh0FP.js → zap-BaOiybcl.js} +1 -1
- package/bizar-dash/dist/assets/{zap-mHsgh0FP.js.map → zap-BaOiybcl.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/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 +0 -1
- 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/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/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
package/cli/install.mjs
CHANGED
|
@@ -1,606 +1,19 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { existsSync, lstatSync, rmSync } from 'node:fs';
|
|
3
|
-
import { join, dirname } from 'node:path';
|
|
4
|
-
import { fileURLToPath } from 'node:url';
|
|
5
|
-
|
|
6
|
-
// ── ESM `__dirname` polyfill ────────────────────────────────────────────────
|
|
7
|
-
// `__dirname` is a CommonJS global. ESM modules don't have it. We define it
|
|
8
|
-
// at module scope so all functions in this file can use it without each
|
|
9
|
-
// having to recreate the polyfill. (v4.2.3 — previously only `runInstaller`
|
|
10
|
-
// had it, which caused the legacy `promptAndInstallOptional` bootstrap
|
|
11
|
-
// to crash with `ERR_AMBIGUOUS_MODULE_SYNTAX`. v6.1.0 — that helper
|
|
12
|
-
// has been removed; `__dirname` is still used by `runPostInstall` for
|
|
13
|
-
// the same reason.)
|
|
14
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
15
|
-
|
|
16
|
-
import { showBanner, showPantheon, sectionHeading } from './banner.mjs';
|
|
17
|
-
import { promptComponents, promptInstallMode, promptAgents, promptSkillPacks, promptApiKeys, promptConfirmInstall, promptRestartCline } from './prompts.mjs';
|
|
18
|
-
import { detectClaude, detectSemble, detectSkillsCli, detectUv, buildSummary, claudeAgentsDir, claudeConfigDir, repoPath } from './utils.mjs';
|
|
19
|
-
import { installAgents, installAgentsMd, installSkill, installClineJson, installBizarFolder, installPluginBizar, installSemble, installSkillsCli, installCuratedSkills, installRules, installHooks, installCommands, installCommandsBizar, mergeToolsIntoUserConfig } from './copy.mjs';
|
|
20
|
-
|
|
21
|
-
const AGENT_FILES = [
|
|
22
|
-
'odin.md', 'vor.md', 'frigg.md', 'quick.md',
|
|
23
|
-
'mimir.md', 'heimdall.md', 'hermod.md', 'thor.md', 'baldr.md',
|
|
24
|
-
'tyr.md', 'vidarr.md', 'forseti.md',
|
|
25
|
-
'semble-search.md',
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Install the Bizar MCP server from this package's own `plugins/bizar/`
|
|
30
|
-
* directory into `~/.claude/plugins/bizar/`.
|
|
31
|
-
*
|
|
32
|
-
* v6.3.0 — Bizar is Claude Code-native. The plugin entry-point still
|
|
33
|
-
* ships at `plugins/bizar/` as a back-compat shim that re-exports the
|
|
34
|
-
* SDK; the actual MCP server lives in `packages/sdk/src/mcp/bin.ts`.
|
|
35
|
-
*
|
|
36
|
-
* v4.0.0 consolidated everything into one npm package, so the plugin
|
|
37
|
-
* source ships with `@polderlabs/bizar` itself — no separate
|
|
38
|
-
* `@polderlabs/bizar-plugin` package, no git clone, no fresh checkout.
|
|
39
|
-
*
|
|
40
|
-
* Symlink guard (v3.12.2): if the dest is a symlink (e.g. created by
|
|
41
|
-
* `bizar dev-link`), do NOT overwrite it. The copy below would otherwise
|
|
42
|
-
* dereference the symlink and silently turn it back into a real directory,
|
|
43
|
-
* breaking the dev workflow. Pass `{ force: true }` to override (after
|
|
44
|
-
* confirming the user really wants the deployed copy back).
|
|
45
|
-
*
|
|
46
|
-
* node_modules copy: the plugin imports `@polderlabs/bizar-sdk`, a
|
|
47
|
-
* workspace-internal package not on the public registry. After copying
|
|
48
|
-
* the plugin files, this function ALSO copies the source's `node_modules/`
|
|
49
|
-
* to the deployed `node_modules/` so Bun can resolve the import when the
|
|
50
|
-
* plugin is loaded from `~/.claude/plugins/bizar/`. Without this, the
|
|
51
|
-
* plugin silently fails to load.
|
|
52
|
-
*
|
|
53
|
-
* Pass `{ silent: true }` to suppress the warning prints; the function
|
|
54
|
-
* still returns `true` if the dest is already in the desired state.
|
|
55
|
-
*
|
|
56
|
-
* Pass `{ sourceDir: '/path/to/fake' }` (test seam) to drive the function
|
|
57
|
-
* against a controlled filesystem without touching the real install.
|
|
58
|
-
*
|
|
59
|
-
* Returns `true` if the plugin was installed (or already in place),
|
|
60
|
-
* `false` otherwise. Never throws.
|
|
61
|
-
*/
|
|
62
|
-
export async function installPluginFromGlobal(opts = {}) {
|
|
63
|
-
const { mkdir, readdir, copyFile } = await import('node:fs/promises');
|
|
64
|
-
const { join } = await import('node:path');
|
|
65
|
-
|
|
66
|
-
// ── Symlink guard ───────────────────────────────────────────────────────────
|
|
67
|
-
// If dest is a symlink (created by `bizar dev-link`), don't overwrite it.
|
|
68
|
-
// A plain copy would dereference the symlink and silently break the
|
|
69
|
-
// dev workflow. Print a hint unless silent, or honour an explicit
|
|
70
|
-
// --force from the caller.
|
|
71
|
-
const destDir = join(claudeConfigDir(), 'plugins', 'bizar');
|
|
72
|
-
let destIsSymlink = false;
|
|
73
|
-
try {
|
|
74
|
-
destIsSymlink = lstatSync(destDir).isSymbolicLink();
|
|
75
|
-
} catch {
|
|
76
|
-
// doesn't exist yet — fine
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (destIsSymlink) {
|
|
80
|
-
if (opts.silent) {
|
|
81
|
-
// Called from dev-unlink, which has already removed the symlink.
|
|
82
|
-
// If we somehow still see one here, treat as "already restored".
|
|
83
|
-
return true;
|
|
84
|
-
}
|
|
85
|
-
console.log(
|
|
86
|
-
chalk.yellow(
|
|
87
|
-
' ⚠ ~/.claude/plugins/bizar is a dev symlink — skipping copy.',
|
|
88
|
-
),
|
|
89
|
-
);
|
|
90
|
-
console.log(
|
|
91
|
-
chalk.dim(
|
|
92
|
-
' Run `bizar dev-unlink` to restore the deployed copy, or pass --force to overwrite.',
|
|
93
|
-
),
|
|
94
|
-
);
|
|
95
|
-
if (!opts.force) return false;
|
|
96
|
-
rmSync(destDir, { force: true });
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// ── Resolve source path ─────────────────────────────────────────────────────
|
|
100
|
-
// v4.4.5 — the plugin ships inside this package at <pkg>/plugins/bizar/.
|
|
101
|
-
// No separate npm package, no git clone.
|
|
102
|
-
let pluginPath;
|
|
103
|
-
if (opts.sourceDir) {
|
|
104
|
-
pluginPath = opts.sourceDir;
|
|
105
|
-
} else {
|
|
106
|
-
// __dirname is `<pkg>/cli/`, so ../plugins/bizar is the canonical source.
|
|
107
|
-
pluginPath = join(__dirname, '..', 'plugins', 'bizar');
|
|
108
|
-
}
|
|
109
|
-
if (!existsSync(pluginPath)) {
|
|
110
|
-
console.log(chalk.red(` ✗ Plugin source not found at ${pluginPath}`));
|
|
111
|
-
console.log(chalk.dim(' This package appears to be missing plugins/bizar/. Reinstall:'));
|
|
112
|
-
console.log(chalk.dim(' npm install -g @polderlabs/bizar --force'));
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// ── Auto-build: if src exists but dist/ does not, run the tsc build ──
|
|
117
|
-
// v8.0.2 — fresh npm installs ship only `plugins/bizar/index.ts` and no
|
|
118
|
-
// compiled entry. The plugin loader previously bailed here with the
|
|
119
|
-
// misleading "Plugin source not found" message even though the directory
|
|
120
|
-
// was present; the real blocker was the missing compiled output. Try to
|
|
121
|
-
// build once before giving up. Best-effort: build failures keep the old
|
|
122
|
-
// error path (still false return) so the user gets a clear next step.
|
|
123
|
-
const distEntry = join(pluginPath, 'dist', 'index.js');
|
|
124
|
-
if (!existsSync(distEntry)) {
|
|
125
|
-
try {
|
|
126
|
-
const { buildPlugin } = await import('./provision-claude.mjs');
|
|
127
|
-
const buildRes = await buildPlugin();
|
|
128
|
-
if (buildRes.ok && !buildRes.skipped) {
|
|
129
|
-
console.log(chalk.dim(` auto-built plugin (${buildRes.message})`));
|
|
130
|
-
} else if (!buildRes.ok) {
|
|
131
|
-
console.log(chalk.yellow(` ⚠ Plugin auto-build failed: ${buildRes.message}`));
|
|
132
|
-
console.log(chalk.dim(' Run `bizar install` from a checkout, or:'));
|
|
133
|
-
console.log(chalk.dim(' npx tsc -p plugins/bizar/tsconfig.json'));
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
} catch (err) {
|
|
137
|
-
console.log(chalk.yellow(` ⚠ Plugin auto-build threw: ${err.message}`));
|
|
138
|
-
return false;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
await mkdir(destDir, { recursive: true });
|
|
143
|
-
|
|
144
|
-
async function copyRecursive(srcDir, dstDir) {
|
|
145
|
-
const entries = await readdir(srcDir, { withFileTypes: true });
|
|
146
|
-
for (const entry of entries) {
|
|
147
|
-
const src = join(srcDir, entry.name);
|
|
148
|
-
const dst = join(dstDir, entry.name);
|
|
149
|
-
if (entry.isDirectory()) {
|
|
150
|
-
if (entry.name === 'node_modules' || entry.name === 'dist') continue;
|
|
151
|
-
await mkdir(dst, { recursive: true });
|
|
152
|
-
await copyRecursive(src, dst);
|
|
153
|
-
} else {
|
|
154
|
-
if (entry.name === '.DS_Store' || entry.name.endsWith('.log')) continue;
|
|
155
|
-
await copyFile(src, dst);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
try {
|
|
161
|
-
await copyRecursive(pluginPath, destDir);
|
|
162
|
-
console.log(chalk.green(` ✓ Bizar plugin installed from global package`));
|
|
163
|
-
console.log(chalk.dim(` ${pluginPath} → ${destDir}`));
|
|
164
|
-
} catch (err) {
|
|
165
|
-
console.log(chalk.yellow(` ⚠ Failed to copy Bizar plugin: ${err.message}`));
|
|
166
|
-
return false;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// ── node_modules copy ───────────────────────────────────────────────────────
|
|
170
|
-
// The plugin imports `@polderlabs/bizar-sdk`, a workspace-internal package
|
|
171
|
-
// not on the public registry. The npm source bundles the SDK into its
|
|
172
|
-
// own `node_modules/`, so loading from `$(npm root -g)/...` resolves
|
|
173
|
-
// correctly. The deployed copy at `~/.config/cline/plugins/bizar/`
|
|
174
|
-
// has no `node_modules`, so Bun can't resolve the import — without this
|
|
175
|
-
// copy the plugin silently fails to load. This used to be papered over
|
|
176
|
-
// by a manual `cp -r $(npm root -g)/.../node_modules ~/.config/...` step
|
|
177
|
-
// that got wiped every time `bizar update` re-ran the outer copy. Doing
|
|
178
|
-
// it here makes the fix durable across updates.
|
|
179
|
-
//
|
|
180
|
-
// Semantics: mirror `cp -r` — merge into dest if it exists as a real
|
|
181
|
-
// directory (overwrite same-named files, don't delete extras), error
|
|
182
|
-
// if dest is a symlink (don't dereference through it). Idempotent —
|
|
183
|
-
// running twice never breaks; files whose contents already match are
|
|
184
|
-
// rewritten byte-identically.
|
|
185
|
-
try {
|
|
186
|
-
const srcNmDir = join(pluginPath, 'node_modules');
|
|
187
|
-
if (existsSync(srcNmDir)) {
|
|
188
|
-
const dstNmDir = join(destDir, 'node_modules');
|
|
189
|
-
let dstIsSymlink = false;
|
|
190
|
-
try {
|
|
191
|
-
dstIsSymlink = lstatSync(dstNmDir).isSymbolicLink();
|
|
192
|
-
} catch {
|
|
193
|
-
// doesn't exist — fine, we'll create it below
|
|
194
|
-
}
|
|
195
|
-
if (dstIsSymlink) {
|
|
196
|
-
console.log(
|
|
197
|
-
chalk.yellow(
|
|
198
|
-
` ⚠ ${dstNmDir} is a symlink — refusing to copy node_modules (remove manually).`,
|
|
199
|
-
),
|
|
200
|
-
);
|
|
201
|
-
} else {
|
|
202
|
-
// Top-level entry count (matches `npm ls --depth=0`) — gives the
|
|
203
|
-
// user a sense of what was bundled. e.g. "copied node_modules
|
|
204
|
-
// (25 packages) to deployed plugin".
|
|
205
|
-
const srcEntries = await readdir(srcNmDir, { withFileTypes: true });
|
|
206
|
-
await mkdir(dstNmDir, { recursive: true });
|
|
207
|
-
async function copyNodeModules(srcDir, dstDir) {
|
|
208
|
-
const entries = await readdir(srcDir, { withFileTypes: true });
|
|
209
|
-
for (const entry of entries) {
|
|
210
|
-
const src = join(srcDir, entry.name);
|
|
211
|
-
const dst = join(dstDir, entry.name);
|
|
212
|
-
if (entry.isDirectory()) {
|
|
213
|
-
await mkdir(dst, { recursive: true });
|
|
214
|
-
await copyNodeModules(src, dst);
|
|
215
|
-
} else {
|
|
216
|
-
await copyFile(src, dst);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
await copyNodeModules(srcNmDir, dstNmDir);
|
|
221
|
-
console.log(
|
|
222
|
-
chalk.green(
|
|
223
|
-
` ✓ copied node_modules (${srcEntries.length} packages) to deployed plugin`,
|
|
224
|
-
),
|
|
225
|
-
);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Wire runtime deps (`zod` plus `@anthropic-ai/claude-agent-sdk`)
|
|
230
|
-
// into the deployed plugin's `node_modules/`.
|
|
231
|
-
// Bun's module resolver walks up from the plugin entry point
|
|
232
|
-
// looking for `node_modules/`, and without entries there the
|
|
233
|
-
// plugin throws `Cannot find module 'zod'` at startup.
|
|
234
|
-
//
|
|
235
|
-
// The resolution logic lives in `cli/plugin-runtime-deps.mjs` and
|
|
236
|
-
// is shared with the modern provisioner (`cli/provision.mjs`). It
|
|
237
|
-
// searches the Bizar npm pkg's own `node_modules/`, then the
|
|
238
|
-
// `cline` npm pkg's `node_modules/`, then the dev source tree.
|
|
239
|
-
// Symlinks are preferred; recursive copy is the fallback.
|
|
240
|
-
//
|
|
241
|
-
// Only needed for the in-source plugin (main = "./index.ts"). The
|
|
242
|
-
// published npm package has main = "./dist/index.js" (bundled, no
|
|
243
|
-
// runtime resolution needed). Skip silently if the plugin uses the
|
|
244
|
-
// bundled entry point.
|
|
245
|
-
let pluginMain = null;
|
|
246
|
-
try {
|
|
247
|
-
const pkgPath = join(destDir, 'package.json');
|
|
248
|
-
const pkg = JSON.parse(
|
|
249
|
-
await import('node:fs/promises').then((fs) => fs.readFile(pkgPath, 'utf8')),
|
|
250
|
-
);
|
|
251
|
-
pluginMain = pkg.main;
|
|
252
|
-
} catch {
|
|
253
|
-
// missing or unreadable — fall through; we'll skip the wiring.
|
|
254
|
-
}
|
|
255
|
-
const needsWiring =
|
|
256
|
-
typeof pluginMain === 'string' && pluginMain.endsWith('.ts');
|
|
257
|
-
if (needsWiring) {
|
|
258
|
-
try {
|
|
259
|
-
const { wirePluginRuntimeDeps } = await import(
|
|
260
|
-
'./plugin-runtime-deps.mjs'
|
|
261
|
-
);
|
|
262
|
-
await wirePluginRuntimeDeps(destDir);
|
|
263
|
-
} catch (err) {
|
|
264
|
-
console.log(
|
|
265
|
-
chalk.dim(
|
|
266
|
-
` ℹ Could not auto-wire runtime deps: ${err.message} ` +
|
|
267
|
-
`(run \`bizar doctor\` to diagnose)`,
|
|
268
|
-
),
|
|
269
|
-
);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
} catch (err) {
|
|
273
|
-
console.log(chalk.yellow(` ⚠ Failed to copy node_modules: ${err.message}`));
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
return true;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
1
|
/**
|
|
280
|
-
*
|
|
2
|
+
* cli/install.mjs
|
|
281
3
|
*
|
|
282
|
-
*
|
|
283
|
-
*
|
|
284
|
-
*
|
|
285
|
-
* owned by `cli/provision.mjs:runProvision`. This file just parses the
|
|
286
|
-
* flags and forwards.
|
|
4
|
+
* v10.0.0 — Back-compat shim. The real implementation lives under cli/install/.
|
|
5
|
+
* Re-exports the public API so external callers (npm postinstall hook,
|
|
6
|
+
* bizarre install/update CLI commands) keep working without modification.
|
|
287
7
|
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
*
|
|
291
|
-
*
|
|
8
|
+
* New code should import from the submodules directly:
|
|
9
|
+
* cli/install/index.mjs — runInstaller()
|
|
10
|
+
* cli/install/plugin.mjs — installPluginFromGlobal()
|
|
11
|
+
* cli/install/postinstall.mjs — runPostInstall()
|
|
292
12
|
*/
|
|
293
|
-
export async function runInstaller(opts = {}) {
|
|
294
|
-
const { runProvision } = await import('./provision.mjs');
|
|
295
|
-
return runProvision({ ...opts, mode: 'install' });
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// ── Interactive prompts for optional packages ─────────────────────────────────
|
|
299
|
-
|
|
300
|
-
import { execSync } from 'node:child_process';
|
|
301
|
-
import { createInterface } from 'node:readline/promises';
|
|
302
|
-
import { stdin, stdout } from 'node:process';
|
|
303
|
-
|
|
304
|
-
async function promptYesNo(question, defaultYes = true) {
|
|
305
|
-
// If not a TTY (CI, automated install), skip the prompt
|
|
306
|
-
if (!stdin.isTTY || !stdout.isTTY) {
|
|
307
|
-
return false;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
const rl = createInterface({ input: stdin, output: stdout });
|
|
311
|
-
try {
|
|
312
|
-
const hint = defaultYes ? '[Y/n]' : '[y/N]';
|
|
313
|
-
const answer = (await rl.question(` ${question} ${hint}: `)).trim().toLowerCase();
|
|
314
|
-
rl.close();
|
|
315
|
-
|
|
316
|
-
if (answer === '') return defaultYes;
|
|
317
|
-
if (['y', 'yes'].includes(answer)) return true;
|
|
318
|
-
if (['n', 'no'].includes(answer)) return false;
|
|
319
|
-
return defaultYes;
|
|
320
|
-
} catch {
|
|
321
|
-
rl.close();
|
|
322
|
-
return false;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
async function isPackageInstalled(name) {
|
|
327
|
-
try {
|
|
328
|
-
const globalRoot = execSync('npm root -g', { encoding: 'utf8' }).trim();
|
|
329
|
-
return existsSync(join(globalRoot, ...name.split('/'), 'package.json'));
|
|
330
|
-
} catch {
|
|
331
|
-
return false;
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
async function promptGraphifyInstall() {
|
|
336
|
-
const { spawnSync, execSync } = await import('node:child_process');
|
|
337
|
-
|
|
338
|
-
console.log();
|
|
339
|
-
sectionHeading('Knowledge Graph (graphify)');
|
|
340
|
-
|
|
341
|
-
// 1. Detect graphify already installed. Windows users typically have
|
|
342
|
-
// `py` on PATH (the Python launcher) rather than `python3`, so probe
|
|
343
|
-
// the right binary per platform. A failed probe just means we will
|
|
344
|
-
// prompt to install below.
|
|
345
|
-
const pythonBin = process.platform === 'win32' ? 'py' : 'python3';
|
|
346
|
-
const detect = spawnSync(pythonBin, ['-c', 'import graphify; print(graphify.__version__)'], {
|
|
347
|
-
cwd: process.cwd(),
|
|
348
|
-
encoding: 'utf8',
|
|
349
|
-
timeout: 5000,
|
|
350
|
-
});
|
|
351
|
-
const graphifyInstalled = detect.status === 0 && (detect.stdout || '').trim().length > 0;
|
|
352
|
-
|
|
353
|
-
if (graphifyInstalled) {
|
|
354
|
-
console.log(chalk.green(' graphify already installed — skipping.'));
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Install graphify via pip as a fallback when uv is unavailable or the
|
|
359
|
-
// user declined the uv-based install. On Windows, `pip` is often not
|
|
360
|
-
// on PATH, so we invoke it as a `py -m pip` module instead. Returns
|
|
361
|
-
// the spawn result so the caller can log success/failure.
|
|
362
|
-
const installGraphifyWithPip = () => {
|
|
363
|
-
if (process.platform === 'win32') {
|
|
364
|
-
return spawnSync('py', ['-m', 'pip', 'install', 'graphifyy'], {
|
|
365
|
-
stdio: 'inherit',
|
|
366
|
-
timeout: 120000,
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
return spawnSync('pip', ['install', 'graphifyy'], {
|
|
370
|
-
stdio: 'inherit',
|
|
371
|
-
timeout: 120000,
|
|
372
|
-
});
|
|
373
|
-
};
|
|
374
|
-
const pipManualHint = process.platform === 'win32'
|
|
375
|
-
? 'py -m pip install graphifyy'
|
|
376
|
-
: 'pip install graphifyy';
|
|
377
|
-
|
|
378
|
-
// 2. Non-interactive: print hint and exit
|
|
379
|
-
if (!stdin.isTTY || !stdout.isTTY) {
|
|
380
|
-
console.log(chalk.dim(' graphify not detected. Install later with:'));
|
|
381
|
-
console.log(chalk.dim(' uv tool install graphifyy # recommended'));
|
|
382
|
-
console.log(chalk.dim(' pip install graphifyy'));
|
|
383
|
-
console.log(chalk.dim(' pipx install graphifyy'));
|
|
384
|
-
console.log(chalk.dim(' Then run `bizar graph build` to populate .bizar/graph/.'));
|
|
385
|
-
return;
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
// 3. Interactive: show options with uv first
|
|
389
|
-
console.log(chalk.dim(' graphify not detected. graphify powers per-project knowledge graphs (bizar graph build).'));
|
|
390
|
-
console.log(chalk.dim(' Install with one of:'));
|
|
391
|
-
console.log(chalk.dim(' uv tool install graphifyy # recommended'));
|
|
392
|
-
console.log(chalk.dim(' pip install graphifyy'));
|
|
393
|
-
console.log(chalk.dim(' pipx install graphifyy'));
|
|
394
|
-
|
|
395
|
-
const hasUv = await detectUv();
|
|
396
|
-
|
|
397
|
-
if (hasUv) {
|
|
398
|
-
// 3a. uv is available — ask to install via uv directly
|
|
399
|
-
const rl = createInterface({ input: stdin, output: stdout });
|
|
400
|
-
try {
|
|
401
|
-
const answer = (await rl.question(' Install graphify now via uv? [Y/n]: ')).trim().toLowerCase();
|
|
402
|
-
rl.close();
|
|
403
|
-
|
|
404
|
-
if (answer === '' || answer.startsWith('y')) {
|
|
405
|
-
console.log(' Installing graphify via uv...');
|
|
406
|
-
try {
|
|
407
|
-
execSync('uv tool install graphifyy', { stdio: 'inherit', timeout: 120000 });
|
|
408
|
-
console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
|
|
409
|
-
} catch (err) {
|
|
410
|
-
console.log(chalk.red(` uv tool install failed: ${err.message}`));
|
|
411
|
-
console.log(chalk.dim(' Install manually: uv tool install graphifyy'));
|
|
412
|
-
}
|
|
413
|
-
} else {
|
|
414
|
-
console.log(chalk.dim(' Skipped. Install manually with one of the commands above when ready.'));
|
|
415
|
-
}
|
|
416
|
-
} catch {
|
|
417
|
-
rl.close();
|
|
418
|
-
console.log(chalk.dim(' Skipped.'));
|
|
419
|
-
}
|
|
420
|
-
} else {
|
|
421
|
-
// 3b. uv not available — ask if we should install uv first
|
|
422
|
-
console.log();
|
|
423
|
-
console.log(chalk.dim(' uv not detected. uv is recommended on Arch/Fedora/macOS (avoids PEP 668).'));
|
|
424
|
-
|
|
425
|
-
const rl = createInterface({ input: stdin, output: stdout });
|
|
426
|
-
try {
|
|
427
|
-
const answer = (await rl.question(' Install uv first, then graphify? [Y/n]: ')).trim().toLowerCase();
|
|
428
|
-
rl.close();
|
|
429
|
-
|
|
430
|
-
if (answer === '' || answer.startsWith('y')) {
|
|
431
|
-
if (process.platform === 'win32') {
|
|
432
|
-
console.log(chalk.yellow(' Automatic uv install not supported on Windows.'));
|
|
433
|
-
console.log(chalk.dim(' Install from https://docs.astral.sh/uv then run: uv tool install graphifyy'));
|
|
434
|
-
return;
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
console.log(' Installing uv...');
|
|
438
|
-
try {
|
|
439
|
-
if (process.platform === 'win32') {
|
|
440
|
-
// Windows: use the official PowerShell installer
|
|
441
|
-
execSync('powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"', { stdio: 'inherit', timeout: 60000 });
|
|
442
|
-
} else {
|
|
443
|
-
execSync('curl -LsSf https://astral.sh/uv/install.sh | sh', { stdio: 'inherit', timeout: 60000 });
|
|
444
|
-
}
|
|
445
|
-
} catch (err) {
|
|
446
|
-
console.log(chalk.red(` uv install failed: ${err.message}`));
|
|
447
|
-
console.log(chalk.dim(' Install manually from https://docs.astral.sh/uv'));
|
|
448
|
-
// Fall back to pip
|
|
449
|
-
const rl2 = createInterface({ input: stdin, output: stdout });
|
|
450
|
-
try {
|
|
451
|
-
const pipAnswer = (await rl2.question(' Install graphify via pip instead? [Y/n]: ')).trim().toLowerCase();
|
|
452
|
-
rl2.close();
|
|
453
|
-
if (pipAnswer === '' || pipAnswer.startsWith('y')) {
|
|
454
|
-
console.log(' Installing graphify via pip...');
|
|
455
|
-
const result = installGraphifyWithPip();
|
|
456
|
-
if (result.status === 0) {
|
|
457
|
-
console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
|
|
458
|
-
} else {
|
|
459
|
-
console.log(chalk.red(` pip install failed (exit ${result.status}).`));
|
|
460
|
-
console.log(chalk.dim(` Install manually: ${pipManualHint}`));
|
|
461
|
-
}
|
|
462
|
-
} else {
|
|
463
|
-
console.log(chalk.dim(' Skipped.'));
|
|
464
|
-
}
|
|
465
|
-
} catch {
|
|
466
|
-
rl2.close();
|
|
467
|
-
console.log(chalk.dim(' Skipped.'));
|
|
468
|
-
}
|
|
469
|
-
return;
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
console.log(' Installing graphify via uv...');
|
|
473
|
-
try {
|
|
474
|
-
execSync('uv tool install graphifyy', { stdio: 'inherit', timeout: 120000 });
|
|
475
|
-
console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
|
|
476
|
-
} catch (err) {
|
|
477
|
-
console.log(chalk.red(` uv tool install failed: ${err.message}`));
|
|
478
|
-
console.log(chalk.dim(' Install manually: uv tool install graphifyy'));
|
|
479
|
-
}
|
|
480
|
-
} else {
|
|
481
|
-
// User declined uv — fall back to pip
|
|
482
|
-
const rl2 = createInterface({ input: stdin, output: stdout });
|
|
483
|
-
try {
|
|
484
|
-
const pipAnswer = (await rl2.question(' Install graphify via pip instead? [Y/n]: ')).trim().toLowerCase();
|
|
485
|
-
rl2.close();
|
|
486
|
-
if (pipAnswer === '' || pipAnswer.startsWith('y')) {
|
|
487
|
-
console.log(' Installing graphify via pip...');
|
|
488
|
-
const result = installGraphifyWithPip();
|
|
489
|
-
if (result.status === 0) {
|
|
490
|
-
console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
|
|
491
|
-
} else {
|
|
492
|
-
console.log(chalk.red(` pip install failed (exit ${result.status}).`));
|
|
493
|
-
console.log(chalk.dim(` Install manually: ${pipManualHint}`));
|
|
494
|
-
}
|
|
495
|
-
} else {
|
|
496
|
-
console.log(chalk.dim(' Skipped.'));
|
|
497
|
-
}
|
|
498
|
-
} catch {
|
|
499
|
-
rl2.close();
|
|
500
|
-
console.log(chalk.dim(' Skipped.'));
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
} catch {
|
|
504
|
-
rl.close();
|
|
505
|
-
console.log(chalk.dim(' Skipped.'));
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
export async function runPostInstall() {
|
|
511
|
-
// v6.3.0 — Bizar is Claude Code-native. `cli/provision-claude.mjs:runProvision`
|
|
512
|
-
// covers the install/update/validate surface and is the primary path
|
|
513
|
-
// used by `bizar install` and `bizar update`. This `runPostInstall`
|
|
514
|
-
// is a thin Claude Code-native bootstrap that:
|
|
515
|
-
// - copies `config/settings.json` template on first install
|
|
516
|
-
// - installs agents into `~/.claude/agents/`
|
|
517
|
-
// - probes for semble / skills-cli
|
|
518
|
-
// - installs Headroom via pip or npm
|
|
519
|
-
const { mkdirSync, copyFileSync, existsSync } = await import('node:fs');
|
|
520
|
-
const { execSync } = await import('node:child_process');
|
|
521
|
-
|
|
522
|
-
const dest = join(claudeConfigDir(), 'settings.json');
|
|
523
|
-
const templateSrc = repoPath('config', 'settings.json');
|
|
524
|
-
if (!existsSync(dest)) {
|
|
525
|
-
if (existsSync(templateSrc)) {
|
|
526
|
-
mkdirSync(claudeConfigDir(), { recursive: true });
|
|
527
|
-
copyFileSync(templateSrc, dest);
|
|
528
|
-
console.log(' ✓ settings.json bootstrapped from package template');
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
const env = await detectClaude();
|
|
533
|
-
if (!env.exists) {
|
|
534
|
-
mkdirSync(claudeConfigDir(), { recursive: true });
|
|
535
|
-
console.log(`BizarHarness: created ${claudeConfigDir()}/`);
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
mkdirSync(claudeAgentsDir(), { recursive: true });
|
|
539
|
-
|
|
540
|
-
for (const file of AGENT_FILES) {
|
|
541
|
-
const src = repoPath('config', 'agents', file);
|
|
542
|
-
const dest = join(claudeAgentsDir(), file);
|
|
543
|
-
if (!existsSync(dest)) {
|
|
544
|
-
copyFileSync(src, dest);
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
console.log('BizarHarness: agents installed.');
|
|
548
|
-
|
|
549
|
-
// Install Semble
|
|
550
|
-
const semblePresent = await detectSemble();
|
|
551
|
-
if (!semblePresent) {
|
|
552
|
-
console.log('BizarHarness: installing Semble (code search)...');
|
|
553
|
-
try {
|
|
554
|
-
const hasUv = await detectUv();
|
|
555
|
-
if (!hasUv) {
|
|
556
|
-
if (process.platform === 'win32') {
|
|
557
|
-
// Windows: use the official PowerShell installer
|
|
558
|
-
execSync(
|
|
559
|
-
'powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"',
|
|
560
|
-
{ stdio: 'pipe', timeout: 60000 },
|
|
561
|
-
);
|
|
562
|
-
} else {
|
|
563
|
-
execSync(
|
|
564
|
-
'curl -LsSf https://astral.sh/uv/install.sh | sh',
|
|
565
|
-
{ stdio: 'pipe', timeout: 60000 },
|
|
566
|
-
);
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
execSync('uv tool install "semble[mcp]"', { stdio: 'pipe', timeout: 60000 });
|
|
570
|
-
console.log('BizarHarness: Semble installed.');
|
|
571
|
-
} catch {
|
|
572
|
-
console.log('BizarHarness: Semble install failed. Run `uv tool install "semble[mcp]"` manually.');
|
|
573
|
-
}
|
|
574
|
-
} else {
|
|
575
|
-
console.log('BizarHarness: Semble ready.');
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
// Install Skills CLI
|
|
579
|
-
const skillsPresent = await detectSkillsCli();
|
|
580
|
-
if (!skillsPresent) {
|
|
581
|
-
console.log('BizarHarness: installing Skills CLI...');
|
|
582
|
-
try {
|
|
583
|
-
execSync('npm install -g skills', { stdio: 'pipe', timeout: 30000 });
|
|
584
|
-
console.log('BizarHarness: Skills CLI installed.');
|
|
585
|
-
} catch {
|
|
586
|
-
console.log('BizarHarness: Skills CLI install failed. Run `npm install -g skills` manually.');
|
|
587
|
-
}
|
|
588
|
-
} else {
|
|
589
|
-
console.log('BizarHarness: Skills CLI ready.');
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
// Install core skill pack
|
|
593
|
-
console.log('BizarHarness: installing core skills (find-skills, skill-creator)...');
|
|
594
|
-
try {
|
|
595
|
-
execSync('skills add vercel-labs/skills --all -y', { stdio: 'pipe', timeout: 60000 });
|
|
596
|
-
console.log('BizarHarness: core skills installed.');
|
|
597
|
-
} catch {
|
|
598
|
-
console.log('BizarHarness: core skill install skipped — run `skills add vercel-labs/skills --all -y` manually.');
|
|
599
|
-
}
|
|
600
13
|
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
14
|
+
export { runInstaller } from './install/index.mjs';
|
|
15
|
+
export { installPluginFromGlobal } from './install/plugin.mjs';
|
|
16
|
+
export { runPostInstall } from './install/postinstall.mjs';
|
|
604
17
|
|
|
605
|
-
|
|
606
|
-
}
|
|
18
|
+
// Default export for backward compatibility with `import install from './install.mjs'`
|
|
19
|
+
export { runInstaller as default } from './install/index.mjs';
|