cli-jaw 2.0.6 → 2.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +24 -11
- package/README.ko.md +24 -11
- package/README.md +95 -11
- package/README.zh-CN.md +24 -11
- package/dist/bin/cli-jaw.js +4 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/browser-web-ai.js +2 -2
- package/dist/bin/commands/browser-web-ai.js.map +1 -1
- package/dist/bin/commands/doctor.js +12 -2
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/init.js +4 -2
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/commands/project.js +167 -0
- package/dist/bin/commands/project.js.map +1 -0
- package/dist/bin/commands/tui/types.js +20 -4
- package/dist/bin/commands/tui/types.js.map +1 -1
- package/dist/bin/postinstall.js +226 -24
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/lib/mime-detect.js +5 -0
- package/dist/lib/mime-detect.js.map +1 -1
- package/dist/scripts/fresh-install-smoke.js +78 -6
- package/dist/scripts/fresh-install-smoke.js.map +1 -1
- package/dist/src/agent/agy-runtime.js +15 -0
- package/dist/src/agent/agy-runtime.js.map +1 -0
- package/dist/src/agent/args.js +44 -5
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/cli-helpers.js +1 -1
- package/dist/src/agent/cli-helpers.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +6 -3
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/session-persistence.js +1 -1
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/smoke-detector.js +3 -0
- package/dist/src/agent/smoke-detector.js.map +1 -1
- package/dist/src/agent/spawn/resume.js +2 -0
- package/dist/src/agent/spawn/resume.js.map +1 -1
- package/dist/src/agent/spawn-env.js +6 -0
- package/dist/src/agent/spawn-env.js.map +1 -1
- package/dist/src/agent/spawn.js +120 -15
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/browser/web-ai/capability-observation-presets.js +1 -1
- package/dist/src/browser/web-ai/capability-observation-presets.js.map +1 -1
- package/dist/src/browser/web-ai/capability-registry.js +6 -5
- package/dist/src/browser/web-ai/capability-registry.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-attachments.js +7 -0
- package/dist/src/browser/web-ai/chatgpt-attachments.js.map +1 -1
- package/dist/src/browser/web-ai/context-pack/builder.js +19 -4
- package/dist/src/browser/web-ai/context-pack/builder.js.map +1 -1
- package/dist/src/browser/web-ai/context-pack/zip-writer.js +116 -0
- package/dist/src/browser/web-ai/context-pack/zip-writer.js.map +1 -0
- package/dist/src/browser/web-ai/gemini-live.js +21 -3
- package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
- package/dist/src/browser/web-ai/gemini-model.js +26 -8
- package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
- package/dist/src/cli/commands.js +2 -0
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/handlers-project.js +55 -0
- package/dist/src/cli/handlers-project.js.map +1 -0
- package/dist/src/cli/readiness.js +6 -1
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry.js +11 -0
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/core/claude-install.js +10 -1
- package/dist/src/core/claude-install.js.map +1 -1
- package/dist/src/core/config.js +63 -7
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +11 -4
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/runtime-settings.js +4 -1
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/manager/metadata.js +7 -2
- package/dist/src/manager/metadata.js.map +1 -1
- package/dist/src/manager/notes/routes.js +7 -0
- package/dist/src/manager/notes/routes.js.map +1 -1
- package/dist/src/manager/notes/store.js +72 -0
- package/dist/src/manager/notes/store.js.map +1 -1
- package/dist/src/manager/registry.js +1 -1
- package/dist/src/manager/registry.js.map +1 -1
- package/dist/src/manager/scan.js +2 -0
- package/dist/src/manager/scan.js.map +1 -1
- package/dist/src/messaging/send.js +1 -1
- package/dist/src/messaging/send.js.map +1 -1
- package/dist/src/orchestrator/distribute.js +25 -4
- package/dist/src/orchestrator/distribute.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +21 -5
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/state-machine.js +7 -1
- package/dist/src/orchestrator/state-machine.js.map +1 -1
- package/dist/src/orchestrator/workspace-context.js +49 -14
- package/dist/src/orchestrator/workspace-context.js.map +1 -1
- package/dist/src/routes/messaging.js +1 -1
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +11 -4
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/settings.js +73 -8
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/security/path-guards.js +35 -14
- package/dist/src/security/path-guards.js.map +1 -1
- package/dist/src/types/cli-engine.js +1 -0
- package/dist/src/types/cli-engine.js.map +1 -1
- package/package.json +19 -4
- package/public/css/chat.css +6 -2
- package/public/dist/assets/{AdvancedExport-CBvz4_IZ.js → AdvancedExport-CZEVPqHb.js} +1 -1
- package/public/dist/assets/{Agent-DlUqCMXJ.js → Agent-BBrJGd5m.js} +1 -1
- package/public/dist/assets/{Browser-66BpLQck.js → Browser-dBaU9G9D.js} +1 -1
- package/public/dist/assets/{ChannelsDiscord-BifT2Dum.js → ChannelsDiscord-CbmWms9-.js} +1 -1
- package/public/dist/assets/{ChannelsTelegram-CK6tYQ8k.js → ChannelsTelegram-BD4Eyztg.js} +1 -1
- package/public/dist/assets/{DashboardMeta-Cc03HT5R.js → DashboardMeta-LVAL7TtE.js} +1 -1
- package/public/dist/assets/{Display-arOjcMQZ.js → Display-CFm1UmEo.js} +1 -1
- package/public/dist/assets/{Employees-YbW-mI67.js → Employees-DcMChleU.js} +1 -1
- package/public/dist/assets/{Heartbeat-CW4eIhtJ.js → Heartbeat-BoobN35p.js} +1 -1
- package/public/dist/assets/{Mcp-ZQ6ARQb6.js → Mcp-9NU4YkKO.js} +1 -1
- package/public/dist/assets/{Memory-BAUWJMqc.js → Memory-uZT30fww.js} +1 -1
- package/public/dist/assets/{MilkdownWysiwygEditor-IAqFtXvM.js → MilkdownWysiwygEditor-Otw40DDF.js} +1 -1
- package/public/dist/assets/{ModelProvider-DUtmFh0J.js → ModelProvider-CsIOyoZP.js} +1 -1
- package/public/dist/assets/{Network-B_4E82zQ.js → Network-D7hGwnyG.js} +1 -1
- package/public/dist/assets/NotesGraphView-CJuk9lKn.js +1 -0
- package/public/dist/assets/Permissions-CcIBptg3.js +1 -0
- package/public/dist/assets/{Permissions-BkADXjQ4.js → Permissions-DwdU3wi8.js} +1 -1
- package/public/dist/assets/{Profile-BcnTCSYM.js → Profile-BNTKD_Ex.js} +1 -1
- package/public/dist/assets/{Prompts-CUs_RoRE.js → Prompts-D_mCfYiu.js} +1 -1
- package/public/dist/assets/{SpeechKeys-qxc-ROWN.js → SpeechKeys-BTXCM-Fs.js} +1 -1
- package/public/dist/assets/agent-meta-BC7mLqo6.js +1 -0
- package/public/dist/assets/{app-CGqTcIeF.js → app-C7MAcAMu.js} +5 -5
- package/public/dist/assets/app-CkFBKUf8.css +1 -0
- package/public/dist/assets/{architectureDiagram-3BPJPVTR-kYIVzmWe.js → architectureDiagram-3BPJPVTR-CJCPEsxo.js} +1 -1
- package/public/dist/assets/{blockDiagram-GPEHLZMM-B204CPhe.js → blockDiagram-GPEHLZMM-CO1bkn0E.js} +2 -2
- package/public/dist/assets/{c4Diagram-AAUBKEIU-DAv6TAjg.js → c4Diagram-AAUBKEIU-D2R36Xu6.js} +1 -1
- package/public/dist/assets/{chunk-3OPIFGDE-DOAvk9x8.js → chunk-3OPIFGDE-DixnEkZw.js} +1 -1
- package/public/dist/assets/chunk-55IACEB6-DhWWzzdj.js +1 -0
- package/public/dist/assets/{chunk-5ZQYHXKU-Bd-RFO5i.js → chunk-5ZQYHXKU-Bli4k6GI.js} +2 -2
- package/public/dist/assets/{chunk-727SXJPM-BrsRzj8z.js → chunk-727SXJPM-sp4W8bhf.js} +1 -1
- package/public/dist/assets/{chunk-AQP2D5EJ-Di6Gstk-.js → chunk-AQP2D5EJ-Co6ucdGq.js} +1 -1
- package/public/dist/assets/{chunk-KSCS5N6A-D9a4ZkOy.js → chunk-KSCS5N6A-Beq1s5eO.js} +2 -2
- package/public/dist/assets/{chunk-L5ZTLDWV-D208QbfC.js → chunk-L5ZTLDWV-DfUlBdXN.js} +1 -1
- package/public/dist/assets/{chunk-LZXEDZCA-CE2KFduj.js → chunk-LZXEDZCA-B_yP4UKw.js} +1 -1
- package/public/dist/assets/{chunk-ND2GUHAM-zZ7h1CPf.js → chunk-ND2GUHAM-3qbNb7I9.js} +1 -1
- package/public/dist/assets/{chunk-O5CBEL6O-BTuvXKFi.js → chunk-O5CBEL6O-D-jDqsN2.js} +1 -1
- package/public/dist/assets/{chunk-WU5MYG2G-C3fKlSvP.js → chunk-WU5MYG2G-DlBJtD7-.js} +1 -1
- package/public/dist/assets/classDiagram-4FO5ZUOK-DmPJvqRM.js +1 -0
- package/public/dist/assets/classDiagram-v2-Q7XG4LA2-ECmTUt7U.js +1 -0
- package/public/dist/assets/constants-BXWl7LTi.js +1 -0
- package/public/dist/assets/{cose-bilkent-S5V4N54A-D1zmarou.js → cose-bilkent-S5V4N54A-Bt9AAJCx.js} +1 -1
- package/public/dist/assets/{dagre-BM42HDAG-BVkBttzA.js → dagre-BM42HDAG-CXEA1wvZ.js} +1 -1
- package/public/dist/assets/{dagre-DnoxfNXr.js → dagre-Ve-IAfyz.js} +1 -1
- package/public/dist/assets/{diagram-2AECGRRQ-Bs32KPnT.js → diagram-2AECGRRQ-CCB0OKc2.js} +1 -1
- package/public/dist/assets/{diagram-5GNKFQAL-YDYgPOQj.js → diagram-5GNKFQAL-Cki9HABy.js} +1 -1
- package/public/dist/assets/{diagram-KO2AKTUF-1tIdFl26.js → diagram-KO2AKTUF-DNBDjE2o.js} +1 -1
- package/public/dist/assets/{diagram-LMA3HP47-B1y15kav.js → diagram-LMA3HP47-Cy23RDPa.js} +1 -1
- package/public/dist/assets/{diagram-OG6HWLK6-C25j1jGg.js → diagram-OG6HWLK6-CT_YF8cA.js} +1 -1
- package/public/dist/assets/dist-3R3GxjCf.js +13 -0
- package/public/dist/assets/{dist-D0PYXGt2.js → dist-BLd7xdyq.js} +1 -1
- package/public/dist/assets/{dist-fJAyK82z.js → dist-BaRrwDy3.js} +1 -1
- package/public/dist/assets/{dist-Rs_Khtjb.js → dist-Bbsp4OF7.js} +1 -1
- package/public/dist/assets/{dist-Cv8S3FhF.js → dist-BkBGlG70.js} +1 -1
- package/public/dist/assets/{dist-0v1UKkQ3.js → dist-BkJ_1mj9.js} +1 -1
- package/public/dist/assets/{dist-BQNQk-1M.js → dist-BxCRVW5D.js} +1 -1
- package/public/dist/assets/{dist-DDDFJ8jG.js → dist-C-v7Rm67.js} +1 -1
- package/public/dist/assets/dist-CNgDEAy8.js +1 -0
- package/public/dist/assets/dist-CO_W5rr2.js +1 -0
- package/public/dist/assets/{dist-vQskrHxt.js → dist-ChAUfTbO.js} +1 -1
- package/public/dist/assets/{dist-CjPin7Mr.js → dist-D-k-lzQT.js} +1 -1
- package/public/dist/assets/dist-D1hPukqY.js +1 -0
- package/public/dist/assets/{dist-C1VqWrYZ.js → dist-D5Qx-jQQ.js} +1 -1
- package/public/dist/assets/{dist-DTQW91xt.js → dist-D7VNzYBv.js} +1 -1
- package/public/dist/assets/{dist-DHQI31dn.js → dist-DAxnodoa.js} +1 -1
- package/public/dist/assets/{dist-CnIrGAPx.js → dist-DHSyODkR.js} +1 -1
- package/public/dist/assets/{dist-CE4s7vg82.js → dist-DaYTPjbb2.js} +1 -1
- package/public/dist/assets/{dist-jcptfm_T.js → dist-DlWi9tVO.js} +1 -1
- package/public/dist/assets/{dist-D66X8iAn.js → dist-DuuoJfRB.js} +1 -1
- package/public/dist/assets/{dist-DzT7frM2.js → dist-Dv36UUXz.js} +1 -1
- package/public/dist/assets/{dist-BVpa_e6W.js → dist-F4CVhitP.js} +1 -1
- package/public/dist/assets/{dist-Qs7HHNCC.js → dist-LHbJYy3N.js} +1 -1
- package/public/dist/assets/{dist-Ck6PnIlo.js → dist-VIlx7JdU.js} +1 -1
- package/public/dist/assets/{dist-D5GUqT-6.js → dist-cgDt2PmY.js} +1 -1
- package/public/dist/assets/dist-eW2LjRIK.js +1 -0
- package/public/dist/assets/{dist-Dm7RAaUo.js → dist-vGn3_sWA.js} +1 -1
- package/public/dist/assets/{employees-DRmX2RDd.js → employees-BmxY8Mw3.js} +1 -1
- package/public/dist/assets/{erDiagram-TEJ5UH35-CRvCbztR.js → erDiagram-TEJ5UH35-Cq7oHdXg.js} +1 -1
- package/public/dist/assets/{flowDiagram-I6XJVG4X-CzvVnib_.js → flowDiagram-I6XJVG4X-D8CdEnfM.js} +1 -1
- package/public/dist/assets/ganttDiagram-6RSMTGT7-B1rzKXi_.js +292 -0
- package/public/dist/assets/{gitGraphDiagram-PVQCEYII-CbKdM7nW.js → gitGraphDiagram-PVQCEYII-CqLh-joi.js} +1 -1
- package/public/dist/assets/{graphlib-BLOO0H5r.js → graphlib-W5bESv3F.js} +1 -1
- package/public/dist/assets/{infoDiagram-5YYISTIA-BrZmg1At.js → infoDiagram-5YYISTIA-C1zVxumj.js} +1 -1
- package/public/dist/assets/{ishikawaDiagram-YF4QCWOH-BDWXqJi5.js → ishikawaDiagram-YF4QCWOH-x-9J6xPM.js} +1 -1
- package/public/dist/assets/{journeyDiagram-JHISSGLW-CPFRd_M3.js → journeyDiagram-JHISSGLW-BDYzHrtn.js} +1 -1
- package/public/dist/assets/{kanban-definition-UN3LZRKU-BcQbBplS.js → kanban-definition-UN3LZRKU-BJ-06i6Z.js} +1 -1
- package/public/dist/assets/manager-B2NWzG7j.css +1 -0
- package/public/dist/assets/manager-C5e1IxEN.js +25 -0
- package/public/dist/assets/memory-BqqibBIE.js +1 -0
- package/public/dist/assets/{memory-BA-ki3gn.js → memory-CRL72HB-.js} +1 -1
- package/public/dist/assets/mermaid-loader-Dqb4ZUz6.js +1 -0
- package/public/dist/assets/{mermaid.core-ArqR5iFa.js → mermaid.core-D8VnfThU.js} +2 -2
- package/public/dist/assets/mermaid.core-DYHvk6Pd.js +1 -0
- package/public/dist/assets/{mindmap-definition-RKZ34NQL-C35cGkNU.js → mindmap-definition-RKZ34NQL-D8NDuIhn.js} +1 -1
- package/public/dist/assets/{pieDiagram-4H26LBE5-B8C_hoqJ.js → pieDiagram-4H26LBE5-CpBePil_.js} +3 -3
- package/public/dist/assets/{quadrantDiagram-W4KKPZXB-BEPrine5.js → quadrantDiagram-W4KKPZXB-C1WWpn88.js} +1 -1
- package/public/dist/assets/{render-C7_e0J_X.js → render-o_YEiCEO.js} +2 -2
- package/public/dist/assets/{requirementDiagram-4Y6WPE33-ClDDon9c.js → requirementDiagram-4Y6WPE33-C_D5VbNk.js} +1 -1
- package/public/dist/assets/{sankeyDiagram-5OEKKPKP-Bjs3OE-1.js → sankeyDiagram-5OEKKPKP--RH3Es8R.js} +3 -3
- package/public/dist/assets/{sequenceDiagram-3UESZ5HK-BM8IAaEe.js → sequenceDiagram-3UESZ5HK-CVI4AjhN.js} +1 -1
- package/public/dist/assets/settings-B0RlyAkI.js +1 -0
- package/public/dist/assets/settings-CCXRL5Ar.js +46 -0
- package/public/dist/assets/sidebar-DRJffqO1.js +14 -0
- package/public/dist/assets/skills-CFdzXbtK.js +1 -0
- package/public/dist/assets/{skills-Dq7fD8I3.js → skills-DbRVI-zf.js} +1 -1
- package/public/dist/assets/slash-commands-BUM6u-Ex.js +1 -0
- package/public/dist/assets/{slash-commands-DRsKtuGT.js → slash-commands-C2YBMaQV.js} +1 -1
- package/public/dist/assets/{stateDiagram-AJRCARHV-BvNABuXE.js → stateDiagram-AJRCARHV-4bx1rPZ3.js} +1 -1
- package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CrfGPzHb.js +1 -0
- package/public/dist/assets/{timeline-definition-PNZ67QCA-CIvTvac3.js → timeline-definition-PNZ67QCA-DeQoGRE2.js} +1 -1
- package/public/dist/assets/{trace-drawer-DDFdU07_.js → trace-drawer-CIVBXyRH.js} +1 -1
- package/public/dist/assets/ui-C3ArwMhv.js +140 -0
- package/public/dist/assets/ui-CboUuc_E.js +1 -0
- package/public/dist/assets/vendor-utils-rVejrfMR.js +1 -0
- package/public/dist/assets/{vennDiagram-CIIHVFJN-C5cbS2KC.js → vennDiagram-CIIHVFJN-CejyJK0L.js} +1 -1
- package/public/dist/assets/{wardleyDiagram-YWT4CUSO-BsRBBGFP.js → wardleyDiagram-YWT4CUSO-DqXV0sa1.js} +1 -1
- package/public/dist/assets/wiki-link-suggestions-e5BzJAZH.js +23 -0
- package/public/dist/assets/{xychartDiagram-2RQKCTM6-B6rqui6F.js → xychartDiagram-2RQKCTM6-CWLoVl2b.js} +2 -2
- package/public/dist/index.html +20 -2
- package/public/dist/manager/index.html +2 -2
- package/public/index.html +18 -0
- package/public/js/constants.ts +12 -1
- package/public/js/features/settings-cli-status.ts +27 -4
- package/public/js/features/settings-core.ts +28 -15
- package/public/js/features/settings-types.ts +1 -0
- package/public/js/features/ui-status.ts +3 -0
- package/public/js/ws.ts +5 -1
- package/public/manager/src/SidebarRailRouter.tsx +5 -2
- package/public/manager/src/api.ts +13 -0
- package/public/manager/src/components/WorkbenchHeader.tsx +10 -0
- package/public/manager/src/manager-notes.css +228 -0
- package/public/manager/src/notes/NotesBacklinksPanel.tsx +91 -0
- package/public/manager/src/notes/NotesCommandPalette.tsx +212 -0
- package/public/manager/src/notes/NotesGraphView.tsx +145 -0
- package/public/manager/src/notes/NotesSidebar.tsx +183 -5
- package/public/manager/src/notes/NotesToolbar.tsx +9 -3
- package/public/manager/src/notes/NotesWorkspace.tsx +140 -4
- package/public/manager/src/notes/notes-api.ts +2 -0
- package/public/manager/src/notes/notes-command-registry.tsx +79 -0
- package/public/manager/src/notes/notes-quick-switcher.css +151 -0
- package/public/manager/src/notes/notes-shortcuts.ts +23 -0
- package/public/manager/src/notes/notes-types.ts +1 -1
- package/public/manager/src/notes/template-engine.ts +27 -0
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +7 -1
- package/public/manager/src/types.ts +2 -1
- package/scripts/audit-fresh-install-evidence.mjs +278 -0
- package/scripts/collect-fresh-install-evidence.sh +459 -0
- package/scripts/fresh-install-smoke.ts +85 -6
- package/scripts/install-officecli.ps1 +14 -1
- package/scripts/install-risk-gate.mjs +161 -0
- package/scripts/install-wsl.sh +78 -16
- package/scripts/install.sh +272 -72
- package/scripts/postinstall-guard.cjs +2 -2
- package/scripts/release-preview.sh +25 -3
- package/scripts/release.sh +37 -8
- package/scripts/require-release-evidence.mjs +236 -0
- package/scripts/verify-fresh-install.sh +120 -0
- package/scripts/verify-release-evidence.mjs +158 -0
- package/public/dist/assets/Permissions-DvUCB8wA.js +0 -1
- package/public/dist/assets/agent-meta-Du8y6mSM.js +0 -1
- package/public/dist/assets/app-Dpk6cE6C.css +0 -1
- package/public/dist/assets/chunk-55IACEB6-Dx2JkQLw.js +0 -1
- package/public/dist/assets/classDiagram-4FO5ZUOK-Cb-qL5u3.js +0 -1
- package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BPhGdj15.js +0 -1
- package/public/dist/assets/constants-BxG09J6S.js +0 -1
- package/public/dist/assets/dist-BMi_buEb.js +0 -1
- package/public/dist/assets/dist-BkrbW_LS.js +0 -1
- package/public/dist/assets/dist-C3vh7d65.js +0 -13
- package/public/dist/assets/dist-D815C1Fv.js +0 -1
- package/public/dist/assets/dist-sOV2kBhQ.js +0 -1
- package/public/dist/assets/ganttDiagram-6RSMTGT7-BbUYP6iv.js +0 -292
- package/public/dist/assets/manager-B5OmizBL.css +0 -1
- package/public/dist/assets/manager-Cs3eMBcx.js +0 -25
- package/public/dist/assets/memory-DLQbyBA3.js +0 -1
- package/public/dist/assets/mermaid-loader-BVPsKrpr.js +0 -1
- package/public/dist/assets/mermaid.core-BAwu4U2Y.js +0 -1
- package/public/dist/assets/settings-DjyKdqev.js +0 -1
- package/public/dist/assets/settings-pUJzyeX2.js +0 -42
- package/public/dist/assets/sidebar-CO9Qjj6v.js +0 -14
- package/public/dist/assets/skills-CX3qJ77s.js +0 -1
- package/public/dist/assets/slash-commands-UbS8w9ij.js +0 -1
- package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CCIo81qy.js +0 -1
- package/public/dist/assets/ui-CeBmBBZM.js +0 -140
- package/public/dist/assets/ui-TMXjvH0r.js +0 -1
- package/public/dist/assets/vendor-utils-BnxL60_-.js +0 -1
- package/public/dist/assets/wiki-link-suggestions-BHwNQXT_.js +0 -23
- /package/public/dist/assets/{HealthBadge-DEPFkcA0.js → HealthBadge-CfLTPTPW.js} +0 -0
- /package/public/dist/assets/{InlineWarn-DoJS7AgM.js → InlineWarn-C7ISyzDI.js} +0 -0
- /package/public/dist/assets/{fields-DUawAHWZ.js → fields-BwD_NGxe.js} +0 -0
- /package/public/dist/assets/{locale-BHMJIzyw.js → locale-DT1WRaeJ.js} +0 -0
- /package/public/dist/assets/{page-shell-CVAobxbP.js → page-shell-uNOxwdbr.js} +0 -0
- /package/public/dist/assets/{path-utils-r2bJIu28.js → path-utils-h2GAj3hH.js} +0 -0
- /package/public/dist/assets/{provider-icons-dxT69zGg.js → provider-icons-ClVd2suJ.js} +0 -0
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Collect fresh-machine install evidence for supported CLI-JAW targets.
|
|
3
|
+
set -uo pipefail
|
|
4
|
+
|
|
5
|
+
TARGET="auto"
|
|
6
|
+
SKIP_INSTALL=0
|
|
7
|
+
SKIP_DOCTOR=0
|
|
8
|
+
OUT_DIR=""
|
|
9
|
+
INSTALL_SCRIPT="${CLI_JAW_INSTALL_SCRIPT:-}"
|
|
10
|
+
VERIFIER_SCRIPT="${CLI_JAW_VERIFIER_SCRIPT:-}"
|
|
11
|
+
INSTALL_REF="${CLI_JAW_INSTALL_REF:-master}"
|
|
12
|
+
RAW_BASE="${CLI_JAW_RAW_BASE:-https://raw.githubusercontent.com/lidge-jun/cli-jaw/${INSTALL_REF}}"
|
|
13
|
+
FAILURES=0
|
|
14
|
+
|
|
15
|
+
usage() {
|
|
16
|
+
cat <<'USAGE'
|
|
17
|
+
Usage: collect-fresh-install-evidence.sh [options]
|
|
18
|
+
|
|
19
|
+
Options:
|
|
20
|
+
--target macos|wsl|linux|auto Target to verify. Default: auto.
|
|
21
|
+
--skip-install Do not run the one-click installer; only collect and verify.
|
|
22
|
+
--skip-doctor Pass --skip-doctor to verify-fresh-install.sh.
|
|
23
|
+
--out-dir DIR Evidence output directory.
|
|
24
|
+
--install-script FILE Local installer path override for the selected target.
|
|
25
|
+
--verifier-script FILE Local verifier path override.
|
|
26
|
+
--install-ref REF Git ref for raw.githubusercontent.com installer fetches.
|
|
27
|
+
--raw-base URL Override raw script base URL.
|
|
28
|
+
-h, --help Show this help.
|
|
29
|
+
|
|
30
|
+
Environment:
|
|
31
|
+
CLI_JAW_INSTALL_SCRIPT Default local installer path when --install-script is omitted.
|
|
32
|
+
CLI_JAW_VERIFIER_SCRIPT Default local verifier path when --verifier-script is omitted.
|
|
33
|
+
CLI_JAW_INSTALL_REF Default git ref when --install-ref is omitted.
|
|
34
|
+
CLI_JAW_RAW_BASE Default raw base URL when --raw-base is omitted.
|
|
35
|
+
CLI_JAW_EVIDENCE_DIR Default output directory when --out-dir is omitted.
|
|
36
|
+
USAGE
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
while [ "$#" -gt 0 ]; do
|
|
40
|
+
case "$1" in
|
|
41
|
+
--target)
|
|
42
|
+
[ "$#" -ge 2 ] || { echo "Missing value for --target" >&2; exit 2; }
|
|
43
|
+
TARGET="$2"
|
|
44
|
+
shift 2
|
|
45
|
+
;;
|
|
46
|
+
--skip-install)
|
|
47
|
+
SKIP_INSTALL=1
|
|
48
|
+
shift
|
|
49
|
+
;;
|
|
50
|
+
--skip-doctor)
|
|
51
|
+
SKIP_DOCTOR=1
|
|
52
|
+
shift
|
|
53
|
+
;;
|
|
54
|
+
--out-dir)
|
|
55
|
+
[ "$#" -ge 2 ] || { echo "Missing value for --out-dir" >&2; exit 2; }
|
|
56
|
+
OUT_DIR="$2"
|
|
57
|
+
shift 2
|
|
58
|
+
;;
|
|
59
|
+
--install-script)
|
|
60
|
+
[ "$#" -ge 2 ] || { echo "Missing value for --install-script" >&2; exit 2; }
|
|
61
|
+
INSTALL_SCRIPT="$2"
|
|
62
|
+
shift 2
|
|
63
|
+
;;
|
|
64
|
+
--verifier-script)
|
|
65
|
+
[ "$#" -ge 2 ] || { echo "Missing value for --verifier-script" >&2; exit 2; }
|
|
66
|
+
VERIFIER_SCRIPT="$2"
|
|
67
|
+
shift 2
|
|
68
|
+
;;
|
|
69
|
+
--install-ref)
|
|
70
|
+
[ "$#" -ge 2 ] || { echo "Missing value for --install-ref" >&2; exit 2; }
|
|
71
|
+
INSTALL_REF="$2"
|
|
72
|
+
RAW_BASE="https://raw.githubusercontent.com/lidge-jun/cli-jaw/${INSTALL_REF}"
|
|
73
|
+
shift 2
|
|
74
|
+
;;
|
|
75
|
+
--raw-base)
|
|
76
|
+
[ "$#" -ge 2 ] || { echo "Missing value for --raw-base" >&2; exit 2; }
|
|
77
|
+
RAW_BASE="${2%/}"
|
|
78
|
+
shift 2
|
|
79
|
+
;;
|
|
80
|
+
-h|--help)
|
|
81
|
+
usage
|
|
82
|
+
exit 0
|
|
83
|
+
;;
|
|
84
|
+
*)
|
|
85
|
+
echo "Unknown option: $1" >&2
|
|
86
|
+
usage >&2
|
|
87
|
+
exit 2
|
|
88
|
+
;;
|
|
89
|
+
esac
|
|
90
|
+
done
|
|
91
|
+
|
|
92
|
+
now_utc() {
|
|
93
|
+
date -u +"%Y-%m-%dT%H:%M:%SZ"
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
detect_target() {
|
|
97
|
+
local kernel
|
|
98
|
+
kernel="$(uname -s 2>/dev/null || true)"
|
|
99
|
+
case "$kernel" in
|
|
100
|
+
Darwin) echo "macos" ;;
|
|
101
|
+
Linux)
|
|
102
|
+
if grep -qiE "microsoft|wsl" /proc/version /proc/sys/kernel/osrelease 2>/dev/null || [ -n "${WSL_DISTRO_NAME:-}" ]; then
|
|
103
|
+
echo "wsl"
|
|
104
|
+
else
|
|
105
|
+
echo "linux"
|
|
106
|
+
fi
|
|
107
|
+
;;
|
|
108
|
+
MINGW*|MSYS*|CYGWIN*)
|
|
109
|
+
echo "native-windows"
|
|
110
|
+
;;
|
|
111
|
+
*)
|
|
112
|
+
echo "unsupported"
|
|
113
|
+
;;
|
|
114
|
+
esac
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if [ "$TARGET" = "auto" ]; then
|
|
118
|
+
TARGET="$(detect_target)"
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
case "$TARGET" in
|
|
122
|
+
macos|wsl|linux) ;;
|
|
123
|
+
native-windows)
|
|
124
|
+
echo "Native Windows/Git Bash is not a supported CLI-JAW install target. Use WSL." >&2
|
|
125
|
+
exit 2
|
|
126
|
+
;;
|
|
127
|
+
*)
|
|
128
|
+
echo "Unsupported target: $TARGET" >&2
|
|
129
|
+
exit 2
|
|
130
|
+
;;
|
|
131
|
+
esac
|
|
132
|
+
|
|
133
|
+
if [ -z "$OUT_DIR" ]; then
|
|
134
|
+
OUT_DIR="${CLI_JAW_EVIDENCE_DIR:-$HOME/cli-jaw-fresh-install-evidence-$(date -u +%Y%m%d-%H%M%S)}"
|
|
135
|
+
fi
|
|
136
|
+
mkdir -p "$OUT_DIR"
|
|
137
|
+
SUMMARY="$OUT_DIR/summary.txt"
|
|
138
|
+
: > "$SUMMARY"
|
|
139
|
+
|
|
140
|
+
record() {
|
|
141
|
+
printf '%s %s\n' "$(now_utc)" "$*" >> "$SUMMARY"
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
file_sha256() {
|
|
145
|
+
local file="$1"
|
|
146
|
+
if command -v shasum >/dev/null 2>&1; then
|
|
147
|
+
shasum -a 256 "$file" | awk '{print $1}'
|
|
148
|
+
return 0
|
|
149
|
+
fi
|
|
150
|
+
if command -v sha256sum >/dev/null 2>&1; then
|
|
151
|
+
sha256sum "$file" | awk '{print $1}'
|
|
152
|
+
return 0
|
|
153
|
+
fi
|
|
154
|
+
if command -v openssl >/dev/null 2>&1; then
|
|
155
|
+
openssl dgst -sha256 -r "$file" | awk '{print $1}'
|
|
156
|
+
return 0
|
|
157
|
+
fi
|
|
158
|
+
return 1
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
archive_local_script() {
|
|
162
|
+
local label="$1"
|
|
163
|
+
local source="$2"
|
|
164
|
+
local dest="$3"
|
|
165
|
+
|
|
166
|
+
cp "$source" "$dest"
|
|
167
|
+
chmod +x "$dest" 2>/dev/null || true
|
|
168
|
+
local digest
|
|
169
|
+
digest="$(file_sha256 "$dest" 2>/dev/null || true)"
|
|
170
|
+
record "SCRIPT label=\"$label\" source=\"$source\" file=\"$dest\" sha256=\"$digest\""
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
archive_remote_script() {
|
|
174
|
+
local label="$1"
|
|
175
|
+
local url="$2"
|
|
176
|
+
local dest="$3"
|
|
177
|
+
|
|
178
|
+
curl -fsSL -o "$dest" "$url"
|
|
179
|
+
chmod +x "$dest" 2>/dev/null || true
|
|
180
|
+
local digest
|
|
181
|
+
digest="$(file_sha256 "$dest" 2>/dev/null || true)"
|
|
182
|
+
record "SCRIPT label=\"$label\" source=\"$url\" file=\"$dest\" sha256=\"$digest\""
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
archive_collector_script() {
|
|
186
|
+
local source="${BASH_SOURCE[0]:-}"
|
|
187
|
+
local archived_collector="$OUT_DIR/00-collector-script.sh"
|
|
188
|
+
|
|
189
|
+
if [ -n "$source" ] && [ -f "$source" ]; then
|
|
190
|
+
archive_local_script "collector" "$source" "$archived_collector"
|
|
191
|
+
return 0
|
|
192
|
+
fi
|
|
193
|
+
|
|
194
|
+
record "WARN collector script source is not a readable file; download the collector before running it for release evidence"
|
|
195
|
+
echo "warning: collector script source is not a readable file; release audit will require $archived_collector" >&2
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
record "target=$TARGET"
|
|
199
|
+
record "raw_base=$RAW_BASE"
|
|
200
|
+
record "install_script=$INSTALL_SCRIPT"
|
|
201
|
+
record "verifier_script=$VERIFIER_SCRIPT"
|
|
202
|
+
record "skip_install=$SKIP_INSTALL"
|
|
203
|
+
record "skip_doctor=$SKIP_DOCTOR"
|
|
204
|
+
record "out_dir=$OUT_DIR"
|
|
205
|
+
|
|
206
|
+
run_logged() {
|
|
207
|
+
local label="$1"
|
|
208
|
+
local logfile="$2"
|
|
209
|
+
shift 2
|
|
210
|
+
|
|
211
|
+
echo
|
|
212
|
+
echo "== $label =="
|
|
213
|
+
record "RUN label=\"$label\" log=\"$logfile\" command=\"$*\""
|
|
214
|
+
"$@" 2>&1 | tee "$logfile"
|
|
215
|
+
local status=${PIPESTATUS[0]}
|
|
216
|
+
record "DONE label=\"$label\" status=$status"
|
|
217
|
+
if [ "$status" -ne 0 ]; then
|
|
218
|
+
FAILURES=$((FAILURES + 1))
|
|
219
|
+
echo "!! $label failed with exit $status"
|
|
220
|
+
fi
|
|
221
|
+
return "$status"
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
run_shell_logged() {
|
|
225
|
+
local label="$1"
|
|
226
|
+
local logfile="$2"
|
|
227
|
+
local command="$3"
|
|
228
|
+
|
|
229
|
+
echo
|
|
230
|
+
echo "== $label =="
|
|
231
|
+
record "RUN label=\"$label\" log=\"$logfile\" shell=\"bash -lc\" command=\"$command\""
|
|
232
|
+
bash -lc "$command" 2>&1 | tee "$logfile"
|
|
233
|
+
local status=${PIPESTATUS[0]}
|
|
234
|
+
record "DONE label=\"$label\" status=$status"
|
|
235
|
+
if [ "$status" -ne 0 ]; then
|
|
236
|
+
FAILURES=$((FAILURES + 1))
|
|
237
|
+
echo "!! $label failed with exit $status"
|
|
238
|
+
fi
|
|
239
|
+
return "$status"
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
run_optional_logged() {
|
|
243
|
+
local label="$1"
|
|
244
|
+
local logfile="$2"
|
|
245
|
+
shift 2
|
|
246
|
+
|
|
247
|
+
echo
|
|
248
|
+
echo "== $label =="
|
|
249
|
+
record "RUN optional label=\"$label\" log=\"$logfile\" command=\"$*\""
|
|
250
|
+
"$@" 2>&1 | tee "$logfile"
|
|
251
|
+
local status=${PIPESTATUS[0]}
|
|
252
|
+
record "DONE optional label=\"$label\" status=$status"
|
|
253
|
+
if [ "$status" -ne 0 ]; then
|
|
254
|
+
echo "!! optional $label failed with exit $status"
|
|
255
|
+
fi
|
|
256
|
+
return 0
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
run_optional_shell_logged() {
|
|
260
|
+
local label="$1"
|
|
261
|
+
local logfile="$2"
|
|
262
|
+
local command="$3"
|
|
263
|
+
|
|
264
|
+
echo
|
|
265
|
+
echo "== $label =="
|
|
266
|
+
record "RUN optional label=\"$label\" log=\"$logfile\" shell=\"bash -lc\" command=\"$command\""
|
|
267
|
+
bash -lc "$command" 2>&1 | tee "$logfile"
|
|
268
|
+
local status=${PIPESTATUS[0]}
|
|
269
|
+
record "DONE optional label=\"$label\" status=$status"
|
|
270
|
+
if [ "$status" -ne 0 ]; then
|
|
271
|
+
echo "!! optional $label failed with exit $status"
|
|
272
|
+
fi
|
|
273
|
+
return 0
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
collect_snapshot() {
|
|
277
|
+
local label="$1"
|
|
278
|
+
local file="$2"
|
|
279
|
+
{
|
|
280
|
+
echo "label=$label"
|
|
281
|
+
echo "timestamp_utc=$(now_utc)"
|
|
282
|
+
echo "target=$TARGET"
|
|
283
|
+
echo "uname=$(uname -a 2>/dev/null || true)"
|
|
284
|
+
if command -v sw_vers >/dev/null 2>&1; then
|
|
285
|
+
sw_vers
|
|
286
|
+
fi
|
|
287
|
+
echo "shell=${SHELL:-}"
|
|
288
|
+
echo "home=$HOME"
|
|
289
|
+
echo "zdotdir=${ZDOTDIR:-}"
|
|
290
|
+
echo "path=${PATH:-}"
|
|
291
|
+
if command -v xcode-select >/dev/null 2>&1; then
|
|
292
|
+
echo "xcode_select=$(xcode-select -p 2>&1 || true)"
|
|
293
|
+
fi
|
|
294
|
+
if [ -r /etc/os-release ]; then
|
|
295
|
+
sed -n '1,20p' /etc/os-release
|
|
296
|
+
fi
|
|
297
|
+
for cmd in zsh bash git curl node npm nvm cargo rustc jaw cli-jaw claude codex gemini grok opencode copilot officecli powershell.exe wsl.exe; do
|
|
298
|
+
if command -v "$cmd" >/dev/null 2>&1; then
|
|
299
|
+
echo "$cmd=$(command -v "$cmd")"
|
|
300
|
+
else
|
|
301
|
+
echo "$cmd=missing"
|
|
302
|
+
fi
|
|
303
|
+
done
|
|
304
|
+
} > "$file" 2>&1
|
|
305
|
+
echo "snapshot: $file"
|
|
306
|
+
record "SNAPSHOT label=\"$label\" file=\"$file\""
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
refresh_runtime_paths() {
|
|
310
|
+
export PATH="$HOME/.local/bin:${PATH:-}"
|
|
311
|
+
export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
|
|
312
|
+
if [ -s "$NVM_DIR/nvm.sh" ]; then
|
|
313
|
+
# shellcheck disable=SC1090
|
|
314
|
+
. "$NVM_DIR/nvm.sh"
|
|
315
|
+
fi
|
|
316
|
+
if command -v nvm >/dev/null 2>&1; then
|
|
317
|
+
nvm use default >/dev/null 2>&1 || nvm use 22 >/dev/null 2>&1 || true
|
|
318
|
+
fi
|
|
319
|
+
if command -v npm >/dev/null 2>&1; then
|
|
320
|
+
local npm_prefix
|
|
321
|
+
npm_prefix="$(npm prefix -g 2>/dev/null || true)"
|
|
322
|
+
if [ -n "$npm_prefix" ] && [ -d "${npm_prefix%/}/bin" ]; then
|
|
323
|
+
export PATH="${npm_prefix%/}/bin:$PATH"
|
|
324
|
+
fi
|
|
325
|
+
fi
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
local_verifier_for_install_script() {
|
|
329
|
+
if [ -z "$INSTALL_SCRIPT" ]; then
|
|
330
|
+
return 1
|
|
331
|
+
fi
|
|
332
|
+
|
|
333
|
+
local install_dir
|
|
334
|
+
install_dir="$(dirname "$INSTALL_SCRIPT")"
|
|
335
|
+
if [ -f "$install_dir/verify-fresh-install.sh" ]; then
|
|
336
|
+
printf '%s\n' "$install_dir/verify-fresh-install.sh"
|
|
337
|
+
return 0
|
|
338
|
+
fi
|
|
339
|
+
return 1
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
installer_script_name() {
|
|
343
|
+
case "$TARGET" in
|
|
344
|
+
wsl) echo "install-wsl.sh" ;;
|
|
345
|
+
macos|linux) echo "install.sh" ;;
|
|
346
|
+
esac
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
run_installer() {
|
|
350
|
+
local script_name
|
|
351
|
+
script_name="$(installer_script_name)"
|
|
352
|
+
local archived_installer="$OUT_DIR/02-installer-script.sh"
|
|
353
|
+
|
|
354
|
+
if [ "$SKIP_INSTALL" = "1" ]; then
|
|
355
|
+
record "SKIP installer"
|
|
356
|
+
echo "== installer skipped =="
|
|
357
|
+
return 0
|
|
358
|
+
fi
|
|
359
|
+
|
|
360
|
+
if [ -n "$INSTALL_SCRIPT" ]; then
|
|
361
|
+
archive_local_script "installer" "$INSTALL_SCRIPT" "$archived_installer"
|
|
362
|
+
else
|
|
363
|
+
archive_remote_script "installer" "$RAW_BASE/scripts/$script_name" "$archived_installer"
|
|
364
|
+
fi
|
|
365
|
+
run_logged "CLI-JAW one-click installer" "$OUT_DIR/01-install.log" bash "$archived_installer"
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
run_verifier() {
|
|
369
|
+
local args=()
|
|
370
|
+
local verifier=""
|
|
371
|
+
local verifier_label="packaged fresh-install verifier"
|
|
372
|
+
local archived_verifier="$OUT_DIR/21-verifier-script.sh"
|
|
373
|
+
if [ "$SKIP_DOCTOR" = "1" ]; then
|
|
374
|
+
args+=(--skip-doctor)
|
|
375
|
+
fi
|
|
376
|
+
|
|
377
|
+
if [ -n "$VERIFIER_SCRIPT" ]; then
|
|
378
|
+
verifier="$VERIFIER_SCRIPT"
|
|
379
|
+
verifier_label="local fresh-install verifier"
|
|
380
|
+
elif verifier="$(local_verifier_for_install_script 2>/dev/null || true)" && [ -n "$verifier" ]; then
|
|
381
|
+
verifier_label="local fresh-install verifier from installer checkout"
|
|
382
|
+
elif command -v npm >/dev/null 2>&1; then
|
|
383
|
+
local npm_root
|
|
384
|
+
npm_root="$(npm root -g 2>/dev/null || true)"
|
|
385
|
+
if [ -n "$npm_root" ] && [ -f "$npm_root/cli-jaw/scripts/verify-fresh-install.sh" ]; then
|
|
386
|
+
verifier="$npm_root/cli-jaw/scripts/verify-fresh-install.sh"
|
|
387
|
+
fi
|
|
388
|
+
fi
|
|
389
|
+
|
|
390
|
+
if [ -n "$verifier" ]; then
|
|
391
|
+
archive_local_script "verifier" "$verifier" "$archived_verifier"
|
|
392
|
+
run_logged "$verifier_label" "$OUT_DIR/20-verify.log" bash "$archived_verifier" "${args[@]}"
|
|
393
|
+
else
|
|
394
|
+
archive_remote_script "verifier" "$RAW_BASE/scripts/verify-fresh-install.sh" "$archived_verifier"
|
|
395
|
+
run_logged "raw fresh-install verifier" "$OUT_DIR/20-verify.log" bash "$archived_verifier" "${args[@]}"
|
|
396
|
+
fi
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
run_shell_probes() {
|
|
400
|
+
local probe='set -e; printf "node_path="; command -v node; node --version; printf "npm_path="; command -v npm; npm --version; printf "jaw_path="; command -v jaw; jaw --version'
|
|
401
|
+
|
|
402
|
+
if [ "$TARGET" = "macos" ]; then
|
|
403
|
+
run_optional_shell_logged "bash login-shell probe (non-default on macOS)" "$OUT_DIR/30-bash-login-probe.log" "$probe"
|
|
404
|
+
else
|
|
405
|
+
run_shell_logged "current bash login-shell probe" "$OUT_DIR/30-bash-login-probe.log" "$probe"
|
|
406
|
+
fi
|
|
407
|
+
|
|
408
|
+
if command -v zsh >/dev/null 2>&1; then
|
|
409
|
+
if [ "$TARGET" = "macos" ]; then
|
|
410
|
+
run_logged "zsh login-shell probe" "$OUT_DIR/31-zsh-login-probe.log" zsh -lc "$probe"
|
|
411
|
+
run_logged "zsh interactive-shell probe" "$OUT_DIR/32-zsh-interactive-probe.log" zsh -ic "$probe"
|
|
412
|
+
else
|
|
413
|
+
run_optional_logged "zsh login-shell probe (non-default outside macOS)" "$OUT_DIR/31-zsh-login-probe.log" zsh -lc "$probe"
|
|
414
|
+
run_optional_logged "zsh interactive-shell probe (non-default outside macOS)" "$OUT_DIR/32-zsh-interactive-probe.log" zsh -ic "$probe"
|
|
415
|
+
fi
|
|
416
|
+
else
|
|
417
|
+
record "SKIP zsh probes: zsh not found"
|
|
418
|
+
fi
|
|
419
|
+
|
|
420
|
+
if [ "$TARGET" = "wsl" ]; then
|
|
421
|
+
local distro="${WSL_DISTRO_NAME:-Ubuntu}"
|
|
422
|
+
record "PowerShell host probe command: wsl.exe -d $distro -- bash -lc \"jaw --version\""
|
|
423
|
+
if command -v powershell.exe >/dev/null 2>&1; then
|
|
424
|
+
run_logged "PowerShell-to-WSL jaw probe" "$OUT_DIR/33-powershell-to-wsl-probe.log" \
|
|
425
|
+
powershell.exe -NoProfile -Command "\$ErrorActionPreference = 'Stop'; wsl.exe -d '$distro' -- bash -lc 'jaw --version'"
|
|
426
|
+
else
|
|
427
|
+
record "SKIP PowerShell-to-WSL probe: powershell.exe not found inside WSL"
|
|
428
|
+
echo "PowerShell-to-WSL probe skipped: powershell.exe not found inside WSL"
|
|
429
|
+
echo "Run this from Windows PowerShell, then re-run the auditor:"
|
|
430
|
+
cat <<EOF
|
|
431
|
+
wsl.exe -d $distro -- bash -lc 'EVIDENCE_DIR="\$(ls -dt ~/cli-jaw-fresh-install-evidence-* | head -1)"; { echo "command=wsl.exe -d $distro -- bash -lc jaw --version"; jaw --version; } | tee "\$EVIDENCE_DIR/33-powershell-to-wsl-probe.log"'
|
|
432
|
+
EOF
|
|
433
|
+
fi
|
|
434
|
+
fi
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
echo "CLI-JAW fresh-machine evidence collector"
|
|
438
|
+
echo "target=$TARGET"
|
|
439
|
+
echo "out_dir=$OUT_DIR"
|
|
440
|
+
|
|
441
|
+
archive_collector_script
|
|
442
|
+
collect_snapshot "before" "$OUT_DIR/00-before.txt"
|
|
443
|
+
run_installer || true
|
|
444
|
+
refresh_runtime_paths
|
|
445
|
+
collect_snapshot "after" "$OUT_DIR/10-after.txt"
|
|
446
|
+
run_verifier || true
|
|
447
|
+
run_shell_probes || true
|
|
448
|
+
|
|
449
|
+
if [ "$FAILURES" -eq 0 ]; then
|
|
450
|
+
record "RESULT pass"
|
|
451
|
+
echo
|
|
452
|
+
echo "PASS evidence_dir=$OUT_DIR"
|
|
453
|
+
exit 0
|
|
454
|
+
fi
|
|
455
|
+
|
|
456
|
+
record "RESULT fail failures=$FAILURES"
|
|
457
|
+
echo
|
|
458
|
+
echo "FAIL failures=$FAILURES evidence_dir=$OUT_DIR"
|
|
459
|
+
exit 1
|
|
@@ -5,6 +5,33 @@ import path from 'node:path';
|
|
|
5
5
|
import { execFileSync, spawn, type ChildProcess, type ExecFileSyncOptions } from 'node:child_process';
|
|
6
6
|
|
|
7
7
|
const root: string = process.cwd();
|
|
8
|
+
const npmCmd = 'npm';
|
|
9
|
+
const jawCmd = 'jaw';
|
|
10
|
+
|
|
11
|
+
interface Args {
|
|
12
|
+
mode: 'safe' | 'postinstall';
|
|
13
|
+
skipDoctor: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function parseArgs(argv: string[]): Args {
|
|
17
|
+
const args: Args = { mode: 'safe', skipDoctor: false };
|
|
18
|
+
for (const arg of argv) {
|
|
19
|
+
if (arg === '--safe') {
|
|
20
|
+
args.mode = 'safe';
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (arg === '--postinstall') {
|
|
24
|
+
args.mode = 'postinstall';
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (arg === '--skip-doctor') {
|
|
28
|
+
args.skipDoctor = true;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
throw new Error(`unknown option: ${arg}`);
|
|
32
|
+
}
|
|
33
|
+
return args;
|
|
34
|
+
}
|
|
8
35
|
|
|
9
36
|
function run(cmd: string, args: string[], opts: ExecFileSyncOptions = {}): string {
|
|
10
37
|
return execFileSync(cmd, args, {
|
|
@@ -44,17 +71,26 @@ function resolveInstalledPackage(prefix: string): string {
|
|
|
44
71
|
throw new Error(`installed package path not found under prefix: ${prefix}`);
|
|
45
72
|
}
|
|
46
73
|
|
|
74
|
+
function npmGlobalBin(prefix: string): string {
|
|
75
|
+
return path.join(prefix, 'bin');
|
|
76
|
+
}
|
|
77
|
+
|
|
47
78
|
interface NpmPackResult {
|
|
48
79
|
filename?: string;
|
|
49
80
|
}
|
|
50
81
|
|
|
51
82
|
async function main(): Promise<void> {
|
|
83
|
+
if (process.platform === 'win32') {
|
|
84
|
+
throw new Error('fresh-install-smoke targets macOS/Linux/WSL. On Windows, run it inside WSL.');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const args = parseArgs(process.argv.slice(2));
|
|
52
88
|
let tarballPath: string | null = null;
|
|
53
89
|
let tmp: string | null = null;
|
|
54
90
|
let server: ChildProcess | null = null;
|
|
55
91
|
|
|
56
92
|
try {
|
|
57
|
-
const packOut = run(
|
|
93
|
+
const packOut = run(npmCmd, ['pack', '--json']);
|
|
58
94
|
const pack: NpmPackResult[] = JSON.parse(packOut);
|
|
59
95
|
const tarballName = pack[0]?.filename;
|
|
60
96
|
if (!tarballName) throw new Error('npm pack did not return filename');
|
|
@@ -63,22 +99,57 @@ async function main(): Promise<void> {
|
|
|
63
99
|
if (!fs.existsSync(tarballPath)) throw new Error(`tarball not found: ${tarballPath}`);
|
|
64
100
|
|
|
65
101
|
tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'jaw-fresh-'));
|
|
102
|
+
const homeTmp = fs.mkdtempSync(path.join(os.homedir(), '.cli-jaw-fresh-smoke-'));
|
|
66
103
|
const prefix = path.join(tmp, 'prefix');
|
|
67
|
-
const jawHome = path.join(
|
|
104
|
+
const jawHome = path.join(homeTmp, 'jaw-home');
|
|
68
105
|
fs.mkdirSync(prefix, { recursive: true });
|
|
69
106
|
|
|
70
|
-
const
|
|
71
|
-
|
|
107
|
+
const binDir = npmGlobalBin(prefix);
|
|
108
|
+
const pathWithGlobalBin = [binDir, process.env["PATH"] || ''].filter(Boolean).join(path.delimiter);
|
|
109
|
+
fs.writeFileSync(path.join(homeTmp, '.zshrc'), `export PATH=${JSON.stringify(pathWithGlobalBin)}\n`);
|
|
110
|
+
fs.writeFileSync(path.join(homeTmp, '.zprofile'), `export PATH=${JSON.stringify(pathWithGlobalBin)}\n`);
|
|
111
|
+
const installEnv: NodeJS.ProcessEnv = {
|
|
112
|
+
...process.env,
|
|
113
|
+
CLI_JAW_HOME: jawHome,
|
|
114
|
+
npm_config_loglevel: 'error',
|
|
115
|
+
npm_config_prefix: prefix,
|
|
116
|
+
PATH: pathWithGlobalBin,
|
|
117
|
+
Path: process.env["Path"],
|
|
118
|
+
ZDOTDIR: homeTmp,
|
|
119
|
+
};
|
|
120
|
+
if (args.mode === 'safe') {
|
|
121
|
+
installEnv["JAW_SAFE"] = '1';
|
|
122
|
+
} else {
|
|
123
|
+
delete installEnv["JAW_SAFE"];
|
|
124
|
+
installEnv["CLI_JAW_SKIP_CLAUDE"] = '1';
|
|
125
|
+
installEnv["CLI_JAW_SKIP_OFFICECLI"] = '1';
|
|
126
|
+
installEnv["CLI_JAW_SKIP_MCP_SERVERS"] = '1';
|
|
127
|
+
installEnv["CLI_JAW_SKIP_SKILL_DEPS"] = '1';
|
|
128
|
+
}
|
|
129
|
+
run(npmCmd, ['i', '-g', tarballPath, '--prefix', prefix], { env: installEnv });
|
|
72
130
|
|
|
73
131
|
const pkgDir = resolveInstalledPackage(prefix);
|
|
74
132
|
const jawEntry = path.join(pkgDir, 'dist', 'bin', 'cli-jaw.js');
|
|
75
133
|
if (!fs.existsSync(jawEntry)) throw new Error(`cli entry not found: ${jawEntry}`);
|
|
76
134
|
|
|
77
|
-
const jawEnv: NodeJS.ProcessEnv = {
|
|
135
|
+
const jawEnv: NodeJS.ProcessEnv = {
|
|
136
|
+
...process.env,
|
|
137
|
+
CLI_JAW_HOME: jawHome,
|
|
138
|
+
npm_config_prefix: prefix,
|
|
139
|
+
PATH: pathWithGlobalBin,
|
|
140
|
+
Path: process.env["Path"],
|
|
141
|
+
ZDOTDIR: homeTmp,
|
|
142
|
+
};
|
|
78
143
|
|
|
79
|
-
const version = run(
|
|
144
|
+
const version = run(jawCmd, ['--version'], { env: jawEnv }).trim();
|
|
80
145
|
if (!version.toLowerCase().includes('cli-jaw')) throw new Error(`unexpected version output: ${version}`);
|
|
81
146
|
|
|
147
|
+
if (args.mode === 'postinstall') {
|
|
148
|
+
const verifier = path.join(pkgDir, 'scripts', 'verify-fresh-install.sh');
|
|
149
|
+
if (!fs.existsSync(verifier)) throw new Error(`fresh-install verifier not found in package: ${verifier}`);
|
|
150
|
+
run('bash', [verifier, ...(args.skipDoctor ? ['--skip-doctor'] : [])], { env: jawEnv });
|
|
151
|
+
}
|
|
152
|
+
|
|
82
153
|
const doctorRaw = run(process.execPath, [jawEntry, '--home', jawHome, 'doctor', '--json'], { env: jawEnv });
|
|
83
154
|
const doctor = JSON.parse(doctorRaw) as { checks?: unknown[] };
|
|
84
155
|
if (!Array.isArray(doctor?.checks) || doctor.checks.length === 0) {
|
|
@@ -112,6 +183,7 @@ async function main(): Promise<void> {
|
|
|
112
183
|
}
|
|
113
184
|
|
|
114
185
|
console.log('[fresh-install-smoke] PASS');
|
|
186
|
+
console.log(`[fresh-install-smoke] mode=${args.mode}`);
|
|
115
187
|
console.log(`[fresh-install-smoke] version=${version}`);
|
|
116
188
|
console.log(`[fresh-install-smoke] checks=${doctor.checks.length}`);
|
|
117
189
|
console.log(`[fresh-install-smoke] cli-status keys=${keys.join(',')}`);
|
|
@@ -127,6 +199,13 @@ async function main(): Promise<void> {
|
|
|
127
199
|
if (tmp && fs.existsSync(tmp)) {
|
|
128
200
|
fs.rmSync(tmp, { recursive: true, force: true });
|
|
129
201
|
}
|
|
202
|
+
const homeSmokePrefix = path.join(os.homedir(), '.cli-jaw-fresh-smoke-');
|
|
203
|
+
for (const entry of fs.readdirSync(os.homedir())) {
|
|
204
|
+
const candidate = path.join(os.homedir(), entry);
|
|
205
|
+
if (candidate.startsWith(homeSmokePrefix) && fs.statSync(candidate).isDirectory()) {
|
|
206
|
+
fs.rmSync(candidate, { recursive: true, force: true });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
130
209
|
}
|
|
131
210
|
}
|
|
132
211
|
|
|
@@ -119,6 +119,19 @@ foreach ($sidecar in @("rhwp-field-bridge", "rhwp-officecli-bridge")) {
|
|
|
119
119
|
|
|
120
120
|
$pathEntries = (($env:PATH -split ';') | ForEach-Object { $_.Trim() }) | Where-Object { $_ }
|
|
121
121
|
if (-not ($pathEntries -contains $installDir)) {
|
|
122
|
-
Write-Warn "officecli is not on PATH.
|
|
122
|
+
Write-Warn "officecli is not on PATH. Adding it to the current process and user PATH:"
|
|
123
123
|
Write-Host " $installDir"
|
|
124
|
+
$env:PATH = "$installDir;$env:PATH"
|
|
125
|
+
try {
|
|
126
|
+
$userPath = [Environment]::GetEnvironmentVariable("Path", "User")
|
|
127
|
+
$userEntries = (($userPath -split ';') | ForEach-Object { $_.Trim() }) | Where-Object { $_ }
|
|
128
|
+
if (-not ($userEntries -contains $installDir)) {
|
|
129
|
+
$newUserPath = if ($userPath) { "$userPath;$installDir" } else { $installDir }
|
|
130
|
+
[Environment]::SetEnvironmentVariable("Path", $newUserPath, "User")
|
|
131
|
+
Write-Ok "Added officecli to the user PATH. Open a new PowerShell to use it directly."
|
|
132
|
+
}
|
|
133
|
+
} catch {
|
|
134
|
+
Write-Warn "Could not persist user PATH automatically. Add this location manually if needed:"
|
|
135
|
+
Write-Host " $installDir"
|
|
136
|
+
}
|
|
124
137
|
}
|