@yalehwang/cloudpit 2.0.0 → 3.0.0
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.md +1 -1
- package/dist/api-docs.html +3 -3
- package/dist/assets/{abnfDiagram-N423BO3Z-D5yLnMt9.js → abnfDiagram-N423BO3Z-D7Xt05gV.js} +1 -1
- package/dist/assets/{abnfDiagram-N423BO3Z-bTHtQIhR.js → abnfDiagram-N423BO3Z-dmPRRPEm.js} +1 -1
- package/dist/assets/{arc-1DmrBEyG.js → arc-B7W3R5qH.js} +1 -1
- package/dist/assets/{arc-BlGK--01.js → arc-BHMlIcaQ.js} +1 -1
- package/dist/assets/{architectureDiagram-T3A2C74G--lzbKBn9.js → architectureDiagram-T3A2C74G-CUUpAoN0.js} +1 -1
- package/dist/assets/{architectureDiagram-T3A2C74G-7lKNAbUU.js → architectureDiagram-T3A2C74G-DpXhbHxu.js} +1 -1
- package/dist/assets/{blockDiagram-VBNYF7ZC-17cdO9zs.js → blockDiagram-VBNYF7ZC-Bf0yfNxj.js} +1 -1
- package/dist/assets/{blockDiagram-VBNYF7ZC-BPavJfDj.js → blockDiagram-VBNYF7ZC-Cki9AOhc.js} +1 -1
- package/dist/assets/{c4Diagram-5PPSVZJV-Bm1-2w3b.js → c4Diagram-5PPSVZJV-DK2RqNDO.js} +1 -1
- package/dist/assets/{c4Diagram-5PPSVZJV-aHvFL3Wb.js → c4Diagram-5PPSVZJV-DyhTF0e5.js} +1 -1
- package/dist/assets/channel-DTLMNzbH.js +1 -0
- package/dist/assets/channel-DiqxUuPf.js +1 -0
- package/dist/assets/{chunk-2GRJ4B5K-D7WqZewM.js → chunk-2GRJ4B5K-BYtByJbf.js} +1 -1
- package/dist/assets/{chunk-2GRJ4B5K-DbwzBiPF.js → chunk-2GRJ4B5K-CksFgocc.js} +1 -1
- package/dist/assets/{chunk-2Q5K7J3B-DdCr89uy.js → chunk-2Q5K7J3B-D2kQa5TZ.js} +1 -1
- package/dist/assets/{chunk-2Q5K7J3B-TFd0ECKO.js → chunk-2Q5K7J3B-NSSX86FA.js} +1 -1
- package/dist/assets/{chunk-5RXB4S5H-BdhRBpEi.js → chunk-5RXB4S5H-DNNYC8_t.js} +1 -1
- package/dist/assets/{chunk-5RXB4S5H-D0SQ3nIe.js → chunk-5RXB4S5H-Rx0YaqNI.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-B9Lv3cWR.js → chunk-5VM5RSS4-B1k4I4CX.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-DioqTIvB.js → chunk-5VM5RSS4-CsvQj3QC.js} +1 -1
- package/dist/assets/{chunk-6Q2QTUOP-09bwlcIv.js → chunk-6Q2QTUOP-48-dEgAs.js} +1 -1
- package/dist/assets/{chunk-6Q2QTUOP-JuhPJZZL.js → chunk-6Q2QTUOP-DCMSW5_0.js} +1 -1
- package/dist/assets/{chunk-GF5L2VYU-C6f2SgCw.js → chunk-GF5L2VYU-CGyvOsdN.js} +1 -1
- package/dist/assets/{chunk-GF5L2VYU-DzD9aOyp.js → chunk-GF5L2VYU-YXe113hp.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-BggnWNZv.js → chunk-JWPE2WC7-BT7vCW4x.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-Dte_Ax9K.js → chunk-JWPE2WC7-D2K1Oywq.js} +1 -1
- package/dist/assets/{chunk-KBJHAD2P-9TCQV92m.js → chunk-KBJHAD2P-CQZWamtE.js} +1 -1
- package/dist/assets/{chunk-KBJHAD2P-DDnJp7kJ.js → chunk-KBJHAD2P-gpEwZrNy.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-CE2Y4D_h.js → chunk-RYQCIY6F-BI0fMtjY.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-DsgFSTNw.js → chunk-RYQCIY6F-vguRdb4F.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-B1FIfsqq.js → chunk-XXDRQBXY-B99qH1_w.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-B4YfaqTO.js → chunk-XXDRQBXY-DZLJnbBB.js} +1 -1
- package/dist/assets/classDiagram-JCYQIIEL-BaV-s6x8.js +1 -0
- package/dist/assets/classDiagram-JCYQIIEL-D4M03B4L.js +1 -0
- package/dist/assets/classDiagram-v2-OCEON4UE-BaV-s6x8.js +1 -0
- package/dist/assets/classDiagram-v2-OCEON4UE-D4M03B4L.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-C1AG5Pib.js → cose-bilkent-JH36ORCC-EsVnz-E6.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-lMwWDibI.js → cose-bilkent-JH36ORCC-VI2OjCIx.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-BlabniRL.js → cynefin-VYW2F7L2-BVYg0ixs.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-W-c-z4IW.js → cynefin-VYW2F7L2-BnHmA5I2.js} +1 -1
- package/dist/assets/{cynefinDiagram-MW4NZA55-BtTep_pq.js → cynefinDiagram-MW4NZA55-B-OCRLIw.js} +1 -1
- package/dist/assets/{cynefinDiagram-MW4NZA55-Due6EIPh.js → cynefinDiagram-MW4NZA55-ItLlzjDR.js} +1 -1
- package/dist/assets/{dagre-VZM6K2ZE-CWLaFfdt.js → dagre-VZM6K2ZE-DkVDkAWJ.js} +1 -1
- package/dist/assets/{dagre-VZM6K2ZE-DZldvqiQ.js → dagre-VZM6K2ZE-bYR4z8-Z.js} +1 -1
- package/dist/assets/{diagram-7IWD3JNH-RnmUHYwN.js → diagram-7IWD3JNH-DjXMue67.js} +1 -1
- package/dist/assets/{diagram-7IWD3JNH-Di-7-nSA.js → diagram-7IWD3JNH-FNEXlm5k.js} +1 -1
- package/dist/assets/{diagram-B4RE2ZJO-Wybyn8fw.js → diagram-B4RE2ZJO-73NYiO_P.js} +1 -1
- package/dist/assets/{diagram-B4RE2ZJO-mrK79C2E.js → diagram-B4RE2ZJO-dB4QHq0D.js} +1 -1
- package/dist/assets/{diagram-LBJQPF4R-JY6FqSFu.js → diagram-LBJQPF4R-DyKT610O.js} +1 -1
- package/dist/assets/{diagram-LBJQPF4R-sWhu2VLy.js → diagram-LBJQPF4R-rMgmnjvd.js} +1 -1
- package/dist/assets/{diagram-Q27KOJAE-BJ4T0WGp.js → diagram-Q27KOJAE-BvsfmmQt.js} +1 -1
- package/dist/assets/{diagram-Q27KOJAE-DyGT9KhB.js → diagram-Q27KOJAE-c6DEjLQX.js} +1 -1
- package/dist/assets/{diagram-UB23O5K3-oXFJAndB.js → diagram-UB23O5K3-BMo2VXVb.js} +1 -1
- package/dist/assets/{diagram-UB23O5K3-tTd8qwEM.js → diagram-UB23O5K3-DRMKefnZ.js} +1 -1
- package/dist/assets/{ebnfDiagram-BXEA7PRR-DV67cBe6.js → ebnfDiagram-BXEA7PRR-BrOAekWh.js} +1 -1
- package/dist/assets/{ebnfDiagram-BXEA7PRR-OQGm8tPs.js → ebnfDiagram-BXEA7PRR-YmQkylwV.js} +1 -1
- package/dist/assets/{elk-BRx4gEGg.js → elk-Hz3WRESK.js} +1 -1
- package/dist/assets/{elk-CdAQJ-NA.js → elk-tPSZwRVB.js} +1 -1
- package/dist/assets/{erDiagram-JOGREHBK-BhD2xZ2I.js → erDiagram-JOGREHBK-BlaZnoQi.js} +1 -1
- package/dist/assets/{erDiagram-JOGREHBK-BqP8DqqW.js → erDiagram-JOGREHBK-CRCfRUXt.js} +1 -1
- package/dist/assets/{flowDiagram-UKHOOZJN-B4AjZxPJ.js → flowDiagram-UKHOOZJN-DQ1gbjxo.js} +1 -1
- package/dist/assets/{flowDiagram-UKHOOZJN-CP_1WsW4.js → flowDiagram-UKHOOZJN-Dinlbmds.js} +1 -1
- package/dist/assets/{ganttDiagram-PKOTCBZU-BMk6nngr.js → ganttDiagram-PKOTCBZU-CMGpcBZO.js} +1 -1
- package/dist/assets/{ganttDiagram-PKOTCBZU-B_ce39Ld.js → ganttDiagram-PKOTCBZU-Eh94zuPI.js} +1 -1
- package/dist/assets/{gitGraphDiagram-DS77QQ5N-CnZA42iA.js → gitGraphDiagram-DS77QQ5N-Bp8xIZbk.js} +1 -1
- package/dist/assets/{gitGraphDiagram-DS77QQ5N-DqEz_iTn.js → gitGraphDiagram-DS77QQ5N-Cu-b4YNw.js} +1 -1
- package/dist/assets/index-51e8fagd.css +32 -0
- package/dist/assets/{index-D5nLH7qP.js → index-CQE9C6k6.js} +356 -356
- package/dist/assets/{index-CqyOGerp.js → index-S8ow0XfK.js} +356 -356
- package/dist/assets/{infoDiagram-6WML65LV-BQf7m4X4.js → infoDiagram-6WML65LV-CClEEtTq.js} +1 -1
- package/dist/assets/{infoDiagram-6WML65LV-Dntf4YFM.js → infoDiagram-6WML65LV-QmHeojgl.js} +1 -1
- package/dist/assets/{ishikawaDiagram-WSZJBQD7-BDjsldAI.js → ishikawaDiagram-WSZJBQD7-BemSj9lN.js} +1 -1
- package/dist/assets/{ishikawaDiagram-WSZJBQD7-BqXpJeoL.js → ishikawaDiagram-WSZJBQD7-nw48g1vr.js} +1 -1
- package/dist/assets/{journeyDiagram-NVQOT4AX-CBcFzP2M.js → journeyDiagram-NVQOT4AX-DeNtO6OU.js} +1 -1
- package/dist/assets/{journeyDiagram-NVQOT4AX-DoWKjgKd.js → journeyDiagram-NVQOT4AX-q1lCfOYn.js} +1 -1
- package/dist/assets/{kanban-definition-27J2QSJJ-9bspl7j-.js → kanban-definition-27J2QSJJ-Bzhu6hql.js} +1 -1
- package/dist/assets/{kanban-definition-27J2QSJJ-Cjxa-Fbb.js → kanban-definition-27J2QSJJ-VfvD33YG.js} +1 -1
- package/dist/assets/{linear-YogAXmU_.js → linear-C0Kwu3Yp.js} +1 -1
- package/dist/assets/{linear-lIhI5Y8l.js → linear-CbM_4-fP.js} +1 -1
- package/dist/assets/{mermaid.core-2Spxcrg7.js → mermaid.core-G2huIsXn.js} +5 -5
- package/dist/assets/{mermaid.core-BxxInCBm.js → mermaid.core-fvTQFUX1.js} +5 -5
- package/dist/assets/{mindmap-definition-FAOFIHXS-DblO5EG4.js → mindmap-definition-FAOFIHXS-BONvuyvz.js} +1 -1
- package/dist/assets/{mindmap-definition-FAOFIHXS-_nlvJ9VK.js → mindmap-definition-FAOFIHXS-BzYawGKQ.js} +1 -1
- package/dist/assets/{pegDiagram-VL7TDLO6-BBJFPAZG.js → pegDiagram-VL7TDLO6-Df2HAKGH.js} +1 -1
- package/dist/assets/{pegDiagram-VL7TDLO6-DhRH7YRf.js → pegDiagram-VL7TDLO6-DnMwBHn_.js} +1 -1
- package/dist/assets/{pieDiagram-7S7Q4E2Y-4Qy7Nk4U.js → pieDiagram-7S7Q4E2Y-Cd3-a-dM.js} +1 -1
- package/dist/assets/{pieDiagram-7S7Q4E2Y-BUtdeYBT.js → pieDiagram-7S7Q4E2Y-LV6TOhOD.js} +1 -1
- package/dist/assets/{quadrantDiagram-CIZ2JOQS-BUoIDY1r.js → quadrantDiagram-CIZ2JOQS-8VOnA3FV.js} +1 -1
- package/dist/assets/{quadrantDiagram-CIZ2JOQS-D90kdHA1.js → quadrantDiagram-CIZ2JOQS-CnwxFPxh.js} +1 -1
- package/dist/assets/{railroadDiagram-AXF67PYL-CJf9--tj.js → railroadDiagram-AXF67PYL-CXBFj3Iu.js} +1 -1
- package/dist/assets/{railroadDiagram-AXF67PYL-D3S1oliC.js → railroadDiagram-AXF67PYL-DLoAPcsb.js} +1 -1
- package/dist/assets/{requirementDiagram-LRYGKXZP-C04jhjS6.js → requirementDiagram-LRYGKXZP-LrVlZXSz.js} +1 -1
- package/dist/assets/{requirementDiagram-LRYGKXZP-cQaGai5h.js → requirementDiagram-LRYGKXZP-pakITowN.js} +1 -1
- package/dist/assets/{sankeyDiagram-W5VNT64P-AT4cTVbY.js → sankeyDiagram-W5VNT64P-BIQQ8A1I.js} +1 -1
- package/dist/assets/{sankeyDiagram-W5VNT64P-DfFUdqYO.js → sankeyDiagram-W5VNT64P-C6QWOxNM.js} +1 -1
- package/dist/assets/{sequenceDiagram-SI44F4Z6-DbjhG030.js → sequenceDiagram-SI44F4Z6-CpHBe2CG.js} +1 -1
- package/dist/assets/{sequenceDiagram-SI44F4Z6-DKjdupix.js → sequenceDiagram-SI44F4Z6-cnLxaxcV.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-CCcKLP8m.js → sizeCapture-X5ZJPWSS-3g-1onHD.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-DGxRWxeo.js → sizeCapture-X5ZJPWSS-4U6b3PSL.js} +1 -1
- package/dist/assets/{stateDiagram-OKZ733FA-D7wGCNb7.js → stateDiagram-OKZ733FA-CFwVDdlY.js} +1 -1
- package/dist/assets/{stateDiagram-OKZ733FA-qdMAailp.js → stateDiagram-OKZ733FA-CKVGJcM2.js} +1 -1
- package/dist/assets/{stateDiagram-v2-UEYNNEHI-BbmmtA9w.js → stateDiagram-v2-UEYNNEHI-Dnbk8ftm.js} +1 -1
- package/dist/assets/{stateDiagram-v2-UEYNNEHI-Diz_hFvh.js → stateDiagram-v2-UEYNNEHI-rlA-woxH.js} +1 -1
- package/dist/assets/{swimlanes-SLNWSIFB-CZgIPz6I.js → swimlanes-SLNWSIFB-DCwz8-mf.js} +2 -2
- package/dist/assets/{swimlanes-SLNWSIFB-B16H-6OU.js → swimlanes-SLNWSIFB-M9Oumwnl.js} +2 -2
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-CTtTyW6-.js +8 -0
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-Caohx6WZ.js +8 -0
- package/dist/assets/{timeline-definition-Z64GVDOM-7r7OVlrT.js → timeline-definition-Z64GVDOM-BVmfjoWH.js} +1 -1
- package/dist/assets/{timeline-definition-Z64GVDOM-nhnkS_wy.js → timeline-definition-Z64GVDOM-DyXvto1l.js} +1 -1
- package/dist/assets/{vennDiagram-T6HMQDX7-B1piFYrz.js → vennDiagram-T6HMQDX7-CNe6zorb.js} +1 -1
- package/dist/assets/{vennDiagram-T6HMQDX7-x8SJTFhK.js → vennDiagram-T6HMQDX7-DyzOWKx3.js} +1 -1
- package/dist/assets/{wardleyDiagram-T6FBY63Y-BdD4GExj.js → wardleyDiagram-T6FBY63Y-D5YvMVwa.js} +1 -1
- package/dist/assets/{wardleyDiagram-T6FBY63Y-C90xqNVS.js → wardleyDiagram-T6FBY63Y-DXo8BCrA.js} +1 -1
- package/dist/assets/{xychartDiagram-ELKLHX3M--Ndoz0Cq.js → xychartDiagram-ELKLHX3M-CIBffVxC.js} +1 -1
- package/dist/assets/{xychartDiagram-ELKLHX3M-BAKns-7o.js → xychartDiagram-ELKLHX3M-XlsWelDb.js} +1 -1
- package/dist/build-info.json +2 -2
- package/dist/convert-icons.md +10 -46
- package/dist/favicon.png +0 -0
- package/dist/favicon.svg +1 -9
- package/dist/generate-icons.js +67 -47
- package/dist/icons/icon-128x128.png +0 -0
- package/dist/icons/icon-144x144.png +0 -0
- package/dist/icons/icon-152x152.png +0 -0
- package/dist/icons/icon-192x192.png +0 -0
- package/dist/icons/icon-384x384.png +0 -0
- package/dist/icons/icon-512x512.png +0 -0
- package/dist/icons/icon-72x72.png +0 -0
- package/dist/icons/icon-96x96.png +0 -0
- package/dist/index.html +2 -2
- package/dist/logo-128.png +0 -0
- package/dist/logo-256.png +0 -0
- package/dist/logo-32.png +0 -0
- package/dist/logo-512.png +0 -0
- package/dist/logo-64.png +0 -0
- package/dist/logo-source.png +0 -0
- package/dist/logo.svg +1 -17
- package/dist/sw.js +7 -9
- package/dist-server/build-info.json +2 -2
- package/dist-server/server/load-env.js +12 -4
- package/dist-server/server/load-env.js.map +1 -1
- package/dist-server/server/modules/browser-use/browser-use.service.js +33 -11
- package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -1
- package/dist-server/server/modules/browser-use/index.js +4 -4
- package/dist-server/server/modules/browser-use/index.js.map +1 -1
- package/dist-server/server/modules/browser-use/mcp-server-names.js +6 -4
- package/dist-server/server/modules/browser-use/mcp-server-names.js.map +1 -1
- package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +49 -1
- package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -1
- package/dist-server/server/modules/cli/asset-migration-files.js +74 -0
- package/dist-server/server/modules/cli/asset-migration-files.js.map +1 -0
- package/dist-server/server/modules/cli/asset-migration-report.js +80 -0
- package/dist-server/server/modules/cli/asset-migration-report.js.map +1 -0
- package/dist-server/server/modules/cli/asset-migration-store.js +153 -0
- package/dist-server/server/modules/cli/asset-migration-store.js.map +1 -0
- package/dist-server/server/modules/cli/asset-migration.service.js +161 -0
- package/dist-server/server/modules/cli/asset-migration.service.js.map +1 -0
- package/dist-server/server/modules/cli/browser-use-mcp.js +9 -4
- package/dist-server/server/modules/cli/browser-use-mcp.js.map +1 -1
- package/dist-server/server/modules/cli/cli.module.js +21 -1
- package/dist-server/server/modules/cli/cli.module.js.map +1 -1
- package/dist-server/server/modules/cli/cli.service.js +6 -1
- package/dist-server/server/modules/cli/cli.service.js.map +1 -1
- package/dist-server/server/modules/cli/tests/asset-migration.service.test.js +275 -0
- package/dist-server/server/modules/cli/tests/asset-migration.service.test.js.map +1 -0
- package/dist-server/server/modules/cli/tests/browser-use-mcp-entry.test.js +157 -0
- package/dist-server/server/modules/cli/tests/browser-use-mcp-entry.test.js.map +1 -1
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +1 -0
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -1
- package/dist-server/server/modules/cli/tests/cli.service.test.js +6 -1
- package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -1
- package/dist-server/server/modules/cockpit/cockpit-brief-prompt.js +1 -1
- package/dist-server/server/modules/cockpit/cockpit-card-actions.js +19 -3
- package/dist-server/server/modules/cockpit/cockpit-card-actions.js.map +1 -1
- package/dist-server/server/modules/cockpit/cockpit-card-feedback-store.js +94 -9
- package/dist-server/server/modules/cockpit/cockpit-card-feedback-store.js.map +1 -1
- package/dist-server/server/modules/cockpit/cockpit-card-registry.js +1 -1
- package/dist-server/server/modules/cockpit/cockpit-fleet-card-projection.js +3 -0
- package/dist-server/server/modules/cockpit/cockpit-fleet-card-projection.js.map +1 -1
- package/dist-server/server/modules/cockpit/cockpit-knowledge-reading.js +16 -0
- package/dist-server/server/modules/cockpit/cockpit-knowledge-reading.js.map +1 -1
- package/dist-server/server/modules/cockpit/cockpit.module.js +1 -1
- package/dist-server/server/modules/cockpit/tests/cockpit-card-feedback.test.js +96 -1
- package/dist-server/server/modules/cockpit/tests/cockpit-card-feedback.test.js.map +1 -1
- package/dist-server/server/modules/cockpit/tests/cockpit-fleet-card-provider.test.js +2 -2
- package/dist-server/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.js +169 -3
- package/dist-server/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.js.map +1 -1
- package/dist-server/server/modules/context-events/context-event-writer.js +5 -5
- package/dist-server/server/modules/context-events/context-events.module.js +2 -2
- package/dist-server/server/modules/context-events/session-ask-stream-reader.js +1 -1
- package/dist-server/server/modules/context-events/session-blocked-events.js +3 -3
- package/dist-server/server/modules/context-events/tests/session-ask-event-writer.test.js +1 -1
- package/dist-server/server/modules/context-events/tests/session-blocked-events.test.js +3 -3
- package/dist-server/server/modules/context-events/tests/session-run-events.test.js +1 -1
- package/dist-server/server/modules/database/migrations.js +23 -1
- package/dist-server/server/modules/database/migrations.js.map +1 -1
- package/dist-server/server/modules/database/repositories/sessions.db.js +25 -4
- package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
- package/dist-server/server/modules/database/repositories/voice-user-identifiers.db.js +1 -1
- package/dist-server/server/modules/database/schema.js +16 -2
- package/dist-server/server/modules/database/schema.js.map +1 -1
- package/dist-server/server/modules/database/tests/migrations-ensure-columns.test.js +2 -0
- package/dist-server/server/modules/database/tests/migrations-ensure-columns.test.js.map +1 -1
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +2 -2
- package/dist-server/server/modules/debug-agent/tests/debug-agent-permission-popup.test.js +2 -2
- package/dist-server/server/modules/liaison/liaison-deliver.service.js +3 -3
- package/dist-server/server/modules/liaison/liaison.module.js +1 -1
- package/dist-server/server/modules/mcp-gateway/mcp-gateway.auth.js +3 -2
- package/dist-server/server/modules/mcp-gateway/mcp-gateway.auth.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/mcp-self-target.js +2 -2
- package/dist-server/server/modules/mcp-gateway/mcp-session-send.js +7 -0
- package/dist-server/server/modules/mcp-gateway/mcp-session-send.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/mcp-tool-annotations.js +4 -4
- package/dist-server/server/modules/mcp-gateway/oauth-metadata.gate.js +4 -2
- package/dist-server/server/modules/mcp-gateway/oauth-metadata.gate.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/knowledge-effective-config-proof.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/knowledge-peer-correlation-proof.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-approvals.test.js +3 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-approvals.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-audit-route.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-audit.test.js +4 -4
- package/dist-server/server/modules/mcp-gateway/tests/mcp-auth.test.js +3 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-auth.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.js +3 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.js +7 -3
- package/dist-server/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-correlation-id.test.js +8 -8
- package/dist-server/server/modules/mcp-gateway/tests/mcp-draft.test.js +3 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-draft.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-english-only.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-gateway-wiring.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-knowledge-facts.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.js +3 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-overview.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-pending-interaction.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-read-tools.test.js +3 -3
- package/dist-server/server/modules/mcp-gateway/tests/mcp-read-tools.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-run-get.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-self-target.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-self-target.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-background.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-background.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-host-control.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-host-control.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-search-pruning.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-search.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-send.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-send.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-ui-last-opened.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-usage-stats.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-usage-stats.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-write-notification.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-write-notification.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/oauth-flow.e2e.test.js +3 -3
- package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +1 -1
- package/dist-server/server/modules/oauth/access-tokens.service.js +8 -8
- package/dist-server/server/modules/oauth/oauth-consent.service.js +20 -15
- package/dist-server/server/modules/oauth/oauth-consent.service.js.map +1 -1
- package/dist-server/server/modules/oauth/tests/access-token-scopes.test.js +54 -34
- package/dist-server/server/modules/oauth/tests/access-token-scopes.test.js.map +1 -1
- package/dist-server/server/modules/oauth/tests/access-tokens.service.test.js +35 -14
- package/dist-server/server/modules/oauth/tests/access-tokens.service.test.js.map +1 -1
- package/dist-server/server/modules/oauth/tests/oauth-consent-page.test.js +27 -22
- package/dist-server/server/modules/oauth/tests/oauth-consent-page.test.js.map +1 -1
- package/dist-server/server/modules/oauth/tests/oauth-consent-ratelimit.test.js +2 -2
- package/dist-server/server/modules/oauth/tests/token-info.routes.test.js +2 -2
- package/dist-server/server/modules/oauth/tests/token-info.routes.test.js.map +1 -1
- package/dist-server/server/modules/observation/blind-spots.js +1 -1
- package/dist-server/server/modules/observation/observation-store.js +50 -17
- package/dist-server/server/modules/observation/observation-store.js.map +1 -1
- package/dist-server/server/modules/observation/observation-uri.js +31 -19
- package/dist-server/server/modules/observation/observation-uri.js.map +1 -1
- package/dist-server/server/modules/observation/observation.routes.js +1 -1
- package/dist-server/server/modules/observation/project-truth.js +1 -1
- package/dist-server/server/modules/observation/session-ask-decision-answer.js +2 -1
- package/dist-server/server/modules/observation/session-ask-decision-answer.js.map +1 -1
- package/dist-server/server/modules/observation/session-digest-llm.js +7 -1
- package/dist-server/server/modules/observation/session-digest-llm.js.map +1 -1
- package/dist-server/server/modules/observation/session-digest.js +39 -5
- package/dist-server/server/modules/observation/session-digest.js.map +1 -1
- package/dist-server/server/modules/observation/tests/architecture-delta.test.js +1 -1
- package/dist-server/server/modules/observation/tests/observation-routes.test.js +9 -0
- package/dist-server/server/modules/observation/tests/observation-routes.test.js.map +1 -1
- package/dist-server/server/modules/observation/tests/observation-store.test.js +38 -0
- package/dist-server/server/modules/observation/tests/observation-store.test.js.map +1 -1
- package/dist-server/server/modules/observation/tests/project-truth.test.js +2 -2
- package/dist-server/server/modules/observation/tests/session-ask-decision-digest.test.js +150 -0
- package/dist-server/server/modules/observation/tests/session-ask-decision-digest.test.js.map +1 -1
- package/dist-server/server/modules/observation/tests/session-digest.test.js +24 -1
- package/dist-server/server/modules/observation/tests/session-digest.test.js.map +1 -1
- package/dist-server/server/modules/providers/index.js +9 -0
- package/dist-server/server/modules/providers/index.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-host-driver.provider.js +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +22 -3
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-app-server.connection.js +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-host-driver.contract.js +11 -9
- package/dist-server/server/modules/providers/list/codex/codex-host-driver.contract.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-host-driver.provider.js +15 -1
- package/dist-server/server/modules/providers/list/codex/codex-host-driver.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +14 -3
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-provider-injection.js +248 -0
- package/dist-server/server/modules/providers/list/codex/codex-provider-injection.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-resident-provider-launch.js +37 -0
- package/dist-server/server/modules/providers/list/codex/codex-resident-provider-launch.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +19 -1
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +1 -1
- package/dist-server/server/modules/providers/provider.routes.js +23 -2
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-models.service.js +136 -106
- package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-runtime.service.js +3 -0
- package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/session-model-resolver.js +106 -0
- package/dist-server/server/modules/providers/services/session-model-resolver.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-provider-binding.js +89 -0
- package/dist-server/server/modules/providers/services/session-provider-binding.js.map +1 -0
- package/dist-server/server/modules/providers/services/sessions.service.js +5 -1
- package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
- package/dist-server/server/modules/providers/tests/claude-resident-addressable.test.js +2 -2
- package/dist-server/server/modules/providers/tests/claude-session-name-authority.test.js +4 -4
- package/dist-server/server/modules/providers/tests/codex-app-server-protocol.test.js +1 -1
- package/dist-server/server/modules/providers/tests/codex-host-driver-persistent.test.js +2 -2
- package/dist-server/server/modules/providers/tests/codex-provider-model-binding.test.js +270 -0
- package/dist-server/server/modules/providers/tests/codex-provider-model-binding.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-resident-provider-injection.test.js +484 -0
- package/dist-server/server/modules/providers/tests/codex-resident-provider-injection.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-runtime-provider-injection.test.js +228 -0
- package/dist-server/server/modules/providers/tests/codex-runtime-provider-injection.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-session-provider-binding.test.js +306 -0
- package/dist-server/server/modules/providers/tests/codex-session-provider-binding.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js +1 -1
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +2 -2
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js +15 -0
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider.routes.test.js +1 -1
- package/dist-server/server/modules/quay/index.js +1 -1
- package/dist-server/server/modules/quay/quay-fleet-cli.js +1 -1
- package/dist-server/server/modules/quay/quay-fleet-locator.js +2 -2
- package/dist-server/server/modules/quay/quay-fleet-project-id.js +7 -7
- package/dist-server/server/modules/quay/quay-fleet-registry.js +3 -3
- package/dist-server/server/modules/quay/quay-suite-fanin-reader.js +1 -1
- package/dist-server/server/modules/quay/quay-uri-resolve.js +6 -6
- package/dist-server/server/modules/quay/quay.module.js +3 -3
- package/dist-server/server/modules/quay/quay.routes.js +1 -1
- package/dist-server/server/modules/quay/quay.service.js +4 -4
- package/dist-server/server/modules/quay/tests/contracts/fleet-cli-contracts.test.js +3 -3
- package/dist-server/server/modules/quay/tests/contracts/shapes.js +9 -9
- package/dist-server/server/modules/quay/tests/quay-fleet-locator.test.js +1 -1
- package/dist-server/server/modules/quay/tests/quay-fleet-project-id.test.js +4 -4
- package/dist-server/server/modules/quay/tests/quay-uri-resolve.test.js +10 -10
- package/dist-server/server/modules/session-hosts/tests/resident-server-restart.test.js +1 -1
- package/dist-server/server/modules/settings/codex-mcp-gateway.settings.js +1 -1
- package/dist-server/server/modules/settings/codex-model-providers.schema.js +349 -0
- package/dist-server/server/modules/settings/codex-model-providers.schema.js.map +1 -0
- package/dist-server/server/modules/settings/codex-model-providers.service.js +199 -0
- package/dist-server/server/modules/settings/codex-model-providers.service.js.map +1 -0
- package/dist-server/server/modules/settings/codex-model-providers.settings.js +547 -0
- package/dist-server/server/modules/settings/codex-model-providers.settings.js.map +1 -0
- package/dist-server/server/modules/settings/codex-model-providers.store.js +200 -0
- package/dist-server/server/modules/settings/codex-model-providers.store.js.map +1 -0
- package/dist-server/server/modules/settings/index.js +10 -0
- package/dist-server/server/modules/settings/index.js.map +1 -1
- package/dist-server/server/modules/settings/server-settings-file.js +28 -32
- package/dist-server/server/modules/settings/server-settings-file.js.map +1 -1
- package/dist-server/server/modules/settings/server-settings.js +2 -2
- package/dist-server/server/modules/settings/server-settings.js.map +1 -1
- package/dist-server/server/modules/settings/settings.module.js +35 -0
- package/dist-server/server/modules/settings/settings.module.js.map +1 -1
- package/dist-server/server/modules/settings/settings.routes.js +42 -0
- package/dist-server/server/modules/settings/settings.routes.js.map +1 -1
- package/dist-server/server/modules/settings/settings.service.js +8 -21
- package/dist-server/server/modules/settings/settings.service.js.map +1 -1
- package/dist-server/server/modules/settings/tests/cockpit-session-start-settings.routes.test.js +1 -0
- package/dist-server/server/modules/settings/tests/cockpit-session-start-settings.routes.test.js.map +1 -1
- package/dist-server/server/modules/settings/tests/codex-model-providers-settings.test.js +336 -0
- package/dist-server/server/modules/settings/tests/codex-model-providers-settings.test.js.map +1 -0
- package/dist-server/server/modules/settings/tests/codex-provider-advanced.test.js +466 -0
- package/dist-server/server/modules/settings/tests/codex-provider-advanced.test.js.map +1 -0
- package/dist-server/server/modules/settings/tests/codex-provider-import.test.js +475 -0
- package/dist-server/server/modules/settings/tests/codex-provider-import.test.js.map +1 -0
- package/dist-server/server/modules/voice/tests/voice-lexicon.test.js +9 -9
- package/dist-server/server/modules/voice/tests/voice-lexicon.test.js.map +1 -1
- package/dist-server/server/modules/voice/voice-lexicon.js +1 -1
- package/dist-server/server/modules/websocket/services/chat-control.service.js +21 -1
- package/dist-server/server/modules/websocket/services/chat-control.service.js.map +1 -1
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js +25 -1
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
- package/dist-server/server/modules/websocket/tests/chat-background-task.test.js +18 -1
- package/dist-server/server/modules/websocket/tests/chat-background-task.test.js.map +1 -1
- package/dist-server/server/modules/websocket/tests/chat-stop-task.test.js +18 -1
- package/dist-server/server/modules/websocket/tests/chat-stop-task.test.js.map +1 -1
- package/dist-server/server/modules/worktrees/services/worktree-list.service.js +1 -1
- package/dist-server/server/modules/worktrees/services/worktree-open.service.js +1 -1
- package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +1 -1
- package/dist-server/server/shared/brand.js +18 -20
- package/dist-server/server/shared/brand.js.map +1 -1
- package/dist-server/server/shared/data-root-migration.js +3 -2
- package/dist-server/server/shared/data-root-migration.js.map +1 -1
- package/dist-server/server/shared/data-root.js +54 -59
- package/dist-server/server/shared/data-root.js.map +1 -1
- package/dist-server/server/shared/mcp-contract/types.js +20 -15
- package/dist-server/server/shared/mcp-contract/types.js.map +1 -1
- package/dist-server/server/shared/ports/codex-provider-registry.port.js +66 -0
- package/dist-server/server/shared/ports/codex-provider-registry.port.js.map +1 -0
- package/dist-server/server/shared/settings-file.js +120 -6
- package/dist-server/server/shared/settings-file.js.map +1 -1
- package/dist-server/server/shared/tests/cloudpit-brand-env.test.js +76 -34
- package/dist-server/server/shared/tests/cloudpit-brand-env.test.js.map +1 -1
- package/dist-server/server/shared/tests/cloudpit-data-root.test.js +35 -18
- package/dist-server/server/shared/tests/cloudpit-data-root.test.js.map +1 -1
- package/dist-server/server/shared/tests/cloudpit-goal-exit-gate.test.js +153 -17
- package/dist-server/server/shared/tests/cloudpit-goal-exit-gate.test.js.map +1 -1
- package/dist-server/server/shared/tests/cloudpit-runtime-flip.test.js +116 -114
- package/dist-server/server/shared/tests/cloudpit-runtime-flip.test.js.map +1 -1
- package/dist-server/server/shared/tests/frontend-import-cycle-budget.test.js +9 -1
- package/dist-server/server/shared/tests/frontend-import-cycle-budget.test.js.map +1 -1
- package/dist-server/server/shared/tests/quay-test-script.test.js +40 -6
- package/dist-server/server/shared/tests/quay-test-script.test.js.map +1 -1
- package/dist-server/server/shared/tests/settings-file.test.js +58 -2
- package/dist-server/server/shared/tests/settings-file.test.js.map +1 -1
- package/dist-server/server/shared/types.js.map +1 -1
- package/dist-server/server/shared/utils.js +1 -1
- package/electron/appIdMigration.js +467 -0
- package/electron/assets/logo-macos.icns +0 -0
- package/electron/assets/logo-macos.png +0 -0
- package/electron/assets/logo-windows.ico +0 -0
- package/electron/brandEnv.js +64 -0
- package/electron/cloud.js +3 -3
- package/electron/desktopNotifications.js +1 -1
- package/electron/launcher/index.html +1 -1
- package/electron/localServer.js +41 -7
- package/electron/main.js +33 -15
- package/electron/scripts/generate-macos-icon.js +34 -28
- package/electron/scripts/generate-windows-icon.js +66 -0
- package/electron/serverInstaller.js +20 -11
- package/electron/tests/cloudpit-appid-migration.test.mjs +514 -0
- package/electron/tests/cloudpit-brand-env-wiring.test.mjs +324 -0
- package/electron/tests/cloudpit-desktop-identity.test.mjs +42 -19
- package/electron/tests/cloudpit-runtime-identity-surfaces.test.mjs +10 -4
- package/electron/tests/cloudpit-userdata-migration.test.mjs +18 -5
- package/electron/userDataMigration.js +3 -0
- package/package.json +7 -6
- package/public/api-docs.html +3 -3
- package/scripts/brand-allowlist-check.mjs +233 -12
- package/scripts/brand-allowlist-check.test.mjs +270 -1
- package/scripts/cloudpit-distribution-check.mjs +57 -23
- package/scripts/cloudpit-distribution-check.test.mjs +42 -9
- package/scripts/codex-protocol-smoke.mjs +1 -1
- package/scripts/isolated-instance.sh +1 -1
- package/scripts/mcp-smoke.mjs +2 -2
- package/scripts/release/tests/fork-release-workflows.test.mjs +45 -0
- package/scripts/release/tests/server-installer-bundle-url.test.mjs +57 -9
- package/scripts/restart-when-idle.sh +1 -1
- package/scripts/shadow-prediction-report.mjs +1 -1
- package/scripts/suite-duration-baseline.tsv +45 -0
- package/scripts/ui-scenario.mjs +195 -0
- package/scripts/ui-scenarios/codex-provider-import.json +63 -0
- package/scripts/ui-scenarios/codex-provider-settings.json +77 -0
- package/scripts/voice-capture-process-check.false-forms.test.mjs +1 -1
- package/scripts/voice-phase0-report.test.mjs +1 -1
- package/server/load-env.ts +15 -4
- package/server/modules/browser-use/browser-use.service.ts +45 -14
- package/server/modules/browser-use/index.ts +3 -4
- package/server/modules/browser-use/mcp-server-names.ts +6 -5
- package/server/modules/browser-use/tests/browser-use.service.test.ts +63 -1
- package/server/modules/cli/asset-migration-files.ts +96 -0
- package/server/modules/cli/asset-migration-report.ts +123 -0
- package/server/modules/cli/asset-migration-store.ts +228 -0
- package/server/modules/cli/asset-migration.service.ts +236 -0
- package/server/modules/cli/browser-use-mcp.ts +9 -4
- package/server/modules/cli/cli.module.ts +21 -1
- package/server/modules/cli/cli.service.ts +14 -1
- package/server/modules/cli/tests/asset-migration.service.test.ts +349 -0
- package/server/modules/cli/tests/browser-use-mcp-entry.test.ts +202 -0
- package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +1 -0
- package/server/modules/cli/tests/cli.service.test.ts +6 -1
- package/server/modules/cockpit/cockpit-brief-prompt.ts +1 -1
- package/server/modules/cockpit/cockpit-card-actions.ts +20 -3
- package/server/modules/cockpit/cockpit-card-feedback-store.ts +104 -9
- package/server/modules/cockpit/cockpit-card-registry.ts +2 -2
- package/server/modules/cockpit/cockpit-fleet-card-projection.ts +3 -0
- package/server/modules/cockpit/cockpit-fleet-executor.ts +1 -1
- package/server/modules/cockpit/cockpit-knowledge-reading.ts +17 -0
- package/server/modules/cockpit/cockpit.module.ts +2 -2
- package/server/modules/cockpit/cockpit.reducer.ts +1 -1
- package/server/modules/cockpit/tests/cockpit-card-feedback.test.ts +116 -1
- package/server/modules/cockpit/tests/cockpit-fleet-card-provider.test.ts +2 -2
- package/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.ts +205 -3
- package/server/modules/context-events/context-event-writer.ts +6 -6
- package/server/modules/context-events/context-events.module.ts +2 -2
- package/server/modules/context-events/session-ask-stream-reader.ts +1 -1
- package/server/modules/context-events/session-blocked-events.ts +3 -3
- package/server/modules/context-events/tests/session-ask-event-writer.test.ts +1 -1
- package/server/modules/context-events/tests/session-blocked-events.test.ts +3 -3
- package/server/modules/context-events/tests/session-run-events.test.ts +1 -1
- package/server/modules/database/migrations.ts +24 -1
- package/server/modules/database/repositories/sessions.db.ts +41 -4
- package/server/modules/database/repositories/voice-user-identifiers.db.ts +1 -1
- package/server/modules/database/schema.ts +16 -2
- package/server/modules/database/tests/migrations-ensure-columns.test.ts +2 -0
- package/server/modules/database/tests/sessions-provider-mapping.test.ts +2 -2
- package/server/modules/debug-agent/tests/debug-agent-permission-popup.test.ts +2 -2
- package/server/modules/liaison/liaison-deliver.service.ts +4 -4
- package/server/modules/liaison/liaison.module.ts +1 -1
- package/server/modules/mcp-gateway/mcp-gateway.auth.ts +3 -2
- package/server/modules/mcp-gateway/mcp-self-target.ts +2 -2
- package/server/modules/mcp-gateway/mcp-session-send.ts +21 -2
- package/server/modules/mcp-gateway/mcp-tool-annotations.ts +4 -4
- package/server/modules/mcp-gateway/oauth-metadata.gate.ts +4 -5
- package/server/modules/mcp-gateway/tests/knowledge-effective-config-proof.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/knowledge-peer-correlation-proof.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-approvals.test.ts +3 -2
- package/server/modules/mcp-gateway/tests/mcp-audit-route.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-audit.test.ts +4 -4
- package/server/modules/mcp-gateway/tests/mcp-auth.test.ts +3 -1
- package/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.ts +3 -2
- package/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.ts +7 -3
- package/server/modules/mcp-gateway/tests/mcp-correlation-id.test.ts +8 -8
- package/server/modules/mcp-gateway/tests/mcp-draft.test.ts +3 -2
- package/server/modules/mcp-gateway/tests/mcp-english-only.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-gateway-wiring.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-knowledge-facts.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.ts +3 -2
- package/server/modules/mcp-gateway/tests/mcp-overview.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-pending-interaction.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-read-tools.test.ts +3 -3
- package/server/modules/mcp-gateway/tests/mcp-run-get.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-self-target.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-session-background.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-session-host-control.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-session-search-pruning.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-session-search.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-session-send.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-ui-last-opened.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-usage-stats.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-write-notification.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/oauth-flow.e2e.test.ts +3 -3
- package/server/modules/notifications/services/notification-orchestrator.service.js +1 -1
- package/server/modules/oauth/access-tokens.service.ts +8 -8
- package/server/modules/oauth/oauth-consent.service.ts +20 -15
- package/server/modules/oauth/tests/access-token-scopes.test.ts +55 -34
- package/server/modules/oauth/tests/access-tokens.service.test.ts +50 -14
- package/server/modules/oauth/tests/oauth-consent-page.test.ts +29 -21
- package/server/modules/oauth/tests/oauth-consent-ratelimit.test.ts +2 -2
- package/server/modules/oauth/tests/token-info.routes.test.ts +2 -2
- package/server/modules/observation/architecture-delta.producer.ts +1 -1
- package/server/modules/observation/blind-spots.ts +1 -1
- package/server/modules/observation/observation-store.ts +54 -16
- package/server/modules/observation/observation-uri.ts +34 -21
- package/server/modules/observation/observation.routes.ts +1 -1
- package/server/modules/observation/project-truth.ts +3 -3
- package/server/modules/observation/session-ask-decision-answer.ts +2 -1
- package/server/modules/observation/session-digest-llm.ts +7 -1
- package/server/modules/observation/session-digest.ts +39 -5
- package/server/modules/observation/tests/architecture-delta.test.ts +1 -1
- package/server/modules/observation/tests/observation-routes.test.ts +13 -0
- package/server/modules/observation/tests/observation-store.test.ts +58 -0
- package/server/modules/observation/tests/project-truth.test.ts +2 -2
- package/server/modules/observation/tests/session-ask-decision-digest.test.ts +189 -0
- package/server/modules/observation/tests/session-digest.test.ts +43 -0
- package/server/modules/providers/index.ts +13 -0
- package/server/modules/providers/list/claude/claude-host-driver.provider.ts +1 -1
- package/server/modules/providers/list/codex/codex-app-server.client.ts +37 -5
- package/server/modules/providers/list/codex/codex-app-server.connection.ts +1 -1
- package/server/modules/providers/list/codex/codex-host-driver.contract.ts +18 -9
- package/server/modules/providers/list/codex/codex-host-driver.provider.ts +15 -1
- package/server/modules/providers/list/codex/codex-models.provider.ts +16 -3
- package/server/modules/providers/list/codex/codex-provider-injection.ts +323 -0
- package/server/modules/providers/list/codex/codex-resident-provider-launch.ts +71 -0
- package/server/modules/providers/list/codex/codex-runtime.provider.ts +20 -1
- package/server/modules/providers/list/cursor/cursor-models.provider.ts +1 -1
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +1 -1
- package/server/modules/providers/provider.routes.ts +23 -2
- package/server/modules/providers/services/provider-models.service.ts +187 -124
- package/server/modules/providers/services/provider-runtime.service.ts +3 -0
- package/server/modules/providers/services/session-model-resolver.ts +180 -0
- package/server/modules/providers/services/session-provider-binding.ts +176 -0
- package/server/modules/providers/services/sessions.service.ts +5 -1
- package/server/modules/providers/tests/claude-resident-addressable.test.ts +2 -2
- package/server/modules/providers/tests/claude-session-name-authority.test.ts +4 -4
- package/server/modules/providers/tests/codex-app-server-protocol.test.ts +1 -1
- package/server/modules/providers/tests/codex-host-driver-persistent.test.ts +2 -2
- package/server/modules/providers/tests/codex-provider-model-binding.test.ts +345 -0
- package/server/modules/providers/tests/codex-resident-provider-injection.test.ts +561 -0
- package/server/modules/providers/tests/codex-runtime-provider-injection.test.ts +269 -0
- package/server/modules/providers/tests/codex-session-provider-binding.test.ts +386 -0
- package/server/modules/providers/tests/codex-sessions.test.ts +1 -1
- package/server/modules/providers/tests/opencode-sessions.test.ts +2 -2
- package/server/modules/providers/tests/provider-models.service.test.ts +15 -0
- package/server/modules/providers/tests/provider.routes.test.ts +1 -1
- package/server/modules/quay/index.ts +1 -1
- package/server/modules/quay/quay-dispatch-carrier.ts +1 -1
- package/server/modules/quay/quay-fleet-cli.ts +1 -1
- package/server/modules/quay/quay-fleet-locator.ts +2 -2
- package/server/modules/quay/quay-fleet-project-id.ts +14 -14
- package/server/modules/quay/quay-fleet-registry.ts +8 -8
- package/server/modules/quay/quay-suite-fanin-reader.ts +1 -1
- package/server/modules/quay/quay-uri-resolve.ts +8 -8
- package/server/modules/quay/quay.module.ts +3 -3
- package/server/modules/quay/quay.routes.ts +1 -1
- package/server/modules/quay/quay.service.ts +6 -6
- package/server/modules/quay/session-task-chain.service.ts +1 -1
- package/server/modules/quay/tests/contracts/fleet-cli-contracts.test.ts +3 -3
- package/server/modules/quay/tests/contracts/shapes.ts +10 -10
- package/server/modules/quay/tests/quay-fleet-locator.test.ts +1 -1
- package/server/modules/quay/tests/quay-fleet-project-id.test.ts +6 -6
- package/server/modules/quay/tests/quay-uri-resolve.test.ts +10 -10
- package/server/modules/session-hosts/tests/resident-server-restart.test.ts +1 -1
- package/server/modules/settings/codex-mcp-gateway.settings.ts +1 -1
- package/server/modules/settings/codex-model-providers.schema.ts +460 -0
- package/server/modules/settings/codex-model-providers.service.ts +235 -0
- package/server/modules/settings/codex-model-providers.settings.ts +713 -0
- package/server/modules/settings/codex-model-providers.store.ts +244 -0
- package/server/modules/settings/index.ts +18 -0
- package/server/modules/settings/server-settings-file.ts +29 -41
- package/server/modules/settings/server-settings.ts +2 -3
- package/server/modules/settings/settings.module.ts +41 -0
- package/server/modules/settings/settings.routes.ts +37 -0
- package/server/modules/settings/settings.service.ts +21 -26
- package/server/modules/settings/tests/cockpit-session-start-settings.routes.test.ts +1 -0
- package/server/modules/settings/tests/codex-model-providers-settings.test.ts +413 -0
- package/server/modules/settings/tests/codex-provider-advanced.test.ts +540 -0
- package/server/modules/settings/tests/codex-provider-import.test.ts +621 -0
- package/server/modules/voice/tests/voice-lexicon.test.ts +10 -10
- package/server/modules/voice/voice-lexicon.ts +1 -1
- package/server/modules/websocket/services/chat-control.service.ts +35 -2
- package/server/modules/websocket/services/chat-websocket.service.ts +25 -1
- package/server/modules/websocket/tests/chat-background-task.test.ts +17 -1
- package/server/modules/websocket/tests/chat-stop-task.test.ts +17 -1
- package/server/modules/worktrees/services/worktree-list.service.ts +1 -1
- package/server/modules/worktrees/services/worktree-open.service.ts +1 -1
- package/server/modules/worktrees/services/worktree-remove.service.ts +1 -1
- package/server/shared/brand.ts +24 -38
- package/server/shared/data-root-migration.ts +3 -2
- package/server/shared/data-root.ts +73 -79
- package/server/shared/interfaces.ts +1 -1
- package/server/shared/mcp-contract/types.ts +20 -15
- package/server/shared/ports/codex-provider-registry.port.ts +133 -0
- package/server/shared/ports/session-blocked-events.port.ts +1 -1
- package/server/shared/ports/session-run-events.port.ts +2 -2
- package/server/shared/settings-file.ts +167 -6
- package/server/shared/tests/architecture-ratchet.baseline.json +15 -15
- package/server/shared/tests/cloudpit-brand-env.test.ts +106 -36
- package/server/shared/tests/cloudpit-data-root.test.ts +42 -18
- package/server/shared/tests/cloudpit-goal-exit-gate.baseline.json +6 -2
- package/server/shared/tests/cloudpit-goal-exit-gate.test.ts +179 -17
- package/server/shared/tests/cloudpit-runtime-flip.test.ts +162 -123
- package/server/shared/tests/frontend-import-cycle-budget.baseline.json +8 -6
- package/server/shared/tests/frontend-import-cycle-budget.test.ts +9 -1
- package/server/shared/tests/quay-test-script.test.ts +40 -6
- package/server/shared/tests/settings-file.test.ts +83 -1
- package/server/shared/types.ts +121 -8
- package/server/shared/utils.ts +1 -1
- package/dist/assets/channel-D7XqNTJC.js +0 -1
- package/dist/assets/channel-sbQyI1an.js +0 -1
- package/dist/assets/classDiagram-JCYQIIEL-DHudi-zH.js +0 -1
- package/dist/assets/classDiagram-JCYQIIEL-DV7ybJJG.js +0 -1
- package/dist/assets/classDiagram-v2-OCEON4UE-DHudi-zH.js +0 -1
- package/dist/assets/classDiagram-v2-OCEON4UE-DV7ybJJG.js +0 -1
- package/dist/assets/index-BsACp0s2.css +0 -32
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-CNMNp6YA.js +0 -8
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-DOjtDEUW.js +0 -8
- package/dist/icons/icon-128x128.svg +0 -12
- package/dist/icons/icon-144x144.svg +0 -12
- package/dist/icons/icon-152x152.svg +0 -12
- package/dist/icons/icon-192x192.svg +0 -12
- package/dist/icons/icon-384x384.svg +0 -12
- package/dist/icons/icon-512x512.svg +0 -12
- package/dist/icons/icon-72x72.svg +0 -12
- package/dist/icons/icon-96x96.svg +0 -12
- package/dist/icons/icon-template.svg +0 -12
|
@@ -25,13 +25,14 @@
|
|
|
25
25
|
|
|
26
26
|
import assert from 'node:assert/strict';
|
|
27
27
|
import { execFileSync, spawnSync } from 'node:child_process';
|
|
28
|
-
import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
28
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
29
29
|
import os from 'node:os';
|
|
30
30
|
import path from 'node:path';
|
|
31
31
|
import test from 'node:test';
|
|
32
32
|
import { fileURLToPath } from 'node:url';
|
|
33
33
|
|
|
34
34
|
import {
|
|
35
|
+
CURRENT_DOC_SURFACES,
|
|
35
36
|
SCANNED_SURFACES,
|
|
36
37
|
checkDistributionIdentity,
|
|
37
38
|
checkPackedManifest,
|
|
@@ -58,6 +59,19 @@ const REQUIRED_SURFACES = [
|
|
|
58
59
|
'index.html',
|
|
59
60
|
'public/manifest.json',
|
|
60
61
|
'README.md',
|
|
62
|
+
'CONTRIBUTING.md',
|
|
63
|
+
'docs/README.de.md',
|
|
64
|
+
'docs/README.ja.md',
|
|
65
|
+
'docs/README.ko.md',
|
|
66
|
+
'docs/README.ru.md',
|
|
67
|
+
'docs/README.tr.md',
|
|
68
|
+
'docs/README.zh-CN.md',
|
|
69
|
+
'docs/README.zh-TW.md',
|
|
70
|
+
'docs/architecture/cockpit-attention/01-planes.puml',
|
|
71
|
+
'docs/architecture/cockpit-attention/CARD-PROVIDERS.md',
|
|
72
|
+
'docs/architecture/cockpit-attention/INTERACTION-PRINCIPLES.md',
|
|
73
|
+
'docs/architecture/cockpit-attention/README.md',
|
|
74
|
+
'docs/architecture/knowledge-application/FACT-CONTRACT.md',
|
|
61
75
|
'src/modules/i18n/locales/**/*.json',
|
|
62
76
|
'src/shared/utils.ts',
|
|
63
77
|
'src/modules/chat-session/utils/session/pageTitleNotification.ts',
|
|
@@ -322,3 +336,258 @@ test('AC7: the deprecated package name is a violation on update paths', () => {
|
|
|
322
336
|
assert.equal(violationsFor('npm show @yalehwang/cloudcli version').length, 1);
|
|
323
337
|
assert.equal(violationsFor('npm update -g @yalehwang/cloudcli').length, 1);
|
|
324
338
|
});
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* The current-documentation sweep: the docs a reader lands on today. Historical surfaces
|
|
342
|
+
* (`docs/proposals/`, `docs/experiments/`, `adr/`, `CHANGELOG.md`, `NOTICE`, `LICENSE`) are
|
|
343
|
+
* deliberately absent and must stay untouched.
|
|
344
|
+
*/
|
|
345
|
+
const REQUIRED_DOC_SURFACES = [
|
|
346
|
+
'README.md',
|
|
347
|
+
'CONTRIBUTING.md',
|
|
348
|
+
'docs/README.de.md',
|
|
349
|
+
'docs/README.ja.md',
|
|
350
|
+
'docs/README.ko.md',
|
|
351
|
+
'docs/README.ru.md',
|
|
352
|
+
'docs/README.tr.md',
|
|
353
|
+
'docs/README.zh-CN.md',
|
|
354
|
+
'docs/README.zh-TW.md',
|
|
355
|
+
'docs/architecture/cockpit-attention/01-planes.puml',
|
|
356
|
+
'docs/architecture/cockpit-attention/CARD-PROVIDERS.md',
|
|
357
|
+
'docs/architecture/cockpit-attention/INTERACTION-PRINCIPLES.md',
|
|
358
|
+
'docs/architecture/cockpit-attention/README.md',
|
|
359
|
+
'docs/architecture/knowledge-application/FACT-CONTRACT.md',
|
|
360
|
+
];
|
|
361
|
+
|
|
362
|
+
test('current docs: the declared doc surfaces cover every named file and the real tree is green', () => {
|
|
363
|
+
const declaredDocGlobs = CURRENT_DOC_SURFACES.map((surface) => surface.glob).sort();
|
|
364
|
+
assert.deepEqual(
|
|
365
|
+
declaredDocGlobs,
|
|
366
|
+
[...REQUIRED_DOC_SURFACES].sort(),
|
|
367
|
+
'CURRENT_DOC_SURFACES must list exactly the current-doc surfaces the task names',
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
const scannedGlobs = new Set(SCANNED_SURFACES.map((surface) => surface.glob));
|
|
371
|
+
for (const required of REQUIRED_DOC_SURFACES) {
|
|
372
|
+
assert.ok(scannedGlobs.has(required), `the scan surface list must include ${required}`);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const result = runBrandAllowlistCheck({ root: ROOT });
|
|
376
|
+
assert.deepEqual(result.violations, [], JSON.stringify(result.violations, null, 2));
|
|
377
|
+
assert.equal(result.exitCode, 0);
|
|
378
|
+
assert.equal(
|
|
379
|
+
result.readings.docSurfaces,
|
|
380
|
+
REQUIRED_DOC_SURFACES.length,
|
|
381
|
+
`the docSurfaces reading must cover every named path, got ${result.readings.docSurfaces}`,
|
|
382
|
+
);
|
|
383
|
+
assert.deepEqual(
|
|
384
|
+
[...result.readings.docSurfaceFiles].sort(),
|
|
385
|
+
[...REQUIRED_DOC_SURFACES].sort(),
|
|
386
|
+
'the checked doc-surface files must be exactly the named paths',
|
|
387
|
+
);
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
test('current docs: injecting CloudCLI into a README H1, a translated H1 and an architecture doc reds the scan', () => {
|
|
391
|
+
const cases = [
|
|
392
|
+
{
|
|
393
|
+
file: 'README.md',
|
|
394
|
+
text: read('README.md').replace('<h1>Cloudpit</h1>', '<h1>CloudCLI</h1>'),
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
file: 'docs/README.ja.md',
|
|
398
|
+
text: read('docs/README.ja.md').replace('<h1>Cloudpit', '<h1>CloudCLI'),
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
file: 'docs/architecture/cockpit-attention/README.md',
|
|
402
|
+
text: `${read('docs/architecture/cockpit-attention/README.md')}\nCloudCLI 只做只读投影。\n`,
|
|
403
|
+
},
|
|
404
|
+
];
|
|
405
|
+
|
|
406
|
+
for (const { file, text } of cases) {
|
|
407
|
+
assert.notEqual(text, read(file), `${file}: the false-form override must change the file`);
|
|
408
|
+
const result = runBrandAllowlistCheck({ root: ROOT, overrides: { [file]: text } });
|
|
409
|
+
assert.equal(result.exitCode, 1, `${file}: injecting CloudCLI must fail the check`);
|
|
410
|
+
assert.ok(
|
|
411
|
+
result.violations.some(
|
|
412
|
+
(violation) => violation.file === file && violation.message.includes('CloudCLI'),
|
|
413
|
+
),
|
|
414
|
+
`${file}: the violation must name the file, got ${JSON.stringify(result.violations)}`,
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// The head scan must not widen the allowlist: upstream attribution prose in a translated
|
|
419
|
+
// README body is expected to keep `CloudCLI UI` and stays outside the scanned lines.
|
|
420
|
+
const jaBodyOverride = `${read('docs/README.ja.md')}\nCloudCLI UI は上流の製品名です。\n`;
|
|
421
|
+
const bodyResult = runBrandAllowlistCheck({
|
|
422
|
+
root: ROOT,
|
|
423
|
+
overrides: { 'docs/README.ja.md': jaBodyOverride },
|
|
424
|
+
});
|
|
425
|
+
assert.equal(
|
|
426
|
+
bodyResult.exitCode,
|
|
427
|
+
0,
|
|
428
|
+
`translated-README body attribution must stay outside the head scan:\n${JSON.stringify(bodyResult.violations, null, 2)}`,
|
|
429
|
+
);
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
test('AC8: the code-wide CloudCLI sweep scans every text line and its allowlist is file-scoped', () => {
|
|
433
|
+
const brandLineGlobs = SCANNED_SURFACES
|
|
434
|
+
.filter((surface) => surface.kind === 'brand-lines')
|
|
435
|
+
.map((surface) => surface.glob);
|
|
436
|
+
for (const required of ['server/**', 'src/**', 'electron/**', 'scripts/**', 'public/**']) {
|
|
437
|
+
assert.ok(brandLineGlobs.includes(required), `the code-wide sweep must cover ${required}`);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const result = runBrandAllowlistCheck({ root: ROOT });
|
|
441
|
+
assert.equal(result.exitCode, 0, JSON.stringify(result.violations, null, 2));
|
|
442
|
+
assert.ok(
|
|
443
|
+
result.readings.brandLineFiles > 1500,
|
|
444
|
+
`the code-wide sweep must expand over the source tree, got ${result.readings.brandLineFiles} files`,
|
|
445
|
+
);
|
|
446
|
+
|
|
447
|
+
const brandLineFiles = new Set(
|
|
448
|
+
result.sources.filter((source) => source.brandLines).map((source) => source.file),
|
|
449
|
+
);
|
|
450
|
+
for (const unscannable of [
|
|
451
|
+
'server/shared/tests/architecture-ratchet.baseline.json',
|
|
452
|
+
'server/modules/quay/tests/contracts/README.md',
|
|
453
|
+
'scripts/brand-allowlist-check.mjs',
|
|
454
|
+
'scripts/brand-allowlist-check.test.mjs',
|
|
455
|
+
]) {
|
|
456
|
+
assert.ok(!brandLineFiles.has(unscannable), `${unscannable} must stay outside the sweep`);
|
|
457
|
+
}
|
|
458
|
+
for (const file of brandLineFiles) {
|
|
459
|
+
assert.match(file, /\.(?:ts|tsx|js|mjs|cjs|sh|html)$/, `${file} is not a text source extension`);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// Negative control 1: a user-visible notification title.
|
|
463
|
+
const notificationFile = 'server/modules/notifications/services/notification-orchestrator.service.js';
|
|
464
|
+
const notificationResult = runBrandAllowlistCheck({
|
|
465
|
+
root: ROOT,
|
|
466
|
+
overrides: {
|
|
467
|
+
[notificationFile]: read(notificationFile)
|
|
468
|
+
.replace("title: sessionName || 'Cloudpit'", "title: sessionName || 'CloudCLI'"),
|
|
469
|
+
},
|
|
470
|
+
});
|
|
471
|
+
assert.equal(notificationResult.exitCode, 1, 'a CloudCLI notification title must red the sweep');
|
|
472
|
+
assert.ok(notificationResult.violations.some((violation) => violation.file === notificationFile));
|
|
473
|
+
|
|
474
|
+
// Negative control 2: a comment line in shipped backend source (the `code` kind skips these,
|
|
475
|
+
// the code-wide sweep must not).
|
|
476
|
+
const schemaFile = 'server/modules/database/schema.ts';
|
|
477
|
+
const commentResult = runBrandAllowlistCheck({
|
|
478
|
+
root: ROOT,
|
|
479
|
+
overrides: { [schemaFile]: ' * the CloudCLI project id.\n' },
|
|
480
|
+
});
|
|
481
|
+
assert.equal(commentResult.exitCode, 1, 'a CloudCLI comment must red the sweep');
|
|
482
|
+
assert.ok(
|
|
483
|
+
commentResult.violations.some(
|
|
484
|
+
(violation) => violation.file === schemaFile && violation.message.includes('CloudCLI'),
|
|
485
|
+
),
|
|
486
|
+
);
|
|
487
|
+
|
|
488
|
+
// Positive control: the third-party plugin name stays green in the same sweep.
|
|
489
|
+
const prismResult = runBrandAllowlistCheck({
|
|
490
|
+
root: ROOT,
|
|
491
|
+
overrides: { [notificationFile]: `${read(notificationFile)}\n// PRISM CloudCLI\n` },
|
|
492
|
+
});
|
|
493
|
+
assert.equal(
|
|
494
|
+
prismResult.exitCode,
|
|
495
|
+
0,
|
|
496
|
+
`PRISM CloudCLI must stay allowlisted:\n${JSON.stringify(prismResult.violations, null, 2)}`,
|
|
497
|
+
);
|
|
498
|
+
|
|
499
|
+
// File scoping: the legacy literal is allowed inside the migration module and its tests, but
|
|
500
|
+
// the same token in product code is a violation.
|
|
501
|
+
const legacyFile = 'electron/userDataMigration.js';
|
|
502
|
+
const legacyResult = runBrandAllowlistCheck({
|
|
503
|
+
root: ROOT,
|
|
504
|
+
overrides: { [legacyFile]: `${read(legacyFile)}\nconst legacyTitle = 'CloudCLI';\n` },
|
|
505
|
+
});
|
|
506
|
+
assert.equal(legacyResult.exitCode, 0, 'the legacy install literal must stay allowed in its own file');
|
|
507
|
+
|
|
508
|
+
const productResult = runBrandAllowlistCheck({
|
|
509
|
+
root: ROOT,
|
|
510
|
+
overrides: { 'electron/cloud.js': "throw new Error('CloudCLI');\n" },
|
|
511
|
+
});
|
|
512
|
+
assert.equal(productResult.exitCode, 1, 'the legacy allowlist must not leak into another file');
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* Build a deterministic checkout fixture for the generated-cache regression. The real main
|
|
517
|
+
* checkout carried the e2e bundle cache under `server/node_modules/.cache`; a task worktree did
|
|
518
|
+
* not, so an arm that read the real tree would be green or red depending on where it ran. This
|
|
519
|
+
* fixture models both shapes at once — a generated cache next to real source — and supplies
|
|
520
|
+
* every declared surface the fixture does not model as an override, so no read ever depends on
|
|
521
|
+
* the host checkout.
|
|
522
|
+
*
|
|
523
|
+
* @returns {{ root: string, overrides: Record<string, string>, staleModule: string, gitHook: string, sourceFile: string }}
|
|
524
|
+
*/
|
|
525
|
+
function makeCacheFixture() {
|
|
526
|
+
const root = mkdtempSync(path.join(os.tmpdir(), 'cloudpit-brand-fixture-'));
|
|
527
|
+
for (const surface of SCANNED_SURFACES) {
|
|
528
|
+
const wildcardIndex = surface.glob.indexOf('/**');
|
|
529
|
+
if (wildcardIndex !== -1) {
|
|
530
|
+
mkdirSync(path.join(root, surface.glob.slice(0, wildcardIndex)), { recursive: true });
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
const staleModule = 'server/node_modules/.cache/quay-e2e-build/stale.mjs';
|
|
535
|
+
const gitHook = 'server/.git/hooks/pre-commit.sh';
|
|
536
|
+
const sourceFile = 'server/modules/demo/source.ts';
|
|
537
|
+
mkdirSync(path.dirname(path.join(root, staleModule)), { recursive: true });
|
|
538
|
+
mkdirSync(path.dirname(path.join(root, gitHook)), { recursive: true });
|
|
539
|
+
mkdirSync(path.dirname(path.join(root, sourceFile)), { recursive: true });
|
|
540
|
+
writeFileSync(path.join(root, staleModule), "export const stale = 'CloudCLI';\n");
|
|
541
|
+
writeFileSync(path.join(root, gitHook), 'echo CloudCLI\n');
|
|
542
|
+
writeFileSync(path.join(root, sourceFile), "export const brand = 'Cloudpit';\n");
|
|
543
|
+
writeFileSync(path.join(root, 'package.json'), JSON.stringify({
|
|
544
|
+
name: '@yalehwang/cloudpit',
|
|
545
|
+
bin: { cloudpit: 'dist-server/server/modules/cli/cli.js' },
|
|
546
|
+
productName: 'Cloudpit',
|
|
547
|
+
build: { productName: 'Cloudpit', artifactName: 'cloudpit-desktop-fixture' },
|
|
548
|
+
}));
|
|
549
|
+
|
|
550
|
+
/** @type {Record<string, string>} */
|
|
551
|
+
const overrides = {};
|
|
552
|
+
for (const surface of SCANNED_SURFACES) {
|
|
553
|
+
if (surface.glob.includes('/**')) continue;
|
|
554
|
+
if (existsSync(path.join(root, surface.glob))) continue;
|
|
555
|
+
overrides[surface.glob] = surface.kind === 'json-values' ? '{}' : '';
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
return { root, overrides, staleModule, gitHook, sourceFile };
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
test('regression: the code-wide sweep skips node_modules and .git caches but still reds real source', () => {
|
|
562
|
+
const { root, overrides, staleModule, gitHook, sourceFile } = makeCacheFixture();
|
|
563
|
+
try {
|
|
564
|
+
// The fixture is only meaningful if the skipped files really carry the swept token.
|
|
565
|
+
assert.match(readFileSync(path.join(root, staleModule), 'utf8'), /CloudCLI/, 'the cache fixture must carry CloudCLI');
|
|
566
|
+
assert.match(readFileSync(path.join(root, gitHook), 'utf8'), /CloudCLI/, 'the .git fixture must carry CloudCLI');
|
|
567
|
+
|
|
568
|
+
const green = runBrandAllowlistCheck({ root, overrides });
|
|
569
|
+
assert.deepEqual(green.violations, [], JSON.stringify(green.violations, null, 2));
|
|
570
|
+
assert.equal(green.exitCode, 0, 'a generated node_modules cache must not red the brand sweep');
|
|
571
|
+
|
|
572
|
+
const scannedFiles = new Set(green.sources.map((source) => source.file));
|
|
573
|
+
assert.ok(scannedFiles.has(sourceFile), 'the sweep must still reach real source under server/');
|
|
574
|
+
assert.ok(!scannedFiles.has(staleModule), 'the generated cache must stay outside the sweep');
|
|
575
|
+
assert.ok(!scannedFiles.has(gitHook), '.git internals must stay outside the sweep');
|
|
576
|
+
assert.ok(
|
|
577
|
+
[...scannedFiles].every((file) => !file.split('/').includes('node_modules')),
|
|
578
|
+
'no file with a node_modules path segment may be scanned',
|
|
579
|
+
);
|
|
580
|
+
|
|
581
|
+
const red = runBrandAllowlistCheck({
|
|
582
|
+
root,
|
|
583
|
+
overrides: { ...overrides, [sourceFile]: "export const brand = 'CloudCLI';\n" },
|
|
584
|
+
});
|
|
585
|
+
assert.equal(red.exitCode, 1, 'real source carrying CloudCLI must still red the sweep');
|
|
586
|
+
assert.ok(
|
|
587
|
+
red.violations.some((violation) => violation.file === sourceFile),
|
|
588
|
+
`the violation must name the source file, got ${JSON.stringify(red.violations)}`,
|
|
589
|
+
);
|
|
590
|
+
} finally {
|
|
591
|
+
rmSync(root, { recursive: true, force: true });
|
|
592
|
+
}
|
|
593
|
+
});
|
|
@@ -5,11 +5,17 @@
|
|
|
5
5
|
* AC-454 asks whether the *external* release actually happened:
|
|
6
6
|
*
|
|
7
7
|
* - `@yalehwang/cloudcli@1.42.0` is deprecated and the notice points at the new package;
|
|
8
|
-
* - `@yalehwang/cloudpit
|
|
8
|
+
* - `@yalehwang/cloudpit@<version>` is published and its packed tarball exposes only the
|
|
9
9
|
* `cloudpit` bin;
|
|
10
10
|
* - the `yaleh/cloudpit` repository URL, homepage, repository and bugs fields resolve;
|
|
11
|
-
* - the desktop `cloudpit-desktop-*` and `cloudpit-local-server-
|
|
12
|
-
* are downloadable;
|
|
11
|
+
* - the desktop `cloudpit-desktop-*` and `cloudpit-local-server-v<version>-*` release
|
|
12
|
+
* assets are downloadable;
|
|
13
|
+
*
|
|
14
|
+
* VERSIONED READING. The release being verified is a parameter, not a baked-in target:
|
|
15
|
+
* `NEW_VERSION` (3.0.0) is the default, and `--version <x.y.z>` reads any other release
|
|
16
|
+
* (for example the historical `--version 2.0.0` reading of AC-458's 2.0.0 release). The
|
|
17
|
+
* npm version document, the packed-manifest lookup, the GitHub release tag and the
|
|
18
|
+
* local-server asset prefix all derive from that one value.
|
|
13
19
|
* - README/NOTICE/LICENSE still carry the upstream CloudCLI UI attribution.
|
|
14
20
|
*
|
|
15
21
|
* ONE JUDGEMENT PATH. `distributionViolations(snapshot)` is the only place those six checks are
|
|
@@ -35,16 +41,23 @@ import { fileURLToPath } from 'node:url';
|
|
|
35
41
|
/** The final legacy package, deprecated in favour of the new name. */
|
|
36
42
|
export const OLD_PACKAGE = '@yalehwang/cloudcli';
|
|
37
43
|
export const OLD_VERSION = '1.42.0';
|
|
38
|
-
/** The renamed package and the version
|
|
44
|
+
/** The renamed package and the default version this verifier reads. */
|
|
39
45
|
export const NEW_PACKAGE = '@yalehwang/cloudpit';
|
|
40
|
-
|
|
46
|
+
/** The release the default reading targets; `--version` overrides it per invocation. */
|
|
47
|
+
export const NEW_VERSION = '3.0.0';
|
|
41
48
|
/** The repository the rename points every URL field at. */
|
|
42
49
|
export const REPOSITORY = 'yaleh/cloudpit';
|
|
43
50
|
/** The attribution token the upstream licence terms require the documents to keep. */
|
|
44
51
|
export const ATTRIBUTION = 'CloudCLI UI';
|
|
45
52
|
/** Asset-name prefixes the desktop release must publish. */
|
|
46
53
|
export const DESKTOP_ASSET_PREFIX = 'cloudpit-desktop-';
|
|
47
|
-
|
|
54
|
+
/** The local-server asset prefix for one release version (defaults to {@link NEW_VERSION}). */
|
|
55
|
+
export function localServerAssetPrefix(version = NEW_VERSION) {
|
|
56
|
+
return `cloudpit-local-server-v${version}-`;
|
|
57
|
+
}
|
|
58
|
+
export const LOCAL_SERVER_ASSET_PREFIX = localServerAssetPrefix(NEW_VERSION);
|
|
59
|
+
/** A semver-shaped release version accepted by `--version`. */
|
|
60
|
+
const VERSION_PATTERN = /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;
|
|
48
61
|
/** The repository fields AC-454 names. */
|
|
49
62
|
export const REQUIRED_REPOSITORY_FIELDS = ['url', 'homepage', 'repository', 'bugs'];
|
|
50
63
|
/** The six check groups, in one place so a count in a reading cannot drift from the judgements. */
|
|
@@ -128,9 +141,10 @@ const EXPECTED_REPOSITORY_PATHS = {
|
|
|
128
141
|
* `collectReleaseSnapshot`, callers that want an offline reading use `loadSnapshotFromFile`.
|
|
129
142
|
*
|
|
130
143
|
* @param {DistributionSnapshot | null | undefined} snapshot
|
|
144
|
+
* @param {{ version?: string }} [options] release version to judge (defaults to NEW_VERSION)
|
|
131
145
|
* @returns {DistributionViolation[]}
|
|
132
146
|
*/
|
|
133
|
-
export function distributionViolations(snapshot) {
|
|
147
|
+
export function distributionViolations(snapshot, { version = NEW_VERSION } = {}) {
|
|
134
148
|
/** @type {DistributionViolation[]} */
|
|
135
149
|
const violations = [];
|
|
136
150
|
const npm = snapshot?.npm;
|
|
@@ -160,12 +174,12 @@ export function distributionViolations(snapshot) {
|
|
|
160
174
|
if (
|
|
161
175
|
!newPackage
|
|
162
176
|
|| newPackage.name !== NEW_PACKAGE
|
|
163
|
-
|| newPackage.version !==
|
|
177
|
+
|| newPackage.version !== version
|
|
164
178
|
|| newPackage.published !== true
|
|
165
179
|
) {
|
|
166
180
|
violations.push(violation(
|
|
167
181
|
'new-package',
|
|
168
|
-
`new package ${NEW_PACKAGE}@${
|
|
182
|
+
`new package ${NEW_PACKAGE}@${version} is not published`,
|
|
169
183
|
));
|
|
170
184
|
}
|
|
171
185
|
if (newPackage) {
|
|
@@ -226,7 +240,7 @@ export function distributionViolations(snapshot) {
|
|
|
226
240
|
&& asset.name.startsWith(prefix)
|
|
227
241
|
&& asset.downloadable === true
|
|
228
242
|
));
|
|
229
|
-
for (const prefix of [DESKTOP_ASSET_PREFIX,
|
|
243
|
+
for (const prefix of [DESKTOP_ASSET_PREFIX, localServerAssetPrefix(version)]) {
|
|
230
244
|
if (!downloadable(prefix)) {
|
|
231
245
|
violations.push(violation(
|
|
232
246
|
'desktop-assets',
|
|
@@ -396,16 +410,17 @@ async function repositoryField(fetchImpl, field, url) {
|
|
|
396
410
|
/**
|
|
397
411
|
* @param {typeof fetch} fetchImpl
|
|
398
412
|
* @param {any} release
|
|
413
|
+
* @param {string} version
|
|
399
414
|
* @returns {Promise<ReleaseAssetSnapshot[]>}
|
|
400
415
|
*/
|
|
401
|
-
async function releaseAssets(fetchImpl, release) {
|
|
416
|
+
async function releaseAssets(fetchImpl, release, version) {
|
|
402
417
|
/** @type {any[]} */
|
|
403
418
|
const raw = Array.isArray(release?.assets) ? release.assets : [];
|
|
404
419
|
return Promise.all(raw.map(async (asset) => {
|
|
405
420
|
const name = String(asset?.name ?? '');
|
|
406
421
|
const url = String(asset?.browser_download_url ?? '');
|
|
407
422
|
const isCandidate = name.startsWith(DESKTOP_ASSET_PREFIX)
|
|
408
|
-
|| name.startsWith(
|
|
423
|
+
|| name.startsWith(localServerAssetPrefix(version));
|
|
409
424
|
const downloadable = asset?.state === 'uploaded'
|
|
410
425
|
&& (isCandidate ? await resolves(fetchImpl, url) : true);
|
|
411
426
|
return { name, url, downloadable };
|
|
@@ -428,6 +443,7 @@ async function releaseAssets(fetchImpl, release) {
|
|
|
428
443
|
* root?: string,
|
|
429
444
|
* fetchImpl?: typeof fetch,
|
|
430
445
|
* githubToken?: string | undefined,
|
|
446
|
+
* version?: string,
|
|
431
447
|
* }} [options]
|
|
432
448
|
* @returns {Promise<DistributionSnapshot>}
|
|
433
449
|
*/
|
|
@@ -435,6 +451,7 @@ export async function collectReleaseSnapshot({
|
|
|
435
451
|
root = process.cwd(),
|
|
436
452
|
fetchImpl = globalThis.fetch,
|
|
437
453
|
githubToken = process.env.GITHUB_TOKEN,
|
|
454
|
+
version = NEW_VERSION,
|
|
438
455
|
} = {}) {
|
|
439
456
|
if (typeof fetchImpl !== 'function') {
|
|
440
457
|
throw new Error('no fetch implementation is available for --release');
|
|
@@ -445,10 +462,10 @@ export async function collectReleaseSnapshot({
|
|
|
445
462
|
const [oldMetadata, newMetadata, packedManifest, repoMetadata, releaseMetadata] =
|
|
446
463
|
await Promise.all([
|
|
447
464
|
requestJson(fetchImpl, `https://registry.npmjs.org/${encodeURIComponent(OLD_PACKAGE)}/${OLD_VERSION}`),
|
|
448
|
-
requestJson(fetchImpl, `https://registry.npmjs.org/${encodeURIComponent(NEW_PACKAGE)}/${
|
|
449
|
-
requestJson(fetchImpl, `https://unpkg.com/${NEW_PACKAGE}@${
|
|
465
|
+
requestJson(fetchImpl, `https://registry.npmjs.org/${encodeURIComponent(NEW_PACKAGE)}/${version}`),
|
|
466
|
+
requestJson(fetchImpl, `https://unpkg.com/${NEW_PACKAGE}@${version}/package.json`),
|
|
450
467
|
requestJson(fetchImpl, `https://api.github.com/repos/${REPOSITORY}`, { headers: githubHeaders }),
|
|
451
|
-
requestJson(fetchImpl, `https://api.github.com/repos/${REPOSITORY}/releases/tags/v${
|
|
468
|
+
requestJson(fetchImpl, `https://api.github.com/repos/${REPOSITORY}/releases/tags/v${version}`, {
|
|
452
469
|
headers: githubHeaders,
|
|
453
470
|
}),
|
|
454
471
|
]);
|
|
@@ -468,7 +485,7 @@ export async function collectReleaseSnapshot({
|
|
|
468
485
|
},
|
|
469
486
|
newPackage: {
|
|
470
487
|
name: NEW_PACKAGE,
|
|
471
|
-
version
|
|
488
|
+
version,
|
|
472
489
|
published: newMetadata.ok,
|
|
473
490
|
tarballBin,
|
|
474
491
|
},
|
|
@@ -486,7 +503,7 @@ export async function collectReleaseSnapshot({
|
|
|
486
503
|
repositoryField(fetchImpl, 'bugs', packageJson?.bugs?.url),
|
|
487
504
|
]),
|
|
488
505
|
},
|
|
489
|
-
release: { assets: await releaseAssets(fetchImpl, releaseMetadata.body) },
|
|
506
|
+
release: { assets: await releaseAssets(fetchImpl, releaseMetadata.body, version) },
|
|
490
507
|
ownership: {
|
|
491
508
|
readme: readTextOrEmpty(path.join(root, 'README.md')),
|
|
492
509
|
notice: readTextOrEmpty(path.join(root, 'NOTICE')),
|
|
@@ -501,14 +518,16 @@ export function usage() {
|
|
|
501
518
|
'Cloudpit distribution verifier (AC-457 carrier / AC-454 criterion)',
|
|
502
519
|
'',
|
|
503
520
|
'Usage:',
|
|
504
|
-
' node scripts/cloudpit-distribution-check.mjs --release',
|
|
505
|
-
' node scripts/cloudpit-distribution-check.mjs --fixture <snapshot.json> [--json]',
|
|
521
|
+
' node scripts/cloudpit-distribution-check.mjs --release [--version <x.y.z>]',
|
|
522
|
+
' node scripts/cloudpit-distribution-check.mjs --fixture <snapshot.json> [--version <x.y.z>] [--json]',
|
|
506
523
|
' node scripts/cloudpit-distribution-check.mjs --help',
|
|
507
524
|
'',
|
|
508
525
|
'Modes:',
|
|
509
526
|
' --release read npm, GitHub secrets/URLs and the local documents, then judge',
|
|
510
527
|
' --fixture <path> judge a recorded snapshot without network access',
|
|
511
528
|
' --root <dir> repository root for local documents (default: current directory)',
|
|
529
|
+
` --version <x.y.z> release version to verify (default: ${NEW_VERSION}; e.g. 2.0.0`,
|
|
530
|
+
' reads the historical 2.0.0 release)',
|
|
512
531
|
' --json print the verdict and violations as JSON',
|
|
513
532
|
' --help print this help and exit 0',
|
|
514
533
|
'',
|
|
@@ -521,6 +540,7 @@ export function usage() {
|
|
|
521
540
|
* mode: 'release' | 'fixture' | null,
|
|
522
541
|
* fixture: string | null,
|
|
523
542
|
* root: string,
|
|
543
|
+
* version: string | null,
|
|
524
544
|
* json: boolean,
|
|
525
545
|
* help: boolean,
|
|
526
546
|
* error: string | null,
|
|
@@ -532,6 +552,7 @@ function parseArgs(argv) {
|
|
|
532
552
|
mode: null,
|
|
533
553
|
fixture: null,
|
|
534
554
|
root: process.cwd(),
|
|
555
|
+
version: null,
|
|
535
556
|
json: false,
|
|
536
557
|
help: false,
|
|
537
558
|
error: null,
|
|
@@ -552,6 +573,18 @@ function parseArgs(argv) {
|
|
|
552
573
|
} else if (arg === '--root') {
|
|
553
574
|
options.root = path.resolve(argv[index + 1] ?? '.');
|
|
554
575
|
if (argv[index + 1] !== undefined) index += 1;
|
|
576
|
+
} else if (arg === '--version') {
|
|
577
|
+
options.version = argv[index + 1] ?? null;
|
|
578
|
+
if (options.version === null) {
|
|
579
|
+
if (options.error === null) options.error = '--version needs a semver value';
|
|
580
|
+
} else if (!VERSION_PATTERN.test(options.version)) {
|
|
581
|
+
if (options.error === null) {
|
|
582
|
+
options.error = `--version must be a semver version, got ${JSON.stringify(options.version)}`;
|
|
583
|
+
}
|
|
584
|
+
index += 1;
|
|
585
|
+
} else {
|
|
586
|
+
index += 1;
|
|
587
|
+
}
|
|
555
588
|
} else if (arg === '--json') {
|
|
556
589
|
options.json = true;
|
|
557
590
|
} else if (arg === '--help' || arg === '-h') {
|
|
@@ -593,6 +626,7 @@ export async function main(argv = process.argv.slice(2), {
|
|
|
593
626
|
return 2;
|
|
594
627
|
}
|
|
595
628
|
|
|
629
|
+
const version = options.version ?? NEW_VERSION;
|
|
596
630
|
/** @type {DistributionSnapshot} */
|
|
597
631
|
let snapshot;
|
|
598
632
|
/** @type {string} */
|
|
@@ -602,7 +636,7 @@ export async function main(argv = process.argv.slice(2), {
|
|
|
602
636
|
snapshot = loadSnapshotFromFile(/** @type {string} */ (options.fixture));
|
|
603
637
|
source = `fixture:${options.fixture}`;
|
|
604
638
|
} else {
|
|
605
|
-
snapshot = await collectReleaseSnapshot({ root: options.root, fetchImpl });
|
|
639
|
+
snapshot = await collectReleaseSnapshot({ root: options.root, fetchImpl, version });
|
|
606
640
|
source = 'release';
|
|
607
641
|
}
|
|
608
642
|
} catch (error) {
|
|
@@ -610,14 +644,14 @@ export async function main(argv = process.argv.slice(2), {
|
|
|
610
644
|
return 2;
|
|
611
645
|
}
|
|
612
646
|
|
|
613
|
-
const violations = distributionViolations(snapshot);
|
|
647
|
+
const violations = distributionViolations(snapshot, { version });
|
|
614
648
|
const exitCode = violations.length === 0 ? 0 : 1;
|
|
615
649
|
|
|
616
650
|
if (options.json) {
|
|
617
|
-
stdout.log(JSON.stringify({ source, exitCode, checks: CHECKS, violations }, null, 2));
|
|
651
|
+
stdout.log(JSON.stringify({ source, version, exitCode, checks: CHECKS, violations }, null, 2));
|
|
618
652
|
} else {
|
|
619
653
|
stdout.log(
|
|
620
|
-
`cloudpit-distribution: source=${source} checks=${CHECKS.length} `
|
|
654
|
+
`cloudpit-distribution: source=${source} version=${version} checks=${CHECKS.length} `
|
|
621
655
|
+ `violations=${violations.length}`,
|
|
622
656
|
);
|
|
623
657
|
for (const item of violations) {
|
|
@@ -16,6 +16,9 @@
|
|
|
16
16
|
* AC2e — the desktop/local-server assets are missing → red names both asset prefixes.
|
|
17
17
|
* AC2f — the ownership notice is deleted from each doc → red names `ownership`.
|
|
18
18
|
* AC4 — `--help` exits 0 and lists `--release`.
|
|
19
|
+
* AC5 — a 2.0.0 snapshot is red under the 3.0.0 default and green with
|
|
20
|
+
* `--version 2.0.0`: the historical release stays readable without being
|
|
21
|
+
* mistaken for the current one.
|
|
19
22
|
*
|
|
20
23
|
* NOTHING HERE TOUCHES THE NETWORK. Fixture mode reads a JSON file; no arm runs `--release`.
|
|
21
24
|
* The compliant snapshot reads the real README/NOTICE/LICENSE, so a document that loses its
|
|
@@ -40,6 +43,7 @@ import {
|
|
|
40
43
|
OLD_VERSION,
|
|
41
44
|
REPOSITORY,
|
|
42
45
|
distributionViolations,
|
|
46
|
+
localServerAssetPrefix,
|
|
43
47
|
} from './cloudpit-distribution-check.mjs';
|
|
44
48
|
|
|
45
49
|
const HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -86,7 +90,7 @@ function compliantSnapshot() {
|
|
|
86
90
|
},
|
|
87
91
|
release: {
|
|
88
92
|
assets: [
|
|
89
|
-
{ name: `${DESKTOP_ASSET_PREFIX}
|
|
93
|
+
{ name: `${DESKTOP_ASSET_PREFIX}${NEW_VERSION}-linux-x64.deb`, downloadable: true },
|
|
90
94
|
{ name: `${LOCAL_SERVER_ASSET_PREFIX}linux-x64.tar.gz`, downloadable: true },
|
|
91
95
|
],
|
|
92
96
|
},
|
|
@@ -102,14 +106,15 @@ function compliantSnapshot() {
|
|
|
102
106
|
* Run the production CLI against one snapshot in fixture mode.
|
|
103
107
|
*
|
|
104
108
|
* @param {any} snapshot
|
|
109
|
+
* @param {string[]} [extraArgs] additional CLI arguments (e.g. `--version`)
|
|
105
110
|
* @returns {{ status: number | null, stdout: string, stderr: string }}
|
|
106
111
|
*/
|
|
107
|
-
function runFixture(snapshot) {
|
|
112
|
+
function runFixture(snapshot, extraArgs = []) {
|
|
108
113
|
const directory = mkdtempSync(path.join(tmpdir(), 'cloudpit-distribution-'));
|
|
109
114
|
try {
|
|
110
115
|
const fixture = path.join(directory, 'snapshot.json');
|
|
111
116
|
writeFileSync(fixture, JSON.stringify(snapshot), 'utf8');
|
|
112
|
-
const result = spawnSync(process.execPath, [SCRIPT, '--fixture', fixture], {
|
|
117
|
+
const result = spawnSync(process.execPath, [SCRIPT, '--fixture', fixture, ...extraArgs], {
|
|
113
118
|
encoding: 'utf8',
|
|
114
119
|
// The fixture path is the only input; no environment switch can reach the live reader.
|
|
115
120
|
env: { ...process.env, GITHUB_TOKEN: '' },
|
|
@@ -154,7 +159,7 @@ test('AC2b: a new package that is not published reds', () => {
|
|
|
154
159
|
assert.equal(result.status, 1, result.stderr);
|
|
155
160
|
assert.match(
|
|
156
161
|
result.stderr,
|
|
157
|
-
|
|
162
|
+
new RegExp(`new-package: new package @yalehwang/cloudpit@${NEW_VERSION.replaceAll('.', '\\.')} is not published`),
|
|
158
163
|
result.stderr,
|
|
159
164
|
);
|
|
160
165
|
});
|
|
@@ -197,7 +202,7 @@ test('AC2d: each unresolvable repository field reds and is named', () => {
|
|
|
197
202
|
test('AC2e: missing desktop and local-server assets red and name both prefixes', () => {
|
|
198
203
|
const snapshot = compliantSnapshot();
|
|
199
204
|
snapshot.release.assets = [
|
|
200
|
-
{ name: `${DESKTOP_ASSET_PREFIX}
|
|
205
|
+
{ name: `${DESKTOP_ASSET_PREFIX}${NEW_VERSION}-linux-x64.deb`, downloadable: false },
|
|
201
206
|
];
|
|
202
207
|
|
|
203
208
|
const result = runFixture(snapshot);
|
|
@@ -207,9 +212,10 @@ test('AC2e: missing desktop and local-server assets red and name both prefixes',
|
|
|
207
212
|
/desktop release asset cloudpit-desktop-\* is missing or not downloadable/,
|
|
208
213
|
result.stderr,
|
|
209
214
|
);
|
|
210
|
-
assert.
|
|
211
|
-
result.stderr
|
|
212
|
-
|
|
215
|
+
assert.ok(
|
|
216
|
+
result.stderr.includes(
|
|
217
|
+
`desktop release asset ${localServerAssetPrefix(NEW_VERSION)}* is missing or not downloadable`,
|
|
218
|
+
),
|
|
213
219
|
result.stderr,
|
|
214
220
|
);
|
|
215
221
|
});
|
|
@@ -248,8 +254,35 @@ test('AC2f: deleting the ownership notice from each document reds', () => {
|
|
|
248
254
|
}
|
|
249
255
|
});
|
|
250
256
|
|
|
251
|
-
test('AC4: --help exits 0 and lists --release', () => {
|
|
257
|
+
test('AC4: --help exits 0 and lists --release and --version', () => {
|
|
252
258
|
const result = spawnSync(process.execPath, [SCRIPT, '--help'], { encoding: 'utf8' });
|
|
253
259
|
assert.equal(result.status, 0, result.stderr);
|
|
254
260
|
assert.match(result.stdout, /--release/, result.stdout);
|
|
261
|
+
assert.match(result.stdout, /--version/, result.stdout);
|
|
262
|
+
assert.ok(result.stdout.includes(NEW_VERSION), result.stdout);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
test('AC5: the historical 2.0.0 release is readable only through an explicit --version', () => {
|
|
266
|
+
/** @param {string} version @returns {any} */
|
|
267
|
+
const historicalSnapshot = (version) => {
|
|
268
|
+
const snapshot = compliantSnapshot();
|
|
269
|
+
snapshot.npm.newPackage.version = version;
|
|
270
|
+
snapshot.release.assets[0].name = `${DESKTOP_ASSET_PREFIX}${version}-linux-x64.deb`;
|
|
271
|
+
snapshot.release.assets[1].name = `${localServerAssetPrefix(version)}linux-x64.tar.gz`;
|
|
272
|
+
return snapshot;
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
// Negative arm: under the 3.0.0 default the 2.0.0 snapshot is NOT read as the current
|
|
276
|
+
// release — the red names 3.0.0, so a stale 2.0.0 fixture cannot make the default green.
|
|
277
|
+
const asCurrent = runFixture(historicalSnapshot('2.0.0'));
|
|
278
|
+
assert.equal(asCurrent.status, 1, asCurrent.stderr);
|
|
279
|
+
assert.ok(
|
|
280
|
+
asCurrent.stderr.includes(`new package @yalehwang/cloudpit@${NEW_VERSION} is not published`),
|
|
281
|
+
asCurrent.stderr,
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
// Positive arm: the historical release remains verifiable when asked for explicitly.
|
|
285
|
+
const historical = runFixture(historicalSnapshot('2.0.0'), ['--version', '2.0.0']);
|
|
286
|
+
assert.equal(historical.status, 0, historical.stderr);
|
|
287
|
+
assert.match(historical.stdout, /violations=0/, historical.stdout);
|
|
255
288
|
});
|
|
@@ -222,7 +222,7 @@ class AppServerConnection {
|
|
|
222
222
|
async function handshake(connection, experimentalApi) {
|
|
223
223
|
const capabilities = experimentalApi ? { experimentalApi: true } : {};
|
|
224
224
|
const reply = await connection.request('initialize', {
|
|
225
|
-
clientInfo: { name: '
|
|
225
|
+
clientInfo: { name: 'cloudpit', title: 'Cloudpit', version: '1' },
|
|
226
226
|
capabilities,
|
|
227
227
|
});
|
|
228
228
|
connection.notify('initialized', {});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
#
|
|
3
|
-
# A THROWAWAY, SAFE-TO-BOOT
|
|
3
|
+
# A THROWAWAY, SAFE-TO-BOOT Cloudpit instance for verification work.
|
|
4
4
|
#
|
|
5
5
|
# WHY IT EXISTS. Verifying a UI/API change by hand used to mean copying the live auth.db and
|
|
6
6
|
# starting a second server on it. The resident-restore pass is ON by default, so that second
|