blun-king-cli 9.0.1 → 9.1.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 (193) hide show
  1. package/LIESMICH.txt +31 -6
  2. package/README.md +35 -4
  3. package/bin/launcher-mode.js +13 -2
  4. package/bin/launcher-runtime.js +103 -31
  5. package/bin/plugin-bootstrap.js +11 -4
  6. package/bin/private-paths.js +1577 -10
  7. package/bin/update-notice.js +197 -46
  8. package/blun.mjs +7422 -3448
  9. package/dist-web/assets/{CodeBlockNode-Bsvp6ZEy.js → CodeBlockNode-CXnTLMNr.js} +1 -1
  10. package/dist-web/assets/{CodeBlockShell.vue_vue_type_style_index_0_lang-ta7hLjia.js → CodeBlockShell.vue_vue_type_style_index_0_lang-CCF8Ntnq.js} +1 -1
  11. package/dist-web/assets/{DesignSystemView-BmDDe28A.js → DesignSystemView-BbMOu-XO.js} +1 -1
  12. package/dist-web/assets/{Tooltip-nEEfaYVY.js → Tooltip-CFQEzqC-.js} +1 -1
  13. package/dist-web/assets/abnfDiagram-N423BO3Z-CsByy-GW.js +1 -0
  14. package/dist-web/assets/abnfDiagram-N423BO3Z-Z1APZG5m.js +1 -0
  15. package/dist-web/assets/arc-C-LXCaja.js +1 -0
  16. package/dist-web/assets/arc-C4VyWloT.js +1 -0
  17. package/dist-web/assets/architectureDiagram-T3A2C74G-DZq4L18e.js +36 -0
  18. package/dist-web/assets/architectureDiagram-T3A2C74G-DpddbUcM.js +36 -0
  19. package/dist-web/assets/blockDiagram-VBNYF7ZC-BV4sIf98.js +132 -0
  20. package/dist-web/assets/blockDiagram-VBNYF7ZC-BqccOSMr.js +132 -0
  21. package/dist-web/assets/{c4Diagram-AAUBKEIU-DtzacMnD.js → c4Diagram-5PPSVZJV-0MRkZlgP.js} +1 -1
  22. package/dist-web/assets/{c4Diagram-AAUBKEIU-D1VdMx8d.js → c4Diagram-5PPSVZJV-OHAcJrTy.js} +1 -1
  23. package/dist-web/assets/channel-B2VOQOI-.js +1 -0
  24. package/dist-web/assets/channel-DKjwM05G.js +1 -0
  25. package/dist-web/assets/{chunk-ND2GUHAM-DJoY9wNJ.js → chunk-2GRJ4B5K-DqJHs8Fw.js} +1 -1
  26. package/dist-web/assets/{chunk-ND2GUHAM-C4-rwdcv.js → chunk-2GRJ4B5K-oO6nqeLA.js} +1 -1
  27. package/dist-web/assets/{chunk-QZHKN3VN-C7YGaShq.js → chunk-2Q5K7J3B-B1nCd91o.js} +1 -1
  28. package/dist-web/assets/{chunk-QZHKN3VN-_Rz9_NuS.js → chunk-2Q5K7J3B-BC0Hsfqy.js} +1 -1
  29. package/dist-web/assets/chunk-5RXB4S5H-BfZa4yDH.js +231 -0
  30. package/dist-web/assets/chunk-5RXB4S5H-neG70kZx.js +231 -0
  31. package/dist-web/assets/{chunk-FMBD7UC4-DlLNDUx6.js → chunk-5VM5RSS4-l7biGqeH.js} +1 -1
  32. package/dist-web/assets/{chunk-FMBD7UC4-B2zs_Y-d.js → chunk-5VM5RSS4-u00AcpiJ.js} +1 -1
  33. package/dist-web/assets/chunk-6Q2QTUOP-BO-F11Gs.js +88 -0
  34. package/dist-web/assets/chunk-6Q2QTUOP-RUVRPBzG.js +88 -0
  35. package/dist-web/assets/{chunk-727SXJPM-Dn5wkDO_.js → chunk-GF5L2VYU-Ba-86KTd.js} +5 -5
  36. package/dist-web/assets/{chunk-727SXJPM-Dk2Xa3bA.js → chunk-GF5L2VYU-BtC69fw0.js} +5 -5
  37. package/dist-web/assets/{chunk-4BX2VUAB-DxZViaHS.js → chunk-JWPE2WC7-DIOubEqr.js} +1 -1
  38. package/dist-web/assets/{chunk-4BX2VUAB-WqrE2gaw.js → chunk-JWPE2WC7-u8Pcfhwh.js} +1 -1
  39. package/dist-web/assets/{chunk-2J33WTMH-Dm_s0_4f.js → chunk-KBJHAD2P-DDUeH_Ba.js} +1 -1
  40. package/dist-web/assets/{chunk-2J33WTMH-w4sdiKFO.js → chunk-KBJHAD2P-DS3BL64y.js} +1 -1
  41. package/dist-web/assets/chunk-RYQCIY6F-B9gFMVbS.js +1 -0
  42. package/dist-web/assets/chunk-RYQCIY6F-xg3EO0le.js +1 -0
  43. package/dist-web/assets/{chunk-55IACEB6-B5dE1-Um.js → chunk-XXDRQBXY-B60H0rRC.js} +1 -1
  44. package/dist-web/assets/{chunk-55IACEB6-B12zGIFz.js → chunk-XXDRQBXY-Bn1Xz6TQ.js} +1 -1
  45. package/dist-web/assets/classDiagram-JCYQIIEL-BA1TjAxj.js +1 -0
  46. package/dist-web/assets/classDiagram-JCYQIIEL-BNU7Qn4k.js +1 -0
  47. package/dist-web/assets/classDiagram-v2-OCEON4UE-BA1TjAxj.js +1 -0
  48. package/dist-web/assets/classDiagram-v2-OCEON4UE-BNU7Qn4k.js +1 -0
  49. package/dist-web/assets/{cose-bilkent-S5V4N54A-Bi19n8m-.js → cose-bilkent-JH36ORCC-4Ybddg08.js} +1 -1
  50. package/dist-web/assets/{cose-bilkent-S5V4N54A-c8o8NFp5.js → cose-bilkent-JH36ORCC-DqigO3T4.js} +1 -1
  51. package/dist-web/assets/cynefin-VYW2F7L2-C-EfYT07.js +178 -0
  52. package/dist-web/assets/cynefin-VYW2F7L2-rpD93tQ-.js +178 -0
  53. package/dist-web/assets/cynefinDiagram-MW4NZA55-DWZPLJcD.js +62 -0
  54. package/dist-web/assets/cynefinDiagram-MW4NZA55-DbTqnkVJ.js +62 -0
  55. package/dist-web/assets/dagre-VZM6K2ZE-DcM8aEVY.js +4 -0
  56. package/dist-web/assets/dagre-VZM6K2ZE-M_HVNtqP.js +4 -0
  57. package/dist-web/assets/diagram-7IWD3JNH-DoNximNF.js +30 -0
  58. package/dist-web/assets/diagram-7IWD3JNH-UymgsBNa.js +30 -0
  59. package/dist-web/assets/{diagram-KO2AKTUF-CFQs13i5.js → diagram-B4RE2ZJO-BVA2EhnC.js} +3 -3
  60. package/dist-web/assets/{diagram-KO2AKTUF-agFIuPJW.js → diagram-B4RE2ZJO-BiYu5WPF.js} +3 -3
  61. package/dist-web/assets/{diagram-LMA3HP47-TMIXizxR.js → diagram-LBJQPF4R-BD3kkgOO.js} +2 -2
  62. package/dist-web/assets/{diagram-LMA3HP47-He5zlyMt.js → diagram-LBJQPF4R-m3a1Euj3.js} +2 -2
  63. package/dist-web/assets/diagram-Q27KOJAE-D1mYQ_cI.js +24 -0
  64. package/dist-web/assets/diagram-Q27KOJAE-hy_T73PK.js +24 -0
  65. package/dist-web/assets/diagram-UB23O5K3-BWkoQZ4A.js +41 -0
  66. package/dist-web/assets/diagram-UB23O5K3-BtX8u6HG.js +41 -0
  67. package/dist-web/assets/ebnfDiagram-BXEA7PRR-BKs9JUHW.js +1 -0
  68. package/dist-web/assets/ebnfDiagram-BXEA7PRR-CBAnFkRF.js +1 -0
  69. package/dist-web/assets/erDiagram-JOGREHBK-3vKcWsxm.js +85 -0
  70. package/dist-web/assets/erDiagram-JOGREHBK-BIpd6dTf.js +85 -0
  71. package/dist-web/assets/flowDiagram-UKHOOZJN-D9wBbHm2.js +156 -0
  72. package/dist-web/assets/flowDiagram-UKHOOZJN-Z83i2UWI.js +156 -0
  73. package/dist-web/assets/ganttDiagram-PKOTCBZU-Cd_dViF-.js +292 -0
  74. package/dist-web/assets/ganttDiagram-PKOTCBZU-DFrb_S1d.js +292 -0
  75. package/dist-web/assets/{gitGraphDiagram-PVQCEYII-BSDFfwdY.js → gitGraphDiagram-DS77QQ5N-BiEEtTo7.js} +3 -3
  76. package/dist-web/assets/{gitGraphDiagram-PVQCEYII-DMbTATyw.js → gitGraphDiagram-DS77QQ5N-Dp3Ar-hi.js} +3 -3
  77. package/dist-web/assets/{graph-BwjfAU3j.js → graph-CAUpWmoK.js} +1 -1
  78. package/dist-web/assets/{graph--OzhPTMs.js → graph-DOmOIIwC.js} +1 -1
  79. package/dist-web/assets/{index-W6VnSrkB.js → index-Ba1OvLjf.js} +2 -2
  80. package/dist-web/assets/{index-CkVgGDpx.js → index-CiPA8Kex.js} +4 -4
  81. package/dist-web/assets/{index-BzK4vJBu.js → index-DdEakFJM.js} +1 -1
  82. package/dist-web/assets/{index10-Czg_oF-W.js → index10-CNr4U-Nw.js} +1 -1
  83. package/dist-web/assets/{index11-BjzCZuCr.js → index11-Dto_yZNz.js} +1 -1
  84. package/dist-web/assets/{index5-DlVoNkCD.js → index5-B2PldaO2.js} +1 -1
  85. package/dist-web/assets/{index6-BxiXA2yo.js → index6-CBdZmmyx.js} +1 -1
  86. package/dist-web/assets/{index7-BPdza6d1.js → index7-Dz9oCsUF.js} +1 -1
  87. package/dist-web/assets/{index8-Q_XzGC1Z.js → index8-B6k25jtU.js} +2 -2
  88. package/dist-web/assets/{infoDiagram-5YYISTIA-2JF3XEdD.js → infoDiagram-6WML65LV-BSa2g04G.js} +1 -1
  89. package/dist-web/assets/{infoDiagram-5YYISTIA-UrQusrJq.js → infoDiagram-6WML65LV-D4ph2sIH.js} +1 -1
  90. package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-7RVUL-vB.js → ishikawaDiagram-WSZJBQD7-DjKjbMm9.js} +5 -5
  91. package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-C5OstRVV.js → ishikawaDiagram-WSZJBQD7-Hm36UOQe.js} +5 -5
  92. package/dist-web/assets/{journeyDiagram-JHISSGLW-B34fCMu9.js → journeyDiagram-NVQOT4AX-DttHDfPQ.js} +1 -1
  93. package/dist-web/assets/{journeyDiagram-JHISSGLW-yctdo4bX.js → journeyDiagram-NVQOT4AX-MvWWPNDV.js} +1 -1
  94. package/dist-web/assets/{kanban-definition-UN3LZRKU-BS4FBZsQ.js → kanban-definition-27J2QSJJ-C5gB-W0d.js} +7 -7
  95. package/dist-web/assets/{kanban-definition-UN3LZRKU-CxBCv27E.js → kanban-definition-27J2QSJJ-Cu-E_cXA.js} +5 -5
  96. package/dist-web/assets/layout-CvP6o9AK.js +1 -0
  97. package/dist-web/assets/layout-D-LzfAck.js +1 -0
  98. package/dist-web/assets/{linear-3mB6q2-g.js → linear-B3HWgQI2.js} +1 -1
  99. package/dist-web/assets/{linear-BKCnUo31.js → linear-BRGe4-d6.js} +1 -1
  100. package/dist-web/assets/map-CWKZqZjr.js +1 -0
  101. package/dist-web/assets/map-DxJ2ADlA.js +1 -0
  102. package/dist-web/assets/mermaid.core-D-9Sx1No.js +314 -0
  103. package/dist-web/assets/mermaidParser.worker-PTFfzpoB.js +318 -0
  104. package/dist-web/assets/{mindmap-definition-RKZ34NQL-BmJZpjh6.js → mindmap-definition-FAOFIHXS-C4vnms3i.js} +2 -2
  105. package/dist-web/assets/{mindmap-definition-RKZ34NQL-1mjWUcf6.js → mindmap-definition-FAOFIHXS-Cg_hoVIq.js} +1 -1
  106. package/dist-web/assets/pegDiagram-VL7TDLO6-B2fFEFUH.js +1 -0
  107. package/dist-web/assets/pegDiagram-VL7TDLO6-CSX9hitD.js +1 -0
  108. package/dist-web/assets/pieDiagram-7S7Q4E2Y-0L0mxahZ.js +39 -0
  109. package/dist-web/assets/pieDiagram-7S7Q4E2Y-C7T0Cmw1.js +39 -0
  110. package/dist-web/assets/{quadrantDiagram-W4KKPZXB-BmT_qM09.js → quadrantDiagram-CIZ2JOQS-BBy7w4kD.js} +3 -3
  111. package/dist-web/assets/{quadrantDiagram-W4KKPZXB-C0kPuyNP.js → quadrantDiagram-CIZ2JOQS-U483z0er.js} +3 -3
  112. package/dist-web/assets/railroadDiagram-AXF67PYL-D80a2_DJ.js +1 -0
  113. package/dist-web/assets/railroadDiagram-AXF67PYL-DX8y0MzW.js +1 -0
  114. package/dist-web/assets/{requirementDiagram-4Y6WPE33-C0YP_Amt.js → requirementDiagram-LRYGKXZP-CeyHfq8t.js} +3 -3
  115. package/dist-web/assets/{requirementDiagram-4Y6WPE33-CZrxH1Y2.js → requirementDiagram-LRYGKXZP-DGD5J_4k.js} +3 -3
  116. package/dist-web/assets/sankeyDiagram-W5VNT64P-CCISkkrR.js +40 -0
  117. package/dist-web/assets/sankeyDiagram-W5VNT64P-CT5PdZz2.js +40 -0
  118. package/dist-web/assets/sequenceDiagram-SI44F4Z6-BeMzHWXI.js +162 -0
  119. package/dist-web/assets/sequenceDiagram-SI44F4Z6-jQfm2XS7.js +162 -0
  120. package/dist-web/assets/sizeCapture-X5ZJPWSS-BQsTdtrv.js +1 -0
  121. package/dist-web/assets/sizeCapture-X5ZJPWSS-lRZsmCoS.js +1 -0
  122. package/dist-web/assets/stateDiagram-OKZ733FA-ClCgTdUm.js +1 -0
  123. package/dist-web/assets/stateDiagram-OKZ733FA-Cv59z5YT.js +1 -0
  124. package/dist-web/assets/stateDiagram-v2-UEYNNEHI-R8jTc--F.js +1 -0
  125. package/dist-web/assets/stateDiagram-v2-UEYNNEHI-fi_lrTAx.js +1 -0
  126. package/dist-web/assets/swimlanes-SLNWSIFB-BCdOUN05.js +2 -0
  127. package/dist-web/assets/swimlanes-SLNWSIFB-Cu5l7SuR.js +1 -0
  128. package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-BUd_uYK3.js +8 -0
  129. package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-CalrsgPK.js +8 -0
  130. package/dist-web/assets/{timeline-definition-PNZ67QCA-DsVZdrZa.js → timeline-definition-Z64GVDOM-CMjnh4bu.js} +4 -4
  131. package/dist-web/assets/{timeline-definition-PNZ67QCA-DnB6Usl0.js → timeline-definition-Z64GVDOM-DpWutSKa.js} +4 -4
  132. package/dist-web/assets/vennDiagram-T6HMQDX7-DKJW_8oU.js +34 -0
  133. package/dist-web/assets/vennDiagram-T6HMQDX7-DVC5JVsc.js +34 -0
  134. package/dist-web/assets/{vue.runtime.esm-bundler-pgHGheCW.js → vue.runtime.esm-bundler-BwwRtQwQ.js} +1 -1
  135. package/dist-web/assets/{wardleyDiagram-YWT4CUSO-oBauTCEw.js → wardleyDiagram-T6FBY63Y-BK2mrq7L.js} +3 -3
  136. package/dist-web/assets/{wardleyDiagram-YWT4CUSO-DCiyDQNB.js → wardleyDiagram-T6FBY63Y-oUvgepFn.js} +3 -3
  137. package/dist-web/assets/xychartDiagram-ELKLHX3M-DI6n79q0.js +7 -0
  138. package/dist-web/assets/xychartDiagram-ELKLHX3M-DUJu9F7-.js +7 -0
  139. package/dist-web/index.html +1 -1
  140. package/dist-web/vis/index.html.gz +0 -0
  141. package/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  142. package/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  143. package/package.json +7 -2
  144. package/telegram-plugin/dist/bridge.mjs +6 -4
  145. package/telegram-plugin/dist/mcp-server.mjs +236 -71
  146. package/dist-web/assets/arc-4xPfymbf.js +0 -1
  147. package/dist-web/assets/arc-Doj0wRZ0.js +0 -1
  148. package/dist-web/assets/architectureDiagram-3BPJPVTR-BGih283a.js +0 -36
  149. package/dist-web/assets/architectureDiagram-3BPJPVTR-CQ09RrbH.js +0 -36
  150. package/dist-web/assets/blockDiagram-GPEHLZMM-3ShMf1gu.js +0 -132
  151. package/dist-web/assets/blockDiagram-GPEHLZMM-CAtDjkJt.js +0 -132
  152. package/dist-web/assets/channel-DNkUo9e6.js +0 -1
  153. package/dist-web/assets/channel-DcnUTIGB.js +0 -1
  154. package/dist-web/assets/chunk-AQP2D5EJ-FS8-f8lF.js +0 -231
  155. package/dist-web/assets/chunk-AQP2D5EJ-UKhb4V4r.js +0 -231
  156. package/dist-web/assets/classDiagram-4FO5ZUOK-B1ZO8EbE.js +0 -1
  157. package/dist-web/assets/classDiagram-4FO5ZUOK-xk6cM9Kq.js +0 -1
  158. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-B1ZO8EbE.js +0 -1
  159. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-xk6cM9Kq.js +0 -1
  160. package/dist-web/assets/dagre-BM42HDAG-CmUO9qKN.js +0 -4
  161. package/dist-web/assets/dagre-BM42HDAG-DLMfLCoV.js +0 -4
  162. package/dist-web/assets/diagram-2AECGRRQ-DQTst0OH.js +0 -43
  163. package/dist-web/assets/diagram-2AECGRRQ-L74iLMqd.js +0 -43
  164. package/dist-web/assets/diagram-5GNKFQAL-BiBm7CJR.js +0 -10
  165. package/dist-web/assets/diagram-5GNKFQAL-DoE6q7H1.js +0 -10
  166. package/dist-web/assets/diagram-OG6HWLK6-BHCt1E0n.js +0 -24
  167. package/dist-web/assets/diagram-OG6HWLK6-DRyxjFMa.js +0 -24
  168. package/dist-web/assets/erDiagram-TEJ5UH35-BoDczjGG.js +0 -85
  169. package/dist-web/assets/erDiagram-TEJ5UH35-yd6SOv_7.js +0 -85
  170. package/dist-web/assets/flowDiagram-I6XJVG4X-DHoceI7r.js +0 -162
  171. package/dist-web/assets/flowDiagram-I6XJVG4X-DkYNQv0R.js +0 -162
  172. package/dist-web/assets/ganttDiagram-6RSMTGT7-Cg1TQBc0.js +0 -292
  173. package/dist-web/assets/ganttDiagram-6RSMTGT7-Z6klo7KK.js +0 -292
  174. package/dist-web/assets/layout-C1ojF0zw.js +0 -1
  175. package/dist-web/assets/layout-SsrduOYp.js +0 -1
  176. package/dist-web/assets/mermaid.core-D_lKT0dR.js +0 -309
  177. package/dist-web/assets/mermaidParser.worker-Dx4jPi9z.js +0 -313
  178. package/dist-web/assets/pieDiagram-4H26LBE5-BU41t2A_.js +0 -30
  179. package/dist-web/assets/pieDiagram-4H26LBE5-BkwDAvbt.js +0 -30
  180. package/dist-web/assets/sankeyDiagram-5OEKKPKP-De_o7hDr.js +0 -40
  181. package/dist-web/assets/sankeyDiagram-5OEKKPKP-Dvuj6bMA.js +0 -40
  182. package/dist-web/assets/sequenceDiagram-3UESZ5HK-DuCrgPyA.js +0 -162
  183. package/dist-web/assets/sequenceDiagram-3UESZ5HK-VAxffBe7.js +0 -162
  184. package/dist-web/assets/stateDiagram-AJRCARHV-CYLupxM7.js +0 -1
  185. package/dist-web/assets/stateDiagram-AJRCARHV-nDExQydZ.js +0 -1
  186. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BhEc7Thx.js +0 -1
  187. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BzwD_BIl.js +0 -1
  188. package/dist-web/assets/vennDiagram-CIIHVFJN-BBHQmCFf.js +0 -34
  189. package/dist-web/assets/vennDiagram-CIIHVFJN-Cfj-K9NW.js +0 -34
  190. package/dist-web/assets/wardley-L42UT6IY-BJFn8eDD.js +0 -173
  191. package/dist-web/assets/wardley-L42UT6IY-BSu8-4hg.js +0 -173
  192. package/dist-web/assets/xychartDiagram-2RQKCTM6-C2iZpl9I.js +0 -7
  193. package/dist-web/assets/xychartDiagram-2RQKCTM6-Db_VoDBV.js +0 -7
package/LIESMICH.txt CHANGED
@@ -1,5 +1,5 @@
1
- BLUN King für macOS
2
- ===================
1
+ BLUN King für macOS und Windows
2
+ ===============================
3
3
 
4
4
  Voraussetzung
5
5
  -------------
@@ -7,15 +7,40 @@ Node.js 24.15 oder neuer muss installiert sein.
7
7
 
8
8
  Installation
9
9
  ------------
10
- Das bereitgestellte Paket global installieren:
10
+ Die geprüfte Version exakt global installieren:
11
11
 
12
- npm install -g blun-king-cli
12
+ npm install -g blun-king-cli@9.1.0
13
13
 
14
14
  Start
15
15
  -----
16
16
 
17
- blun Lokale Konsole ohne Telegram
18
- king Dieselbe Konsole mit Telegram
17
+ blun Dieselbe CLI, ohne Telegram automatisch anzubinden
18
+ king Dieselbe CLI, mit automatisch angebundenem Telegram-Kanal
19
+
20
+ Beide Startbefehle verwenden dieselbe Version, dasselbe Konto, dasselbe Modell
21
+ und dieselben Befehle.
22
+
23
+ Nachweisbare Arbeitsabläufe
24
+ ---------------------------
25
+
26
+ blun proof Prüfergebnisse und Artefakte mit SHA-256 belegen
27
+ blun brief Einen versionierten Projektauftrag anlegen
28
+ blun handoff Eine Sitzung zwischen CLI, Desktop und Web übergeben
29
+ blun replay Einen bereinigten Arbeitsverlauf erzeugen
30
+ blun guard Belegintegrität und aktuelle Artefakte prüfen
31
+ blun demo Eine bereinigte statische Projektdemo erzeugen
32
+ blun workspace Isolierte Git-Arbeitsbereiche verwalten
33
+
34
+ Alle Befehle funktionieren identisch mit `king`.
35
+
36
+ Aktualisieren
37
+ -------------
38
+
39
+ blun update
40
+
41
+ `king update` und `upgrade` sind gleichwertig. Der Updater bleibt im installierten
42
+ Stable- oder Next-Kanal, verhindert Rückstufungen und installiert nur eine zuvor
43
+ aufgelöste exakte Paketversion.
19
44
 
20
45
  Beim ersten Start in der Konsole /login eingeben. Der Browser öffnet den
21
46
  BLUN-OAuth-Login.
package/README.md CHANGED
@@ -3,10 +3,19 @@
3
3
  Dieses Verzeichnis ist das Gerüst des öffentlichen npm-Pakets `blun-king-cli`
4
4
  (Erstveröffentlichung 8.0.0, 06.07.2026, Account `blunking`).
5
5
 
6
+ ## Installation
7
+
8
+ Voraussetzung ist Node.js 24.15 oder neuer. Die geprüfte Version wird exakt
9
+ installiert:
10
+
11
+ ```powershell
12
+ npm install -g blun-king-cli@9.1.0
13
+ ```
14
+
6
15
  ## Reproduzierbares Staging und Packen
7
16
 
8
17
  Der Schritt baut nichts, installiert nichts und veröffentlicht nichts. Vorher müssen
9
- `apps/blun-king/dist/main.mjs`, `dist-web`, die Darwin-Natives sowie
18
+ `apps/blun-king/dist/main.mjs`, `dist-web`, die Darwin- und Windows-Natives sowie
10
19
  `plugins/telegram/dist` bereits frisch gebaut sein.
11
20
 
12
21
  Das Staging landet standardmäßig
@@ -20,12 +29,34 @@ kopiert nur die Paket-Hülle, `blun.mjs`, `dist-web`, `native`, Telegrams
20
29
 
21
30
  ## Startmodi
22
31
 
23
- `blun` startet die lokale Konsole ohne Telegram. `king` startet dieselbe
24
- Konsole mit Telegram-Kanal, Pairing-Befehl und Telegram-Werkzeugen. Der
25
- Unterschied gilt nur für den laufenden Prozess; die gespeicherte
32
+ `blun` startet die lokale Konsole, ohne Telegram automatisch anzubinden. `king`
33
+ startet dieselbe Konsole und bindet den eingerichteten Telegram-Kanal automatisch
34
+ an. Version, Konto, Modell und Befehle sind ansonsten identisch. Der Unterschied
35
+ gilt nur für den laufenden Prozess; die gespeicherte
26
36
  Plugin-Konfiguration wird nicht umgeschrieben.
27
37
 
28
38
  Beim ersten Start werden das Telegram-Plugin und die mitgelieferten Skills
29
39
  eingerichtet. Die Anmeldung erfolgt anschließend in der
30
40
  Konsole mit `/login` über den BLUN-OAuth-Server. Das Paket erzeugt keine
31
41
  statische Anbieter- oder API-Key-Konfiguration.
42
+
43
+ ## Nachweisbare Arbeitsabläufe
44
+
45
+ Version 9.1.0 enthält sieben zusätzliche, getrennt nutzbare Befehlsgruppen:
46
+
47
+ - `proof` belegt Prüfungen und Artefakte mit SHA-256.
48
+ - `brief` erstellt einen versionierten Projektauftrag.
49
+ - `handoff` übergibt eine Sitzung zwischen CLI, Desktop und Web.
50
+ - `replay` erzeugt einen bereinigten Arbeitsverlauf.
51
+ - `guard` prüft Belegintegrität und aktuelle Artefakte.
52
+ - `demo` erzeugt eine bereinigte statische Projektdemo.
53
+ - `workspace` verwaltet isolierte Git-Arbeitsbereiche.
54
+
55
+ Sie stehen unter `blun` und `king` identisch zur Verfügung.
56
+
57
+ ## Aktualisieren
58
+
59
+ `blun update`, `king update` und die jeweilige Variante `upgrade` verwenden
60
+ denselben abgesicherten Updater. Er bleibt im installierten Stable- oder
61
+ Next-Kanal, verhindert Rückstufungen und übergibt npm ausschließlich eine zuvor
62
+ aufgelöste exakte Paketversion.
@@ -5,7 +5,14 @@ const LAUNCHER_MODES = Object.freeze({
5
5
  KING: 'king',
6
6
  });
7
7
 
8
- const NPM_PACKAGE_UPDATE_COMMAND = 'npm install -g blun-king-cli@latest';
8
+ const LAUNCHER_HELP_TEXT = [
9
+ '',
10
+ 'Launchers:',
11
+ ' blun Starts the CLI without automatically attaching Telegram.',
12
+ ' king Starts the same CLI and automatically attaches the configured Telegram channel.',
13
+ ' Both use the same version, account, model, and commands.',
14
+ '',
15
+ ].join('\n');
9
16
 
10
17
  function launcherModeFromArgv(argv) {
11
18
  const entry = argv[1] || '';
@@ -30,10 +37,14 @@ function isNpmPackageUpdateRequest(args) {
30
37
  return command === 'update' || command === 'upgrade';
31
38
  }
32
39
 
40
+ function launcherHelpText() {
41
+ return LAUNCHER_HELP_TEXT;
42
+ }
43
+
33
44
  module.exports = {
34
45
  LAUNCHER_MODES,
35
- NPM_PACKAGE_UPDATE_COMMAND,
36
46
  createLauncherEnvironment,
37
47
  isNpmPackageUpdateRequest,
48
+ launcherHelpText,
38
49
  launcherModeFromArgv,
39
50
  };
@@ -10,28 +10,69 @@ const os = require('node:os');
10
10
  const { spawn } = require('node:child_process');
11
11
  const {
12
12
  LAUNCHER_MODES,
13
- NPM_PACKAGE_UPDATE_COMMAND,
14
13
  createLauncherEnvironment,
15
14
  isNpmPackageUpdateRequest,
15
+ launcherHelpText,
16
16
  launcherModeFromArgv,
17
17
  } = require('./launcher-mode');
18
18
  const { installManagedTelegramPlugin } = require('./plugin-bootstrap');
19
19
  const { CORE_LOADED_MESSAGE } = require('./core-bootstrap');
20
20
  const { tryAcquireUpdateLease } = require('./update-lease');
21
- const { runUpdateNotice } = require('./update-notice');
21
+ const { runExplicitUpdate, runUpdateNotice } = require('./update-notice');
22
22
  const {
23
23
  ensurePrivateDirectory,
24
24
  securePrivateFile,
25
+ securePrivateTree,
25
26
  writePrivateFile,
26
27
  } = require('./private-paths');
27
28
 
28
29
  const PKG = path.resolve(__dirname, '..');
29
- const HOME = os.homedir();
30
- const configuredBlunHome = String(process.env.BLUN_HOME || '').trim();
31
- const BLUN = configuredBlunHome ? path.resolve(configuredBlunHome) : path.join(HOME, '.blun');
32
30
  const ARGS = process.argv.slice(2);
33
31
  const CORE_LOAD_TIMEOUT_MS = 30_000;
34
32
 
33
+ function normalizeWindowsPath(value) {
34
+ return path.win32.normalize(value).replace(/\\+$/u, '').toLowerCase();
35
+ }
36
+
37
+ function resolveLauncherPrivatePaths(options = {}) {
38
+ const env = options.env || process.env;
39
+ const platform = options.platform || process.platform;
40
+ const configuredHome = String(env.BLUN_HOME || '').trim();
41
+ if (platform !== 'win32') {
42
+ const userHome = (options.homedir || os.homedir)();
43
+ return {
44
+ blunHome: configuredHome ? path.resolve(configuredHome) : path.join(userHome, '.blun'),
45
+ userHome,
46
+ };
47
+ }
48
+
49
+ const fsImpl = options.fsImpl || fs;
50
+ const userInfo = (options.userInfo || os.userInfo)();
51
+ const reportedHome = String(userInfo?.homedir || '').trim();
52
+ if (!path.win32.isAbsolute(reportedHome) || reportedHome.startsWith('\\\\')) {
53
+ throw new Error('Das lokale Windows-Benutzerprofil konnte nicht sicher bestimmt werden.');
54
+ }
55
+ const resolvedHome = path.win32.resolve(reportedHome);
56
+ const stat = fsImpl.lstatSync(resolvedHome);
57
+ if (!stat.isDirectory() || stat.isSymbolicLink()) {
58
+ throw new Error('Das lokale Windows-Benutzerprofil ist kein vertrauenswuerdiges Verzeichnis.');
59
+ }
60
+ const realpath = fsImpl.realpathSync.native || fsImpl.realpathSync;
61
+ const userHome = path.win32.normalize(realpath(resolvedHome));
62
+ const volumeRoot = path.win32.parse(userHome).root;
63
+ if (!/^[A-Za-z]:\\$/u.test(volumeRoot)
64
+ || normalizeWindowsPath(userHome) !== normalizeWindowsPath(resolvedHome)) {
65
+ throw new Error('Das lokale Windows-Benutzerprofil ist kein kanonischer lokaler Pfad.');
66
+ }
67
+
68
+ const blunHome = path.win32.join(userHome, '.blun');
69
+ if (configuredHome
70
+ && normalizeWindowsPath(path.win32.resolve(configuredHome)) !== normalizeWindowsPath(blunHome)) {
71
+ throw new Error(`BLUN_HOME muss unter Windows exakt im Windows-Benutzerprofil liegen: ${blunHome}`);
72
+ }
73
+ return { blunHome, userHome };
74
+ }
75
+
35
76
  function readPackageVersion() {
36
77
  const { version } = JSON.parse(fs.readFileSync(path.join(PKG, 'package.json'), 'utf8'));
37
78
  if (typeof version !== 'string' || version.length === 0) {
@@ -116,11 +157,19 @@ function exitCodeForChild(result, loaded) {
116
157
  }
117
158
 
118
159
  async function runLauncher(options = {}) {
160
+ const callerCwd = process.cwd();
119
161
  const mode = options.mode || launcherModeFromArgv(process.argv);
162
+ const explicitUpdateRequest = isNpmPackageUpdateRequest(ARGS);
120
163
  const noticeResult = options.noticeLease
121
164
  ? { acquired: true, lease: options.noticeLease }
122
165
  : await tryAcquireUpdateLease({ packageRoot: PKG, role: 'notice' });
123
- if (!noticeResult.acquired) return;
166
+ if (!noticeResult.acquired) {
167
+ if (explicitUpdateRequest) {
168
+ process.stderr.write('Das Update konnte nicht verifiziert werden.\n');
169
+ process.exitCode = 1;
170
+ }
171
+ return;
172
+ }
124
173
  const noticeLease = noticeResult.lease;
125
174
  let noticeReleased = false;
126
175
  const releaseNotice = async () => {
@@ -131,7 +180,13 @@ async function runLauncher(options = {}) {
131
180
 
132
181
  try {
133
182
  const installProbe = await tryAcquireUpdateLease({ packageRoot: PKG, role: 'install' });
134
- if (!installProbe.acquired) return;
183
+ if (!installProbe.acquired) {
184
+ if (explicitUpdateRequest) {
185
+ process.stderr.write('Das Update konnte nicht verifiziert werden.\n');
186
+ process.exitCode = 1;
187
+ }
188
+ return;
189
+ }
135
190
  await installProbe.lease.release();
136
191
 
137
192
  if (ARGS.some((arg) => arg === '--version' || arg === '-V')) {
@@ -139,11 +194,37 @@ async function runLauncher(options = {}) {
139
194
  return;
140
195
  }
141
196
 
142
- if (isNpmPackageUpdateRequest(ARGS)) {
143
- process.stdout.write(`${NPM_PACKAGE_UPDATE_COMMAND}\n`);
197
+ if (explicitUpdateRequest) {
198
+ const privatePaths = resolveLauncherPrivatePaths();
199
+ const result = await runExplicitUpdate({
200
+ currentVersion: readPackageVersion(),
201
+ env: process.env,
202
+ stdin: process.stdin,
203
+ stdout: process.stdout,
204
+ stderr: process.stderr,
205
+ blunDir: privatePaths.blunHome,
206
+ packageRoot: PKG,
207
+ noticeLease,
208
+ request: ARGS[0],
209
+ });
210
+ if (result.kind === 'failed') process.exitCode = result.exitCode || 1;
211
+ return;
212
+ }
213
+
214
+ if (ARGS.some((arg) => arg === '--help' || arg === '-h')) {
215
+ process.stdout.write(launcherHelpText());
216
+ const env = createLauncherEnvironment(process.env, mode, readPackageVersion());
217
+ const informationalEnv = { ...process.env };
218
+ delete informationalEnv.BLUN_HOME;
219
+ env.BLUN_HOME = resolveLauncherPrivatePaths({ env: informationalEnv }).blunHome;
220
+ process.exitCode = await superviseProtectedCore(ARGS, env, callerCwd, releaseNotice);
144
221
  return;
145
222
  }
146
223
 
224
+ const privatePaths = resolveLauncherPrivatePaths();
225
+ const blunDir = privatePaths.blunHome;
226
+ ensurePrivateDirectory(blunDir);
227
+
147
228
  // --- 1. Oeffentlicher npm-Update-Dialog. -------------------------------
148
229
  const updateResult = await runUpdateNotice({
149
230
  currentVersion: readPackageVersion(),
@@ -152,32 +233,25 @@ async function runLauncher(options = {}) {
152
233
  stdin: process.stdin,
153
234
  stdout: process.stdout,
154
235
  stderr: process.stderr,
155
- blunDir: BLUN,
236
+ blunDir,
156
237
  packageRoot: PKG,
157
238
  noticeLease,
158
239
  });
159
240
  if (updateResult.kind === 'installed' || updateResult.kind === 'update_in_progress') return;
160
241
 
161
- if (ARGS.some((arg) => arg === '--help' || arg === '-h')) {
162
- const env = createLauncherEnvironment(process.env, mode, readPackageVersion());
163
- env.BLUN_HOME = BLUN;
164
- process.exitCode = await superviseProtectedCore(ARGS, env, process.cwd(), releaseNotice);
165
- return;
166
- }
167
-
168
- ensurePrivateDirectory(BLUN);
169
-
170
242
  // --- 2. Bestehende Konfiguration absichern -------------------------------
171
243
  // Ein frischer Start bleibt absichtlich ohne statischen Anbieter. /login
172
244
  // provisioniert King ueber den BLUN-OAuth-Server.
173
- const cfgFile = path.join(BLUN, 'config.toml');
245
+ const cfgFile = path.join(blunDir, 'config.toml');
174
246
  if (fs.existsSync(cfgFile)) securePrivateFile(cfgFile);
175
247
 
176
248
  // --- 3. Telegram-Plugin + Token-Vorlage (nur King) -----------------------
177
249
  if (mode === LAUNCHER_MODES.KING) {
178
- installManagedTelegramPlugin({ packageRoot: PKG, blunDir: BLUN });
179
- const channelDir = path.join(BLUN, 'channels', 'telegram');
180
- fs.mkdirSync(channelDir, { recursive: true });
250
+ installManagedTelegramPlugin({ packageRoot: PKG, blunDir });
251
+ const channelsDir = path.join(blunDir, 'channels');
252
+ const channelDir = path.join(channelsDir, 'telegram');
253
+ ensurePrivateDirectory(channelsDir);
254
+ ensurePrivateDirectory(channelDir);
181
255
  const envFile = path.join(channelDir, '.env');
182
256
  if (!fs.existsSync(envFile)) {
183
257
  writePrivateFile(envFile, 'BLUN_TELEGRAM_BOT_TOKEN=HIER_DEIN_BOT_TOKEN_EINFUEGEN\n');
@@ -189,9 +263,10 @@ async function runLauncher(options = {}) {
189
263
  // --- 3b. Built-in-Skills installieren (fehlende ergaenzen, nie
190
264
  // vorhandene ueberschreiben — User-Anpassungen bleiben) -----------
191
265
  const skillsSrc = path.join(PKG, 'skills');
192
- const skillsDst = path.join(BLUN, 'skills');
266
+ const skillsDst = path.join(blunDir, 'skills');
193
267
  if (fs.existsSync(skillsSrc)) {
194
- fs.mkdirSync(skillsDst, { recursive: true });
268
+ if (fs.existsSync(skillsDst)) securePrivateTree(skillsDst);
269
+ else ensurePrivateDirectory(skillsDst);
195
270
  for (const entry of fs.readdirSync(skillsSrc)) {
196
271
  const dst = path.join(skillsDst, entry);
197
272
  if (!fs.existsSync(dst)) {
@@ -202,15 +277,12 @@ async function runLauncher(options = {}) {
202
277
 
203
278
  // --- 4. Start -----------------------------------------------------------
204
279
  const env = createLauncherEnvironment(process.env, mode, readPackageVersion());
205
- env.BLUN_HOME = BLUN;
280
+ env.BLUN_HOME = blunDir;
206
281
  env.BLUN_MODEL_MAX_COMPLETION_TOKENS = env.BLUN_MODEL_MAX_COMPLETION_TOKENS || '32768';
207
- const workspace = path.join(HOME, 'BLUN-Workspace');
208
- fs.mkdirSync(workspace, { recursive: true });
209
-
210
282
  process.exitCode = await superviseProtectedCore(
211
283
  ['--yolo', ...ARGS],
212
284
  env,
213
- workspace,
285
+ callerCwd,
214
286
  releaseNotice,
215
287
  );
216
288
  } finally {
@@ -218,4 +290,4 @@ async function runLauncher(options = {}) {
218
290
  }
219
291
  }
220
292
 
221
- module.exports = { runLauncher };
293
+ module.exports = { resolveLauncherPrivatePaths, runLauncher };
@@ -4,7 +4,11 @@ const { randomUUID } = require('node:crypto');
4
4
  const fs = require('node:fs');
5
5
  const path = require('node:path');
6
6
 
7
- const { ensurePrivateDirectory, writePrivateFile } = require('./private-paths');
7
+ const {
8
+ ensurePrivateDirectory,
9
+ securePrivateFile,
10
+ writePrivateFile,
11
+ } = require('./private-paths');
8
12
 
9
13
  function isObject(value) {
10
14
  return typeof value === 'object' && value !== null && !Array.isArray(value);
@@ -81,10 +85,10 @@ function installManagedTelegramPlugin({ packageRoot, blunDir, now = new Date().t
81
85
  const pluginRoot = path.join(managedDir, 'telegram');
82
86
  const installedFile = path.join(pluginsDir, 'installed.json');
83
87
 
88
+ ensurePrivateDirectory(pluginsDir);
89
+ if (fs.existsSync(installedFile)) securePrivateFile(installedFile);
84
90
  const installed = readInstalledPlugins(installedFile);
85
91
  const updatedInstalled = updatedInstalledPlugins(installed, pluginRoot, now);
86
-
87
- ensurePrivateDirectory(pluginsDir);
88
92
  ensurePrivateDirectory(managedDir);
89
93
  const nonce = `${process.pid}-${randomUUID()}`;
90
94
  const stagingRoot = path.join(managedDir, `.telegram-${nonce}.tmp`);
@@ -92,8 +96,11 @@ function installManagedTelegramPlugin({ packageRoot, blunDir, now = new Date().t
92
96
  let hadPreviousPlugin = false;
93
97
  let installedNewPlugin = false;
94
98
  try {
99
+ if (fs.existsSync(pluginRoot)) {
100
+ ensurePrivateDirectory(pluginRoot);
101
+ hadPreviousPlugin = true;
102
+ }
95
103
  fs.cpSync(sourceRoot, stagingRoot, { recursive: true, force: true });
96
- hadPreviousPlugin = fs.existsSync(pluginRoot);
97
104
  if (hadPreviousPlugin) fs.renameSync(pluginRoot, backupRoot);
98
105
  try {
99
106
  fs.renameSync(stagingRoot, pluginRoot);