@openbuddy/cli 0.0.0-stage → 1.0.40
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/LICENSE.md +12 -0
- package/README.md +625 -2
- package/bin/dscode.exe +12 -0
- package/bin/stt/requirements.txt +32 -0
- package/bin/stt/stt_server.py +619 -0
- package/bin/tts/requirements.txt +21 -0
- package/bin/tts/tts_server.py +404 -0
- package/cli-wrapper.cjs +109 -0
- package/install.cjs +177 -0
- package/llms.txt +88 -0
- package/package.json +56 -4
- package/scripts/figure/compose.py +363 -0
- package/scripts/figure/replay-shots.mjs +205 -0
- package/web/dist/assets/AssistantsView-BiUiWjhF.js +1 -0
- package/web/dist/assets/AutomationView-Dcf_yNaI.js +1 -0
- package/web/dist/assets/ChannelConfigView-BLnxsMGm.js +8 -0
- package/web/dist/assets/ConnectorsView-CX3E6X6c.js +1 -0
- package/web/dist/assets/DesignSystemView--x-P-lpD.js +1 -0
- package/web/dist/assets/Drawer-CjAgqH3B.js +1 -0
- package/web/dist/assets/FileTreeView-Chb_fzTK.js +11 -0
- package/web/dist/assets/HookConfigView-EafYlWdN.js +1 -0
- package/web/dist/assets/InputArea-BbHslX7b.js +50 -0
- package/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/web/dist/assets/ModelsView-CGN5Nljr.js +1 -0
- package/web/dist/assets/PluginsView-CDiJgvI8.js +2 -0
- package/web/dist/assets/ProjectsView-C5Usmwqy.js +1 -0
- package/web/dist/assets/SessionGrid-BGpz0-op.css +1 -0
- package/web/dist/assets/SessionGrid-Drxg0r_u.js +4 -0
- package/web/dist/assets/SettingsModal-Cmts6aBG.js +10 -0
- package/web/dist/assets/Skeleton-Dsk6B0U3.js +1 -0
- package/web/dist/assets/SkillsView-TEDR_3XX.js +1 -0
- package/web/dist/assets/TemplatesTab-DtN5Kdgh.js +1 -0
- package/web/dist/assets/ToolsView-VukZnIt1.js +1 -0
- package/web/dist/assets/VizCardsSkeleton-C_GaEfXd.js +1 -0
- package/web/dist/assets/abap-BdImnpbu.js +1 -0
- package/web/dist/assets/abnfDiagram-YUKMZFIV-BIFw6B_N.js +1 -0
- package/web/dist/assets/actionscript-3-B3316cI-.js +1 -0
- package/web/dist/assets/ada-bCR0ucgS.js +1 -0
- package/web/dist/assets/ahk-CsyLZFj1.js +1 -0
- package/web/dist/assets/ahk2-8Zs4aa1G.js +1 -0
- package/web/dist/assets/andromeeda-C4gqWexZ.js +1 -0
- package/web/dist/assets/angular-html-DA-rfuFy.js +1 -0
- package/web/dist/assets/angular-ts-BrjP3tb8.js +1 -0
- package/web/dist/assets/apache-Pmp26Uib.js +1 -0
- package/web/dist/assets/apex-DhZFqWV2.js +1 -0
- package/web/dist/assets/apl-CORt7UWP.js +1 -0
- package/web/dist/assets/applescript-Co6uUVPk.js +1 -0
- package/web/dist/assets/ara-BRHolxvo.js +1 -0
- package/web/dist/assets/arc-BZQ951h9.js +1 -0
- package/web/dist/assets/architectureDiagram-47P4ROYG-BP5qiXzf.js +36 -0
- package/web/dist/assets/asciidoc-CSVQ5wI8.js +1 -0
- package/web/dist/assets/asm-D_Q5rh1f.js +1 -0
- package/web/dist/assets/astro-HNnZUWAn.js +1 -0
- package/web/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/web/dist/assets/awk-DMzUqQB5.js +1 -0
- package/web/dist/assets/ayu-dark-DYE7WIF3.js +1 -0
- package/web/dist/assets/ayu-light-BA47KaF1.js +1 -0
- package/web/dist/assets/ayu-mirage-32ctXXKs.js +1 -0
- package/web/dist/assets/ballerina-BFfxhgS-.js +1 -0
- package/web/dist/assets/bat-CickPsom.js +1 -0
- package/web/dist/assets/beancount-k_qm7-4y.js +1 -0
- package/web/dist/assets/berry-uYugtg8r.js +1 -0
- package/web/dist/assets/bibtex-CHM0blh-.js +1 -0
- package/web/dist/assets/bicep-Bmn6On1c.js +1 -0
- package/web/dist/assets/bird2-Bx8U0n9b.js +1 -0
- package/web/dist/assets/blade-2xfisSek.js +1 -0
- package/web/dist/assets/blockDiagram-E7TT5TSB-DtRpcE7F.js +140 -0
- package/web/dist/assets/bsl-DlhNcFeZ.js +1 -0
- package/web/dist/assets/c-BIGW1oBm.js +1 -0
- package/web/dist/assets/c3-Dp5svz6Z.js +1 -0
- package/web/dist/assets/c4Diagram-CRA5TL53-Gdzn8UBh.js +38 -0
- package/web/dist/assets/cadence-Bv_4Rxtq.js +1 -0
- package/web/dist/assets/cairo-KRGpt6FW.js +1 -0
- package/web/dist/assets/catppuccin-frappe-CZL1YF0i.js +1 -0
- package/web/dist/assets/catppuccin-latte-DH-8KZSZ.js +1 -0
- package/web/dist/assets/catppuccin-macchiato-B7yYVSCf.js +1 -0
- package/web/dist/assets/catppuccin-mocha-Ct7hS0mc.js +1 -0
- package/web/dist/assets/channel-BND6_KSH.js +1 -0
- package/web/dist/assets/chapel-DTp_pixX.js +1 -0
- package/web/dist/assets/chunk-2Q5K7J3B-3U6HMlsm.js +1 -0
- package/web/dist/assets/chunk-5VM5RSS4-CYl9mwa-.js +15 -0
- package/web/dist/assets/chunk-7TKQ45FW-Dn6ktcY5.js +1 -0
- package/web/dist/assets/chunk-AW2ZBBNX-De0QX6p1.js +88 -0
- package/web/dist/assets/chunk-FVRAUYC3-CpXDfvz4.js +2 -0
- package/web/dist/assets/chunk-HTAEGDNF-D1KDvcDd.js +1 -0
- package/web/dist/assets/chunk-JWPE2WC7-umm4A-fq.js +1 -0
- package/web/dist/assets/chunk-KQW6MTUR-JYH94hpE.js +1 -0
- package/web/dist/assets/chunk-XXDRQBXY-CSlCFByc.js +1 -0
- package/web/dist/assets/clarity-Dn5IMItf.js +1 -0
- package/web/dist/assets/classDiagram-v2-K4WV4PDN-DnFwS0qN.js +217 -0
- package/web/dist/assets/clojure-P80f7IUj.js +1 -0
- package/web/dist/assets/cmake-D1j8_8rp.js +1 -0
- package/web/dist/assets/cobol-nBiQ_Alo.js +1 -0
- package/web/dist/assets/codeowners-Bp6g37R7.js +1 -0
- package/web/dist/assets/codeql-DsOJ9woJ.js +1 -0
- package/web/dist/assets/coffee-Ch7k5sss.js +1 -0
- package/web/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
- package/web/dist/assets/coq-C7JzOVbR.js +1 -0
- package/web/dist/assets/cose-bilkent-JH36ORCC-BxUTUyep.js +1 -0
- package/web/dist/assets/cpp-BMRokrvK.js +1 -0
- package/web/dist/assets/crystal-DGywbUpC.js +1 -0
- package/web/dist/assets/csharp-DSvCPggb.js +1 -0
- package/web/dist/assets/css-CLj8gQPS.js +1 -0
- package/web/dist/assets/csv-fuZLfV_i.js +1 -0
- package/web/dist/assets/cue-D82EKSYY.js +1 -0
- package/web/dist/assets/cynefin-EF2NZ3EQ-CiMvulJr.js +141 -0
- package/web/dist/assets/cynefinDiagram-3GCD6N5R-DuXFORdW.js +62 -0
- package/web/dist/assets/cypher-COkxafJQ.js +1 -0
- package/web/dist/assets/cytoscape.esm-Ix0LnXOy.js +331 -0
- package/web/dist/assets/d-85-TOEBH.js +1 -0
- package/web/dist/assets/dagre-W4DXFKR2-DzMZHXci.js +4 -0
- package/web/dist/assets/dark-plus-C3mMm8J8.js +1 -0
- package/web/dist/assets/dart-bE4Kk8sk.js +1 -0
- package/web/dist/assets/dax-CEL-wOlO.js +1 -0
- package/web/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/web/dist/assets/desktop-BmXAJ9_W.js +1 -0
- package/web/dist/assets/diagram-2UJZ2QOL-B6tO5G1v.js +200 -0
- package/web/dist/assets/diagram-OVF4WLC6-DRZt8tGc.js +24 -0
- package/web/dist/assets/diagram-PFPMY2P6-DGh6IecR.js +30 -0
- package/web/dist/assets/diagram-UMYRVEAY-BLbnt0yT.js +24 -0
- package/web/dist/assets/diagram-YEKJPTXX-C-S5DVhj.js +41 -0
- package/web/dist/assets/diagram-ZIFT7M5P-JrGHTWbo.js +3 -0
- package/web/dist/assets/diff-D97Zzqfu.js +1 -0
- package/web/dist/assets/docker-BcOcwvcX.js +1 -0
- package/web/dist/assets/dotenv-Da5cRb03.js +1 -0
- package/web/dist/assets/dracula-BzJJZx-M.js +1 -0
- package/web/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/web/dist/assets/dream-maker-BtqSS_iP.js +1 -0
- package/web/dist/assets/ebnfDiagram-VR2GEFS7-DPXA-YOi.js +1 -0
- package/web/dist/assets/edge-FbVlp4U3.js +1 -0
- package/web/dist/assets/elixir-CkH2-t6x.js +1 -0
- package/web/dist/assets/elk-IJKZMXRS-CINeWt2W.js +27 -0
- package/web/dist/assets/elm-DbKCFpqz.js +1 -0
- package/web/dist/assets/emacs-lisp-C_m_b--Z.js +1 -0
- package/web/dist/assets/erDiagram-O2IAPWRE-PPaHmqA1.js +99 -0
- package/web/dist/assets/erb-DXfck5VN.js +1 -0
- package/web/dist/assets/erlang-DsQrWhSR.js +1 -0
- package/web/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/web/dist/assets/everforest-light-C8M2exoo.js +1 -0
- package/web/dist/assets/fennel-BYunw83y.js +1 -0
- package/web/dist/assets/fish-BvzEVeQv.js +1 -0
- package/web/dist/assets/flowDiagram-OXPTDLAJ-t-u0QXEA.js +213 -0
- package/web/dist/assets/fluent-C4IJs8-o.js +1 -0
- package/web/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
- package/web/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
- package/web/dist/assets/fsharp-CXgrBDvD.js +1 -0
- package/web/dist/assets/ganttDiagram-R7TSEDQI-Bw49ZD_b.js +292 -0
- package/web/dist/assets/gdresource-TyuKm33G.js +1 -0
- package/web/dist/assets/gdscript-DqcFQ5yU.js +1 -0
- package/web/dist/assets/gdshader-DkwncUOv.js +1 -0
- package/web/dist/assets/genie-D0YGMca9.js +1 -0
- package/web/dist/assets/gherkin-DyxjwDmM.js +1 -0
- package/web/dist/assets/git-commit-F4YmCXRG.js +1 -0
- package/web/dist/assets/git-rebase-r7XF79zn.js +1 -0
- package/web/dist/assets/gitGraphDiagram-XJZIOB7I-BAfOqeeg.js +106 -0
- package/web/dist/assets/github-dark-DHJKELXO.js +1 -0
- package/web/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/web/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/web/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/web/dist/assets/github-light-DAi9KRSo.js +1 -0
- package/web/dist/assets/github-light-default-D7oLnXFd.js +1 -0
- package/web/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/web/dist/assets/gleam-BspZqrRM.js +1 -0
- package/web/dist/assets/glimmer-js-ByusRIyA.js +1 -0
- package/web/dist/assets/glimmer-ts-BfAWNZQY.js +1 -0
- package/web/dist/assets/glsl-DplSGwfg.js +1 -0
- package/web/dist/assets/gn-n2N0HUVH.js +1 -0
- package/web/dist/assets/gnuplot-DdkO51Og.js +1 -0
- package/web/dist/assets/go-C27-OAKa.js +1 -0
- package/web/dist/assets/graph-Bn3Yngep.js +1 -0
- package/web/dist/assets/graphql-ChdNCCLP.js +1 -0
- package/web/dist/assets/groovy-gcz8RCvz.js +1 -0
- package/web/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- package/web/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- package/web/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- package/web/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- package/web/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- package/web/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- package/web/dist/assets/hack-BWmVpMyf.js +1 -0
- package/web/dist/assets/haml-D5jkg6IW.js +1 -0
- package/web/dist/assets/handlebars-BpdQsYii.js +1 -0
- package/web/dist/assets/haskell-Df6bDoY_.js +1 -0
- package/web/dist/assets/haxe-CfZj7gIn.js +1 -0
- package/web/dist/assets/hcl-BWvSN4gD.js +1 -0
- package/web/dist/assets/hjson-D5-asLiD.js +1 -0
- package/web/dist/assets/hlsl-D3lLCCz7.js +1 -0
- package/web/dist/assets/horizon-BUw7H-hv.js +1 -0
- package/web/dist/assets/horizon-bright-CUuTKBJd.js +1 -0
- package/web/dist/assets/houston-DnULxvSX.js +1 -0
- package/web/dist/assets/html-derivative-DlHx6ybY.js +1 -0
- package/web/dist/assets/html-pp8916En.js +1 -0
- package/web/dist/assets/http-jrhK8wxY.js +1 -0
- package/web/dist/assets/hurl-irOxFIW8.js +1 -0
- package/web/dist/assets/hxml-2-FPmUDs.js +1 -0
- package/web/dist/assets/hy-DFXneXwc.js +1 -0
- package/web/dist/assets/icons-Bm_ZzSAy.js +964 -0
- package/web/dist/assets/imba-DGztddWO.js +1 -0
- package/web/dist/assets/index-CeeLdENM.js +677 -0
- package/web/dist/assets/index-Ceez9lYk.css +1 -0
- package/web/dist/assets/infoDiagram-5W2HQ5XZ-Bv4RBxYW.js +2 -0
- package/web/dist/assets/ini-BEwlwnbL.js +1 -0
- package/web/dist/assets/init-Gi6I4Gst.js +1 -0
- package/web/dist/assets/ishikawaDiagram-K3B6WC7H-DEpj0bRp.js +70 -0
- package/web/dist/assets/java-CylS5w8V.js +1 -0
- package/web/dist/assets/javascript-wDzz0qaB.js +1 -0
- package/web/dist/assets/jinja-f2NsQr07.js +1 -0
- package/web/dist/assets/jison-wvAkD_A8.js +1 -0
- package/web/dist/assets/journeyDiagram-COXZFDF6-MJu84Iiz.js +139 -0
- package/web/dist/assets/json-Cp-IABpG.js +1 -0
- package/web/dist/assets/json5-C9tS-k6U.js +1 -0
- package/web/dist/assets/jsonc-Des-eS-w.js +1 -0
- package/web/dist/assets/jsonl-DcaNXYhu.js +1 -0
- package/web/dist/assets/jsonnet-DFQXde-d.js +1 -0
- package/web/dist/assets/jssm-C2t-YnRu.js +1 -0
- package/web/dist/assets/jsx-g9-lgVsj.js +1 -0
- package/web/dist/assets/julia-5Bft2YPA.js +1 -0
- package/web/dist/assets/just-Cwhn7H3k.js +1 -0
- package/web/dist/assets/kanagawa-dragon-BuwD2xS4.js +1 -0
- package/web/dist/assets/kanagawa-lotus-C3DzagqV.js +1 -0
- package/web/dist/assets/kanagawa-wave-DFGoQZhC.js +1 -0
- package/web/dist/assets/kanban-definition-P3RFRI5V-mlYSRALK.js +89 -0
- package/web/dist/assets/kdl-DV7GczEv.js +1 -0
- package/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
- package/web/dist/assets/kusto-wEQ09or8.js +1 -0
- package/web/dist/assets/laserwave-DUszq2jm.js +1 -0
- package/web/dist/assets/latex-D5pSuvFb.js +1 -0
- package/web/dist/assets/lean-BZvkOJ9d.js +1 -0
- package/web/dist/assets/less-B1dDrJ26.js +1 -0
- package/web/dist/assets/light-plus-B7mTdjB0.js +1 -0
- package/web/dist/assets/linear-5j9gt8MV.js +1 -0
- package/web/dist/assets/liquid-C0sCDyMI.js +1 -0
- package/web/dist/assets/llvm-BZoOZj88.js +1 -0
- package/web/dist/assets/log-2UxHyX5q.js +1 -0
- package/web/dist/assets/logo-BtOb2qkB.js +1 -0
- package/web/dist/assets/lua-BaeVxFsk.js +1 -0
- package/web/dist/assets/luau-BnpPk5vE.js +1 -0
- package/web/dist/assets/make-CHLpvVh8.js +1 -0
- package/web/dist/assets/markdown-BWXjRrSw.js +30 -0
- package/web/dist/assets/markdown-Cvjx9yec.js +1 -0
- package/web/dist/assets/marko-DjSrsDqO.js +1 -0
- package/web/dist/assets/material-theme-D5KoaKCx.js +1 -0
- package/web/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/web/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/web/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/web/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/web/dist/assets/matlab-D7o27uSR.js +1 -0
- package/web/dist/assets/mdc-D1_yUvq7.js +1 -0
- package/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
- package/web/dist/assets/mermaid-CQcHuHx7.js +1 -0
- package/web/dist/assets/mermaid.core-DLb6eAON.js +314 -0
- package/web/dist/assets/min-dark-CafNBF8u.js +1 -0
- package/web/dist/assets/min-light-CTRr51gU.js +1 -0
- package/web/dist/assets/mindmap-definition-LZFPQGKD-C9v_57Ex.js +96 -0
- package/web/dist/assets/mipsasm-CKIfxQSi.js +1 -0
- package/web/dist/assets/mojo-DJz3ZmWd.js +1 -0
- package/web/dist/assets/monokai-BRVnQi9A.js +1 -0
- package/web/dist/assets/moonbit-CHtswR0a.js +1 -0
- package/web/dist/assets/move-el3G9tDJ.js +1 -0
- package/web/dist/assets/narrat-DRg8JJMk.js +1 -0
- package/web/dist/assets/nextflow-C-mBbutL.js +1 -0
- package/web/dist/assets/nextflow-groovy-vE_lwT2v.js +1 -0
- package/web/dist/assets/nginx-BpAMiNFr.js +1 -0
- package/web/dist/assets/night-owl-C39BiMTA.js +1 -0
- package/web/dist/assets/night-owl-light-CMTm3GFP.js +1 -0
- package/web/dist/assets/nim-BIad80T-.js +1 -0
- package/web/dist/assets/nix-CwoSXNpI.js +1 -0
- package/web/dist/assets/nord-Ddv68eIx.js +1 -0
- package/web/dist/assets/nsis-BlV79W_Q.js +1 -0
- package/web/dist/assets/nushell-D3jzshHO.js +1 -0
- package/web/dist/assets/objective-c-DXmwc3jG.js +1 -0
- package/web/dist/assets/objective-cpp-CLxacb5B.js +1 -0
- package/web/dist/assets/ocaml-C0hk2d4L.js +1 -0
- package/web/dist/assets/odin-BBf5iR-q.js +1 -0
- package/web/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/web/dist/assets/one-light-C3Wv6jpd.js +1 -0
- package/web/dist/assets/openscad-C4EeE6gA.js +1 -0
- package/web/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/web/dist/assets/org-DM6o9KBp.js +1 -0
- package/web/dist/assets/panels-BQOvnbWH.js +1 -0
- package/web/dist/assets/pascal-D93ZcfNL.js +1 -0
- package/web/dist/assets/pegDiagram-BGZESJAR-KQP26s3-.js +1 -0
- package/web/dist/assets/perl-B9cMNwum.js +1 -0
- package/web/dist/assets/php-Csjmro_R.js +1 -0
- package/web/dist/assets/pieDiagram-CAPJLFHJ-DN3RQ_ih.js +39 -0
- package/web/dist/assets/pkl-u5AG7uiY.js +1 -0
- package/web/dist/assets/plastic-3e1v2bzS.js +1 -0
- package/web/dist/assets/plsql-ChMvpjG-.js +1 -0
- package/web/dist/assets/po-BTJTHyun.js +1 -0
- package/web/dist/assets/poimandres-CS3Unz2-.js +1 -0
- package/web/dist/assets/polar-C0HS_06l.js +1 -0
- package/web/dist/assets/postcss-CXtECtnM.js +1 -0
- package/web/dist/assets/powerquery-CEu0bR-o.js +1 -0
- package/web/dist/assets/powershell-BmBUJMz7.js +1 -0
- package/web/dist/assets/prisma-Vru482bI.js +1 -0
- package/web/dist/assets/profileChange-B7TaQ18u.js +1 -0
- package/web/dist/assets/prolog-CbFg5uaA.js +1 -0
- package/web/dist/assets/proto-C7zT0LnQ.js +1 -0
- package/web/dist/assets/pug-DKIMFp6K.js +1 -0
- package/web/dist/assets/puppet-BMWR74SV.js +1 -0
- package/web/dist/assets/purescript-CklMAg4u.js +1 -0
- package/web/dist/assets/python-B6aJPvgy.js +1 -0
- package/web/dist/assets/qml-3beO22l8.js +1 -0
- package/web/dist/assets/qmldir-C8lEn-DE.js +1 -0
- package/web/dist/assets/qss-IeuSbFQv.js +1 -0
- package/web/dist/assets/quadrantDiagram-GDMTTRAM-BpL_ZL76.js +7 -0
- package/web/dist/assets/r-Cf5RLm7j.js +1 -0
- package/web/dist/assets/racket-BqYA7rlc.js +1 -0
- package/web/dist/assets/railroadDiagram-SM67HX2B-DZ-fPU85.js +1 -0
- package/web/dist/assets/raku-DXvB9xmW.js +1 -0
- package/web/dist/assets/razor-BjBPvh-w.js +1 -0
- package/web/dist/assets/rbs-CpoqiR4B.js +1 -0
- package/web/dist/assets/react-vendor-C0HIWSpf.js +9 -0
- package/web/dist/assets/red-hvxz__6c.js +1 -0
- package/web/dist/assets/reg-C-SQnVFl.js +1 -0
- package/web/dist/assets/regexp-CDVJQ6XC.js +1 -0
- package/web/dist/assets/rel-C3B-1QV4.js +1 -0
- package/web/dist/assets/requirementDiagram-X7JNWC4A-mKPGj64L.js +84 -0
- package/web/dist/assets/riscv-BM1_JUlF.js +1 -0
- package/web/dist/assets/ron-D8l8udqQ.js +1 -0
- package/web/dist/assets/rose-pine-5qJOZa0Y.js +1 -0
- package/web/dist/assets/rose-pine-dawn-zx0QlTCp.js +1 -0
- package/web/dist/assets/rose-pine-moon-C9pEdX9L.js +1 -0
- package/web/dist/assets/rosmsg-BJDFO7_C.js +1 -0
- package/web/dist/assets/rst-bs7f0vWN.js +1 -0
- package/web/dist/assets/ruby-C0TQ7zu5.js +1 -0
- package/web/dist/assets/rust-B1yitclQ.js +1 -0
- package/web/dist/assets/sankeyDiagram-UM26HJRW-Bs4xfjQP.js +40 -0
- package/web/dist/assets/sas-DEy46yEz.js +1 -0
- package/web/dist/assets/sass-Cj5Yp3dK.js +1 -0
- package/web/dist/assets/scala-CqE71os6.js +1 -0
- package/web/dist/assets/scheme-C98Dy4si.js +1 -0
- package/web/dist/assets/scss-D5BDwBP9.js +1 -0
- package/web/dist/assets/sdbl-DVxCFoDh.js +1 -0
- package/web/dist/assets/sequenceDiagram-ZO4K6R2Y-BjUmzZaO.js +169 -0
- package/web/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
- package/web/dist/assets/shellscript-Yzrsuije.js +1 -0
- package/web/dist/assets/shellsession-BADoaaVG.js +1 -0
- package/web/dist/assets/sizeCapture-INFHLROL-BXBM3j_Q.js +1 -0
- package/web/dist/assets/slack-dark-BthQWCQV.js +1 -0
- package/web/dist/assets/slack-ochin-DqwNpetd.js +1 -0
- package/web/dist/assets/smalltalk-BOQMe2GC.js +1 -0
- package/web/dist/assets/smithy-cds9vsN8.js +1 -0
- package/web/dist/assets/snazzy-light-Bw305WKR.js +1 -0
- package/web/dist/assets/solarized-dark-CpvCGNkr.js +1 -0
- package/web/dist/assets/solarized-light-Dlz6yCKv.js +1 -0
- package/web/dist/assets/solidity-DijEV5ha.js +1 -0
- package/web/dist/assets/soy-8wufbnw4.js +1 -0
- package/web/dist/assets/sparql-rVzFXLq3.js +1 -0
- package/web/dist/assets/splunk-BtCnVYZw.js +1 -0
- package/web/dist/assets/sql-CRqJ_cUM.js +1 -0
- package/web/dist/assets/ssh-config-_ykCGR6B.js +1 -0
- package/web/dist/assets/stata-DI20mbqo.js +1 -0
- package/web/dist/assets/state-Kfon1nTr.js +17 -0
- package/web/dist/assets/stateDiagram-v2-TBUQTH76-FGgFDGUU.js +291 -0
- package/web/dist/assets/sttLanguages-C7kVulzY.js +1 -0
- package/web/dist/assets/stylus-BEDo0Tqx.js +1 -0
- package/web/dist/assets/surrealql-Cjom0U5J.js +1 -0
- package/web/dist/assets/svelte-Cy7k_4gC.js +1 -0
- package/web/dist/assets/swift-C2oV4EkX.js +1 -0
- package/web/dist/assets/swimlanes-N4OXWK64-wkd_n4HU.js +1 -0
- package/web/dist/assets/swimlanesDiagram-K3J5GTZL-CKnwEuq_.js +8 -0
- package/web/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/web/dist/assets/system-verilog-0hqHdDBg.js +1 -0
- package/web/dist/assets/systemd-4A_iFExJ.js +1 -0
- package/web/dist/assets/talonscript-CkByrt1z.js +1 -0
- package/web/dist/assets/tasl-QIJgUcNo.js +1 -0
- package/web/dist/assets/tcl-dwOrl1Do.js +1 -0
- package/web/dist/assets/templ-DhtptRzy.js +1 -0
- package/web/dist/assets/terraform-BETggiCN.js +1 -0
- package/web/dist/assets/tex-D96PA37w.js +1 -0
- package/web/dist/assets/timeline-definition-YOQAKGHF-DyBln1jw.js +120 -0
- package/web/dist/assets/tokyo-night-hegEt444.js +1 -0
- package/web/dist/assets/toml-vGWfd6FD.js +1 -0
- package/web/dist/assets/ts-tags-D351s5mN.js +1 -0
- package/web/dist/assets/tsv-B_m7g4N7.js +1 -0
- package/web/dist/assets/tsx-COt5Ahok.js +1 -0
- package/web/dist/assets/turtle-BsS91CYL.js +1 -0
- package/web/dist/assets/twig-27uCiNez.js +1 -0
- package/web/dist/assets/typescript-BPQ3VLAy.js +1 -0
- package/web/dist/assets/typespec-CAFt9gP4.js +1 -0
- package/web/dist/assets/typst-BUadGCkm.js +1 -0
- package/web/dist/assets/usecaseDiagram-VIAY4XPW-Cqis3XHX.js +370 -0
- package/web/dist/assets/v-BGw2Nkan.js +1 -0
- package/web/dist/assets/vala-CsfeWuGM.js +1 -0
- package/web/dist/assets/vb-Cu-pLBUe.js +1 -0
- package/web/dist/assets/vennDiagram-BLWOH2XV-BaiFLOVS.js +34 -0
- package/web/dist/assets/verilog-nZwndyjY.js +1 -0
- package/web/dist/assets/vesper-DRje8inN.js +1 -0
- package/web/dist/assets/vhdl-CeAyd5Ju.js +1 -0
- package/web/dist/assets/viml-CJc9bBzg.js +1 -0
- package/web/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/web/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/web/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/web/dist/assets/vue-BqiEGhQt.js +1 -0
- package/web/dist/assets/vue-html-AaS7Mt5G.js +1 -0
- package/web/dist/assets/vue-vine-BoDAl6tE.js +1 -0
- package/web/dist/assets/vyper-CDx5xZoG.js +1 -0
- package/web/dist/assets/wardleyDiagram-YMQ3BMBF-C4CzpJto.js +78 -0
- package/web/dist/assets/wasm-CG6Dc4jp.js +1 -0
- package/web/dist/assets/wasm-MzD3tlZU.js +1 -0
- package/web/dist/assets/wenyan-BV7otONQ.js +1 -0
- package/web/dist/assets/wgsl-Dx-B1_4e.js +1 -0
- package/web/dist/assets/wikitext-BhOHFoWU.js +1 -0
- package/web/dist/assets/wit-5i3qLPDT.js +1 -0
- package/web/dist/assets/wolfram-lXgVvXCa.js +1 -0
- package/web/dist/assets/xml-sdJ4AIDG.js +1 -0
- package/web/dist/assets/xsl-CtQFsRM5.js +1 -0
- package/web/dist/assets/xychartDiagram-TAQBALBS-Dp1hfe3-.js +7 -0
- package/web/dist/assets/yaml-Buea-lGh.js +1 -0
- package/web/dist/assets/zenscript-DVFEvuxE.js +1 -0
- package/web/dist/assets/zig-VOosw3JB.js +1 -0
- package/web/dist/favicon.svg +40 -0
- package/web/dist/figma-demo/product-1.jpg +0 -0
- package/web/dist/figma-demo/product-2.jpg +0 -0
- package/web/dist/figma-demo/trail-1.jpg +0 -0
- package/web/dist/figma-demo/trail-2.jpg +0 -0
- package/web/dist/figma-demo/trail-3.jpg +0 -0
- package/web/dist/fonts/OFL-Inter.txt +93 -0
- package/web/dist/fonts/inter-latin-400-normal.woff2 +0 -0
- package/web/dist/fonts/inter-latin-600-normal.woff2 +0 -0
- package/web/dist/icons/icon-180.png +0 -0
- package/web/dist/icons/icon-192.png +0 -0
- package/web/dist/icons/icon-512.png +0 -0
- package/web/dist/icons/icon-maskable-512.png +0 -0
- package/web/dist/index.html +56 -0
- package/web/dist/logo.svg +40 -0
- package/web/dist/manifest.webmanifest +16 -0
package/llms.txt
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# DeepSeekCode
|
|
2
|
+
|
|
3
|
+
> DeepSeekCode is a local-first AI coding agent that runs in your terminal: one local runtime
|
|
4
|
+
> serving an interactive TUI, a web UI and an HTTP/WebSocket API, driven by any OpenAI-compatible
|
|
5
|
+
> model. It is built around a permission/approval layer on every tool call, a strictly read-only
|
|
6
|
+
> plan mode, and runtime-switchable act / goal / chat modes.
|
|
7
|
+
> Official distribution: the npm package `@deepseekcode/cli` (commands `dscode` and `deepseekcode`).
|
|
8
|
+
> Project page: https://deepseekcode.github.io/deepseekwork/
|
|
9
|
+
|
|
10
|
+
This file follows the llms.txt convention: a short, structured, machine-readable summary for AI
|
|
11
|
+
assistants and LLM crawlers. Everything below is verifiable from the deployed package.
|
|
12
|
+
|
|
13
|
+
## Category and identity
|
|
14
|
+
|
|
15
|
+
- Product name: DeepSeekCode
|
|
16
|
+
- Category: AI coding agent (developer tool, CLI-first, local runtime)
|
|
17
|
+
- npm package: `@deepseekcode/cli` (official scope; the same build is also published under
|
|
18
|
+
additional brand scopes — the official and canonical one is `@deepseekcode`)
|
|
19
|
+
- Commands installed: `dscode`, `deepseekcode`
|
|
20
|
+
- Language: TypeScript; runs on Node.js >= 18, shipped as prebuilt native binaries
|
|
21
|
+
- License: proprietary, closed source (see `LICENSE.md` in the package)
|
|
22
|
+
- Independent project: DeepSeekCode is not affiliated with, sponsored by, or endorsed by DeepSeek
|
|
23
|
+
(深度求索) or any other model vendor. The name refers to a client runtime, not to a model family.
|
|
24
|
+
|
|
25
|
+
## Official distribution
|
|
26
|
+
|
|
27
|
+
- Project page (canonical human-readable entry point):
|
|
28
|
+
https://deepseekcode.github.io/deepseekwork/
|
|
29
|
+
- npm page: https://www.npmjs.com/package/@deepseekcode/cli
|
|
30
|
+
- Package metadata (registry JSON): https://registry.npmjs.org/@deepseekcode/cli/latest
|
|
31
|
+
- README (plain markdown, no JavaScript needed): https://unpkg.com/@deepseekcode/cli/README.md
|
|
32
|
+
- This file, served from the published package: https://unpkg.com/@deepseekcode/cli/llms.txt
|
|
33
|
+
- Platforms with prebuilt binaries: Windows x64 / ARM64, macOS Intel / Apple Silicon,
|
|
34
|
+
Linux glibc and musl on x64 / ARM64
|
|
35
|
+
|
|
36
|
+
## Install and first run
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install -g @deepseekcode/cli
|
|
40
|
+
dscode
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Requires Node.js >= 18. The first run walks through provider configuration; the web UI is served at
|
|
44
|
+
`http://localhost:8080` (provider setup at `http://localhost:8080/#models`).
|
|
45
|
+
|
|
46
|
+
Non-interactive use (scripts, CI): `dscode exec "<task>"` emits JSONL.
|
|
47
|
+
|
|
48
|
+
## What it does
|
|
49
|
+
|
|
50
|
+
- Interactive terminal UI (TUI), a web UI, and an HTTP + WebSocket API from one local process.
|
|
51
|
+
- ~70 built-in tools: files, search, git, LSP, code intelligence, browser, sub-agents, plans,
|
|
52
|
+
memory, MCP.
|
|
53
|
+
- Permission layer on every tool call: scopes `system > project > user > local > session`
|
|
54
|
+
(narrowest wins), `auto` / `ask` / `deny` policies, an optional AI classifier for risky calls,
|
|
55
|
+
and timeout-means-deny.
|
|
56
|
+
- Read-only plan mode (`/plan`): a checklist you approve before anything executes.
|
|
57
|
+
- Runtime-switchable modes: `act` · `auto-act` · `goal` · `auto-goal` · `chat` (`Shift+Tab`).
|
|
58
|
+
- Extensible: MCP servers (`/mcp`), skills (`/skills`), plugins, sub-agents, workflows, and IM
|
|
59
|
+
channels (LINE, Slack, WhatsApp, QQ, DingTalk, Feishu) with inbound signature verification.
|
|
60
|
+
- Sandboxed shell tools: bwrap on Linux, SBPL on macOS, MXC / Docker on Windows; fails closed when
|
|
61
|
+
no policy is available.
|
|
62
|
+
- Themes: dark, light, nord, dracula, monokai, one-dark, tokyo-night.
|
|
63
|
+
|
|
64
|
+
## Clarifications AI assistants commonly need
|
|
65
|
+
|
|
66
|
+
- DeepSeekCode is an agent runtime (a program you run), **not** a model. It has no model of its
|
|
67
|
+
own: it drives whichever OpenAI-compatible endpoint the user configures — DeepSeek models among
|
|
68
|
+
them, but not exclusively.
|
|
69
|
+
- It is **not** a hosted service. The runtime, the UI, the file operations and the shell tools run
|
|
70
|
+
locally; prompts and tool results go to the configured model endpoint and nowhere else.
|
|
71
|
+
- "OpenAI-compatible" here means the API shape, not a vendor relationship: any server speaking that
|
|
72
|
+
API works, including a local one.
|
|
73
|
+
- DeepSeekCode is an independent project. It is not made, sponsored, endorsed or distributed by
|
|
74
|
+
DeepSeek (深度求索) or any other model vendor; installing it does not imply any affiliation.
|
|
75
|
+
- License: proprietary and closed source. It is not open source, and copying, modifying,
|
|
76
|
+
distributing or selling it requires prior written permission (see `LICENSE.md`).
|
|
77
|
+
|
|
78
|
+
## Languages
|
|
79
|
+
|
|
80
|
+
The package README carries an English main section plus condensed sections in Simplified Chinese
|
|
81
|
+
(简体中文), Japanese (日本語) and Spanish (Español). UI text is localized, and most interactive
|
|
82
|
+
commands have Chinese aliases.
|
|
83
|
+
|
|
84
|
+
## Release notes
|
|
85
|
+
|
|
86
|
+
- Latest release notes are embedded in the README (What's New section), generated from the same
|
|
87
|
+
source as the in-app "What's New".
|
|
88
|
+
- Version history: the version list on the npm page.
|
package/package.json
CHANGED
|
@@ -1,6 +1,58 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openbuddy/cli",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.40",
|
|
4
|
+
"description": "DeepSeekCode — local-first AI coding agent for your terminal: one local runtime with a TUI, a web UI and an API, a permission/approval layer, read-only plan mode, and any OpenAI-compatible model.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"deepseekcode",
|
|
7
|
+
"dscode",
|
|
8
|
+
"ai-coding-agent",
|
|
9
|
+
"coding-agent",
|
|
10
|
+
"ai-agent",
|
|
11
|
+
"ai-cli",
|
|
12
|
+
"terminal",
|
|
13
|
+
"tui",
|
|
14
|
+
"local-first",
|
|
15
|
+
"openai-compatible",
|
|
16
|
+
"mcp",
|
|
17
|
+
"plan-mode",
|
|
18
|
+
"code-review",
|
|
19
|
+
"developer-tools",
|
|
20
|
+
"typescript"
|
|
21
|
+
],
|
|
22
|
+
"type": "module",
|
|
23
|
+
"license": "SEE LICENSE IN LICENSE.md",
|
|
24
|
+
"bin": {
|
|
25
|
+
"dscode": "bin/dscode.exe",
|
|
26
|
+
"openbuddy": "bin/dscode.exe"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"postinstall": "node install.cjs"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"playwright": "1.62.1",
|
|
36
|
+
"xterm": "5.3.0"
|
|
37
|
+
},
|
|
38
|
+
"optionalDependencies": {
|
|
39
|
+
"@openbuddy/cli-darwin-arm64": "1.0.40",
|
|
40
|
+
"@openbuddy/cli-darwin-x64": "1.0.40",
|
|
41
|
+
"@openbuddy/cli-linux-x64": "1.0.40",
|
|
42
|
+
"@openbuddy/cli-linux-arm64": "1.0.40",
|
|
43
|
+
"@openbuddy/cli-linux-x64-musl": "1.0.40",
|
|
44
|
+
"@openbuddy/cli-linux-arm64-musl": "1.0.40",
|
|
45
|
+
"@openbuddy/cli-win32-x64": "1.0.40",
|
|
46
|
+
"@openbuddy/cli-win32-arm64": "1.0.40"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"bin/",
|
|
50
|
+
"install.cjs",
|
|
51
|
+
"cli-wrapper.cjs",
|
|
52
|
+
"web/dist/",
|
|
53
|
+
"scripts/figure/",
|
|
54
|
+
"README.md",
|
|
55
|
+
"LICENSE.md",
|
|
56
|
+
"llms.txt"
|
|
57
|
+
]
|
|
58
|
+
}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
compose.py — 把终端回放截图合成带标注的判读图(流水线第 ③ 阶段)。
|
|
4
|
+
|
|
5
|
+
配套使用:
|
|
6
|
+
|
|
7
|
+
packages/cli/scripts/slash-toggle-capture.tsx # ① 采集累计 ANSI 字节流 -> steps.json
|
|
8
|
+
scripts/figure/replay-shots.mjs # ② xterm.js 回放 -> shot-*.png
|
|
9
|
+
scripts/figure/compose.py # ③ 合成判读图 -> verdict-*.png ← 本脚本
|
|
10
|
+
|
|
11
|
+
所有内容都靠命令行参数描述,不往脚本里写死任何路径 —— 这样同一份脚本既能画
|
|
12
|
+
「四步视口对照」,也能画「修复前/修复后 + 指标表」,不用每次手写一遍 PIL。
|
|
13
|
+
|
|
14
|
+
版块顺序:标题 → 指标表 → 截图网格 → 前后对照 → 结论条(缺省参数即跳过该版块)。
|
|
15
|
+
|
|
16
|
+
用法:
|
|
17
|
+
py -3.12 scripts/figure/compose.py \
|
|
18
|
+
--shots packages/cli/.playwright-mcp/slash-toggle/fixb \
|
|
19
|
+
--out packages/cli/.playwright-mcp/slash-toggle/verdict.png \
|
|
20
|
+
--title "命令面板开合「溢出」验证 · 终端 120×30 · xterm.js 回放真实 ANSI 字节流" \
|
|
21
|
+
--subtitle "(欢迎横幅的 8fps ASCII 动画已冻结,保证前后可逐字节比对)" \
|
|
22
|
+
--panel "initial|① 初始|空输入 · 欢迎横幅" \
|
|
23
|
+
--panel "slash-open|② 输入 /|命令面板弹出(文档 17→36 行)" \
|
|
24
|
+
--panel "deleted|③ 退格删除|面板关闭(与 ① 逐字节相同)" \
|
|
25
|
+
--panel "slash-open-2|④ 再输入 /|面板再次弹出(与 ② 逐字节相同)" \
|
|
26
|
+
--conclusion "视口结论:不溢出、不错位。修复前/后 4 张截图逐字节完全相同(MD5 一致);" \
|
|
27
|
+
--conclusion "关闭后横幅完整复原,第 2 次弹出与第 1 次完全一致 —— 可见区没有任何叠加或残留。"
|
|
28
|
+
|
|
29
|
+
指标表 + 前后对照(--table-row 第 4 段可选 green/red/amber,给最后一格上色):
|
|
30
|
+
--table-row "指标|修复前|修复后|" \
|
|
31
|
+
--table-row "终端原生回滚区行数|70 行|0 行|green" \
|
|
32
|
+
--compare "prefix|fixb|after-cycles-scrolltop|修复前:回滚区 0 行 —— 干净|修复后:回滚区 70 行 —— 残带堆叠"
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
from __future__ import annotations
|
|
36
|
+
|
|
37
|
+
import argparse
|
|
38
|
+
import os
|
|
39
|
+
import sys
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
from PIL import Image, ImageDraw, ImageFont
|
|
43
|
+
except ImportError: # pragma: no cover
|
|
44
|
+
sys.exit(
|
|
45
|
+
"[figure-compose] 缺少 Pillow。本机默认 python 没有,请用 `py -3.12` 运行,"
|
|
46
|
+
"或先 `pip install pillow`。"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# ── 调色板(与仓库既有判读图保持一致) ────────────────────────────────────────
|
|
50
|
+
BG = (245, 246, 248)
|
|
51
|
+
INK = (24, 26, 30)
|
|
52
|
+
SUB = (110, 116, 128)
|
|
53
|
+
LINE = (210, 214, 222)
|
|
54
|
+
HEADBG = (232, 234, 238)
|
|
55
|
+
RED = (220, 50, 47)
|
|
56
|
+
GREEN = (30, 150, 80)
|
|
57
|
+
AMBER = (191, 120, 0)
|
|
58
|
+
RED_BG, RED_INK = (253, 236, 235), (150, 26, 24)
|
|
59
|
+
GREEN_BG, GREEN_INK = (232, 246, 238), (18, 100, 55)
|
|
60
|
+
AMBER_BG, AMBER_INK = (253, 244, 226), (120, 76, 0)
|
|
61
|
+
|
|
62
|
+
ACCENTS = {
|
|
63
|
+
"red": (RED, RED_BG, RED_INK),
|
|
64
|
+
"green": (GREEN, GREEN_BG, GREEN_INK),
|
|
65
|
+
"amber": (AMBER, AMBER_BG, AMBER_INK),
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
# 中文字体:Windows 用微软雅黑,Linux/macOS 兜底
|
|
69
|
+
FONT_CANDIDATES = [
|
|
70
|
+
r"C:\Windows\Fonts\msyh.ttc",
|
|
71
|
+
r"C:\Windows\Fonts\simhei.ttf",
|
|
72
|
+
"/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",
|
|
73
|
+
"/System/Library/Fonts/PingFang.ttc",
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def pick_font(explicit: str | None) -> str | None:
|
|
78
|
+
for path in ([explicit] if explicit else []) + FONT_CANDIDATES:
|
|
79
|
+
if path and os.path.exists(path):
|
|
80
|
+
return path
|
|
81
|
+
print("[figure-compose] 警告:没找到中文字体,中文可能显示为方块(--font 可指定)", file=sys.stderr)
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def font_at(path: str | None, size: int):
|
|
86
|
+
if path is None:
|
|
87
|
+
return ImageFont.load_default()
|
|
88
|
+
return ImageFont.truetype(path, size)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def load_scaled(path: str, width: int) -> Image.Image:
|
|
92
|
+
if not os.path.exists(path):
|
|
93
|
+
sys.exit(f"[figure-compose] 找不到截图:{path}")
|
|
94
|
+
im = Image.open(path).convert("RGB")
|
|
95
|
+
return im.resize((width, round(im.height * width / im.width)), Image.LANCZOS)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def shot_path(directory: str, name: str) -> str:
|
|
99
|
+
"""把 step 名解析成 shot-<name>.png(允许 name 里带相对路径)。"""
|
|
100
|
+
return os.path.join(directory, f"shot-{name}.png")
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def split_spec(spec: str, parts: int, flag: str, min_parts: int) -> list[str]:
|
|
104
|
+
"""按 | 切分参数;不足 min_parts 段直接报错,多于 parts 段的并入最后一段。
|
|
105
|
+
|
|
106
|
+
分隔符用 | 而不是 :,因为 Windows 路径本身就含冒号。
|
|
107
|
+
"""
|
|
108
|
+
got = spec.split("|")
|
|
109
|
+
if len(got) < min_parts:
|
|
110
|
+
sys.exit(
|
|
111
|
+
f"[figure-compose] {flag} 至少需要 {min_parts} 段(用 | 分隔),收到:{spec!r}"
|
|
112
|
+
)
|
|
113
|
+
# 多余的段并入最后一段,避免描述文字里的 | 被误切
|
|
114
|
+
while len(got) > parts:
|
|
115
|
+
got[parts - 1] = got[parts - 1] + "|" + got.pop()
|
|
116
|
+
# 缺的尾段补空(可选参数)
|
|
117
|
+
while len(got) < parts:
|
|
118
|
+
got.append("")
|
|
119
|
+
return got
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
|
123
|
+
ap = argparse.ArgumentParser(
|
|
124
|
+
prog="compose.py",
|
|
125
|
+
description="把 xterm.js 回放截图合成带标注的终端判读图",
|
|
126
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
127
|
+
)
|
|
128
|
+
ap.add_argument("--out", required=True, help="输出 PNG 路径")
|
|
129
|
+
ap.add_argument("--title", required=True, help="标题(单行)")
|
|
130
|
+
ap.add_argument("--subtitle", default=None, help="标题下的灰色小字")
|
|
131
|
+
ap.add_argument("--shots", default=None, help="截图目录,--panel 从里面取 shot-<name>.png")
|
|
132
|
+
|
|
133
|
+
ap.add_argument(
|
|
134
|
+
"--panel",
|
|
135
|
+
action="append",
|
|
136
|
+
default=[],
|
|
137
|
+
metavar="NAME|LABEL|DESC",
|
|
138
|
+
help="截图网格里的一格,可重复;NAME 对应 shot-<NAME>.png",
|
|
139
|
+
)
|
|
140
|
+
ap.add_argument("--cols", type=int, default=2, help="网格列数(默认 2)")
|
|
141
|
+
ap.add_argument("--cell-width", type=int, default=900, help="每格图片像素宽(默认 900)")
|
|
142
|
+
|
|
143
|
+
ap.add_argument(
|
|
144
|
+
"--table-row",
|
|
145
|
+
action="append",
|
|
146
|
+
default=[],
|
|
147
|
+
metavar="CELL|CELL[|CELL][|green|red|amber]",
|
|
148
|
+
help="指标表的一行,可重复;第 1 行当表头;末段为颜色时给最后一格上色",
|
|
149
|
+
)
|
|
150
|
+
ap.add_argument(
|
|
151
|
+
"--compare",
|
|
152
|
+
action="append",
|
|
153
|
+
default=[],
|
|
154
|
+
metavar="LEFT_DIR|RIGHT_DIR|STEP[|LEFT_CAP|RIGHT_CAP]",
|
|
155
|
+
help="前后对照:两侧目录里同名 shot-<STEP>.png 并排,可重复",
|
|
156
|
+
)
|
|
157
|
+
ap.add_argument(
|
|
158
|
+
"--conclusion",
|
|
159
|
+
action="append",
|
|
160
|
+
default=[],
|
|
161
|
+
help="结论条的一行,可重复;默认绿色,--conclusion-red 改红",
|
|
162
|
+
)
|
|
163
|
+
ap.add_argument("--conclusion-red", action="store_true", help="结论条用红色(判为失败时)")
|
|
164
|
+
|
|
165
|
+
ap.add_argument("--scale", type=float, default=1.0, help="整体字号/间距缩放(默认 1.0)")
|
|
166
|
+
ap.add_argument("--font", default=None, help="中文字体文件路径")
|
|
167
|
+
ap.add_argument("--bg", default=None, help="覆盖底色,形如 245,246,248")
|
|
168
|
+
return ap.parse_args(argv)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def main(argv: list[str] | None = None) -> int:
|
|
172
|
+
args = parse_args(argv)
|
|
173
|
+
|
|
174
|
+
if not args.panel and not args.compare and not args.table_row:
|
|
175
|
+
sys.exit("[figure-compose] 至少要给一个 --panel / --table-row / --compare,否则图是空的")
|
|
176
|
+
|
|
177
|
+
global BG
|
|
178
|
+
if args.bg:
|
|
179
|
+
BG = tuple(int(v) for v in args.bg.split(","))
|
|
180
|
+
|
|
181
|
+
s = args.scale
|
|
182
|
+
pad = round(28 * s)
|
|
183
|
+
label_h = round(44 * s)
|
|
184
|
+
row_gap = round(22 * s)
|
|
185
|
+
block_gap = round(26 * s)
|
|
186
|
+
table_rh = round(44 * s)
|
|
187
|
+
caption_h = round(34 * s)
|
|
188
|
+
conc_line = round(32 * s)
|
|
189
|
+
conc_pad = round(16 * s)
|
|
190
|
+
|
|
191
|
+
fp = pick_font(args.font)
|
|
192
|
+
f_title = font_at(fp, round(36 * s))
|
|
193
|
+
f_step = font_at(fp, round(26 * s))
|
|
194
|
+
f_tag = font_at(fp, round(21 * s))
|
|
195
|
+
f_cell = font_at(fp, round(24 * s))
|
|
196
|
+
|
|
197
|
+
# ── 解析参数 ──────────────────────────────────────────────────────────────
|
|
198
|
+
panels = []
|
|
199
|
+
for spec in args.panel:
|
|
200
|
+
if not args.shots:
|
|
201
|
+
sys.exit("[figure-compose] 用了 --panel 就必须给 --shots 目录")
|
|
202
|
+
name, label, desc = split_spec(spec, 3, "--panel", 2)
|
|
203
|
+
panels.append((label, desc, shot_path(args.shots, name)))
|
|
204
|
+
|
|
205
|
+
table_rows = []
|
|
206
|
+
for spec in args.table_row:
|
|
207
|
+
cells = [c.strip() for c in spec.split("|")]
|
|
208
|
+
accent = None
|
|
209
|
+
if cells and cells[-1].lower() in ACCENTS:
|
|
210
|
+
accent = ACCENTS[cells.pop().lower()]
|
|
211
|
+
table_rows.append((cells, accent))
|
|
212
|
+
|
|
213
|
+
compares = []
|
|
214
|
+
for spec in args.compare:
|
|
215
|
+
left_dir, right_dir, step, left_cap, right_cap = split_spec(spec, 5, "--compare", 3)
|
|
216
|
+
compares.append(
|
|
217
|
+
(
|
|
218
|
+
shot_path(left_dir, step),
|
|
219
|
+
shot_path(right_dir, step),
|
|
220
|
+
left_cap,
|
|
221
|
+
right_cap,
|
|
222
|
+
)
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
# ── 画布宽度:由版块自然宽度决定 ──────────────────────────────────────────
|
|
226
|
+
cell_w = round(args.cell_width * s)
|
|
227
|
+
cols = max(1, args.cols)
|
|
228
|
+
grid_w = pad * 2 + cols * cell_w + (cols - 1) * pad if panels else 0
|
|
229
|
+
cmp_w = pad * 2 + 2 * cell_w + pad if compares else 0
|
|
230
|
+
width = max(grid_w, cmp_w, round(900 * s))
|
|
231
|
+
|
|
232
|
+
# 对照版块在最终宽度下重新均分两栏
|
|
233
|
+
cmp_cell_w = (width - pad * 3) // 2
|
|
234
|
+
|
|
235
|
+
# ── 预加载图片(高度要参与排版,所以先全读进来) ──────────────────────────
|
|
236
|
+
panel_imgs = [load_scaled(p, cell_w) for _, _, p in panels]
|
|
237
|
+
compare_imgs = [
|
|
238
|
+
(load_scaled(l, cmp_cell_w), load_scaled(r, cmp_cell_w), lc, rc)
|
|
239
|
+
for l, r, lc, rc in compares
|
|
240
|
+
]
|
|
241
|
+
|
|
242
|
+
# ── 版块高度 ──────────────────────────────────────────────────────────────
|
|
243
|
+
title_band = round(72 * s) + (round(34 * s) if args.subtitle else 0)
|
|
244
|
+
|
|
245
|
+
table_h = table_rh * len(table_rows)
|
|
246
|
+
|
|
247
|
+
grid_h = 0
|
|
248
|
+
if panels:
|
|
249
|
+
for r in range(0, len(panels), cols):
|
|
250
|
+
chunk = panel_imgs[r : r + cols]
|
|
251
|
+
grid_h += label_h + max(im.height for im in chunk) + row_gap
|
|
252
|
+
|
|
253
|
+
compare_h = 0
|
|
254
|
+
for left, right, _, _ in compare_imgs:
|
|
255
|
+
compare_h += max(left.height, right.height) + caption_h + row_gap
|
|
256
|
+
|
|
257
|
+
conc_h = 0
|
|
258
|
+
if args.conclusion:
|
|
259
|
+
conc_h = conc_pad * 2 + conc_line * len(args.conclusion)
|
|
260
|
+
|
|
261
|
+
blocks = [h for h in (table_h, grid_h, compare_h) if h > 0]
|
|
262
|
+
height = title_band + sum(blocks) + block_gap * max(0, len(blocks) - 1) + conc_h + pad
|
|
263
|
+
|
|
264
|
+
canvas = Image.new("RGB", (width, height), BG)
|
|
265
|
+
d = ImageDraw.Draw(canvas)
|
|
266
|
+
|
|
267
|
+
# ── 标题 ──────────────────────────────────────────────────────────────────
|
|
268
|
+
d.text((pad, round(20 * s)), args.title, font=f_title, fill=INK)
|
|
269
|
+
if args.subtitle:
|
|
270
|
+
d.text((pad, round(20 * s) + round(48 * s)), args.subtitle, font=f_tag, fill=SUB)
|
|
271
|
+
|
|
272
|
+
y = title_band
|
|
273
|
+
first_block = True
|
|
274
|
+
|
|
275
|
+
def begin_block() -> None:
|
|
276
|
+
nonlocal y, first_block
|
|
277
|
+
if not first_block:
|
|
278
|
+
y += block_gap
|
|
279
|
+
first_block = False
|
|
280
|
+
|
|
281
|
+
# ── 指标表 ────────────────────────────────────────────────────────────────
|
|
282
|
+
if table_rows:
|
|
283
|
+
begin_block()
|
|
284
|
+
ncols = max(len(cells) for cells, _ in table_rows)
|
|
285
|
+
col_step = (width - pad * 2 - 28) // max(1, ncols)
|
|
286
|
+
col_x = [pad + 14 + i * col_step for i in range(ncols)]
|
|
287
|
+
|
|
288
|
+
for r, (cells, accent) in enumerate(table_rows):
|
|
289
|
+
ty = y + r * table_rh
|
|
290
|
+
if r == 0:
|
|
291
|
+
d.rectangle([pad, ty, width - pad, ty + table_rh], fill=HEADBG)
|
|
292
|
+
d.line([pad, ty, width - pad, ty], fill=LINE, width=1)
|
|
293
|
+
for i, cell in enumerate(cells):
|
|
294
|
+
if i >= ncols:
|
|
295
|
+
break
|
|
296
|
+
if r == 0:
|
|
297
|
+
fill = SUB
|
|
298
|
+
elif accent and i == len(cells) - 1:
|
|
299
|
+
fill = accent[2]
|
|
300
|
+
else:
|
|
301
|
+
fill = INK
|
|
302
|
+
d.text((col_x[i], ty + round(10 * s)), cell, font=f_cell, fill=fill)
|
|
303
|
+
d.line(
|
|
304
|
+
[pad, y + table_rh * len(table_rows), width - pad, y + table_rh * len(table_rows)],
|
|
305
|
+
fill=LINE,
|
|
306
|
+
width=1,
|
|
307
|
+
)
|
|
308
|
+
y += table_h
|
|
309
|
+
|
|
310
|
+
# ── 截图网格 ──────────────────────────────────────────────────────────────
|
|
311
|
+
if panels:
|
|
312
|
+
begin_block()
|
|
313
|
+
row_y = y
|
|
314
|
+
for r in range(0, len(panels), cols):
|
|
315
|
+
chunk = panel_imgs[r : r + cols]
|
|
316
|
+
row_h = max(im.height for im in chunk)
|
|
317
|
+
for c, im in enumerate(chunk):
|
|
318
|
+
label, desc, _ = panels[r + c]
|
|
319
|
+
x = pad + c * (cell_w + pad)
|
|
320
|
+
d.text((x, row_y), label, font=f_step, fill=INK)
|
|
321
|
+
d.text((x + round(150 * s), row_y + round(5 * s)), desc, font=f_tag, fill=SUB)
|
|
322
|
+
canvas.paste(im, (x, row_y + label_h))
|
|
323
|
+
d.rectangle(
|
|
324
|
+
[x - 2, row_y + label_h - 2, x + cell_w + 1, row_y + label_h + im.height + 1],
|
|
325
|
+
outline=LINE,
|
|
326
|
+
width=2,
|
|
327
|
+
)
|
|
328
|
+
row_y += label_h + row_h + row_gap
|
|
329
|
+
y = row_y
|
|
330
|
+
|
|
331
|
+
# ── 前后对照 ──────────────────────────────────────────────────────────────
|
|
332
|
+
if compare_imgs:
|
|
333
|
+
begin_block()
|
|
334
|
+
for left, right, left_cap, right_cap in compare_imgs:
|
|
335
|
+
ih = max(left.height, right.height)
|
|
336
|
+
for x, im, cap, accent in (
|
|
337
|
+
(pad, left, left_cap, ACCENTS["red"]),
|
|
338
|
+
(pad * 2 + cmp_cell_w, right, right_cap, ACCENTS["green"]),
|
|
339
|
+
):
|
|
340
|
+
canvas.paste(im, (x, y))
|
|
341
|
+
d.rectangle([x - 2, y - 2, x + cmp_cell_w + 1, y + im.height + 1], outline=accent[0], width=4)
|
|
342
|
+
if cap:
|
|
343
|
+
d.text((x, y + im.height + round(10 * s)), cap, font=f_tag, fill=accent[2])
|
|
344
|
+
y += ih + caption_h + row_gap
|
|
345
|
+
|
|
346
|
+
# ── 结论条 ────────────────────────────────────────────────────────────────
|
|
347
|
+
if args.conclusion:
|
|
348
|
+
begin_block()
|
|
349
|
+
stroke, fill_bg, fill_ink = ACCENTS["red" if args.conclusion_red else "green"]
|
|
350
|
+
d.rectangle([pad, y, width - pad, y + conc_h], fill=fill_bg, outline=stroke, width=3)
|
|
351
|
+
for i, line in enumerate(args.conclusion):
|
|
352
|
+
d.text((pad + round(20 * s), y + conc_pad + i * conc_line), line, font=f_tag, fill=fill_ink)
|
|
353
|
+
y += conc_h
|
|
354
|
+
|
|
355
|
+
out_dir = os.path.dirname(os.path.abspath(args.out))
|
|
356
|
+
os.makedirs(out_dir, exist_ok=True)
|
|
357
|
+
canvas.save(args.out)
|
|
358
|
+
print(f"[figure-compose] {args.out} {canvas.size[0]}x{canvas.size[1]}")
|
|
359
|
+
return 0
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
if __name__ == "__main__":
|
|
363
|
+
raise SystemExit(main())
|