relay-ide 0.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/README.md +259 -0
- package/dist/bin/claude-remote-cli.js +390 -0
- package/dist/bin/relay-ide.js +390 -0
- package/dist/frontend/assets/abap-BdImnpbu.js +1 -0
- package/dist/frontend/assets/actionscript-3-CoDkCxhg.js +1 -0
- package/dist/frontend/assets/ada-bCR0ucgS.js +1 -0
- package/dist/frontend/assets/andromeeda-C4gqWexZ.js +1 -0
- package/dist/frontend/assets/angular-html-DA-rfuFy.js +1 -0
- package/dist/frontend/assets/angular-ts-BrjP3tb8.js +1 -0
- package/dist/frontend/assets/apache-Pmp26Uib.js +1 -0
- package/dist/frontend/assets/apex-D8_7TLub.js +1 -0
- package/dist/frontend/assets/apl-CORt7UWP.js +1 -0
- package/dist/frontend/assets/applescript-Co6uUVPk.js +1 -0
- package/dist/frontend/assets/ara-BRHolxvo.js +1 -0
- package/dist/frontend/assets/asciidoc-Ve4PFQV2.js +1 -0
- package/dist/frontend/assets/asm-D_Q5rh1f.js +1 -0
- package/dist/frontend/assets/astro-HNnZUWAn.js +1 -0
- package/dist/frontend/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/dist/frontend/assets/awk-DMzUqQB5.js +1 -0
- package/dist/frontend/assets/ayu-dark-DYE7WIF3.js +1 -0
- package/dist/frontend/assets/ayu-light-BA47KaF1.js +1 -0
- package/dist/frontend/assets/ayu-mirage-32ctXXKs.js +1 -0
- package/dist/frontend/assets/ballerina-BFfxhgS-.js +1 -0
- package/dist/frontend/assets/bat-BkioyH1T.js +1 -0
- package/dist/frontend/assets/beancount-k_qm7-4y.js +1 -0
- package/dist/frontend/assets/berry-uYugtg8r.js +1 -0
- package/dist/frontend/assets/bibtex-CHM0blh-.js +1 -0
- package/dist/frontend/assets/bicep-Bmn6On1c.js +1 -0
- package/dist/frontend/assets/bird2-BIv1doCn.js +1 -0
- package/dist/frontend/assets/blade-BjGOyj-B.js +1 -0
- package/dist/frontend/assets/bsl-BO_Y6i37.js +1 -0
- package/dist/frontend/assets/c-BIGW1oBm.js +1 -0
- package/dist/frontend/assets/c3-eo99z4R2.js +1 -0
- package/dist/frontend/assets/cadence-Bv_4Rxtq.js +1 -0
- package/dist/frontend/assets/cairo-KRGpt6FW.js +1 -0
- package/dist/frontend/assets/catppuccin-frappe-DFWUc33u.js +1 -0
- package/dist/frontend/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
- package/dist/frontend/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
- package/dist/frontend/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
- package/dist/frontend/assets/clarity-D53aC0YG.js +1 -0
- package/dist/frontend/assets/clojure-P80f7IUj.js +1 -0
- package/dist/frontend/assets/cmake-D1j8_8rp.js +1 -0
- package/dist/frontend/assets/cobol-nBiQ_Alo.js +1 -0
- package/dist/frontend/assets/codeowners-Bp6g37R7.js +1 -0
- package/dist/frontend/assets/codeql-DsOJ9woJ.js +1 -0
- package/dist/frontend/assets/coffee-Ch7k5sss.js +1 -0
- package/dist/frontend/assets/common-lisp-Cg-RD9OK.js +1 -0
- package/dist/frontend/assets/coq-DkFqJrB1.js +1 -0
- package/dist/frontend/assets/cpp-CofmeUqb.js +1 -0
- package/dist/frontend/assets/crystal-DNxU26gB.js +1 -0
- package/dist/frontend/assets/csharp-COcwbKMJ.js +1 -0
- package/dist/frontend/assets/css-CLj8gQPS.js +1 -0
- package/dist/frontend/assets/csv-fuZLfV_i.js +1 -0
- package/dist/frontend/assets/cue-D82EKSYY.js +1 -0
- package/dist/frontend/assets/cypher-COkxafJQ.js +1 -0
- package/dist/frontend/assets/d-85-TOEBH.js +1 -0
- package/dist/frontend/assets/dark-plus-C3mMm8J8.js +1 -0
- package/dist/frontend/assets/dart-bE4Kk8sk.js +1 -0
- package/dist/frontend/assets/dax-CEL-wOlO.js +1 -0
- package/dist/frontend/assets/desktop-BmXAJ9_W.js +1 -0
- package/dist/frontend/assets/diff-D97Zzqfu.js +1 -0
- package/dist/frontend/assets/docker-BcOcwvcX.js +1 -0
- package/dist/frontend/assets/dotenv-Da5cRb03.js +1 -0
- package/dist/frontend/assets/dracula-BzJJZx-M.js +1 -0
- package/dist/frontend/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/dist/frontend/assets/dream-maker-BtqSS_iP.js +1 -0
- package/dist/frontend/assets/edge-FbVlp4U3.js +1 -0
- package/dist/frontend/assets/elixir-CkH2-t6x.js +1 -0
- package/dist/frontend/assets/elm-DbKCFpqz.js +1 -0
- package/dist/frontend/assets/emacs-lisp-CXvaQtF9.js +1 -0
- package/dist/frontend/assets/erb-BYCe7drp.js +1 -0
- package/dist/frontend/assets/erlang-DsQrWhSR.js +1 -0
- package/dist/frontend/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/dist/frontend/assets/everforest-light-C8M2exoo.js +1 -0
- package/dist/frontend/assets/fennel-BYunw83y.js +1 -0
- package/dist/frontend/assets/fish-BvzEVeQv.js +1 -0
- package/dist/frontend/assets/fluent-C4IJs8-o.js +1 -0
- package/dist/frontend/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
- package/dist/frontend/assets/fortran-free-form-BxgE0vQu.js +1 -0
- package/dist/frontend/assets/fsharp-CXgrBDvD.js +1 -0
- package/dist/frontend/assets/gdresource-BOOCDP_w.js +1 -0
- package/dist/frontend/assets/gdscript-C5YyOfLZ.js +1 -0
- package/dist/frontend/assets/gdshader-DkwncUOv.js +1 -0
- package/dist/frontend/assets/genie-D0YGMca9.js +1 -0
- package/dist/frontend/assets/gherkin-DyxjwDmM.js +1 -0
- package/dist/frontend/assets/git-commit-F4YmCXRG.js +1 -0
- package/dist/frontend/assets/git-rebase-r7XF79zn.js +1 -0
- package/dist/frontend/assets/github-dark-DHJKELXO.js +1 -0
- package/dist/frontend/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/dist/frontend/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/dist/frontend/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/dist/frontend/assets/github-light-DAi9KRSo.js +1 -0
- package/dist/frontend/assets/github-light-default-D7oLnXFd.js +1 -0
- package/dist/frontend/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/dist/frontend/assets/gleam-BspZqrRM.js +1 -0
- package/dist/frontend/assets/glimmer-js-ByusRIyA.js +1 -0
- package/dist/frontend/assets/glimmer-ts-BfAWNZQY.js +1 -0
- package/dist/frontend/assets/glsl-DplSGwfg.js +1 -0
- package/dist/frontend/assets/gn-n2N0HUVH.js +1 -0
- package/dist/frontend/assets/gnuplot-DdkO51Og.js +1 -0
- package/dist/frontend/assets/go-C27-OAKa.js +1 -0
- package/dist/frontend/assets/graphql-ChdNCCLP.js +1 -0
- package/dist/frontend/assets/groovy-gcz8RCvz.js +1 -0
- package/dist/frontend/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- package/dist/frontend/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- package/dist/frontend/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- package/dist/frontend/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- package/dist/frontend/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- package/dist/frontend/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- package/dist/frontend/assets/hack-i7_Ulhet.js +1 -0
- package/dist/frontend/assets/haml-D5jkg6IW.js +1 -0
- package/dist/frontend/assets/handlebars-BpdQsYii.js +1 -0
- package/dist/frontend/assets/haskell-Df6bDoY_.js +1 -0
- package/dist/frontend/assets/haxe-CzTSHFRz.js +1 -0
- package/dist/frontend/assets/hcl-BWvSN4gD.js +1 -0
- package/dist/frontend/assets/hjson-D5-asLiD.js +1 -0
- package/dist/frontend/assets/hlsl-D3lLCCz7.js +1 -0
- package/dist/frontend/assets/horizon-BUw7H-hv.js +1 -0
- package/dist/frontend/assets/horizon-bright-CUuTKBJd.js +1 -0
- package/dist/frontend/assets/houston-DnULxvSX.js +1 -0
- package/dist/frontend/assets/html-derivative-DlHx6ybY.js +1 -0
- package/dist/frontend/assets/html-pp8916En.js +1 -0
- package/dist/frontend/assets/http-jrhK8wxY.js +1 -0
- package/dist/frontend/assets/hurl-irOxFIW8.js +1 -0
- package/dist/frontend/assets/hxml-Bvhsp5Yf.js +1 -0
- package/dist/frontend/assets/hy-DFXneXwc.js +1 -0
- package/dist/frontend/assets/imba-DGztddWO.js +1 -0
- package/dist/frontend/assets/ini-BEwlwnbL.js +1 -0
- package/dist/frontend/assets/java-CylS5w8V.js +1 -0
- package/dist/frontend/assets/javascript-wDzz0qaB.js +1 -0
- package/dist/frontend/assets/jinja-f2NsQr07.js +1 -0
- package/dist/frontend/assets/jison-wvAkD_A8.js +1 -0
- package/dist/frontend/assets/json-Cp-IABpG.js +1 -0
- package/dist/frontend/assets/json5-C9tS-k6U.js +1 -0
- package/dist/frontend/assets/jsonc-Des-eS-w.js +1 -0
- package/dist/frontend/assets/jsonl-DcaNXYhu.js +1 -0
- package/dist/frontend/assets/jsonnet-DFQXde-d.js +1 -0
- package/dist/frontend/assets/jssm-C2t-YnRu.js +1 -0
- package/dist/frontend/assets/jsx-g9-lgVsj.js +1 -0
- package/dist/frontend/assets/julia-CxzCAyBv.js +1 -0
- package/dist/frontend/assets/just-VxiPbLrw.js +1 -0
- package/dist/frontend/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- package/dist/frontend/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- package/dist/frontend/assets/kanagawa-wave-DWedfzmr.js +1 -0
- package/dist/frontend/assets/kdl-DV7GczEv.js +1 -0
- package/dist/frontend/assets/kotlin-BdnUsdx6.js +1 -0
- package/dist/frontend/assets/kusto-wEQ09or8.js +1 -0
- package/dist/frontend/assets/laserwave-DUszq2jm.js +1 -0
- package/dist/frontend/assets/latex-CWtU0Tv5.js +1 -0
- package/dist/frontend/assets/lean-BZvkOJ9d.js +1 -0
- package/dist/frontend/assets/less-B1dDrJ26.js +1 -0
- package/dist/frontend/assets/light-plus-B7mTdjB0.js +1 -0
- package/dist/frontend/assets/liquid-C0sCDyMI.js +1 -0
- package/dist/frontend/assets/llvm-DjAJT7YJ.js +1 -0
- package/dist/frontend/assets/log-2UxHyX5q.js +1 -0
- package/dist/frontend/assets/logo-BtOb2qkB.js +1 -0
- package/dist/frontend/assets/lua-BaeVxFsk.js +1 -0
- package/dist/frontend/assets/luau-C-HG3fhB.js +1 -0
- package/dist/frontend/assets/main-CL5_Wlhv.css +32 -0
- package/dist/frontend/assets/main-Czet4Z1x.js +371 -0
- package/dist/frontend/assets/make-CHLpvVh8.js +1 -0
- package/dist/frontend/assets/markdown-Cvjx9yec.js +1 -0
- package/dist/frontend/assets/marko-DjSrsDqO.js +1 -0
- package/dist/frontend/assets/material-theme-D5KoaKCx.js +1 -0
- package/dist/frontend/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/dist/frontend/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/dist/frontend/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/dist/frontend/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/dist/frontend/assets/matlab-D7o27uSR.js +1 -0
- package/dist/frontend/assets/mdc-DTYItulj.js +1 -0
- package/dist/frontend/assets/mdx-Cmh6b_Ma.js +1 -0
- package/dist/frontend/assets/mermaid-mWjccvbQ.js +1 -0
- package/dist/frontend/assets/min-dark-CafNBF8u.js +1 -0
- package/dist/frontend/assets/min-light-CTRr51gU.js +1 -0
- package/dist/frontend/assets/mipsasm-CKIfxQSi.js +1 -0
- package/dist/frontend/assets/mojo-rZm6bMo-.js +1 -0
- package/dist/frontend/assets/monokai-D4h5O-jR.js +1 -0
- package/dist/frontend/assets/moonbit-_H4v1dQx.js +1 -0
- package/dist/frontend/assets/move-IF9eRakj.js +1 -0
- package/dist/frontend/assets/narrat-DRg8JJMk.js +1 -0
- package/dist/frontend/assets/nextflow-C-mBbutL.js +1 -0
- package/dist/frontend/assets/nextflow-groovy-vE_lwT2v.js +1 -0
- package/dist/frontend/assets/nginx-BpAMiNFr.js +1 -0
- package/dist/frontend/assets/night-owl-C39BiMTA.js +1 -0
- package/dist/frontend/assets/night-owl-light-CMTm3GFP.js +1 -0
- package/dist/frontend/assets/nim-BIad80T-.js +1 -0
- package/dist/frontend/assets/nix-CwoSXNpI.js +1 -0
- package/dist/frontend/assets/nord-Ddv68eIx.js +1 -0
- package/dist/frontend/assets/nushell-Cz2AlsmD.js +1 -0
- package/dist/frontend/assets/objective-c-DXmwc3jG.js +1 -0
- package/dist/frontend/assets/objective-cpp-CLxacb5B.js +1 -0
- package/dist/frontend/assets/ocaml-C0hk2d4L.js +1 -0
- package/dist/frontend/assets/odin-BBf5iR-q.js +1 -0
- package/dist/frontend/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/dist/frontend/assets/one-light-C3Wv6jpd.js +1 -0
- package/dist/frontend/assets/openscad-C4EeE6gA.js +1 -0
- package/dist/frontend/assets/pascal-D93ZcfNL.js +1 -0
- package/dist/frontend/assets/perl-NvoQZIq0.js +1 -0
- package/dist/frontend/assets/php-R6g_5hLQ.js +1 -0
- package/dist/frontend/assets/pkl-u5AG7uiY.js +1 -0
- package/dist/frontend/assets/plastic-3e1v2bzS.js +1 -0
- package/dist/frontend/assets/plsql-ChMvpjG-.js +1 -0
- package/dist/frontend/assets/po-BTJTHyun.js +1 -0
- package/dist/frontend/assets/poimandres-CS3Unz2-.js +1 -0
- package/dist/frontend/assets/polar-C0HS_06l.js +1 -0
- package/dist/frontend/assets/postcss-CXtECtnM.js +1 -0
- package/dist/frontend/assets/powerquery-CEu0bR-o.js +1 -0
- package/dist/frontend/assets/powershell-Dpen1YoG.js +1 -0
- package/dist/frontend/assets/prisma-Dd19v3D-.js +1 -0
- package/dist/frontend/assets/prolog-CbFg5uaA.js +1 -0
- package/dist/frontend/assets/proto-C7zT0LnQ.js +1 -0
- package/dist/frontend/assets/pug-DKIMFp6K.js +1 -0
- package/dist/frontend/assets/puppet-BMWR74SV.js +1 -0
- package/dist/frontend/assets/purescript-CklMAg4u.js +1 -0
- package/dist/frontend/assets/python-B6aJPvgy.js +1 -0
- package/dist/frontend/assets/qml-3beO22l8.js +1 -0
- package/dist/frontend/assets/qmldir-C8lEn-DE.js +1 -0
- package/dist/frontend/assets/qss-IeuSbFQv.js +1 -0
- package/dist/frontend/assets/r-Dspwwk_N.js +1 -0
- package/dist/frontend/assets/racket-BqYA7rlc.js +1 -0
- package/dist/frontend/assets/raku-DXvB9xmW.js +1 -0
- package/dist/frontend/assets/razor-BDqjjVU7.js +1 -0
- package/dist/frontend/assets/red-bN70gL4F.js +1 -0
- package/dist/frontend/assets/reg-C-SQnVFl.js +1 -0
- package/dist/frontend/assets/regexp-CDVJQ6XC.js +1 -0
- package/dist/frontend/assets/rel-C3B-1QV4.js +1 -0
- package/dist/frontend/assets/riscv-BM1_JUlF.js +1 -0
- package/dist/frontend/assets/ron-D8l8udqQ.js +1 -0
- package/dist/frontend/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
- package/dist/frontend/assets/rose-pine-moon-D4_iv3hh.js +1 -0
- package/dist/frontend/assets/rose-pine-qdsjHGoJ.js +1 -0
- package/dist/frontend/assets/rosmsg-BJDFO7_C.js +1 -0
- package/dist/frontend/assets/rst-CRjBmOyv.js +1 -0
- package/dist/frontend/assets/ruby-Wjq7vjNf.js +1 -0
- package/dist/frontend/assets/rust-B1yitclQ.js +1 -0
- package/dist/frontend/assets/sas-cz2c8ADy.js +1 -0
- package/dist/frontend/assets/sass-Cj5Yp3dK.js +1 -0
- package/dist/frontend/assets/scala-C151Ov-r.js +1 -0
- package/dist/frontend/assets/scheme-C98Dy4si.js +1 -0
- package/dist/frontend/assets/scss-D5BDwBP9.js +1 -0
- package/dist/frontend/assets/sdbl-DVxCFoDh.js +1 -0
- package/dist/frontend/assets/shaderlab-Dg9Lc6iA.js +1 -0
- package/dist/frontend/assets/shellscript-Yzrsuije.js +1 -0
- package/dist/frontend/assets/shellsession-BADoaaVG.js +1 -0
- package/dist/frontend/assets/slack-dark-BthQWCQV.js +1 -0
- package/dist/frontend/assets/slack-ochin-DqwNpetd.js +1 -0
- package/dist/frontend/assets/smalltalk-BERRCDM3.js +1 -0
- package/dist/frontend/assets/snazzy-light-Bw305WKR.js +1 -0
- package/dist/frontend/assets/solarized-dark-DXbdFlpD.js +1 -0
- package/dist/frontend/assets/solarized-light-L9t79GZl.js +1 -0
- package/dist/frontend/assets/solidity-rGO070M0.js +1 -0
- package/dist/frontend/assets/soy-8wufbnw4.js +1 -0
- package/dist/frontend/assets/sparql-rVzFXLq3.js +1 -0
- package/dist/frontend/assets/splunk-BtCnVYZw.js +1 -0
- package/dist/frontend/assets/sql-BLtJtn59.js +1 -0
- package/dist/frontend/assets/ssh-config-_ykCGR6B.js +1 -0
- package/dist/frontend/assets/stata-BH5u7GGu.js +1 -0
- package/dist/frontend/assets/stylus-BEDo0Tqx.js +1 -0
- package/dist/frontend/assets/surrealql-Bq5Q-fJD.js +1 -0
- package/dist/frontend/assets/svelte-Cy7k_4gC.js +1 -0
- package/dist/frontend/assets/swift-D82vCrfD.js +1 -0
- package/dist/frontend/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/dist/frontend/assets/system-verilog-CnnmHF94.js +1 -0
- package/dist/frontend/assets/systemd-4A_iFExJ.js +1 -0
- package/dist/frontend/assets/talonscript-CkByrt1z.js +1 -0
- package/dist/frontend/assets/tasl-QIJgUcNo.js +1 -0
- package/dist/frontend/assets/tcl-dwOrl1Do.js +1 -0
- package/dist/frontend/assets/templ-DhtptRzy.js +1 -0
- package/dist/frontend/assets/terraform-BETggiCN.js +1 -0
- package/dist/frontend/assets/tex-idrVyKtj.js +1 -0
- package/dist/frontend/assets/tokyo-night-hegEt444.js +1 -0
- package/dist/frontend/assets/toml-vGWfd6FD.js +1 -0
- package/dist/frontend/assets/ts-tags-DQrlYJgV.js +1 -0
- package/dist/frontend/assets/tsv-B_m7g4N7.js +1 -0
- package/dist/frontend/assets/tsx-COt5Ahok.js +1 -0
- package/dist/frontend/assets/turtle-BsS91CYL.js +1 -0
- package/dist/frontend/assets/twig-xg9kU7Mw.js +1 -0
- package/dist/frontend/assets/typescript-BPQ3VLAy.js +1 -0
- package/dist/frontend/assets/typespec-CAFt9gP4.js +1 -0
- package/dist/frontend/assets/typst-DHCkPAjA.js +1 -0
- package/dist/frontend/assets/v-BcVCzyr7.js +1 -0
- package/dist/frontend/assets/vala-CsfeWuGM.js +1 -0
- package/dist/frontend/assets/vb-D17OF-Vu.js +1 -0
- package/dist/frontend/assets/verilog-BQ8w6xss.js +1 -0
- package/dist/frontend/assets/vesper-DU1UobuO.js +1 -0
- package/dist/frontend/assets/vhdl-CeAyd5Ju.js +1 -0
- package/dist/frontend/assets/viml-CJc9bBzg.js +1 -0
- package/dist/frontend/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/dist/frontend/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/dist/frontend/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/dist/frontend/assets/vue-D2xRrEX4.js +1 -0
- package/dist/frontend/assets/vue-html-AaS7Mt5G.js +1 -0
- package/dist/frontend/assets/vue-vine-BoDAl6tE.js +1 -0
- package/dist/frontend/assets/vyper-CDx5xZoG.js +1 -0
- package/dist/frontend/assets/wasm-CG6Dc4jp.js +1 -0
- package/dist/frontend/assets/wasm-MzD3tlZU.js +1 -0
- package/dist/frontend/assets/wenyan-BV7otONQ.js +1 -0
- package/dist/frontend/assets/wgsl-Dx-B1_4e.js +1 -0
- package/dist/frontend/assets/wikitext-BhOHFoWU.js +1 -0
- package/dist/frontend/assets/wit-5i3qLPDT.js +1 -0
- package/dist/frontend/assets/wolfram-lXgVvXCa.js +1 -0
- package/dist/frontend/assets/xml-sdJ4AIDG.js +1 -0
- package/dist/frontend/assets/xsl-CtQFsRM5.js +1 -0
- package/dist/frontend/assets/yaml-Buea-lGh.js +1 -0
- package/dist/frontend/assets/zenscript-DVFEvuxE.js +1 -0
- package/dist/frontend/assets/zig-VOosw3JB.js +1 -0
- package/dist/frontend/icon-192.png +0 -0
- package/dist/frontend/icon-512.png +0 -0
- package/dist/frontend/icon.svg +8 -0
- package/dist/frontend/index.html +30 -0
- package/dist/frontend/manifest.json +25 -0
- package/dist/frontend/sw.js +66 -0
- package/dist/server/agent-events.js +39 -0
- package/dist/server/analytics.js +885 -0
- package/dist/server/auth.js +65 -0
- package/dist/server/belayer/executor.js +200 -0
- package/dist/server/belayer/intake.js +27 -0
- package/dist/server/belayer/pipeline.js +97 -0
- package/dist/server/belayer/pr-lifecycle.js +69 -0
- package/dist/server/belayer/prompts.js +154 -0
- package/dist/server/belayer/types.js +23 -0
- package/dist/server/branch-linker.js +137 -0
- package/dist/server/browser-content.js +145 -0
- package/dist/server/clipboard.js +63 -0
- package/dist/server/codex-hooks-adapter.js +93 -0
- package/dist/server/config.js +325 -0
- package/dist/server/gh-routes.js +163 -0
- package/dist/server/gh.js +276 -0
- package/dist/server/git-routes.js +154 -0
- package/dist/server/git.js +694 -0
- package/dist/server/github-app.js +218 -0
- package/dist/server/github-graphql.js +178 -0
- package/dist/server/hooks.js +373 -0
- package/dist/server/index.js +1549 -0
- package/dist/server/integration-github.js +137 -0
- package/dist/server/integration-jira.js +210 -0
- package/dist/server/integration-linear.js +176 -0
- package/dist/server/logger.js +18 -0
- package/dist/server/mobile-input-pipeline.js +129 -0
- package/dist/server/opencode-relay.js +53 -0
- package/dist/server/org-dashboard.js +241 -0
- package/dist/server/output-parsers/claude-parser.js +56 -0
- package/dist/server/output-parsers/codex-parser.js +13 -0
- package/dist/server/output-parsers/index.js +14 -0
- package/dist/server/output-parsers/null-parser.js +12 -0
- package/dist/server/output-parsers/opencode-parser.js +77 -0
- package/dist/server/pty-handler.js +586 -0
- package/dist/server/push.js +84 -0
- package/dist/server/review-poller.js +237 -0
- package/dist/server/sdk-handler.js +539 -0
- package/dist/server/service.js +189 -0
- package/dist/server/sessions.js +638 -0
- package/dist/server/telemetry.js +236 -0
- package/dist/server/ticket-transitions.js +166 -0
- package/dist/server/types.js +146 -0
- package/dist/server/utils.js +23 -0
- package/dist/server/watcher.js +661 -0
- package/dist/server/webhook-manager.js +547 -0
- package/dist/server/webhooks.js +73 -0
- package/dist/server/workspace-groups.js +363 -0
- package/dist/server/workspaces.js +1207 -0
- package/dist/server/ws.js +192 -0
- package/dist/test/EmptyState.spec.js +51 -0
- package/dist/test/action-coverage.test.js +139 -0
- package/dist/test/actions/registry.test.js +59 -0
- package/dist/test/actions/shortcuts.test.js +79 -0
- package/dist/test/agent-events.test.js +151 -0
- package/dist/test/analytics.test.js +158 -0
- package/dist/test/attention.test.js +91 -0
- package/dist/test/auth.test.js +105 -0
- package/dist/test/backend-state.test.js +47 -0
- package/dist/test/belayer-executor.test.js +33 -0
- package/dist/test/belayer-intake.test.js +44 -0
- package/dist/test/belayer-pipeline.test.js +113 -0
- package/dist/test/belayer-pr-lifecycle.test.js +26 -0
- package/dist/test/belayer-prompts.test.js +60 -0
- package/dist/test/belayer-types.test.js +69 -0
- package/dist/test/bin/claude-remote-cli.js +214 -0
- package/dist/test/boot-state.test.js +133 -0
- package/dist/test/branch-lifecycle.test.js +75 -0
- package/dist/test/branch-linker.test.js +236 -0
- package/dist/test/branch-rename.test.js +45 -0
- package/dist/test/branch-watcher.test.js +115 -0
- package/dist/test/browser-cli.test.js +91 -0
- package/dist/test/browser-content.test.js +93 -0
- package/dist/test/browser-tabs-ui.test.js +39 -0
- package/dist/test/changed-files-api.test.js +140 -0
- package/dist/test/clipboard.test.js +12 -0
- package/dist/test/codex-hooks-adapter.test.js +237 -0
- package/dist/test/components/EmptyState.spec.js +51 -0
- package/dist/test/components/ErrorToast.spec.js +65 -0
- package/dist/test/components/TuiCheckbox.spec.js +120 -0
- package/dist/test/components/TuiInput.spec.js +186 -0
- package/dist/test/components/leaf-component-migration.spec.js +104 -0
- package/dist/test/config-freshness.test.js +63 -0
- package/dist/test/config.test.js +813 -0
- package/dist/test/diff-summary.test.js +98 -0
- package/dist/test/display-state.test.js +179 -0
- package/dist/test/event-message-types.test.js +32 -0
- package/dist/test/file-tree-utils.test.js +167 -0
- package/dist/test/framework-types.test.js +183 -0
- package/dist/test/frameworks-api.test.js +93 -0
- package/dist/test/frontend/src/lib/pr-state.js +114 -0
- package/dist/test/fs-browse.test.js +246 -0
- package/dist/test/fuzzy-scorer.test.js +145 -0
- package/dist/test/gh-routes.test.js +156 -0
- package/dist/test/git-changed-files.test.js +152 -0
- package/dist/test/git-routes.test.js +146 -0
- package/dist/test/git-utils.test.js +68 -0
- package/dist/test/git-watcher.test.js +110 -0
- package/dist/test/git.test.js +140 -0
- package/dist/test/github-app.test.js +455 -0
- package/dist/test/github-graphql.test.js +301 -0
- package/dist/test/greetings.test.js +83 -0
- package/dist/test/hooks-agent-event.test.js +412 -0
- package/dist/test/hooks.test.js +149 -0
- package/dist/test/integration-github.test.js +220 -0
- package/dist/test/integration-jira.test.js +238 -0
- package/dist/test/integration-linear.test.js +293 -0
- package/dist/test/mobile-input.test.js +235 -0
- package/dist/test/opencode-relay.test.js +107 -0
- package/dist/test/org-dashboard.test.js +349 -0
- package/dist/test/output-parser.test.js +217 -0
- package/dist/test/paths.test.js +32 -0
- package/dist/test/pr-state.test.js +407 -0
- package/dist/test/pr-status.test.js +82 -0
- package/dist/test/presets.test.js +242 -0
- package/dist/test/pty-handler-multi-agent.test.js +149 -0
- package/dist/test/pty-handler.test.js +146 -0
- package/dist/test/pull-requests.test.js +78 -0
- package/dist/test/review-poller.test.js +349 -0
- package/dist/test/server/analytics.js +121 -0
- package/dist/test/server/auth.js +63 -0
- package/dist/test/server/branch-linker.js +124 -0
- package/dist/test/server/clipboard.js +56 -0
- package/dist/test/server/config.js +137 -0
- package/dist/test/server/git.js +308 -0
- package/dist/test/server/hooks.js +196 -0
- package/dist/test/server/index.js +1124 -0
- package/dist/test/server/integration-github.js +117 -0
- package/dist/test/server/integration-jira.js +164 -0
- package/dist/test/server/integration-linear.js +176 -0
- package/dist/test/server/mobile-input-pipeline.js +123 -0
- package/dist/test/server/org-dashboard.js +184 -0
- package/dist/test/server/output-parsers/claude-parser.js +54 -0
- package/dist/test/server/output-parsers/codex-parser.js +13 -0
- package/dist/test/server/output-parsers/index.js +7 -0
- package/dist/test/server/pty-handler.js +310 -0
- package/dist/test/server/push.js +80 -0
- package/dist/test/server/review-poller.js +218 -0
- package/dist/test/server/service.js +169 -0
- package/dist/test/server/sessions.js +434 -0
- package/dist/test/server/ticket-transitions.js +216 -0
- package/dist/test/server/types.js +20 -0
- package/dist/test/server/utils.js +22 -0
- package/dist/test/server/watcher.js +139 -0
- package/dist/test/server/workspaces.js +657 -0
- package/dist/test/server/ws.js +152 -0
- package/dist/test/server-startup.test.js +62 -0
- package/dist/test/service.test.js +43 -0
- package/dist/test/session-analytics-api.test.js +123 -0
- package/dist/test/session-analytics.test.js +425 -0
- package/dist/test/session-intent.test.js +249 -0
- package/dist/test/sessions.test.js +1152 -0
- package/dist/test/sidebar-items.test.js +164 -0
- package/dist/test/stores/boot-state-store.test.js +165 -0
- package/dist/test/stores/sessions-logic.test.js +191 -0
- package/dist/test/stores/toasts-store.test.js +66 -0
- package/dist/test/stores/ui-store.test.js +203 -0
- package/dist/test/stores/unread-store.test.js +97 -0
- package/dist/test/telemetry-api.test.js +54 -0
- package/dist/test/telemetry-sync.test.js +68 -0
- package/dist/test/telemetry.test.js +295 -0
- package/dist/test/terminal-zoom.test.js +102 -0
- package/dist/test/test/analytics.test.js +152 -0
- package/dist/test/test/auth.test.js +95 -0
- package/dist/test/test/branch-linker.test.js +231 -0
- package/dist/test/test/branch-rename.test.js +45 -0
- package/dist/test/test/clipboard.test.js +12 -0
- package/dist/test/test/config.test.js +281 -0
- package/dist/test/test/fs-browse.test.js +202 -0
- package/dist/test/test/git.test.js +67 -0
- package/dist/test/test/hooks.test.js +139 -0
- package/dist/test/test/integration-github.test.js +203 -0
- package/dist/test/test/integration-jira.test.js +294 -0
- package/dist/test/test/integration-linear.test.js +293 -0
- package/dist/test/test/mobile-input.test.js +193 -0
- package/dist/test/test/org-dashboard.test.js +240 -0
- package/dist/test/test/output-parser.test.js +95 -0
- package/dist/test/test/paths.test.js +32 -0
- package/dist/test/test/pr-state.test.js +220 -0
- package/dist/test/test/pull-requests.test.js +67 -0
- package/dist/test/test/review-poller.test.js +235 -0
- package/dist/test/test/service.test.js +43 -0
- package/dist/test/test/sessions.test.js +750 -0
- package/dist/test/test/ticket-transitions.test.js +130 -0
- package/dist/test/test/version.test.js +34 -0
- package/dist/test/test/worktrees.test.js +256 -0
- package/dist/test/ticket-transitions.test.js +312 -0
- package/dist/test/unread.test.js +23 -0
- package/dist/test/version.test.js +34 -0
- package/dist/test/webhook-manager.test.js +484 -0
- package/dist/test/webhooks.test.js +208 -0
- package/dist/test/workspace-groups.test.js +377 -0
- package/dist/test/worktrees.test.js +531 -0
- package/package.json +88 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
// Note: Full DOM testing would require a test runner with JSX support (e.g., Vitest + React Testing Library)
|
|
4
|
+
describe('TuiInput', () => {
|
|
5
|
+
describe('Props Interface', () => {
|
|
6
|
+
it('should have optional value prop with default empty string', () => {
|
|
7
|
+
const propsWithoutValue = {};
|
|
8
|
+
assert.strictEqual(propsWithoutValue.value, undefined);
|
|
9
|
+
const propsWithValue = { value: 'test' };
|
|
10
|
+
assert.strictEqual(propsWithValue.value, 'test');
|
|
11
|
+
});
|
|
12
|
+
it('should have optional placeholder prop', () => {
|
|
13
|
+
const props = { placeholder: 'Enter text' };
|
|
14
|
+
assert.strictEqual(props.placeholder, 'Enter text');
|
|
15
|
+
});
|
|
16
|
+
it('should have type prop with text or password options', () => {
|
|
17
|
+
const textType = { type: 'text' };
|
|
18
|
+
assert.strictEqual(textType.type, 'text');
|
|
19
|
+
const passwordType = { type: 'password' };
|
|
20
|
+
assert.strictEqual(passwordType.type, 'password');
|
|
21
|
+
});
|
|
22
|
+
it('should have optional disabled prop', () => {
|
|
23
|
+
const propsWithDisabled = { disabled: true };
|
|
24
|
+
assert.strictEqual(propsWithDisabled.disabled, true);
|
|
25
|
+
const propsWithoutDisabled = {};
|
|
26
|
+
assert.strictEqual(propsWithoutDisabled.disabled, undefined);
|
|
27
|
+
});
|
|
28
|
+
it('should have optional id prop', () => {
|
|
29
|
+
const props = { id: 'my-input' };
|
|
30
|
+
assert.strictEqual(props.id, 'my-input');
|
|
31
|
+
});
|
|
32
|
+
it('should have optional onInput callback', () => {
|
|
33
|
+
let calledWith;
|
|
34
|
+
const handleInput = (e) => {
|
|
35
|
+
calledWith = e;
|
|
36
|
+
};
|
|
37
|
+
const props = { onInput: handleInput };
|
|
38
|
+
assert.strictEqual(typeof props.onInput, 'function');
|
|
39
|
+
});
|
|
40
|
+
it('should have optional onKeyDown callback', () => {
|
|
41
|
+
let calledWith;
|
|
42
|
+
const handleKeyDown = (e) => {
|
|
43
|
+
calledWith = e;
|
|
44
|
+
};
|
|
45
|
+
const props = { onKeyDown: handleKeyDown };
|
|
46
|
+
assert.strictEqual(typeof props.onKeyDown, 'function');
|
|
47
|
+
});
|
|
48
|
+
it('should have optional onChange callback', () => {
|
|
49
|
+
let calledWith;
|
|
50
|
+
const handleChange = (value) => {
|
|
51
|
+
calledWith = value;
|
|
52
|
+
};
|
|
53
|
+
const props = { onChange: handleChange };
|
|
54
|
+
assert.strictEqual(typeof props.onChange, 'function');
|
|
55
|
+
props.onChange?.('new value');
|
|
56
|
+
assert.strictEqual(calledWith, 'new value');
|
|
57
|
+
});
|
|
58
|
+
it('should have optional className prop', () => {
|
|
59
|
+
const props = { className: 'custom-class' };
|
|
60
|
+
assert.strictEqual(props.className, 'custom-class');
|
|
61
|
+
});
|
|
62
|
+
it('should have optional autoFocus prop', () => {
|
|
63
|
+
const propsWithAutoFocus = { autoFocus: true };
|
|
64
|
+
assert.strictEqual(propsWithAutoFocus.autoFocus, true);
|
|
65
|
+
const propsWithoutAutoFocus = {};
|
|
66
|
+
assert.strictEqual(propsWithoutAutoFocus.autoFocus, undefined);
|
|
67
|
+
});
|
|
68
|
+
it('should support rest props spread', () => {
|
|
69
|
+
const props = {
|
|
70
|
+
'data-testid': 'test-input',
|
|
71
|
+
'aria-label': 'Test input',
|
|
72
|
+
maxLength: 100
|
|
73
|
+
};
|
|
74
|
+
assert.strictEqual(props['data-testid'], 'test-input');
|
|
75
|
+
assert.strictEqual(props['aria-label'], 'Test input');
|
|
76
|
+
assert.strictEqual(props.maxLength, 100);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('Component Logic', () => {
|
|
80
|
+
it('should mask password input with bullet character', () => {
|
|
81
|
+
const type = 'password';
|
|
82
|
+
const value = 'secret';
|
|
83
|
+
const selStart = 3;
|
|
84
|
+
const textBeforeCursor = type === 'password'
|
|
85
|
+
? '\u2022'.repeat(selStart)
|
|
86
|
+
: value.slice(0, selStart);
|
|
87
|
+
assert.strictEqual(textBeforeCursor, '\u2022\u2022\u2022');
|
|
88
|
+
});
|
|
89
|
+
it('should not mask text input', () => {
|
|
90
|
+
const type = 'text';
|
|
91
|
+
const value = 'hello';
|
|
92
|
+
const selStart = 3;
|
|
93
|
+
const textBeforeCursor = type === 'password'
|
|
94
|
+
? '\u2022'.repeat(selStart)
|
|
95
|
+
: value.slice(0, selStart);
|
|
96
|
+
assert.strictEqual(textBeforeCursor, 'hel');
|
|
97
|
+
});
|
|
98
|
+
it('should apply idle timeout of 530ms', () => {
|
|
99
|
+
const IDLE_TIMEOUT = 530;
|
|
100
|
+
assert.strictEqual(IDLE_TIMEOUT, 530);
|
|
101
|
+
});
|
|
102
|
+
it('should show cursor when focused and not disabled', () => {
|
|
103
|
+
const isFocused = true;
|
|
104
|
+
const disabled = false;
|
|
105
|
+
const showCursor = isFocused && !disabled;
|
|
106
|
+
assert.strictEqual(showCursor, true);
|
|
107
|
+
});
|
|
108
|
+
it('should hide cursor when not focused', () => {
|
|
109
|
+
const isFocused = false;
|
|
110
|
+
const disabled = false;
|
|
111
|
+
const showCursor = isFocused && !disabled;
|
|
112
|
+
assert.strictEqual(showCursor, false);
|
|
113
|
+
});
|
|
114
|
+
it('should hide cursor when disabled', () => {
|
|
115
|
+
const isFocused = true;
|
|
116
|
+
const disabled = true;
|
|
117
|
+
const showCursor = isFocused && !disabled;
|
|
118
|
+
assert.strictEqual(showCursor, false);
|
|
119
|
+
});
|
|
120
|
+
it('should apply blinking class when idle and no reduced motion', () => {
|
|
121
|
+
const isIdle = true;
|
|
122
|
+
const prefersReducedMotion = false;
|
|
123
|
+
const shouldBlink = isIdle && !prefersReducedMotion;
|
|
124
|
+
assert.strictEqual(shouldBlink, true);
|
|
125
|
+
});
|
|
126
|
+
it('should not blink when reduced motion is preferred', () => {
|
|
127
|
+
const isIdle = true;
|
|
128
|
+
const prefersReducedMotion = true;
|
|
129
|
+
const shouldBlink = isIdle && !prefersReducedMotion;
|
|
130
|
+
assert.strictEqual(shouldBlink, false);
|
|
131
|
+
});
|
|
132
|
+
it('should not blink when not idle', () => {
|
|
133
|
+
const isIdle = false;
|
|
134
|
+
const prefersReducedMotion = false;
|
|
135
|
+
const shouldBlink = isIdle && !prefersReducedMotion;
|
|
136
|
+
assert.strictEqual(shouldBlink, false);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe('CSS Classes', () => {
|
|
140
|
+
it('should have correct base classes', () => {
|
|
141
|
+
const expectedClasses = {
|
|
142
|
+
wrapper: 'tui-input-wrapper',
|
|
143
|
+
input: 'tui-input',
|
|
144
|
+
measure: 'tui-measure',
|
|
145
|
+
cursor: 'tui-cursor',
|
|
146
|
+
blinking: 'blinking'
|
|
147
|
+
};
|
|
148
|
+
assert.strictEqual(expectedClasses.wrapper, 'tui-input-wrapper');
|
|
149
|
+
assert.strictEqual(expectedClasses.input, 'tui-input');
|
|
150
|
+
assert.strictEqual(expectedClasses.measure, 'tui-measure');
|
|
151
|
+
assert.strictEqual(expectedClasses.cursor, 'tui-cursor');
|
|
152
|
+
assert.strictEqual(expectedClasses.blinking, 'blinking');
|
|
153
|
+
});
|
|
154
|
+
it('should combine custom className with base wrapper class', () => {
|
|
155
|
+
const className = 'custom-class';
|
|
156
|
+
const classes = ['tui-input-wrapper', className].filter(Boolean).join(' ');
|
|
157
|
+
assert.strictEqual(classes, 'tui-input-wrapper custom-class');
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe('Cursor Position Calculation', () => {
|
|
161
|
+
it('should use block cursor character', () => {
|
|
162
|
+
const blockCursor = '\u2588';
|
|
163
|
+
assert.strictEqual(blockCursor, '\u2588');
|
|
164
|
+
});
|
|
165
|
+
it('should default cursor height to 16 when input height is 0', () => {
|
|
166
|
+
const inputHeight = 0;
|
|
167
|
+
const cursorHeight = inputHeight || 16;
|
|
168
|
+
assert.strictEqual(cursorHeight, 16);
|
|
169
|
+
});
|
|
170
|
+
it('should use input height when available', () => {
|
|
171
|
+
const inputHeight = 24;
|
|
172
|
+
const cursorHeight = inputHeight || 16;
|
|
173
|
+
assert.strictEqual(cursorHeight, 24);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe('Accessibility', () => {
|
|
177
|
+
it('should mark measure span as aria-hidden', () => {
|
|
178
|
+
const ariaHidden = true;
|
|
179
|
+
assert.strictEqual(ariaHidden, true);
|
|
180
|
+
});
|
|
181
|
+
it('should mark cursor span as aria-hidden', () => {
|
|
182
|
+
const ariaHidden = true;
|
|
183
|
+
assert.strictEqual(ariaHidden, true);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
});
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = dirname(__filename);
|
|
8
|
+
const projectRoot = join(__dirname, '../..');
|
|
9
|
+
const expectedComponents = [
|
|
10
|
+
{
|
|
11
|
+
name: 'AgentBadge',
|
|
12
|
+
componentPath: 'frontend/src/components/AgentBadge.tsx',
|
|
13
|
+
cssPath: 'frontend/src/components/AgentBadge.css',
|
|
14
|
+
expectedExports: ['export interface AgentBadgeProps', 'export function AgentBadge'],
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'DiffFileSidebar',
|
|
18
|
+
componentPath: 'frontend/src/components/DiffFileSidebar.tsx',
|
|
19
|
+
cssPath: 'frontend/src/components/DiffFileSidebar.css',
|
|
20
|
+
expectedExports: ['export interface DiffFileSidebarProps', 'export const DiffFileSidebar'],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'DiffSourceToggle',
|
|
24
|
+
componentPath: 'frontend/src/components/DiffSourceToggle.tsx',
|
|
25
|
+
cssPath: 'frontend/src/components/DiffSourceToggle.css',
|
|
26
|
+
expectedExports: ['export interface DiffSourceToggleProps', 'export function DiffSourceToggle'],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'FilterChipBar',
|
|
30
|
+
componentPath: 'frontend/src/components/FilterChipBar.tsx',
|
|
31
|
+
cssPath: 'frontend/src/components/FilterChipBar.css',
|
|
32
|
+
expectedExports: ['export interface FilterChip', 'export function FilterChipBar'],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'MobileHeader',
|
|
36
|
+
componentPath: 'frontend/src/components/MobileHeader.tsx',
|
|
37
|
+
cssPath: 'frontend/src/components/MobileHeader.css',
|
|
38
|
+
expectedExports: ['export interface MobileHeaderProps', 'export function MobileHeader'],
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'TuiMenuItem',
|
|
42
|
+
componentPath: 'frontend/src/components/TuiMenuItem.tsx',
|
|
43
|
+
cssPath: 'frontend/src/components/TuiMenuItem.css',
|
|
44
|
+
expectedExports: ['export interface TuiMenuItemProps', 'export function TuiMenuItem'],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'TuiMenuPanel',
|
|
48
|
+
componentPath: 'frontend/src/components/TuiMenuPanel.tsx',
|
|
49
|
+
cssPath: 'frontend/src/components/TuiMenuPanel.css',
|
|
50
|
+
expectedExports: ['export interface TuiMenuPanelProps', 'export function TuiMenuPanel'],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'TuiProgress',
|
|
54
|
+
componentPath: 'frontend/src/components/TuiProgress.tsx',
|
|
55
|
+
cssPath: 'frontend/src/components/TuiProgress.css',
|
|
56
|
+
expectedExports: ['export interface TuiProgressProps', 'export function TuiProgress'],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'TuiRow',
|
|
60
|
+
componentPath: 'frontend/src/components/TuiRow.tsx',
|
|
61
|
+
cssPath: 'frontend/src/components/TuiRow.css',
|
|
62
|
+
expectedExports: ['export interface TuiRowProps', 'export function TuiRow'],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'DialogShell',
|
|
66
|
+
componentPath: 'frontend/src/components/dialogs/DialogShell.tsx',
|
|
67
|
+
cssPath: 'frontend/src/components/dialogs/DialogShell.css',
|
|
68
|
+
expectedExports: ['export interface DialogShellHandle', 'export const DialogShell'],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'SettingRow',
|
|
72
|
+
componentPath: 'frontend/src/components/dialogs/SettingRow.tsx',
|
|
73
|
+
cssPath: 'frontend/src/components/dialogs/SettingRow.css',
|
|
74
|
+
expectedExports: ['export interface SettingRowProps', 'export function SettingRow'],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'SettingsToc',
|
|
78
|
+
componentPath: 'frontend/src/components/dialogs/SettingsToc.tsx',
|
|
79
|
+
cssPath: 'frontend/src/components/dialogs/SettingsToc.css',
|
|
80
|
+
expectedExports: ['export interface SettingsTocSection', 'export function SettingsToc'],
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
describe('leaf component migration', () => {
|
|
84
|
+
for (const component of expectedComponents) {
|
|
85
|
+
it(`${component.name} TSX and CSS files exist`, () => {
|
|
86
|
+
assert.ok(existsSync(join(projectRoot, component.componentPath)), `${component.componentPath} should exist`);
|
|
87
|
+
assert.ok(existsSync(join(projectRoot, component.cssPath)), `${component.cssPath} should exist`);
|
|
88
|
+
});
|
|
89
|
+
it(`${component.name} exports the expected component API`, () => {
|
|
90
|
+
const source = readFileSync(join(projectRoot, component.componentPath), 'utf8');
|
|
91
|
+
for (const expectedExport of component.expectedExports) {
|
|
92
|
+
assert.ok(source.includes(expectedExport), `${component.name} should include "${expectedExport}"`);
|
|
93
|
+
}
|
|
94
|
+
assert.ok(source.includes('export default'), `${component.name} should have a default export`);
|
|
95
|
+
});
|
|
96
|
+
it(`${component.name} imports its CSS file`, () => {
|
|
97
|
+
const source = readFileSync(join(projectRoot, component.componentPath), 'utf8');
|
|
98
|
+
const cssFileName = component.cssPath.split('/').pop();
|
|
99
|
+
assert.ok(source.includes(`import './${cssFileName}'`) ||
|
|
100
|
+
source.includes(`import '../${cssFileName}'`) ||
|
|
101
|
+
source.includes(`import '../../${cssFileName}'`), `${component.name} should import ${cssFileName}`);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { loadConfig, saveConfig, DEFAULTS } from '../server/config.js';
|
|
7
|
+
describe('config freshness', () => {
|
|
8
|
+
let tmpDir;
|
|
9
|
+
let configPath;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'crc-config-test-'));
|
|
12
|
+
configPath = path.join(tmpDir, 'config.json');
|
|
13
|
+
const initial = { ...DEFAULTS, configVersion: 4 };
|
|
14
|
+
initial.repos = ['/existing/workspace'];
|
|
15
|
+
fs.writeFileSync(configPath, JSON.stringify(initial, null, 2));
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
19
|
+
});
|
|
20
|
+
it('loadConfig sees repos added to disk after initial load', () => {
|
|
21
|
+
// Simulate: server starts, loads config
|
|
22
|
+
const initial = loadConfig(configPath);
|
|
23
|
+
assert.deepEqual(initial.repos, ['/existing/workspace']);
|
|
24
|
+
// Simulate: workspace router adds a repo and saves to disk
|
|
25
|
+
const updated = loadConfig(configPath);
|
|
26
|
+
updated.repos = [...(updated.repos ?? []), '/new/workspace'];
|
|
27
|
+
saveConfig(configPath, updated);
|
|
28
|
+
// Simulate: session handler reads config (fresh)
|
|
29
|
+
const fresh = loadConfig(configPath);
|
|
30
|
+
assert.ok(fresh.repos.includes('/new/workspace'), 'Fresh loadConfig should see repo added after initial load');
|
|
31
|
+
assert.ok(fresh.repos.includes('/existing/workspace'), 'Fresh loadConfig should still see original repo');
|
|
32
|
+
});
|
|
33
|
+
it('loadConfig sees repos removed from disk after initial load', () => {
|
|
34
|
+
const initial = loadConfig(configPath);
|
|
35
|
+
assert.deepEqual(initial.repos, ['/existing/workspace']);
|
|
36
|
+
// Simulate: workspace router removes the repo
|
|
37
|
+
const updated = loadConfig(configPath);
|
|
38
|
+
updated.repos = [];
|
|
39
|
+
saveConfig(configPath, updated);
|
|
40
|
+
// Fresh read should see empty list
|
|
41
|
+
const fresh = loadConfig(configPath);
|
|
42
|
+
assert.deepEqual(fresh.repos, []);
|
|
43
|
+
});
|
|
44
|
+
it('loadConfig sees workspace settings changes', () => {
|
|
45
|
+
// Add repo settings to disk
|
|
46
|
+
const config = loadConfig(configPath);
|
|
47
|
+
config.repoSettings = { '/existing/workspace': { defaultAgent: 'codex' } };
|
|
48
|
+
saveConfig(configPath, config);
|
|
49
|
+
// Fresh read should see settings
|
|
50
|
+
const fresh = loadConfig(configPath);
|
|
51
|
+
assert.equal(fresh.repoSettings?.['/existing/workspace']?.defaultAgent, 'codex');
|
|
52
|
+
});
|
|
53
|
+
it('loadConfig throws when config file is missing', () => {
|
|
54
|
+
fs.unlinkSync(configPath);
|
|
55
|
+
assert.throws(() => loadConfig(configPath), {
|
|
56
|
+
message: /Config file not found/,
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
it('loadConfig throws on corrupted JSON', () => {
|
|
60
|
+
fs.writeFileSync(configPath, '{bad json');
|
|
61
|
+
assert.throws(() => loadConfig(configPath));
|
|
62
|
+
});
|
|
63
|
+
});
|