@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.
Files changed (690) hide show
  1. package/README.md +1 -1
  2. package/dist/api-docs.html +3 -3
  3. package/dist/assets/{abnfDiagram-N423BO3Z-D5yLnMt9.js → abnfDiagram-N423BO3Z-D7Xt05gV.js} +1 -1
  4. package/dist/assets/{abnfDiagram-N423BO3Z-bTHtQIhR.js → abnfDiagram-N423BO3Z-dmPRRPEm.js} +1 -1
  5. package/dist/assets/{arc-1DmrBEyG.js → arc-B7W3R5qH.js} +1 -1
  6. package/dist/assets/{arc-BlGK--01.js → arc-BHMlIcaQ.js} +1 -1
  7. package/dist/assets/{architectureDiagram-T3A2C74G--lzbKBn9.js → architectureDiagram-T3A2C74G-CUUpAoN0.js} +1 -1
  8. package/dist/assets/{architectureDiagram-T3A2C74G-7lKNAbUU.js → architectureDiagram-T3A2C74G-DpXhbHxu.js} +1 -1
  9. package/dist/assets/{blockDiagram-VBNYF7ZC-17cdO9zs.js → blockDiagram-VBNYF7ZC-Bf0yfNxj.js} +1 -1
  10. package/dist/assets/{blockDiagram-VBNYF7ZC-BPavJfDj.js → blockDiagram-VBNYF7ZC-Cki9AOhc.js} +1 -1
  11. package/dist/assets/{c4Diagram-5PPSVZJV-Bm1-2w3b.js → c4Diagram-5PPSVZJV-DK2RqNDO.js} +1 -1
  12. package/dist/assets/{c4Diagram-5PPSVZJV-aHvFL3Wb.js → c4Diagram-5PPSVZJV-DyhTF0e5.js} +1 -1
  13. package/dist/assets/channel-DTLMNzbH.js +1 -0
  14. package/dist/assets/channel-DiqxUuPf.js +1 -0
  15. package/dist/assets/{chunk-2GRJ4B5K-D7WqZewM.js → chunk-2GRJ4B5K-BYtByJbf.js} +1 -1
  16. package/dist/assets/{chunk-2GRJ4B5K-DbwzBiPF.js → chunk-2GRJ4B5K-CksFgocc.js} +1 -1
  17. package/dist/assets/{chunk-2Q5K7J3B-DdCr89uy.js → chunk-2Q5K7J3B-D2kQa5TZ.js} +1 -1
  18. package/dist/assets/{chunk-2Q5K7J3B-TFd0ECKO.js → chunk-2Q5K7J3B-NSSX86FA.js} +1 -1
  19. package/dist/assets/{chunk-5RXB4S5H-BdhRBpEi.js → chunk-5RXB4S5H-DNNYC8_t.js} +1 -1
  20. package/dist/assets/{chunk-5RXB4S5H-D0SQ3nIe.js → chunk-5RXB4S5H-Rx0YaqNI.js} +1 -1
  21. package/dist/assets/{chunk-5VM5RSS4-B9Lv3cWR.js → chunk-5VM5RSS4-B1k4I4CX.js} +1 -1
  22. package/dist/assets/{chunk-5VM5RSS4-DioqTIvB.js → chunk-5VM5RSS4-CsvQj3QC.js} +1 -1
  23. package/dist/assets/{chunk-6Q2QTUOP-09bwlcIv.js → chunk-6Q2QTUOP-48-dEgAs.js} +1 -1
  24. package/dist/assets/{chunk-6Q2QTUOP-JuhPJZZL.js → chunk-6Q2QTUOP-DCMSW5_0.js} +1 -1
  25. package/dist/assets/{chunk-GF5L2VYU-C6f2SgCw.js → chunk-GF5L2VYU-CGyvOsdN.js} +1 -1
  26. package/dist/assets/{chunk-GF5L2VYU-DzD9aOyp.js → chunk-GF5L2VYU-YXe113hp.js} +1 -1
  27. package/dist/assets/{chunk-JWPE2WC7-BggnWNZv.js → chunk-JWPE2WC7-BT7vCW4x.js} +1 -1
  28. package/dist/assets/{chunk-JWPE2WC7-Dte_Ax9K.js → chunk-JWPE2WC7-D2K1Oywq.js} +1 -1
  29. package/dist/assets/{chunk-KBJHAD2P-9TCQV92m.js → chunk-KBJHAD2P-CQZWamtE.js} +1 -1
  30. package/dist/assets/{chunk-KBJHAD2P-DDnJp7kJ.js → chunk-KBJHAD2P-gpEwZrNy.js} +1 -1
  31. package/dist/assets/{chunk-RYQCIY6F-CE2Y4D_h.js → chunk-RYQCIY6F-BI0fMtjY.js} +1 -1
  32. package/dist/assets/{chunk-RYQCIY6F-DsgFSTNw.js → chunk-RYQCIY6F-vguRdb4F.js} +1 -1
  33. package/dist/assets/{chunk-XXDRQBXY-B1FIfsqq.js → chunk-XXDRQBXY-B99qH1_w.js} +1 -1
  34. package/dist/assets/{chunk-XXDRQBXY-B4YfaqTO.js → chunk-XXDRQBXY-DZLJnbBB.js} +1 -1
  35. package/dist/assets/classDiagram-JCYQIIEL-BaV-s6x8.js +1 -0
  36. package/dist/assets/classDiagram-JCYQIIEL-D4M03B4L.js +1 -0
  37. package/dist/assets/classDiagram-v2-OCEON4UE-BaV-s6x8.js +1 -0
  38. package/dist/assets/classDiagram-v2-OCEON4UE-D4M03B4L.js +1 -0
  39. package/dist/assets/{cose-bilkent-JH36ORCC-C1AG5Pib.js → cose-bilkent-JH36ORCC-EsVnz-E6.js} +1 -1
  40. package/dist/assets/{cose-bilkent-JH36ORCC-lMwWDibI.js → cose-bilkent-JH36ORCC-VI2OjCIx.js} +1 -1
  41. package/dist/assets/{cynefin-VYW2F7L2-BlabniRL.js → cynefin-VYW2F7L2-BVYg0ixs.js} +1 -1
  42. package/dist/assets/{cynefin-VYW2F7L2-W-c-z4IW.js → cynefin-VYW2F7L2-BnHmA5I2.js} +1 -1
  43. package/dist/assets/{cynefinDiagram-MW4NZA55-BtTep_pq.js → cynefinDiagram-MW4NZA55-B-OCRLIw.js} +1 -1
  44. package/dist/assets/{cynefinDiagram-MW4NZA55-Due6EIPh.js → cynefinDiagram-MW4NZA55-ItLlzjDR.js} +1 -1
  45. package/dist/assets/{dagre-VZM6K2ZE-CWLaFfdt.js → dagre-VZM6K2ZE-DkVDkAWJ.js} +1 -1
  46. package/dist/assets/{dagre-VZM6K2ZE-DZldvqiQ.js → dagre-VZM6K2ZE-bYR4z8-Z.js} +1 -1
  47. package/dist/assets/{diagram-7IWD3JNH-RnmUHYwN.js → diagram-7IWD3JNH-DjXMue67.js} +1 -1
  48. package/dist/assets/{diagram-7IWD3JNH-Di-7-nSA.js → diagram-7IWD3JNH-FNEXlm5k.js} +1 -1
  49. package/dist/assets/{diagram-B4RE2ZJO-Wybyn8fw.js → diagram-B4RE2ZJO-73NYiO_P.js} +1 -1
  50. package/dist/assets/{diagram-B4RE2ZJO-mrK79C2E.js → diagram-B4RE2ZJO-dB4QHq0D.js} +1 -1
  51. package/dist/assets/{diagram-LBJQPF4R-JY6FqSFu.js → diagram-LBJQPF4R-DyKT610O.js} +1 -1
  52. package/dist/assets/{diagram-LBJQPF4R-sWhu2VLy.js → diagram-LBJQPF4R-rMgmnjvd.js} +1 -1
  53. package/dist/assets/{diagram-Q27KOJAE-BJ4T0WGp.js → diagram-Q27KOJAE-BvsfmmQt.js} +1 -1
  54. package/dist/assets/{diagram-Q27KOJAE-DyGT9KhB.js → diagram-Q27KOJAE-c6DEjLQX.js} +1 -1
  55. package/dist/assets/{diagram-UB23O5K3-oXFJAndB.js → diagram-UB23O5K3-BMo2VXVb.js} +1 -1
  56. package/dist/assets/{diagram-UB23O5K3-tTd8qwEM.js → diagram-UB23O5K3-DRMKefnZ.js} +1 -1
  57. package/dist/assets/{ebnfDiagram-BXEA7PRR-DV67cBe6.js → ebnfDiagram-BXEA7PRR-BrOAekWh.js} +1 -1
  58. package/dist/assets/{ebnfDiagram-BXEA7PRR-OQGm8tPs.js → ebnfDiagram-BXEA7PRR-YmQkylwV.js} +1 -1
  59. package/dist/assets/{elk-BRx4gEGg.js → elk-Hz3WRESK.js} +1 -1
  60. package/dist/assets/{elk-CdAQJ-NA.js → elk-tPSZwRVB.js} +1 -1
  61. package/dist/assets/{erDiagram-JOGREHBK-BhD2xZ2I.js → erDiagram-JOGREHBK-BlaZnoQi.js} +1 -1
  62. package/dist/assets/{erDiagram-JOGREHBK-BqP8DqqW.js → erDiagram-JOGREHBK-CRCfRUXt.js} +1 -1
  63. package/dist/assets/{flowDiagram-UKHOOZJN-B4AjZxPJ.js → flowDiagram-UKHOOZJN-DQ1gbjxo.js} +1 -1
  64. package/dist/assets/{flowDiagram-UKHOOZJN-CP_1WsW4.js → flowDiagram-UKHOOZJN-Dinlbmds.js} +1 -1
  65. package/dist/assets/{ganttDiagram-PKOTCBZU-BMk6nngr.js → ganttDiagram-PKOTCBZU-CMGpcBZO.js} +1 -1
  66. package/dist/assets/{ganttDiagram-PKOTCBZU-B_ce39Ld.js → ganttDiagram-PKOTCBZU-Eh94zuPI.js} +1 -1
  67. package/dist/assets/{gitGraphDiagram-DS77QQ5N-CnZA42iA.js → gitGraphDiagram-DS77QQ5N-Bp8xIZbk.js} +1 -1
  68. package/dist/assets/{gitGraphDiagram-DS77QQ5N-DqEz_iTn.js → gitGraphDiagram-DS77QQ5N-Cu-b4YNw.js} +1 -1
  69. package/dist/assets/index-51e8fagd.css +32 -0
  70. package/dist/assets/{index-D5nLH7qP.js → index-CQE9C6k6.js} +356 -356
  71. package/dist/assets/{index-CqyOGerp.js → index-S8ow0XfK.js} +356 -356
  72. package/dist/assets/{infoDiagram-6WML65LV-BQf7m4X4.js → infoDiagram-6WML65LV-CClEEtTq.js} +1 -1
  73. package/dist/assets/{infoDiagram-6WML65LV-Dntf4YFM.js → infoDiagram-6WML65LV-QmHeojgl.js} +1 -1
  74. package/dist/assets/{ishikawaDiagram-WSZJBQD7-BDjsldAI.js → ishikawaDiagram-WSZJBQD7-BemSj9lN.js} +1 -1
  75. package/dist/assets/{ishikawaDiagram-WSZJBQD7-BqXpJeoL.js → ishikawaDiagram-WSZJBQD7-nw48g1vr.js} +1 -1
  76. package/dist/assets/{journeyDiagram-NVQOT4AX-CBcFzP2M.js → journeyDiagram-NVQOT4AX-DeNtO6OU.js} +1 -1
  77. package/dist/assets/{journeyDiagram-NVQOT4AX-DoWKjgKd.js → journeyDiagram-NVQOT4AX-q1lCfOYn.js} +1 -1
  78. package/dist/assets/{kanban-definition-27J2QSJJ-9bspl7j-.js → kanban-definition-27J2QSJJ-Bzhu6hql.js} +1 -1
  79. package/dist/assets/{kanban-definition-27J2QSJJ-Cjxa-Fbb.js → kanban-definition-27J2QSJJ-VfvD33YG.js} +1 -1
  80. package/dist/assets/{linear-YogAXmU_.js → linear-C0Kwu3Yp.js} +1 -1
  81. package/dist/assets/{linear-lIhI5Y8l.js → linear-CbM_4-fP.js} +1 -1
  82. package/dist/assets/{mermaid.core-2Spxcrg7.js → mermaid.core-G2huIsXn.js} +5 -5
  83. package/dist/assets/{mermaid.core-BxxInCBm.js → mermaid.core-fvTQFUX1.js} +5 -5
  84. package/dist/assets/{mindmap-definition-FAOFIHXS-DblO5EG4.js → mindmap-definition-FAOFIHXS-BONvuyvz.js} +1 -1
  85. package/dist/assets/{mindmap-definition-FAOFIHXS-_nlvJ9VK.js → mindmap-definition-FAOFIHXS-BzYawGKQ.js} +1 -1
  86. package/dist/assets/{pegDiagram-VL7TDLO6-BBJFPAZG.js → pegDiagram-VL7TDLO6-Df2HAKGH.js} +1 -1
  87. package/dist/assets/{pegDiagram-VL7TDLO6-DhRH7YRf.js → pegDiagram-VL7TDLO6-DnMwBHn_.js} +1 -1
  88. package/dist/assets/{pieDiagram-7S7Q4E2Y-4Qy7Nk4U.js → pieDiagram-7S7Q4E2Y-Cd3-a-dM.js} +1 -1
  89. package/dist/assets/{pieDiagram-7S7Q4E2Y-BUtdeYBT.js → pieDiagram-7S7Q4E2Y-LV6TOhOD.js} +1 -1
  90. package/dist/assets/{quadrantDiagram-CIZ2JOQS-BUoIDY1r.js → quadrantDiagram-CIZ2JOQS-8VOnA3FV.js} +1 -1
  91. package/dist/assets/{quadrantDiagram-CIZ2JOQS-D90kdHA1.js → quadrantDiagram-CIZ2JOQS-CnwxFPxh.js} +1 -1
  92. package/dist/assets/{railroadDiagram-AXF67PYL-CJf9--tj.js → railroadDiagram-AXF67PYL-CXBFj3Iu.js} +1 -1
  93. package/dist/assets/{railroadDiagram-AXF67PYL-D3S1oliC.js → railroadDiagram-AXF67PYL-DLoAPcsb.js} +1 -1
  94. package/dist/assets/{requirementDiagram-LRYGKXZP-C04jhjS6.js → requirementDiagram-LRYGKXZP-LrVlZXSz.js} +1 -1
  95. package/dist/assets/{requirementDiagram-LRYGKXZP-cQaGai5h.js → requirementDiagram-LRYGKXZP-pakITowN.js} +1 -1
  96. package/dist/assets/{sankeyDiagram-W5VNT64P-AT4cTVbY.js → sankeyDiagram-W5VNT64P-BIQQ8A1I.js} +1 -1
  97. package/dist/assets/{sankeyDiagram-W5VNT64P-DfFUdqYO.js → sankeyDiagram-W5VNT64P-C6QWOxNM.js} +1 -1
  98. package/dist/assets/{sequenceDiagram-SI44F4Z6-DbjhG030.js → sequenceDiagram-SI44F4Z6-CpHBe2CG.js} +1 -1
  99. package/dist/assets/{sequenceDiagram-SI44F4Z6-DKjdupix.js → sequenceDiagram-SI44F4Z6-cnLxaxcV.js} +1 -1
  100. package/dist/assets/{sizeCapture-X5ZJPWSS-CCcKLP8m.js → sizeCapture-X5ZJPWSS-3g-1onHD.js} +1 -1
  101. package/dist/assets/{sizeCapture-X5ZJPWSS-DGxRWxeo.js → sizeCapture-X5ZJPWSS-4U6b3PSL.js} +1 -1
  102. package/dist/assets/{stateDiagram-OKZ733FA-D7wGCNb7.js → stateDiagram-OKZ733FA-CFwVDdlY.js} +1 -1
  103. package/dist/assets/{stateDiagram-OKZ733FA-qdMAailp.js → stateDiagram-OKZ733FA-CKVGJcM2.js} +1 -1
  104. package/dist/assets/{stateDiagram-v2-UEYNNEHI-BbmmtA9w.js → stateDiagram-v2-UEYNNEHI-Dnbk8ftm.js} +1 -1
  105. package/dist/assets/{stateDiagram-v2-UEYNNEHI-Diz_hFvh.js → stateDiagram-v2-UEYNNEHI-rlA-woxH.js} +1 -1
  106. package/dist/assets/{swimlanes-SLNWSIFB-CZgIPz6I.js → swimlanes-SLNWSIFB-DCwz8-mf.js} +2 -2
  107. package/dist/assets/{swimlanes-SLNWSIFB-B16H-6OU.js → swimlanes-SLNWSIFB-M9Oumwnl.js} +2 -2
  108. package/dist/assets/swimlanesDiagram-ULZ7WXOC-CTtTyW6-.js +8 -0
  109. package/dist/assets/swimlanesDiagram-ULZ7WXOC-Caohx6WZ.js +8 -0
  110. package/dist/assets/{timeline-definition-Z64GVDOM-7r7OVlrT.js → timeline-definition-Z64GVDOM-BVmfjoWH.js} +1 -1
  111. package/dist/assets/{timeline-definition-Z64GVDOM-nhnkS_wy.js → timeline-definition-Z64GVDOM-DyXvto1l.js} +1 -1
  112. package/dist/assets/{vennDiagram-T6HMQDX7-B1piFYrz.js → vennDiagram-T6HMQDX7-CNe6zorb.js} +1 -1
  113. package/dist/assets/{vennDiagram-T6HMQDX7-x8SJTFhK.js → vennDiagram-T6HMQDX7-DyzOWKx3.js} +1 -1
  114. package/dist/assets/{wardleyDiagram-T6FBY63Y-BdD4GExj.js → wardleyDiagram-T6FBY63Y-D5YvMVwa.js} +1 -1
  115. package/dist/assets/{wardleyDiagram-T6FBY63Y-C90xqNVS.js → wardleyDiagram-T6FBY63Y-DXo8BCrA.js} +1 -1
  116. package/dist/assets/{xychartDiagram-ELKLHX3M--Ndoz0Cq.js → xychartDiagram-ELKLHX3M-CIBffVxC.js} +1 -1
  117. package/dist/assets/{xychartDiagram-ELKLHX3M-BAKns-7o.js → xychartDiagram-ELKLHX3M-XlsWelDb.js} +1 -1
  118. package/dist/build-info.json +2 -2
  119. package/dist/convert-icons.md +10 -46
  120. package/dist/favicon.png +0 -0
  121. package/dist/favicon.svg +1 -9
  122. package/dist/generate-icons.js +67 -47
  123. package/dist/icons/icon-128x128.png +0 -0
  124. package/dist/icons/icon-144x144.png +0 -0
  125. package/dist/icons/icon-152x152.png +0 -0
  126. package/dist/icons/icon-192x192.png +0 -0
  127. package/dist/icons/icon-384x384.png +0 -0
  128. package/dist/icons/icon-512x512.png +0 -0
  129. package/dist/icons/icon-72x72.png +0 -0
  130. package/dist/icons/icon-96x96.png +0 -0
  131. package/dist/index.html +2 -2
  132. package/dist/logo-128.png +0 -0
  133. package/dist/logo-256.png +0 -0
  134. package/dist/logo-32.png +0 -0
  135. package/dist/logo-512.png +0 -0
  136. package/dist/logo-64.png +0 -0
  137. package/dist/logo-source.png +0 -0
  138. package/dist/logo.svg +1 -17
  139. package/dist/sw.js +7 -9
  140. package/dist-server/build-info.json +2 -2
  141. package/dist-server/server/load-env.js +12 -4
  142. package/dist-server/server/load-env.js.map +1 -1
  143. package/dist-server/server/modules/browser-use/browser-use.service.js +33 -11
  144. package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -1
  145. package/dist-server/server/modules/browser-use/index.js +4 -4
  146. package/dist-server/server/modules/browser-use/index.js.map +1 -1
  147. package/dist-server/server/modules/browser-use/mcp-server-names.js +6 -4
  148. package/dist-server/server/modules/browser-use/mcp-server-names.js.map +1 -1
  149. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +49 -1
  150. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -1
  151. package/dist-server/server/modules/cli/asset-migration-files.js +74 -0
  152. package/dist-server/server/modules/cli/asset-migration-files.js.map +1 -0
  153. package/dist-server/server/modules/cli/asset-migration-report.js +80 -0
  154. package/dist-server/server/modules/cli/asset-migration-report.js.map +1 -0
  155. package/dist-server/server/modules/cli/asset-migration-store.js +153 -0
  156. package/dist-server/server/modules/cli/asset-migration-store.js.map +1 -0
  157. package/dist-server/server/modules/cli/asset-migration.service.js +161 -0
  158. package/dist-server/server/modules/cli/asset-migration.service.js.map +1 -0
  159. package/dist-server/server/modules/cli/browser-use-mcp.js +9 -4
  160. package/dist-server/server/modules/cli/browser-use-mcp.js.map +1 -1
  161. package/dist-server/server/modules/cli/cli.module.js +21 -1
  162. package/dist-server/server/modules/cli/cli.module.js.map +1 -1
  163. package/dist-server/server/modules/cli/cli.service.js +6 -1
  164. package/dist-server/server/modules/cli/cli.service.js.map +1 -1
  165. package/dist-server/server/modules/cli/tests/asset-migration.service.test.js +275 -0
  166. package/dist-server/server/modules/cli/tests/asset-migration.service.test.js.map +1 -0
  167. package/dist-server/server/modules/cli/tests/browser-use-mcp-entry.test.js +157 -0
  168. package/dist-server/server/modules/cli/tests/browser-use-mcp-entry.test.js.map +1 -1
  169. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +1 -0
  170. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -1
  171. package/dist-server/server/modules/cli/tests/cli.service.test.js +6 -1
  172. package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -1
  173. package/dist-server/server/modules/cockpit/cockpit-brief-prompt.js +1 -1
  174. package/dist-server/server/modules/cockpit/cockpit-card-actions.js +19 -3
  175. package/dist-server/server/modules/cockpit/cockpit-card-actions.js.map +1 -1
  176. package/dist-server/server/modules/cockpit/cockpit-card-feedback-store.js +94 -9
  177. package/dist-server/server/modules/cockpit/cockpit-card-feedback-store.js.map +1 -1
  178. package/dist-server/server/modules/cockpit/cockpit-card-registry.js +1 -1
  179. package/dist-server/server/modules/cockpit/cockpit-fleet-card-projection.js +3 -0
  180. package/dist-server/server/modules/cockpit/cockpit-fleet-card-projection.js.map +1 -1
  181. package/dist-server/server/modules/cockpit/cockpit-knowledge-reading.js +16 -0
  182. package/dist-server/server/modules/cockpit/cockpit-knowledge-reading.js.map +1 -1
  183. package/dist-server/server/modules/cockpit/cockpit.module.js +1 -1
  184. package/dist-server/server/modules/cockpit/tests/cockpit-card-feedback.test.js +96 -1
  185. package/dist-server/server/modules/cockpit/tests/cockpit-card-feedback.test.js.map +1 -1
  186. package/dist-server/server/modules/cockpit/tests/cockpit-fleet-card-provider.test.js +2 -2
  187. package/dist-server/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.js +169 -3
  188. package/dist-server/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.js.map +1 -1
  189. package/dist-server/server/modules/context-events/context-event-writer.js +5 -5
  190. package/dist-server/server/modules/context-events/context-events.module.js +2 -2
  191. package/dist-server/server/modules/context-events/session-ask-stream-reader.js +1 -1
  192. package/dist-server/server/modules/context-events/session-blocked-events.js +3 -3
  193. package/dist-server/server/modules/context-events/tests/session-ask-event-writer.test.js +1 -1
  194. package/dist-server/server/modules/context-events/tests/session-blocked-events.test.js +3 -3
  195. package/dist-server/server/modules/context-events/tests/session-run-events.test.js +1 -1
  196. package/dist-server/server/modules/database/migrations.js +23 -1
  197. package/dist-server/server/modules/database/migrations.js.map +1 -1
  198. package/dist-server/server/modules/database/repositories/sessions.db.js +25 -4
  199. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
  200. package/dist-server/server/modules/database/repositories/voice-user-identifiers.db.js +1 -1
  201. package/dist-server/server/modules/database/schema.js +16 -2
  202. package/dist-server/server/modules/database/schema.js.map +1 -1
  203. package/dist-server/server/modules/database/tests/migrations-ensure-columns.test.js +2 -0
  204. package/dist-server/server/modules/database/tests/migrations-ensure-columns.test.js.map +1 -1
  205. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +2 -2
  206. package/dist-server/server/modules/debug-agent/tests/debug-agent-permission-popup.test.js +2 -2
  207. package/dist-server/server/modules/liaison/liaison-deliver.service.js +3 -3
  208. package/dist-server/server/modules/liaison/liaison.module.js +1 -1
  209. package/dist-server/server/modules/mcp-gateway/mcp-gateway.auth.js +3 -2
  210. package/dist-server/server/modules/mcp-gateway/mcp-gateway.auth.js.map +1 -1
  211. package/dist-server/server/modules/mcp-gateway/mcp-self-target.js +2 -2
  212. package/dist-server/server/modules/mcp-gateway/mcp-session-send.js +7 -0
  213. package/dist-server/server/modules/mcp-gateway/mcp-session-send.js.map +1 -1
  214. package/dist-server/server/modules/mcp-gateway/mcp-tool-annotations.js +4 -4
  215. package/dist-server/server/modules/mcp-gateway/oauth-metadata.gate.js +4 -2
  216. package/dist-server/server/modules/mcp-gateway/oauth-metadata.gate.js.map +1 -1
  217. package/dist-server/server/modules/mcp-gateway/tests/knowledge-effective-config-proof.test.js +1 -1
  218. package/dist-server/server/modules/mcp-gateway/tests/knowledge-peer-correlation-proof.test.js +2 -2
  219. package/dist-server/server/modules/mcp-gateway/tests/mcp-approvals.test.js +3 -2
  220. package/dist-server/server/modules/mcp-gateway/tests/mcp-approvals.test.js.map +1 -1
  221. package/dist-server/server/modules/mcp-gateway/tests/mcp-audit-route.test.js +1 -1
  222. package/dist-server/server/modules/mcp-gateway/tests/mcp-audit.test.js +4 -4
  223. package/dist-server/server/modules/mcp-gateway/tests/mcp-auth.test.js +3 -1
  224. package/dist-server/server/modules/mcp-gateway/tests/mcp-auth.test.js.map +1 -1
  225. package/dist-server/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.js +3 -2
  226. package/dist-server/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.js.map +1 -1
  227. package/dist-server/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.js +7 -3
  228. package/dist-server/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.js.map +1 -1
  229. package/dist-server/server/modules/mcp-gateway/tests/mcp-correlation-id.test.js +8 -8
  230. package/dist-server/server/modules/mcp-gateway/tests/mcp-draft.test.js +3 -2
  231. package/dist-server/server/modules/mcp-gateway/tests/mcp-draft.test.js.map +1 -1
  232. package/dist-server/server/modules/mcp-gateway/tests/mcp-english-only.test.js +1 -1
  233. package/dist-server/server/modules/mcp-gateway/tests/mcp-gateway-wiring.test.js +2 -2
  234. package/dist-server/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.js +1 -1
  235. package/dist-server/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.js.map +1 -1
  236. package/dist-server/server/modules/mcp-gateway/tests/mcp-knowledge-facts.test.js +1 -1
  237. package/dist-server/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.js +1 -1
  238. package/dist-server/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.js.map +1 -1
  239. package/dist-server/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.js +3 -2
  240. package/dist-server/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.js.map +1 -1
  241. package/dist-server/server/modules/mcp-gateway/tests/mcp-overview.test.js +2 -2
  242. package/dist-server/server/modules/mcp-gateway/tests/mcp-pending-interaction.test.js +2 -2
  243. package/dist-server/server/modules/mcp-gateway/tests/mcp-read-tools.test.js +3 -3
  244. package/dist-server/server/modules/mcp-gateway/tests/mcp-read-tools.test.js.map +1 -1
  245. package/dist-server/server/modules/mcp-gateway/tests/mcp-run-get.test.js +1 -1
  246. package/dist-server/server/modules/mcp-gateway/tests/mcp-self-target.test.js +1 -1
  247. package/dist-server/server/modules/mcp-gateway/tests/mcp-self-target.test.js.map +1 -1
  248. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-background.test.js +2 -2
  249. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-background.test.js.map +1 -1
  250. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-host-control.test.js +1 -1
  251. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-host-control.test.js.map +1 -1
  252. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.js +1 -1
  253. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.js.map +1 -1
  254. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.js +2 -2
  255. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.js.map +1 -1
  256. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-search-pruning.test.js +1 -1
  257. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-search.test.js +1 -1
  258. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-send.test.js +2 -2
  259. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-send.test.js.map +1 -1
  260. package/dist-server/server/modules/mcp-gateway/tests/mcp-ui-last-opened.test.js +1 -1
  261. package/dist-server/server/modules/mcp-gateway/tests/mcp-usage-stats.test.js +1 -1
  262. package/dist-server/server/modules/mcp-gateway/tests/mcp-usage-stats.test.js.map +1 -1
  263. package/dist-server/server/modules/mcp-gateway/tests/mcp-write-notification.test.js +2 -2
  264. package/dist-server/server/modules/mcp-gateway/tests/mcp-write-notification.test.js.map +1 -1
  265. package/dist-server/server/modules/mcp-gateway/tests/oauth-flow.e2e.test.js +3 -3
  266. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +1 -1
  267. package/dist-server/server/modules/oauth/access-tokens.service.js +8 -8
  268. package/dist-server/server/modules/oauth/oauth-consent.service.js +20 -15
  269. package/dist-server/server/modules/oauth/oauth-consent.service.js.map +1 -1
  270. package/dist-server/server/modules/oauth/tests/access-token-scopes.test.js +54 -34
  271. package/dist-server/server/modules/oauth/tests/access-token-scopes.test.js.map +1 -1
  272. package/dist-server/server/modules/oauth/tests/access-tokens.service.test.js +35 -14
  273. package/dist-server/server/modules/oauth/tests/access-tokens.service.test.js.map +1 -1
  274. package/dist-server/server/modules/oauth/tests/oauth-consent-page.test.js +27 -22
  275. package/dist-server/server/modules/oauth/tests/oauth-consent-page.test.js.map +1 -1
  276. package/dist-server/server/modules/oauth/tests/oauth-consent-ratelimit.test.js +2 -2
  277. package/dist-server/server/modules/oauth/tests/token-info.routes.test.js +2 -2
  278. package/dist-server/server/modules/oauth/tests/token-info.routes.test.js.map +1 -1
  279. package/dist-server/server/modules/observation/blind-spots.js +1 -1
  280. package/dist-server/server/modules/observation/observation-store.js +50 -17
  281. package/dist-server/server/modules/observation/observation-store.js.map +1 -1
  282. package/dist-server/server/modules/observation/observation-uri.js +31 -19
  283. package/dist-server/server/modules/observation/observation-uri.js.map +1 -1
  284. package/dist-server/server/modules/observation/observation.routes.js +1 -1
  285. package/dist-server/server/modules/observation/project-truth.js +1 -1
  286. package/dist-server/server/modules/observation/session-ask-decision-answer.js +2 -1
  287. package/dist-server/server/modules/observation/session-ask-decision-answer.js.map +1 -1
  288. package/dist-server/server/modules/observation/session-digest-llm.js +7 -1
  289. package/dist-server/server/modules/observation/session-digest-llm.js.map +1 -1
  290. package/dist-server/server/modules/observation/session-digest.js +39 -5
  291. package/dist-server/server/modules/observation/session-digest.js.map +1 -1
  292. package/dist-server/server/modules/observation/tests/architecture-delta.test.js +1 -1
  293. package/dist-server/server/modules/observation/tests/observation-routes.test.js +9 -0
  294. package/dist-server/server/modules/observation/tests/observation-routes.test.js.map +1 -1
  295. package/dist-server/server/modules/observation/tests/observation-store.test.js +38 -0
  296. package/dist-server/server/modules/observation/tests/observation-store.test.js.map +1 -1
  297. package/dist-server/server/modules/observation/tests/project-truth.test.js +2 -2
  298. package/dist-server/server/modules/observation/tests/session-ask-decision-digest.test.js +150 -0
  299. package/dist-server/server/modules/observation/tests/session-ask-decision-digest.test.js.map +1 -1
  300. package/dist-server/server/modules/observation/tests/session-digest.test.js +24 -1
  301. package/dist-server/server/modules/observation/tests/session-digest.test.js.map +1 -1
  302. package/dist-server/server/modules/providers/index.js +9 -0
  303. package/dist-server/server/modules/providers/index.js.map +1 -1
  304. package/dist-server/server/modules/providers/list/claude/claude-host-driver.provider.js +1 -1
  305. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +22 -3
  306. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -1
  307. package/dist-server/server/modules/providers/list/codex/codex-app-server.connection.js +1 -1
  308. package/dist-server/server/modules/providers/list/codex/codex-host-driver.contract.js +11 -9
  309. package/dist-server/server/modules/providers/list/codex/codex-host-driver.contract.js.map +1 -1
  310. package/dist-server/server/modules/providers/list/codex/codex-host-driver.provider.js +15 -1
  311. package/dist-server/server/modules/providers/list/codex/codex-host-driver.provider.js.map +1 -1
  312. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +14 -3
  313. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
  314. package/dist-server/server/modules/providers/list/codex/codex-provider-injection.js +248 -0
  315. package/dist-server/server/modules/providers/list/codex/codex-provider-injection.js.map +1 -0
  316. package/dist-server/server/modules/providers/list/codex/codex-resident-provider-launch.js +37 -0
  317. package/dist-server/server/modules/providers/list/codex/codex-resident-provider-launch.js.map +1 -0
  318. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +19 -1
  319. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -1
  320. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +1 -1
  321. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +1 -1
  322. package/dist-server/server/modules/providers/provider.routes.js +23 -2
  323. package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
  324. package/dist-server/server/modules/providers/services/provider-models.service.js +136 -106
  325. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
  326. package/dist-server/server/modules/providers/services/provider-runtime.service.js +3 -0
  327. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -1
  328. package/dist-server/server/modules/providers/services/session-model-resolver.js +106 -0
  329. package/dist-server/server/modules/providers/services/session-model-resolver.js.map +1 -0
  330. package/dist-server/server/modules/providers/services/session-provider-binding.js +89 -0
  331. package/dist-server/server/modules/providers/services/session-provider-binding.js.map +1 -0
  332. package/dist-server/server/modules/providers/services/sessions.service.js +5 -1
  333. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
  334. package/dist-server/server/modules/providers/tests/claude-resident-addressable.test.js +2 -2
  335. package/dist-server/server/modules/providers/tests/claude-session-name-authority.test.js +4 -4
  336. package/dist-server/server/modules/providers/tests/codex-app-server-protocol.test.js +1 -1
  337. package/dist-server/server/modules/providers/tests/codex-host-driver-persistent.test.js +2 -2
  338. package/dist-server/server/modules/providers/tests/codex-provider-model-binding.test.js +270 -0
  339. package/dist-server/server/modules/providers/tests/codex-provider-model-binding.test.js.map +1 -0
  340. package/dist-server/server/modules/providers/tests/codex-resident-provider-injection.test.js +484 -0
  341. package/dist-server/server/modules/providers/tests/codex-resident-provider-injection.test.js.map +1 -0
  342. package/dist-server/server/modules/providers/tests/codex-runtime-provider-injection.test.js +228 -0
  343. package/dist-server/server/modules/providers/tests/codex-runtime-provider-injection.test.js.map +1 -0
  344. package/dist-server/server/modules/providers/tests/codex-session-provider-binding.test.js +306 -0
  345. package/dist-server/server/modules/providers/tests/codex-session-provider-binding.test.js.map +1 -0
  346. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +1 -1
  347. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +2 -2
  348. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +15 -0
  349. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -1
  350. package/dist-server/server/modules/providers/tests/provider.routes.test.js +1 -1
  351. package/dist-server/server/modules/quay/index.js +1 -1
  352. package/dist-server/server/modules/quay/quay-fleet-cli.js +1 -1
  353. package/dist-server/server/modules/quay/quay-fleet-locator.js +2 -2
  354. package/dist-server/server/modules/quay/quay-fleet-project-id.js +7 -7
  355. package/dist-server/server/modules/quay/quay-fleet-registry.js +3 -3
  356. package/dist-server/server/modules/quay/quay-suite-fanin-reader.js +1 -1
  357. package/dist-server/server/modules/quay/quay-uri-resolve.js +6 -6
  358. package/dist-server/server/modules/quay/quay.module.js +3 -3
  359. package/dist-server/server/modules/quay/quay.routes.js +1 -1
  360. package/dist-server/server/modules/quay/quay.service.js +4 -4
  361. package/dist-server/server/modules/quay/tests/contracts/fleet-cli-contracts.test.js +3 -3
  362. package/dist-server/server/modules/quay/tests/contracts/shapes.js +9 -9
  363. package/dist-server/server/modules/quay/tests/quay-fleet-locator.test.js +1 -1
  364. package/dist-server/server/modules/quay/tests/quay-fleet-project-id.test.js +4 -4
  365. package/dist-server/server/modules/quay/tests/quay-uri-resolve.test.js +10 -10
  366. package/dist-server/server/modules/session-hosts/tests/resident-server-restart.test.js +1 -1
  367. package/dist-server/server/modules/settings/codex-mcp-gateway.settings.js +1 -1
  368. package/dist-server/server/modules/settings/codex-model-providers.schema.js +349 -0
  369. package/dist-server/server/modules/settings/codex-model-providers.schema.js.map +1 -0
  370. package/dist-server/server/modules/settings/codex-model-providers.service.js +199 -0
  371. package/dist-server/server/modules/settings/codex-model-providers.service.js.map +1 -0
  372. package/dist-server/server/modules/settings/codex-model-providers.settings.js +547 -0
  373. package/dist-server/server/modules/settings/codex-model-providers.settings.js.map +1 -0
  374. package/dist-server/server/modules/settings/codex-model-providers.store.js +200 -0
  375. package/dist-server/server/modules/settings/codex-model-providers.store.js.map +1 -0
  376. package/dist-server/server/modules/settings/index.js +10 -0
  377. package/dist-server/server/modules/settings/index.js.map +1 -1
  378. package/dist-server/server/modules/settings/server-settings-file.js +28 -32
  379. package/dist-server/server/modules/settings/server-settings-file.js.map +1 -1
  380. package/dist-server/server/modules/settings/server-settings.js +2 -2
  381. package/dist-server/server/modules/settings/server-settings.js.map +1 -1
  382. package/dist-server/server/modules/settings/settings.module.js +35 -0
  383. package/dist-server/server/modules/settings/settings.module.js.map +1 -1
  384. package/dist-server/server/modules/settings/settings.routes.js +42 -0
  385. package/dist-server/server/modules/settings/settings.routes.js.map +1 -1
  386. package/dist-server/server/modules/settings/settings.service.js +8 -21
  387. package/dist-server/server/modules/settings/settings.service.js.map +1 -1
  388. package/dist-server/server/modules/settings/tests/cockpit-session-start-settings.routes.test.js +1 -0
  389. package/dist-server/server/modules/settings/tests/cockpit-session-start-settings.routes.test.js.map +1 -1
  390. package/dist-server/server/modules/settings/tests/codex-model-providers-settings.test.js +336 -0
  391. package/dist-server/server/modules/settings/tests/codex-model-providers-settings.test.js.map +1 -0
  392. package/dist-server/server/modules/settings/tests/codex-provider-advanced.test.js +466 -0
  393. package/dist-server/server/modules/settings/tests/codex-provider-advanced.test.js.map +1 -0
  394. package/dist-server/server/modules/settings/tests/codex-provider-import.test.js +475 -0
  395. package/dist-server/server/modules/settings/tests/codex-provider-import.test.js.map +1 -0
  396. package/dist-server/server/modules/voice/tests/voice-lexicon.test.js +9 -9
  397. package/dist-server/server/modules/voice/tests/voice-lexicon.test.js.map +1 -1
  398. package/dist-server/server/modules/voice/voice-lexicon.js +1 -1
  399. package/dist-server/server/modules/websocket/services/chat-control.service.js +21 -1
  400. package/dist-server/server/modules/websocket/services/chat-control.service.js.map +1 -1
  401. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +25 -1
  402. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
  403. package/dist-server/server/modules/websocket/tests/chat-background-task.test.js +18 -1
  404. package/dist-server/server/modules/websocket/tests/chat-background-task.test.js.map +1 -1
  405. package/dist-server/server/modules/websocket/tests/chat-stop-task.test.js +18 -1
  406. package/dist-server/server/modules/websocket/tests/chat-stop-task.test.js.map +1 -1
  407. package/dist-server/server/modules/worktrees/services/worktree-list.service.js +1 -1
  408. package/dist-server/server/modules/worktrees/services/worktree-open.service.js +1 -1
  409. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +1 -1
  410. package/dist-server/server/shared/brand.js +18 -20
  411. package/dist-server/server/shared/brand.js.map +1 -1
  412. package/dist-server/server/shared/data-root-migration.js +3 -2
  413. package/dist-server/server/shared/data-root-migration.js.map +1 -1
  414. package/dist-server/server/shared/data-root.js +54 -59
  415. package/dist-server/server/shared/data-root.js.map +1 -1
  416. package/dist-server/server/shared/mcp-contract/types.js +20 -15
  417. package/dist-server/server/shared/mcp-contract/types.js.map +1 -1
  418. package/dist-server/server/shared/ports/codex-provider-registry.port.js +66 -0
  419. package/dist-server/server/shared/ports/codex-provider-registry.port.js.map +1 -0
  420. package/dist-server/server/shared/settings-file.js +120 -6
  421. package/dist-server/server/shared/settings-file.js.map +1 -1
  422. package/dist-server/server/shared/tests/cloudpit-brand-env.test.js +76 -34
  423. package/dist-server/server/shared/tests/cloudpit-brand-env.test.js.map +1 -1
  424. package/dist-server/server/shared/tests/cloudpit-data-root.test.js +35 -18
  425. package/dist-server/server/shared/tests/cloudpit-data-root.test.js.map +1 -1
  426. package/dist-server/server/shared/tests/cloudpit-goal-exit-gate.test.js +153 -17
  427. package/dist-server/server/shared/tests/cloudpit-goal-exit-gate.test.js.map +1 -1
  428. package/dist-server/server/shared/tests/cloudpit-runtime-flip.test.js +116 -114
  429. package/dist-server/server/shared/tests/cloudpit-runtime-flip.test.js.map +1 -1
  430. package/dist-server/server/shared/tests/frontend-import-cycle-budget.test.js +9 -1
  431. package/dist-server/server/shared/tests/frontend-import-cycle-budget.test.js.map +1 -1
  432. package/dist-server/server/shared/tests/quay-test-script.test.js +40 -6
  433. package/dist-server/server/shared/tests/quay-test-script.test.js.map +1 -1
  434. package/dist-server/server/shared/tests/settings-file.test.js +58 -2
  435. package/dist-server/server/shared/tests/settings-file.test.js.map +1 -1
  436. package/dist-server/server/shared/types.js.map +1 -1
  437. package/dist-server/server/shared/utils.js +1 -1
  438. package/electron/appIdMigration.js +467 -0
  439. package/electron/assets/logo-macos.icns +0 -0
  440. package/electron/assets/logo-macos.png +0 -0
  441. package/electron/assets/logo-windows.ico +0 -0
  442. package/electron/brandEnv.js +64 -0
  443. package/electron/cloud.js +3 -3
  444. package/electron/desktopNotifications.js +1 -1
  445. package/electron/launcher/index.html +1 -1
  446. package/electron/localServer.js +41 -7
  447. package/electron/main.js +33 -15
  448. package/electron/scripts/generate-macos-icon.js +34 -28
  449. package/electron/scripts/generate-windows-icon.js +66 -0
  450. package/electron/serverInstaller.js +20 -11
  451. package/electron/tests/cloudpit-appid-migration.test.mjs +514 -0
  452. package/electron/tests/cloudpit-brand-env-wiring.test.mjs +324 -0
  453. package/electron/tests/cloudpit-desktop-identity.test.mjs +42 -19
  454. package/electron/tests/cloudpit-runtime-identity-surfaces.test.mjs +10 -4
  455. package/electron/tests/cloudpit-userdata-migration.test.mjs +18 -5
  456. package/electron/userDataMigration.js +3 -0
  457. package/package.json +7 -6
  458. package/public/api-docs.html +3 -3
  459. package/scripts/brand-allowlist-check.mjs +233 -12
  460. package/scripts/brand-allowlist-check.test.mjs +270 -1
  461. package/scripts/cloudpit-distribution-check.mjs +57 -23
  462. package/scripts/cloudpit-distribution-check.test.mjs +42 -9
  463. package/scripts/codex-protocol-smoke.mjs +1 -1
  464. package/scripts/isolated-instance.sh +1 -1
  465. package/scripts/mcp-smoke.mjs +2 -2
  466. package/scripts/release/tests/fork-release-workflows.test.mjs +45 -0
  467. package/scripts/release/tests/server-installer-bundle-url.test.mjs +57 -9
  468. package/scripts/restart-when-idle.sh +1 -1
  469. package/scripts/shadow-prediction-report.mjs +1 -1
  470. package/scripts/suite-duration-baseline.tsv +45 -0
  471. package/scripts/ui-scenario.mjs +195 -0
  472. package/scripts/ui-scenarios/codex-provider-import.json +63 -0
  473. package/scripts/ui-scenarios/codex-provider-settings.json +77 -0
  474. package/scripts/voice-capture-process-check.false-forms.test.mjs +1 -1
  475. package/scripts/voice-phase0-report.test.mjs +1 -1
  476. package/server/load-env.ts +15 -4
  477. package/server/modules/browser-use/browser-use.service.ts +45 -14
  478. package/server/modules/browser-use/index.ts +3 -4
  479. package/server/modules/browser-use/mcp-server-names.ts +6 -5
  480. package/server/modules/browser-use/tests/browser-use.service.test.ts +63 -1
  481. package/server/modules/cli/asset-migration-files.ts +96 -0
  482. package/server/modules/cli/asset-migration-report.ts +123 -0
  483. package/server/modules/cli/asset-migration-store.ts +228 -0
  484. package/server/modules/cli/asset-migration.service.ts +236 -0
  485. package/server/modules/cli/browser-use-mcp.ts +9 -4
  486. package/server/modules/cli/cli.module.ts +21 -1
  487. package/server/modules/cli/cli.service.ts +14 -1
  488. package/server/modules/cli/tests/asset-migration.service.test.ts +349 -0
  489. package/server/modules/cli/tests/browser-use-mcp-entry.test.ts +202 -0
  490. package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +1 -0
  491. package/server/modules/cli/tests/cli.service.test.ts +6 -1
  492. package/server/modules/cockpit/cockpit-brief-prompt.ts +1 -1
  493. package/server/modules/cockpit/cockpit-card-actions.ts +20 -3
  494. package/server/modules/cockpit/cockpit-card-feedback-store.ts +104 -9
  495. package/server/modules/cockpit/cockpit-card-registry.ts +2 -2
  496. package/server/modules/cockpit/cockpit-fleet-card-projection.ts +3 -0
  497. package/server/modules/cockpit/cockpit-fleet-executor.ts +1 -1
  498. package/server/modules/cockpit/cockpit-knowledge-reading.ts +17 -0
  499. package/server/modules/cockpit/cockpit.module.ts +2 -2
  500. package/server/modules/cockpit/cockpit.reducer.ts +1 -1
  501. package/server/modules/cockpit/tests/cockpit-card-feedback.test.ts +116 -1
  502. package/server/modules/cockpit/tests/cockpit-fleet-card-provider.test.ts +2 -2
  503. package/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.ts +205 -3
  504. package/server/modules/context-events/context-event-writer.ts +6 -6
  505. package/server/modules/context-events/context-events.module.ts +2 -2
  506. package/server/modules/context-events/session-ask-stream-reader.ts +1 -1
  507. package/server/modules/context-events/session-blocked-events.ts +3 -3
  508. package/server/modules/context-events/tests/session-ask-event-writer.test.ts +1 -1
  509. package/server/modules/context-events/tests/session-blocked-events.test.ts +3 -3
  510. package/server/modules/context-events/tests/session-run-events.test.ts +1 -1
  511. package/server/modules/database/migrations.ts +24 -1
  512. package/server/modules/database/repositories/sessions.db.ts +41 -4
  513. package/server/modules/database/repositories/voice-user-identifiers.db.ts +1 -1
  514. package/server/modules/database/schema.ts +16 -2
  515. package/server/modules/database/tests/migrations-ensure-columns.test.ts +2 -0
  516. package/server/modules/database/tests/sessions-provider-mapping.test.ts +2 -2
  517. package/server/modules/debug-agent/tests/debug-agent-permission-popup.test.ts +2 -2
  518. package/server/modules/liaison/liaison-deliver.service.ts +4 -4
  519. package/server/modules/liaison/liaison.module.ts +1 -1
  520. package/server/modules/mcp-gateway/mcp-gateway.auth.ts +3 -2
  521. package/server/modules/mcp-gateway/mcp-self-target.ts +2 -2
  522. package/server/modules/mcp-gateway/mcp-session-send.ts +21 -2
  523. package/server/modules/mcp-gateway/mcp-tool-annotations.ts +4 -4
  524. package/server/modules/mcp-gateway/oauth-metadata.gate.ts +4 -5
  525. package/server/modules/mcp-gateway/tests/knowledge-effective-config-proof.test.ts +1 -1
  526. package/server/modules/mcp-gateway/tests/knowledge-peer-correlation-proof.test.ts +2 -2
  527. package/server/modules/mcp-gateway/tests/mcp-approvals.test.ts +3 -2
  528. package/server/modules/mcp-gateway/tests/mcp-audit-route.test.ts +1 -1
  529. package/server/modules/mcp-gateway/tests/mcp-audit.test.ts +4 -4
  530. package/server/modules/mcp-gateway/tests/mcp-auth.test.ts +3 -1
  531. package/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.ts +3 -2
  532. package/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.ts +7 -3
  533. package/server/modules/mcp-gateway/tests/mcp-correlation-id.test.ts +8 -8
  534. package/server/modules/mcp-gateway/tests/mcp-draft.test.ts +3 -2
  535. package/server/modules/mcp-gateway/tests/mcp-english-only.test.ts +1 -1
  536. package/server/modules/mcp-gateway/tests/mcp-gateway-wiring.test.ts +2 -2
  537. package/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.ts +1 -1
  538. package/server/modules/mcp-gateway/tests/mcp-knowledge-facts.test.ts +1 -1
  539. package/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.ts +1 -1
  540. package/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.ts +3 -2
  541. package/server/modules/mcp-gateway/tests/mcp-overview.test.ts +2 -2
  542. package/server/modules/mcp-gateway/tests/mcp-pending-interaction.test.ts +2 -2
  543. package/server/modules/mcp-gateway/tests/mcp-read-tools.test.ts +3 -3
  544. package/server/modules/mcp-gateway/tests/mcp-run-get.test.ts +1 -1
  545. package/server/modules/mcp-gateway/tests/mcp-self-target.test.ts +1 -1
  546. package/server/modules/mcp-gateway/tests/mcp-session-background.test.ts +2 -2
  547. package/server/modules/mcp-gateway/tests/mcp-session-host-control.test.ts +1 -1
  548. package/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.ts +1 -1
  549. package/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.ts +2 -2
  550. package/server/modules/mcp-gateway/tests/mcp-session-search-pruning.test.ts +1 -1
  551. package/server/modules/mcp-gateway/tests/mcp-session-search.test.ts +1 -1
  552. package/server/modules/mcp-gateway/tests/mcp-session-send.test.ts +2 -2
  553. package/server/modules/mcp-gateway/tests/mcp-ui-last-opened.test.ts +1 -1
  554. package/server/modules/mcp-gateway/tests/mcp-usage-stats.test.ts +1 -1
  555. package/server/modules/mcp-gateway/tests/mcp-write-notification.test.ts +2 -2
  556. package/server/modules/mcp-gateway/tests/oauth-flow.e2e.test.ts +3 -3
  557. package/server/modules/notifications/services/notification-orchestrator.service.js +1 -1
  558. package/server/modules/oauth/access-tokens.service.ts +8 -8
  559. package/server/modules/oauth/oauth-consent.service.ts +20 -15
  560. package/server/modules/oauth/tests/access-token-scopes.test.ts +55 -34
  561. package/server/modules/oauth/tests/access-tokens.service.test.ts +50 -14
  562. package/server/modules/oauth/tests/oauth-consent-page.test.ts +29 -21
  563. package/server/modules/oauth/tests/oauth-consent-ratelimit.test.ts +2 -2
  564. package/server/modules/oauth/tests/token-info.routes.test.ts +2 -2
  565. package/server/modules/observation/architecture-delta.producer.ts +1 -1
  566. package/server/modules/observation/blind-spots.ts +1 -1
  567. package/server/modules/observation/observation-store.ts +54 -16
  568. package/server/modules/observation/observation-uri.ts +34 -21
  569. package/server/modules/observation/observation.routes.ts +1 -1
  570. package/server/modules/observation/project-truth.ts +3 -3
  571. package/server/modules/observation/session-ask-decision-answer.ts +2 -1
  572. package/server/modules/observation/session-digest-llm.ts +7 -1
  573. package/server/modules/observation/session-digest.ts +39 -5
  574. package/server/modules/observation/tests/architecture-delta.test.ts +1 -1
  575. package/server/modules/observation/tests/observation-routes.test.ts +13 -0
  576. package/server/modules/observation/tests/observation-store.test.ts +58 -0
  577. package/server/modules/observation/tests/project-truth.test.ts +2 -2
  578. package/server/modules/observation/tests/session-ask-decision-digest.test.ts +189 -0
  579. package/server/modules/observation/tests/session-digest.test.ts +43 -0
  580. package/server/modules/providers/index.ts +13 -0
  581. package/server/modules/providers/list/claude/claude-host-driver.provider.ts +1 -1
  582. package/server/modules/providers/list/codex/codex-app-server.client.ts +37 -5
  583. package/server/modules/providers/list/codex/codex-app-server.connection.ts +1 -1
  584. package/server/modules/providers/list/codex/codex-host-driver.contract.ts +18 -9
  585. package/server/modules/providers/list/codex/codex-host-driver.provider.ts +15 -1
  586. package/server/modules/providers/list/codex/codex-models.provider.ts +16 -3
  587. package/server/modules/providers/list/codex/codex-provider-injection.ts +323 -0
  588. package/server/modules/providers/list/codex/codex-resident-provider-launch.ts +71 -0
  589. package/server/modules/providers/list/codex/codex-runtime.provider.ts +20 -1
  590. package/server/modules/providers/list/cursor/cursor-models.provider.ts +1 -1
  591. package/server/modules/providers/list/opencode/opencode-models.provider.ts +1 -1
  592. package/server/modules/providers/provider.routes.ts +23 -2
  593. package/server/modules/providers/services/provider-models.service.ts +187 -124
  594. package/server/modules/providers/services/provider-runtime.service.ts +3 -0
  595. package/server/modules/providers/services/session-model-resolver.ts +180 -0
  596. package/server/modules/providers/services/session-provider-binding.ts +176 -0
  597. package/server/modules/providers/services/sessions.service.ts +5 -1
  598. package/server/modules/providers/tests/claude-resident-addressable.test.ts +2 -2
  599. package/server/modules/providers/tests/claude-session-name-authority.test.ts +4 -4
  600. package/server/modules/providers/tests/codex-app-server-protocol.test.ts +1 -1
  601. package/server/modules/providers/tests/codex-host-driver-persistent.test.ts +2 -2
  602. package/server/modules/providers/tests/codex-provider-model-binding.test.ts +345 -0
  603. package/server/modules/providers/tests/codex-resident-provider-injection.test.ts +561 -0
  604. package/server/modules/providers/tests/codex-runtime-provider-injection.test.ts +269 -0
  605. package/server/modules/providers/tests/codex-session-provider-binding.test.ts +386 -0
  606. package/server/modules/providers/tests/codex-sessions.test.ts +1 -1
  607. package/server/modules/providers/tests/opencode-sessions.test.ts +2 -2
  608. package/server/modules/providers/tests/provider-models.service.test.ts +15 -0
  609. package/server/modules/providers/tests/provider.routes.test.ts +1 -1
  610. package/server/modules/quay/index.ts +1 -1
  611. package/server/modules/quay/quay-dispatch-carrier.ts +1 -1
  612. package/server/modules/quay/quay-fleet-cli.ts +1 -1
  613. package/server/modules/quay/quay-fleet-locator.ts +2 -2
  614. package/server/modules/quay/quay-fleet-project-id.ts +14 -14
  615. package/server/modules/quay/quay-fleet-registry.ts +8 -8
  616. package/server/modules/quay/quay-suite-fanin-reader.ts +1 -1
  617. package/server/modules/quay/quay-uri-resolve.ts +8 -8
  618. package/server/modules/quay/quay.module.ts +3 -3
  619. package/server/modules/quay/quay.routes.ts +1 -1
  620. package/server/modules/quay/quay.service.ts +6 -6
  621. package/server/modules/quay/session-task-chain.service.ts +1 -1
  622. package/server/modules/quay/tests/contracts/fleet-cli-contracts.test.ts +3 -3
  623. package/server/modules/quay/tests/contracts/shapes.ts +10 -10
  624. package/server/modules/quay/tests/quay-fleet-locator.test.ts +1 -1
  625. package/server/modules/quay/tests/quay-fleet-project-id.test.ts +6 -6
  626. package/server/modules/quay/tests/quay-uri-resolve.test.ts +10 -10
  627. package/server/modules/session-hosts/tests/resident-server-restart.test.ts +1 -1
  628. package/server/modules/settings/codex-mcp-gateway.settings.ts +1 -1
  629. package/server/modules/settings/codex-model-providers.schema.ts +460 -0
  630. package/server/modules/settings/codex-model-providers.service.ts +235 -0
  631. package/server/modules/settings/codex-model-providers.settings.ts +713 -0
  632. package/server/modules/settings/codex-model-providers.store.ts +244 -0
  633. package/server/modules/settings/index.ts +18 -0
  634. package/server/modules/settings/server-settings-file.ts +29 -41
  635. package/server/modules/settings/server-settings.ts +2 -3
  636. package/server/modules/settings/settings.module.ts +41 -0
  637. package/server/modules/settings/settings.routes.ts +37 -0
  638. package/server/modules/settings/settings.service.ts +21 -26
  639. package/server/modules/settings/tests/cockpit-session-start-settings.routes.test.ts +1 -0
  640. package/server/modules/settings/tests/codex-model-providers-settings.test.ts +413 -0
  641. package/server/modules/settings/tests/codex-provider-advanced.test.ts +540 -0
  642. package/server/modules/settings/tests/codex-provider-import.test.ts +621 -0
  643. package/server/modules/voice/tests/voice-lexicon.test.ts +10 -10
  644. package/server/modules/voice/voice-lexicon.ts +1 -1
  645. package/server/modules/websocket/services/chat-control.service.ts +35 -2
  646. package/server/modules/websocket/services/chat-websocket.service.ts +25 -1
  647. package/server/modules/websocket/tests/chat-background-task.test.ts +17 -1
  648. package/server/modules/websocket/tests/chat-stop-task.test.ts +17 -1
  649. package/server/modules/worktrees/services/worktree-list.service.ts +1 -1
  650. package/server/modules/worktrees/services/worktree-open.service.ts +1 -1
  651. package/server/modules/worktrees/services/worktree-remove.service.ts +1 -1
  652. package/server/shared/brand.ts +24 -38
  653. package/server/shared/data-root-migration.ts +3 -2
  654. package/server/shared/data-root.ts +73 -79
  655. package/server/shared/interfaces.ts +1 -1
  656. package/server/shared/mcp-contract/types.ts +20 -15
  657. package/server/shared/ports/codex-provider-registry.port.ts +133 -0
  658. package/server/shared/ports/session-blocked-events.port.ts +1 -1
  659. package/server/shared/ports/session-run-events.port.ts +2 -2
  660. package/server/shared/settings-file.ts +167 -6
  661. package/server/shared/tests/architecture-ratchet.baseline.json +15 -15
  662. package/server/shared/tests/cloudpit-brand-env.test.ts +106 -36
  663. package/server/shared/tests/cloudpit-data-root.test.ts +42 -18
  664. package/server/shared/tests/cloudpit-goal-exit-gate.baseline.json +6 -2
  665. package/server/shared/tests/cloudpit-goal-exit-gate.test.ts +179 -17
  666. package/server/shared/tests/cloudpit-runtime-flip.test.ts +162 -123
  667. package/server/shared/tests/frontend-import-cycle-budget.baseline.json +8 -6
  668. package/server/shared/tests/frontend-import-cycle-budget.test.ts +9 -1
  669. package/server/shared/tests/quay-test-script.test.ts +40 -6
  670. package/server/shared/tests/settings-file.test.ts +83 -1
  671. package/server/shared/types.ts +121 -8
  672. package/server/shared/utils.ts +1 -1
  673. package/dist/assets/channel-D7XqNTJC.js +0 -1
  674. package/dist/assets/channel-sbQyI1an.js +0 -1
  675. package/dist/assets/classDiagram-JCYQIIEL-DHudi-zH.js +0 -1
  676. package/dist/assets/classDiagram-JCYQIIEL-DV7ybJJG.js +0 -1
  677. package/dist/assets/classDiagram-v2-OCEON4UE-DHudi-zH.js +0 -1
  678. package/dist/assets/classDiagram-v2-OCEON4UE-DV7ybJJG.js +0 -1
  679. package/dist/assets/index-BsACp0s2.css +0 -32
  680. package/dist/assets/swimlanesDiagram-ULZ7WXOC-CNMNp6YA.js +0 -8
  681. package/dist/assets/swimlanesDiagram-ULZ7WXOC-DOjtDEUW.js +0 -8
  682. package/dist/icons/icon-128x128.svg +0 -12
  683. package/dist/icons/icon-144x144.svg +0 -12
  684. package/dist/icons/icon-152x152.svg +0 -12
  685. package/dist/icons/icon-192x192.svg +0 -12
  686. package/dist/icons/icon-384x384.svg +0 -12
  687. package/dist/icons/icon-512x512.svg +0 -12
  688. package/dist/icons/icon-72x72.svg +0 -12
  689. package/dist/icons/icon-96x96.svg +0 -12
  690. 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@2.0.0` is published and its packed tarball exposes only the
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-v2.0.0-*` release assets
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 the release sequence publishes. */
44
+ /** The renamed package and the default version this verifier reads. */
39
45
  export const NEW_PACKAGE = '@yalehwang/cloudpit';
40
- export const NEW_VERSION = '2.0.0';
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
- export const LOCAL_SERVER_ASSET_PREFIX = `cloudpit-local-server-v${NEW_VERSION}-`;
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 !== NEW_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}@${NEW_VERSION} is not published`,
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, LOCAL_SERVER_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(LOCAL_SERVER_ASSET_PREFIX);
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)}/${NEW_VERSION}`),
449
- requestJson(fetchImpl, `https://unpkg.com/${NEW_PACKAGE}@${NEW_VERSION}/package.json`),
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${NEW_VERSION}`, {
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: NEW_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}2.0.0-linux-x64.deb`, downloadable: true },
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
- /new-package: new package @yalehwang\/cloudpit@2\.0\.0 is not published/,
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}2.0.0-linux-x64.deb`, downloadable: false },
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.match(
211
- result.stderr,
212
- /desktop release asset cloudpit-local-server-v2\.0\.0-\* is missing or not downloadable/,
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: 'cloudcli', title: 'CloudCLI', version: '1' },
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 CloudCLI instance for verification work.
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