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
@@ -0,0 +1,459 @@
1
+ #!/usr/bin/env bash
2
+ # Collect fresh-machine install evidence for supported CLI-JAW targets.
3
+ set -uo pipefail
4
+
5
+ TARGET="auto"
6
+ SKIP_INSTALL=0
7
+ SKIP_DOCTOR=0
8
+ OUT_DIR=""
9
+ INSTALL_SCRIPT="${CLI_JAW_INSTALL_SCRIPT:-}"
10
+ VERIFIER_SCRIPT="${CLI_JAW_VERIFIER_SCRIPT:-}"
11
+ INSTALL_REF="${CLI_JAW_INSTALL_REF:-master}"
12
+ RAW_BASE="${CLI_JAW_RAW_BASE:-https://raw.githubusercontent.com/lidge-jun/cli-jaw/${INSTALL_REF}}"
13
+ FAILURES=0
14
+
15
+ usage() {
16
+ cat <<'USAGE'
17
+ Usage: collect-fresh-install-evidence.sh [options]
18
+
19
+ Options:
20
+ --target macos|wsl|linux|auto Target to verify. Default: auto.
21
+ --skip-install Do not run the one-click installer; only collect and verify.
22
+ --skip-doctor Pass --skip-doctor to verify-fresh-install.sh.
23
+ --out-dir DIR Evidence output directory.
24
+ --install-script FILE Local installer path override for the selected target.
25
+ --verifier-script FILE Local verifier path override.
26
+ --install-ref REF Git ref for raw.githubusercontent.com installer fetches.
27
+ --raw-base URL Override raw script base URL.
28
+ -h, --help Show this help.
29
+
30
+ Environment:
31
+ CLI_JAW_INSTALL_SCRIPT Default local installer path when --install-script is omitted.
32
+ CLI_JAW_VERIFIER_SCRIPT Default local verifier path when --verifier-script is omitted.
33
+ CLI_JAW_INSTALL_REF Default git ref when --install-ref is omitted.
34
+ CLI_JAW_RAW_BASE Default raw base URL when --raw-base is omitted.
35
+ CLI_JAW_EVIDENCE_DIR Default output directory when --out-dir is omitted.
36
+ USAGE
37
+ }
38
+
39
+ while [ "$#" -gt 0 ]; do
40
+ case "$1" in
41
+ --target)
42
+ [ "$#" -ge 2 ] || { echo "Missing value for --target" >&2; exit 2; }
43
+ TARGET="$2"
44
+ shift 2
45
+ ;;
46
+ --skip-install)
47
+ SKIP_INSTALL=1
48
+ shift
49
+ ;;
50
+ --skip-doctor)
51
+ SKIP_DOCTOR=1
52
+ shift
53
+ ;;
54
+ --out-dir)
55
+ [ "$#" -ge 2 ] || { echo "Missing value for --out-dir" >&2; exit 2; }
56
+ OUT_DIR="$2"
57
+ shift 2
58
+ ;;
59
+ --install-script)
60
+ [ "$#" -ge 2 ] || { echo "Missing value for --install-script" >&2; exit 2; }
61
+ INSTALL_SCRIPT="$2"
62
+ shift 2
63
+ ;;
64
+ --verifier-script)
65
+ [ "$#" -ge 2 ] || { echo "Missing value for --verifier-script" >&2; exit 2; }
66
+ VERIFIER_SCRIPT="$2"
67
+ shift 2
68
+ ;;
69
+ --install-ref)
70
+ [ "$#" -ge 2 ] || { echo "Missing value for --install-ref" >&2; exit 2; }
71
+ INSTALL_REF="$2"
72
+ RAW_BASE="https://raw.githubusercontent.com/lidge-jun/cli-jaw/${INSTALL_REF}"
73
+ shift 2
74
+ ;;
75
+ --raw-base)
76
+ [ "$#" -ge 2 ] || { echo "Missing value for --raw-base" >&2; exit 2; }
77
+ RAW_BASE="${2%/}"
78
+ shift 2
79
+ ;;
80
+ -h|--help)
81
+ usage
82
+ exit 0
83
+ ;;
84
+ *)
85
+ echo "Unknown option: $1" >&2
86
+ usage >&2
87
+ exit 2
88
+ ;;
89
+ esac
90
+ done
91
+
92
+ now_utc() {
93
+ date -u +"%Y-%m-%dT%H:%M:%SZ"
94
+ }
95
+
96
+ detect_target() {
97
+ local kernel
98
+ kernel="$(uname -s 2>/dev/null || true)"
99
+ case "$kernel" in
100
+ Darwin) echo "macos" ;;
101
+ Linux)
102
+ if grep -qiE "microsoft|wsl" /proc/version /proc/sys/kernel/osrelease 2>/dev/null || [ -n "${WSL_DISTRO_NAME:-}" ]; then
103
+ echo "wsl"
104
+ else
105
+ echo "linux"
106
+ fi
107
+ ;;
108
+ MINGW*|MSYS*|CYGWIN*)
109
+ echo "native-windows"
110
+ ;;
111
+ *)
112
+ echo "unsupported"
113
+ ;;
114
+ esac
115
+ }
116
+
117
+ if [ "$TARGET" = "auto" ]; then
118
+ TARGET="$(detect_target)"
119
+ fi
120
+
121
+ case "$TARGET" in
122
+ macos|wsl|linux) ;;
123
+ native-windows)
124
+ echo "Native Windows/Git Bash is not a supported CLI-JAW install target. Use WSL." >&2
125
+ exit 2
126
+ ;;
127
+ *)
128
+ echo "Unsupported target: $TARGET" >&2
129
+ exit 2
130
+ ;;
131
+ esac
132
+
133
+ if [ -z "$OUT_DIR" ]; then
134
+ OUT_DIR="${CLI_JAW_EVIDENCE_DIR:-$HOME/cli-jaw-fresh-install-evidence-$(date -u +%Y%m%d-%H%M%S)}"
135
+ fi
136
+ mkdir -p "$OUT_DIR"
137
+ SUMMARY="$OUT_DIR/summary.txt"
138
+ : > "$SUMMARY"
139
+
140
+ record() {
141
+ printf '%s %s\n' "$(now_utc)" "$*" >> "$SUMMARY"
142
+ }
143
+
144
+ file_sha256() {
145
+ local file="$1"
146
+ if command -v shasum >/dev/null 2>&1; then
147
+ shasum -a 256 "$file" | awk '{print $1}'
148
+ return 0
149
+ fi
150
+ if command -v sha256sum >/dev/null 2>&1; then
151
+ sha256sum "$file" | awk '{print $1}'
152
+ return 0
153
+ fi
154
+ if command -v openssl >/dev/null 2>&1; then
155
+ openssl dgst -sha256 -r "$file" | awk '{print $1}'
156
+ return 0
157
+ fi
158
+ return 1
159
+ }
160
+
161
+ archive_local_script() {
162
+ local label="$1"
163
+ local source="$2"
164
+ local dest="$3"
165
+
166
+ cp "$source" "$dest"
167
+ chmod +x "$dest" 2>/dev/null || true
168
+ local digest
169
+ digest="$(file_sha256 "$dest" 2>/dev/null || true)"
170
+ record "SCRIPT label=\"$label\" source=\"$source\" file=\"$dest\" sha256=\"$digest\""
171
+ }
172
+
173
+ archive_remote_script() {
174
+ local label="$1"
175
+ local url="$2"
176
+ local dest="$3"
177
+
178
+ curl -fsSL -o "$dest" "$url"
179
+ chmod +x "$dest" 2>/dev/null || true
180
+ local digest
181
+ digest="$(file_sha256 "$dest" 2>/dev/null || true)"
182
+ record "SCRIPT label=\"$label\" source=\"$url\" file=\"$dest\" sha256=\"$digest\""
183
+ }
184
+
185
+ archive_collector_script() {
186
+ local source="${BASH_SOURCE[0]:-}"
187
+ local archived_collector="$OUT_DIR/00-collector-script.sh"
188
+
189
+ if [ -n "$source" ] && [ -f "$source" ]; then
190
+ archive_local_script "collector" "$source" "$archived_collector"
191
+ return 0
192
+ fi
193
+
194
+ record "WARN collector script source is not a readable file; download the collector before running it for release evidence"
195
+ echo "warning: collector script source is not a readable file; release audit will require $archived_collector" >&2
196
+ }
197
+
198
+ record "target=$TARGET"
199
+ record "raw_base=$RAW_BASE"
200
+ record "install_script=$INSTALL_SCRIPT"
201
+ record "verifier_script=$VERIFIER_SCRIPT"
202
+ record "skip_install=$SKIP_INSTALL"
203
+ record "skip_doctor=$SKIP_DOCTOR"
204
+ record "out_dir=$OUT_DIR"
205
+
206
+ run_logged() {
207
+ local label="$1"
208
+ local logfile="$2"
209
+ shift 2
210
+
211
+ echo
212
+ echo "== $label =="
213
+ record "RUN label=\"$label\" log=\"$logfile\" command=\"$*\""
214
+ "$@" 2>&1 | tee "$logfile"
215
+ local status=${PIPESTATUS[0]}
216
+ record "DONE label=\"$label\" status=$status"
217
+ if [ "$status" -ne 0 ]; then
218
+ FAILURES=$((FAILURES + 1))
219
+ echo "!! $label failed with exit $status"
220
+ fi
221
+ return "$status"
222
+ }
223
+
224
+ run_shell_logged() {
225
+ local label="$1"
226
+ local logfile="$2"
227
+ local command="$3"
228
+
229
+ echo
230
+ echo "== $label =="
231
+ record "RUN label=\"$label\" log=\"$logfile\" shell=\"bash -lc\" command=\"$command\""
232
+ bash -lc "$command" 2>&1 | tee "$logfile"
233
+ local status=${PIPESTATUS[0]}
234
+ record "DONE label=\"$label\" status=$status"
235
+ if [ "$status" -ne 0 ]; then
236
+ FAILURES=$((FAILURES + 1))
237
+ echo "!! $label failed with exit $status"
238
+ fi
239
+ return "$status"
240
+ }
241
+
242
+ run_optional_logged() {
243
+ local label="$1"
244
+ local logfile="$2"
245
+ shift 2
246
+
247
+ echo
248
+ echo "== $label =="
249
+ record "RUN optional label=\"$label\" log=\"$logfile\" command=\"$*\""
250
+ "$@" 2>&1 | tee "$logfile"
251
+ local status=${PIPESTATUS[0]}
252
+ record "DONE optional label=\"$label\" status=$status"
253
+ if [ "$status" -ne 0 ]; then
254
+ echo "!! optional $label failed with exit $status"
255
+ fi
256
+ return 0
257
+ }
258
+
259
+ run_optional_shell_logged() {
260
+ local label="$1"
261
+ local logfile="$2"
262
+ local command="$3"
263
+
264
+ echo
265
+ echo "== $label =="
266
+ record "RUN optional label=\"$label\" log=\"$logfile\" shell=\"bash -lc\" command=\"$command\""
267
+ bash -lc "$command" 2>&1 | tee "$logfile"
268
+ local status=${PIPESTATUS[0]}
269
+ record "DONE optional label=\"$label\" status=$status"
270
+ if [ "$status" -ne 0 ]; then
271
+ echo "!! optional $label failed with exit $status"
272
+ fi
273
+ return 0
274
+ }
275
+
276
+ collect_snapshot() {
277
+ local label="$1"
278
+ local file="$2"
279
+ {
280
+ echo "label=$label"
281
+ echo "timestamp_utc=$(now_utc)"
282
+ echo "target=$TARGET"
283
+ echo "uname=$(uname -a 2>/dev/null || true)"
284
+ if command -v sw_vers >/dev/null 2>&1; then
285
+ sw_vers
286
+ fi
287
+ echo "shell=${SHELL:-}"
288
+ echo "home=$HOME"
289
+ echo "zdotdir=${ZDOTDIR:-}"
290
+ echo "path=${PATH:-}"
291
+ if command -v xcode-select >/dev/null 2>&1; then
292
+ echo "xcode_select=$(xcode-select -p 2>&1 || true)"
293
+ fi
294
+ if [ -r /etc/os-release ]; then
295
+ sed -n '1,20p' /etc/os-release
296
+ fi
297
+ for cmd in zsh bash git curl node npm nvm cargo rustc jaw cli-jaw claude codex gemini grok opencode copilot officecli powershell.exe wsl.exe; do
298
+ if command -v "$cmd" >/dev/null 2>&1; then
299
+ echo "$cmd=$(command -v "$cmd")"
300
+ else
301
+ echo "$cmd=missing"
302
+ fi
303
+ done
304
+ } > "$file" 2>&1
305
+ echo "snapshot: $file"
306
+ record "SNAPSHOT label=\"$label\" file=\"$file\""
307
+ }
308
+
309
+ refresh_runtime_paths() {
310
+ export PATH="$HOME/.local/bin:${PATH:-}"
311
+ export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
312
+ if [ -s "$NVM_DIR/nvm.sh" ]; then
313
+ # shellcheck disable=SC1090
314
+ . "$NVM_DIR/nvm.sh"
315
+ fi
316
+ if command -v nvm >/dev/null 2>&1; then
317
+ nvm use default >/dev/null 2>&1 || nvm use 22 >/dev/null 2>&1 || true
318
+ fi
319
+ if command -v npm >/dev/null 2>&1; then
320
+ local npm_prefix
321
+ npm_prefix="$(npm prefix -g 2>/dev/null || true)"
322
+ if [ -n "$npm_prefix" ] && [ -d "${npm_prefix%/}/bin" ]; then
323
+ export PATH="${npm_prefix%/}/bin:$PATH"
324
+ fi
325
+ fi
326
+ }
327
+
328
+ local_verifier_for_install_script() {
329
+ if [ -z "$INSTALL_SCRIPT" ]; then
330
+ return 1
331
+ fi
332
+
333
+ local install_dir
334
+ install_dir="$(dirname "$INSTALL_SCRIPT")"
335
+ if [ -f "$install_dir/verify-fresh-install.sh" ]; then
336
+ printf '%s\n' "$install_dir/verify-fresh-install.sh"
337
+ return 0
338
+ fi
339
+ return 1
340
+ }
341
+
342
+ installer_script_name() {
343
+ case "$TARGET" in
344
+ wsl) echo "install-wsl.sh" ;;
345
+ macos|linux) echo "install.sh" ;;
346
+ esac
347
+ }
348
+
349
+ run_installer() {
350
+ local script_name
351
+ script_name="$(installer_script_name)"
352
+ local archived_installer="$OUT_DIR/02-installer-script.sh"
353
+
354
+ if [ "$SKIP_INSTALL" = "1" ]; then
355
+ record "SKIP installer"
356
+ echo "== installer skipped =="
357
+ return 0
358
+ fi
359
+
360
+ if [ -n "$INSTALL_SCRIPT" ]; then
361
+ archive_local_script "installer" "$INSTALL_SCRIPT" "$archived_installer"
362
+ else
363
+ archive_remote_script "installer" "$RAW_BASE/scripts/$script_name" "$archived_installer"
364
+ fi
365
+ run_logged "CLI-JAW one-click installer" "$OUT_DIR/01-install.log" bash "$archived_installer"
366
+ }
367
+
368
+ run_verifier() {
369
+ local args=()
370
+ local verifier=""
371
+ local verifier_label="packaged fresh-install verifier"
372
+ local archived_verifier="$OUT_DIR/21-verifier-script.sh"
373
+ if [ "$SKIP_DOCTOR" = "1" ]; then
374
+ args+=(--skip-doctor)
375
+ fi
376
+
377
+ if [ -n "$VERIFIER_SCRIPT" ]; then
378
+ verifier="$VERIFIER_SCRIPT"
379
+ verifier_label="local fresh-install verifier"
380
+ elif verifier="$(local_verifier_for_install_script 2>/dev/null || true)" && [ -n "$verifier" ]; then
381
+ verifier_label="local fresh-install verifier from installer checkout"
382
+ elif command -v npm >/dev/null 2>&1; then
383
+ local npm_root
384
+ npm_root="$(npm root -g 2>/dev/null || true)"
385
+ if [ -n "$npm_root" ] && [ -f "$npm_root/cli-jaw/scripts/verify-fresh-install.sh" ]; then
386
+ verifier="$npm_root/cli-jaw/scripts/verify-fresh-install.sh"
387
+ fi
388
+ fi
389
+
390
+ if [ -n "$verifier" ]; then
391
+ archive_local_script "verifier" "$verifier" "$archived_verifier"
392
+ run_logged "$verifier_label" "$OUT_DIR/20-verify.log" bash "$archived_verifier" "${args[@]}"
393
+ else
394
+ archive_remote_script "verifier" "$RAW_BASE/scripts/verify-fresh-install.sh" "$archived_verifier"
395
+ run_logged "raw fresh-install verifier" "$OUT_DIR/20-verify.log" bash "$archived_verifier" "${args[@]}"
396
+ fi
397
+ }
398
+
399
+ run_shell_probes() {
400
+ local probe='set -e; printf "node_path="; command -v node; node --version; printf "npm_path="; command -v npm; npm --version; printf "jaw_path="; command -v jaw; jaw --version'
401
+
402
+ if [ "$TARGET" = "macos" ]; then
403
+ run_optional_shell_logged "bash login-shell probe (non-default on macOS)" "$OUT_DIR/30-bash-login-probe.log" "$probe"
404
+ else
405
+ run_shell_logged "current bash login-shell probe" "$OUT_DIR/30-bash-login-probe.log" "$probe"
406
+ fi
407
+
408
+ if command -v zsh >/dev/null 2>&1; then
409
+ if [ "$TARGET" = "macos" ]; then
410
+ run_logged "zsh login-shell probe" "$OUT_DIR/31-zsh-login-probe.log" zsh -lc "$probe"
411
+ run_logged "zsh interactive-shell probe" "$OUT_DIR/32-zsh-interactive-probe.log" zsh -ic "$probe"
412
+ else
413
+ run_optional_logged "zsh login-shell probe (non-default outside macOS)" "$OUT_DIR/31-zsh-login-probe.log" zsh -lc "$probe"
414
+ run_optional_logged "zsh interactive-shell probe (non-default outside macOS)" "$OUT_DIR/32-zsh-interactive-probe.log" zsh -ic "$probe"
415
+ fi
416
+ else
417
+ record "SKIP zsh probes: zsh not found"
418
+ fi
419
+
420
+ if [ "$TARGET" = "wsl" ]; then
421
+ local distro="${WSL_DISTRO_NAME:-Ubuntu}"
422
+ record "PowerShell host probe command: wsl.exe -d $distro -- bash -lc \"jaw --version\""
423
+ if command -v powershell.exe >/dev/null 2>&1; then
424
+ run_logged "PowerShell-to-WSL jaw probe" "$OUT_DIR/33-powershell-to-wsl-probe.log" \
425
+ powershell.exe -NoProfile -Command "\$ErrorActionPreference = 'Stop'; wsl.exe -d '$distro' -- bash -lc 'jaw --version'"
426
+ else
427
+ record "SKIP PowerShell-to-WSL probe: powershell.exe not found inside WSL"
428
+ echo "PowerShell-to-WSL probe skipped: powershell.exe not found inside WSL"
429
+ echo "Run this from Windows PowerShell, then re-run the auditor:"
430
+ cat <<EOF
431
+ wsl.exe -d $distro -- bash -lc 'EVIDENCE_DIR="\$(ls -dt ~/cli-jaw-fresh-install-evidence-* | head -1)"; { echo "command=wsl.exe -d $distro -- bash -lc jaw --version"; jaw --version; } | tee "\$EVIDENCE_DIR/33-powershell-to-wsl-probe.log"'
432
+ EOF
433
+ fi
434
+ fi
435
+ }
436
+
437
+ echo "CLI-JAW fresh-machine evidence collector"
438
+ echo "target=$TARGET"
439
+ echo "out_dir=$OUT_DIR"
440
+
441
+ archive_collector_script
442
+ collect_snapshot "before" "$OUT_DIR/00-before.txt"
443
+ run_installer || true
444
+ refresh_runtime_paths
445
+ collect_snapshot "after" "$OUT_DIR/10-after.txt"
446
+ run_verifier || true
447
+ run_shell_probes || true
448
+
449
+ if [ "$FAILURES" -eq 0 ]; then
450
+ record "RESULT pass"
451
+ echo
452
+ echo "PASS evidence_dir=$OUT_DIR"
453
+ exit 0
454
+ fi
455
+
456
+ record "RESULT fail failures=$FAILURES"
457
+ echo
458
+ echo "FAIL failures=$FAILURES evidence_dir=$OUT_DIR"
459
+ exit 1
@@ -5,6 +5,33 @@ import path from 'node:path';
5
5
  import { execFileSync, spawn, type ChildProcess, type ExecFileSyncOptions } from 'node:child_process';
6
6
 
7
7
  const root: string = process.cwd();
8
+ const npmCmd = 'npm';
9
+ const jawCmd = 'jaw';
10
+
11
+ interface Args {
12
+ mode: 'safe' | 'postinstall';
13
+ skipDoctor: boolean;
14
+ }
15
+
16
+ function parseArgs(argv: string[]): Args {
17
+ const args: Args = { mode: 'safe', skipDoctor: false };
18
+ for (const arg of argv) {
19
+ if (arg === '--safe') {
20
+ args.mode = 'safe';
21
+ continue;
22
+ }
23
+ if (arg === '--postinstall') {
24
+ args.mode = 'postinstall';
25
+ continue;
26
+ }
27
+ if (arg === '--skip-doctor') {
28
+ args.skipDoctor = true;
29
+ continue;
30
+ }
31
+ throw new Error(`unknown option: ${arg}`);
32
+ }
33
+ return args;
34
+ }
8
35
 
9
36
  function run(cmd: string, args: string[], opts: ExecFileSyncOptions = {}): string {
10
37
  return execFileSync(cmd, args, {
@@ -44,17 +71,26 @@ function resolveInstalledPackage(prefix: string): string {
44
71
  throw new Error(`installed package path not found under prefix: ${prefix}`);
45
72
  }
46
73
 
74
+ function npmGlobalBin(prefix: string): string {
75
+ return path.join(prefix, 'bin');
76
+ }
77
+
47
78
  interface NpmPackResult {
48
79
  filename?: string;
49
80
  }
50
81
 
51
82
  async function main(): Promise<void> {
83
+ if (process.platform === 'win32') {
84
+ throw new Error('fresh-install-smoke targets macOS/Linux/WSL. On Windows, run it inside WSL.');
85
+ }
86
+
87
+ const args = parseArgs(process.argv.slice(2));
52
88
  let tarballPath: string | null = null;
53
89
  let tmp: string | null = null;
54
90
  let server: ChildProcess | null = null;
55
91
 
56
92
  try {
57
- const packOut = run('npm', ['pack', '--json']);
93
+ const packOut = run(npmCmd, ['pack', '--json']);
58
94
  const pack: NpmPackResult[] = JSON.parse(packOut);
59
95
  const tarballName = pack[0]?.filename;
60
96
  if (!tarballName) throw new Error('npm pack did not return filename');
@@ -63,22 +99,57 @@ async function main(): Promise<void> {
63
99
  if (!fs.existsSync(tarballPath)) throw new Error(`tarball not found: ${tarballPath}`);
64
100
 
65
101
  tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'jaw-fresh-'));
102
+ const homeTmp = fs.mkdtempSync(path.join(os.homedir(), '.cli-jaw-fresh-smoke-'));
66
103
  const prefix = path.join(tmp, 'prefix');
67
- const jawHome = path.join(tmp, 'jaw-home');
104
+ const jawHome = path.join(homeTmp, 'jaw-home');
68
105
  fs.mkdirSync(prefix, { recursive: true });
69
106
 
70
- const installEnv: NodeJS.ProcessEnv = { ...process.env, JAW_SAFE: '1', npm_config_loglevel: 'error' };
71
- run('npm', ['i', '-g', tarballPath, '--prefix', prefix], { env: installEnv });
107
+ const binDir = npmGlobalBin(prefix);
108
+ const pathWithGlobalBin = [binDir, process.env["PATH"] || ''].filter(Boolean).join(path.delimiter);
109
+ fs.writeFileSync(path.join(homeTmp, '.zshrc'), `export PATH=${JSON.stringify(pathWithGlobalBin)}\n`);
110
+ fs.writeFileSync(path.join(homeTmp, '.zprofile'), `export PATH=${JSON.stringify(pathWithGlobalBin)}\n`);
111
+ const installEnv: NodeJS.ProcessEnv = {
112
+ ...process.env,
113
+ CLI_JAW_HOME: jawHome,
114
+ npm_config_loglevel: 'error',
115
+ npm_config_prefix: prefix,
116
+ PATH: pathWithGlobalBin,
117
+ Path: process.env["Path"],
118
+ ZDOTDIR: homeTmp,
119
+ };
120
+ if (args.mode === 'safe') {
121
+ installEnv["JAW_SAFE"] = '1';
122
+ } else {
123
+ delete installEnv["JAW_SAFE"];
124
+ installEnv["CLI_JAW_SKIP_CLAUDE"] = '1';
125
+ installEnv["CLI_JAW_SKIP_OFFICECLI"] = '1';
126
+ installEnv["CLI_JAW_SKIP_MCP_SERVERS"] = '1';
127
+ installEnv["CLI_JAW_SKIP_SKILL_DEPS"] = '1';
128
+ }
129
+ run(npmCmd, ['i', '-g', tarballPath, '--prefix', prefix], { env: installEnv });
72
130
 
73
131
  const pkgDir = resolveInstalledPackage(prefix);
74
132
  const jawEntry = path.join(pkgDir, 'dist', 'bin', 'cli-jaw.js');
75
133
  if (!fs.existsSync(jawEntry)) throw new Error(`cli entry not found: ${jawEntry}`);
76
134
 
77
- const jawEnv: NodeJS.ProcessEnv = { ...process.env, CLI_JAW_HOME: jawHome };
135
+ const jawEnv: NodeJS.ProcessEnv = {
136
+ ...process.env,
137
+ CLI_JAW_HOME: jawHome,
138
+ npm_config_prefix: prefix,
139
+ PATH: pathWithGlobalBin,
140
+ Path: process.env["Path"],
141
+ ZDOTDIR: homeTmp,
142
+ };
78
143
 
79
- const version = run(process.execPath, [jawEntry, '--version'], { env: jawEnv }).trim();
144
+ const version = run(jawCmd, ['--version'], { env: jawEnv }).trim();
80
145
  if (!version.toLowerCase().includes('cli-jaw')) throw new Error(`unexpected version output: ${version}`);
81
146
 
147
+ if (args.mode === 'postinstall') {
148
+ const verifier = path.join(pkgDir, 'scripts', 'verify-fresh-install.sh');
149
+ if (!fs.existsSync(verifier)) throw new Error(`fresh-install verifier not found in package: ${verifier}`);
150
+ run('bash', [verifier, ...(args.skipDoctor ? ['--skip-doctor'] : [])], { env: jawEnv });
151
+ }
152
+
82
153
  const doctorRaw = run(process.execPath, [jawEntry, '--home', jawHome, 'doctor', '--json'], { env: jawEnv });
83
154
  const doctor = JSON.parse(doctorRaw) as { checks?: unknown[] };
84
155
  if (!Array.isArray(doctor?.checks) || doctor.checks.length === 0) {
@@ -112,6 +183,7 @@ async function main(): Promise<void> {
112
183
  }
113
184
 
114
185
  console.log('[fresh-install-smoke] PASS');
186
+ console.log(`[fresh-install-smoke] mode=${args.mode}`);
115
187
  console.log(`[fresh-install-smoke] version=${version}`);
116
188
  console.log(`[fresh-install-smoke] checks=${doctor.checks.length}`);
117
189
  console.log(`[fresh-install-smoke] cli-status keys=${keys.join(',')}`);
@@ -127,6 +199,13 @@ async function main(): Promise<void> {
127
199
  if (tmp && fs.existsSync(tmp)) {
128
200
  fs.rmSync(tmp, { recursive: true, force: true });
129
201
  }
202
+ const homeSmokePrefix = path.join(os.homedir(), '.cli-jaw-fresh-smoke-');
203
+ for (const entry of fs.readdirSync(os.homedir())) {
204
+ const candidate = path.join(os.homedir(), entry);
205
+ if (candidate.startsWith(homeSmokePrefix) && fs.statSync(candidate).isDirectory()) {
206
+ fs.rmSync(candidate, { recursive: true, force: true });
207
+ }
208
+ }
130
209
  }
131
210
  }
132
211
 
@@ -119,6 +119,19 @@ foreach ($sidecar in @("rhwp-field-bridge", "rhwp-officecli-bridge")) {
119
119
 
120
120
  $pathEntries = (($env:PATH -split ';') | ForEach-Object { $_.Trim() }) | Where-Object { $_ }
121
121
  if (-not ($pathEntries -contains $installDir)) {
122
- Write-Warn "officecli is not on PATH. Add this location if you want to run it directly:"
122
+ Write-Warn "officecli is not on PATH. Adding it to the current process and user PATH:"
123
123
  Write-Host " $installDir"
124
+ $env:PATH = "$installDir;$env:PATH"
125
+ try {
126
+ $userPath = [Environment]::GetEnvironmentVariable("Path", "User")
127
+ $userEntries = (($userPath -split ';') | ForEach-Object { $_.Trim() }) | Where-Object { $_ }
128
+ if (-not ($userEntries -contains $installDir)) {
129
+ $newUserPath = if ($userPath) { "$userPath;$installDir" } else { $installDir }
130
+ [Environment]::SetEnvironmentVariable("Path", $newUserPath, "User")
131
+ Write-Ok "Added officecli to the user PATH. Open a new PowerShell to use it directly."
132
+ }
133
+ } catch {
134
+ Write-Warn "Could not persist user PATH automatically. Add this location manually if needed:"
135
+ Write-Host " $installDir"
136
+ }
124
137
  }