cli-jaw 2.0.6 โ†’ 2.0.13

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 (294) hide show
  1. package/README.ja.md +24 -11
  2. package/README.ko.md +24 -11
  3. package/README.md +95 -11
  4. package/README.zh-CN.md +24 -11
  5. package/dist/bin/cli-jaw.js +4 -1
  6. package/dist/bin/cli-jaw.js.map +1 -1
  7. package/dist/bin/commands/browser-web-ai.js +2 -2
  8. package/dist/bin/commands/browser-web-ai.js.map +1 -1
  9. package/dist/bin/commands/doctor.js +12 -2
  10. package/dist/bin/commands/doctor.js.map +1 -1
  11. package/dist/bin/commands/init.js +4 -2
  12. package/dist/bin/commands/init.js.map +1 -1
  13. package/dist/bin/commands/project.js +167 -0
  14. package/dist/bin/commands/project.js.map +1 -0
  15. package/dist/bin/commands/tui/types.js +20 -4
  16. package/dist/bin/commands/tui/types.js.map +1 -1
  17. package/dist/bin/postinstall.js +226 -24
  18. package/dist/bin/postinstall.js.map +1 -1
  19. package/dist/lib/mime-detect.js +5 -0
  20. package/dist/lib/mime-detect.js.map +1 -1
  21. package/dist/scripts/fresh-install-smoke.js +78 -6
  22. package/dist/scripts/fresh-install-smoke.js.map +1 -1
  23. package/dist/src/agent/agy-runtime.js +15 -0
  24. package/dist/src/agent/agy-runtime.js.map +1 -0
  25. package/dist/src/agent/args.js +44 -5
  26. package/dist/src/agent/args.js.map +1 -1
  27. package/dist/src/agent/cli-helpers.js +1 -1
  28. package/dist/src/agent/cli-helpers.js.map +1 -1
  29. package/dist/src/agent/lifecycle-handler.js +6 -3
  30. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  31. package/dist/src/agent/session-persistence.js +1 -1
  32. package/dist/src/agent/session-persistence.js.map +1 -1
  33. package/dist/src/agent/smoke-detector.js +3 -0
  34. package/dist/src/agent/smoke-detector.js.map +1 -1
  35. package/dist/src/agent/spawn/resume.js +2 -0
  36. package/dist/src/agent/spawn/resume.js.map +1 -1
  37. package/dist/src/agent/spawn-env.js +6 -0
  38. package/dist/src/agent/spawn-env.js.map +1 -1
  39. package/dist/src/agent/spawn.js +120 -15
  40. package/dist/src/agent/spawn.js.map +1 -1
  41. package/dist/src/browser/web-ai/capability-observation-presets.js +1 -1
  42. package/dist/src/browser/web-ai/capability-observation-presets.js.map +1 -1
  43. package/dist/src/browser/web-ai/capability-registry.js +6 -5
  44. package/dist/src/browser/web-ai/capability-registry.js.map +1 -1
  45. package/dist/src/browser/web-ai/chatgpt-attachments.js +7 -0
  46. package/dist/src/browser/web-ai/chatgpt-attachments.js.map +1 -1
  47. package/dist/src/browser/web-ai/context-pack/builder.js +19 -4
  48. package/dist/src/browser/web-ai/context-pack/builder.js.map +1 -1
  49. package/dist/src/browser/web-ai/context-pack/zip-writer.js +116 -0
  50. package/dist/src/browser/web-ai/context-pack/zip-writer.js.map +1 -0
  51. package/dist/src/browser/web-ai/gemini-live.js +21 -3
  52. package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
  53. package/dist/src/browser/web-ai/gemini-model.js +26 -8
  54. package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
  55. package/dist/src/cli/commands.js +2 -0
  56. package/dist/src/cli/commands.js.map +1 -1
  57. package/dist/src/cli/handlers-project.js +55 -0
  58. package/dist/src/cli/handlers-project.js.map +1 -0
  59. package/dist/src/cli/readiness.js +6 -1
  60. package/dist/src/cli/readiness.js.map +1 -1
  61. package/dist/src/cli/registry.js +11 -0
  62. package/dist/src/cli/registry.js.map +1 -1
  63. package/dist/src/core/claude-install.js +10 -1
  64. package/dist/src/core/claude-install.js.map +1 -1
  65. package/dist/src/core/config.js +63 -7
  66. package/dist/src/core/config.js.map +1 -1
  67. package/dist/src/core/db.js +11 -4
  68. package/dist/src/core/db.js.map +1 -1
  69. package/dist/src/core/runtime-settings.js +4 -1
  70. package/dist/src/core/runtime-settings.js.map +1 -1
  71. package/dist/src/manager/metadata.js +7 -2
  72. package/dist/src/manager/metadata.js.map +1 -1
  73. package/dist/src/manager/notes/routes.js +7 -0
  74. package/dist/src/manager/notes/routes.js.map +1 -1
  75. package/dist/src/manager/notes/store.js +72 -0
  76. package/dist/src/manager/notes/store.js.map +1 -1
  77. package/dist/src/manager/registry.js +1 -1
  78. package/dist/src/manager/registry.js.map +1 -1
  79. package/dist/src/manager/scan.js +2 -0
  80. package/dist/src/manager/scan.js.map +1 -1
  81. package/dist/src/messaging/send.js +1 -1
  82. package/dist/src/messaging/send.js.map +1 -1
  83. package/dist/src/orchestrator/distribute.js +25 -4
  84. package/dist/src/orchestrator/distribute.js.map +1 -1
  85. package/dist/src/orchestrator/pipeline.js +21 -5
  86. package/dist/src/orchestrator/pipeline.js.map +1 -1
  87. package/dist/src/orchestrator/state-machine.js +7 -1
  88. package/dist/src/orchestrator/state-machine.js.map +1 -1
  89. package/dist/src/orchestrator/workspace-context.js +49 -14
  90. package/dist/src/orchestrator/workspace-context.js.map +1 -1
  91. package/dist/src/routes/messaging.js +1 -1
  92. package/dist/src/routes/messaging.js.map +1 -1
  93. package/dist/src/routes/orchestrate.js +11 -4
  94. package/dist/src/routes/orchestrate.js.map +1 -1
  95. package/dist/src/routes/settings.js +73 -8
  96. package/dist/src/routes/settings.js.map +1 -1
  97. package/dist/src/security/path-guards.js +35 -14
  98. package/dist/src/security/path-guards.js.map +1 -1
  99. package/dist/src/types/cli-engine.js +1 -0
  100. package/dist/src/types/cli-engine.js.map +1 -1
  101. package/package.json +19 -4
  102. package/public/css/chat.css +6 -2
  103. package/public/dist/assets/{AdvancedExport-CBvz4_IZ.js โ†’ AdvancedExport-CZEVPqHb.js} +1 -1
  104. package/public/dist/assets/{Agent-DlUqCMXJ.js โ†’ Agent-BBrJGd5m.js} +1 -1
  105. package/public/dist/assets/{Browser-66BpLQck.js โ†’ Browser-dBaU9G9D.js} +1 -1
  106. package/public/dist/assets/{ChannelsDiscord-BifT2Dum.js โ†’ ChannelsDiscord-CbmWms9-.js} +1 -1
  107. package/public/dist/assets/{ChannelsTelegram-CK6tYQ8k.js โ†’ ChannelsTelegram-BD4Eyztg.js} +1 -1
  108. package/public/dist/assets/{DashboardMeta-Cc03HT5R.js โ†’ DashboardMeta-LVAL7TtE.js} +1 -1
  109. package/public/dist/assets/{Display-arOjcMQZ.js โ†’ Display-CFm1UmEo.js} +1 -1
  110. package/public/dist/assets/{Employees-YbW-mI67.js โ†’ Employees-DcMChleU.js} +1 -1
  111. package/public/dist/assets/{Heartbeat-CW4eIhtJ.js โ†’ Heartbeat-BoobN35p.js} +1 -1
  112. package/public/dist/assets/{Mcp-ZQ6ARQb6.js โ†’ Mcp-9NU4YkKO.js} +1 -1
  113. package/public/dist/assets/{Memory-BAUWJMqc.js โ†’ Memory-uZT30fww.js} +1 -1
  114. package/public/dist/assets/{MilkdownWysiwygEditor-IAqFtXvM.js โ†’ MilkdownWysiwygEditor-Otw40DDF.js} +1 -1
  115. package/public/dist/assets/{ModelProvider-DUtmFh0J.js โ†’ ModelProvider-CsIOyoZP.js} +1 -1
  116. package/public/dist/assets/{Network-B_4E82zQ.js โ†’ Network-D7hGwnyG.js} +1 -1
  117. package/public/dist/assets/NotesGraphView-CJuk9lKn.js +1 -0
  118. package/public/dist/assets/Permissions-CcIBptg3.js +1 -0
  119. package/public/dist/assets/{Permissions-BkADXjQ4.js โ†’ Permissions-DwdU3wi8.js} +1 -1
  120. package/public/dist/assets/{Profile-BcnTCSYM.js โ†’ Profile-BNTKD_Ex.js} +1 -1
  121. package/public/dist/assets/{Prompts-CUs_RoRE.js โ†’ Prompts-D_mCfYiu.js} +1 -1
  122. package/public/dist/assets/{SpeechKeys-qxc-ROWN.js โ†’ SpeechKeys-BTXCM-Fs.js} +1 -1
  123. package/public/dist/assets/agent-meta-BC7mLqo6.js +1 -0
  124. package/public/dist/assets/{app-CGqTcIeF.js โ†’ app-C7MAcAMu.js} +5 -5
  125. package/public/dist/assets/app-CkFBKUf8.css +1 -0
  126. package/public/dist/assets/{architectureDiagram-3BPJPVTR-kYIVzmWe.js โ†’ architectureDiagram-3BPJPVTR-CJCPEsxo.js} +1 -1
  127. package/public/dist/assets/{blockDiagram-GPEHLZMM-B204CPhe.js โ†’ blockDiagram-GPEHLZMM-CO1bkn0E.js} +2 -2
  128. package/public/dist/assets/{c4Diagram-AAUBKEIU-DAv6TAjg.js โ†’ c4Diagram-AAUBKEIU-D2R36Xu6.js} +1 -1
  129. package/public/dist/assets/{chunk-3OPIFGDE-DOAvk9x8.js โ†’ chunk-3OPIFGDE-DixnEkZw.js} +1 -1
  130. package/public/dist/assets/chunk-55IACEB6-DhWWzzdj.js +1 -0
  131. package/public/dist/assets/{chunk-5ZQYHXKU-Bd-RFO5i.js โ†’ chunk-5ZQYHXKU-Bli4k6GI.js} +2 -2
  132. package/public/dist/assets/{chunk-727SXJPM-BrsRzj8z.js โ†’ chunk-727SXJPM-sp4W8bhf.js} +1 -1
  133. package/public/dist/assets/{chunk-AQP2D5EJ-Di6Gstk-.js โ†’ chunk-AQP2D5EJ-Co6ucdGq.js} +1 -1
  134. package/public/dist/assets/{chunk-KSCS5N6A-D9a4ZkOy.js โ†’ chunk-KSCS5N6A-Beq1s5eO.js} +2 -2
  135. package/public/dist/assets/{chunk-L5ZTLDWV-D208QbfC.js โ†’ chunk-L5ZTLDWV-DfUlBdXN.js} +1 -1
  136. package/public/dist/assets/{chunk-LZXEDZCA-CE2KFduj.js โ†’ chunk-LZXEDZCA-B_yP4UKw.js} +1 -1
  137. package/public/dist/assets/{chunk-ND2GUHAM-zZ7h1CPf.js โ†’ chunk-ND2GUHAM-3qbNb7I9.js} +1 -1
  138. package/public/dist/assets/{chunk-O5CBEL6O-BTuvXKFi.js โ†’ chunk-O5CBEL6O-D-jDqsN2.js} +1 -1
  139. package/public/dist/assets/{chunk-WU5MYG2G-C3fKlSvP.js โ†’ chunk-WU5MYG2G-DlBJtD7-.js} +1 -1
  140. package/public/dist/assets/classDiagram-4FO5ZUOK-DmPJvqRM.js +1 -0
  141. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-ECmTUt7U.js +1 -0
  142. package/public/dist/assets/constants-BXWl7LTi.js +1 -0
  143. package/public/dist/assets/{cose-bilkent-S5V4N54A-D1zmarou.js โ†’ cose-bilkent-S5V4N54A-Bt9AAJCx.js} +1 -1
  144. package/public/dist/assets/{dagre-BM42HDAG-BVkBttzA.js โ†’ dagre-BM42HDAG-CXEA1wvZ.js} +1 -1
  145. package/public/dist/assets/{dagre-DnoxfNXr.js โ†’ dagre-Ve-IAfyz.js} +1 -1
  146. package/public/dist/assets/{diagram-2AECGRRQ-Bs32KPnT.js โ†’ diagram-2AECGRRQ-CCB0OKc2.js} +1 -1
  147. package/public/dist/assets/{diagram-5GNKFQAL-YDYgPOQj.js โ†’ diagram-5GNKFQAL-Cki9HABy.js} +1 -1
  148. package/public/dist/assets/{diagram-KO2AKTUF-1tIdFl26.js โ†’ diagram-KO2AKTUF-DNBDjE2o.js} +1 -1
  149. package/public/dist/assets/{diagram-LMA3HP47-B1y15kav.js โ†’ diagram-LMA3HP47-Cy23RDPa.js} +1 -1
  150. package/public/dist/assets/{diagram-OG6HWLK6-C25j1jGg.js โ†’ diagram-OG6HWLK6-CT_YF8cA.js} +1 -1
  151. package/public/dist/assets/dist-3R3GxjCf.js +13 -0
  152. package/public/dist/assets/{dist-D0PYXGt2.js โ†’ dist-BLd7xdyq.js} +1 -1
  153. package/public/dist/assets/{dist-fJAyK82z.js โ†’ dist-BaRrwDy3.js} +1 -1
  154. package/public/dist/assets/{dist-Rs_Khtjb.js โ†’ dist-Bbsp4OF7.js} +1 -1
  155. package/public/dist/assets/{dist-Cv8S3FhF.js โ†’ dist-BkBGlG70.js} +1 -1
  156. package/public/dist/assets/{dist-0v1UKkQ3.js โ†’ dist-BkJ_1mj9.js} +1 -1
  157. package/public/dist/assets/{dist-BQNQk-1M.js โ†’ dist-BxCRVW5D.js} +1 -1
  158. package/public/dist/assets/{dist-DDDFJ8jG.js โ†’ dist-C-v7Rm67.js} +1 -1
  159. package/public/dist/assets/dist-CNgDEAy8.js +1 -0
  160. package/public/dist/assets/dist-CO_W5rr2.js +1 -0
  161. package/public/dist/assets/{dist-vQskrHxt.js โ†’ dist-ChAUfTbO.js} +1 -1
  162. package/public/dist/assets/{dist-CjPin7Mr.js โ†’ dist-D-k-lzQT.js} +1 -1
  163. package/public/dist/assets/dist-D1hPukqY.js +1 -0
  164. package/public/dist/assets/{dist-C1VqWrYZ.js โ†’ dist-D5Qx-jQQ.js} +1 -1
  165. package/public/dist/assets/{dist-DTQW91xt.js โ†’ dist-D7VNzYBv.js} +1 -1
  166. package/public/dist/assets/{dist-DHQI31dn.js โ†’ dist-DAxnodoa.js} +1 -1
  167. package/public/dist/assets/{dist-CnIrGAPx.js โ†’ dist-DHSyODkR.js} +1 -1
  168. package/public/dist/assets/{dist-CE4s7vg82.js โ†’ dist-DaYTPjbb2.js} +1 -1
  169. package/public/dist/assets/{dist-jcptfm_T.js โ†’ dist-DlWi9tVO.js} +1 -1
  170. package/public/dist/assets/{dist-D66X8iAn.js โ†’ dist-DuuoJfRB.js} +1 -1
  171. package/public/dist/assets/{dist-DzT7frM2.js โ†’ dist-Dv36UUXz.js} +1 -1
  172. package/public/dist/assets/{dist-BVpa_e6W.js โ†’ dist-F4CVhitP.js} +1 -1
  173. package/public/dist/assets/{dist-Qs7HHNCC.js โ†’ dist-LHbJYy3N.js} +1 -1
  174. package/public/dist/assets/{dist-Ck6PnIlo.js โ†’ dist-VIlx7JdU.js} +1 -1
  175. package/public/dist/assets/{dist-D5GUqT-6.js โ†’ dist-cgDt2PmY.js} +1 -1
  176. package/public/dist/assets/dist-eW2LjRIK.js +1 -0
  177. package/public/dist/assets/{dist-Dm7RAaUo.js โ†’ dist-vGn3_sWA.js} +1 -1
  178. package/public/dist/assets/{employees-DRmX2RDd.js โ†’ employees-BmxY8Mw3.js} +1 -1
  179. package/public/dist/assets/{erDiagram-TEJ5UH35-CRvCbztR.js โ†’ erDiagram-TEJ5UH35-Cq7oHdXg.js} +1 -1
  180. package/public/dist/assets/{flowDiagram-I6XJVG4X-CzvVnib_.js โ†’ flowDiagram-I6XJVG4X-D8CdEnfM.js} +1 -1
  181. package/public/dist/assets/ganttDiagram-6RSMTGT7-B1rzKXi_.js +292 -0
  182. package/public/dist/assets/{gitGraphDiagram-PVQCEYII-CbKdM7nW.js โ†’ gitGraphDiagram-PVQCEYII-CqLh-joi.js} +1 -1
  183. package/public/dist/assets/{graphlib-BLOO0H5r.js โ†’ graphlib-W5bESv3F.js} +1 -1
  184. package/public/dist/assets/{infoDiagram-5YYISTIA-BrZmg1At.js โ†’ infoDiagram-5YYISTIA-C1zVxumj.js} +1 -1
  185. package/public/dist/assets/{ishikawaDiagram-YF4QCWOH-BDWXqJi5.js โ†’ ishikawaDiagram-YF4QCWOH-x-9J6xPM.js} +1 -1
  186. package/public/dist/assets/{journeyDiagram-JHISSGLW-CPFRd_M3.js โ†’ journeyDiagram-JHISSGLW-BDYzHrtn.js} +1 -1
  187. package/public/dist/assets/{kanban-definition-UN3LZRKU-BcQbBplS.js โ†’ kanban-definition-UN3LZRKU-BJ-06i6Z.js} +1 -1
  188. package/public/dist/assets/manager-B2NWzG7j.css +1 -0
  189. package/public/dist/assets/manager-C5e1IxEN.js +25 -0
  190. package/public/dist/assets/memory-BqqibBIE.js +1 -0
  191. package/public/dist/assets/{memory-BA-ki3gn.js โ†’ memory-CRL72HB-.js} +1 -1
  192. package/public/dist/assets/mermaid-loader-Dqb4ZUz6.js +1 -0
  193. package/public/dist/assets/{mermaid.core-ArqR5iFa.js โ†’ mermaid.core-D8VnfThU.js} +2 -2
  194. package/public/dist/assets/mermaid.core-DYHvk6Pd.js +1 -0
  195. package/public/dist/assets/{mindmap-definition-RKZ34NQL-C35cGkNU.js โ†’ mindmap-definition-RKZ34NQL-D8NDuIhn.js} +1 -1
  196. package/public/dist/assets/{pieDiagram-4H26LBE5-B8C_hoqJ.js โ†’ pieDiagram-4H26LBE5-CpBePil_.js} +3 -3
  197. package/public/dist/assets/{quadrantDiagram-W4KKPZXB-BEPrine5.js โ†’ quadrantDiagram-W4KKPZXB-C1WWpn88.js} +1 -1
  198. package/public/dist/assets/{render-C7_e0J_X.js โ†’ render-o_YEiCEO.js} +2 -2
  199. package/public/dist/assets/{requirementDiagram-4Y6WPE33-ClDDon9c.js โ†’ requirementDiagram-4Y6WPE33-C_D5VbNk.js} +1 -1
  200. package/public/dist/assets/{sankeyDiagram-5OEKKPKP-Bjs3OE-1.js โ†’ sankeyDiagram-5OEKKPKP--RH3Es8R.js} +3 -3
  201. package/public/dist/assets/{sequenceDiagram-3UESZ5HK-BM8IAaEe.js โ†’ sequenceDiagram-3UESZ5HK-CVI4AjhN.js} +1 -1
  202. package/public/dist/assets/settings-B0RlyAkI.js +1 -0
  203. package/public/dist/assets/settings-CCXRL5Ar.js +46 -0
  204. package/public/dist/assets/sidebar-DRJffqO1.js +14 -0
  205. package/public/dist/assets/skills-CFdzXbtK.js +1 -0
  206. package/public/dist/assets/{skills-Dq7fD8I3.js โ†’ skills-DbRVI-zf.js} +1 -1
  207. package/public/dist/assets/slash-commands-BUM6u-Ex.js +1 -0
  208. package/public/dist/assets/{slash-commands-DRsKtuGT.js โ†’ slash-commands-C2YBMaQV.js} +1 -1
  209. package/public/dist/assets/{stateDiagram-AJRCARHV-BvNABuXE.js โ†’ stateDiagram-AJRCARHV-4bx1rPZ3.js} +1 -1
  210. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CrfGPzHb.js +1 -0
  211. package/public/dist/assets/{timeline-definition-PNZ67QCA-CIvTvac3.js โ†’ timeline-definition-PNZ67QCA-DeQoGRE2.js} +1 -1
  212. package/public/dist/assets/{trace-drawer-DDFdU07_.js โ†’ trace-drawer-CIVBXyRH.js} +1 -1
  213. package/public/dist/assets/ui-C3ArwMhv.js +140 -0
  214. package/public/dist/assets/ui-CboUuc_E.js +1 -0
  215. package/public/dist/assets/vendor-utils-rVejrfMR.js +1 -0
  216. package/public/dist/assets/{vennDiagram-CIIHVFJN-C5cbS2KC.js โ†’ vennDiagram-CIIHVFJN-CejyJK0L.js} +1 -1
  217. package/public/dist/assets/{wardleyDiagram-YWT4CUSO-BsRBBGFP.js โ†’ wardleyDiagram-YWT4CUSO-DqXV0sa1.js} +1 -1
  218. package/public/dist/assets/wiki-link-suggestions-e5BzJAZH.js +23 -0
  219. package/public/dist/assets/{xychartDiagram-2RQKCTM6-B6rqui6F.js โ†’ xychartDiagram-2RQKCTM6-CWLoVl2b.js} +2 -2
  220. package/public/dist/index.html +20 -2
  221. package/public/dist/manager/index.html +2 -2
  222. package/public/index.html +18 -0
  223. package/public/js/constants.ts +12 -1
  224. package/public/js/features/settings-cli-status.ts +27 -4
  225. package/public/js/features/settings-core.ts +28 -15
  226. package/public/js/features/settings-types.ts +1 -0
  227. package/public/js/features/ui-status.ts +3 -0
  228. package/public/js/ws.ts +5 -1
  229. package/public/manager/src/SidebarRailRouter.tsx +5 -2
  230. package/public/manager/src/api.ts +13 -0
  231. package/public/manager/src/components/WorkbenchHeader.tsx +10 -0
  232. package/public/manager/src/manager-notes.css +228 -0
  233. package/public/manager/src/notes/NotesBacklinksPanel.tsx +91 -0
  234. package/public/manager/src/notes/NotesCommandPalette.tsx +212 -0
  235. package/public/manager/src/notes/NotesGraphView.tsx +145 -0
  236. package/public/manager/src/notes/NotesSidebar.tsx +183 -5
  237. package/public/manager/src/notes/NotesToolbar.tsx +9 -3
  238. package/public/manager/src/notes/NotesWorkspace.tsx +140 -4
  239. package/public/manager/src/notes/notes-api.ts +2 -0
  240. package/public/manager/src/notes/notes-command-registry.tsx +79 -0
  241. package/public/manager/src/notes/notes-quick-switcher.css +151 -0
  242. package/public/manager/src/notes/notes-shortcuts.ts +23 -0
  243. package/public/manager/src/notes/notes-types.ts +1 -1
  244. package/public/manager/src/notes/template-engine.ts +27 -0
  245. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +7 -1
  246. package/public/manager/src/types.ts +2 -1
  247. package/scripts/audit-fresh-install-evidence.mjs +278 -0
  248. package/scripts/collect-fresh-install-evidence.sh +459 -0
  249. package/scripts/fresh-install-smoke.ts +85 -6
  250. package/scripts/install-officecli.ps1 +14 -1
  251. package/scripts/install-risk-gate.mjs +161 -0
  252. package/scripts/install-wsl.sh +78 -16
  253. package/scripts/install.sh +272 -72
  254. package/scripts/postinstall-guard.cjs +2 -2
  255. package/scripts/release-preview.sh +25 -3
  256. package/scripts/release.sh +37 -8
  257. package/scripts/require-release-evidence.mjs +236 -0
  258. package/scripts/verify-fresh-install.sh +120 -0
  259. package/scripts/verify-release-evidence.mjs +158 -0
  260. package/public/dist/assets/Permissions-DvUCB8wA.js +0 -1
  261. package/public/dist/assets/agent-meta-Du8y6mSM.js +0 -1
  262. package/public/dist/assets/app-Dpk6cE6C.css +0 -1
  263. package/public/dist/assets/chunk-55IACEB6-Dx2JkQLw.js +0 -1
  264. package/public/dist/assets/classDiagram-4FO5ZUOK-Cb-qL5u3.js +0 -1
  265. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BPhGdj15.js +0 -1
  266. package/public/dist/assets/constants-BxG09J6S.js +0 -1
  267. package/public/dist/assets/dist-BMi_buEb.js +0 -1
  268. package/public/dist/assets/dist-BkrbW_LS.js +0 -1
  269. package/public/dist/assets/dist-C3vh7d65.js +0 -13
  270. package/public/dist/assets/dist-D815C1Fv.js +0 -1
  271. package/public/dist/assets/dist-sOV2kBhQ.js +0 -1
  272. package/public/dist/assets/ganttDiagram-6RSMTGT7-BbUYP6iv.js +0 -292
  273. package/public/dist/assets/manager-B5OmizBL.css +0 -1
  274. package/public/dist/assets/manager-Cs3eMBcx.js +0 -25
  275. package/public/dist/assets/memory-DLQbyBA3.js +0 -1
  276. package/public/dist/assets/mermaid-loader-BVPsKrpr.js +0 -1
  277. package/public/dist/assets/mermaid.core-BAwu4U2Y.js +0 -1
  278. package/public/dist/assets/settings-DjyKdqev.js +0 -1
  279. package/public/dist/assets/settings-pUJzyeX2.js +0 -42
  280. package/public/dist/assets/sidebar-CO9Qjj6v.js +0 -14
  281. package/public/dist/assets/skills-CX3qJ77s.js +0 -1
  282. package/public/dist/assets/slash-commands-UbS8w9ij.js +0 -1
  283. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CCIo81qy.js +0 -1
  284. package/public/dist/assets/ui-CeBmBBZM.js +0 -140
  285. package/public/dist/assets/ui-TMXjvH0r.js +0 -1
  286. package/public/dist/assets/vendor-utils-BnxL60_-.js +0 -1
  287. package/public/dist/assets/wiki-link-suggestions-BHwNQXT_.js +0 -23
  288. /package/public/dist/assets/{HealthBadge-DEPFkcA0.js โ†’ HealthBadge-CfLTPTPW.js} +0 -0
  289. /package/public/dist/assets/{InlineWarn-DoJS7AgM.js โ†’ InlineWarn-C7ISyzDI.js} +0 -0
  290. /package/public/dist/assets/{fields-DUawAHWZ.js โ†’ fields-BwD_NGxe.js} +0 -0
  291. /package/public/dist/assets/{locale-BHMJIzyw.js โ†’ locale-DT1WRaeJ.js} +0 -0
  292. /package/public/dist/assets/{page-shell-CVAobxbP.js โ†’ page-shell-uNOxwdbr.js} +0 -0
  293. /package/public/dist/assets/{path-utils-r2bJIu28.js โ†’ path-utils-h2GAj3hH.js} +0 -0
  294. /package/public/dist/assets/{provider-icons-dxT69zGg.js โ†’ provider-icons-ClVd2suJ.js} +0 -0
@@ -19,17 +19,19 @@ ok() { echo -e "${GREEN}โœ”${NC} $*"; }
19
19
  warn() { echo -e "${YELLOW}โš ${NC} $*"; }
20
20
  fail() { echo -e "${RED}โœ–${NC} $*"; exit 1; }
21
21
 
22
- echo ""
23
- echo -e "${CYAN}${BOLD}"
24
- echo " โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—"
25
- echo " โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘"
26
- echo " โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ•— โ–ˆโ–ˆโ•‘"
27
- echo " โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ•šโ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘"
28
- echo " โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ–ˆโ•”โ–ˆโ–ˆโ–ˆโ•”โ•"
29
- echo " โ•šโ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ•โ•šโ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•šโ•โ•โ•"
30
- echo -e "${NC}"
31
- echo -e "${DIM} One-Click Installer${NC}"
32
- echo ""
22
+ print_banner() {
23
+ echo ""
24
+ echo -e "${CYAN}${BOLD}"
25
+ echo " โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—"
26
+ echo " โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘"
27
+ echo " โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ•— โ–ˆโ–ˆโ•‘"
28
+ echo " โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ•šโ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘"
29
+ echo " โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ–ˆโ•”โ–ˆโ–ˆโ–ˆโ•”โ•"
30
+ echo " โ•šโ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ•โ•šโ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•šโ•โ•โ•"
31
+ echo -e "${NC}"
32
+ echo -e "${DIM} One-Click Installer${NC}"
33
+ echo ""
34
+ }
33
35
 
34
36
  NODE_MAJOR=22
35
37
 
@@ -41,21 +43,43 @@ resolve_cmd() {
41
43
  command -v "$1" 2>/dev/null || true
42
44
  }
43
45
 
44
- get_installed_jaw_binary() {
45
- local jaw_bin
46
- jaw_bin="$(resolve_cmd jaw)"
47
- if [ -n "$jaw_bin" ]; then
48
- printf '%s\n' "$jaw_bin"
46
+ list_path_cmd_candidates() {
47
+ local name="${1:-}"
48
+ local dir candidate seen=":"
49
+ if [ -z "$name" ]; then
49
50
  return 0
50
51
  fi
51
52
 
52
- local cli_jaw_bin
53
- cli_jaw_bin="$(resolve_cmd cli-jaw)"
54
- if [ -n "$cli_jaw_bin" ]; then
55
- printf '%s\n' "$cli_jaw_bin"
56
- return 0
57
- fi
53
+ IFS=':' read -r -a path_parts <<< "${PATH:-}"
54
+ for dir in "${path_parts[@]}"; do
55
+ if [ -z "$dir" ]; then
56
+ dir="."
57
+ fi
58
+ candidate="${dir%/}/$name"
59
+ case "$seen" in
60
+ *":$candidate:"*) continue ;;
61
+ esac
62
+ seen="${seen}${candidate}:"
63
+ if [ -x "$candidate" ] && [ ! -d "$candidate" ]; then
64
+ printf '%s\n' "$candidate"
65
+ fi
66
+ done
67
+ }
58
68
 
69
+ get_installed_jaw_binary() {
70
+ local name candidate
71
+ for name in jaw cli-jaw; do
72
+ while IFS= read -r candidate; do
73
+ if [ -z "$candidate" ]; then
74
+ continue
75
+ fi
76
+ if [ -n "$(get_binary_version "$candidate")" ]; then
77
+ printf '%s\n' "$candidate"
78
+ return 0
79
+ fi
80
+ warn "$name exists but failed --version: $candidate"
81
+ done < <(list_path_cmd_candidates "$name")
82
+ done
59
83
  return 1
60
84
  }
61
85
 
@@ -71,6 +95,18 @@ get_latest_cli_jaw_version() {
71
95
  extract_semver "$(npm view cli-jaw version 2>/dev/null || true)"
72
96
  }
73
97
 
98
+ ensure_macos_developer_tools() {
99
+ if [ "$(uname -s)" != "Darwin" ]; then
100
+ return 0
101
+ fi
102
+
103
+ if xcode-select -p >/dev/null 2>&1 && git --version >/dev/null 2>&1; then
104
+ return 0
105
+ fi
106
+
107
+ fail "Xcode Command Line Tools are required before installing Node via nvm. Run: xcode-select --install Then rerun this installer after it completes."
108
+ }
109
+
74
110
  realpath_fallback() {
75
111
  local target="${1:-}"
76
112
  if [ -z "$target" ]; then
@@ -79,6 +115,120 @@ realpath_fallback() {
79
115
  node -e "const fs=require('fs');const p=process.argv[1];try{console.log(fs.realpathSync(p));}catch{console.log(p)}" "$target" 2>/dev/null || printf '%s\n' "$target"
80
116
  }
81
117
 
118
+ zsh_config_dir() {
119
+ printf '%s\n' "${ZDOTDIR:-$HOME}"
120
+ }
121
+
122
+ is_zsh_shell() {
123
+ case "${SHELL:-/bin/bash}" in
124
+ */zsh) return 0 ;;
125
+ *) return 1 ;;
126
+ esac
127
+ }
128
+
129
+ npm_is_usable() {
130
+ command -v npm &>/dev/null && npm --version &>/dev/null
131
+ }
132
+
133
+ ensure_nvm_shell_profile() {
134
+ local profile="${1:-}"
135
+ if [ -z "$profile" ] || [ "$profile" = "your shell config" ]; then
136
+ return 0
137
+ fi
138
+
139
+ case "$profile" in
140
+ "~/"*) profile="${HOME}/${profile#~/}" ;;
141
+ esac
142
+
143
+ mkdir -p "$(dirname "$profile")"
144
+ touch "$profile"
145
+
146
+ if ! grep -Fq 'NVM_DIR="$HOME/.nvm"' "$profile" 2>/dev/null; then
147
+ {
148
+ echo ''
149
+ echo 'export NVM_DIR="$HOME/.nvm"'
150
+ echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"'
151
+ echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"'
152
+ } >> "$profile"
153
+ fi
154
+ }
155
+
156
+ ensure_path_shell_profile() {
157
+ local profile="${1:-}"
158
+ local path_line="${2:-}"
159
+ if [ -z "$profile" ] || [ -z "$path_line" ] || [ "$profile" = "your shell config" ]; then
160
+ return 0
161
+ fi
162
+
163
+ case "$profile" in
164
+ "~/"*) profile="${HOME}/${profile#~/}" ;;
165
+ esac
166
+
167
+ mkdir -p "$(dirname "$profile")"
168
+ touch "$profile"
169
+
170
+ if ! grep -Fq "$path_line" "$profile" 2>/dev/null; then
171
+ {
172
+ echo ''
173
+ echo "$path_line"
174
+ } >> "$profile"
175
+ fi
176
+ }
177
+
178
+ ensure_local_bin_path() {
179
+ local path_line='export PATH="$HOME/.local/bin:$PATH"'
180
+ case ":${PATH:-}:" in
181
+ *":$HOME/.local/bin:"*) ;;
182
+ *) export PATH="$HOME/.local/bin:${PATH:-}" ;;
183
+ esac
184
+
185
+ case "${SHELL:-/bin/bash}" in
186
+ */zsh)
187
+ local zdir
188
+ zdir="$(zsh_config_dir)"
189
+ ensure_path_shell_profile "$zdir/.zshrc" "$path_line"
190
+ ensure_path_shell_profile "$zdir/.zprofile" "$path_line"
191
+ ;;
192
+ */bash)
193
+ ensure_path_shell_profile "~/.bashrc" "$path_line"
194
+ ensure_path_shell_profile "~/.bash_profile" "$path_line"
195
+ ;;
196
+ *)
197
+ ensure_path_shell_profile "~/.profile" "$path_line"
198
+ ;;
199
+ esac
200
+ }
201
+
202
+ is_runnable_cli_tool() {
203
+ local bin="${1:-}"
204
+ if [ -z "$bin" ]; then
205
+ return 1
206
+ fi
207
+ command -v "$bin" &>/dev/null && "$bin" --version &>/dev/null
208
+ }
209
+
210
+ unavailable_required_cli_tools() {
211
+ local missing=()
212
+ local bin
213
+ for bin in claude codex gemini grok copilot opencode; do
214
+ if ! is_runnable_cli_tool "$bin"; then
215
+ missing+=("$bin")
216
+ fi
217
+ done
218
+
219
+ local joined=""
220
+ if [ "${#missing[@]}" -gt 0 ]; then
221
+ for bin in "${missing[@]}"; do
222
+ if [ -n "$joined" ]; then
223
+ joined="${joined}, ${bin}"
224
+ else
225
+ joined="$bin"
226
+ fi
227
+ done
228
+ fi
229
+ printf '%s\n' "$joined"
230
+ }
231
+
82
232
  # Shell-level Claude install classifier โ€” mirrors src/core/claude-install.ts
83
233
  # Returns: native | node-managed | unknown
84
234
  classify_claude_install_sh() {
@@ -164,18 +314,26 @@ print_cli_dependency_guidance() {
164
314
  # Step 1: Ensure Node.js โ‰ฅ 22
165
315
  # โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
166
316
  ensure_node() {
317
+ local install_reason="Node.js โ‰ฅ ${NODE_MAJOR} not found"
318
+
167
319
  # Already have Node.js โ‰ฅ 22?
168
320
  if command -v node &>/dev/null; then
169
321
  local ver
170
322
  ver=$(node -v | sed 's/v//' | cut -d. -f1)
171
323
  if [ "$ver" -ge "$NODE_MAJOR" ] 2>/dev/null; then
172
- ok "Node.js $(node -v) detected โ€” good to go"
173
- return 0
324
+ if npm_is_usable; then
325
+ ok "Node.js $(node -v) with npm $(npm --version) detected โ€” good to go"
326
+ return 0
327
+ fi
328
+ warn "Node.js $(node -v) found but npm is missing or not runnable โ€” repairing Node.js install..."
329
+ install_reason="Node.js $(node -v) found without runnable npm"
330
+ else
331
+ warn "Node.js $(node -v) found but need โ‰ฅ ${NODE_MAJOR}"
332
+ install_reason="Node.js $(node -v) is below ${NODE_MAJOR}"
174
333
  fi
175
- warn "Node.js $(node -v) found but need โ‰ฅ ${NODE_MAJOR}"
176
334
  fi
177
335
 
178
- info "Node.js โ‰ฅ ${NODE_MAJOR} not found โ€” installing..."
336
+ info "${install_reason} โ€” installing..."
179
337
 
180
338
  # Strategy: brew โ†’ nvm โ†’ fail
181
339
  if command -v brew &>/dev/null; then
@@ -187,12 +345,12 @@ ensure_node() {
187
345
  if command -v node &>/dev/null; then
188
346
  local brew_ver
189
347
  brew_ver=$(node -v | sed 's/v//' | cut -d. -f1)
190
- if [ "$brew_ver" -ge "$NODE_MAJOR" ] 2>/dev/null; then
191
- ok "Node.js $(node -v) installed via Homebrew"
348
+ if [ "$brew_ver" -ge "$NODE_MAJOR" ] 2>/dev/null && npm_is_usable; then
349
+ ok "Node.js $(node -v) with npm $(npm --version) installed via Homebrew"
192
350
  return 0
193
351
  fi
194
352
  fi
195
- warn "Homebrew installed but Node.js โ‰ฅ ${NODE_MAJOR} not working โ€” falling through to nvm"
353
+ warn "Homebrew installed but Node.js โ‰ฅ ${NODE_MAJOR} with npm is not working โ€” falling through to nvm"
196
354
  else
197
355
  warn "Homebrew install failed โ€” falling through to nvm"
198
356
  fi
@@ -200,10 +358,22 @@ ensure_node() {
200
358
 
201
359
  # brew unavailable or failed โ†’ install nvm + Node.js
202
360
  info "Installing via nvm"
361
+ ensure_macos_developer_tools
203
362
  export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
204
363
 
364
+ local shell_rc
365
+ case "${SHELL:-/bin/bash}" in
366
+ */zsh) shell_rc="$(zsh_config_dir)/.zshrc" ;;
367
+ */bash) shell_rc="$HOME/.bashrc" ;;
368
+ *) shell_rc="your shell config" ;;
369
+ esac
370
+ ensure_nvm_shell_profile "$shell_rc"
371
+ if is_zsh_shell; then
372
+ ensure_nvm_shell_profile "$(zsh_config_dir)/.zprofile"
373
+ fi
374
+
205
375
  if [ ! -s "$NVM_DIR/nvm.sh" ]; then
206
- curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
376
+ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | PROFILE="$shell_rc" bash
207
377
  fi
208
378
 
209
379
  # Source nvm
@@ -217,15 +387,16 @@ ensure_node() {
217
387
  nvm install "$NODE_MAJOR"
218
388
  nvm use "$NODE_MAJOR"
219
389
  nvm alias default "$NODE_MAJOR"
220
- ok "Node.js $(node -v) installed via nvm"
390
+ if ! npm_is_usable; then
391
+ fail "Node.js installed but npm is not runnable. Please reinstall Node.js โ‰ฅ ${NODE_MAJOR} from https://nodejs.org"
392
+ fi
393
+ ok "Node.js $(node -v) with npm $(npm --version) installed via nvm"
221
394
 
222
395
  # Remind user to add nvm to their shell
223
- local shell_rc
224
- case "${SHELL:-/bin/bash}" in
225
- */zsh) shell_rc="~/.zshrc" ;;
226
- */bash) shell_rc="~/.bashrc" ;;
227
- *) shell_rc="your shell config" ;;
228
- esac
396
+ ensure_nvm_shell_profile "$shell_rc"
397
+ if is_zsh_shell; then
398
+ ensure_nvm_shell_profile "$(zsh_config_dir)/.zprofile"
399
+ fi
229
400
  echo ""
230
401
  warn "For future sessions, nvm is auto-added to ${shell_rc}"
231
402
  echo -e "${DIM} If 'node' is not found after restarting terminal, run: source ${shell_rc}${NC}"
@@ -235,21 +406,30 @@ ensure_node() {
235
406
  # Step 2: Install CLI-JAW
236
407
  # โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
237
408
  install_cli_jaw() {
238
- local installed_bin installed_version latest_version
409
+ local installed_bin installed_version latest_version missing_cli_tools
239
410
  installed_bin="$(get_installed_jaw_binary || true)"
240
411
  installed_version="$(get_binary_version "$installed_bin")"
241
412
  latest_version="$(get_latest_cli_jaw_version)"
413
+ missing_cli_tools="$(unavailable_required_cli_tools)"
242
414
 
243
415
  # If npm view failed (network issue) and we already have a working install, skip
244
416
  if [ -z "$latest_version" ] && [ -n "$installed_bin" ] && [ -n "$installed_version" ]; then
245
- warn "Could not fetch latest version (network issue?) โ€” keeping existing ${installed_version}"
246
- ok "CLI-JAW ${installed_version} at ${installed_bin} โ€” skipping update"
247
- return 0
417
+ if [ -z "$missing_cli_tools" ]; then
418
+ warn "Could not fetch latest version (network issue?) โ€” keeping existing ${installed_version}"
419
+ ok "CLI-JAW ${installed_version} at ${installed_bin} โ€” skipping update"
420
+ return 0
421
+ fi
422
+ warn "Could not fetch latest version, but bundled CLI tools are missing: ${missing_cli_tools}"
423
+ warn "Attempting npm repair install anyway"
248
424
  fi
249
425
 
250
426
  if [ -n "$installed_bin" ] && [ -n "$installed_version" ] && [ -n "$latest_version" ] && [ "$installed_version" = "$latest_version" ]; then
251
- ok "CLI-JAW ${installed_version} already installed at ${installed_bin} โ€” skipping npm install"
252
- return 0
427
+ if [ -z "$missing_cli_tools" ]; then
428
+ ok "CLI-JAW ${installed_version} already installed at ${installed_bin} โ€” skipping npm install"
429
+ return 0
430
+ fi
431
+ warn "CLI-JAW ${installed_version} already installed, but bundled CLI tools are missing: ${missing_cli_tools}"
432
+ warn "Re-running npm install to repair the partial install"
253
433
  fi
254
434
 
255
435
  # Detect package manager from existing install path to avoid shared-path contamination
@@ -272,7 +452,22 @@ install_cli_jaw() {
272
452
  info "Installing CLI-JAW..."
273
453
  fi
274
454
  export CLI_JAW_INSTALL_CLI_TOOLS=1
275
- export CLI_JAW_REQUIRE_CLI_TOOLS=1
455
+ if [ "${CLI_JAW_STRICT_ONE_CLICK:-0}" = "1" ] \
456
+ || [ "${CLI_JAW_STRICT_ONE_CLICK:-}" = "true" ] \
457
+ || [ "${CLI_JAW_REQUIRE_CLI_TOOLS:-0}" = "1" ] \
458
+ || [ "${CLI_JAW_REQUIRE_CLI_TOOLS:-}" = "true" ] \
459
+ || [ "${npm_config_jaw_require_cli_tools:-0}" = "1" ] \
460
+ || [ "${npm_config_jaw_require_cli_tools:-}" = "true" ]; then
461
+ export CLI_JAW_REQUIRE_CLI_TOOLS=1
462
+ else
463
+ unset CLI_JAW_REQUIRE_CLI_TOOLS 2>/dev/null || true
464
+ unset npm_config_jaw_require_cli_tools 2>/dev/null || true
465
+ fi
466
+ if ! command -v cargo &>/dev/null; then
467
+ export CLAUDE_E_SKIP_BUILD="${CLAUDE_E_SKIP_BUILD:-1}"
468
+ warn "Rust Cargo not found โ€” skipping optional claude-e native helper build"
469
+ warn "Install Rust later and reinstall claude-e if you need the Claude E runtime"
470
+ fi
276
471
  eval "$pkg_cmd"
277
472
 
278
473
  hash -r 2>/dev/null || true
@@ -413,31 +608,36 @@ run_doctor() {
413
608
  fi
414
609
  }
415
610
 
416
- # โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
417
- # Run
418
- # โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
419
- ensure_node
420
- echo ""
421
- install_cli_jaw
422
- echo ""
423
- install_browser_deps
424
- echo ""
425
- run_doctor
426
- echo ""
427
- install_officecli
428
- echo ""
429
- print_cli_dependency_guidance
430
-
431
- echo ""
432
- echo -e "${GREEN}${BOLD}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
433
- echo -e "${GREEN}${BOLD} ๐Ÿฆˆ CLI-JAW is ready!${NC}"
434
- echo -e "${GREEN}${BOLD}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
435
- echo ""
436
- echo -e " Run: ${CYAN}jaw dashboard${NC}"
437
- echo -e " Also: ${CYAN}jaw serve${NC} ${DIM}# classic server mode${NC}"
438
- echo ""
439
- echo -e "${DIM} Tip: Authenticate at least one AI engine:${NC}"
440
- echo -e "${DIM} gh auth login # GitHub Copilot (free)${NC}"
441
- echo -e "${DIM} claude auth login # Anthropic Claude${NC}"
442
- echo -e "${DIM} codex login # OpenAI Codex${NC}"
443
- echo ""
611
+ main() {
612
+ print_banner
613
+ ensure_node
614
+ ensure_local_bin_path
615
+ echo ""
616
+ install_cli_jaw
617
+ echo ""
618
+ install_browser_deps
619
+ echo ""
620
+ install_officecli
621
+ echo ""
622
+ run_doctor
623
+ echo ""
624
+ print_cli_dependency_guidance
625
+
626
+ echo ""
627
+ echo -e "${GREEN}${BOLD}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
628
+ echo -e "${GREEN}${BOLD} ๐Ÿฆˆ CLI-JAW is ready!${NC}"
629
+ echo -e "${GREEN}${BOLD}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
630
+ echo ""
631
+ echo -e " Run: ${CYAN}jaw dashboard${NC}"
632
+ echo -e " Also: ${CYAN}jaw serve${NC} ${DIM}# classic server mode${NC}"
633
+ echo ""
634
+ echo -e "${DIM} Tip: Authenticate at least one AI engine:${NC}"
635
+ echo -e "${DIM} gh auth login # GitHub Copilot (free)${NC}"
636
+ echo -e "${DIM} claude auth login # Anthropic Claude${NC}"
637
+ echo -e "${DIM} codex login # OpenAI Codex${NC}"
638
+ echo ""
639
+ }
640
+
641
+ if [ "${CLI_JAW_SOURCE_ONLY:-0}" != "1" ]; then
642
+ main "$@"
643
+ fi
@@ -89,7 +89,7 @@ if (!fs.existsSync(target)) {
89
89
  }
90
90
 
91
91
  runCompiledPostinstall().catch((error) => {
92
- console.error('[jaw:init] โŒ postinstall failed');
92
+ console.error('[jaw:init] โš ๏ธ postinstall error (non-fatal):');
93
93
  console.error(error instanceof Error ? error.message : String(error));
94
- process.exit(1);
94
+ process.exit(0);
95
95
  });
@@ -71,9 +71,29 @@ ELECTRON_RELEASE_NOTES="$ELECTRON_RELEASE_NOTES_BASE$ELECTRON_RELEASE_NOTES_UNSI
71
71
  NPM_LATEST=$(npm view cli-jaw dist-tags.latest 2>/dev/null || echo "")
72
72
  PKG_VERSION=$(node -p "require('./package.json').version")
73
73
 
74
- # Use npm latest > package.json, strip prerelease suffix
75
- RAW_VERSION="${NPM_LATEST:-$PKG_VERSION}"
76
- RAW_VERSION=$(echo "$RAW_VERSION" | sed 's/-.*//')
74
+ max_stable_version() {
75
+ node - "$1" "$2" <<'NODE'
76
+ const values = process.argv.slice(2).map((value) => String(value || '0.0.0').replace(/-.*/, ''));
77
+ function parts(value) {
78
+ const match = value.match(/^(\d+)\.(\d+)\.(\d+)$/);
79
+ if (!match) return [0, 0, 0];
80
+ return match.slice(1).map(Number);
81
+ }
82
+ values.sort((a, b) => {
83
+ const pa = parts(a);
84
+ const pb = parts(b);
85
+ for (let i = 0; i < 3; i += 1) {
86
+ if (pa[i] !== pb[i]) return pb[i] - pa[i];
87
+ }
88
+ return 0;
89
+ });
90
+ console.log(values[0]);
91
+ NODE
92
+ }
93
+
94
+ # Use the higher stable version from npm latest and package.json. This keeps
95
+ # preview releases ahead of npm without moving an ahead checkout backwards.
96
+ RAW_VERSION=$(max_stable_version "${NPM_LATEST:-0.0.0}" "$PKG_VERSION")
77
97
 
78
98
  # Bump per BUMP_KIND so preview > latest in semver
79
99
  IFS='.' read -r MAJOR MINOR PATCH <<< "$RAW_VERSION"
@@ -141,6 +161,8 @@ run_electron_release_checks
141
161
  echo "๐Ÿ›ก๏ธ Running release gates (gate:all)..."
142
162
  npm run gate:all
143
163
 
164
+ node scripts/require-release-evidence.mjs
165
+
144
166
  echo "๐Ÿงช Verifying npm package contents..."
145
167
  npm pack --dry-run >/dev/null
146
168
 
@@ -66,12 +66,40 @@ PKG_VERSION=$(node -p "require('./package.json').version")
66
66
  echo "๐Ÿ“ก npm latest: $NPM_LATEST"
67
67
  echo "๐Ÿ“ฆ package.json: $PKG_VERSION"
68
68
 
69
- # Sync package.json to npm latest if behind (strip prerelease)
69
+ PREV_TAG=$(git tag --sort=-v:refname | grep -E '^v[0-9]' | head -1)
70
+
71
+ semver_cmp() {
72
+ node - "$1" "$2" <<'NODE'
73
+ const [a, b] = process.argv.slice(2).map((value) => String(value || '0.0.0').replace(/-.*/, ''));
74
+ function parts(value) {
75
+ const match = value.match(/^(\d+)\.(\d+)\.(\d+)$/);
76
+ if (!match) return [0, 0, 0];
77
+ return match.slice(1).map(Number);
78
+ }
79
+ const pa = parts(a);
80
+ const pb = parts(b);
81
+ for (let i = 0; i < 3; i += 1) {
82
+ if (pa[i] > pb[i]) process.exit(1);
83
+ if (pa[i] < pb[i]) process.exit(2);
84
+ }
85
+ process.exit(0);
86
+ NODE
87
+ }
88
+
89
+ # Sync package.json to npm latest only if this checkout is behind npm.
90
+ # Never move a release checkout backwards just because npm latest has not
91
+ # caught up yet; failed OTP publishes commonly leave local tags ahead.
70
92
  CLEAN_NPM=$(echo "$NPM_LATEST" | sed 's/-.*//')
71
93
  CLEAN_PKG=$(echo "$PKG_VERSION" | sed 's/-.*//')
72
94
  if [ "$CLEAN_PKG" != "$CLEAN_NPM" ] && [ "$CLEAN_NPM" != "0.0.0" ]; then
73
- echo "โš ๏ธ package.json ($CLEAN_PKG) differs from npm ($CLEAN_NPM). Syncing..."
74
- npm version "$CLEAN_NPM" --no-git-tag-version --allow-same-version
95
+ CMP=0
96
+ semver_cmp "$CLEAN_PKG" "$CLEAN_NPM" || CMP=$?
97
+ if [ "$CMP" -eq 2 ]; then
98
+ echo "โš ๏ธ package.json ($CLEAN_PKG) is behind npm ($CLEAN_NPM). Syncing forward..."
99
+ npm version "$CLEAN_NPM" --no-git-tag-version --allow-same-version
100
+ else
101
+ echo "โ„น๏ธ package.json ($CLEAN_PKG) is ahead of npm ($CLEAN_NPM); keeping checkout version."
102
+ fi
75
103
  fi
76
104
 
77
105
  # โ”€โ”€โ”€ Build โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
@@ -98,7 +126,6 @@ VERSION=$(node -p "require('./package.json').version")
98
126
  echo "๐Ÿ“Œ New version: $VERSION"
99
127
 
100
128
  # โ”€โ”€โ”€ Collect changelog โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
101
- PREV_TAG=$(git tag --sort=-v:refname | grep -E '^v[0-9]' | head -1)
102
129
  if [ -n "$PREV_TAG" ]; then
103
130
  CHANGELOG=$(git log "$PREV_TAG"..HEAD --pretty=format:"- %s" --no-merges | head -50)
104
131
  COMMIT_COUNT=$(git rev-list "$PREV_TAG"..HEAD --count)
@@ -112,6 +139,12 @@ echo "๐Ÿ“ Changes since ${PREV_TAG:-'(none)'} ($COMMIT_COUNT commits):"
112
139
  echo "$CHANGELOG" | head -15
113
140
  echo ""
114
141
 
142
+ # โ”€โ”€โ”€ Release gates โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
143
+ echo "๐Ÿ›ก๏ธ Running release gates (gate:all)..."
144
+ npm run gate:all
145
+
146
+ node scripts/require-release-evidence.mjs
147
+
115
148
  # โ”€โ”€โ”€ Commit + Tag + Push โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
116
149
  echo "๐Ÿท๏ธ Creating git tag v$VERSION..."
117
150
  git add package.json package-lock.json
@@ -120,10 +153,6 @@ git tag "v$VERSION"
120
153
  git push origin master
121
154
  git push origin "v$VERSION"
122
155
 
123
- # โ”€โ”€โ”€ Release gates โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
124
- echo "๐Ÿ›ก๏ธ Running release gates (gate:all)..."
125
- npm run gate:all
126
-
127
156
  # โ”€โ”€โ”€ npm publish โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
128
157
  echo "๐Ÿš€ Publishing to npm..."
129
158
  npm publish --access public