@polderlabs/bizar 10.0.7 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/README.md +0 -2
  2. package/bizar-dash/dist/assets/{ActivityFeed-Da-JCrE6.js → ActivityFeed-JjmOY2AQ.js} +1 -1
  3. package/bizar-dash/dist/assets/{ActivityFeed-Da-JCrE6.js.map → ActivityFeed-JjmOY2AQ.js.map} +1 -1
  4. package/bizar-dash/dist/assets/{ActivityView-nIRsSETb.js → ActivityView-BIIMvGWo.js} +1 -1
  5. package/bizar-dash/dist/assets/{ActivityView-nIRsSETb.js.map → ActivityView-BIIMvGWo.js.map} +1 -1
  6. package/bizar-dash/dist/assets/{AdminView-DP1NMxmG.js → AdminView-DRidJtkq.js} +1 -1
  7. package/bizar-dash/dist/assets/{AdminView-DP1NMxmG.js.map → AdminView-DRidJtkq.js.map} +1 -1
  8. package/bizar-dash/dist/assets/{AgentActivity-lSPkOr-O.js → AgentActivity-79l4SBMC.js} +1 -1
  9. package/bizar-dash/dist/assets/{AgentActivity-lSPkOr-O.js.map → AgentActivity-79l4SBMC.js.map} +1 -1
  10. package/bizar-dash/dist/assets/{AgentsView-BIWGkz7w.js → AgentsView-0vT4uPSc.js} +1 -1
  11. package/bizar-dash/dist/assets/{AgentsView-BIWGkz7w.js.map → AgentsView-0vT4uPSc.js.map} +1 -1
  12. package/bizar-dash/dist/assets/{Alert-DN0UysMg.js → Alert-CG5q_s75.js} +1 -1
  13. package/bizar-dash/dist/assets/{Alert-DN0UysMg.js.map → Alert-CG5q_s75.js.map} +1 -1
  14. package/bizar-dash/dist/assets/ArtifactsView-DM8ZmpR9.js +21 -0
  15. package/bizar-dash/dist/assets/ArtifactsView-DM8ZmpR9.js.map +1 -0
  16. package/bizar-dash/dist/assets/{AuthView-DW5cs7ma.js → AuthView-BveN94MC.js} +1 -1
  17. package/bizar-dash/dist/assets/{AuthView-DW5cs7ma.js.map → AuthView-BveN94MC.js.map} +1 -1
  18. package/bizar-dash/dist/assets/{Avatar-DZPv9pvd.js → Avatar-ulUPIYTd.js} +1 -1
  19. package/bizar-dash/dist/assets/{Avatar-DZPv9pvd.js.map → Avatar-ulUPIYTd.js.map} +1 -1
  20. package/bizar-dash/dist/assets/{BackgroundJobsView-D8O-EyMD.js → BackgroundJobsView-BWErhqFo.js} +1 -1
  21. package/bizar-dash/dist/assets/{BackgroundJobsView-D8O-EyMD.js.map → BackgroundJobsView-BWErhqFo.js.map} +1 -1
  22. package/bizar-dash/dist/assets/{BackupView-uwXkhxOV.js → BackupView-CnBjzG9N.js} +1 -1
  23. package/bizar-dash/dist/assets/{BackupView-uwXkhxOV.js.map → BackupView-CnBjzG9N.js.map} +1 -1
  24. package/bizar-dash/dist/assets/{Card-Tyboihu7.js → Card-B0imhxMk.js} +1 -1
  25. package/bizar-dash/dist/assets/{Card-Tyboihu7.js.map → Card-B0imhxMk.js.map} +1 -1
  26. package/bizar-dash/dist/assets/{ChatView-DRBHzgay.js → ChatView-D6zGytzx.js} +1 -1
  27. package/bizar-dash/dist/assets/{ChatView-DRBHzgay.js.map → ChatView-D6zGytzx.js.map} +1 -1
  28. package/bizar-dash/dist/assets/{Chip-BrXIlR9w.js → Chip-wwZSGwLE.js} +1 -1
  29. package/bizar-dash/dist/assets/{Chip-BrXIlR9w.js.map → Chip-wwZSGwLE.js.map} +1 -1
  30. package/bizar-dash/dist/assets/{ClaudeSessionsView-Ck62jaOr.js → ClaudeSessionsView-DK1sOLhi.js} +1 -1
  31. package/bizar-dash/dist/assets/{ClaudeSessionsView-Ck62jaOr.js.map → ClaudeSessionsView-DK1sOLhi.js.map} +1 -1
  32. package/bizar-dash/dist/assets/{ClipboardView-DfND6xL6.js → ClipboardView-CZ2lYPr0.js} +1 -1
  33. package/bizar-dash/dist/assets/{ClipboardView-DfND6xL6.js.map → ClipboardView-CZ2lYPr0.js.map} +1 -1
  34. package/bizar-dash/dist/assets/{ConfigView-DjJmSrOJ.js → ConfigView-D-zT9eNA.js} +1 -1
  35. package/bizar-dash/dist/assets/{ConfigView-DjJmSrOJ.js.map → ConfigView-D-zT9eNA.js.map} +1 -1
  36. package/bizar-dash/dist/assets/{DiagnosticsView-CKgItf0J.js → DiagnosticsView-BocV68Lb.js} +1 -1
  37. package/bizar-dash/dist/assets/{DiagnosticsView-CKgItf0J.js.map → DiagnosticsView-BocV68Lb.js.map} +1 -1
  38. package/bizar-dash/dist/assets/{DialogsView-DHYF8dE1.js → DialogsView-BVjPI5x7.js} +1 -1
  39. package/bizar-dash/dist/assets/{DialogsView-DHYF8dE1.js.map → DialogsView-BVjPI5x7.js.map} +1 -1
  40. package/bizar-dash/dist/assets/{DoctorView-DDLHrSKk.js → DoctorView-84gJcZwM.js} +1 -1
  41. package/bizar-dash/dist/assets/{DoctorView-DDLHrSKk.js.map → DoctorView-84gJcZwM.js.map} +1 -1
  42. package/bizar-dash/dist/assets/{EmptyState-DZ2ouKwd.js → EmptyState-BjgVOrcO.js} +1 -1
  43. package/bizar-dash/dist/assets/{EmptyState-DZ2ouKwd.js.map → EmptyState-BjgVOrcO.js.map} +1 -1
  44. package/bizar-dash/dist/assets/{EnvVarsView-D1cx83mB.js → EnvVarsView-BJ2TEzF7.js} +1 -1
  45. package/bizar-dash/dist/assets/{EnvVarsView-D1cx83mB.js.map → EnvVarsView-BJ2TEzF7.js.map} +1 -1
  46. package/bizar-dash/dist/assets/{ErrorState-DwwJ2-Jq.js → ErrorState-BE3WBFqF.js} +1 -1
  47. package/bizar-dash/dist/assets/{ErrorState-DwwJ2-Jq.js.map → ErrorState-BE3WBFqF.js.map} +1 -1
  48. package/bizar-dash/dist/assets/{EvalView-C9aYixXW.js → EvalView-BJJ2P-kK.js} +1 -1
  49. package/bizar-dash/dist/assets/{EvalView-C9aYixXW.js.map → EvalView-BJJ2P-kK.js.map} +1 -1
  50. package/bizar-dash/dist/assets/{GoalsView-DZa_mGmh.js → GoalsView-pwROHApi.js} +1 -1
  51. package/bizar-dash/dist/assets/{GoalsView-DZa_mGmh.js.map → GoalsView-pwROHApi.js.map} +1 -1
  52. package/bizar-dash/dist/assets/{Grid-CiRyhAgR.js → Grid-qcvbhx6e.js} +1 -1
  53. package/bizar-dash/dist/assets/{Grid-CiRyhAgR.js.map → Grid-qcvbhx6e.js.map} +1 -1
  54. package/bizar-dash/dist/assets/{HeadroomView-CNc-TI7u.js → HeadroomView-D1UiTYbt.js} +1 -1
  55. package/bizar-dash/dist/assets/{HeadroomView-CNc-TI7u.js.map → HeadroomView-D1UiTYbt.js.map} +1 -1
  56. package/bizar-dash/dist/assets/{HistoryView-Dv7aPxJE.js → HistoryView-C7SSOLJA.js} +1 -1
  57. package/bizar-dash/dist/assets/{HistoryView-Dv7aPxJE.js.map → HistoryView-C7SSOLJA.js.map} +1 -1
  58. package/bizar-dash/dist/assets/{Input-BbFUDQnS.js → Input-Bgzxf_Hu.js} +1 -1
  59. package/bizar-dash/dist/assets/{Input-BbFUDQnS.js.map → Input-Bgzxf_Hu.js.map} +1 -1
  60. package/bizar-dash/dist/assets/{LibrariesView-DBQ83TNa.js → LibrariesView-CbFFksox.js} +1 -1
  61. package/bizar-dash/dist/assets/{LibrariesView-DBQ83TNa.js.map → LibrariesView-CbFFksox.js.map} +1 -1
  62. package/bizar-dash/dist/assets/{LightRAGView-JYpE5u9p.js → LightRAGView-BqDrJbRq.js} +1 -1
  63. package/bizar-dash/dist/assets/{LightRAGView-JYpE5u9p.js.map → LightRAGView-BqDrJbRq.js.map} +1 -1
  64. package/bizar-dash/dist/assets/{ListHeader-BGjm11Z0.js → ListHeader-TjPJrUfY.js} +1 -1
  65. package/bizar-dash/dist/assets/{ListHeader-BGjm11Z0.js.map → ListHeader-TjPJrUfY.js.map} +1 -1
  66. package/bizar-dash/dist/assets/{MemoryView-CnOP2MvM.js → MemoryView-BlTeHLhX.js} +1 -1
  67. package/bizar-dash/dist/assets/{MemoryView-CnOP2MvM.js.map → MemoryView-BlTeHLhX.js.map} +1 -1
  68. package/bizar-dash/dist/assets/{MiscView-BBcpUbZZ.js → MiscView-B8QY82Pm.js} +1 -1
  69. package/bizar-dash/dist/assets/{MiscView-BBcpUbZZ.js.map → MiscView-B8QY82Pm.js.map} +1 -1
  70. package/bizar-dash/dist/assets/{ModsView-CU4cAmIz.js → ModsView-CvW1OWts.js} +1 -1
  71. package/bizar-dash/dist/assets/{ModsView-CU4cAmIz.js.map → ModsView-CvW1OWts.js.map} +1 -1
  72. package/bizar-dash/dist/assets/{NotificationsView-BYffvthq.js → NotificationsView-CsBt5U7x.js} +1 -1
  73. package/bizar-dash/dist/assets/{NotificationsView-BYffvthq.js.map → NotificationsView-CsBt5U7x.js.map} +1 -1
  74. package/bizar-dash/dist/assets/{ObsidianView-D3bI0row.js → ObsidianView-BCTejEj2.js} +1 -1
  75. package/bizar-dash/dist/assets/{ObsidianView-D3bI0row.js.map → ObsidianView-BCTejEj2.js.map} +1 -1
  76. package/bizar-dash/dist/assets/{OverviewView-0tq8f-Y0.js → OverviewView-BsuPxwnB.js} +1 -1
  77. package/bizar-dash/dist/assets/{OverviewView-0tq8f-Y0.js.map → OverviewView-BsuPxwnB.js.map} +1 -1
  78. package/bizar-dash/dist/assets/{ProgressBar-B-h60LKA.js → ProgressBar-DlZTETEn.js} +1 -1
  79. package/bizar-dash/dist/assets/{ProgressBar-B-h60LKA.js.map → ProgressBar-DlZTETEn.js.map} +1 -1
  80. package/bizar-dash/dist/assets/{ProjectsView-DhX5lzHS.js → ProjectsView-Soxtmpet.js} +1 -1
  81. package/bizar-dash/dist/assets/{ProjectsView-DhX5lzHS.js.map → ProjectsView-Soxtmpet.js.map} +1 -1
  82. package/bizar-dash/dist/assets/{ProvidersView-CJMX7jm9.js → ProvidersView-DaCEV9pM.js} +1 -1
  83. package/bizar-dash/dist/assets/{ProvidersView-CJMX7jm9.js.map → ProvidersView-DaCEV9pM.js.map} +1 -1
  84. package/bizar-dash/dist/assets/{SchedulesView-CcwDQ9Nm.js → SchedulesView-DY2ByBj_.js} +1 -1
  85. package/bizar-dash/dist/assets/{SchedulesView-CcwDQ9Nm.js.map → SchedulesView-DY2ByBj_.js.map} +1 -1
  86. package/bizar-dash/dist/assets/{Select-Cw7Qtz2M.js → Select-Dbd88_n8.js} +1 -1
  87. package/bizar-dash/dist/assets/{Select-Cw7Qtz2M.js.map → Select-Dbd88_n8.js.map} +1 -1
  88. package/bizar-dash/dist/assets/{SettingsRow-DgsgbPSI.js → SettingsRow-CLMNd434.js} +1 -1
  89. package/bizar-dash/dist/assets/{SettingsRow-DgsgbPSI.js.map → SettingsRow-CLMNd434.js.map} +1 -1
  90. package/bizar-dash/dist/assets/{SettingsView-DTAFdKyK.js → SettingsView-b24oFq9x.js} +1 -1
  91. package/bizar-dash/dist/assets/{SettingsView-DTAFdKyK.js.map → SettingsView-b24oFq9x.js.map} +1 -1
  92. package/bizar-dash/dist/assets/{Sheet-DH-WNJ3Y.js → Sheet-DnDid58j.js} +1 -1
  93. package/bizar-dash/dist/assets/{Sheet-DH-WNJ3Y.js.map → Sheet-DnDid58j.js.map} +1 -1
  94. package/bizar-dash/dist/assets/{Slider-DXbJuQ7y.js → Slider-BJCvKI1I.js} +1 -1
  95. package/bizar-dash/dist/assets/{Slider-DXbJuQ7y.js.map → Slider-BJCvKI1I.js.map} +1 -1
  96. package/bizar-dash/dist/assets/{Sparkline-CYtAn82j.js → Sparkline-ktqQLdyb.js} +1 -1
  97. package/bizar-dash/dist/assets/{Sparkline-CYtAn82j.js.map → Sparkline-ktqQLdyb.js.map} +1 -1
  98. package/bizar-dash/dist/assets/{Switch-BItGrPqr.js → Switch-CwXfsDii.js} +1 -1
  99. package/bizar-dash/dist/assets/{Switch-BItGrPqr.js.map → Switch-CwXfsDii.js.map} +1 -1
  100. package/bizar-dash/dist/assets/{TasksView-i5tm6CkX.js → TasksView-BHmpzFCf.js} +1 -1
  101. package/bizar-dash/dist/assets/{TasksView-i5tm6CkX.js.map → TasksView-BHmpzFCf.js.map} +1 -1
  102. package/bizar-dash/dist/assets/{Textarea-qYDf3yds.js → Textarea-BzIAwSlp.js} +1 -1
  103. package/bizar-dash/dist/assets/{Textarea-qYDf3yds.js.map → Textarea-BzIAwSlp.js.map} +1 -1
  104. package/bizar-dash/dist/assets/{UpdateView-Xln-ej26.js → UpdateView-CSmX9NN0.js} +1 -1
  105. package/bizar-dash/dist/assets/{UpdateView-Xln-ej26.js.map → UpdateView-CSmX9NN0.js.map} +1 -1
  106. package/bizar-dash/dist/assets/{UsageView-BGuZSUZ6.js → UsageView-COyr_Gfi.js} +1 -1
  107. package/bizar-dash/dist/assets/{UsageView-BGuZSUZ6.js.map → UsageView-COyr_Gfi.js.map} +1 -1
  108. package/bizar-dash/dist/assets/{ViewHeader-BqIPVKuG.js → ViewHeader-BzYZ3m-e.js} +1 -1
  109. package/bizar-dash/dist/assets/{ViewHeader-BqIPVKuG.js.map → ViewHeader-BzYZ3m-e.js.map} +1 -1
  110. package/bizar-dash/dist/assets/{VoiceView-CWUOCQs_.js → VoiceView-D33_xG5t.js} +1 -1
  111. package/bizar-dash/dist/assets/{VoiceView-CWUOCQs_.js.map → VoiceView-D33_xG5t.js.map} +1 -1
  112. package/bizar-dash/dist/assets/{brain-fsBSDl2g.js → brain-CM-Vls8r.js} +1 -1
  113. package/bizar-dash/dist/assets/{brain-fsBSDl2g.js.map → brain-CM-Vls8r.js.map} +1 -1
  114. package/bizar-dash/dist/assets/{calendar-DsHTZoCU.js → calendar-C0lgZk69.js} +1 -1
  115. package/bizar-dash/dist/assets/{calendar-DsHTZoCU.js.map → calendar-C0lgZk69.js.map} +1 -1
  116. package/bizar-dash/dist/assets/{circle-CqSxqqeJ.js → circle-Bx_hQEBC.js} +1 -1
  117. package/bizar-dash/dist/assets/{circle-CqSxqqeJ.js.map → circle-Bx_hQEBC.js.map} +1 -1
  118. package/bizar-dash/dist/assets/{circle-alert-BsLl001l.js → circle-alert-DHvsqpw5.js} +1 -1
  119. package/bizar-dash/dist/assets/{circle-alert-BsLl001l.js.map → circle-alert-DHvsqpw5.js.map} +1 -1
  120. package/bizar-dash/dist/assets/{circle-check-rVKMQmZp.js → circle-check-Bx8wmXR9.js} +1 -1
  121. package/bizar-dash/dist/assets/{circle-check-rVKMQmZp.js.map → circle-check-Bx8wmXR9.js.map} +1 -1
  122. package/bizar-dash/dist/assets/{clock-OuficfgH.js → clock-CejGoecX.js} +1 -1
  123. package/bizar-dash/dist/assets/{clock-OuficfgH.js.map → clock-CejGoecX.js.map} +1 -1
  124. package/bizar-dash/dist/assets/{download-BdHlstUY.js → download-4cEUWue1.js} +1 -1
  125. package/bizar-dash/dist/assets/{download-BdHlstUY.js.map → download-4cEUWue1.js.map} +1 -1
  126. package/bizar-dash/dist/assets/{external-link-DA3_VGm-.js → external-link-0NqUhI4i.js} +1 -1
  127. package/bizar-dash/dist/assets/{external-link-DA3_VGm-.js.map → external-link-0NqUhI4i.js.map} +1 -1
  128. package/bizar-dash/dist/assets/{file-text-B-g8H227.js → file-text-yEMkrSoZ.js} +1 -1
  129. package/bizar-dash/dist/assets/{file-text-B-g8H227.js.map → file-text-yEMkrSoZ.js.map} +1 -1
  130. package/bizar-dash/dist/assets/{filter-D9B8s5CG.js → filter-BXt60zAS.js} +1 -1
  131. package/bizar-dash/dist/assets/{filter-D9B8s5CG.js.map → filter-BXt60zAS.js.map} +1 -1
  132. package/bizar-dash/dist/assets/{git-pull-request-ByH0YuVz.js → git-pull-request-BjG5lNtR.js} +1 -1
  133. package/bizar-dash/dist/assets/{git-pull-request-ByH0YuVz.js.map → git-pull-request-BjG5lNtR.js.map} +1 -1
  134. package/bizar-dash/dist/assets/{main-CdOm1Pj9.js → main-CokHAXWM.js} +2 -2
  135. package/bizar-dash/dist/assets/{main-CdOm1Pj9.js.map → main-CokHAXWM.js.map} +1 -1
  136. package/bizar-dash/dist/assets/{pause-C9hgd8wX.js → pause-CAmulU0F.js} +1 -1
  137. package/bizar-dash/dist/assets/{pause-C9hgd8wX.js.map → pause-CAmulU0F.js.map} +1 -1
  138. package/bizar-dash/dist/assets/{pencil-BanqaMw7.js → pencil-eq5IqBmU.js} +1 -1
  139. package/bizar-dash/dist/assets/{pencil-BanqaMw7.js.map → pencil-eq5IqBmU.js.map} +1 -1
  140. package/bizar-dash/dist/assets/{play-CawUZ02_.js → play-BoLrrcBA.js} +1 -1
  141. package/bizar-dash/dist/assets/{play-CawUZ02_.js.map → play-BoLrrcBA.js.map} +1 -1
  142. package/bizar-dash/dist/assets/{plug-Cmv0-T_e.js → plug-DBrVM9lK.js} +1 -1
  143. package/bizar-dash/dist/assets/{plug-Cmv0-T_e.js.map → plug-DBrVM9lK.js.map} +1 -1
  144. package/bizar-dash/dist/assets/{plus-M6LYiKX8.js → plus-DENm0hqV.js} +1 -1
  145. package/bizar-dash/dist/assets/{plus-M6LYiKX8.js.map → plus-DENm0hqV.js.map} +1 -1
  146. package/bizar-dash/dist/assets/{power-DP5x_SRF.js → power-DLjXF7zE.js} +1 -1
  147. package/bizar-dash/dist/assets/{power-DP5x_SRF.js.map → power-DLjXF7zE.js.map} +1 -1
  148. package/bizar-dash/dist/assets/{power-off-NOJRLAIs.js → power-off-D47cOnG_.js} +1 -1
  149. package/bizar-dash/dist/assets/{power-off-NOJRLAIs.js.map → power-off-D47cOnG_.js.map} +1 -1
  150. package/bizar-dash/dist/assets/{refresh-ccw-CHMprsm5.js → refresh-ccw-DNrXX9gB.js} +1 -1
  151. package/bizar-dash/dist/assets/{refresh-ccw-CHMprsm5.js.map → refresh-ccw-DNrXX9gB.js.map} +1 -1
  152. package/bizar-dash/dist/assets/{refresh-cw-1RBqDKgJ.js → refresh-cw-CoAHDpeS.js} +1 -1
  153. package/bizar-dash/dist/assets/{refresh-cw-1RBqDKgJ.js.map → refresh-cw-CoAHDpeS.js.map} +1 -1
  154. package/bizar-dash/dist/assets/{rotate-ccw-DJRekBbi.js → rotate-ccw-ObX5awaG.js} +1 -1
  155. package/bizar-dash/dist/assets/{rotate-ccw-DJRekBbi.js.map → rotate-ccw-ObX5awaG.js.map} +1 -1
  156. package/bizar-dash/dist/assets/{rotate-cw-DHooc0Tx.js → rotate-cw-xpPJw9LP.js} +1 -1
  157. package/bizar-dash/dist/assets/{rotate-cw-DHooc0Tx.js.map → rotate-cw-xpPJw9LP.js.map} +1 -1
  158. package/bizar-dash/dist/assets/{save-DQKCKyZK.js → save-D1iKiJJl.js} +1 -1
  159. package/bizar-dash/dist/assets/{save-DQKCKyZK.js.map → save-D1iKiJJl.js.map} +1 -1
  160. package/bizar-dash/dist/assets/{send-xgy3RAi7.js → send-BRcAhZUm.js} +1 -1
  161. package/bizar-dash/dist/assets/{send-xgy3RAi7.js.map → send-BRcAhZUm.js.map} +1 -1
  162. package/bizar-dash/dist/assets/{shield-alert-CWV2F5ab.js → shield-alert-C6vEcK-g.js} +1 -1
  163. package/bizar-dash/dist/assets/{shield-alert-CWV2F5ab.js.map → shield-alert-C6vEcK-g.js.map} +1 -1
  164. package/bizar-dash/dist/assets/{trash-2-CL4khSRv.js → trash-2-DZDjEnNh.js} +1 -1
  165. package/bizar-dash/dist/assets/{trash-2-CL4khSRv.js.map → trash-2-DZDjEnNh.js.map} +1 -1
  166. package/bizar-dash/dist/assets/{trending-up-CSJJhWTS.js → trending-up-DMj-AJVf.js} +1 -1
  167. package/bizar-dash/dist/assets/{trending-up-CSJJhWTS.js.map → trending-up-DMj-AJVf.js.map} +1 -1
  168. package/bizar-dash/dist/assets/{triangle-alert-BPLb7uLt.js → triangle-alert-_2xe_tl4.js} +1 -1
  169. package/bizar-dash/dist/assets/{triangle-alert-BPLb7uLt.js.map → triangle-alert-_2xe_tl4.js.map} +1 -1
  170. package/bizar-dash/dist/assets/{upload-Cww6MvFq.js → upload-DdDljAeV.js} +1 -1
  171. package/bizar-dash/dist/assets/{upload-Cww6MvFq.js.map → upload-DdDljAeV.js.map} +1 -1
  172. package/bizar-dash/dist/assets/{zap-DmhVUzRA.js → zap-mHsgh0FP.js} +1 -1
  173. package/bizar-dash/dist/assets/{zap-DmhVUzRA.js.map → zap-mHsgh0FP.js.map} +1 -1
  174. package/bizar-dash/dist/index.html +1 -1
  175. package/bizar-dash/src/server/api.mjs +13 -6
  176. package/bizar-dash/src/server/artifacts-store.mjs +120 -14
  177. package/bizar-dash/src/server/claude-artifacts.mjs +281 -0
  178. package/bizar-dash/src/server/diagnostics-store.mjs +5 -35
  179. package/bizar-dash/src/server/mod-security.mjs +1 -2
  180. package/bizar-dash/src/server/providers-store.mjs +1 -1
  181. package/bizar-dash/src/server/routes/_shared.mjs +0 -17
  182. package/bizar-dash/src/server/routes/artifacts.mjs +42 -6
  183. package/bizar-dash/src/server/routes/audit.mjs +78 -0
  184. package/bizar-dash/src/server/routes/decisions.mjs +78 -0
  185. package/bizar-dash/src/server/routes/model-router.mjs +158 -0
  186. package/bizar-dash/src/server/routes/model-router.test.mjs +104 -0
  187. package/bizar-dash/src/server/routes/sessions.mjs +80 -0
  188. package/bizar-dash/src/server/server.mjs +1 -27
  189. package/bizar-dash/src/server/sprint.test.mjs +163 -0
  190. package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +232 -21
  191. package/bizar-dash/src/web/v8/views/Artifacts/ClaudeArtifactView.tsx +179 -0
  192. package/bizar-dash/tests/cli-bugfixes.test.mjs +1 -1
  193. package/bizar-dash/tests/cli-error-visibility.test.mjs +1 -1
  194. package/bizar-dash/tests/cli-refactor.test.mjs +0 -1
  195. package/bizar-dash/tests/diagnostics-store.test.mjs +0 -1
  196. package/cli/bin.mjs +1 -15
  197. package/cli/cli-commands-validation.test.mjs +1 -1
  198. package/cli/commands/lightrag.mjs +1 -1
  199. package/cli/commands/util.mjs +1 -1
  200. package/cli/copy.mjs +1 -47
  201. package/cli/doctor.mjs +3 -3
  202. package/cli/install.mjs +3 -37
  203. package/cli/service-controller.mjs +0 -192
  204. package/cli/service-env.mjs +2 -9
  205. package/cli/utils.mjs +0 -7
  206. package/package.json +1 -1
  207. package/packages/sdk/dist/agent/cron.d.ts +44 -0
  208. package/packages/sdk/dist/agent/cron.js +79 -0
  209. package/packages/sdk/dist/agent/heartbeat.d.ts +43 -0
  210. package/packages/sdk/dist/agent/heartbeat.js +116 -0
  211. package/packages/sdk/dist/index.d.ts +3 -0
  212. package/packages/sdk/dist/index.js +5 -0
  213. package/packages/sdk/dist/learning/decisions.d.ts +46 -0
  214. package/packages/sdk/dist/learning/decisions.js +132 -0
  215. package/packages/sdk/dist/learning/index.d.ts +8 -0
  216. package/packages/sdk/dist/learning/index.js +8 -0
  217. package/packages/sdk/dist/learning/instincts.d.ts +38 -0
  218. package/packages/sdk/dist/learning/instincts.js +139 -0
  219. package/packages/sdk/dist/mcp/server.js +119 -1
  220. package/packages/sdk/dist/router/agent-model-registry.d.ts +89 -0
  221. package/packages/sdk/dist/router/agent-model-registry.js +144 -0
  222. package/packages/sdk/dist/router/index.d.ts +1 -0
  223. package/packages/sdk/dist/router/index.js +1 -0
  224. package/packages/sdk/package.json +3 -2
  225. package/scripts/audit.mjs +388 -0
  226. package/scripts/audit.test.mjs +149 -0
  227. package/scripts/check-deps.mjs +0 -24
  228. package/scripts/eval-gate.mjs +134 -0
  229. package/scripts/eval-gate.test.mjs +138 -0
  230. package/scripts/feature-state-machine.mjs +178 -0
  231. package/scripts/feature-state-machine.test.mjs +135 -0
  232. package/scripts/spec-dedup.test.mjs +124 -0
  233. package/scripts/sprint.mjs +213 -0
  234. package/scripts/worktree-setup.sh +79 -0
  235. package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js +0 -6
  236. package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js.map +0 -1
@@ -0,0 +1,134 @@
1
+ /**
2
+ * eval-gate.mjs — Verify passing features have satisfying eval files.
3
+ *
4
+ * For each feature with state === "passing", checks that:
5
+ * 1. .harness/evals/<id>.jsonl exists
6
+ * 2. The file has at least one parseable JSON line
7
+ * 3. The pass-rate (passed / total) >= threshold (default 0.9)
8
+ *
9
+ * Usage:
10
+ * bun run scripts/eval-gate.mjs [--threshold=0.9] [--dry-run] [--json]
11
+ * make eval-gate
12
+ */
13
+
14
+ import { readFileSync, existsSync } from "node:fs";
15
+ import { join, dirname } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+
18
+ const __dirname = dirname(fileURLToPath(import.meta.url));
19
+ const ROOT = join(__dirname, "..");
20
+ const FEATURE_LIST_PATH = join(ROOT, "feature_list.json");
21
+ const EVALS_DIR = join(ROOT, ".harness", "evals");
22
+
23
+ const DEFAULT_THRESHOLD = 0.9;
24
+
25
+ function readJson(/** @type {string} */ path) {
26
+ return JSON.parse(readFileSync(path, "utf-8"));
27
+ }
28
+
29
+ /**
30
+ * @param {{ id: string, behavior: string, state: string }} feature
31
+ * @param {number} threshold
32
+ * @returns {{ ok: boolean, reason?: string, detail?: string }}
33
+ */
34
+ function checkFeature(feature, threshold) {
35
+ if (feature.state !== "passing") {
36
+ return { ok: true };
37
+ }
38
+
39
+ const evalPath = join(EVALS_DIR, `${feature.id}.jsonl`);
40
+
41
+ if (!existsSync(evalPath)) {
42
+ return { ok: false, reason: "eval file not found", detail: evalPath };
43
+ }
44
+
45
+ let content;
46
+ try {
47
+ content = readFileSync(evalPath, "utf-8");
48
+ } catch {
49
+ return { ok: false, reason: "eval file unreadable", detail: evalPath };
50
+ }
51
+
52
+ if (!content.trim()) {
53
+ return { ok: false, reason: "eval file is empty", detail: evalPath };
54
+ }
55
+
56
+ const lines = content.split("\n").filter((l) => l.trim() !== "");
57
+ let passed = 0;
58
+ let total = 0;
59
+ for (const line of lines) {
60
+ try {
61
+ const record = JSON.parse(line);
62
+ total++;
63
+ if (record.passed === true || record.pass === true || record.status === "pass") {
64
+ passed++;
65
+ }
66
+ } catch {
67
+ // Malformed line — skip (lenient)
68
+ }
69
+ }
70
+
71
+ if (total === 0) {
72
+ return { ok: false, reason: "eval file has no parseable records", detail: evalPath };
73
+ }
74
+
75
+ const rate = passed / total;
76
+ if (rate < threshold) {
77
+ return {
78
+ ok: false,
79
+ reason: `pass-rate ${rate.toFixed(3)} < threshold ${threshold}`,
80
+ detail: evalPath,
81
+ };
82
+ }
83
+
84
+ return { ok: true };
85
+ }
86
+
87
+ // CLI
88
+ const args = process.argv.slice(2);
89
+ const thresholdArg = args.find((a) => a.startsWith("--threshold="));
90
+ const dryRun = args.includes("--dry-run");
91
+ const jsonOutput = args.includes("--json");
92
+ const threshold = thresholdArg
93
+ ? parseFloat(thresholdArg.split("=")[1])
94
+ : DEFAULT_THRESHOLD;
95
+
96
+ const featureList = readJson(FEATURE_LIST_PATH);
97
+ const features = /** @type {Array<{id: string, behavior: string, state: string}>} */ (featureList.features ?? []);
98
+
99
+ const results = [];
100
+ let passCount = 0;
101
+ let failCount = 0;
102
+
103
+ for (const feature of features) {
104
+ const result = checkFeature(feature, threshold);
105
+ results.push({ featureId: feature.id, behavior: feature.behavior, ...result });
106
+ if (result.ok) {
107
+ passCount++;
108
+ } else {
109
+ failCount++;
110
+ }
111
+ }
112
+
113
+ if (jsonOutput) {
114
+ console.log(
115
+ JSON.stringify({ threshold, total: results.length, passing: passCount, failing: failCount, results }, null, 2)
116
+ );
117
+ } else {
118
+ console.log(`\n▶ Eval gate — threshold: ${threshold}`);
119
+ console.log("─".repeat(60));
120
+ for (const r of results) {
121
+ if (r.ok) {
122
+ console.log(` PASS ${r.featureId}`);
123
+ } else {
124
+ console.log(` FAIL ${r.featureId} — ${r.reason}`);
125
+ if (r.detail) console.log(` (${r.detail})`);
126
+ }
127
+ }
128
+ console.log("─".repeat(60));
129
+ console.log(` ${passCount} passing, ${failCount} failing\n`);
130
+ }
131
+
132
+ if (failCount > 0 && !dryRun) {
133
+ process.exit(1);
134
+ }
@@ -0,0 +1,138 @@
1
+ /**
2
+ * eval-gate.test.mjs — 5 tests for eval-gate.mjs
3
+ *
4
+ * Tests:
5
+ * 1. passing-feature eval present → pass
6
+ * 2. fail-rate threshold → fail
7
+ * 3. missing eval flagged → fail
8
+ * 4. malformed JSONL tolerated → pass
9
+ * 5. dry-run mode → no exit failure
10
+ */
11
+
12
+ import { writeFileSync, mkdirSync, rmSync, readFileSync } from "node:fs";
13
+ import { join, dirname } from "node:path";
14
+ import { fileURLToPath } from "node:url";
15
+
16
+ const __dirname = dirname(fileURLToPath(import.meta.url));
17
+ const ROOT = join(__dirname, "..");
18
+ const EVALS_DIR = join(ROOT, ".harness", "evals");
19
+ const FEATURE_LIST_PATH = join(ROOT, "feature_list.json");
20
+
21
+ await mkdirSync(EVALS_DIR, { recursive: true });
22
+
23
+ /** Run eval-gate and return { stdout, stderr, exitCode } */
24
+ async function runGate(args = []) {
25
+ const proc = Bun.spawn({
26
+ cmd: ["/home/drb0rk/.bun/bin/bun", "run", join(__dirname, "eval-gate.mjs"), ...args],
27
+ cwd: ROOT,
28
+ env: { PATH: "/home/drb0rk/.bun/bin:/usr/bin:/bin" },
29
+ });
30
+ const [stdout, exitCode] = await Promise.all([
31
+ new Response(proc.stdout).text(),
32
+ proc.exited,
33
+ ]);
34
+ const stderr = ""; // not captured
35
+ return { stdout, stderr, exitCode };
36
+ }
37
+
38
+ // ── helpers ───────────────────────────────────────────────────────────────────
39
+
40
+ function withFeatureList(/** @type {object[]} */ features, /** @type {() => Promise<void>} */ fn) {
41
+ const orig = readFileSync(FEATURE_LIST_PATH, "utf-8");
42
+ writeFileSync(FEATURE_LIST_PATH, JSON.stringify({ features }, null, 2), "utf-8");
43
+ return fn().finally(() => writeFileSync(FEATURE_LIST_PATH, orig, "utf-8"));
44
+ }
45
+
46
+ // ── test 1: passing-feature eval present → pass ──────────────────────────────
47
+
48
+ await writeFileSync(join(EVALS_DIR, "F-001.jsonl"), JSON.stringify({ passed: true }) + "\n");
49
+
50
+ await withFeatureList(
51
+ [{ id: "F-001", behavior: "test feature", state: "passing", evidence: "commit abc" }],
52
+ async () => {
53
+ const r = await runGate(["--threshold=0.9"]);
54
+ if (r.exitCode !== 0) {
55
+ console.error("FAIL test_1: expected exit 0, got", r.exitCode);
56
+ console.error(r.stdout);
57
+ process.exit(1);
58
+ }
59
+ console.log("PASS test_1: passing-feature with eval present → pass");
60
+ }
61
+ );
62
+
63
+ // ── test 2: fail-rate threshold → fail ───────────────────────────────────────
64
+
65
+ await writeFileSync(join(EVALS_DIR, "F-002.jsonl"), [
66
+ JSON.stringify({ passed: true }),
67
+ JSON.stringify({ passed: true }),
68
+ JSON.stringify({ passed: false }),
69
+ ].join("\n"));
70
+
71
+ await withFeatureList(
72
+ [{ id: "F-002", behavior: "test", state: "passing" }],
73
+ async () => {
74
+ const r = await runGate(["--threshold=0.9"]);
75
+ if (r.exitCode === 0) {
76
+ console.error("FAIL test_2: expected non-zero exit for failing threshold");
77
+ process.exit(1);
78
+ }
79
+ console.log("PASS test_2: fail-rate below threshold → fail");
80
+ }
81
+ );
82
+
83
+ // ── test 3: missing eval flagged → fail ──────────────────────────────────────
84
+
85
+ await withFeatureList(
86
+ [{ id: "F-999", behavior: "test", state: "passing" }],
87
+ async () => {
88
+ const r = await runGate();
89
+ if (r.exitCode === 0) {
90
+ console.error("FAIL test_3: expected non-zero exit for missing eval");
91
+ process.exit(1);
92
+ }
93
+ console.log("PASS test_3: missing eval file → fail");
94
+ }
95
+ );
96
+
97
+ // ── test 4: malformed JSONL tolerated → pass ─────────────────────────────────
98
+
99
+ await writeFileSync(join(EVALS_DIR, "F-003.jsonl"), [
100
+ JSON.stringify({ passed: true }),
101
+ "NOT JSON",
102
+ JSON.stringify({ passed: true }),
103
+ "",
104
+ ].join("\n"));
105
+
106
+ await withFeatureList(
107
+ [{ id: "F-003", behavior: "test", state: "passing" }],
108
+ async () => {
109
+ const r = await runGate();
110
+ if (r.exitCode !== 0) {
111
+ console.error("FAIL test_4: malformed JSONL should be tolerated");
112
+ process.exit(1);
113
+ }
114
+ console.log("PASS test_4: malformed JSONL lines tolerated → pass");
115
+ }
116
+ );
117
+
118
+ // ── test 5: dry-run mode ─────────────────────────────────────────────────────
119
+
120
+ await withFeatureList(
121
+ [{ id: "F-001", behavior: "test", state: "passing" }],
122
+ async () => {
123
+ const r = await runGate(["--dry-run"]);
124
+ if (r.exitCode !== 0) {
125
+ console.error("FAIL test_5: dry-run should always exit 0");
126
+ process.exit(1);
127
+ }
128
+ console.log("PASS test_5: dry-run exits 0 regardless of gate state");
129
+ }
130
+ );
131
+
132
+ // ── cleanup ───────────────────────────────────────────────────────────────────
133
+
134
+ rmSync(join(EVALS_DIR, "F-001.jsonl"), { force: true });
135
+ rmSync(join(EVALS_DIR, "F-002.jsonl"), { force: true });
136
+ rmSync(join(EVALS_DIR, "F-003.jsonl"), { force: true });
137
+
138
+ console.log("\nAll 5 tests passed.");
@@ -0,0 +1,178 @@
1
+ /**
2
+ * feature-state-machine.mjs — Enforce plan→exec→verify→audit state machine
3
+ * per feature in feature_list.json.
4
+ *
5
+ * For each `passing` feature, verifies:
6
+ * 1. evidence field is populated (non-empty string)
7
+ * 2. commit field is populated (non-empty string)
8
+ * 3. make audit score >= 80 (run from feature branch, lenient on missing audit script)
9
+ * 4. eval gate satisfied (delegates to eval-gate.mjs logic)
10
+ *
11
+ * Usage:
12
+ * node scripts/feature-state-machine.mjs [--json] [--dry-run]
13
+ * make feature-state-machine
14
+ */
15
+
16
+ import { readFileSync, existsSync } from "node:fs";
17
+ import { join, dirname } from "node:path";
18
+ import { fileURLToPath } from "node:url";
19
+ import { execSync } from "node:child_process";
20
+
21
+ const __dirname = dirname(fileURLToPath(import.meta.url));
22
+ const ROOT = join(__dirname, "..");
23
+ const FEATURE_LIST_PATH = join(ROOT, "feature_list.json");
24
+ const EVALS_DIR = join(ROOT, ".harness", "evals");
25
+ const AUDIT_SCRIPT = join(ROOT, "tools", "audit-harness.sh");
26
+
27
+ const args = process.argv.slice(2);
28
+ const jsonOutput = args.includes("--json");
29
+ const dryRun = args.includes("--dry-run");
30
+
31
+ function readJson(path) {
32
+ return JSON.parse(readFileSync(path, "utf-8"));
33
+ }
34
+
35
+ /**
36
+ * @param {string} featureId
37
+ * @returns {{score: number, raw: string} | null}
38
+ */
39
+ function runAudit(featureId) {
40
+ if (!existsSync(AUDIT_SCRIPT)) return null;
41
+ try {
42
+ const raw = execSync(`bash "${AUDIT_SCRIPT}" . 2>&1 || true`, {
43
+ cwd: ROOT,
44
+ timeout: 60_000,
45
+ }).toString("utf-8");
46
+
47
+ // Extract score: look for "Score: XX" or "AUDIT SCORE: XX"
48
+ const scoreMatch = raw.match(/score[:\s]+(\d+)/i)
49
+ || raw.match(/(\d+)\s*(?:\/\s*100|%)/);
50
+ const score = scoreMatch ? parseInt(scoreMatch[1], 10) : null;
51
+ return { score: score ?? 0, raw };
52
+ } catch {
53
+ return null;
54
+ }
55
+ }
56
+
57
+ /**
58
+ * @param {string} featureId
59
+ * @returns {{passed: number, total: number, rate: number} | null}
60
+ */
61
+ function evalPassRate(featureId) {
62
+ const evalPath = join(EVALS_DIR, `${featureId}.jsonl`);
63
+ if (!existsSync(evalPath)) return null;
64
+
65
+ try {
66
+ const content = readFileSync(evalPath, "utf-8");
67
+ const lines = content.split("\n").filter((l) => l.trim() !== "");
68
+ let passed = 0;
69
+ let total = 0;
70
+ for (const line of lines) {
71
+ try {
72
+ const record = JSON.parse(line);
73
+ total++;
74
+ if (record.passed === true || record.pass === true || record.status === "pass") {
75
+ passed++;
76
+ }
77
+ } catch {
78
+ // Malformed line — skip (lenient)
79
+ }
80
+ }
81
+ if (total === 0) return null;
82
+ return { passed, total, rate: passed / total };
83
+ } catch {
84
+ return null;
85
+ }
86
+ }
87
+
88
+ /**
89
+ * @param {{id: string, behavior: string, state: string, evidence?: string, commit?: string, auditScore?: number}} feature
90
+ * @returns {{ok: boolean, checks: Record<string, boolean | string>, reasons: string[]}}
91
+ */
92
+ function checkFeature(feature) {
93
+ if (feature.state !== "passing") {
94
+ return { ok: true, checks: {}, reasons: [] };
95
+ }
96
+
97
+ const checks = {};
98
+ const reasons = [];
99
+
100
+ // Check 1: evidence field
101
+ const hasEvidence = Boolean(feature.evidence && feature.evidence.trim().length > 0);
102
+ checks.evidence = hasEvidence;
103
+ if (!hasEvidence) reasons.push("evidence field is empty");
104
+
105
+ // Check 2: commit hash
106
+ const hasCommit = Boolean(feature.commit && feature.commit.trim().length > 0);
107
+ checks.commit = hasCommit;
108
+ if (!hasCommit) reasons.push("commit hash is empty");
109
+
110
+ // Check 3: audit score >= 80
111
+ let auditScore = null;
112
+ if (existsSync(AUDIT_SCRIPT)) {
113
+ const result = runAudit(feature.id);
114
+ if (result) auditScore = result.score;
115
+ }
116
+ const auditPass = auditScore !== null && auditScore >= 80;
117
+ checks.auditScore = auditPass;
118
+ if (auditScore === null) {
119
+ // Lenient: audit script may not exist in all environments
120
+ checks.auditScore = true;
121
+ } else if (!auditPass) {
122
+ reasons.push(`audit score ${auditScore} < 80`);
123
+ }
124
+
125
+ // Check 4: eval gate
126
+ const evalResult = evalPassRate(feature.id);
127
+ const evalPass = evalResult !== null && evalResult.rate >= 0.9;
128
+ checks.evalGate = evalPass;
129
+ if (evalResult === null) {
130
+ // Lenient: no eval file is not a failure
131
+ checks.evalGate = true;
132
+ } else if (!evalPass) {
133
+ reasons.push(`eval pass-rate ${(evalResult.rate * 100).toFixed(1)}% < 90%`);
134
+ }
135
+
136
+ const ok = hasEvidence && hasCommit && (auditPass || auditScore === null) && (evalPass || evalResult === null);
137
+ return { ok, checks, reasons };
138
+ }
139
+
140
+ const featureList = readJson(FEATURE_LIST_PATH);
141
+ const features = featureList.features ?? [];
142
+
143
+ const results = [];
144
+ let passCount = 0;
145
+ let failCount = 0;
146
+
147
+ for (const feature of features) {
148
+ const { ok, checks, reasons } = checkFeature(feature);
149
+ results.push({ featureId: feature.id, behavior: feature.behavior, state: feature.state, ok, checks, reasons });
150
+ if (ok) passCount++;
151
+ else failCount++;
152
+ }
153
+
154
+ if (jsonOutput) {
155
+ console.log(
156
+ JSON.stringify({ total: results.length, passing: passCount, failing: failCount, results }, null, 2)
157
+ );
158
+ } else {
159
+ console.log("\n▶ Feature state machine — passing features\n");
160
+ console.log("─".repeat(60));
161
+ for (const r of results) {
162
+ if (r.state !== "passing") continue;
163
+ if (r.ok) {
164
+ console.log(` PASS ${r.featureId}`);
165
+ } else {
166
+ console.log(` FAIL ${r.featureId}`);
167
+ for (const reason of r.reasons) {
168
+ console.log(` - ${reason}`);
169
+ }
170
+ }
171
+ }
172
+ console.log("─".repeat(60));
173
+ console.log(` ${passCount} passing, ${failCount} failing\n`);
174
+ }
175
+
176
+ if (failCount > 0 && !dryRun) {
177
+ process.exit(1);
178
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * feature-state-machine.test.mjs — Tests for feature-state-machine.mjs
3
+ *
4
+ * Tests:
5
+ * 1. passing feature with all artifacts → pass
6
+ * 2. missing evidence → fail
7
+ * 3. missing commit → fail
8
+ * 4. audit score < 80 → fail
9
+ * 5. eval pass-rate < 0.9 → fail
10
+ */
11
+
12
+ import { writeFileSync, mkdirSync, rmSync, readFileSync } from "node:fs";
13
+ import { join, dirname } from "node:path";
14
+ import { fileURLToPath } from "node:url";
15
+
16
+ const __dirname = dirname(fileURLToPath(import.meta.url));
17
+ const ROOT = join(__dirname, "..");
18
+ const SCRIPT = join(__dirname, "feature-state-machine.mjs");
19
+ const EVALS_DIR = join(ROOT, ".harness", "evals");
20
+ const FEATURE_LIST_PATH = join(ROOT, "feature_list.json");
21
+
22
+ await mkdirSync(EVALS_DIR, { recursive: true });
23
+
24
+ /** @param {string[]} args */
25
+ async function runScript(args = []) {
26
+ const proc = Bun.spawn({
27
+ cmd: ["/home/drb0rk/.bun/bin/bun", "run", SCRIPT, ...args],
28
+ cwd: ROOT,
29
+ env: { PATH: "/home/drb0rk/.bun/bin:/usr/bin:/bin" },
30
+ });
31
+ const [stdout, exitCode] = await Promise.all([
32
+ new Response(proc.stdout).text(),
33
+ proc.exited,
34
+ ]);
35
+ return { stdout, stderr: "", exitCode };
36
+ }
37
+
38
+ function withFeatureList(
39
+ /** @type {object[]} */ features,
40
+ /** @type {() => Promise<void>} */ fn
41
+ ) {
42
+ const orig = readFileSync(FEATURE_LIST_PATH, "utf-8");
43
+ writeFileSync(FEATURE_LIST_PATH, JSON.stringify({ features }, null, 2), "utf-8");
44
+ return fn().finally(() => writeFileSync(FEATURE_LIST_PATH, orig, "utf-8"));
45
+ }
46
+
47
+ // ── test 1: passing with all artifacts → pass ──────────────────────────────────
48
+
49
+ await writeFileSync(join(EVALS_DIR, "F-T1.jsonl"), JSON.stringify({ passed: true }) + "\n");
50
+
51
+ await withFeatureList(
52
+ [{ id: "F-T1", behavior: "test feature 1", state: "passing", evidence: "commit abc123", commit: "abc123" }],
53
+ async () => {
54
+ const r = await runScript(["--dry-run"]);
55
+ if (r.exitCode !== 0) {
56
+ console.error("FAIL test_1:", r.stdout);
57
+ process.exit(1);
58
+ }
59
+ console.log("PASS test_1: passing with all artifacts → pass");
60
+ }
61
+ );
62
+
63
+ // ── test 2: missing evidence → fail ───────────────────────────────────────────
64
+
65
+ await writeFileSync(join(EVALS_DIR, "F-T2.jsonl"), JSON.stringify({ passed: true }) + "\n");
66
+
67
+ await withFeatureList(
68
+ [{ id: "F-T2", behavior: "test", state: "passing", evidence: "", commit: "abc123" }],
69
+ async () => {
70
+ const r = await runScript([]);
71
+ if (r.exitCode === 0) {
72
+ console.error("FAIL test_2: expected non-zero for missing evidence");
73
+ process.exit(1);
74
+ }
75
+ console.log("PASS test_2: missing evidence → fail");
76
+ }
77
+ );
78
+
79
+ // ── test 3: missing commit → fail ─────────────────────────────────────────────
80
+
81
+ await writeFileSync(join(EVALS_DIR, "F-T3.jsonl"), JSON.stringify({ passed: true }) + "\n");
82
+
83
+ await withFeatureList(
84
+ [{ id: "F-T3", behavior: "test", state: "passing", evidence: "commit abc", commit: "" }],
85
+ async () => {
86
+ const r = await runScript([]);
87
+ if (r.exitCode === 0) {
88
+ console.error("FAIL test_3: expected non-zero for missing commit");
89
+ process.exit(1);
90
+ }
91
+ console.log("PASS test_3: missing commit → fail");
92
+ }
93
+ );
94
+
95
+ // ── test 4: eval pass-rate < 0.9 → fail ─────────────────────────────────────
96
+
97
+ // 2 passed, 8 failed = 20% rate < 90%
98
+ await writeFileSync(
99
+ join(EVALS_DIR, "F-T4.jsonl"),
100
+ Array.from({ length: 10 }, (_, i) => JSON.stringify({ passed: i < 2 })).join("\n") + "\n"
101
+ );
102
+
103
+ await withFeatureList(
104
+ [{ id: "F-T4", behavior: "test", state: "passing", evidence: "commit abc", commit: "abc123" }],
105
+ async () => {
106
+ const r = await runScript([]);
107
+ if (r.exitCode === 0) {
108
+ console.error("FAIL test_4: expected non-zero for low eval pass-rate");
109
+ process.exit(1);
110
+ }
111
+ console.log("PASS test_4: eval pass-rate 20% < 90% → fail");
112
+ }
113
+ );
114
+
115
+ // ── test 5: audit script absent → lenient pass ─────────────────────────────────
116
+
117
+ await withFeatureList(
118
+ [{ id: "F-T5", behavior: "test", state: "passing", evidence: "commit abc", commit: "abc123" }],
119
+ async () => {
120
+ const r = await runScript(["--dry-run"]);
121
+ if (r.exitCode !== 0) {
122
+ console.error("FAIL test_5: missing audit script should be tolerated (lenient)");
123
+ process.exit(1);
124
+ }
125
+ console.log("PASS test_5: missing audit script tolerated (lenient)");
126
+ }
127
+ );
128
+
129
+ // ── cleanup ───────────────────────────────────────────────────────────────────
130
+
131
+ for (const id of ["F-T1", "F-T2", "F-T3", "F-T4"]) {
132
+ rmSync(join(EVALS_DIR, `${id}.jsonl`), { force: true });
133
+ }
134
+
135
+ console.log("\nAll 5 tests passed.");