cli-jaw 2.0.5 → 2.0.6

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 (614) hide show
  1. package/README.ja.md +229 -315
  2. package/README.ko.md +248 -315
  3. package/README.md +103 -186
  4. package/README.zh-CN.md +282 -296
  5. package/dist/bin/commands/browser-web-ai.js +4 -2
  6. package/dist/bin/commands/browser-web-ai.js.map +1 -1
  7. package/dist/bin/commands/browser.js +76 -0
  8. package/dist/bin/commands/browser.js.map +1 -1
  9. package/dist/bin/commands/doctor.js +122 -4
  10. package/dist/bin/commands/doctor.js.map +1 -1
  11. package/dist/bin/commands/skill.js +5 -3
  12. package/dist/bin/commands/skill.js.map +1 -1
  13. package/dist/bin/postinstall.js +507 -89
  14. package/dist/bin/postinstall.js.map +1 -1
  15. package/dist/lib/mcp/format-converters.js +32 -4
  16. package/dist/lib/mcp/format-converters.js.map +1 -1
  17. package/dist/lib/mcp/mcp-install.js +5 -0
  18. package/dist/lib/mcp/mcp-install.js.map +1 -1
  19. package/dist/lib/mcp/skills-distribution.js +52 -53
  20. package/dist/lib/mcp/skills-distribution.js.map +1 -1
  21. package/dist/lib/mcp/skills-reset.js +29 -16
  22. package/dist/lib/mcp/skills-reset.js.map +1 -1
  23. package/dist/lib/mcp/skills-utils.js +64 -2
  24. package/dist/lib/mcp/skills-utils.js.map +1 -1
  25. package/dist/lib/mcp/unified-config.js +7 -3
  26. package/dist/lib/mcp/unified-config.js.map +1 -1
  27. package/dist/scripts/fresh-install-smoke.js +1 -1
  28. package/dist/scripts/fresh-install-smoke.js.map +1 -1
  29. package/dist/server.js +44 -4
  30. package/dist/server.js.map +1 -1
  31. package/dist/src/agent/args.js +148 -1
  32. package/dist/src/agent/args.js.map +1 -1
  33. package/dist/src/agent/claude-e-runtime.js +42 -0
  34. package/dist/src/agent/claude-e-runtime.js.map +1 -0
  35. package/dist/src/agent/claude-i-runtime.js +42 -0
  36. package/dist/src/agent/claude-i-runtime.js.map +1 -0
  37. package/dist/src/agent/cli-helpers.js +9 -0
  38. package/dist/src/agent/cli-helpers.js.map +1 -0
  39. package/dist/src/agent/codex-app-client.js +240 -0
  40. package/dist/src/agent/codex-app-client.js.map +1 -0
  41. package/dist/src/agent/codex-app-events.js +268 -0
  42. package/dist/src/agent/codex-app-events.js.map +1 -0
  43. package/dist/src/agent/error-classifier.js +8 -2
  44. package/dist/src/agent/error-classifier.js.map +1 -1
  45. package/dist/src/agent/events/acp.js +200 -0
  46. package/dist/src/agent/events/acp.js.map +1 -0
  47. package/dist/src/agent/events/claude.js +200 -0
  48. package/dist/src/agent/events/claude.js.map +1 -0
  49. package/dist/src/agent/events/codex.js +118 -0
  50. package/dist/src/agent/events/codex.js.map +1 -0
  51. package/dist/src/agent/events/gemini.js +100 -0
  52. package/dist/src/agent/events/gemini.js.map +1 -0
  53. package/dist/src/agent/events/grok.js +298 -0
  54. package/dist/src/agent/events/grok.js.map +1 -0
  55. package/dist/src/agent/events/helpers.js +237 -0
  56. package/dist/src/agent/events/helpers.js.map +1 -0
  57. package/dist/src/agent/events/index.js +315 -0
  58. package/dist/src/agent/events/index.js.map +1 -0
  59. package/dist/src/agent/events/opencode.js +171 -0
  60. package/dist/src/agent/events/opencode.js.map +1 -0
  61. package/dist/src/agent/events/summary.js +128 -0
  62. package/dist/src/agent/events/summary.js.map +1 -0
  63. package/dist/src/agent/events/tool-labels.js +299 -0
  64. package/dist/src/agent/events/tool-labels.js.map +1 -0
  65. package/dist/src/agent/events/types.js +3 -0
  66. package/dist/src/agent/events/types.js.map +1 -0
  67. package/dist/src/agent/events.js +2 -1487
  68. package/dist/src/agent/events.js.map +1 -1
  69. package/dist/src/agent/grok-trace-backfill.js +153 -0
  70. package/dist/src/agent/grok-trace-backfill.js.map +1 -0
  71. package/dist/src/agent/lifecycle-handler.js +60 -16
  72. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  73. package/dist/src/agent/live-run-state.js +1 -1
  74. package/dist/src/agent/live-run-state.js.map +1 -1
  75. package/dist/src/agent/memory-flush-controller.js +26 -0
  76. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  77. package/dist/src/agent/resume-classifier.js +9 -0
  78. package/dist/src/agent/resume-classifier.js.map +1 -1
  79. package/dist/src/agent/session-persistence.js +7 -2
  80. package/dist/src/agent/session-persistence.js.map +1 -1
  81. package/dist/src/agent/spawn/process-kill.js +29 -0
  82. package/dist/src/agent/spawn/process-kill.js.map +1 -0
  83. package/dist/src/agent/spawn/queue.js +273 -0
  84. package/dist/src/agent/spawn/queue.js.map +1 -0
  85. package/dist/src/agent/spawn/resume.js +56 -0
  86. package/dist/src/agent/spawn/resume.js.map +1 -0
  87. package/dist/src/agent/spawn.js +435 -371
  88. package/dist/src/agent/spawn.js.map +1 -1
  89. package/dist/src/agent/watchdog.js +5 -1
  90. package/dist/src/agent/watchdog.js.map +1 -1
  91. package/dist/src/browser/adaptive-fetch/browser-escalation.js +177 -0
  92. package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -0
  93. package/dist/src/browser/adaptive-fetch/browser-runtime.js +38 -0
  94. package/dist/src/browser/adaptive-fetch/browser-runtime.js.map +1 -0
  95. package/dist/src/browser/adaptive-fetch/browser-session.js +97 -0
  96. package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -0
  97. package/dist/src/browser/adaptive-fetch/challenge-detector.js +88 -0
  98. package/dist/src/browser/adaptive-fetch/challenge-detector.js.map +1 -0
  99. package/dist/src/browser/adaptive-fetch/content-scorer.js +145 -0
  100. package/dist/src/browser/adaptive-fetch/content-scorer.js.map +1 -0
  101. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +382 -0
  102. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -0
  103. package/dist/src/browser/adaptive-fetch/fetcher.js +105 -0
  104. package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -0
  105. package/dist/src/browser/adaptive-fetch/human-loop.js +101 -0
  106. package/dist/src/browser/adaptive-fetch/human-loop.js.map +1 -0
  107. package/dist/src/browser/adaptive-fetch/index.js +586 -0
  108. package/dist/src/browser/adaptive-fetch/index.js.map +1 -0
  109. package/dist/src/browser/adaptive-fetch/metadata.js +169 -0
  110. package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -0
  111. package/dist/src/browser/adaptive-fetch/output.js +71 -0
  112. package/dist/src/browser/adaptive-fetch/output.js.map +1 -0
  113. package/dist/src/browser/adaptive-fetch/reader-adapters.js +135 -0
  114. package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -0
  115. package/dist/src/browser/adaptive-fetch/safety.js +296 -0
  116. package/dist/src/browser/adaptive-fetch/safety.js.map +1 -0
  117. package/dist/src/browser/adaptive-fetch/third-party-readers.js +43 -0
  118. package/dist/src/browser/adaptive-fetch/third-party-readers.js.map +1 -0
  119. package/dist/src/browser/adaptive-fetch/trace.js +61 -0
  120. package/dist/src/browser/adaptive-fetch/trace.js.map +1 -0
  121. package/dist/src/browser/adaptive-fetch/transforms.js +81 -0
  122. package/dist/src/browser/adaptive-fetch/transforms.js.map +1 -0
  123. package/dist/src/browser/adaptive-fetch/validators.js +108 -0
  124. package/dist/src/browser/adaptive-fetch/validators.js.map +1 -0
  125. package/dist/src/browser/adaptive-fetch/waf-profiles.js +135 -0
  126. package/dist/src/browser/adaptive-fetch/waf-profiles.js.map +1 -0
  127. package/dist/src/browser/index.js +1 -0
  128. package/dist/src/browser/index.js.map +1 -1
  129. package/dist/src/browser/web-ai/gemini-model.js +42 -15
  130. package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
  131. package/dist/src/cli/claude-models.js +1 -1
  132. package/dist/src/cli/claude-models.js.map +1 -1
  133. package/dist/src/cli/compact.js +2 -0
  134. package/dist/src/cli/compact.js.map +1 -1
  135. package/dist/src/cli/handlers-completions.js +3 -0
  136. package/dist/src/cli/handlers-completions.js.map +1 -1
  137. package/dist/src/cli/handlers-runtime.js +5 -2
  138. package/dist/src/cli/handlers-runtime.js.map +1 -1
  139. package/dist/src/cli/readiness.js +43 -1
  140. package/dist/src/cli/readiness.js.map +1 -1
  141. package/dist/src/cli/registry.js +58 -0
  142. package/dist/src/cli/registry.js.map +1 -1
  143. package/dist/src/core/browser-open.js +4 -1
  144. package/dist/src/core/browser-open.js.map +1 -1
  145. package/dist/src/core/claude-install.js +4 -0
  146. package/dist/src/core/claude-install.js.map +1 -1
  147. package/dist/src/core/cli-detect.js +61 -13
  148. package/dist/src/core/cli-detect.js.map +1 -1
  149. package/dist/src/core/compact.js +295 -63
  150. package/dist/src/core/compact.js.map +1 -1
  151. package/dist/src/core/config.js +151 -11
  152. package/dist/src/core/config.js.map +1 -1
  153. package/dist/src/core/db.js +10 -1
  154. package/dist/src/core/db.js.map +1 -1
  155. package/dist/src/core/employees.js +1 -1
  156. package/dist/src/core/employees.js.map +1 -1
  157. package/dist/src/core/logger.js +28 -9
  158. package/dist/src/core/logger.js.map +1 -1
  159. package/dist/src/core/runtime-settings.js +32 -5
  160. package/dist/src/core/runtime-settings.js.map +1 -1
  161. package/dist/src/manager/memory/embedding/state-machine.js +2 -1
  162. package/dist/src/manager/memory/embedding/state-machine.js.map +1 -1
  163. package/dist/src/manager/memory/embedding/sync.js +52 -33
  164. package/dist/src/manager/memory/embedding/sync.js.map +1 -1
  165. package/dist/src/manager/memory/embedding/vec-store.js +10 -10
  166. package/dist/src/manager/memory/embedding/vec-store.js.map +1 -1
  167. package/dist/src/manager/routes/dashboard-memory.js +43 -16
  168. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  169. package/dist/src/manager/server.js +11 -0
  170. package/dist/src/manager/server.js.map +1 -1
  171. package/dist/src/memory/indexing.js +6 -1
  172. package/dist/src/memory/indexing.js.map +1 -1
  173. package/dist/src/orchestrator/distribute.js +5 -4
  174. package/dist/src/orchestrator/distribute.js.map +1 -1
  175. package/dist/src/prompt/builder.js +12 -1
  176. package/dist/src/prompt/builder.js.map +1 -1
  177. package/dist/src/prompt/runtime-context.js +69 -0
  178. package/dist/src/prompt/runtime-context.js.map +1 -0
  179. package/dist/src/routes/browser.js +33 -0
  180. package/dist/src/routes/browser.js.map +1 -1
  181. package/dist/src/routes/employees.js +1 -1
  182. package/dist/src/routes/employees.js.map +1 -1
  183. package/dist/src/routes/memory.js +1 -1
  184. package/dist/src/routes/memory.js.map +1 -1
  185. package/dist/src/routes/orchestrate.js +37 -10
  186. package/dist/src/routes/orchestrate.js.map +1 -1
  187. package/dist/src/routes/quota.js +91 -1
  188. package/dist/src/routes/quota.js.map +1 -1
  189. package/dist/src/routes/runtime-context.js +43 -0
  190. package/dist/src/routes/runtime-context.js.map +1 -0
  191. package/dist/src/routes/security-audit.js +14 -0
  192. package/dist/src/routes/security-audit.js.map +1 -0
  193. package/dist/src/routes/settings.js +8 -1
  194. package/dist/src/routes/settings.js.map +1 -1
  195. package/dist/src/security/security-audit-log.js +99 -0
  196. package/dist/src/security/security-audit-log.js.map +1 -0
  197. package/dist/src/telegram/bot.js +4 -2
  198. package/dist/src/telegram/bot.js.map +1 -1
  199. package/dist/src/types/cli-engine.js +4 -0
  200. package/dist/src/types/cli-engine.js.map +1 -1
  201. package/dist/src/types/cli-events.js +1 -1
  202. package/dist/src/types/cli-events.js.map +1 -1
  203. package/package.json +9 -3
  204. package/public/assets/providers/antigravity-color.svg +1 -0
  205. package/public/assets/providers/antigravity.svg +1 -0
  206. package/public/assets/providers/copilot-color.svg +1 -1
  207. package/public/assets/providers/copilot.svg +1 -1
  208. package/public/assets/providers/grok-color.svg +1 -0
  209. package/public/assets/providers/grok.svg +1 -0
  210. package/public/css/chat-search.css +168 -0
  211. package/public/css/chat.css +43 -1
  212. package/public/css/modals.css +41 -0
  213. package/public/dist/assets/{AdvancedExport-BAdZUC-6.js → AdvancedExport-CBvz4_IZ.js} +1 -1
  214. package/public/dist/assets/Agent-DlUqCMXJ.js +1 -0
  215. package/public/dist/assets/{Browser-BsdxDVgM.js → Browser-66BpLQck.js} +1 -1
  216. package/public/dist/assets/{ChannelsDiscord-Dg_jto6l.js → ChannelsDiscord-BifT2Dum.js} +1 -1
  217. package/public/dist/assets/{ChannelsTelegram-DGyZfJGS.js → ChannelsTelegram-CK6tYQ8k.js} +1 -1
  218. package/public/dist/assets/DashboardEmbeddingSection-6F8zSSja.js +2 -0
  219. package/public/dist/assets/{DashboardMeta-CAH9ONTb.js → DashboardMeta-Cc03HT5R.js} +1 -1
  220. package/public/dist/assets/{Display-DM_yvyKL.js → Display-arOjcMQZ.js} +1 -1
  221. package/public/dist/assets/Employees-YbW-mI67.js +1 -0
  222. package/public/dist/assets/{HealthBadge-Dtr-dDnw.js → HealthBadge-DEPFkcA0.js} +1 -1
  223. package/public/dist/assets/Heartbeat-CW4eIhtJ.js +1 -0
  224. package/public/dist/assets/{InlineWarn-E64UaKFh.js → InlineWarn-DoJS7AgM.js} +1 -1
  225. package/public/dist/assets/{Mcp-Dlp2X7X7.js → Mcp-ZQ6ARQb6.js} +1 -1
  226. package/public/dist/assets/Memory-BAUWJMqc.js +1 -0
  227. package/public/dist/assets/{MilkdownWysiwygEditor-Ctww8i0L.js → MilkdownWysiwygEditor-IAqFtXvM.js} +1 -1
  228. package/public/dist/assets/ModelProvider-DUtmFh0J.js +1 -0
  229. package/public/dist/assets/{Network-Df1R2YcQ.js → Network-B_4E82zQ.js} +1 -1
  230. package/public/dist/assets/{Permissions-BKJ5K6EL.js → Permissions-BkADXjQ4.js} +1 -1
  231. package/public/dist/assets/{Permissions-CcWZoOVP.js → Permissions-DvUCB8wA.js} +1 -1
  232. package/public/dist/assets/{Profile-DZ7xf1WZ.js → Profile-BcnTCSYM.js} +1 -1
  233. package/public/dist/assets/{Prompts-Bh5DYt8e.js → Prompts-CUs_RoRE.js} +1 -1
  234. package/public/dist/assets/{SpeechKeys-CQwtVxOP.js → SpeechKeys-qxc-ROWN.js} +1 -1
  235. package/public/dist/assets/agent-meta-Du8y6mSM.js +1 -0
  236. package/public/dist/assets/app-CGqTcIeF.js +39 -0
  237. package/public/dist/assets/app-Dpk6cE6C.css +1 -0
  238. package/public/dist/assets/architecture-7EHR7CIX-wVaUQezY.js +1 -0
  239. package/public/dist/assets/architectureDiagram-3BPJPVTR-kYIVzmWe.js +36 -0
  240. package/public/dist/assets/blockDiagram-GPEHLZMM-B204CPhe.js +132 -0
  241. package/public/dist/assets/{c4Diagram-AHTNJAMY-Bp2QLC-s.js → c4Diagram-AAUBKEIU-DAv6TAjg.js} +6 -6
  242. package/public/dist/assets/channel-CCQujL1n.js +1 -0
  243. package/public/dist/assets/{chunk-EDXVE4YY-COudQKkJ.js → chunk-2J33WTMH-xiPJWKcl.js} +1 -1
  244. package/public/dist/assets/chunk-3OPIFGDE-DOAvk9x8.js +62 -0
  245. package/public/dist/assets/{chunk-4BX2VUAB-Cm3KqBkS.js → chunk-4BX2VUAB-6lTRwyT0.js} +1 -1
  246. package/public/dist/assets/chunk-4EGX6M5U-DXtAEgX6.js +1 -0
  247. package/public/dist/assets/chunk-55IACEB6-Dx2JkQLw.js +1 -0
  248. package/public/dist/assets/chunk-5DO6E6H7-DDcMHB95.js +1 -0
  249. package/public/dist/assets/chunk-5ZQYHXKU-Bd-RFO5i.js +2 -0
  250. package/public/dist/assets/chunk-727SXJPM-BrsRzj8z.js +206 -0
  251. package/public/dist/assets/{chunk-AGHRB4JF-DIMn8T3_.js → chunk-AGHRB4JF-CYdXVA2-.js} +1 -1
  252. package/public/dist/assets/chunk-AQP2D5EJ-Di6Gstk-.js +231 -0
  253. package/public/dist/assets/{chunk-LIHQZDEY-Xw9ZX8of.js → chunk-BR22UD5L-CVuYkAd1.js} +1 -1
  254. package/public/dist/assets/{chunk-BSJP7CBP-DnSYKjii.js → chunk-BSJP7CBP-B47GpxcW.js} +1 -1
  255. package/public/dist/assets/chunk-CSCIHK7Q-CAE1p4Em.js +123 -0
  256. package/public/dist/assets/chunk-FHYWG6QK-CxZt-yZZ.js +1 -0
  257. package/public/dist/assets/{chunk-FMBD7UC4-6yXYicjw.js → chunk-FMBD7UC4-CwqBlx0l.js} +1 -1
  258. package/public/dist/assets/chunk-KSCS5N6A-D9a4ZkOy.js +10 -0
  259. package/public/dist/assets/{chunk-ZZ45TVLE-D5oxCC1O.js → chunk-L5ZTLDWV-D208QbfC.js} +1 -1
  260. package/public/dist/assets/{chunk-336JU56O-CAt5aBOe.js → chunk-LZXEDZCA-CE2KFduj.js} +1 -1
  261. package/public/dist/assets/chunk-MPE355IW-Bp4qAOUf.js +1 -0
  262. package/public/dist/assets/chunk-MZUSXYTE-DAU-v-0c.js +1 -0
  263. package/public/dist/assets/chunk-N66VUXT2-CpPz1L5u.js +1 -0
  264. package/public/dist/assets/chunk-ND2GUHAM-zZ7h1CPf.js +1 -0
  265. package/public/dist/assets/chunk-NNHCCRGN-BaiX9a5F.js +159 -0
  266. package/public/dist/assets/{chunk-X2U36JSP-CoMFMVNF.js → chunk-NZK2D7GU-CTqFQ8K5.js} +1 -1
  267. package/public/dist/assets/chunk-O5CBEL6O-BTuvXKFi.js +11 -0
  268. package/public/dist/assets/chunk-PUPMXCY4-ppZvktf-.js +1 -0
  269. package/public/dist/assets/chunk-QZHKN3VN-CBAtPPT7.js +1 -0
  270. package/public/dist/assets/chunk-UIBZB4QT-rJZEVBX0.js +1 -0
  271. package/public/dist/assets/chunk-WCWK7LTN-CGvUyB8h.js +1 -0
  272. package/public/dist/assets/chunk-WU5MYG2G-C3fKlSvP.js +1 -0
  273. package/public/dist/assets/{chunk-XPW4576I-CmAz5C-j.js → chunk-XPW4576I-BaQfzRci.js} +1 -1
  274. package/public/dist/assets/classDiagram-4FO5ZUOK-Cb-qL5u3.js +1 -0
  275. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BPhGdj15.js +1 -0
  276. package/public/dist/assets/constants-BxG09J6S.js +1 -0
  277. package/public/dist/assets/cose-bilkent-S5V4N54A-D1zmarou.js +1 -0
  278. package/public/dist/assets/dagre-BM42HDAG-BVkBttzA.js +4 -0
  279. package/public/dist/assets/dagre-DnoxfNXr.js +1 -0
  280. package/public/dist/assets/diagram-2AECGRRQ-Bs32KPnT.js +43 -0
  281. package/public/dist/assets/{diagram-5BDNPKRD-Cl4PzCD0.js → diagram-5GNKFQAL-YDYgPOQj.js} +2 -2
  282. package/public/dist/assets/diagram-KO2AKTUF-1tIdFl26.js +3 -0
  283. package/public/dist/assets/{diagram-TYMM5635-B_Xoa1Gp.js → diagram-LMA3HP47-B1y15kav.js} +1 -1
  284. package/public/dist/assets/diagram-OG6HWLK6-C25j1jGg.js +24 -0
  285. package/public/dist/assets/{dist-C9LWf2uC.js → dist-0v1UKkQ3.js} +1 -1
  286. package/public/dist/assets/dist-BMi_buEb.js +1 -0
  287. package/public/dist/assets/{dist-B6G8pbap.js → dist-BQNQk-1M.js} +1 -1
  288. package/public/dist/assets/{dist-CCKktDoF.js → dist-BVpa_e6W.js} +1 -1
  289. package/public/dist/assets/dist-BkrbW_LS.js +1 -0
  290. package/public/dist/assets/{dist-CkMC2PPt.js → dist-C1VqWrYZ.js} +1 -1
  291. package/public/dist/assets/{dist-BA7sRne4.js → dist-C3vh7d65.js} +1 -1
  292. package/public/dist/assets/{dist-BhzKO6nt2.js → dist-CE4s7vg82.js} +1 -1
  293. package/public/dist/assets/{dist-BDMNMdPF.js → dist-CjPin7Mr.js} +1 -1
  294. package/public/dist/assets/{dist-W7IGn2ug.js → dist-Ck6PnIlo.js} +1 -1
  295. package/public/dist/assets/{dist-B1rKu9eP.js → dist-CnIrGAPx.js} +1 -1
  296. package/public/dist/assets/{dist-CEDX2HGI.js → dist-Cv8S3FhF.js} +1 -1
  297. package/public/dist/assets/{dist-55MYVjjj.js → dist-D0PYXGt2.js} +1 -1
  298. package/public/dist/assets/{dist-C0sOT_UM.js → dist-D5GUqT-6.js} +1 -1
  299. package/public/dist/assets/{dist-C5S-Rbvc.js → dist-D66X8iAn.js} +1 -1
  300. package/public/dist/assets/dist-D815C1Fv.js +1 -0
  301. package/public/dist/assets/{dist-Ch6JG5jE.js → dist-DDDFJ8jG.js} +1 -1
  302. package/public/dist/assets/{dist-2oDfqE98.js → dist-DHQI31dn.js} +1 -1
  303. package/public/dist/assets/{dist-BTp_Oy_x.js → dist-DTQW91xt.js} +1 -1
  304. package/public/dist/assets/{dist-BuaQLcgQ.js → dist-Dm7RAaUo.js} +1 -1
  305. package/public/dist/assets/{dist-BJyDhGpS.js → dist-DrIWh2fi.js} +1 -1
  306. package/public/dist/assets/{dist-BGzHP3f8.js → dist-DzT7frM2.js} +1 -1
  307. package/public/dist/assets/{dist-wdLr2dSH.js → dist-Qs7HHNCC.js} +1 -1
  308. package/public/dist/assets/{dist-BjqyutOM.js → dist-Rs_Khtjb.js} +1 -1
  309. package/public/dist/assets/{dist-DdhWu7OM.js → dist-fJAyK82z.js} +1 -1
  310. package/public/dist/assets/{dist-G7QUHtDS.js → dist-jcptfm_T.js} +1 -1
  311. package/public/dist/assets/dist-sOV2kBhQ.js +1 -0
  312. package/public/dist/assets/{dist-BoG5I6U5.js → dist-vQskrHxt.js} +1 -1
  313. package/public/dist/assets/{dockerfile-CrC2HXHP.js → dockerfile-DAfh5qoE.js} +1 -1
  314. package/public/dist/assets/{employees-CIkIyvtL.js → employees-DRmX2RDd.js} +2 -2
  315. package/public/dist/assets/{erDiagram-SMLLAGMA-BvtqhMsS.js → erDiagram-TEJ5UH35-CRvCbztR.js} +6 -6
  316. package/public/dist/assets/{error-normalize-CkhPeQYx.js → error-normalize-CNbPE4lO.js} +1 -1
  317. package/public/dist/assets/eventmodeling-FCH6USID-Cq0nylxO.js +1 -0
  318. package/public/dist/assets/{factor-1CttFx2G.js → factor-BpoYJieo.js} +1 -1
  319. package/public/dist/assets/fields-DUawAHWZ.js +1 -0
  320. package/public/dist/assets/flowDiagram-I6XJVG4X-CzvVnib_.js +162 -0
  321. package/public/dist/assets/ganttDiagram-6RSMTGT7-BbUYP6iv.js +292 -0
  322. package/public/dist/assets/gitGraph-WXDBUCRP-DDq6-3D3.js +1 -0
  323. package/public/dist/assets/gitGraphDiagram-PVQCEYII-CbKdM7nW.js +106 -0
  324. package/public/dist/assets/graphlib-BLOO0H5r.js +1 -0
  325. package/public/dist/assets/info-J43DQDTF-OUnqwpUV.js +1 -0
  326. package/public/dist/assets/infoDiagram-5YYISTIA-BrZmg1At.js +2 -0
  327. package/public/dist/assets/{ishikawaDiagram-UXIWVN3A-DZW-Nqsf.js → ishikawaDiagram-YF4QCWOH-BDWXqJi5.js} +2 -2
  328. package/public/dist/assets/javascript-CZjRNq5R.js +1 -0
  329. package/public/dist/assets/{journeyDiagram-VCZTEJTY-ByVRJxVF.js → journeyDiagram-JHISSGLW-CPFRd_M3.js} +6 -6
  330. package/public/dist/assets/{jsx-runtime-BjL7qHh8.js → jsx-runtime-BZmCptaP.js} +1 -1
  331. package/public/dist/assets/{kanban-definition-6JOO6SKY-xwN0YCW2.js → kanban-definition-UN3LZRKU-BcQbBplS.js} +10 -10
  332. package/public/dist/assets/katex-CF5bGce6.js +1 -0
  333. package/public/dist/assets/manager-B5OmizBL.css +1 -0
  334. package/public/dist/assets/manager-Cs3eMBcx.js +25 -0
  335. package/public/dist/assets/{memory-CnBc2_Va.js → memory-BA-ki3gn.js} +1 -1
  336. package/public/dist/assets/memory-DLQbyBA3.js +1 -0
  337. package/public/dist/assets/mermaid-loader-BVPsKrpr.js +1 -0
  338. package/public/dist/assets/mermaid-parser.core-C62NUJRb.js +3 -0
  339. package/public/dist/assets/mermaid.core-ArqR5iFa.js +9 -0
  340. package/public/dist/assets/mermaid.core-BAwu4U2Y.js +1 -0
  341. package/public/dist/assets/{mindmap-definition-QFDTVHPH-Chqgsh1N.js → mindmap-definition-RKZ34NQL-C35cGkNU.js} +29 -29
  342. package/public/dist/assets/{nsis-_CjIiUyF.js → nsis-Ch4QINLN.js} +1 -1
  343. package/public/dist/assets/packet-YPE3B663-Bb9hBQ06.js +1 -0
  344. package/public/dist/assets/{page-shell-CTxVDJ8Y.js → page-shell-CVAobxbP.js} +1 -1
  345. package/public/dist/assets/pie-LRSECV5Y-CNRQnRNZ.js +1 -0
  346. package/public/dist/assets/pieDiagram-4H26LBE5-B8C_hoqJ.js +30 -0
  347. package/public/dist/assets/provider-icons-dxT69zGg.js +8 -0
  348. package/public/dist/assets/{pug-CbR8lCtK.js → pug-CXYqmmpP.js} +1 -1
  349. package/public/dist/assets/quadrantDiagram-W4KKPZXB-BEPrine5.js +7 -0
  350. package/public/dist/assets/radar-GUYGQ44K-BxngU2v0.js +1 -0
  351. package/public/dist/assets/{render-lpTpN1El.js → render-C7_e0J_X.js} +3 -3
  352. package/public/dist/assets/{requirementDiagram-MS252O5E-wnPtv0LG.js → requirementDiagram-4Y6WPE33-ClDDon9c.js} +4 -4
  353. package/public/dist/assets/rolldown-runtime-XQCOJYun.js +1 -0
  354. package/public/dist/assets/sankeyDiagram-5OEKKPKP-Bjs3OE-1.js +40 -0
  355. package/public/dist/assets/sequenceDiagram-3UESZ5HK-BM8IAaEe.js +162 -0
  356. package/public/dist/assets/settings-DjyKdqev.js +1 -0
  357. package/public/dist/assets/settings-pUJzyeX2.js +42 -0
  358. package/public/dist/assets/{sidebar-Cwt0FxQl.js → sidebar-CO9Qjj6v.js} +2 -2
  359. package/public/dist/assets/skills-CX3qJ77s.js +1 -0
  360. package/public/dist/assets/{skills-DDmTyywh.js → skills-Dq7fD8I3.js} +1 -1
  361. package/public/dist/assets/{slash-commands-D5y5AVvS.js → slash-commands-DRsKtuGT.js} +1 -1
  362. package/public/dist/assets/slash-commands-UbS8w9ij.js +1 -0
  363. package/public/dist/assets/stateDiagram-AJRCARHV-BvNABuXE.js +1 -0
  364. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CCIo81qy.js +1 -0
  365. package/public/dist/assets/{timeline-definition-GMOUNBTQ-DUz1-iOx.js → timeline-definition-PNZ67QCA-CIvTvac3.js} +8 -8
  366. package/public/dist/assets/trace-drawer-DDFdU07_.js +15 -0
  367. package/public/dist/assets/treeView-BLDUP644-cXRzPGzz.js +1 -0
  368. package/public/dist/assets/treemap-LRROVOQU-BsZE5HPE.js +1 -0
  369. package/public/dist/assets/ui-CeBmBBZM.js +140 -0
  370. package/public/dist/assets/ui-TMXjvH0r.js +1 -0
  371. package/public/dist/assets/{vendor-render-DEStnpJ8.js → vendor-render-DCb9B75Q.js} +38 -37
  372. package/public/dist/assets/vendor-utils-BnxL60_-.js +1 -0
  373. package/public/dist/assets/vennDiagram-CIIHVFJN-C5cbS2KC.js +34 -0
  374. package/public/dist/assets/wardley-L42UT6IY-D_qm0cZD.js +1 -0
  375. package/public/dist/assets/{wardleyDiagram-NUSXRM2D-CLAhOzap.js → wardleyDiagram-YWT4CUSO-BsRBBGFP.js} +61 -3
  376. package/public/dist/assets/{wiki-link-suggestions-LQuYT22G.js → wiki-link-suggestions-BHwNQXT_.js} +2 -2
  377. package/public/dist/assets/{xychartDiagram-5P7HB3ND-DLnY9i8z.js → xychartDiagram-2RQKCTM6-B6rqui6F.js} +6 -6
  378. package/public/dist/index.html +102 -3
  379. package/public/dist/manager/index.html +2 -2
  380. package/public/index.html +101 -1
  381. package/public/js/constants.ts +72 -0
  382. package/public/js/diagram/iframe-renderer.ts +7 -0
  383. package/public/js/features/chat-scroll.ts +31 -0
  384. package/public/js/features/chat-search.ts +223 -0
  385. package/public/js/features/help-content.ts +20 -2
  386. package/public/js/features/help-dialog.ts +38 -2
  387. package/public/js/features/pending-queue.ts +6 -0
  388. package/public/js/features/process-block.ts +20 -0
  389. package/public/js/features/settings-channel.ts +3 -1
  390. package/public/js/features/settings-cli-status.ts +24 -3
  391. package/public/js/features/settings-core.ts +134 -21
  392. package/public/js/features/settings-types.ts +12 -1
  393. package/public/js/features/settings.ts +1 -1
  394. package/public/js/features/trace-drawer.ts +2 -1
  395. package/public/js/features/voice-recorder.ts +222 -42
  396. package/public/js/main.ts +58 -4
  397. package/public/js/provider-icons.ts +46 -27
  398. package/public/js/render/markdown.ts +6 -0
  399. package/public/js/ui.ts +33 -7
  400. package/public/js/ws.ts +5 -1
  401. package/public/locales/en.json +31 -7
  402. package/public/locales/ja.json +31 -7
  403. package/public/locales/ko.json +31 -7
  404. package/public/locales/zh.json +31 -7
  405. package/public/manager/src/App.tsx +19 -55
  406. package/public/manager/src/InstancePreview.tsx +46 -1
  407. package/public/manager/src/components/InstanceDetailPanel.tsx +7 -2
  408. package/public/manager/src/components/InstanceLogsPanel.tsx +138 -0
  409. package/public/manager/src/dashboard-settings/DashboardEmbeddingSection.tsx +37 -7
  410. package/public/manager/src/jaw-ceo/useJawCeoDashboardBridge.tsx +1 -0
  411. package/public/manager/src/manager-components.css +76 -0
  412. package/public/manager/src/preview.ts +26 -3
  413. package/public/manager/src/settings/fields/SelectField.tsx +51 -17
  414. package/public/manager/src/settings/pages/Agent.tsx +37 -2
  415. package/public/manager/src/settings/pages/Heartbeat.tsx +3 -2
  416. package/public/manager/src/settings/pages/Memory.tsx +3 -2
  417. package/public/manager/src/settings/pages/components/EmployeeRow.tsx +8 -4
  418. package/public/manager/src/settings/pages/components/PerCliRow.tsx +31 -5
  419. package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +4 -2
  420. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +1 -1
  421. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +23 -1
  422. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +49 -0
  423. package/public/manager/src/settings/pages/components/employees-helpers.ts +6 -1
  424. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +11 -1
  425. package/public/manager/src/settings-controls.css +25 -0
  426. package/public/manager/src/usePreviewShortcutMessages.ts +30 -0
  427. package/public/manager/src/usePreviewSttLifecycle.ts +31 -0
  428. package/scripts/fresh-install-smoke.ts +1 -1
  429. package/scripts/install-officecli.ps1 +33 -5
  430. package/scripts/install-officecli.sh +52 -8
  431. package/scripts/install-wsl.sh +96 -24
  432. package/scripts/install.sh +82 -11
  433. package/scripts/postinstall-guard.cjs +57 -30
  434. package/public/dist/assets/Agent-DNpehKB2.js +0 -1
  435. package/public/dist/assets/DashboardEmbeddingSection-BYdGgqg7.js +0 -2
  436. package/public/dist/assets/Employees-CuYuTy0R.js +0 -1
  437. package/public/dist/assets/Heartbeat-C-vq02MW.js +0 -1
  438. package/public/dist/assets/Memory-BPKWJDXK.js +0 -1
  439. package/public/dist/assets/ModelProvider-Bd6vGkXT.js +0 -1
  440. package/public/dist/assets/agent-meta-C1pQzExf.js +0 -1
  441. package/public/dist/assets/app-BxsIleo0.js +0 -32
  442. package/public/dist/assets/app-CB9n5A77.css +0 -1
  443. package/public/dist/assets/architecture-YZFGNWBL-BRI-0IaU.js +0 -1
  444. package/public/dist/assets/architectureDiagram-Q4EWVU46-z0JCgZrJ.js +0 -36
  445. package/public/dist/assets/blockDiagram-DXYQGD6D-KaOz3aFS.js +0 -132
  446. package/public/dist/assets/channel-jLopKIgm.js +0 -1
  447. package/public/dist/assets/chunk-2KRD3SAO-C8hJZPJu.js +0 -1
  448. package/public/dist/assets/chunk-426QAEUC-atJRhvKN.js +0 -1
  449. package/public/dist/assets/chunk-4TB4RGXK-BD7UhIN8.js +0 -206
  450. package/public/dist/assets/chunk-55IACEB6-CAWcPDdr.js +0 -1
  451. package/public/dist/assets/chunk-5FUZZQ4R-Cg1pzs6p.js +0 -62
  452. package/public/dist/assets/chunk-5PVQY5BW-otv3HwE_.js +0 -2
  453. package/public/dist/assets/chunk-67CJDMHE-AU2iOKLT.js +0 -1
  454. package/public/dist/assets/chunk-7N4EOEYR-BTIS4jBw.js +0 -1
  455. package/public/dist/assets/chunk-AA7GKIK3-c9UUJO_T.js +0 -1
  456. package/public/dist/assets/chunk-CIAEETIT-Dwbln6rM.js +0 -1
  457. package/public/dist/assets/chunk-ENJZ2VHE-PT_jAckw.js +0 -10
  458. package/public/dist/assets/chunk-FOC6F5B3-BqDmFFeg.js +0 -1
  459. package/public/dist/assets/chunk-ICPOFSXX-P6V6jqiT.js +0 -122
  460. package/public/dist/assets/chunk-K5T4RW27-C42sOmZR.js +0 -27
  461. package/public/dist/assets/chunk-KGLVRYIC-K-BVa8b2.js +0 -1
  462. package/public/dist/assets/chunk-ORNJ4GCN-CEXU6WaD.js +0 -1
  463. package/public/dist/assets/chunk-OYMX7WX6-DmJG2z1S.js +0 -231
  464. package/public/dist/assets/chunk-QZHKN3VN-BkVLii_3.js +0 -1
  465. package/public/dist/assets/chunk-U2HBQHQK-Ny6UwUgK.js +0 -11
  466. package/public/dist/assets/chunk-YZCP3GAM-c7FYtZME.js +0 -1
  467. package/public/dist/assets/classDiagram-6PBFFD2Q-BgOyAynm.js +0 -1
  468. package/public/dist/assets/classDiagram-v2-HSJHXN6E-5gBdoVH9.js +0 -1
  469. package/public/dist/assets/constants-4A2GptQT.js +0 -1
  470. package/public/dist/assets/cose-bilkent-S5V4N54A-CvH6qY_r.js +0 -1
  471. package/public/dist/assets/dagre--20B2-ZQ.js +0 -1
  472. package/public/dist/assets/dagre-KV5264BT-CQ0wo0ma.js +0 -4
  473. package/public/dist/assets/diagram-G4DWMVQ6-_aP6kMTh.js +0 -24
  474. package/public/dist/assets/diagram-MMDJMWI5-J1l6Q0JG.js +0 -43
  475. package/public/dist/assets/dist-B1p80u1b.js +0 -1
  476. package/public/dist/assets/dist-BKyzWv22.js +0 -1
  477. package/public/dist/assets/dist-CxJpXP6s.js +0 -1
  478. package/public/dist/assets/dist-DNLFuTrS.js +0 -1
  479. package/public/dist/assets/fields-BISouxp2.js +0 -1
  480. package/public/dist/assets/flowDiagram-DWJPFMVM-C_F0rqqT.js +0 -162
  481. package/public/dist/assets/ganttDiagram-T4ZO3ILL-B5S8EZRg.js +0 -292
  482. package/public/dist/assets/gitGraph-7Q5UKJZL-DTTW6pxr.js +0 -1
  483. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-DMGzYJeb.js +0 -106
  484. package/public/dist/assets/graphlib-CZk_Ii16.js +0 -1
  485. package/public/dist/assets/info-OMHHGYJF-BU-iuaSm.js +0 -1
  486. package/public/dist/assets/infoDiagram-42DDH7IO-dzSaYFFK.js +0 -2
  487. package/public/dist/assets/javascript-BhB45e0W.js +0 -1
  488. package/public/dist/assets/katex-DamPUmTE.js +0 -1
  489. package/public/dist/assets/manager-B84u-pcn.js +0 -25
  490. package/public/dist/assets/manager-DMg_sTEP.css +0 -1
  491. package/public/dist/assets/memory-BV62wlsG.js +0 -1
  492. package/public/dist/assets/mermaid-loader-DxFGz4EE.js +0 -1
  493. package/public/dist/assets/mermaid-parser.core-CMIZ0my_.js +0 -3
  494. package/public/dist/assets/mermaid.core-CicVBD9l.js +0 -1
  495. package/public/dist/assets/mermaid.core-Dj6viEzN.js +0 -11
  496. package/public/dist/assets/packet-4T2RLAQJ-DzmBsAf0.js +0 -1
  497. package/public/dist/assets/pie-ZZUOXDRM-DyG1KzTn.js +0 -1
  498. package/public/dist/assets/pieDiagram-DEJITSTG-DJLiSymi.js +0 -30
  499. package/public/dist/assets/quadrantDiagram-34T5L4WZ-qcnWmcRr.js +0 -7
  500. package/public/dist/assets/radar-PYXPWWZC-CEBZARUu.js +0 -1
  501. package/public/dist/assets/rolldown-runtime-DE9SaGGd.js +0 -1
  502. package/public/dist/assets/sankeyDiagram-XADWPNL6-Bn3pUd_K.js +0 -10
  503. package/public/dist/assets/sequenceDiagram-FGHM5R23-DfxcHSdj.js +0 -157
  504. package/public/dist/assets/settings-CfAXLa8a.js +0 -1
  505. package/public/dist/assets/settings-FWgmcubl.js +0 -40
  506. package/public/dist/assets/skills-D-qUVJ-e.js +0 -1
  507. package/public/dist/assets/slash-commands-BfI19vIz.js +0 -1
  508. package/public/dist/assets/stateDiagram-FHFEXIEX-CiR7P2OG.js +0 -1
  509. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-BaWWpysK.js +0 -1
  510. package/public/dist/assets/trace-drawer-DVF5F1df.js +0 -15
  511. package/public/dist/assets/treeView-SZITEDCU-D5-TP7Qp.js +0 -1
  512. package/public/dist/assets/treemap-W4RFUUIX-BQhm_ZSp.js +0 -1
  513. package/public/dist/assets/ui-BJXY16Dk.js +0 -140
  514. package/public/dist/assets/ui-BXm3OPPh.js +0 -1
  515. package/public/dist/assets/vendor-utils-IVTPs69f.js +0 -68
  516. package/public/dist/assets/vennDiagram-DHZGUBPP-CYu7SDdG.js +0 -34
  517. package/public/dist/assets/wardley-RL74JXVD-CpnBMRe0.js +0 -1
  518. package/public/manager/src/settings/pages/Embedding.tsx +0 -382
  519. /package/public/dist/assets/{apl-HYRstREL.js → apl-CieDeb7B.js} +0 -0
  520. /package/public/dist/assets/{asciiarmor-BDXCrhAK.js → asciiarmor-BRTyulZY.js} +0 -0
  521. /package/public/dist/assets/{asn1-CnSBhb0M.js → asn1-DoNAtQ5o.js} +0 -0
  522. /package/public/dist/assets/{asterisk-AqV7rnIi.js → asterisk-CR7oKPxi.js} +0 -0
  523. /package/public/dist/assets/{brainfuck-Dv46-iL9.js → brainfuck-abzPcrOz.js} +0 -0
  524. /package/public/dist/assets/{clike-GRffz5hY.js → clike-B71Zq38G.js} +0 -0
  525. /package/public/dist/assets/{clojure-DzgT_fqE.js → clojure-Zm0UzHPq.js} +0 -0
  526. /package/public/dist/assets/{cmake-Co1237r5.js → cmake-D3UNdg6L.js} +0 -0
  527. /package/public/dist/assets/{cobol-rUaLketb.js → cobol-4fYvwQR0.js} +0 -0
  528. /package/public/dist/assets/{coffeescript-DQyfHE86.js → coffeescript-Ct6bZdRU.js} +0 -0
  529. /package/public/dist/assets/{commonlisp-Buue1PGW.js → commonlisp-CrgXVPcd.js} +0 -0
  530. /package/public/dist/assets/{crystal-BMWO0kOJ.js → crystal-bGOl67VM.js} +0 -0
  531. /package/public/dist/assets/{css-DaxibPo5.js → css-B_EV3Xq2.js} +0 -0
  532. /package/public/dist/assets/{cypher-CmpGfiBR.js → cypher-DXDlHTYf.js} +0 -0
  533. /package/public/dist/assets/{cytoscape.esm-zT8GwLFm.js → cytoscape.esm-BK7ao2Ti.js} +0 -0
  534. /package/public/dist/assets/{d-qmdtoIzU.js → d-RL5ynsiz.js} +0 -0
  535. /package/public/dist/assets/{diff-B40m6u1h.js → diff-B5McBGjz.js} +0 -0
  536. /package/public/dist/assets/{dtd-569ynYVj.js → dtd-l3sK4p_C.js} +0 -0
  537. /package/public/dist/assets/{dylan-Dxolp30i.js → dylan-WjJGY-rW.js} +0 -0
  538. /package/public/dist/assets/{ebnf-BZiX9Iq3.js → ebnf-BGY79HOS.js} +0 -0
  539. /package/public/dist/assets/{ecl-B8F1Q0oZ.js → ecl-BKh7OE1d.js} +0 -0
  540. /package/public/dist/assets/{eiffel-Bv8Kvgh1.js → eiffel-Bzvlg3oK.js} +0 -0
  541. /package/public/dist/assets/{elm-QWXQaIis.js → elm-5_BqNmKu.js} +0 -0
  542. /package/public/dist/assets/{erlang-CuDGzTGm.js → erlang-BdVwz8I8.js} +0 -0
  543. /package/public/dist/assets/{fcl-BiFeqtHf.js → fcl-B9cnfODD.js} +0 -0
  544. /package/public/dist/assets/{forth-R7Uc2VcL.js → forth-wZbbnGzb.js} +0 -0
  545. /package/public/dist/assets/{fortran-kDRG6BzW.js → fortran-BAJZrRfU.js} +0 -0
  546. /package/public/dist/assets/{gas-CyRkuC5T.js → gas-D60ZhBat.js} +0 -0
  547. /package/public/dist/assets/{gherkin-BE0p00ey.js → gherkin-B8tKjAAi.js} +0 -0
  548. /package/public/dist/assets/{groovy-B_Sh3D1t.js → groovy-BAG9eJUD.js} +0 -0
  549. /package/public/dist/assets/{haskell-DWXgCy4o.js → haskell-Cj4TmWbg.js} +0 -0
  550. /package/public/dist/assets/{haxe-xGxZ54Hv.js → haxe-8chnvz-o.js} +0 -0
  551. /package/public/dist/assets/{http-CKv9cSBA.js → http-DDYeO71z.js} +0 -0
  552. /package/public/dist/assets/{idl-DmlI3XzS.js → idl-D1hY-Gp_.js} +0 -0
  553. /package/public/dist/assets/{javascript-j6r5uf_k.js → javascript-Sh0ZUMP2.js} +0 -0
  554. /package/public/dist/assets/{julia-CQSp9Qa0.js → julia-BibioBF2.js} +0 -0
  555. /package/public/dist/assets/{livescript-CqvtVTlb.js → livescript-CSZrB6F4.js} +0 -0
  556. /package/public/dist/assets/{lua-DazQKUZ0.js → lua-BvTlo5w3.js} +0 -0
  557. /package/public/dist/assets/{mathematica-DqhJVCs9.js → mathematica-Bexv8BWZ.js} +0 -0
  558. /package/public/dist/assets/{mbox-Dsyo1_UL.js → mbox-BAhbA8z2.js} +0 -0
  559. /package/public/dist/assets/{mirc-D7ThhoF-.js → mirc-BzT5Kh4S.js} +0 -0
  560. /package/public/dist/assets/{mllike-EPZ6pqQD.js → mllike-DeoJnUZQ.js} +0 -0
  561. /package/public/dist/assets/{modelica-PU45hbqg.js → modelica-FD_-Fxlc.js} +0 -0
  562. /package/public/dist/assets/{mscgen-DEnh2Ojr.js → mscgen-C-OyhbwB.js} +0 -0
  563. /package/public/dist/assets/{mumps-8GhR7rRa.js → mumps-BxkCDTK7.js} +0 -0
  564. /package/public/dist/assets/{nginx-CXwagpwp.js → nginx-2JaV__gC.js} +0 -0
  565. /package/public/dist/assets/{ntriples-BDQxxstw.js → ntriples--rhhCzqb.js} +0 -0
  566. /package/public/dist/assets/{octave-2c90WnyU.js → octave-rS4nMzRe.js} +0 -0
  567. /package/public/dist/assets/{oz-CO0rQ8EL.js → oz-I4fMb_NC.js} +0 -0
  568. /package/public/dist/assets/{pascal-CcVwOGeN.js → pascal-BEghJs8t.js} +0 -0
  569. /package/public/dist/assets/{path-utils-DySmCVZK.js → path-utils-r2bJIu28.js} +0 -0
  570. /package/public/dist/assets/{perl-B9UvGoAV.js → perl-BRO9ZFo9.js} +0 -0
  571. /package/public/dist/assets/{pig-Cd1f86ZJ.js → pig-L4Ii6KI0.js} +0 -0
  572. /package/public/dist/assets/{powershell-DV4cOnkJ.js → powershell-BBeqUCRp.js} +0 -0
  573. /package/public/dist/assets/{properties-DaSVPhrZ.js → properties-Boi0jF2J.js} +0 -0
  574. /package/public/dist/assets/{protobuf-CEtFnY22.js → protobuf-fB2aGypX.js} +0 -0
  575. /package/public/dist/assets/{puppet-Ca0DHfcW.js → puppet-BRmsErtO.js} +0 -0
  576. /package/public/dist/assets/{python-ydzCwWG-.js → python-Be4P9Dgp.js} +0 -0
  577. /package/public/dist/assets/{q-Cl8kzQmk.js → q-DZGhDLYt.js} +0 -0
  578. /package/public/dist/assets/{r-DKZPJFrD.js → r-B4NERjRM.js} +0 -0
  579. /package/public/dist/assets/{rough.esm-Dnk3WN4D.js → rough.esm-C0Gkx4O1.js} +0 -0
  580. /package/public/dist/assets/{rpm-D0lqeHoZ.js → rpm-e-QbHJ1q.js} +0 -0
  581. /package/public/dist/assets/{ruby-RVmtmNDw.js → ruby-BSVP_v59.js} +0 -0
  582. /package/public/dist/assets/{sas-CEzodAB7.js → sas-DHlU4v4g.js} +0 -0
  583. /package/public/dist/assets/{scheme-Pqmt6dh3.js → scheme-BGXbz5Hz.js} +0 -0
  584. /package/public/dist/assets/{settings-client-BN3XzwEo.js → settings-client-DPuJroyk.js} +0 -0
  585. /package/public/dist/assets/{shell-CLG3zy-u.js → shell-yonx6xY2.js} +0 -0
  586. /package/public/dist/assets/{sieve-C95IWC3O.js → sieve-ClPJUZyi.js} +0 -0
  587. /package/public/dist/assets/{simple-mode-B9ErAHMD.js → simple-mode-CjViblDK.js} +0 -0
  588. /package/public/dist/assets/{smalltalk-4cL-gRJb.js → smalltalk-CHXubeqS.js} +0 -0
  589. /package/public/dist/assets/{solr-CEA7oOx_.js → solr-C6q6YwPz.js} +0 -0
  590. /package/public/dist/assets/{sparql-w8kHjP6I.js → sparql-CcspZvEd.js} +0 -0
  591. /package/public/dist/assets/{spreadsheet-C8bDfTgC.js → spreadsheet-DH3a4LBS.js} +0 -0
  592. /package/public/dist/assets/{sql-BrKz8968.js → sql-meoY6gNi.js} +0 -0
  593. /package/public/dist/assets/{stex-xFw1nXeT.js → stex-D2bn6Zsh.js} +0 -0
  594. /package/public/dist/assets/{stylus-gS_68vPk.js → stylus-DbXGih0S.js} +0 -0
  595. /package/public/dist/assets/{swift-D5lXmY2d.js → swift-Ch391uOd.js} +0 -0
  596. /package/public/dist/assets/{tcl-D-41REtC.js → tcl-CQBgGWDP.js} +0 -0
  597. /package/public/dist/assets/{textile-D-Znao0j.js → textile-4i3oG3tg.js} +0 -0
  598. /package/public/dist/assets/{tiddlywiki-Co8lXJKd.js → tiddlywiki-CXG1-CcK.js} +0 -0
  599. /package/public/dist/assets/{tiki-DsiNRYMP.js → tiki-DJqKUhA-.js} +0 -0
  600. /package/public/dist/assets/{toml-CaVZGou4.js → toml-C1FnyICQ.js} +0 -0
  601. /package/public/dist/assets/{troff-DJvDVr-d.js → troff-Cp8NvRO0.js} +0 -0
  602. /package/public/dist/assets/{ttcn-DAC92l4d.js → ttcn-NlmW_fji.js} +0 -0
  603. /package/public/dist/assets/{ttcn-cfg-C0X-mYlr.js → ttcn-cfg-BVuxfGZf.js} +0 -0
  604. /package/public/dist/assets/{turtle-D6WHyCrL.js → turtle-Ba9ERlnm.js} +0 -0
  605. /package/public/dist/assets/{vb-CEo_ccq3.js → vb-DDs4gjJb.js} +0 -0
  606. /package/public/dist/assets/{vbscript-B_PKDV1v.js → vbscript-gOFmdMJN.js} +0 -0
  607. /package/public/dist/assets/{velocity-ClKnKBLH.js → velocity-DtSNZA7i.js} +0 -0
  608. /package/public/dist/assets/{verilog-Pnuspgw6.js → verilog-Pldmtxe7.js} +0 -0
  609. /package/public/dist/assets/{vhdl-CZnyY4fs.js → vhdl-BFfSgWGp.js} +0 -0
  610. /package/public/dist/assets/{w3c-keyname-DJlC6DTY.js → w3c-keyname-BggQEPNo.js} +0 -0
  611. /package/public/dist/assets/{webidl-DHr762Dm.js → webidl-B6ZFYE2L.js} +0 -0
  612. /package/public/dist/assets/{xquery-5-FiyUtN.js → xquery-DhxUT98N.js} +0 -0
  613. /package/public/dist/assets/{yacas-GlqsXIeT.js → yacas-jSkQeF1Q.js} +0 -0
  614. /package/public/dist/assets/{z80-CI7N40Oo.js → z80-D7Lt6v61.js} +0 -0
@@ -22,16 +22,26 @@ if (major < 22) {
22
22
  import fs from 'fs';
23
23
  import path from 'path';
24
24
  import os from 'os';
25
- import { execSync, execFileSync } from 'child_process';
25
+ import { execFileSync } from 'child_process';
26
26
  import { fileURLToPath } from 'node:url';
27
27
  import { ensureSharedHomeSkillsLinks, initMcpConfig, copyDefaultSkills, propagateSkillsToInstances, loadUnifiedMcp, saveUnifiedMcp } from '../lib/mcp-sync.js';
28
28
  import { resolveHomePath } from '../src/core/path-expand.js';
29
29
  import { buildServicePath } from '../src/core/runtime-path.js';
30
+ import { classifyClaudeInstall } from '../src/core/claude-install.js';
31
+ import { isSpawnableCliFile, listCliBinaryCandidates, readProcessPath, } from '../src/core/cli-detect.js';
30
32
  import { asArray, asRecord, errString, fieldString } from './_http-client.js';
31
33
  // ─── JAW_HOME inline (config.ts → registry.ts import 체인 제거) ───
32
- const JAW_HOME = process.env["CLI_JAW_HOME"]
33
- ? resolveHomePath(process.env["CLI_JAW_HOME"])
34
- : path.join(os.homedir(), '.cli-jaw');
34
+ const JAW_HOME = (() => {
35
+ if (!process.env["CLI_JAW_HOME"])
36
+ return path.join(os.homedir(), '.cli-jaw');
37
+ const resolved = resolveHomePath(process.env["CLI_JAW_HOME"]);
38
+ const userHome = os.homedir();
39
+ if (process.env["NODE_ENV"] !== 'test' && !resolved.startsWith(userHome + path.sep) && resolved !== userHome) {
40
+ console.error(`[jaw:init] ❌ CLI_JAW_HOME must be under user home (${userHome}): ${resolved}`);
41
+ process.exit(1);
42
+ }
43
+ return resolved;
44
+ })();
35
45
  const home = os.homedir();
36
46
  const jawHome = JAW_HOME;
37
47
  const PATH_LOOKUP_CMD = process.platform === 'win32' ? 'where' : 'which';
@@ -44,10 +54,26 @@ const OFFICECLI_SKIP = process.env["CLI_JAW_SKIP_OFFICECLI"] === '1'
44
54
  || process.env["CLI_JAW_SKIP_OFFICECLI"] === 'true';
45
55
  const OFFICECLI_FORCE = process.env["CLI_JAW_FORCE_OFFICECLI"] === '1'
46
56
  || process.env["CLI_JAW_FORCE_OFFICECLI"] === 'true';
57
+ const OFFICECLI_SKIP_LOCAL = process.env["CLI_JAW_SKIP_LOCAL_OFFICECLI"] === '1'
58
+ || process.env["CLI_JAW_SKIP_LOCAL_OFFICECLI"] === 'true';
59
+ const OFFICECLI_FORCE_REMOTE = process.env["CLI_JAW_FORCE_REMOTE_OFFICECLI"] === '1'
60
+ || process.env["CLI_JAW_FORCE_REMOTE_OFFICECLI"] === 'true';
47
61
  const OFFICECLI_REQUIRE = shouldRequireOfficeCliDuringPostinstall();
62
+ const CLAUDE_NATIVE_INSTALL_URL = 'https://claude.ai/install.sh';
63
+ const CLAUDE_NATIVE_INSTALL_PS_URL = 'https://claude.ai/install.ps1';
48
64
  // ─── Legacy migration ───
49
65
  // Moved into runPostinstall() to prevent side effects on dynamic import.
50
66
  // (init.ts imports this module for installCliTools/etc — must not trigger fs.renameSync)
67
+ function postinstallExecEnv(env = process.env) {
68
+ const currentPath = env["PATH"] || env["Path"] || env["path"] || '';
69
+ const safePath = buildServicePath(currentPath);
70
+ const out = { ...env };
71
+ delete out["PATH"];
72
+ delete out["Path"];
73
+ delete out["path"];
74
+ out[process.platform === 'win32' ? 'Path' : 'PATH'] = safePath;
75
+ return out;
76
+ }
51
77
  function ensureDir(dir) {
52
78
  if (!fs.existsSync(dir)) {
53
79
  fs.mkdirSync(dir, { recursive: true });
@@ -55,6 +81,16 @@ function ensureDir(dir) {
55
81
  }
56
82
  }
57
83
  function ensureSymlink(target, linkPath) {
84
+ const resolvedTarget = path.resolve(target);
85
+ const resolvedLink = path.resolve(linkPath);
86
+ if (!resolvedTarget.startsWith(home + path.sep) && !resolvedTarget.startsWith(os.tmpdir()) && !resolvedTarget.startsWith(jawHome)) {
87
+ console.error(`[jaw:init] ❌ symlink target outside allowed paths: ${resolvedTarget}`);
88
+ return false;
89
+ }
90
+ if (!resolvedLink.startsWith(home + path.sep) && !resolvedLink.startsWith(os.tmpdir())) {
91
+ console.error(`[jaw:init] ❌ symlink link path outside user home: ${resolvedLink}`);
92
+ return false;
93
+ }
58
94
  if (fs.existsSync(linkPath))
59
95
  return false;
60
96
  fs.mkdirSync(path.dirname(linkPath), { recursive: true });
@@ -86,16 +122,49 @@ function ensureSymlink(target, linkPath) {
86
122
  return false;
87
123
  }
88
124
  }
125
+ export function removeJawHomeClaudeInstructionFile(baseDir = jawHome) {
126
+ const agentsMd = path.join(baseDir, 'AGENTS.md');
127
+ const claudeMd = path.join(baseDir, 'CLAUDE.md');
128
+ try {
129
+ if (!fs.existsSync(claudeMd))
130
+ return 'missing';
131
+ const stat = fs.lstatSync(claudeMd);
132
+ if (stat.isSymbolicLink()) {
133
+ const linkTarget = fs.readlinkSync(claudeMd);
134
+ const resolvedTarget = path.resolve(path.dirname(claudeMd), linkTarget);
135
+ const resolvedAgents = path.resolve(agentsMd);
136
+ if (resolvedTarget === resolvedAgents || path.basename(linkTarget) === 'AGENTS.md') {
137
+ fs.unlinkSync(claudeMd);
138
+ console.log(`[jaw:init] removed deprecated CLAUDE.md symlink: ${claudeMd}`);
139
+ return 'removed-symlink';
140
+ }
141
+ console.warn(`[jaw:init] keeping custom CLAUDE.md symlink: ${claudeMd} -> ${linkTarget}`);
142
+ return 'kept-custom';
143
+ }
144
+ if (stat.isFile() && fs.existsSync(agentsMd)) {
145
+ const claudeText = fs.readFileSync(claudeMd, 'utf8');
146
+ const agentsText = fs.readFileSync(agentsMd, 'utf8');
147
+ if (claudeText === agentsText) {
148
+ fs.unlinkSync(claudeMd);
149
+ console.log(`[jaw:init] removed deprecated CLAUDE.md mirror: ${claudeMd}`);
150
+ return 'removed-mirror';
151
+ }
152
+ }
153
+ console.warn(`[jaw:init] keeping custom CLAUDE.md: ${claudeMd}`);
154
+ return 'kept-custom';
155
+ }
156
+ catch (e) {
157
+ console.warn(`[jaw:init] CLAUDE.md cleanup failed: ${claudeMd} (${errString(e) || 'unknown'})`);
158
+ return 'error';
159
+ }
160
+ }
89
161
  function findBinaryPath(name) {
90
162
  try {
91
163
  const out = execFileSync(PATH_LOOKUP_CMD, [name], {
92
164
  encoding: 'utf8',
93
165
  stdio: 'pipe',
94
166
  timeout: 5000,
95
- env: {
96
- ...process.env,
97
- PATH: buildServicePath(process.env["PATH"] || ''),
98
- },
167
+ env: postinstallExecEnv(),
99
168
  }).trim();
100
169
  const first = out.split(/\r?\n/).map(x => x.trim()).find(Boolean);
101
170
  return first || null;
@@ -104,6 +173,79 @@ function findBinaryPath(name) {
104
173
  return null;
105
174
  }
106
175
  }
176
+ function pathMtimeMs(target) {
177
+ try {
178
+ return fs.statSync(target).mtimeMs;
179
+ }
180
+ catch {
181
+ return 0;
182
+ }
183
+ }
184
+ function latestMtimeMs(target, depth = 0) {
185
+ if (depth > 20)
186
+ return 0;
187
+ if (!fs.existsSync(target))
188
+ return 0;
189
+ const stat = fs.lstatSync(target);
190
+ if (stat.isSymbolicLink())
191
+ return stat.mtimeMs;
192
+ if (!stat.isDirectory())
193
+ return stat.mtimeMs;
194
+ let latest = stat.mtimeMs;
195
+ const ignoredDirs = new Set(['.git', 'bin', 'obj', 'target', 'build-local', '99.9_test']);
196
+ for (const entry of fs.readdirSync(target, { withFileTypes: true })) {
197
+ if (entry.isSymbolicLink())
198
+ continue;
199
+ if (entry.isDirectory() && ignoredDirs.has(entry.name))
200
+ continue;
201
+ latest = Math.max(latest, latestMtimeMs(path.join(target, entry.name), depth + 1));
202
+ }
203
+ return latest;
204
+ }
205
+ function latestLocalOfficeCliSourceMtime(projectRoot = PROJECT_ROOT) {
206
+ const officeRoot = path.join(projectRoot, 'officecli');
207
+ return Math.max(latestMtimeMs(path.join(officeRoot, 'src')), pathMtimeMs(path.join(officeRoot, 'dev-install.sh')), pathMtimeMs(path.join(officeRoot, 'build.sh')), pathMtimeMs(path.join(officeRoot, 'scripts', 'build-rhwp-sidecars.sh')), pathMtimeMs(path.join(officeRoot, 'officecli.slnx')));
208
+ }
209
+ export function hasLocalOfficeCliCheckout(projectRoot = PROJECT_ROOT) {
210
+ if (process.platform === 'win32')
211
+ return false;
212
+ if (OFFICECLI_SKIP_LOCAL || OFFICECLI_FORCE_REMOTE)
213
+ return false;
214
+ return fs.existsSync(path.join(projectRoot, 'officecli', 'dev-install.sh'))
215
+ && fs.existsSync(path.join(projectRoot, 'officecli', 'src', 'officecli', 'officecli.csproj'));
216
+ }
217
+ export function shouldRunLocalOfficeCliInstall(projectRoot = PROJECT_ROOT) {
218
+ if (!hasLocalOfficeCliCheckout(projectRoot))
219
+ return false;
220
+ if (OFFICECLI_FORCE)
221
+ return true;
222
+ const officecliPath = findBinaryPath('officecli');
223
+ const installDir = officecliPath ? path.dirname(officecliPath) : path.join(home, '.local', 'bin');
224
+ const installedPaths = [
225
+ officecliPath || path.join(installDir, 'officecli'),
226
+ path.join(installDir, 'rhwp-field-bridge'),
227
+ path.join(installDir, 'rhwp-officecli-bridge'),
228
+ ];
229
+ if (installedPaths.some((candidate) => !fs.existsSync(candidate)))
230
+ return true;
231
+ if (!isInstalledLocalOfficeCliUsable(installedPaths))
232
+ return true;
233
+ const installedMtime = Math.min(...installedPaths.map(pathMtimeMs));
234
+ const sourceMtime = latestLocalOfficeCliSourceMtime(projectRoot);
235
+ return sourceMtime > installedMtime + 1000;
236
+ }
237
+ function isInstalledLocalOfficeCliUsable(installedPaths) {
238
+ const [officecliPath, ...sidecarPaths] = installedPaths;
239
+ if (!officecliPath || !isRunnableCliBinary('officecli', officecliPath))
240
+ return false;
241
+ for (const sidecarPath of sidecarPaths) {
242
+ if (process.platform !== 'win32' && !isSpawnableCliFile(sidecarPath, process.platform).ok) {
243
+ console.log(`[jaw:init] ⚠️ OfficeCLI sidecar is not executable → ${sidecarPath}`);
244
+ return false;
245
+ }
246
+ }
247
+ return true;
248
+ }
107
249
  function logSkillsSymlinkReport(report) {
108
250
  const links = asArray(report.links);
109
251
  if (!links.length)
@@ -151,7 +293,7 @@ async function maybeReregisterLaunchd() {
151
293
  return;
152
294
  }
153
295
  try {
154
- execFileSync(jawBin, ['launchd'], { stdio: 'inherit', timeout: 30000 });
296
+ execFileSync(jawBin, ['launchd'], { stdio: 'inherit', timeout: 30000, env: postinstallExecEnv() });
155
297
  }
156
298
  catch (e) {
157
299
  console.warn(`[jaw:init] ⚠️ launchd 재등록 실패 — 수동: jaw launchd`);
@@ -168,7 +310,14 @@ export async function installOfficeCli(opts = {}) {
168
310
  console.log('[jaw:init] ⏭️ officecli skipped (CLI_JAW_SKIP_OFFICECLI)');
169
311
  return;
170
312
  }
171
- const repo = process.env["OFFICECLI_REPO"] || OFFICECLI_DEFAULT_REPO;
313
+ const rawRepo = process.env["OFFICECLI_REPO"] || OFFICECLI_DEFAULT_REPO;
314
+ if (!/^[\w.-]+\/[\w.-]+$/.test(rawRepo)) {
315
+ console.error(`[jaw:init] ❌ OFFICECLI_REPO contains invalid characters: ${rawRepo}`);
316
+ if (OFFICECLI_REQUIRE)
317
+ throw new Error(`OFFICECLI_REPO validation failed: ${rawRepo}`);
318
+ return;
319
+ }
320
+ const repo = rawRepo;
172
321
  if (opts.interactive && opts.ask) {
173
322
  const answer = await opts.ask(`Install/update OfficeCLI (${repo})? [Y/n]`, 'y');
174
323
  if (answer.toLowerCase() === 'n') {
@@ -176,6 +325,33 @@ export async function installOfficeCli(opts = {}) {
176
325
  return;
177
326
  }
178
327
  }
328
+ const localOfficeCliScript = path.join(PROJECT_ROOT, 'officecli', 'dev-install.sh');
329
+ if (hasLocalOfficeCliCheckout() && shouldRunLocalOfficeCliInstall()) {
330
+ if (opts.dryRun) {
331
+ console.log(` [dry-run] would run bash ${localOfficeCliScript}`);
332
+ return;
333
+ }
334
+ console.log('[jaw:init] 📦 local OfficeCLI checkout is newer; installing via officecli/dev-install.sh...');
335
+ try {
336
+ execFileSync('bash', [localOfficeCliScript], {
337
+ stdio: 'inherit',
338
+ timeout: 600000,
339
+ env: postinstallExecEnv(),
340
+ });
341
+ }
342
+ catch (e) {
343
+ const status = asRecord(e)["status"];
344
+ if (OFFICECLI_REQUIRE) {
345
+ throw new Error(`Local OfficeCLI install required but failed (exit ${fieldString(status, '?')})`);
346
+ }
347
+ console.warn(`[jaw:init] ⚠️ local OfficeCLI install failed (exit ${fieldString(status, '?')}); run manually: bash officecli/dev-install.sh`);
348
+ }
349
+ return;
350
+ }
351
+ if (hasLocalOfficeCliCheckout()) {
352
+ console.log('[jaw:init] ⏭️ local OfficeCLI checkout already installed');
353
+ return;
354
+ }
179
355
  if (process.platform === 'win32') {
180
356
  const ps = findBinaryPath('pwsh') || findBinaryPath('powershell');
181
357
  const scriptPath = path.join(PROJECT_ROOT, 'scripts', 'install-officecli.ps1');
@@ -198,14 +374,14 @@ export async function installOfficeCli(opts = {}) {
198
374
  }
199
375
  console.log(`[jaw:init] 📦 ensuring officecli (${repo}) via PowerShell installer...`);
200
376
  try {
201
- execFileSync(ps, args, { stdio: 'inherit', timeout: 180000, env: process.env });
377
+ execFileSync(ps, args, { stdio: 'inherit', timeout: 180000, env: postinstallExecEnv() });
202
378
  }
203
379
  catch (e) {
204
380
  const status = asRecord(e)["status"];
205
381
  if (OFFICECLI_REQUIRE) {
206
382
  throw new Error(`OfficeCLI install required but failed (exit ${fieldString(status, '?')})`);
207
383
  }
208
- console.warn(`[jaw:init] ⚠️ officecli install failed (exit ${fieldString(status, '?')}); skipping — run manually: install-officecli.sh`);
384
+ console.warn(`[jaw:init] ⚠️ officecli install failed (exit ${fieldString(status, '?')}); skipping — run manually: powershell -ExecutionPolicy Bypass -File scripts/install-officecli.ps1 -Update`);
209
385
  }
210
386
  return;
211
387
  }
@@ -228,7 +404,7 @@ export async function installOfficeCli(opts = {}) {
228
404
  execFileSync('bash', args, {
229
405
  stdio: 'inherit',
230
406
  timeout: 180000,
231
- env: { ...process.env, OFFICECLI_REPO: repo },
407
+ env: postinstallExecEnv({ ...process.env, OFFICECLI_REPO: repo }),
232
408
  });
233
409
  }
234
410
  catch (e) {
@@ -242,8 +418,8 @@ export async function installOfficeCli(opts = {}) {
242
418
  const CLI_PACKAGES = [
243
419
  { bin: 'claude', pkg: '@anthropic-ai/claude-code' },
244
420
  { bin: 'codex', pkg: '@openai/codex' },
245
- { bin: 'gemini', pkg: '@google/gemini-cli', brew: 'gemini-cli' },
246
- { bin: 'copilot', pkg: '@github/copilot', forceMgr: 'npm' },
421
+ { bin: 'gemini', pkg: '@google/gemini-cli' },
422
+ { bin: 'copilot', pkg: '@github/copilot' },
247
423
  { bin: 'opencode', pkg: 'opencode-ai' },
248
424
  ];
249
425
  function truthyEnv(value) {
@@ -258,6 +434,12 @@ export function shouldRequireOfficeCliDuringPostinstall(env = process.env) {
258
434
  export function shouldRequireCliToolsDuringPostinstall(env = process.env) {
259
435
  return truthyEnv(env["CLI_JAW_REQUIRE_CLI_TOOLS"]) || truthyEnv(env["npm_config_jaw_require_cli_tools"]);
260
436
  }
437
+ export function shouldInstallClaudeDuringPostinstall(env = process.env) {
438
+ return !truthyEnv(env["CLI_JAW_SKIP_CLAUDE"]) && !truthyEnv(env["npm_config_jaw_skip_claude"]);
439
+ }
440
+ export function shouldForceClaudeDuringPostinstall(env = process.env) {
441
+ return truthyEnv(env["CLI_JAW_FORCE_CLAUDE"]) || truthyEnv(env["npm_config_jaw_force_claude"]);
442
+ }
261
443
  export function shouldDedupeCliTools(env = process.env) {
262
444
  return truthyEnv(env["CLI_JAW_DEDUPE_CLI_TOOLS"]) || truthyEnv(env["npm_config_jaw_dedupe_cli_tools"]);
263
445
  }
@@ -270,10 +452,7 @@ function npmPrefixGlobal() {
270
452
  encoding: 'utf8',
271
453
  stdio: 'pipe',
272
454
  timeout: 3000,
273
- env: {
274
- ...process.env,
275
- PATH: buildServicePath(process.env["PATH"] || ''),
276
- },
455
+ env: postinstallExecEnv(),
277
456
  }).trim();
278
457
  }
279
458
  catch {
@@ -326,16 +505,6 @@ export function detectInstaller(binName) {
326
505
  realPath,
327
506
  });
328
507
  }
329
- /** Detect the default package manager for fresh installs. */
330
- function detectDefaultPkgMgr() {
331
- try {
332
- execSync('bun --version', { stdio: 'pipe' });
333
- return 'bun';
334
- }
335
- catch {
336
- return 'npm';
337
- }
338
- }
339
508
  function buildInstallCmd(mgr, pkg, brewFormula) {
340
509
  switch (mgr) {
341
510
  case 'brew': return `brew upgrade ${brewFormula || pkg} 2>/dev/null || brew install ${brewFormula || pkg}`;
@@ -343,19 +512,197 @@ function buildInstallCmd(mgr, pkg, brewFormula) {
343
512
  case 'npm': return `npm i -g ${pkg}@latest`;
344
513
  }
345
514
  }
515
+ function runInstallCmd(mgr, pkg, env, brewFormula) {
516
+ const timeout = 180000;
517
+ if (mgr === 'brew') {
518
+ try {
519
+ execFileSync('brew', ['upgrade', brewFormula || pkg], { stdio: 'pipe', timeout, env });
520
+ }
521
+ catch {
522
+ execFileSync('brew', ['install', brewFormula || pkg], { stdio: 'pipe', timeout, env });
523
+ }
524
+ }
525
+ else if (mgr === 'bun') {
526
+ execFileSync('bun', ['install', '-g', `${pkg}@latest`], { stdio: 'pipe', timeout, env });
527
+ }
528
+ else {
529
+ execFileSync('npm', ['i', '-g', `${pkg}@latest`], { stdio: 'pipe', timeout, env });
530
+ }
531
+ }
532
+ function buildClaudeNativeInstallCmd() {
533
+ if (process.platform === 'win32') {
534
+ return `powershell -NoProfile -ExecutionPolicy Bypass -Command "Invoke-Expression (Invoke-RestMethod '${CLAUDE_NATIVE_INSTALL_PS_URL}')"`;
535
+ }
536
+ return `curl -fsSL -o /tmp/claude-install.sh ${CLAUDE_NATIVE_INSTALL_URL} && bash /tmp/claude-install.sh`;
537
+ }
538
+ function runClaudeNativeInstall(_cmd) {
539
+ const env = postinstallExecEnv();
540
+ if (process.platform === 'win32') {
541
+ execFileSync('powershell', [
542
+ '-NoProfile',
543
+ '-ExecutionPolicy',
544
+ 'Bypass',
545
+ '-Command',
546
+ `Invoke-Expression (Invoke-RestMethod '${CLAUDE_NATIVE_INSTALL_PS_URL}')`,
547
+ ], {
548
+ stdio: 'pipe',
549
+ timeout: 180000,
550
+ env,
551
+ });
552
+ return;
553
+ }
554
+ const tmpScript = path.join(os.tmpdir(), `claude-install-${Date.now()}.sh`);
555
+ try {
556
+ execFileSync('curl', ['-fsSL', '-o', tmpScript, CLAUDE_NATIVE_INSTALL_URL], {
557
+ stdio: 'pipe', timeout: 30000, env,
558
+ });
559
+ execFileSync('bash', [tmpScript], {
560
+ stdio: 'pipe', timeout: 180000, env,
561
+ });
562
+ }
563
+ finally {
564
+ try {
565
+ fs.unlinkSync(tmpScript);
566
+ }
567
+ catch { }
568
+ }
569
+ }
570
+ function findClaudeNativeBinary() {
571
+ const candidates = [
572
+ path.join(home, '.local', 'bin', process.platform === 'win32' ? 'claude.exe' : 'claude'),
573
+ path.join(home, '.local', 'bin', 'claude'),
574
+ path.join(home, '.claude', 'local', 'bin', process.platform === 'win32' ? 'claude.exe' : 'claude'),
575
+ path.join(home, '.claude', 'local', 'bin', 'claude'),
576
+ findBinaryPath('claude'),
577
+ ].filter((candidate) => !!candidate);
578
+ for (const candidate of candidates) {
579
+ if (!fs.existsSync(candidate))
580
+ continue;
581
+ if (process.platform !== 'win32' && !isSpawnableCliFile(candidate, process.platform).ok)
582
+ continue;
583
+ try {
584
+ const realPath = fs.realpathSync(candidate);
585
+ if (classifyClaudeInstall(candidate) === 'native' || classifyClaudeInstall(realPath) === 'native') {
586
+ return candidate;
587
+ }
588
+ }
589
+ catch {
590
+ if (classifyClaudeInstall(candidate) === 'native')
591
+ return candidate;
592
+ }
593
+ }
594
+ return null;
595
+ }
596
+ export function findRunnableCliBinary(name) {
597
+ const scan = listCliBinaryCandidates(name, readProcessPath());
598
+ for (const candidate of scan.candidates) {
599
+ if (!candidate.spawnable) {
600
+ console.log(`[jaw:init] ⚠️ ${name} candidate is not spawnable → ${candidate.path}`);
601
+ continue;
602
+ }
603
+ if (isRunnableCliBinary(name, candidate.path))
604
+ return candidate.path;
605
+ }
606
+ return null;
607
+ }
608
+ function findExistingCliBinary(name) {
609
+ return findRunnableCliBinary(name);
610
+ }
611
+ function findExistingClaudeBinary() {
612
+ return findRunnableCliBinary('claude');
613
+ }
614
+ function outputText(value) {
615
+ if (Buffer.isBuffer(value))
616
+ return value.toString('utf8');
617
+ return fieldString(value);
618
+ }
619
+ function childFailureOutput(error) {
620
+ const err = asRecord(error);
621
+ return [outputText(err["stderr"]), outputText(err["stdout"]), errString(error)]
622
+ .map((part) => part.trim())
623
+ .filter(Boolean)
624
+ .join('\n');
625
+ }
626
+ function runCliVersionCheck(binaryPath) {
627
+ const common = {
628
+ encoding: 'utf8',
629
+ stdio: 'pipe',
630
+ timeout: 5000,
631
+ env: postinstallExecEnv(),
632
+ };
633
+ if (process.platform === 'win32') {
634
+ execFileSync('powershell', [
635
+ '-NoProfile',
636
+ '-ExecutionPolicy',
637
+ 'Bypass',
638
+ '-Command',
639
+ '& $args[0] --version',
640
+ binaryPath,
641
+ ], common);
642
+ return;
643
+ }
644
+ execFileSync(binaryPath, ['--version'], common);
645
+ }
646
+ function isRunnableCliBinary(name, binaryPath) {
647
+ try {
648
+ runCliVersionCheck(binaryPath);
649
+ return true;
650
+ }
651
+ catch (e) {
652
+ const output = childFailureOutput(e);
653
+ console.log(`[jaw:init] ⚠️ ${name} exists but failed --version → ${binaryPath}`);
654
+ if (output)
655
+ console.log(` ${output.slice(0, 160)}`);
656
+ return false;
657
+ }
658
+ }
659
+ function isRunnableClaudeBinary(binaryPath) {
660
+ return isRunnableCliBinary('claude', binaryPath);
661
+ }
662
+ function installClaudeCli(options = {}) {
663
+ const existingPath = findExistingClaudeBinary();
664
+ if (existingPath && !options.force) {
665
+ console.log(`[jaw:init] ⏭️ claude already works → ${existingPath}`);
666
+ return true;
667
+ }
668
+ const cmd = buildClaudeNativeInstallCmd();
669
+ const label = process.platform === 'win32' ? 'native PowerShell installer' : 'native installer';
670
+ console.log(`[jaw:init] 📦 claude (${label}): ${cmd}`);
671
+ try {
672
+ runClaudeNativeInstall(cmd);
673
+ }
674
+ catch (e) {
675
+ console.error(`[jaw:init] ⚠️ claude: auto-install failed — install manually: ${cmd}`);
676
+ const message = errString(e);
677
+ if (message)
678
+ console.error(` ${message.slice(0, 160)}`);
679
+ return false;
680
+ }
681
+ const nativePath = findClaudeNativeBinary();
682
+ if (nativePath && isRunnableClaudeBinary(nativePath)) {
683
+ console.log(`[jaw:init] ✅ claude native binary verified → ${nativePath}`);
684
+ return true;
685
+ }
686
+ if (nativePath) {
687
+ console.error(`[jaw:init] ⚠️ claude native binary exists but failed --version → ${nativePath}`);
688
+ }
689
+ console.error('[jaw:init] ⚠️ claude: installer completed but native binary was not found or not runnable');
690
+ console.error('[jaw:init] expected a working ~/.local/bin/claude, ~/.claude/local/bin/claude, or %USERPROFILE%\\.local\\bin\\claude.exe');
691
+ return false;
692
+ }
346
693
  /** Check if a package is installed via a specific manager (independent of PATH order). */
347
694
  function isInstalledVia(mgr, pkg, brewFormula) {
348
695
  try {
349
696
  switch (mgr) {
350
697
  case 'npm':
351
- execSync(`npm ls -g ${pkg} --depth=0`, { stdio: 'pipe', timeout: 5000 });
698
+ execFileSync('npm', ['ls', '-g', pkg, '--depth=0'], { stdio: 'pipe', timeout: 5000, env: postinstallExecEnv() });
352
699
  return true;
353
700
  case 'bun': {
354
701
  const bunGlobal = path.join(home, '.bun', 'install', 'global', 'node_modules', pkg.split('/').pop());
355
702
  return fs.existsSync(bunGlobal);
356
703
  }
357
704
  case 'brew':
358
- execSync(`brew list --formula ${brewFormula || pkg}`, { stdio: 'pipe', timeout: 5000 });
705
+ execFileSync('brew', ['list', '--formula', brewFormula || pkg], { stdio: 'pipe', timeout: 5000, env: postinstallExecEnv() });
359
706
  return true;
360
707
  }
361
708
  }
@@ -370,9 +717,12 @@ function buildUninstallCmd(mgr, pkg, brewFormula) {
370
717
  case 'brew': return `brew uninstall ${brewFormula || pkg}`;
371
718
  }
372
719
  }
373
- /** Remove duplicate installations — keep the active one (PATH winner), remove the rest. */
374
- function deduplicateCliTool(bin, pkg, brew) {
375
- const active = detectInstaller(bin);
720
+ /** Remove duplicate installations — keep the preferred manager when postinstall just installed one. */
721
+ function deduplicateCliTool(bin, pkg, brew, preferredActive) {
722
+ const detectedActive = detectInstaller(bin);
723
+ const active = preferredActive && isInstalledVia(preferredActive, pkg, brew)
724
+ ? preferredActive
725
+ : detectedActive;
376
726
  if (!active)
377
727
  return; // not installed at all
378
728
  const others = ['bun', 'npm', 'brew'].filter(m => m !== active);
@@ -385,24 +735,58 @@ function deduplicateCliTool(bin, pkg, brew) {
385
735
  return;
386
736
  }
387
737
  for (const mgr of duplicates) {
388
- const cmd = buildUninstallCmd(mgr, pkg, brew);
389
738
  console.log(`[jaw:init] 🧹 ${bin}: removing duplicate from ${mgr} (active: ${active})`);
390
739
  try {
391
- execSync(cmd, { stdio: 'pipe', timeout: 30000 });
740
+ const env = postinstallExecEnv();
741
+ if (mgr === 'npm')
742
+ execFileSync('npm', ['uninstall', '-g', pkg], { stdio: 'pipe', timeout: 30000, env });
743
+ else if (mgr === 'bun')
744
+ execFileSync('bun', ['remove', '-g', pkg], { stdio: 'pipe', timeout: 30000, env });
745
+ else
746
+ execFileSync('brew', ['uninstall', brew || pkg], { stdio: 'pipe', timeout: 30000, env });
392
747
  console.log(`[jaw:init] removed ${pkg} from ${mgr}`);
393
748
  }
394
749
  catch {
395
- console.warn(`[jaw:init] ⚠️ failed to remove ${pkg} from ${mgr} — remove manually: ${cmd}`);
750
+ console.warn(`[jaw:init] ⚠️ failed to remove ${pkg} from ${mgr} — remove manually: ${buildUninstallCmd(mgr, pkg, brew)}`);
396
751
  }
397
752
  }
398
753
  }
399
754
  export async function installCliTools(opts = {}) {
400
- const defaultMgr = detectDefaultPkgMgr();
401
755
  const failed = [];
402
756
  console.log('[jaw:init] installing CLI tools @latest...');
403
- for (const { bin, pkg, brew, forceMgr } of CLI_PACKAGES) {
757
+ for (const { bin, pkg, brew } of CLI_PACKAGES) {
758
+ if (bin === 'claude') {
759
+ if (!shouldInstallClaudeDuringPostinstall()) {
760
+ console.log('[jaw:init] claude install skipped (CLI_JAW_SKIP_CLAUDE)');
761
+ continue;
762
+ }
763
+ const existingPath = findRunnableCliBinary('claude');
764
+ if (existingPath && !shouldForceClaudeDuringPostinstall()) {
765
+ console.log(`[jaw:init] ⏭️ claude already works → ${existingPath}`);
766
+ continue;
767
+ }
768
+ if (opts.dryRun) {
769
+ console.log(` [dry-run] would run ${buildClaudeNativeInstallCmd()}`);
770
+ continue;
771
+ }
772
+ if (opts.interactive && opts.ask) {
773
+ const answer = await opts.ask('Install claude (native Claude Code installer)? [y/N]', 'n');
774
+ if (answer.toLowerCase() !== 'y') {
775
+ console.log(` ⏭️ skipped ${bin}`);
776
+ continue;
777
+ }
778
+ }
779
+ if (!installClaudeCli({ force: shouldForceClaudeDuringPostinstall() }))
780
+ failed.push('claude (native installer)');
781
+ continue;
782
+ }
783
+ const existingPath = findExistingCliBinary(bin);
784
+ if (existingPath) {
785
+ console.log(`[jaw:init] ⏭️ ${bin} already works → ${existingPath}`);
786
+ continue;
787
+ }
404
788
  if (opts.dryRun) {
405
- console.log(` [dry-run] would install ${pkg}`);
789
+ console.log(` [dry-run] would run ${buildInstallCmd('npm', pkg, brew)}`);
406
790
  continue;
407
791
  }
408
792
  if (opts.interactive && opts.ask) {
@@ -412,50 +796,38 @@ export async function installCliTools(opts = {}) {
412
796
  continue;
413
797
  }
414
798
  }
415
- // forceMgr overrides detection (e.g. copilot always npm)
416
- const existing = forceMgr ? null : detectInstaller(bin);
417
- const mgr = forceMgr || existing || defaultMgr;
418
- const cmd = buildInstallCmd(mgr, pkg, brew);
419
- const tag = existing ? `update via ${mgr}` : `fresh install via ${mgr}`;
420
- console.log(`[jaw:init] 📦 ${bin} (${tag}): ${cmd}`);
799
+ const tag = existingPath ? 'repair via npm' : 'fresh install via npm';
800
+ console.log(`[jaw:init] 📦 ${bin} (${tag}): npm i -g ${pkg}@latest`);
421
801
  try {
422
- execSync(cmd, { stdio: 'pipe', timeout: 180000 });
802
+ runInstallCmd('npm', pkg, postinstallExecEnv(), brew);
423
803
  console.log(`[jaw:init] ✅ ${bin} installed`);
424
804
  }
425
805
  catch {
426
- // Fallback: if preferred manager failed and it wasn't npm, try npm
427
- if (mgr !== 'npm') {
428
- console.log(`[jaw:init] ⚠️ ${mgr} failed, trying npm i -g ${pkg}@latest ...`);
429
- try {
430
- execSync(`npm i -g ${pkg}@latest`, { stdio: 'pipe', timeout: 180000 });
431
- console.log(`[jaw:init] ✅ ${bin} installed (via npm fallback)`);
432
- }
433
- catch {
434
- failed.push(`${bin} (${pkg})`);
435
- console.error(`[jaw:init] ⚠️ ${bin}: auto-install failed — install manually: npm i -g ${pkg}`);
436
- }
437
- }
438
- else {
439
- failed.push(`${bin} (${pkg})`);
440
- console.error(`[jaw:init] ⚠️ ${bin}: auto-install failed — install manually: npm i -g ${pkg}`);
441
- }
806
+ failed.push(`${bin} (${pkg})`);
807
+ console.error(`[jaw:init] ⚠️ ${bin}: auto-install failed — install manually: npm i -g ${pkg}`);
442
808
  }
443
- // Clean up duplicate installations from other package managers
444
- deduplicateCliTool(bin, pkg, brew);
809
+ // Clean up duplicate installations from other package managers only after cli-jaw installs npm.
810
+ deduplicateCliTool(bin, pkg, brew, 'npm');
445
811
  }
446
812
  if (failed.length > 0 && shouldRequireCliToolsDuringPostinstall()) {
447
813
  throw new Error(`Required CLI tool install failed: ${failed.join(', ')}`);
448
814
  }
449
815
  }
450
816
  const MCP_PACKAGES = [
451
- { pkg: '@upstash/context7-mcp', bin: 'context7-mcp' },
817
+ { name: 'context7', pkg: '@upstash/context7-mcp', bin: 'context7-mcp' },
452
818
  ];
453
819
  export async function installMcpServers(opts = {}) {
454
820
  console.log('[jaw:init] installing MCP servers globally...');
455
821
  const config = loadUnifiedMcp();
456
822
  let updated = false;
457
- for (const { pkg, bin } of MCP_PACKAGES) {
823
+ const servers = asRecord(config.servers);
824
+ for (const { name, pkg, bin } of MCP_PACKAGES) {
458
825
  try {
826
+ const server = asRecord(servers[name]);
827
+ if (typeof server["url"] === 'string' && server["url"]) {
828
+ console.log(`[jaw:init] ⏭️ ${name} MCP (remote URL, no local install needed)`);
829
+ continue;
830
+ }
459
831
  const installedPath = findBinaryPath(bin);
460
832
  if (installedPath) {
461
833
  console.log(`[jaw:init] ⏭️ ${bin} (already installed)`);
@@ -473,10 +845,9 @@ export async function installMcpServers(opts = {}) {
473
845
  }
474
846
  }
475
847
  console.log(`[jaw:init] 📦 npm i -g ${pkg} ...`);
476
- execSync(`npm i -g ${pkg}`, { stdio: 'pipe', timeout: 120000 });
848
+ execFileSync('npm', ['i', '-g', pkg], { stdio: 'pipe', timeout: 120000, env: postinstallExecEnv() });
477
849
  const binPath = findBinaryPath(bin) || bin;
478
850
  console.log(`[jaw:init] ✅ ${bin} → ${binPath}`);
479
- const servers = asRecord(config.servers);
480
851
  for (const srv of Object.values(servers).map(asRecord)) {
481
852
  const args = asArray(srv["args"]);
482
853
  if (srv["command"] === 'npx' && args.includes(pkg)) {
@@ -496,24 +867,47 @@ export async function installMcpServers(opts = {}) {
496
867
  const SKILL_DEPS = [
497
868
  {
498
869
  name: 'uv',
499
- check: 'uv --version',
870
+ check: ['uv', ['--version']],
500
871
  install: process.platform === 'win32'
501
- ? 'powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"'
502
- : 'curl -LsSf https://astral.sh/uv/install.sh | sh',
872
+ ? { type: 'remote-script', url: 'https://astral.sh/uv/install.ps1', shell: 'powershell' }
873
+ : { type: 'remote-script', url: 'https://astral.sh/uv/install.sh', shell: 'sh' },
503
874
  why: 'Python skills (imagegen, pdf, speech, spreadsheet, transcribe)',
504
875
  },
505
876
  {
506
877
  name: 'playwright-core',
507
- check: 'node -e "require.resolve(\'playwright-core\')"',
508
- install: 'npm i -g playwright-core',
878
+ check: ['node', ['-e', "require.resolve('playwright-core')"]],
879
+ install: { type: 'npm', pkg: 'playwright-core' },
509
880
  why: 'Browser control skill (cli-jaw browser)',
510
881
  },
511
882
  ];
883
+ function runSkillDepInstall(install, env) {
884
+ if ('pkg' in install) {
885
+ execFileSync('npm', ['i', '-g', install.pkg], { stdio: 'pipe', timeout: 120000, env });
886
+ return;
887
+ }
888
+ const tmpScript = path.join(os.tmpdir(), `jaw-dep-${Date.now()}.sh`);
889
+ try {
890
+ execFileSync('curl', ['-fsSL', '-o', tmpScript, install.url], { stdio: 'pipe', timeout: 30000, env });
891
+ if (install.shell === 'powershell') {
892
+ execFileSync('powershell', ['-ExecutionPolicy', 'ByPass', '-File', tmpScript], { stdio: 'pipe', timeout: 120000, env });
893
+ }
894
+ else {
895
+ execFileSync(install.shell, [tmpScript], { stdio: 'pipe', timeout: 120000, env });
896
+ }
897
+ }
898
+ finally {
899
+ try {
900
+ fs.unlinkSync(tmpScript);
901
+ }
902
+ catch { }
903
+ }
904
+ }
512
905
  export async function installSkillDeps(opts = {}) {
513
906
  console.log('[jaw:init] checking skill dependencies...');
514
907
  for (const dep of SKILL_DEPS) {
908
+ const [checkBin, checkArgs] = dep.check;
515
909
  try {
516
- execSync(dep.check, { stdio: 'pipe', timeout: 10000 });
910
+ execFileSync(checkBin, checkArgs, { stdio: 'pipe', timeout: 10000, env: postinstallExecEnv() });
517
911
  console.log(`[jaw:init] ⏭️ ${dep.name} (already installed)`);
518
912
  }
519
913
  catch {
@@ -530,12 +924,11 @@ export async function installSkillDeps(opts = {}) {
530
924
  }
531
925
  console.log(`[jaw:init] 📦 installing ${dep.name} (${dep.why})...`);
532
926
  try {
533
- execSync(dep.install, { stdio: 'pipe', timeout: 120000 });
927
+ runSkillDepInstall(dep.install, postinstallExecEnv());
534
928
  console.log(`[jaw:init] ✅ ${dep.name} installed`);
535
929
  }
536
- catch (e) {
537
- console.error(`[jaw:init] ⚠️ ${dep.name}: auto-install failed — install manually:`);
538
- console.error(` ${dep.install}`);
930
+ catch {
931
+ console.error(`[jaw:init] ⚠️ ${dep.name}: auto-install failed — install manually`);
539
932
  }
540
933
  }
541
934
  }
@@ -555,6 +948,25 @@ export async function runPostinstall() {
555
948
  console.log('[jaw:postinstall] Run `jaw init` to configure interactively');
556
949
  return;
557
950
  }
951
+ // ── WSL + Windows Node detection ──
952
+ const looksLikeWsl = Boolean(process.env['WSL_DISTRO_NAME'] || process.env['WSL_INTEROP'] || process.env['WSLENV']
953
+ || (() => { try {
954
+ return fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft');
955
+ }
956
+ catch {
957
+ return false;
958
+ } })());
959
+ if (looksLikeWsl) {
960
+ const execPath = process.execPath.replace(/\\/g, '/');
961
+ const isWindowsNode = process.platform === 'win32'
962
+ || /^[A-Z]:\//i.test(execPath)
963
+ || execPath.startsWith('/mnt/');
964
+ if (isWindowsNode) {
965
+ console.warn('[jaw:init] ⚠️ Running with Windows Node.js inside WSL');
966
+ console.warn('[jaw:init] npm -g packages will install to Windows, not WSL');
967
+ console.warn('[jaw:init] Recommended: install Node inside WSL (fnm install 22 or nvm install 22)');
968
+ }
969
+ }
558
970
  // ── Legacy migration (only in normal mode, NOT safe mode) ──
559
971
  const legacyHome = path.join(home, '.cli-jaw');
560
972
  const isCustomHome = jawHome !== legacyHome;
@@ -597,16 +1009,13 @@ export async function runPostinstall() {
597
1009
  console.log('[jaw:init] shared path migration skipped (isolated-by-default)');
598
1010
  console.log('[jaw:init] to opt in: CLI_JAW_MIGRATE_SHARED_PATHS=1 npm install -g cli-jaw');
599
1011
  }
600
- // 3. CLAUDE.md → AGENTS.md symlink
601
- const agentsMd = path.join(jawHome, 'AGENTS.md');
602
- const claudeMd = path.join(jawHome, 'CLAUDE.md');
603
- if (fs.existsSync(agentsMd) && !fs.existsSync(claudeMd)) {
604
- ensureSymlink(agentsMd, claudeMd);
605
- }
1012
+ // 3. Remove deprecated Jaw-home CLAUDE.md mirrors.
1013
+ // Boss prompts are already passed through append/system-prompt paths.
1014
+ removeJawHomeClaudeInstructionFile(jawHome);
606
1015
  // 4. Default heartbeat.json
607
1016
  const heartbeatPath = path.join(jawHome, 'heartbeat.json');
608
1017
  if (!fs.existsSync(heartbeatPath)) {
609
- fs.writeFileSync(heartbeatPath, JSON.stringify({ jobs: [] }, null, 2));
1018
+ fs.writeFileSync(heartbeatPath, JSON.stringify({ jobs: [] }, null, 2), { mode: 0o600 });
610
1019
  console.log(`[jaw:init] created ${heartbeatPath}`);
611
1020
  }
612
1021
  // 5. MCP config
@@ -614,13 +1023,22 @@ export async function runPostinstall() {
614
1023
  // 6. Default skills (base) + propagate to all instances
615
1024
  copyDefaultSkills();
616
1025
  propagateSkillsToInstances();
617
- // 7-9. Install MCP servers, skill deps, officecli runtime. CLI tools are opt-in:
618
- // postinstall must not update or uninstall user-managed agent CLIs unexpectedly.
1026
+ // 7-9. Install MCP servers, skill deps, officecli runtime. Claude is the default
1027
+ // agent CLI, so keep it spawnable; other agent CLIs remain opt-in.
619
1028
  if (shouldInstallCliToolsDuringPostinstall()) {
620
1029
  await installCliTools();
621
1030
  }
622
1031
  else {
623
- console.log('[jaw:init] CLI tool install/update skipped by default');
1032
+ if (shouldInstallClaudeDuringPostinstall()) {
1033
+ const ok = installClaudeCli({ force: shouldForceClaudeDuringPostinstall() });
1034
+ if (!ok && shouldRequireCliToolsDuringPostinstall()) {
1035
+ throw new Error('Required CLI tool install failed: claude (native installer)');
1036
+ }
1037
+ }
1038
+ else {
1039
+ console.log('[jaw:init] claude install skipped (CLI_JAW_SKIP_CLAUDE)');
1040
+ }
1041
+ console.log('[jaw:init] additional CLI tool install/update skipped by default');
624
1042
  console.log('[jaw:init] to opt in: CLI_JAW_INSTALL_CLI_TOOLS=1 npm install -g cli-jaw');
625
1043
  }
626
1044
  await installMcpServers();