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.
- package/README.ja.md +229 -315
- package/README.ko.md +248 -315
- package/README.md +103 -186
- package/README.zh-CN.md +282 -296
- package/dist/bin/commands/browser-web-ai.js +4 -2
- package/dist/bin/commands/browser-web-ai.js.map +1 -1
- package/dist/bin/commands/browser.js +76 -0
- package/dist/bin/commands/browser.js.map +1 -1
- package/dist/bin/commands/doctor.js +122 -4
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/skill.js +5 -3
- package/dist/bin/commands/skill.js.map +1 -1
- package/dist/bin/postinstall.js +507 -89
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/lib/mcp/format-converters.js +32 -4
- package/dist/lib/mcp/format-converters.js.map +1 -1
- package/dist/lib/mcp/mcp-install.js +5 -0
- package/dist/lib/mcp/mcp-install.js.map +1 -1
- package/dist/lib/mcp/skills-distribution.js +52 -53
- package/dist/lib/mcp/skills-distribution.js.map +1 -1
- package/dist/lib/mcp/skills-reset.js +29 -16
- package/dist/lib/mcp/skills-reset.js.map +1 -1
- package/dist/lib/mcp/skills-utils.js +64 -2
- package/dist/lib/mcp/skills-utils.js.map +1 -1
- package/dist/lib/mcp/unified-config.js +7 -3
- package/dist/lib/mcp/unified-config.js.map +1 -1
- package/dist/scripts/fresh-install-smoke.js +1 -1
- package/dist/scripts/fresh-install-smoke.js.map +1 -1
- package/dist/server.js +44 -4
- package/dist/server.js.map +1 -1
- package/dist/src/agent/args.js +148 -1
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/claude-e-runtime.js +42 -0
- package/dist/src/agent/claude-e-runtime.js.map +1 -0
- package/dist/src/agent/claude-i-runtime.js +42 -0
- package/dist/src/agent/claude-i-runtime.js.map +1 -0
- package/dist/src/agent/cli-helpers.js +9 -0
- package/dist/src/agent/cli-helpers.js.map +1 -0
- package/dist/src/agent/codex-app-client.js +240 -0
- package/dist/src/agent/codex-app-client.js.map +1 -0
- package/dist/src/agent/codex-app-events.js +268 -0
- package/dist/src/agent/codex-app-events.js.map +1 -0
- package/dist/src/agent/error-classifier.js +8 -2
- package/dist/src/agent/error-classifier.js.map +1 -1
- package/dist/src/agent/events/acp.js +200 -0
- package/dist/src/agent/events/acp.js.map +1 -0
- package/dist/src/agent/events/claude.js +200 -0
- package/dist/src/agent/events/claude.js.map +1 -0
- package/dist/src/agent/events/codex.js +118 -0
- package/dist/src/agent/events/codex.js.map +1 -0
- package/dist/src/agent/events/gemini.js +100 -0
- package/dist/src/agent/events/gemini.js.map +1 -0
- package/dist/src/agent/events/grok.js +298 -0
- package/dist/src/agent/events/grok.js.map +1 -0
- package/dist/src/agent/events/helpers.js +237 -0
- package/dist/src/agent/events/helpers.js.map +1 -0
- package/dist/src/agent/events/index.js +315 -0
- package/dist/src/agent/events/index.js.map +1 -0
- package/dist/src/agent/events/opencode.js +171 -0
- package/dist/src/agent/events/opencode.js.map +1 -0
- package/dist/src/agent/events/summary.js +128 -0
- package/dist/src/agent/events/summary.js.map +1 -0
- package/dist/src/agent/events/tool-labels.js +299 -0
- package/dist/src/agent/events/tool-labels.js.map +1 -0
- package/dist/src/agent/events/types.js +3 -0
- package/dist/src/agent/events/types.js.map +1 -0
- package/dist/src/agent/events.js +2 -1487
- package/dist/src/agent/events.js.map +1 -1
- package/dist/src/agent/grok-trace-backfill.js +153 -0
- package/dist/src/agent/grok-trace-backfill.js.map +1 -0
- package/dist/src/agent/lifecycle-handler.js +60 -16
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/live-run-state.js +1 -1
- package/dist/src/agent/live-run-state.js.map +1 -1
- package/dist/src/agent/memory-flush-controller.js +26 -0
- package/dist/src/agent/memory-flush-controller.js.map +1 -1
- package/dist/src/agent/resume-classifier.js +9 -0
- package/dist/src/agent/resume-classifier.js.map +1 -1
- package/dist/src/agent/session-persistence.js +7 -2
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/spawn/process-kill.js +29 -0
- package/dist/src/agent/spawn/process-kill.js.map +1 -0
- package/dist/src/agent/spawn/queue.js +273 -0
- package/dist/src/agent/spawn/queue.js.map +1 -0
- package/dist/src/agent/spawn/resume.js +56 -0
- package/dist/src/agent/spawn/resume.js.map +1 -0
- package/dist/src/agent/spawn.js +435 -371
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/agent/watchdog.js +5 -1
- package/dist/src/agent/watchdog.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-escalation.js +177 -0
- package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/browser-runtime.js +38 -0
- package/dist/src/browser/adaptive-fetch/browser-runtime.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/browser-session.js +97 -0
- package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/challenge-detector.js +88 -0
- package/dist/src/browser/adaptive-fetch/challenge-detector.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/content-scorer.js +145 -0
- package/dist/src/browser/adaptive-fetch/content-scorer.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +382 -0
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/fetcher.js +105 -0
- package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/human-loop.js +101 -0
- package/dist/src/browser/adaptive-fetch/human-loop.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/index.js +586 -0
- package/dist/src/browser/adaptive-fetch/index.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/metadata.js +169 -0
- package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/output.js +71 -0
- package/dist/src/browser/adaptive-fetch/output.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/reader-adapters.js +135 -0
- package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/safety.js +296 -0
- package/dist/src/browser/adaptive-fetch/safety.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/third-party-readers.js +43 -0
- package/dist/src/browser/adaptive-fetch/third-party-readers.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/trace.js +61 -0
- package/dist/src/browser/adaptive-fetch/trace.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/transforms.js +81 -0
- package/dist/src/browser/adaptive-fetch/transforms.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/validators.js +108 -0
- package/dist/src/browser/adaptive-fetch/validators.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/waf-profiles.js +135 -0
- package/dist/src/browser/adaptive-fetch/waf-profiles.js.map +1 -0
- package/dist/src/browser/index.js +1 -0
- package/dist/src/browser/index.js.map +1 -1
- package/dist/src/browser/web-ai/gemini-model.js +42 -15
- package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
- package/dist/src/cli/claude-models.js +1 -1
- package/dist/src/cli/claude-models.js.map +1 -1
- package/dist/src/cli/compact.js +2 -0
- package/dist/src/cli/compact.js.map +1 -1
- package/dist/src/cli/handlers-completions.js +3 -0
- package/dist/src/cli/handlers-completions.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +5 -2
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/readiness.js +43 -1
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry.js +58 -0
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/core/browser-open.js +4 -1
- package/dist/src/core/browser-open.js.map +1 -1
- package/dist/src/core/claude-install.js +4 -0
- package/dist/src/core/claude-install.js.map +1 -1
- package/dist/src/core/cli-detect.js +61 -13
- package/dist/src/core/cli-detect.js.map +1 -1
- package/dist/src/core/compact.js +295 -63
- package/dist/src/core/compact.js.map +1 -1
- package/dist/src/core/config.js +151 -11
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +10 -1
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/employees.js +1 -1
- package/dist/src/core/employees.js.map +1 -1
- package/dist/src/core/logger.js +28 -9
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/runtime-settings.js +32 -5
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/manager/memory/embedding/state-machine.js +2 -1
- package/dist/src/manager/memory/embedding/state-machine.js.map +1 -1
- package/dist/src/manager/memory/embedding/sync.js +52 -33
- package/dist/src/manager/memory/embedding/sync.js.map +1 -1
- package/dist/src/manager/memory/embedding/vec-store.js +10 -10
- package/dist/src/manager/memory/embedding/vec-store.js.map +1 -1
- package/dist/src/manager/routes/dashboard-memory.js +43 -16
- package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
- package/dist/src/manager/server.js +11 -0
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/memory/indexing.js +6 -1
- package/dist/src/memory/indexing.js.map +1 -1
- package/dist/src/orchestrator/distribute.js +5 -4
- package/dist/src/orchestrator/distribute.js.map +1 -1
- package/dist/src/prompt/builder.js +12 -1
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/runtime-context.js +69 -0
- package/dist/src/prompt/runtime-context.js.map +1 -0
- package/dist/src/routes/browser.js +33 -0
- package/dist/src/routes/browser.js.map +1 -1
- package/dist/src/routes/employees.js +1 -1
- package/dist/src/routes/employees.js.map +1 -1
- package/dist/src/routes/memory.js +1 -1
- package/dist/src/routes/memory.js.map +1 -1
- package/dist/src/routes/orchestrate.js +37 -10
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/quota.js +91 -1
- package/dist/src/routes/quota.js.map +1 -1
- package/dist/src/routes/runtime-context.js +43 -0
- package/dist/src/routes/runtime-context.js.map +1 -0
- package/dist/src/routes/security-audit.js +14 -0
- package/dist/src/routes/security-audit.js.map +1 -0
- package/dist/src/routes/settings.js +8 -1
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/security/security-audit-log.js +99 -0
- package/dist/src/security/security-audit-log.js.map +1 -0
- package/dist/src/telegram/bot.js +4 -2
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/types/cli-engine.js +4 -0
- package/dist/src/types/cli-engine.js.map +1 -1
- package/dist/src/types/cli-events.js +1 -1
- package/dist/src/types/cli-events.js.map +1 -1
- package/package.json +9 -3
- package/public/assets/providers/antigravity-color.svg +1 -0
- package/public/assets/providers/antigravity.svg +1 -0
- package/public/assets/providers/copilot-color.svg +1 -1
- package/public/assets/providers/copilot.svg +1 -1
- package/public/assets/providers/grok-color.svg +1 -0
- package/public/assets/providers/grok.svg +1 -0
- package/public/css/chat-search.css +168 -0
- package/public/css/chat.css +43 -1
- package/public/css/modals.css +41 -0
- package/public/dist/assets/{AdvancedExport-BAdZUC-6.js → AdvancedExport-CBvz4_IZ.js} +1 -1
- package/public/dist/assets/Agent-DlUqCMXJ.js +1 -0
- package/public/dist/assets/{Browser-BsdxDVgM.js → Browser-66BpLQck.js} +1 -1
- package/public/dist/assets/{ChannelsDiscord-Dg_jto6l.js → ChannelsDiscord-BifT2Dum.js} +1 -1
- package/public/dist/assets/{ChannelsTelegram-DGyZfJGS.js → ChannelsTelegram-CK6tYQ8k.js} +1 -1
- package/public/dist/assets/DashboardEmbeddingSection-6F8zSSja.js +2 -0
- package/public/dist/assets/{DashboardMeta-CAH9ONTb.js → DashboardMeta-Cc03HT5R.js} +1 -1
- package/public/dist/assets/{Display-DM_yvyKL.js → Display-arOjcMQZ.js} +1 -1
- package/public/dist/assets/Employees-YbW-mI67.js +1 -0
- package/public/dist/assets/{HealthBadge-Dtr-dDnw.js → HealthBadge-DEPFkcA0.js} +1 -1
- package/public/dist/assets/Heartbeat-CW4eIhtJ.js +1 -0
- package/public/dist/assets/{InlineWarn-E64UaKFh.js → InlineWarn-DoJS7AgM.js} +1 -1
- package/public/dist/assets/{Mcp-Dlp2X7X7.js → Mcp-ZQ6ARQb6.js} +1 -1
- package/public/dist/assets/Memory-BAUWJMqc.js +1 -0
- package/public/dist/assets/{MilkdownWysiwygEditor-Ctww8i0L.js → MilkdownWysiwygEditor-IAqFtXvM.js} +1 -1
- package/public/dist/assets/ModelProvider-DUtmFh0J.js +1 -0
- package/public/dist/assets/{Network-Df1R2YcQ.js → Network-B_4E82zQ.js} +1 -1
- package/public/dist/assets/{Permissions-BKJ5K6EL.js → Permissions-BkADXjQ4.js} +1 -1
- package/public/dist/assets/{Permissions-CcWZoOVP.js → Permissions-DvUCB8wA.js} +1 -1
- package/public/dist/assets/{Profile-DZ7xf1WZ.js → Profile-BcnTCSYM.js} +1 -1
- package/public/dist/assets/{Prompts-Bh5DYt8e.js → Prompts-CUs_RoRE.js} +1 -1
- package/public/dist/assets/{SpeechKeys-CQwtVxOP.js → SpeechKeys-qxc-ROWN.js} +1 -1
- package/public/dist/assets/agent-meta-Du8y6mSM.js +1 -0
- package/public/dist/assets/app-CGqTcIeF.js +39 -0
- package/public/dist/assets/app-Dpk6cE6C.css +1 -0
- package/public/dist/assets/architecture-7EHR7CIX-wVaUQezY.js +1 -0
- package/public/dist/assets/architectureDiagram-3BPJPVTR-kYIVzmWe.js +36 -0
- package/public/dist/assets/blockDiagram-GPEHLZMM-B204CPhe.js +132 -0
- package/public/dist/assets/{c4Diagram-AHTNJAMY-Bp2QLC-s.js → c4Diagram-AAUBKEIU-DAv6TAjg.js} +6 -6
- package/public/dist/assets/channel-CCQujL1n.js +1 -0
- package/public/dist/assets/{chunk-EDXVE4YY-COudQKkJ.js → chunk-2J33WTMH-xiPJWKcl.js} +1 -1
- package/public/dist/assets/chunk-3OPIFGDE-DOAvk9x8.js +62 -0
- package/public/dist/assets/{chunk-4BX2VUAB-Cm3KqBkS.js → chunk-4BX2VUAB-6lTRwyT0.js} +1 -1
- package/public/dist/assets/chunk-4EGX6M5U-DXtAEgX6.js +1 -0
- package/public/dist/assets/chunk-55IACEB6-Dx2JkQLw.js +1 -0
- package/public/dist/assets/chunk-5DO6E6H7-DDcMHB95.js +1 -0
- package/public/dist/assets/chunk-5ZQYHXKU-Bd-RFO5i.js +2 -0
- package/public/dist/assets/chunk-727SXJPM-BrsRzj8z.js +206 -0
- package/public/dist/assets/{chunk-AGHRB4JF-DIMn8T3_.js → chunk-AGHRB4JF-CYdXVA2-.js} +1 -1
- package/public/dist/assets/chunk-AQP2D5EJ-Di6Gstk-.js +231 -0
- package/public/dist/assets/{chunk-LIHQZDEY-Xw9ZX8of.js → chunk-BR22UD5L-CVuYkAd1.js} +1 -1
- package/public/dist/assets/{chunk-BSJP7CBP-DnSYKjii.js → chunk-BSJP7CBP-B47GpxcW.js} +1 -1
- package/public/dist/assets/chunk-CSCIHK7Q-CAE1p4Em.js +123 -0
- package/public/dist/assets/chunk-FHYWG6QK-CxZt-yZZ.js +1 -0
- package/public/dist/assets/{chunk-FMBD7UC4-6yXYicjw.js → chunk-FMBD7UC4-CwqBlx0l.js} +1 -1
- package/public/dist/assets/chunk-KSCS5N6A-D9a4ZkOy.js +10 -0
- package/public/dist/assets/{chunk-ZZ45TVLE-D5oxCC1O.js → chunk-L5ZTLDWV-D208QbfC.js} +1 -1
- package/public/dist/assets/{chunk-336JU56O-CAt5aBOe.js → chunk-LZXEDZCA-CE2KFduj.js} +1 -1
- package/public/dist/assets/chunk-MPE355IW-Bp4qAOUf.js +1 -0
- package/public/dist/assets/chunk-MZUSXYTE-DAU-v-0c.js +1 -0
- package/public/dist/assets/chunk-N66VUXT2-CpPz1L5u.js +1 -0
- package/public/dist/assets/chunk-ND2GUHAM-zZ7h1CPf.js +1 -0
- package/public/dist/assets/chunk-NNHCCRGN-BaiX9a5F.js +159 -0
- package/public/dist/assets/{chunk-X2U36JSP-CoMFMVNF.js → chunk-NZK2D7GU-CTqFQ8K5.js} +1 -1
- package/public/dist/assets/chunk-O5CBEL6O-BTuvXKFi.js +11 -0
- package/public/dist/assets/chunk-PUPMXCY4-ppZvktf-.js +1 -0
- package/public/dist/assets/chunk-QZHKN3VN-CBAtPPT7.js +1 -0
- package/public/dist/assets/chunk-UIBZB4QT-rJZEVBX0.js +1 -0
- package/public/dist/assets/chunk-WCWK7LTN-CGvUyB8h.js +1 -0
- package/public/dist/assets/chunk-WU5MYG2G-C3fKlSvP.js +1 -0
- package/public/dist/assets/{chunk-XPW4576I-CmAz5C-j.js → chunk-XPW4576I-BaQfzRci.js} +1 -1
- package/public/dist/assets/classDiagram-4FO5ZUOK-Cb-qL5u3.js +1 -0
- package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BPhGdj15.js +1 -0
- package/public/dist/assets/constants-BxG09J6S.js +1 -0
- package/public/dist/assets/cose-bilkent-S5V4N54A-D1zmarou.js +1 -0
- package/public/dist/assets/dagre-BM42HDAG-BVkBttzA.js +4 -0
- package/public/dist/assets/dagre-DnoxfNXr.js +1 -0
- package/public/dist/assets/diagram-2AECGRRQ-Bs32KPnT.js +43 -0
- package/public/dist/assets/{diagram-5BDNPKRD-Cl4PzCD0.js → diagram-5GNKFQAL-YDYgPOQj.js} +2 -2
- package/public/dist/assets/diagram-KO2AKTUF-1tIdFl26.js +3 -0
- package/public/dist/assets/{diagram-TYMM5635-B_Xoa1Gp.js → diagram-LMA3HP47-B1y15kav.js} +1 -1
- package/public/dist/assets/diagram-OG6HWLK6-C25j1jGg.js +24 -0
- package/public/dist/assets/{dist-C9LWf2uC.js → dist-0v1UKkQ3.js} +1 -1
- package/public/dist/assets/dist-BMi_buEb.js +1 -0
- package/public/dist/assets/{dist-B6G8pbap.js → dist-BQNQk-1M.js} +1 -1
- package/public/dist/assets/{dist-CCKktDoF.js → dist-BVpa_e6W.js} +1 -1
- package/public/dist/assets/dist-BkrbW_LS.js +1 -0
- package/public/dist/assets/{dist-CkMC2PPt.js → dist-C1VqWrYZ.js} +1 -1
- package/public/dist/assets/{dist-BA7sRne4.js → dist-C3vh7d65.js} +1 -1
- package/public/dist/assets/{dist-BhzKO6nt2.js → dist-CE4s7vg82.js} +1 -1
- package/public/dist/assets/{dist-BDMNMdPF.js → dist-CjPin7Mr.js} +1 -1
- package/public/dist/assets/{dist-W7IGn2ug.js → dist-Ck6PnIlo.js} +1 -1
- package/public/dist/assets/{dist-B1rKu9eP.js → dist-CnIrGAPx.js} +1 -1
- package/public/dist/assets/{dist-CEDX2HGI.js → dist-Cv8S3FhF.js} +1 -1
- package/public/dist/assets/{dist-55MYVjjj.js → dist-D0PYXGt2.js} +1 -1
- package/public/dist/assets/{dist-C0sOT_UM.js → dist-D5GUqT-6.js} +1 -1
- package/public/dist/assets/{dist-C5S-Rbvc.js → dist-D66X8iAn.js} +1 -1
- package/public/dist/assets/dist-D815C1Fv.js +1 -0
- package/public/dist/assets/{dist-Ch6JG5jE.js → dist-DDDFJ8jG.js} +1 -1
- package/public/dist/assets/{dist-2oDfqE98.js → dist-DHQI31dn.js} +1 -1
- package/public/dist/assets/{dist-BTp_Oy_x.js → dist-DTQW91xt.js} +1 -1
- package/public/dist/assets/{dist-BuaQLcgQ.js → dist-Dm7RAaUo.js} +1 -1
- package/public/dist/assets/{dist-BJyDhGpS.js → dist-DrIWh2fi.js} +1 -1
- package/public/dist/assets/{dist-BGzHP3f8.js → dist-DzT7frM2.js} +1 -1
- package/public/dist/assets/{dist-wdLr2dSH.js → dist-Qs7HHNCC.js} +1 -1
- package/public/dist/assets/{dist-BjqyutOM.js → dist-Rs_Khtjb.js} +1 -1
- package/public/dist/assets/{dist-DdhWu7OM.js → dist-fJAyK82z.js} +1 -1
- package/public/dist/assets/{dist-G7QUHtDS.js → dist-jcptfm_T.js} +1 -1
- package/public/dist/assets/dist-sOV2kBhQ.js +1 -0
- package/public/dist/assets/{dist-BoG5I6U5.js → dist-vQskrHxt.js} +1 -1
- package/public/dist/assets/{dockerfile-CrC2HXHP.js → dockerfile-DAfh5qoE.js} +1 -1
- package/public/dist/assets/{employees-CIkIyvtL.js → employees-DRmX2RDd.js} +2 -2
- package/public/dist/assets/{erDiagram-SMLLAGMA-BvtqhMsS.js → erDiagram-TEJ5UH35-CRvCbztR.js} +6 -6
- package/public/dist/assets/{error-normalize-CkhPeQYx.js → error-normalize-CNbPE4lO.js} +1 -1
- package/public/dist/assets/eventmodeling-FCH6USID-Cq0nylxO.js +1 -0
- package/public/dist/assets/{factor-1CttFx2G.js → factor-BpoYJieo.js} +1 -1
- package/public/dist/assets/fields-DUawAHWZ.js +1 -0
- package/public/dist/assets/flowDiagram-I6XJVG4X-CzvVnib_.js +162 -0
- package/public/dist/assets/ganttDiagram-6RSMTGT7-BbUYP6iv.js +292 -0
- package/public/dist/assets/gitGraph-WXDBUCRP-DDq6-3D3.js +1 -0
- package/public/dist/assets/gitGraphDiagram-PVQCEYII-CbKdM7nW.js +106 -0
- package/public/dist/assets/graphlib-BLOO0H5r.js +1 -0
- package/public/dist/assets/info-J43DQDTF-OUnqwpUV.js +1 -0
- package/public/dist/assets/infoDiagram-5YYISTIA-BrZmg1At.js +2 -0
- package/public/dist/assets/{ishikawaDiagram-UXIWVN3A-DZW-Nqsf.js → ishikawaDiagram-YF4QCWOH-BDWXqJi5.js} +2 -2
- package/public/dist/assets/javascript-CZjRNq5R.js +1 -0
- package/public/dist/assets/{journeyDiagram-VCZTEJTY-ByVRJxVF.js → journeyDiagram-JHISSGLW-CPFRd_M3.js} +6 -6
- package/public/dist/assets/{jsx-runtime-BjL7qHh8.js → jsx-runtime-BZmCptaP.js} +1 -1
- package/public/dist/assets/{kanban-definition-6JOO6SKY-xwN0YCW2.js → kanban-definition-UN3LZRKU-BcQbBplS.js} +10 -10
- package/public/dist/assets/katex-CF5bGce6.js +1 -0
- package/public/dist/assets/manager-B5OmizBL.css +1 -0
- package/public/dist/assets/manager-Cs3eMBcx.js +25 -0
- package/public/dist/assets/{memory-CnBc2_Va.js → memory-BA-ki3gn.js} +1 -1
- package/public/dist/assets/memory-DLQbyBA3.js +1 -0
- package/public/dist/assets/mermaid-loader-BVPsKrpr.js +1 -0
- package/public/dist/assets/mermaid-parser.core-C62NUJRb.js +3 -0
- package/public/dist/assets/mermaid.core-ArqR5iFa.js +9 -0
- package/public/dist/assets/mermaid.core-BAwu4U2Y.js +1 -0
- package/public/dist/assets/{mindmap-definition-QFDTVHPH-Chqgsh1N.js → mindmap-definition-RKZ34NQL-C35cGkNU.js} +29 -29
- package/public/dist/assets/{nsis-_CjIiUyF.js → nsis-Ch4QINLN.js} +1 -1
- package/public/dist/assets/packet-YPE3B663-Bb9hBQ06.js +1 -0
- package/public/dist/assets/{page-shell-CTxVDJ8Y.js → page-shell-CVAobxbP.js} +1 -1
- package/public/dist/assets/pie-LRSECV5Y-CNRQnRNZ.js +1 -0
- package/public/dist/assets/pieDiagram-4H26LBE5-B8C_hoqJ.js +30 -0
- package/public/dist/assets/provider-icons-dxT69zGg.js +8 -0
- package/public/dist/assets/{pug-CbR8lCtK.js → pug-CXYqmmpP.js} +1 -1
- package/public/dist/assets/quadrantDiagram-W4KKPZXB-BEPrine5.js +7 -0
- package/public/dist/assets/radar-GUYGQ44K-BxngU2v0.js +1 -0
- package/public/dist/assets/{render-lpTpN1El.js → render-C7_e0J_X.js} +3 -3
- package/public/dist/assets/{requirementDiagram-MS252O5E-wnPtv0LG.js → requirementDiagram-4Y6WPE33-ClDDon9c.js} +4 -4
- package/public/dist/assets/rolldown-runtime-XQCOJYun.js +1 -0
- package/public/dist/assets/sankeyDiagram-5OEKKPKP-Bjs3OE-1.js +40 -0
- package/public/dist/assets/sequenceDiagram-3UESZ5HK-BM8IAaEe.js +162 -0
- package/public/dist/assets/settings-DjyKdqev.js +1 -0
- package/public/dist/assets/settings-pUJzyeX2.js +42 -0
- package/public/dist/assets/{sidebar-Cwt0FxQl.js → sidebar-CO9Qjj6v.js} +2 -2
- package/public/dist/assets/skills-CX3qJ77s.js +1 -0
- package/public/dist/assets/{skills-DDmTyywh.js → skills-Dq7fD8I3.js} +1 -1
- package/public/dist/assets/{slash-commands-D5y5AVvS.js → slash-commands-DRsKtuGT.js} +1 -1
- package/public/dist/assets/slash-commands-UbS8w9ij.js +1 -0
- package/public/dist/assets/stateDiagram-AJRCARHV-BvNABuXE.js +1 -0
- package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CCIo81qy.js +1 -0
- package/public/dist/assets/{timeline-definition-GMOUNBTQ-DUz1-iOx.js → timeline-definition-PNZ67QCA-CIvTvac3.js} +8 -8
- package/public/dist/assets/trace-drawer-DDFdU07_.js +15 -0
- package/public/dist/assets/treeView-BLDUP644-cXRzPGzz.js +1 -0
- package/public/dist/assets/treemap-LRROVOQU-BsZE5HPE.js +1 -0
- package/public/dist/assets/ui-CeBmBBZM.js +140 -0
- package/public/dist/assets/ui-TMXjvH0r.js +1 -0
- package/public/dist/assets/{vendor-render-DEStnpJ8.js → vendor-render-DCb9B75Q.js} +38 -37
- package/public/dist/assets/vendor-utils-BnxL60_-.js +1 -0
- package/public/dist/assets/vennDiagram-CIIHVFJN-C5cbS2KC.js +34 -0
- package/public/dist/assets/wardley-L42UT6IY-D_qm0cZD.js +1 -0
- package/public/dist/assets/{wardleyDiagram-NUSXRM2D-CLAhOzap.js → wardleyDiagram-YWT4CUSO-BsRBBGFP.js} +61 -3
- package/public/dist/assets/{wiki-link-suggestions-LQuYT22G.js → wiki-link-suggestions-BHwNQXT_.js} +2 -2
- package/public/dist/assets/{xychartDiagram-5P7HB3ND-DLnY9i8z.js → xychartDiagram-2RQKCTM6-B6rqui6F.js} +6 -6
- package/public/dist/index.html +102 -3
- package/public/dist/manager/index.html +2 -2
- package/public/index.html +101 -1
- package/public/js/constants.ts +72 -0
- package/public/js/diagram/iframe-renderer.ts +7 -0
- package/public/js/features/chat-scroll.ts +31 -0
- package/public/js/features/chat-search.ts +223 -0
- package/public/js/features/help-content.ts +20 -2
- package/public/js/features/help-dialog.ts +38 -2
- package/public/js/features/pending-queue.ts +6 -0
- package/public/js/features/process-block.ts +20 -0
- package/public/js/features/settings-channel.ts +3 -1
- package/public/js/features/settings-cli-status.ts +24 -3
- package/public/js/features/settings-core.ts +134 -21
- package/public/js/features/settings-types.ts +12 -1
- package/public/js/features/settings.ts +1 -1
- package/public/js/features/trace-drawer.ts +2 -1
- package/public/js/features/voice-recorder.ts +222 -42
- package/public/js/main.ts +58 -4
- package/public/js/provider-icons.ts +46 -27
- package/public/js/render/markdown.ts +6 -0
- package/public/js/ui.ts +33 -7
- package/public/js/ws.ts +5 -1
- package/public/locales/en.json +31 -7
- package/public/locales/ja.json +31 -7
- package/public/locales/ko.json +31 -7
- package/public/locales/zh.json +31 -7
- package/public/manager/src/App.tsx +19 -55
- package/public/manager/src/InstancePreview.tsx +46 -1
- package/public/manager/src/components/InstanceDetailPanel.tsx +7 -2
- package/public/manager/src/components/InstanceLogsPanel.tsx +138 -0
- package/public/manager/src/dashboard-settings/DashboardEmbeddingSection.tsx +37 -7
- package/public/manager/src/jaw-ceo/useJawCeoDashboardBridge.tsx +1 -0
- package/public/manager/src/manager-components.css +76 -0
- package/public/manager/src/preview.ts +26 -3
- package/public/manager/src/settings/fields/SelectField.tsx +51 -17
- package/public/manager/src/settings/pages/Agent.tsx +37 -2
- package/public/manager/src/settings/pages/Heartbeat.tsx +3 -2
- package/public/manager/src/settings/pages/Memory.tsx +3 -2
- package/public/manager/src/settings/pages/components/EmployeeRow.tsx +8 -4
- package/public/manager/src/settings/pages/components/PerCliRow.tsx +31 -5
- package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +4 -2
- package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +1 -1
- package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +23 -1
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +49 -0
- package/public/manager/src/settings/pages/components/employees-helpers.ts +6 -1
- package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +11 -1
- package/public/manager/src/settings-controls.css +25 -0
- package/public/manager/src/usePreviewShortcutMessages.ts +30 -0
- package/public/manager/src/usePreviewSttLifecycle.ts +31 -0
- package/scripts/fresh-install-smoke.ts +1 -1
- package/scripts/install-officecli.ps1 +33 -5
- package/scripts/install-officecli.sh +52 -8
- package/scripts/install-wsl.sh +96 -24
- package/scripts/install.sh +82 -11
- package/scripts/postinstall-guard.cjs +57 -30
- package/public/dist/assets/Agent-DNpehKB2.js +0 -1
- package/public/dist/assets/DashboardEmbeddingSection-BYdGgqg7.js +0 -2
- package/public/dist/assets/Employees-CuYuTy0R.js +0 -1
- package/public/dist/assets/Heartbeat-C-vq02MW.js +0 -1
- package/public/dist/assets/Memory-BPKWJDXK.js +0 -1
- package/public/dist/assets/ModelProvider-Bd6vGkXT.js +0 -1
- package/public/dist/assets/agent-meta-C1pQzExf.js +0 -1
- package/public/dist/assets/app-BxsIleo0.js +0 -32
- package/public/dist/assets/app-CB9n5A77.css +0 -1
- package/public/dist/assets/architecture-YZFGNWBL-BRI-0IaU.js +0 -1
- package/public/dist/assets/architectureDiagram-Q4EWVU46-z0JCgZrJ.js +0 -36
- package/public/dist/assets/blockDiagram-DXYQGD6D-KaOz3aFS.js +0 -132
- package/public/dist/assets/channel-jLopKIgm.js +0 -1
- package/public/dist/assets/chunk-2KRD3SAO-C8hJZPJu.js +0 -1
- package/public/dist/assets/chunk-426QAEUC-atJRhvKN.js +0 -1
- package/public/dist/assets/chunk-4TB4RGXK-BD7UhIN8.js +0 -206
- package/public/dist/assets/chunk-55IACEB6-CAWcPDdr.js +0 -1
- package/public/dist/assets/chunk-5FUZZQ4R-Cg1pzs6p.js +0 -62
- package/public/dist/assets/chunk-5PVQY5BW-otv3HwE_.js +0 -2
- package/public/dist/assets/chunk-67CJDMHE-AU2iOKLT.js +0 -1
- package/public/dist/assets/chunk-7N4EOEYR-BTIS4jBw.js +0 -1
- package/public/dist/assets/chunk-AA7GKIK3-c9UUJO_T.js +0 -1
- package/public/dist/assets/chunk-CIAEETIT-Dwbln6rM.js +0 -1
- package/public/dist/assets/chunk-ENJZ2VHE-PT_jAckw.js +0 -10
- package/public/dist/assets/chunk-FOC6F5B3-BqDmFFeg.js +0 -1
- package/public/dist/assets/chunk-ICPOFSXX-P6V6jqiT.js +0 -122
- package/public/dist/assets/chunk-K5T4RW27-C42sOmZR.js +0 -27
- package/public/dist/assets/chunk-KGLVRYIC-K-BVa8b2.js +0 -1
- package/public/dist/assets/chunk-ORNJ4GCN-CEXU6WaD.js +0 -1
- package/public/dist/assets/chunk-OYMX7WX6-DmJG2z1S.js +0 -231
- package/public/dist/assets/chunk-QZHKN3VN-BkVLii_3.js +0 -1
- package/public/dist/assets/chunk-U2HBQHQK-Ny6UwUgK.js +0 -11
- package/public/dist/assets/chunk-YZCP3GAM-c7FYtZME.js +0 -1
- package/public/dist/assets/classDiagram-6PBFFD2Q-BgOyAynm.js +0 -1
- package/public/dist/assets/classDiagram-v2-HSJHXN6E-5gBdoVH9.js +0 -1
- package/public/dist/assets/constants-4A2GptQT.js +0 -1
- package/public/dist/assets/cose-bilkent-S5V4N54A-CvH6qY_r.js +0 -1
- package/public/dist/assets/dagre--20B2-ZQ.js +0 -1
- package/public/dist/assets/dagre-KV5264BT-CQ0wo0ma.js +0 -4
- package/public/dist/assets/diagram-G4DWMVQ6-_aP6kMTh.js +0 -24
- package/public/dist/assets/diagram-MMDJMWI5-J1l6Q0JG.js +0 -43
- package/public/dist/assets/dist-B1p80u1b.js +0 -1
- package/public/dist/assets/dist-BKyzWv22.js +0 -1
- package/public/dist/assets/dist-CxJpXP6s.js +0 -1
- package/public/dist/assets/dist-DNLFuTrS.js +0 -1
- package/public/dist/assets/fields-BISouxp2.js +0 -1
- package/public/dist/assets/flowDiagram-DWJPFMVM-C_F0rqqT.js +0 -162
- package/public/dist/assets/ganttDiagram-T4ZO3ILL-B5S8EZRg.js +0 -292
- package/public/dist/assets/gitGraph-7Q5UKJZL-DTTW6pxr.js +0 -1
- package/public/dist/assets/gitGraphDiagram-UUTBAWPF-DMGzYJeb.js +0 -106
- package/public/dist/assets/graphlib-CZk_Ii16.js +0 -1
- package/public/dist/assets/info-OMHHGYJF-BU-iuaSm.js +0 -1
- package/public/dist/assets/infoDiagram-42DDH7IO-dzSaYFFK.js +0 -2
- package/public/dist/assets/javascript-BhB45e0W.js +0 -1
- package/public/dist/assets/katex-DamPUmTE.js +0 -1
- package/public/dist/assets/manager-B84u-pcn.js +0 -25
- package/public/dist/assets/manager-DMg_sTEP.css +0 -1
- package/public/dist/assets/memory-BV62wlsG.js +0 -1
- package/public/dist/assets/mermaid-loader-DxFGz4EE.js +0 -1
- package/public/dist/assets/mermaid-parser.core-CMIZ0my_.js +0 -3
- package/public/dist/assets/mermaid.core-CicVBD9l.js +0 -1
- package/public/dist/assets/mermaid.core-Dj6viEzN.js +0 -11
- package/public/dist/assets/packet-4T2RLAQJ-DzmBsAf0.js +0 -1
- package/public/dist/assets/pie-ZZUOXDRM-DyG1KzTn.js +0 -1
- package/public/dist/assets/pieDiagram-DEJITSTG-DJLiSymi.js +0 -30
- package/public/dist/assets/quadrantDiagram-34T5L4WZ-qcnWmcRr.js +0 -7
- package/public/dist/assets/radar-PYXPWWZC-CEBZARUu.js +0 -1
- package/public/dist/assets/rolldown-runtime-DE9SaGGd.js +0 -1
- package/public/dist/assets/sankeyDiagram-XADWPNL6-Bn3pUd_K.js +0 -10
- package/public/dist/assets/sequenceDiagram-FGHM5R23-DfxcHSdj.js +0 -157
- package/public/dist/assets/settings-CfAXLa8a.js +0 -1
- package/public/dist/assets/settings-FWgmcubl.js +0 -40
- package/public/dist/assets/skills-D-qUVJ-e.js +0 -1
- package/public/dist/assets/slash-commands-BfI19vIz.js +0 -1
- package/public/dist/assets/stateDiagram-FHFEXIEX-CiR7P2OG.js +0 -1
- package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-BaWWpysK.js +0 -1
- package/public/dist/assets/trace-drawer-DVF5F1df.js +0 -15
- package/public/dist/assets/treeView-SZITEDCU-D5-TP7Qp.js +0 -1
- package/public/dist/assets/treemap-W4RFUUIX-BQhm_ZSp.js +0 -1
- package/public/dist/assets/ui-BJXY16Dk.js +0 -140
- package/public/dist/assets/ui-BXm3OPPh.js +0 -1
- package/public/dist/assets/vendor-utils-IVTPs69f.js +0 -68
- package/public/dist/assets/vennDiagram-DHZGUBPP-CYu7SDdG.js +0 -34
- package/public/dist/assets/wardley-RL74JXVD-CpnBMRe0.js +0 -1
- package/public/manager/src/settings/pages/Embedding.tsx +0 -382
- /package/public/dist/assets/{apl-HYRstREL.js → apl-CieDeb7B.js} +0 -0
- /package/public/dist/assets/{asciiarmor-BDXCrhAK.js → asciiarmor-BRTyulZY.js} +0 -0
- /package/public/dist/assets/{asn1-CnSBhb0M.js → asn1-DoNAtQ5o.js} +0 -0
- /package/public/dist/assets/{asterisk-AqV7rnIi.js → asterisk-CR7oKPxi.js} +0 -0
- /package/public/dist/assets/{brainfuck-Dv46-iL9.js → brainfuck-abzPcrOz.js} +0 -0
- /package/public/dist/assets/{clike-GRffz5hY.js → clike-B71Zq38G.js} +0 -0
- /package/public/dist/assets/{clojure-DzgT_fqE.js → clojure-Zm0UzHPq.js} +0 -0
- /package/public/dist/assets/{cmake-Co1237r5.js → cmake-D3UNdg6L.js} +0 -0
- /package/public/dist/assets/{cobol-rUaLketb.js → cobol-4fYvwQR0.js} +0 -0
- /package/public/dist/assets/{coffeescript-DQyfHE86.js → coffeescript-Ct6bZdRU.js} +0 -0
- /package/public/dist/assets/{commonlisp-Buue1PGW.js → commonlisp-CrgXVPcd.js} +0 -0
- /package/public/dist/assets/{crystal-BMWO0kOJ.js → crystal-bGOl67VM.js} +0 -0
- /package/public/dist/assets/{css-DaxibPo5.js → css-B_EV3Xq2.js} +0 -0
- /package/public/dist/assets/{cypher-CmpGfiBR.js → cypher-DXDlHTYf.js} +0 -0
- /package/public/dist/assets/{cytoscape.esm-zT8GwLFm.js → cytoscape.esm-BK7ao2Ti.js} +0 -0
- /package/public/dist/assets/{d-qmdtoIzU.js → d-RL5ynsiz.js} +0 -0
- /package/public/dist/assets/{diff-B40m6u1h.js → diff-B5McBGjz.js} +0 -0
- /package/public/dist/assets/{dtd-569ynYVj.js → dtd-l3sK4p_C.js} +0 -0
- /package/public/dist/assets/{dylan-Dxolp30i.js → dylan-WjJGY-rW.js} +0 -0
- /package/public/dist/assets/{ebnf-BZiX9Iq3.js → ebnf-BGY79HOS.js} +0 -0
- /package/public/dist/assets/{ecl-B8F1Q0oZ.js → ecl-BKh7OE1d.js} +0 -0
- /package/public/dist/assets/{eiffel-Bv8Kvgh1.js → eiffel-Bzvlg3oK.js} +0 -0
- /package/public/dist/assets/{elm-QWXQaIis.js → elm-5_BqNmKu.js} +0 -0
- /package/public/dist/assets/{erlang-CuDGzTGm.js → erlang-BdVwz8I8.js} +0 -0
- /package/public/dist/assets/{fcl-BiFeqtHf.js → fcl-B9cnfODD.js} +0 -0
- /package/public/dist/assets/{forth-R7Uc2VcL.js → forth-wZbbnGzb.js} +0 -0
- /package/public/dist/assets/{fortran-kDRG6BzW.js → fortran-BAJZrRfU.js} +0 -0
- /package/public/dist/assets/{gas-CyRkuC5T.js → gas-D60ZhBat.js} +0 -0
- /package/public/dist/assets/{gherkin-BE0p00ey.js → gherkin-B8tKjAAi.js} +0 -0
- /package/public/dist/assets/{groovy-B_Sh3D1t.js → groovy-BAG9eJUD.js} +0 -0
- /package/public/dist/assets/{haskell-DWXgCy4o.js → haskell-Cj4TmWbg.js} +0 -0
- /package/public/dist/assets/{haxe-xGxZ54Hv.js → haxe-8chnvz-o.js} +0 -0
- /package/public/dist/assets/{http-CKv9cSBA.js → http-DDYeO71z.js} +0 -0
- /package/public/dist/assets/{idl-DmlI3XzS.js → idl-D1hY-Gp_.js} +0 -0
- /package/public/dist/assets/{javascript-j6r5uf_k.js → javascript-Sh0ZUMP2.js} +0 -0
- /package/public/dist/assets/{julia-CQSp9Qa0.js → julia-BibioBF2.js} +0 -0
- /package/public/dist/assets/{livescript-CqvtVTlb.js → livescript-CSZrB6F4.js} +0 -0
- /package/public/dist/assets/{lua-DazQKUZ0.js → lua-BvTlo5w3.js} +0 -0
- /package/public/dist/assets/{mathematica-DqhJVCs9.js → mathematica-Bexv8BWZ.js} +0 -0
- /package/public/dist/assets/{mbox-Dsyo1_UL.js → mbox-BAhbA8z2.js} +0 -0
- /package/public/dist/assets/{mirc-D7ThhoF-.js → mirc-BzT5Kh4S.js} +0 -0
- /package/public/dist/assets/{mllike-EPZ6pqQD.js → mllike-DeoJnUZQ.js} +0 -0
- /package/public/dist/assets/{modelica-PU45hbqg.js → modelica-FD_-Fxlc.js} +0 -0
- /package/public/dist/assets/{mscgen-DEnh2Ojr.js → mscgen-C-OyhbwB.js} +0 -0
- /package/public/dist/assets/{mumps-8GhR7rRa.js → mumps-BxkCDTK7.js} +0 -0
- /package/public/dist/assets/{nginx-CXwagpwp.js → nginx-2JaV__gC.js} +0 -0
- /package/public/dist/assets/{ntriples-BDQxxstw.js → ntriples--rhhCzqb.js} +0 -0
- /package/public/dist/assets/{octave-2c90WnyU.js → octave-rS4nMzRe.js} +0 -0
- /package/public/dist/assets/{oz-CO0rQ8EL.js → oz-I4fMb_NC.js} +0 -0
- /package/public/dist/assets/{pascal-CcVwOGeN.js → pascal-BEghJs8t.js} +0 -0
- /package/public/dist/assets/{path-utils-DySmCVZK.js → path-utils-r2bJIu28.js} +0 -0
- /package/public/dist/assets/{perl-B9UvGoAV.js → perl-BRO9ZFo9.js} +0 -0
- /package/public/dist/assets/{pig-Cd1f86ZJ.js → pig-L4Ii6KI0.js} +0 -0
- /package/public/dist/assets/{powershell-DV4cOnkJ.js → powershell-BBeqUCRp.js} +0 -0
- /package/public/dist/assets/{properties-DaSVPhrZ.js → properties-Boi0jF2J.js} +0 -0
- /package/public/dist/assets/{protobuf-CEtFnY22.js → protobuf-fB2aGypX.js} +0 -0
- /package/public/dist/assets/{puppet-Ca0DHfcW.js → puppet-BRmsErtO.js} +0 -0
- /package/public/dist/assets/{python-ydzCwWG-.js → python-Be4P9Dgp.js} +0 -0
- /package/public/dist/assets/{q-Cl8kzQmk.js → q-DZGhDLYt.js} +0 -0
- /package/public/dist/assets/{r-DKZPJFrD.js → r-B4NERjRM.js} +0 -0
- /package/public/dist/assets/{rough.esm-Dnk3WN4D.js → rough.esm-C0Gkx4O1.js} +0 -0
- /package/public/dist/assets/{rpm-D0lqeHoZ.js → rpm-e-QbHJ1q.js} +0 -0
- /package/public/dist/assets/{ruby-RVmtmNDw.js → ruby-BSVP_v59.js} +0 -0
- /package/public/dist/assets/{sas-CEzodAB7.js → sas-DHlU4v4g.js} +0 -0
- /package/public/dist/assets/{scheme-Pqmt6dh3.js → scheme-BGXbz5Hz.js} +0 -0
- /package/public/dist/assets/{settings-client-BN3XzwEo.js → settings-client-DPuJroyk.js} +0 -0
- /package/public/dist/assets/{shell-CLG3zy-u.js → shell-yonx6xY2.js} +0 -0
- /package/public/dist/assets/{sieve-C95IWC3O.js → sieve-ClPJUZyi.js} +0 -0
- /package/public/dist/assets/{simple-mode-B9ErAHMD.js → simple-mode-CjViblDK.js} +0 -0
- /package/public/dist/assets/{smalltalk-4cL-gRJb.js → smalltalk-CHXubeqS.js} +0 -0
- /package/public/dist/assets/{solr-CEA7oOx_.js → solr-C6q6YwPz.js} +0 -0
- /package/public/dist/assets/{sparql-w8kHjP6I.js → sparql-CcspZvEd.js} +0 -0
- /package/public/dist/assets/{spreadsheet-C8bDfTgC.js → spreadsheet-DH3a4LBS.js} +0 -0
- /package/public/dist/assets/{sql-BrKz8968.js → sql-meoY6gNi.js} +0 -0
- /package/public/dist/assets/{stex-xFw1nXeT.js → stex-D2bn6Zsh.js} +0 -0
- /package/public/dist/assets/{stylus-gS_68vPk.js → stylus-DbXGih0S.js} +0 -0
- /package/public/dist/assets/{swift-D5lXmY2d.js → swift-Ch391uOd.js} +0 -0
- /package/public/dist/assets/{tcl-D-41REtC.js → tcl-CQBgGWDP.js} +0 -0
- /package/public/dist/assets/{textile-D-Znao0j.js → textile-4i3oG3tg.js} +0 -0
- /package/public/dist/assets/{tiddlywiki-Co8lXJKd.js → tiddlywiki-CXG1-CcK.js} +0 -0
- /package/public/dist/assets/{tiki-DsiNRYMP.js → tiki-DJqKUhA-.js} +0 -0
- /package/public/dist/assets/{toml-CaVZGou4.js → toml-C1FnyICQ.js} +0 -0
- /package/public/dist/assets/{troff-DJvDVr-d.js → troff-Cp8NvRO0.js} +0 -0
- /package/public/dist/assets/{ttcn-DAC92l4d.js → ttcn-NlmW_fji.js} +0 -0
- /package/public/dist/assets/{ttcn-cfg-C0X-mYlr.js → ttcn-cfg-BVuxfGZf.js} +0 -0
- /package/public/dist/assets/{turtle-D6WHyCrL.js → turtle-Ba9ERlnm.js} +0 -0
- /package/public/dist/assets/{vb-CEo_ccq3.js → vb-DDs4gjJb.js} +0 -0
- /package/public/dist/assets/{vbscript-B_PKDV1v.js → vbscript-gOFmdMJN.js} +0 -0
- /package/public/dist/assets/{velocity-ClKnKBLH.js → velocity-DtSNZA7i.js} +0 -0
- /package/public/dist/assets/{verilog-Pnuspgw6.js → verilog-Pldmtxe7.js} +0 -0
- /package/public/dist/assets/{vhdl-CZnyY4fs.js → vhdl-BFfSgWGp.js} +0 -0
- /package/public/dist/assets/{w3c-keyname-DJlC6DTY.js → w3c-keyname-BggQEPNo.js} +0 -0
- /package/public/dist/assets/{webidl-DHr762Dm.js → webidl-B6ZFYE2L.js} +0 -0
- /package/public/dist/assets/{xquery-5-FiyUtN.js → xquery-DhxUT98N.js} +0 -0
- /package/public/dist/assets/{yacas-GlqsXIeT.js → yacas-jSkQeF1Q.js} +0 -0
- /package/public/dist/assets/{z80-CI7N40Oo.js → z80-D7Lt6v61.js} +0 -0
package/dist/bin/postinstall.js
CHANGED
|
@@ -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 {
|
|
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 =
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
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:
|
|
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.
|
|
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'
|
|
246
|
-
{ bin: 'copilot', pkg: '@github/copilot'
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
374
|
-
function deduplicateCliTool(bin, pkg, brew) {
|
|
375
|
-
const
|
|
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
|
-
|
|
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: ${
|
|
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
|
|
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
|
|
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
|
-
|
|
416
|
-
|
|
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
|
-
|
|
802
|
+
runInstallCmd('npm', pkg, postinstallExecEnv(), brew);
|
|
423
803
|
console.log(`[jaw:init] ✅ ${bin} installed`);
|
|
424
804
|
}
|
|
425
805
|
catch {
|
|
426
|
-
|
|
427
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
?
|
|
502
|
-
: '
|
|
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(
|
|
508
|
-
install: 'npm
|
|
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
|
-
|
|
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
|
-
|
|
927
|
+
runSkillDepInstall(dep.install, postinstallExecEnv());
|
|
534
928
|
console.log(`[jaw:init] ✅ ${dep.name} installed`);
|
|
535
929
|
}
|
|
536
|
-
catch
|
|
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
|
|
601
|
-
|
|
602
|
-
|
|
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.
|
|
618
|
-
//
|
|
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
|
-
|
|
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();
|