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.
- package/LIESMICH.txt +31 -6
- package/README.md +35 -4
- package/bin/launcher-mode.js +13 -2
- package/bin/launcher-runtime.js +103 -31
- package/bin/plugin-bootstrap.js +11 -4
- package/bin/private-paths.js +1577 -10
- package/bin/update-notice.js +197 -46
- package/blun.mjs +7422 -3448
- package/dist-web/assets/{CodeBlockNode-Bsvp6ZEy.js → CodeBlockNode-CXnTLMNr.js} +1 -1
- 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
- package/dist-web/assets/{DesignSystemView-BmDDe28A.js → DesignSystemView-BbMOu-XO.js} +1 -1
- package/dist-web/assets/{Tooltip-nEEfaYVY.js → Tooltip-CFQEzqC-.js} +1 -1
- package/dist-web/assets/abnfDiagram-N423BO3Z-CsByy-GW.js +1 -0
- package/dist-web/assets/abnfDiagram-N423BO3Z-Z1APZG5m.js +1 -0
- package/dist-web/assets/arc-C-LXCaja.js +1 -0
- package/dist-web/assets/arc-C4VyWloT.js +1 -0
- package/dist-web/assets/architectureDiagram-T3A2C74G-DZq4L18e.js +36 -0
- package/dist-web/assets/architectureDiagram-T3A2C74G-DpddbUcM.js +36 -0
- package/dist-web/assets/blockDiagram-VBNYF7ZC-BV4sIf98.js +132 -0
- package/dist-web/assets/blockDiagram-VBNYF7ZC-BqccOSMr.js +132 -0
- package/dist-web/assets/{c4Diagram-AAUBKEIU-DtzacMnD.js → c4Diagram-5PPSVZJV-0MRkZlgP.js} +1 -1
- package/dist-web/assets/{c4Diagram-AAUBKEIU-D1VdMx8d.js → c4Diagram-5PPSVZJV-OHAcJrTy.js} +1 -1
- package/dist-web/assets/channel-B2VOQOI-.js +1 -0
- package/dist-web/assets/channel-DKjwM05G.js +1 -0
- package/dist-web/assets/{chunk-ND2GUHAM-DJoY9wNJ.js → chunk-2GRJ4B5K-DqJHs8Fw.js} +1 -1
- package/dist-web/assets/{chunk-ND2GUHAM-C4-rwdcv.js → chunk-2GRJ4B5K-oO6nqeLA.js} +1 -1
- package/dist-web/assets/{chunk-QZHKN3VN-C7YGaShq.js → chunk-2Q5K7J3B-B1nCd91o.js} +1 -1
- package/dist-web/assets/{chunk-QZHKN3VN-_Rz9_NuS.js → chunk-2Q5K7J3B-BC0Hsfqy.js} +1 -1
- package/dist-web/assets/chunk-5RXB4S5H-BfZa4yDH.js +231 -0
- package/dist-web/assets/chunk-5RXB4S5H-neG70kZx.js +231 -0
- package/dist-web/assets/{chunk-FMBD7UC4-DlLNDUx6.js → chunk-5VM5RSS4-l7biGqeH.js} +1 -1
- package/dist-web/assets/{chunk-FMBD7UC4-B2zs_Y-d.js → chunk-5VM5RSS4-u00AcpiJ.js} +1 -1
- package/dist-web/assets/chunk-6Q2QTUOP-BO-F11Gs.js +88 -0
- package/dist-web/assets/chunk-6Q2QTUOP-RUVRPBzG.js +88 -0
- package/dist-web/assets/{chunk-727SXJPM-Dn5wkDO_.js → chunk-GF5L2VYU-Ba-86KTd.js} +5 -5
- package/dist-web/assets/{chunk-727SXJPM-Dk2Xa3bA.js → chunk-GF5L2VYU-BtC69fw0.js} +5 -5
- package/dist-web/assets/{chunk-4BX2VUAB-DxZViaHS.js → chunk-JWPE2WC7-DIOubEqr.js} +1 -1
- package/dist-web/assets/{chunk-4BX2VUAB-WqrE2gaw.js → chunk-JWPE2WC7-u8Pcfhwh.js} +1 -1
- package/dist-web/assets/{chunk-2J33WTMH-Dm_s0_4f.js → chunk-KBJHAD2P-DDUeH_Ba.js} +1 -1
- package/dist-web/assets/{chunk-2J33WTMH-w4sdiKFO.js → chunk-KBJHAD2P-DS3BL64y.js} +1 -1
- package/dist-web/assets/chunk-RYQCIY6F-B9gFMVbS.js +1 -0
- package/dist-web/assets/chunk-RYQCIY6F-xg3EO0le.js +1 -0
- package/dist-web/assets/{chunk-55IACEB6-B5dE1-Um.js → chunk-XXDRQBXY-B60H0rRC.js} +1 -1
- package/dist-web/assets/{chunk-55IACEB6-B12zGIFz.js → chunk-XXDRQBXY-Bn1Xz6TQ.js} +1 -1
- package/dist-web/assets/classDiagram-JCYQIIEL-BA1TjAxj.js +1 -0
- package/dist-web/assets/classDiagram-JCYQIIEL-BNU7Qn4k.js +1 -0
- package/dist-web/assets/classDiagram-v2-OCEON4UE-BA1TjAxj.js +1 -0
- package/dist-web/assets/classDiagram-v2-OCEON4UE-BNU7Qn4k.js +1 -0
- package/dist-web/assets/{cose-bilkent-S5V4N54A-Bi19n8m-.js → cose-bilkent-JH36ORCC-4Ybddg08.js} +1 -1
- package/dist-web/assets/{cose-bilkent-S5V4N54A-c8o8NFp5.js → cose-bilkent-JH36ORCC-DqigO3T4.js} +1 -1
- package/dist-web/assets/cynefin-VYW2F7L2-C-EfYT07.js +178 -0
- package/dist-web/assets/cynefin-VYW2F7L2-rpD93tQ-.js +178 -0
- package/dist-web/assets/cynefinDiagram-MW4NZA55-DWZPLJcD.js +62 -0
- package/dist-web/assets/cynefinDiagram-MW4NZA55-DbTqnkVJ.js +62 -0
- package/dist-web/assets/dagre-VZM6K2ZE-DcM8aEVY.js +4 -0
- package/dist-web/assets/dagre-VZM6K2ZE-M_HVNtqP.js +4 -0
- package/dist-web/assets/diagram-7IWD3JNH-DoNximNF.js +30 -0
- package/dist-web/assets/diagram-7IWD3JNH-UymgsBNa.js +30 -0
- package/dist-web/assets/{diagram-KO2AKTUF-CFQs13i5.js → diagram-B4RE2ZJO-BVA2EhnC.js} +3 -3
- package/dist-web/assets/{diagram-KO2AKTUF-agFIuPJW.js → diagram-B4RE2ZJO-BiYu5WPF.js} +3 -3
- package/dist-web/assets/{diagram-LMA3HP47-TMIXizxR.js → diagram-LBJQPF4R-BD3kkgOO.js} +2 -2
- package/dist-web/assets/{diagram-LMA3HP47-He5zlyMt.js → diagram-LBJQPF4R-m3a1Euj3.js} +2 -2
- package/dist-web/assets/diagram-Q27KOJAE-D1mYQ_cI.js +24 -0
- package/dist-web/assets/diagram-Q27KOJAE-hy_T73PK.js +24 -0
- package/dist-web/assets/diagram-UB23O5K3-BWkoQZ4A.js +41 -0
- package/dist-web/assets/diagram-UB23O5K3-BtX8u6HG.js +41 -0
- package/dist-web/assets/ebnfDiagram-BXEA7PRR-BKs9JUHW.js +1 -0
- package/dist-web/assets/ebnfDiagram-BXEA7PRR-CBAnFkRF.js +1 -0
- package/dist-web/assets/erDiagram-JOGREHBK-3vKcWsxm.js +85 -0
- package/dist-web/assets/erDiagram-JOGREHBK-BIpd6dTf.js +85 -0
- package/dist-web/assets/flowDiagram-UKHOOZJN-D9wBbHm2.js +156 -0
- package/dist-web/assets/flowDiagram-UKHOOZJN-Z83i2UWI.js +156 -0
- package/dist-web/assets/ganttDiagram-PKOTCBZU-Cd_dViF-.js +292 -0
- package/dist-web/assets/ganttDiagram-PKOTCBZU-DFrb_S1d.js +292 -0
- package/dist-web/assets/{gitGraphDiagram-PVQCEYII-BSDFfwdY.js → gitGraphDiagram-DS77QQ5N-BiEEtTo7.js} +3 -3
- package/dist-web/assets/{gitGraphDiagram-PVQCEYII-DMbTATyw.js → gitGraphDiagram-DS77QQ5N-Dp3Ar-hi.js} +3 -3
- package/dist-web/assets/{graph-BwjfAU3j.js → graph-CAUpWmoK.js} +1 -1
- package/dist-web/assets/{graph--OzhPTMs.js → graph-DOmOIIwC.js} +1 -1
- package/dist-web/assets/{index-W6VnSrkB.js → index-Ba1OvLjf.js} +2 -2
- package/dist-web/assets/{index-CkVgGDpx.js → index-CiPA8Kex.js} +4 -4
- package/dist-web/assets/{index-BzK4vJBu.js → index-DdEakFJM.js} +1 -1
- package/dist-web/assets/{index10-Czg_oF-W.js → index10-CNr4U-Nw.js} +1 -1
- package/dist-web/assets/{index11-BjzCZuCr.js → index11-Dto_yZNz.js} +1 -1
- package/dist-web/assets/{index5-DlVoNkCD.js → index5-B2PldaO2.js} +1 -1
- package/dist-web/assets/{index6-BxiXA2yo.js → index6-CBdZmmyx.js} +1 -1
- package/dist-web/assets/{index7-BPdza6d1.js → index7-Dz9oCsUF.js} +1 -1
- package/dist-web/assets/{index8-Q_XzGC1Z.js → index8-B6k25jtU.js} +2 -2
- package/dist-web/assets/{infoDiagram-5YYISTIA-2JF3XEdD.js → infoDiagram-6WML65LV-BSa2g04G.js} +1 -1
- package/dist-web/assets/{infoDiagram-5YYISTIA-UrQusrJq.js → infoDiagram-6WML65LV-D4ph2sIH.js} +1 -1
- package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-7RVUL-vB.js → ishikawaDiagram-WSZJBQD7-DjKjbMm9.js} +5 -5
- package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-C5OstRVV.js → ishikawaDiagram-WSZJBQD7-Hm36UOQe.js} +5 -5
- package/dist-web/assets/{journeyDiagram-JHISSGLW-B34fCMu9.js → journeyDiagram-NVQOT4AX-DttHDfPQ.js} +1 -1
- package/dist-web/assets/{journeyDiagram-JHISSGLW-yctdo4bX.js → journeyDiagram-NVQOT4AX-MvWWPNDV.js} +1 -1
- package/dist-web/assets/{kanban-definition-UN3LZRKU-BS4FBZsQ.js → kanban-definition-27J2QSJJ-C5gB-W0d.js} +7 -7
- package/dist-web/assets/{kanban-definition-UN3LZRKU-CxBCv27E.js → kanban-definition-27J2QSJJ-Cu-E_cXA.js} +5 -5
- package/dist-web/assets/layout-CvP6o9AK.js +1 -0
- package/dist-web/assets/layout-D-LzfAck.js +1 -0
- package/dist-web/assets/{linear-3mB6q2-g.js → linear-B3HWgQI2.js} +1 -1
- package/dist-web/assets/{linear-BKCnUo31.js → linear-BRGe4-d6.js} +1 -1
- package/dist-web/assets/map-CWKZqZjr.js +1 -0
- package/dist-web/assets/map-DxJ2ADlA.js +1 -0
- package/dist-web/assets/mermaid.core-D-9Sx1No.js +314 -0
- package/dist-web/assets/mermaidParser.worker-PTFfzpoB.js +318 -0
- package/dist-web/assets/{mindmap-definition-RKZ34NQL-BmJZpjh6.js → mindmap-definition-FAOFIHXS-C4vnms3i.js} +2 -2
- package/dist-web/assets/{mindmap-definition-RKZ34NQL-1mjWUcf6.js → mindmap-definition-FAOFIHXS-Cg_hoVIq.js} +1 -1
- package/dist-web/assets/pegDiagram-VL7TDLO6-B2fFEFUH.js +1 -0
- package/dist-web/assets/pegDiagram-VL7TDLO6-CSX9hitD.js +1 -0
- package/dist-web/assets/pieDiagram-7S7Q4E2Y-0L0mxahZ.js +39 -0
- package/dist-web/assets/pieDiagram-7S7Q4E2Y-C7T0Cmw1.js +39 -0
- package/dist-web/assets/{quadrantDiagram-W4KKPZXB-BmT_qM09.js → quadrantDiagram-CIZ2JOQS-BBy7w4kD.js} +3 -3
- package/dist-web/assets/{quadrantDiagram-W4KKPZXB-C0kPuyNP.js → quadrantDiagram-CIZ2JOQS-U483z0er.js} +3 -3
- package/dist-web/assets/railroadDiagram-AXF67PYL-D80a2_DJ.js +1 -0
- package/dist-web/assets/railroadDiagram-AXF67PYL-DX8y0MzW.js +1 -0
- package/dist-web/assets/{requirementDiagram-4Y6WPE33-C0YP_Amt.js → requirementDiagram-LRYGKXZP-CeyHfq8t.js} +3 -3
- package/dist-web/assets/{requirementDiagram-4Y6WPE33-CZrxH1Y2.js → requirementDiagram-LRYGKXZP-DGD5J_4k.js} +3 -3
- package/dist-web/assets/sankeyDiagram-W5VNT64P-CCISkkrR.js +40 -0
- package/dist-web/assets/sankeyDiagram-W5VNT64P-CT5PdZz2.js +40 -0
- package/dist-web/assets/sequenceDiagram-SI44F4Z6-BeMzHWXI.js +162 -0
- package/dist-web/assets/sequenceDiagram-SI44F4Z6-jQfm2XS7.js +162 -0
- package/dist-web/assets/sizeCapture-X5ZJPWSS-BQsTdtrv.js +1 -0
- package/dist-web/assets/sizeCapture-X5ZJPWSS-lRZsmCoS.js +1 -0
- package/dist-web/assets/stateDiagram-OKZ733FA-ClCgTdUm.js +1 -0
- package/dist-web/assets/stateDiagram-OKZ733FA-Cv59z5YT.js +1 -0
- package/dist-web/assets/stateDiagram-v2-UEYNNEHI-R8jTc--F.js +1 -0
- package/dist-web/assets/stateDiagram-v2-UEYNNEHI-fi_lrTAx.js +1 -0
- package/dist-web/assets/swimlanes-SLNWSIFB-BCdOUN05.js +2 -0
- package/dist-web/assets/swimlanes-SLNWSIFB-Cu5l7SuR.js +1 -0
- package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-BUd_uYK3.js +8 -0
- package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-CalrsgPK.js +8 -0
- package/dist-web/assets/{timeline-definition-PNZ67QCA-DsVZdrZa.js → timeline-definition-Z64GVDOM-CMjnh4bu.js} +4 -4
- package/dist-web/assets/{timeline-definition-PNZ67QCA-DnB6Usl0.js → timeline-definition-Z64GVDOM-DpWutSKa.js} +4 -4
- package/dist-web/assets/vennDiagram-T6HMQDX7-DKJW_8oU.js +34 -0
- package/dist-web/assets/vennDiagram-T6HMQDX7-DVC5JVsc.js +34 -0
- package/dist-web/assets/{vue.runtime.esm-bundler-pgHGheCW.js → vue.runtime.esm-bundler-BwwRtQwQ.js} +1 -1
- package/dist-web/assets/{wardleyDiagram-YWT4CUSO-oBauTCEw.js → wardleyDiagram-T6FBY63Y-BK2mrq7L.js} +3 -3
- package/dist-web/assets/{wardleyDiagram-YWT4CUSO-DCiyDQNB.js → wardleyDiagram-T6FBY63Y-oUvgepFn.js} +3 -3
- package/dist-web/assets/xychartDiagram-ELKLHX3M-DI6n79q0.js +7 -0
- package/dist-web/assets/xychartDiagram-ELKLHX3M-DUJu9F7-.js +7 -0
- package/dist-web/index.html +1 -1
- package/dist-web/vis/index.html.gz +0 -0
- package/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/package.json +7 -2
- package/telegram-plugin/dist/bridge.mjs +6 -4
- package/telegram-plugin/dist/mcp-server.mjs +236 -71
- package/dist-web/assets/arc-4xPfymbf.js +0 -1
- package/dist-web/assets/arc-Doj0wRZ0.js +0 -1
- package/dist-web/assets/architectureDiagram-3BPJPVTR-BGih283a.js +0 -36
- package/dist-web/assets/architectureDiagram-3BPJPVTR-CQ09RrbH.js +0 -36
- package/dist-web/assets/blockDiagram-GPEHLZMM-3ShMf1gu.js +0 -132
- package/dist-web/assets/blockDiagram-GPEHLZMM-CAtDjkJt.js +0 -132
- package/dist-web/assets/channel-DNkUo9e6.js +0 -1
- package/dist-web/assets/channel-DcnUTIGB.js +0 -1
- package/dist-web/assets/chunk-AQP2D5EJ-FS8-f8lF.js +0 -231
- package/dist-web/assets/chunk-AQP2D5EJ-UKhb4V4r.js +0 -231
- package/dist-web/assets/classDiagram-4FO5ZUOK-B1ZO8EbE.js +0 -1
- package/dist-web/assets/classDiagram-4FO5ZUOK-xk6cM9Kq.js +0 -1
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2-B1ZO8EbE.js +0 -1
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2-xk6cM9Kq.js +0 -1
- package/dist-web/assets/dagre-BM42HDAG-CmUO9qKN.js +0 -4
- package/dist-web/assets/dagre-BM42HDAG-DLMfLCoV.js +0 -4
- package/dist-web/assets/diagram-2AECGRRQ-DQTst0OH.js +0 -43
- package/dist-web/assets/diagram-2AECGRRQ-L74iLMqd.js +0 -43
- package/dist-web/assets/diagram-5GNKFQAL-BiBm7CJR.js +0 -10
- package/dist-web/assets/diagram-5GNKFQAL-DoE6q7H1.js +0 -10
- package/dist-web/assets/diagram-OG6HWLK6-BHCt1E0n.js +0 -24
- package/dist-web/assets/diagram-OG6HWLK6-DRyxjFMa.js +0 -24
- package/dist-web/assets/erDiagram-TEJ5UH35-BoDczjGG.js +0 -85
- package/dist-web/assets/erDiagram-TEJ5UH35-yd6SOv_7.js +0 -85
- package/dist-web/assets/flowDiagram-I6XJVG4X-DHoceI7r.js +0 -162
- package/dist-web/assets/flowDiagram-I6XJVG4X-DkYNQv0R.js +0 -162
- package/dist-web/assets/ganttDiagram-6RSMTGT7-Cg1TQBc0.js +0 -292
- package/dist-web/assets/ganttDiagram-6RSMTGT7-Z6klo7KK.js +0 -292
- package/dist-web/assets/layout-C1ojF0zw.js +0 -1
- package/dist-web/assets/layout-SsrduOYp.js +0 -1
- package/dist-web/assets/mermaid.core-D_lKT0dR.js +0 -309
- package/dist-web/assets/mermaidParser.worker-Dx4jPi9z.js +0 -313
- package/dist-web/assets/pieDiagram-4H26LBE5-BU41t2A_.js +0 -30
- package/dist-web/assets/pieDiagram-4H26LBE5-BkwDAvbt.js +0 -30
- package/dist-web/assets/sankeyDiagram-5OEKKPKP-De_o7hDr.js +0 -40
- package/dist-web/assets/sankeyDiagram-5OEKKPKP-Dvuj6bMA.js +0 -40
- package/dist-web/assets/sequenceDiagram-3UESZ5HK-DuCrgPyA.js +0 -162
- package/dist-web/assets/sequenceDiagram-3UESZ5HK-VAxffBe7.js +0 -162
- package/dist-web/assets/stateDiagram-AJRCARHV-CYLupxM7.js +0 -1
- package/dist-web/assets/stateDiagram-AJRCARHV-nDExQydZ.js +0 -1
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BhEc7Thx.js +0 -1
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BzwD_BIl.js +0 -1
- package/dist-web/assets/vennDiagram-CIIHVFJN-BBHQmCFf.js +0 -34
- package/dist-web/assets/vennDiagram-CIIHVFJN-Cfj-K9NW.js +0 -34
- package/dist-web/assets/wardley-L42UT6IY-BJFn8eDD.js +0 -173
- package/dist-web/assets/wardley-L42UT6IY-BSu8-4hg.js +0 -173
- package/dist-web/assets/xychartDiagram-2RQKCTM6-C2iZpl9I.js +0 -7
- 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
|
-
|
|
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
|
|
18
|
-
king Dieselbe
|
|
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`
|
|
24
|
-
Konsole
|
|
25
|
-
|
|
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.
|
package/bin/launcher-mode.js
CHANGED
|
@@ -5,7 +5,14 @@ const LAUNCHER_MODES = Object.freeze({
|
|
|
5
5
|
KING: 'king',
|
|
6
6
|
});
|
|
7
7
|
|
|
8
|
-
const
|
|
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
|
};
|
package/bin/launcher-runtime.js
CHANGED
|
@@ -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)
|
|
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)
|
|
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 (
|
|
143
|
-
|
|
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
|
|
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(
|
|
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
|
|
179
|
-
const
|
|
180
|
-
|
|
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(
|
|
266
|
+
const skillsDst = path.join(blunDir, 'skills');
|
|
193
267
|
if (fs.existsSync(skillsSrc)) {
|
|
194
|
-
fs.
|
|
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 =
|
|
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
|
-
|
|
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 };
|
package/bin/plugin-bootstrap.js
CHANGED
|
@@ -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 {
|
|
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);
|