code-squad-cli 1.1.2 → 1.2.2
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/dist/config.d.ts +35 -0
- package/dist/config.js +46 -0
- package/dist/fileUtils.d.ts +7 -0
- package/dist/fileUtils.js +50 -0
- package/dist/flip/routes/git.d.ts +17 -0
- package/dist/flip/routes/git.js +148 -0
- package/dist/flip-ui/dist/assets/abap-BdImnpbu.js +1 -0
- package/dist/flip-ui/dist/assets/actionscript-3-CfeIJUat.js +1 -0
- package/dist/flip-ui/dist/assets/ada-bCR0ucgS.js +1 -0
- package/dist/flip-ui/dist/assets/andromeeda-C-Jbm3Hp.js +1 -0
- package/dist/flip-ui/dist/assets/angular-html-CU67Zn6k.js +1 -0
- package/dist/flip-ui/dist/assets/angular-ts-BwZT4LLn.js +1 -0
- package/dist/flip-ui/dist/assets/apache-Pmp26Uib.js +1 -0
- package/dist/flip-ui/dist/assets/apex-D8_7TLub.js +1 -0
- package/dist/flip-ui/dist/assets/apl-dKokRX4l.js +1 -0
- package/dist/flip-ui/dist/assets/applescript-Co6uUVPk.js +1 -0
- package/dist/flip-ui/dist/assets/ara-BRHolxvo.js +1 -0
- package/dist/flip-ui/dist/assets/asciidoc-Dv7Oe6Be.js +1 -0
- package/dist/flip-ui/dist/assets/asm-D_Q5rh1f.js +1 -0
- package/dist/flip-ui/dist/assets/astro-CbQHKStN.js +1 -0
- package/dist/flip-ui/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/dist/flip-ui/dist/assets/awk-DMzUqQB5.js +1 -0
- package/dist/flip-ui/dist/assets/ayu-dark-CmMr59Fi.js +1 -0
- package/dist/flip-ui/dist/assets/ballerina-BFfxhgS-.js +1 -0
- package/dist/flip-ui/dist/assets/bat-BkioyH1T.js +1 -0
- package/dist/flip-ui/dist/assets/beancount-k_qm7-4y.js +1 -0
- package/dist/flip-ui/dist/assets/berry-uYugtg8r.js +1 -0
- package/dist/flip-ui/dist/assets/bibtex-CHM0blh-.js +1 -0
- package/dist/flip-ui/dist/assets/bicep-Bmn6On1c.js +1 -0
- package/dist/flip-ui/dist/assets/blade-D4QpJJKB.js +1 -0
- package/dist/flip-ui/dist/assets/bsl-BO_Y6i37.js +1 -0
- package/dist/flip-ui/dist/assets/c-BIGW1oBm.js +1 -0
- package/dist/flip-ui/dist/assets/c3-VCDPK7BO.js +1 -0
- package/dist/flip-ui/dist/assets/cadence-Bv_4Rxtq.js +1 -0
- package/dist/flip-ui/dist/assets/cairo-KRGpt6FW.js +1 -0
- package/dist/flip-ui/dist/assets/catppuccin-frappe-DFWUc33u.js +1 -0
- package/dist/flip-ui/dist/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
- package/dist/flip-ui/dist/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
- package/dist/flip-ui/dist/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
- package/dist/flip-ui/dist/assets/clarity-D53aC0YG.js +1 -0
- package/dist/flip-ui/dist/assets/clojure-P80f7IUj.js +1 -0
- package/dist/flip-ui/dist/assets/cmake-D1j8_8rp.js +1 -0
- package/dist/flip-ui/dist/assets/cobol-nwyudZeR.js +1 -0
- package/dist/flip-ui/dist/assets/codeowners-Bp6g37R7.js +1 -0
- package/dist/flip-ui/dist/assets/codeql-DsOJ9woJ.js +1 -0
- package/dist/flip-ui/dist/assets/coffee-Ch7k5sss.js +1 -0
- package/dist/flip-ui/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
- package/dist/flip-ui/dist/assets/coq-DkFqJrB1.js +1 -0
- package/dist/flip-ui/dist/assets/cpp-CofmeUqb.js +1 -0
- package/dist/flip-ui/dist/assets/crystal-tKQVLTB8.js +1 -0
- package/dist/flip-ui/dist/assets/csharp-K5feNrxe.js +1 -0
- package/dist/flip-ui/dist/assets/css-DPfMkruS.js +1 -0
- package/dist/flip-ui/dist/assets/csv-fuZLfV_i.js +1 -0
- package/dist/flip-ui/dist/assets/cue-D82EKSYY.js +1 -0
- package/dist/flip-ui/dist/assets/cypher-COkxafJQ.js +1 -0
- package/dist/flip-ui/dist/assets/d-85-TOEBH.js +1 -0
- package/dist/flip-ui/dist/assets/dark-plus-C3mMm8J8.js +1 -0
- package/dist/flip-ui/dist/assets/dart-CF10PKvl.js +1 -0
- package/dist/flip-ui/dist/assets/dax-CEL-wOlO.js +1 -0
- package/dist/flip-ui/dist/assets/desktop-BmXAJ9_W.js +1 -0
- package/dist/flip-ui/dist/assets/diff-D97Zzqfu.js +1 -0
- package/dist/flip-ui/dist/assets/docker-BcOcwvcX.js +1 -0
- package/dist/flip-ui/dist/assets/dotenv-Da5cRb03.js +1 -0
- package/dist/flip-ui/dist/assets/dracula-BzJJZx-M.js +1 -0
- package/dist/flip-ui/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/dist/flip-ui/dist/assets/dream-maker-BtqSS_iP.js +1 -0
- package/dist/flip-ui/dist/assets/edge-BkV0erSs.js +1 -0
- package/dist/flip-ui/dist/assets/elixir-CDX3lj18.js +1 -0
- package/dist/flip-ui/dist/assets/elm-DbKCFpqz.js +1 -0
- package/dist/flip-ui/dist/assets/emacs-lisp-C9XAeP06.js +1 -0
- package/dist/flip-ui/dist/assets/erb-BOJIQeun.js +1 -0
- package/dist/flip-ui/dist/assets/erlang-DsQrWhSR.js +1 -0
- package/dist/flip-ui/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/dist/flip-ui/dist/assets/everforest-light-C8M2exoo.js +1 -0
- package/dist/flip-ui/dist/assets/fennel-BYunw83y.js +1 -0
- package/dist/flip-ui/dist/assets/fish-BvzEVeQv.js +1 -0
- package/dist/flip-ui/dist/assets/fluent-C4IJs8-o.js +1 -0
- package/dist/flip-ui/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
- package/dist/flip-ui/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
- package/dist/flip-ui/dist/assets/fsharp-CXgrBDvD.js +1 -0
- package/dist/flip-ui/dist/assets/gdresource-B7Tvp0Sc.js +1 -0
- package/dist/flip-ui/dist/assets/gdscript-DTMYz4Jt.js +1 -0
- package/dist/flip-ui/dist/assets/gdshader-DkwncUOv.js +1 -0
- package/dist/flip-ui/dist/assets/genie-D0YGMca9.js +1 -0
- package/dist/flip-ui/dist/assets/gherkin-DyxjwDmM.js +1 -0
- package/dist/flip-ui/dist/assets/git-commit-F4YmCXRG.js +1 -0
- package/dist/flip-ui/dist/assets/git-rebase-r7XF79zn.js +1 -0
- package/dist/flip-ui/dist/assets/github-dark-DHJKELXO.js +1 -0
- package/dist/flip-ui/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/dist/flip-ui/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/dist/flip-ui/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/dist/flip-ui/dist/assets/github-light-DAi9KRSo.js +1 -0
- package/dist/flip-ui/dist/assets/github-light-default-D7oLnXFd.js +1 -0
- package/dist/flip-ui/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/dist/flip-ui/dist/assets/gleam-BspZqrRM.js +1 -0
- package/dist/flip-ui/dist/assets/glimmer-js-Rg0-pVw9.js +1 -0
- package/dist/flip-ui/dist/assets/glimmer-ts-U6CK756n.js +1 -0
- package/dist/flip-ui/dist/assets/glsl-DplSGwfg.js +1 -0
- package/dist/flip-ui/dist/assets/gn-n2N0HUVH.js +1 -0
- package/dist/flip-ui/dist/assets/gnuplot-DdkO51Og.js +1 -0
- package/dist/flip-ui/dist/assets/go-Dn2_MT6a.js +1 -0
- package/dist/flip-ui/dist/assets/graphql-ChdNCCLP.js +1 -0
- package/dist/flip-ui/dist/assets/groovy-gcz8RCvz.js +1 -0
- package/dist/flip-ui/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- package/dist/flip-ui/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- package/dist/flip-ui/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- package/dist/flip-ui/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- package/dist/flip-ui/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- package/dist/flip-ui/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- package/dist/flip-ui/dist/assets/hack-CaT9iCJl.js +1 -0
- package/dist/flip-ui/dist/assets/haml-B8DHNrY2.js +1 -0
- package/dist/flip-ui/dist/assets/handlebars-BL8al0AC.js +1 -0
- package/dist/flip-ui/dist/assets/haskell-Df6bDoY_.js +1 -0
- package/dist/flip-ui/dist/assets/haxe-CzTSHFRz.js +1 -0
- package/dist/flip-ui/dist/assets/hcl-BWvSN4gD.js +1 -0
- package/dist/flip-ui/dist/assets/hjson-D5-asLiD.js +1 -0
- package/dist/flip-ui/dist/assets/hlsl-D3lLCCz7.js +1 -0
- package/dist/flip-ui/dist/assets/houston-DnULxvSX.js +1 -0
- package/dist/flip-ui/dist/assets/html-GMplVEZG.js +1 -0
- package/dist/flip-ui/dist/assets/html-derivative-BFtXZ54Q.js +1 -0
- package/dist/flip-ui/dist/assets/http-jrhK8wxY.js +1 -0
- package/dist/flip-ui/dist/assets/hurl-irOxFIW8.js +1 -0
- package/dist/flip-ui/dist/assets/hxml-Bvhsp5Yf.js +1 -0
- package/dist/flip-ui/dist/assets/hy-DFXneXwc.js +1 -0
- package/dist/flip-ui/dist/assets/imba-DGztddWO.js +1 -0
- package/dist/flip-ui/dist/assets/index-BqoCRrTA.css +1 -0
- package/dist/flip-ui/dist/assets/index-CgNq-jV5.js +69 -0
- package/dist/flip-ui/dist/assets/ini-BEwlwnbL.js +1 -0
- package/dist/flip-ui/dist/assets/java-CylS5w8V.js +1 -0
- package/dist/flip-ui/dist/assets/javascript-wDzz0qaB.js +1 -0
- package/dist/flip-ui/dist/assets/jinja-4LBKfQ-Z.js +1 -0
- package/dist/flip-ui/dist/assets/jison-wvAkD_A8.js +1 -0
- package/dist/flip-ui/dist/assets/json-Cp-IABpG.js +1 -0
- package/dist/flip-ui/dist/assets/json5-C9tS-k6U.js +1 -0
- package/dist/flip-ui/dist/assets/jsonc-Des-eS-w.js +1 -0
- package/dist/flip-ui/dist/assets/jsonl-DcaNXYhu.js +1 -0
- package/dist/flip-ui/dist/assets/jsonnet-DFQXde-d.js +1 -0
- package/dist/flip-ui/dist/assets/jssm-C2t-YnRu.js +1 -0
- package/dist/flip-ui/dist/assets/jsx-g9-lgVsj.js +1 -0
- package/dist/flip-ui/dist/assets/julia-CxzCAyBv.js +1 -0
- package/dist/flip-ui/dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- package/dist/flip-ui/dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- package/dist/flip-ui/dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
- package/dist/flip-ui/dist/assets/kdl-DV7GczEv.js +1 -0
- package/dist/flip-ui/dist/assets/kotlin-BdnUsdx6.js +1 -0
- package/dist/flip-ui/dist/assets/kusto-DZf3V79B.js +1 -0
- package/dist/flip-ui/dist/assets/laserwave-DUszq2jm.js +1 -0
- package/dist/flip-ui/dist/assets/latex-B4uzh10-.js +1 -0
- package/dist/flip-ui/dist/assets/lean-BZvkOJ9d.js +1 -0
- package/dist/flip-ui/dist/assets/less-B1dDrJ26.js +1 -0
- package/dist/flip-ui/dist/assets/light-plus-B7mTdjB0.js +1 -0
- package/dist/flip-ui/dist/assets/liquid-DYVedYrR.js +1 -0
- package/dist/flip-ui/dist/assets/llvm-BtvRca6l.js +1 -0
- package/dist/flip-ui/dist/assets/log-2UxHyX5q.js +1 -0
- package/dist/flip-ui/dist/assets/logo-BtOb2qkB.js +1 -0
- package/dist/flip-ui/dist/assets/lua-BbnMAYS6.js +1 -0
- package/dist/flip-ui/dist/assets/luau-C-HG3fhB.js +1 -0
- package/dist/flip-ui/dist/assets/make-CHLpvVh8.js +1 -0
- package/dist/flip-ui/dist/assets/markdown-Cvjx9yec.js +1 -0
- package/dist/flip-ui/dist/assets/marko-DZsq8hO1.js +1 -0
- package/dist/flip-ui/dist/assets/material-theme-D5KoaKCx.js +1 -0
- package/dist/flip-ui/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/dist/flip-ui/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/dist/flip-ui/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/dist/flip-ui/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/dist/flip-ui/dist/assets/matlab-D7o27uSR.js +1 -0
- package/dist/flip-ui/dist/assets/mdc-DUICxH0z.js +1 -0
- package/dist/flip-ui/dist/assets/mdx-Cmh6b_Ma.js +1 -0
- package/dist/flip-ui/dist/assets/mermaid-mWjccvbQ.js +1 -0
- package/dist/flip-ui/dist/assets/min-dark-CafNBF8u.js +1 -0
- package/dist/flip-ui/dist/assets/min-light-CTRr51gU.js +1 -0
- package/dist/flip-ui/dist/assets/mipsasm-CKIfxQSi.js +1 -0
- package/dist/flip-ui/dist/assets/mojo-B93PlW-d.js +1 -0
- package/dist/flip-ui/dist/assets/monokai-D4h5O-jR.js +1 -0
- package/dist/flip-ui/dist/assets/moonbit-Ba13S78F.js +1 -0
- package/dist/flip-ui/dist/assets/move-Bu9oaDYs.js +1 -0
- package/dist/flip-ui/dist/assets/narrat-DRg8JJMk.js +1 -0
- package/dist/flip-ui/dist/assets/nextflow-BrzmwbiE.js +1 -0
- package/dist/flip-ui/dist/assets/nginx-DknmC5AR.js +1 -0
- package/dist/flip-ui/dist/assets/night-owl-C39BiMTA.js +1 -0
- package/dist/flip-ui/dist/assets/nim-CVrawwO9.js +1 -0
- package/dist/flip-ui/dist/assets/nix-CwoSXNpI.js +1 -0
- package/dist/flip-ui/dist/assets/nord-Ddv68eIx.js +1 -0
- package/dist/flip-ui/dist/assets/nushell-C-sUppwS.js +1 -0
- package/dist/flip-ui/dist/assets/objective-c-DXmwc3jG.js +1 -0
- package/dist/flip-ui/dist/assets/objective-cpp-CLxacb5B.js +1 -0
- package/dist/flip-ui/dist/assets/ocaml-C0hk2d4L.js +1 -0
- package/dist/flip-ui/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/dist/flip-ui/dist/assets/one-light-PoHY5YXO.js +1 -0
- package/dist/flip-ui/dist/assets/openscad-C4EeE6gA.js +1 -0
- package/dist/flip-ui/dist/assets/pascal-D93ZcfNL.js +1 -0
- package/dist/flip-ui/dist/assets/perl-C0TMdlhV.js +1 -0
- package/dist/flip-ui/dist/assets/php-CDn_0X-4.js +1 -0
- package/dist/flip-ui/dist/assets/pkl-u5AG7uiY.js +1 -0
- package/dist/flip-ui/dist/assets/plastic-3e1v2bzS.js +1 -0
- package/dist/flip-ui/dist/assets/plsql-ChMvpjG-.js +1 -0
- package/dist/flip-ui/dist/assets/po-BTJTHyun.js +1 -0
- package/dist/flip-ui/dist/assets/poimandres-CS3Unz2-.js +1 -0
- package/dist/flip-ui/dist/assets/polar-C0HS_06l.js +1 -0
- package/dist/flip-ui/dist/assets/postcss-CXtECtnM.js +1 -0
- package/dist/flip-ui/dist/assets/powerquery-CEu0bR-o.js +1 -0
- package/dist/flip-ui/dist/assets/powershell-Dpen1YoG.js +1 -0
- package/dist/flip-ui/dist/assets/prisma-Dd19v3D-.js +1 -0
- package/dist/flip-ui/dist/assets/prolog-CbFg5uaA.js +1 -0
- package/dist/flip-ui/dist/assets/proto-C7zT0LnQ.js +1 -0
- package/dist/flip-ui/dist/assets/pug-CGlum2m_.js +1 -0
- package/dist/flip-ui/dist/assets/puppet-BMWR74SV.js +1 -0
- package/dist/flip-ui/dist/assets/purescript-CklMAg4u.js +1 -0
- package/dist/flip-ui/dist/assets/python-B6aJPvgy.js +1 -0
- package/dist/flip-ui/dist/assets/qml-3beO22l8.js +1 -0
- package/dist/flip-ui/dist/assets/qmldir-C8lEn-DE.js +1 -0
- package/dist/flip-ui/dist/assets/qss-IeuSbFQv.js +1 -0
- package/dist/flip-ui/dist/assets/r-Dspwwk_N.js +1 -0
- package/dist/flip-ui/dist/assets/racket-BqYA7rlc.js +1 -0
- package/dist/flip-ui/dist/assets/raku-DXvB9xmW.js +1 -0
- package/dist/flip-ui/dist/assets/razor-C1TweQQi.js +1 -0
- package/dist/flip-ui/dist/assets/red-bN70gL4F.js +1 -0
- package/dist/flip-ui/dist/assets/reg-C-SQnVFl.js +1 -0
- package/dist/flip-ui/dist/assets/regexp-CDVJQ6XC.js +1 -0
- package/dist/flip-ui/dist/assets/rel-C3B-1QV4.js +1 -0
- package/dist/flip-ui/dist/assets/riscv-BM1_JUlF.js +1 -0
- package/dist/flip-ui/dist/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
- package/dist/flip-ui/dist/assets/rose-pine-moon-D4_iv3hh.js +1 -0
- package/dist/flip-ui/dist/assets/rose-pine-qdsjHGoJ.js +1 -0
- package/dist/flip-ui/dist/assets/rosmsg-BJDFO7_C.js +1 -0
- package/dist/flip-ui/dist/assets/rst-B0xPkSld.js +1 -0
- package/dist/flip-ui/dist/assets/ruby-BvKwtOVI.js +1 -0
- package/dist/flip-ui/dist/assets/rust-B1yitclQ.js +1 -0
- package/dist/flip-ui/dist/assets/sas-cz2c8ADy.js +1 -0
- package/dist/flip-ui/dist/assets/sass-Cj5Yp3dK.js +1 -0
- package/dist/flip-ui/dist/assets/scala-C151Ov-r.js +1 -0
- package/dist/flip-ui/dist/assets/scheme-C98Dy4si.js +1 -0
- package/dist/flip-ui/dist/assets/scss-OYdSNvt2.js +1 -0
- package/dist/flip-ui/dist/assets/sdbl-DVxCFoDh.js +1 -0
- package/dist/flip-ui/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
- package/dist/flip-ui/dist/assets/shellscript-Yzrsuije.js +1 -0
- package/dist/flip-ui/dist/assets/shellsession-BADoaaVG.js +1 -0
- package/dist/flip-ui/dist/assets/slack-dark-BthQWCQV.js +1 -0
- package/dist/flip-ui/dist/assets/slack-ochin-DqwNpetd.js +1 -0
- package/dist/flip-ui/dist/assets/smalltalk-BERRCDM3.js +1 -0
- package/dist/flip-ui/dist/assets/snazzy-light-Bw305WKR.js +1 -0
- package/dist/flip-ui/dist/assets/solarized-dark-DXbdFlpD.js +1 -0
- package/dist/flip-ui/dist/assets/solarized-light-L9t79GZl.js +1 -0
- package/dist/flip-ui/dist/assets/solidity-rGO070M0.js +1 -0
- package/dist/flip-ui/dist/assets/soy-Brmx7dQM.js +1 -0
- package/dist/flip-ui/dist/assets/sparql-rVzFXLq3.js +1 -0
- package/dist/flip-ui/dist/assets/splunk-BtCnVYZw.js +1 -0
- package/dist/flip-ui/dist/assets/sql-BLtJtn59.js +1 -0
- package/dist/flip-ui/dist/assets/ssh-config-_ykCGR6B.js +1 -0
- package/dist/flip-ui/dist/assets/stata-BH5u7GGu.js +1 -0
- package/dist/flip-ui/dist/assets/stylus-BEDo0Tqx.js +1 -0
- package/dist/flip-ui/dist/assets/svelte-zxCyuUbr.js +1 -0
- package/dist/flip-ui/dist/assets/swift-Dg5xB15N.js +1 -0
- package/dist/flip-ui/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/dist/flip-ui/dist/assets/system-verilog-CnnmHF94.js +1 -0
- package/dist/flip-ui/dist/assets/systemd-4A_iFExJ.js +1 -0
- package/dist/flip-ui/dist/assets/talonscript-CkByrt1z.js +1 -0
- package/dist/flip-ui/dist/assets/tasl-QIJgUcNo.js +1 -0
- package/dist/flip-ui/dist/assets/tcl-dwOrl1Do.js +1 -0
- package/dist/flip-ui/dist/assets/templ-W15q3VgB.js +1 -0
- package/dist/flip-ui/dist/assets/terraform-BETggiCN.js +1 -0
- package/dist/flip-ui/dist/assets/tex-CvyZ59Mk.js +1 -0
- package/dist/flip-ui/dist/assets/tokyo-night-hegEt444.js +1 -0
- package/dist/flip-ui/dist/assets/toml-vGWfd6FD.js +1 -0
- package/dist/flip-ui/dist/assets/ts-tags-zn1MmPIZ.js +1 -0
- package/dist/flip-ui/dist/assets/tsv-B_m7g4N7.js +1 -0
- package/dist/flip-ui/dist/assets/tsx-COt5Ahok.js +1 -0
- package/dist/flip-ui/dist/assets/turtle-BsS91CYL.js +1 -0
- package/dist/flip-ui/dist/assets/twig-CO9l9SDP.js +1 -0
- package/dist/flip-ui/dist/assets/typescript-BPQ3VLAy.js +1 -0
- package/dist/flip-ui/dist/assets/typespec-BGHnOYBU.js +1 -0
- package/dist/flip-ui/dist/assets/typst-DHCkPAjA.js +1 -0
- package/dist/flip-ui/dist/assets/v-BcVCzyr7.js +1 -0
- package/dist/flip-ui/dist/assets/vala-CsfeWuGM.js +1 -0
- package/dist/flip-ui/dist/assets/vb-D17OF-Vu.js +1 -0
- package/dist/flip-ui/dist/assets/verilog-BQ8w6xss.js +1 -0
- package/dist/flip-ui/dist/assets/vesper-DU1UobuO.js +1 -0
- package/dist/flip-ui/dist/assets/vhdl-CeAyd5Ju.js +1 -0
- package/dist/flip-ui/dist/assets/viml-CJc9bBzg.js +1 -0
- package/dist/flip-ui/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/dist/flip-ui/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/dist/flip-ui/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/dist/flip-ui/dist/assets/vue-DN_0RTcg.js +1 -0
- package/dist/flip-ui/dist/assets/vue-html-AaS7Mt5G.js +1 -0
- package/dist/flip-ui/dist/assets/vue-vine-CQOfvN7w.js +1 -0
- package/dist/flip-ui/dist/assets/vyper-CDx5xZoG.js +1 -0
- package/dist/flip-ui/dist/assets/wasm-CG6Dc4jp.js +1 -0
- package/dist/flip-ui/dist/assets/wasm-MzD3tlZU.js +1 -0
- package/dist/flip-ui/dist/assets/wenyan-BV7otONQ.js +1 -0
- package/dist/flip-ui/dist/assets/wgsl-Dx-B1_4e.js +1 -0
- package/dist/flip-ui/dist/assets/wikitext-BhOHFoWU.js +1 -0
- package/dist/flip-ui/dist/assets/wit-5i3qLPDT.js +1 -0
- package/dist/flip-ui/dist/assets/wolfram-lXgVvXCa.js +1 -0
- package/dist/flip-ui/dist/assets/xml-sdJ4AIDG.js +1 -0
- package/dist/flip-ui/dist/assets/xsl-CtQFsRM5.js +1 -0
- package/dist/flip-ui/dist/assets/yaml-Buea-lGh.js +1 -0
- package/dist/flip-ui/dist/assets/zenscript-DVFEvuxE.js +1 -0
- package/dist/flip-ui/dist/assets/zig-VOosw3JB.js +1 -0
- package/dist/flip-ui/dist/index.html +2 -2
- package/dist/index.js +315 -82
- package/dist/ui/prompts.js +7 -8
- package/package.json +3 -2
- package/dist/flip-ui/dist/assets/index-2_ZJL2eQ.css +0 -10
- package/dist/flip-ui/dist/assets/index-BGxWXtBJ.js +0 -66
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// dist/index.js
|
|
4
|
-
import * as
|
|
5
|
-
import * as
|
|
6
|
-
import * as
|
|
4
|
+
import * as path10 from "path";
|
|
5
|
+
import * as fs10 from "fs";
|
|
6
|
+
import * as os4 from "os";
|
|
7
7
|
import * as crypto from "crypto";
|
|
8
8
|
import chalk2 from "chalk";
|
|
9
9
|
|
|
@@ -12,28 +12,28 @@ import { exec } from "child_process";
|
|
|
12
12
|
import * as fs from "fs";
|
|
13
13
|
var GitAdapter = class {
|
|
14
14
|
async isGitRepository(workspaceRoot) {
|
|
15
|
-
return new Promise((
|
|
15
|
+
return new Promise((resolve2) => {
|
|
16
16
|
exec(`cd "${workspaceRoot}" && git rev-parse --git-dir`, { maxBuffer: 1024 * 1024 }, (error) => {
|
|
17
|
-
|
|
17
|
+
resolve2(!error);
|
|
18
18
|
});
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
21
|
async getCurrentBranch(workspaceRoot) {
|
|
22
|
-
return new Promise((
|
|
22
|
+
return new Promise((resolve2, reject) => {
|
|
23
23
|
exec(`cd "${workspaceRoot}" && git rev-parse --abbrev-ref HEAD`, { maxBuffer: 1024 * 1024 }, (error, stdout) => {
|
|
24
24
|
if (error) {
|
|
25
25
|
reject(error);
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
|
-
|
|
28
|
+
resolve2(stdout.trim());
|
|
29
29
|
});
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
32
|
async listWorktrees(workspaceRoot) {
|
|
33
|
-
return new Promise((
|
|
33
|
+
return new Promise((resolve2) => {
|
|
34
34
|
exec(`cd "${workspaceRoot}" && git worktree list --porcelain`, { maxBuffer: 1024 * 1024 }, (error, stdout) => {
|
|
35
35
|
if (error) {
|
|
36
|
-
|
|
36
|
+
resolve2([]);
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
39
|
const worktrees = [];
|
|
@@ -51,21 +51,21 @@ var GitAdapter = class {
|
|
|
51
51
|
const headMatch = headLine.match(/^HEAD (.+)$/);
|
|
52
52
|
const branchMatch = branchLine?.match(/^branch refs\/heads\/(.+)$/);
|
|
53
53
|
if (pathMatch && headMatch) {
|
|
54
|
-
const
|
|
54
|
+
const path11 = pathMatch[1];
|
|
55
55
|
const head = headMatch[1];
|
|
56
56
|
const branch = branchMatch ? branchMatch[1] : "HEAD";
|
|
57
|
-
if (
|
|
58
|
-
worktrees.push({ path:
|
|
57
|
+
if (path11 !== workspaceRoot) {
|
|
58
|
+
worktrees.push({ path: path11, branch, head });
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
i += 3;
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
resolve2(worktrees);
|
|
64
64
|
});
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
67
|
async createWorktree(worktreePath, branch, workspaceRoot) {
|
|
68
|
-
return new Promise((
|
|
68
|
+
return new Promise((resolve2, reject) => {
|
|
69
69
|
const parentDir = worktreePath.substring(0, worktreePath.lastIndexOf("/"));
|
|
70
70
|
const mkdirCmd = parentDir ? `mkdir -p "${parentDir}" && ` : "";
|
|
71
71
|
exec(`cd "${workspaceRoot}" && ${mkdirCmd}git worktree add "${worktreePath}" -b "${branch}"`, { maxBuffer: 1024 * 1024 }, (error) => {
|
|
@@ -73,60 +73,60 @@ var GitAdapter = class {
|
|
|
73
73
|
reject(error);
|
|
74
74
|
return;
|
|
75
75
|
}
|
|
76
|
-
|
|
76
|
+
resolve2();
|
|
77
77
|
});
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
async removeWorktree(worktreePath, workspaceRoot, force = false) {
|
|
81
|
-
return new Promise((
|
|
81
|
+
return new Promise((resolve2, reject) => {
|
|
82
82
|
const forceFlag = force ? " --force" : "";
|
|
83
83
|
exec(`cd "${workspaceRoot}" && git worktree remove "${worktreePath}"${forceFlag}`, { maxBuffer: 1024 * 1024 }, (error) => {
|
|
84
84
|
if (error) {
|
|
85
85
|
reject(new Error(`Failed to remove worktree: ${error.message}`));
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
|
-
|
|
88
|
+
resolve2();
|
|
89
89
|
});
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
async deleteBranch(branchName, workspaceRoot, force = false) {
|
|
93
|
-
return new Promise((
|
|
93
|
+
return new Promise((resolve2, reject) => {
|
|
94
94
|
const deleteFlag = force ? "-D" : "-d";
|
|
95
95
|
exec(`cd "${workspaceRoot}" && git branch ${deleteFlag} "${branchName}"`, { maxBuffer: 1024 * 1024 }, (error) => {
|
|
96
96
|
if (error) {
|
|
97
97
|
reject(new Error(`Failed to delete branch: ${error.message}`));
|
|
98
98
|
return;
|
|
99
99
|
}
|
|
100
|
-
|
|
100
|
+
resolve2();
|
|
101
101
|
});
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
|
-
async isValidWorktree(
|
|
104
|
+
async isValidWorktree(path11, workspaceRoot) {
|
|
105
105
|
try {
|
|
106
|
-
await fs.promises.access(
|
|
106
|
+
await fs.promises.access(path11, fs.constants.R_OK);
|
|
107
107
|
} catch {
|
|
108
108
|
return false;
|
|
109
109
|
}
|
|
110
|
-
const isGitRepo = await new Promise((
|
|
111
|
-
exec(`cd "${
|
|
112
|
-
|
|
110
|
+
const isGitRepo = await new Promise((resolve2) => {
|
|
111
|
+
exec(`cd "${path11}" && git rev-parse --git-dir`, { maxBuffer: 1024 * 1024 }, (error) => {
|
|
112
|
+
resolve2(!error);
|
|
113
113
|
});
|
|
114
114
|
});
|
|
115
115
|
if (!isGitRepo) {
|
|
116
116
|
return false;
|
|
117
117
|
}
|
|
118
118
|
const worktrees = await this.listWorktrees(workspaceRoot);
|
|
119
|
-
return worktrees.some((wt) => wt.path ===
|
|
119
|
+
return worktrees.some((wt) => wt.path === path11);
|
|
120
120
|
}
|
|
121
121
|
async getWorktreeBranch(worktreePath) {
|
|
122
|
-
return new Promise((
|
|
122
|
+
return new Promise((resolve2, reject) => {
|
|
123
123
|
exec(`cd "${worktreePath}" && git rev-parse --abbrev-ref HEAD`, { maxBuffer: 1024 * 1024 }, (error, stdout) => {
|
|
124
124
|
if (error) {
|
|
125
125
|
reject(new Error(`Failed to get branch name: ${error.message}`));
|
|
126
126
|
return;
|
|
127
127
|
}
|
|
128
128
|
const branch = stdout.trim();
|
|
129
|
-
|
|
129
|
+
resolve2(branch);
|
|
130
130
|
});
|
|
131
131
|
});
|
|
132
132
|
}
|
|
@@ -157,12 +157,12 @@ var cancelableInput = createPrompt((config, done) => {
|
|
|
157
157
|
setValue(value.slice(0, -1));
|
|
158
158
|
setError(null);
|
|
159
159
|
} else if (key.ctrl || key.name === "tab" || key.name === "up" || key.name === "down") {
|
|
160
|
-
} else
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
160
|
+
} else {
|
|
161
|
+
const seq = key.sequence;
|
|
162
|
+
if (seq && seq.length === 1 && seq >= " ") {
|
|
163
|
+
setValue(value + seq);
|
|
164
|
+
setError(null);
|
|
165
|
+
}
|
|
166
166
|
}
|
|
167
167
|
});
|
|
168
168
|
const errorMsg = error ? chalk.red(`
|
|
@@ -582,6 +582,8 @@ router2.get("/", (req, res) => {
|
|
|
582
582
|
// dist/flip/routes/git.js
|
|
583
583
|
import { Router as Router3 } from "express";
|
|
584
584
|
import { execSync } from "child_process";
|
|
585
|
+
import * as fs4 from "fs";
|
|
586
|
+
import * as path4 from "path";
|
|
585
587
|
var router3 = Router3();
|
|
586
588
|
function parseGitStatus(output) {
|
|
587
589
|
const files = [];
|
|
@@ -613,6 +615,75 @@ function parseGitStatus(output) {
|
|
|
613
615
|
}
|
|
614
616
|
return files;
|
|
615
617
|
}
|
|
618
|
+
function parseUnifiedDiff(diffOutput) {
|
|
619
|
+
const hunks = [];
|
|
620
|
+
const lines = diffOutput.split("\n");
|
|
621
|
+
let currentHunk = null;
|
|
622
|
+
let oldLineNum = 0;
|
|
623
|
+
let newLineNum = 0;
|
|
624
|
+
for (const line of lines) {
|
|
625
|
+
const hunkMatch = line.match(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
|
|
626
|
+
if (hunkMatch) {
|
|
627
|
+
if (currentHunk) {
|
|
628
|
+
hunks.push(currentHunk);
|
|
629
|
+
}
|
|
630
|
+
currentHunk = {
|
|
631
|
+
oldStart: parseInt(hunkMatch[1], 10),
|
|
632
|
+
oldLines: parseInt(hunkMatch[2] || "1", 10),
|
|
633
|
+
newStart: parseInt(hunkMatch[3], 10),
|
|
634
|
+
newLines: parseInt(hunkMatch[4] || "1", 10),
|
|
635
|
+
lines: []
|
|
636
|
+
};
|
|
637
|
+
oldLineNum = currentHunk.oldStart;
|
|
638
|
+
newLineNum = currentHunk.newStart;
|
|
639
|
+
continue;
|
|
640
|
+
}
|
|
641
|
+
if (!currentHunk)
|
|
642
|
+
continue;
|
|
643
|
+
if (line.startsWith("diff ") || line.startsWith("index ") || line.startsWith("--- ") || line.startsWith("+++ ") || line.startsWith("\\")) {
|
|
644
|
+
continue;
|
|
645
|
+
}
|
|
646
|
+
if (line.startsWith("+")) {
|
|
647
|
+
currentHunk.lines.push({
|
|
648
|
+
type: "add",
|
|
649
|
+
content: line.substring(1),
|
|
650
|
+
newLineNumber: newLineNum++
|
|
651
|
+
});
|
|
652
|
+
} else if (line.startsWith("-")) {
|
|
653
|
+
currentHunk.lines.push({
|
|
654
|
+
type: "delete",
|
|
655
|
+
content: line.substring(1),
|
|
656
|
+
oldLineNumber: oldLineNum++
|
|
657
|
+
});
|
|
658
|
+
} else if (line.startsWith(" ") || line === "") {
|
|
659
|
+
currentHunk.lines.push({
|
|
660
|
+
type: "context",
|
|
661
|
+
content: line.startsWith(" ") ? line.substring(1) : line,
|
|
662
|
+
oldLineNumber: oldLineNum++,
|
|
663
|
+
newLineNumber: newLineNum++
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
if (currentHunk) {
|
|
668
|
+
hunks.push(currentHunk);
|
|
669
|
+
}
|
|
670
|
+
return hunks;
|
|
671
|
+
}
|
|
672
|
+
function createAddedFileDiff(content) {
|
|
673
|
+
const lines = content.split("\n");
|
|
674
|
+
const diffLines = lines.map((line, idx) => ({
|
|
675
|
+
type: "add",
|
|
676
|
+
content: line,
|
|
677
|
+
newLineNumber: idx + 1
|
|
678
|
+
}));
|
|
679
|
+
return [{
|
|
680
|
+
oldStart: 0,
|
|
681
|
+
oldLines: 0,
|
|
682
|
+
newStart: 1,
|
|
683
|
+
newLines: lines.length,
|
|
684
|
+
lines: diffLines
|
|
685
|
+
}];
|
|
686
|
+
}
|
|
616
687
|
router3.get("/status", (req, res) => {
|
|
617
688
|
const state = req.app.locals.state;
|
|
618
689
|
let isGitRepo = false;
|
|
@@ -647,6 +718,66 @@ router3.get("/status", (req, res) => {
|
|
|
647
718
|
};
|
|
648
719
|
res.json(response);
|
|
649
720
|
});
|
|
721
|
+
router3.get("/diff", (req, res) => {
|
|
722
|
+
const state = req.app.locals.state;
|
|
723
|
+
const relativePath = req.query.path;
|
|
724
|
+
if (!relativePath) {
|
|
725
|
+
res.status(400).json({ error: "Missing path parameter" });
|
|
726
|
+
return;
|
|
727
|
+
}
|
|
728
|
+
const fullPath = path4.join(state.cwd, relativePath);
|
|
729
|
+
let fileStatus = "modified";
|
|
730
|
+
try {
|
|
731
|
+
const statusOutput = execSync(`git status --porcelain -- "${relativePath}"`, {
|
|
732
|
+
cwd: state.cwd,
|
|
733
|
+
encoding: "utf-8"
|
|
734
|
+
});
|
|
735
|
+
if (statusOutput.startsWith("??")) {
|
|
736
|
+
fileStatus = "untracked";
|
|
737
|
+
} else if (statusOutput.includes("A")) {
|
|
738
|
+
fileStatus = "added";
|
|
739
|
+
} else if (statusOutput.includes("D")) {
|
|
740
|
+
fileStatus = "deleted";
|
|
741
|
+
}
|
|
742
|
+
} catch {
|
|
743
|
+
}
|
|
744
|
+
if (fileStatus === "untracked") {
|
|
745
|
+
try {
|
|
746
|
+
const content = fs4.readFileSync(fullPath, "utf-8");
|
|
747
|
+
const diff = {
|
|
748
|
+
hunks: createAddedFileDiff(content),
|
|
749
|
+
status: "untracked"
|
|
750
|
+
};
|
|
751
|
+
res.json(diff);
|
|
752
|
+
return;
|
|
753
|
+
} catch {
|
|
754
|
+
res.status(404).json({ error: "File not found" });
|
|
755
|
+
return;
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
try {
|
|
759
|
+
const diffOutput = execSync(`git diff --no-color -- "${relativePath}"`, {
|
|
760
|
+
cwd: state.cwd,
|
|
761
|
+
encoding: "utf-8"
|
|
762
|
+
});
|
|
763
|
+
if (!diffOutput.trim()) {
|
|
764
|
+
const diff2 = {
|
|
765
|
+
hunks: [],
|
|
766
|
+
status: fileStatus
|
|
767
|
+
};
|
|
768
|
+
res.json(diff2);
|
|
769
|
+
return;
|
|
770
|
+
}
|
|
771
|
+
const hunks = parseUnifiedDiff(diffOutput);
|
|
772
|
+
const diff = {
|
|
773
|
+
hunks,
|
|
774
|
+
status: fileStatus
|
|
775
|
+
};
|
|
776
|
+
res.json(diff);
|
|
777
|
+
} catch (err) {
|
|
778
|
+
res.status(500).json({ error: "Failed to get diff" });
|
|
779
|
+
}
|
|
780
|
+
});
|
|
650
781
|
|
|
651
782
|
// dist/flip/routes/submit.js
|
|
652
783
|
import { Router as Router4 } from "express";
|
|
@@ -675,8 +806,8 @@ async function copyToClipboard(text) {
|
|
|
675
806
|
|
|
676
807
|
// dist/flip/output/autopaste.js
|
|
677
808
|
import { execSync as execSync2 } from "child_process";
|
|
678
|
-
import
|
|
679
|
-
import
|
|
809
|
+
import fs5 from "fs";
|
|
810
|
+
import path5 from "path";
|
|
680
811
|
import os from "os";
|
|
681
812
|
async function schedulePaste(sessionId) {
|
|
682
813
|
if (process.platform !== "darwin") {
|
|
@@ -686,10 +817,10 @@ async function schedulePaste(sessionId) {
|
|
|
686
817
|
await pasteToOriginalSession(sessionId);
|
|
687
818
|
}
|
|
688
819
|
async function pasteToOriginalSession(sessionId) {
|
|
689
|
-
const sessionFile =
|
|
820
|
+
const sessionFile = path5.join(os.tmpdir(), `flip-view-session-${sessionId}`);
|
|
690
821
|
let itermSessionId;
|
|
691
822
|
try {
|
|
692
|
-
itermSessionId =
|
|
823
|
+
itermSessionId = fs5.readFileSync(sessionFile, "utf-8").trim();
|
|
693
824
|
} catch {
|
|
694
825
|
}
|
|
695
826
|
let script;
|
|
@@ -717,7 +848,7 @@ async function pasteToOriginalSession(sessionId) {
|
|
|
717
848
|
end tell
|
|
718
849
|
`;
|
|
719
850
|
try {
|
|
720
|
-
|
|
851
|
+
fs5.unlinkSync(sessionFile);
|
|
721
852
|
} catch {
|
|
722
853
|
}
|
|
723
854
|
} else {
|
|
@@ -787,19 +918,19 @@ router5.post("/", (req, res) => {
|
|
|
787
918
|
// dist/flip/routes/static.js
|
|
788
919
|
import { Router as Router6 } from "express";
|
|
789
920
|
import express from "express";
|
|
790
|
-
import
|
|
921
|
+
import path6 from "path";
|
|
791
922
|
import { fileURLToPath } from "url";
|
|
792
|
-
import
|
|
923
|
+
import fs6 from "fs";
|
|
793
924
|
function createStaticRouter() {
|
|
794
925
|
const router6 = Router6();
|
|
795
926
|
const __filename = fileURLToPath(import.meta.url);
|
|
796
|
-
const __dirname =
|
|
797
|
-
const distPath =
|
|
798
|
-
if (
|
|
927
|
+
const __dirname = path6.dirname(__filename);
|
|
928
|
+
const distPath = path6.resolve(__dirname, "flip-ui/dist");
|
|
929
|
+
if (fs6.existsSync(distPath)) {
|
|
799
930
|
router6.use(express.static(distPath));
|
|
800
931
|
router6.get("*", (req, res) => {
|
|
801
|
-
const indexPath =
|
|
802
|
-
if (
|
|
932
|
+
const indexPath = path6.join(distPath, "index.html");
|
|
933
|
+
if (fs6.existsSync(indexPath)) {
|
|
803
934
|
res.sendFile(indexPath);
|
|
804
935
|
} else {
|
|
805
936
|
res.status(404).send("Not Found");
|
|
@@ -822,7 +953,7 @@ var Server = class {
|
|
|
822
953
|
this.port = port;
|
|
823
954
|
}
|
|
824
955
|
async run() {
|
|
825
|
-
return new Promise((
|
|
956
|
+
return new Promise((resolve2) => {
|
|
826
957
|
const state = {
|
|
827
958
|
cwd: this.cwd,
|
|
828
959
|
resolve: null
|
|
@@ -840,7 +971,7 @@ var Server = class {
|
|
|
840
971
|
const server = http.createServer(app);
|
|
841
972
|
state.resolve = (output) => {
|
|
842
973
|
server.close();
|
|
843
|
-
|
|
974
|
+
resolve2(output);
|
|
844
975
|
};
|
|
845
976
|
server.listen(this.port, "127.0.0.1", () => {
|
|
846
977
|
console.log(`Server running at http://localhost:${this.port}`);
|
|
@@ -849,23 +980,23 @@ var Server = class {
|
|
|
849
980
|
}
|
|
850
981
|
};
|
|
851
982
|
async function findFreePort(preferred) {
|
|
852
|
-
return new Promise((
|
|
983
|
+
return new Promise((resolve2) => {
|
|
853
984
|
const server = net.createServer();
|
|
854
985
|
server.listen(preferred, "127.0.0.1", () => {
|
|
855
986
|
server.close(() => {
|
|
856
|
-
|
|
987
|
+
resolve2(preferred);
|
|
857
988
|
});
|
|
858
989
|
});
|
|
859
990
|
server.on("error", () => {
|
|
860
|
-
findFreePort(preferred + 1).then(
|
|
991
|
+
findFreePort(preferred + 1).then(resolve2);
|
|
861
992
|
});
|
|
862
993
|
});
|
|
863
994
|
}
|
|
864
995
|
|
|
865
996
|
// dist/flip/index.js
|
|
866
997
|
import open from "open";
|
|
867
|
-
import
|
|
868
|
-
import
|
|
998
|
+
import path7 from "path";
|
|
999
|
+
import fs7 from "fs";
|
|
869
1000
|
import os2 from "os";
|
|
870
1001
|
import { execSync as execSync3 } from "child_process";
|
|
871
1002
|
import { confirm as confirm2 } from "@inquirer/prompts";
|
|
@@ -917,7 +1048,7 @@ async function runFlip(args) {
|
|
|
917
1048
|
} else {
|
|
918
1049
|
command = "oneshot";
|
|
919
1050
|
}
|
|
920
|
-
const cwd = pathArg ?
|
|
1051
|
+
const cwd = pathArg ? path7.resolve(pathArg) : process.cwd();
|
|
921
1052
|
switch (command) {
|
|
922
1053
|
case "setup": {
|
|
923
1054
|
await setupHotkey();
|
|
@@ -989,9 +1120,9 @@ function printUsage() {
|
|
|
989
1120
|
console.error(" --session <uuid> Session ID for paste-back tracking");
|
|
990
1121
|
}
|
|
991
1122
|
async function setupHotkey() {
|
|
992
|
-
const configDir =
|
|
993
|
-
const applescriptPath =
|
|
994
|
-
const shPath =
|
|
1123
|
+
const configDir = path7.join(os2.homedir(), ".config", "flip");
|
|
1124
|
+
const applescriptPath = path7.join(configDir, "flip.applescript");
|
|
1125
|
+
const shPath = path7.join(configDir, "flip.sh");
|
|
995
1126
|
let nodePath;
|
|
996
1127
|
try {
|
|
997
1128
|
nodePath = execSync3("which node", { encoding: "utf-8" }).trim();
|
|
@@ -999,7 +1130,7 @@ async function setupHotkey() {
|
|
|
999
1130
|
nodePath = "/usr/local/bin/node";
|
|
1000
1131
|
}
|
|
1001
1132
|
const csqPath = new URL(import.meta.url).pathname;
|
|
1002
|
-
|
|
1133
|
+
fs7.mkdirSync(configDir, { recursive: true });
|
|
1003
1134
|
const applescriptContent = `#!/usr/bin/osascript
|
|
1004
1135
|
|
|
1005
1136
|
-- flip hotkey script
|
|
@@ -1016,13 +1147,13 @@ tell application "iTerm2"
|
|
|
1016
1147
|
end tell
|
|
1017
1148
|
|
|
1018
1149
|
return ""`;
|
|
1019
|
-
|
|
1020
|
-
|
|
1150
|
+
fs7.writeFileSync(applescriptPath, applescriptContent);
|
|
1151
|
+
fs7.chmodSync(applescriptPath, "755");
|
|
1021
1152
|
const shContent = `#!/bin/bash
|
|
1022
1153
|
osascript ${applescriptPath} > /dev/null 2>&1
|
|
1023
1154
|
`;
|
|
1024
|
-
|
|
1025
|
-
|
|
1155
|
+
fs7.writeFileSync(shPath, shContent);
|
|
1156
|
+
fs7.chmodSync(shPath, "755");
|
|
1026
1157
|
console.log("");
|
|
1027
1158
|
console.log("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510");
|
|
1028
1159
|
console.log("\u2502 Flip Hotkey Setup Wizard \u2502");
|
|
@@ -1086,6 +1217,85 @@ osascript ${applescriptPath} > /dev/null 2>&1
|
|
|
1086
1217
|
console.log("");
|
|
1087
1218
|
}
|
|
1088
1219
|
|
|
1220
|
+
// dist/config.js
|
|
1221
|
+
import * as fs8 from "fs";
|
|
1222
|
+
import * as os3 from "os";
|
|
1223
|
+
import * as path8 from "path";
|
|
1224
|
+
var GLOBAL_CONFIG_PATH = path8.join(os3.homedir(), ".code-squad", "config.json");
|
|
1225
|
+
async function loadGlobalConfig() {
|
|
1226
|
+
try {
|
|
1227
|
+
const content = await fs8.promises.readFile(GLOBAL_CONFIG_PATH, "utf-8");
|
|
1228
|
+
return JSON.parse(content);
|
|
1229
|
+
} catch (error) {
|
|
1230
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
1231
|
+
return {};
|
|
1232
|
+
}
|
|
1233
|
+
console.warn(`[Code Squad] Warning: Could not load global config at ${GLOBAL_CONFIG_PATH}.`, error);
|
|
1234
|
+
return {};
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
async function loadConfig(workspaceRoot) {
|
|
1238
|
+
const globalConfig = await loadGlobalConfig();
|
|
1239
|
+
const normalizedPath = path8.resolve(workspaceRoot);
|
|
1240
|
+
const projectConfig = globalConfig.projects?.[normalizedPath] ?? {};
|
|
1241
|
+
const defaults = globalConfig.defaults ?? {};
|
|
1242
|
+
return {
|
|
1243
|
+
...defaults,
|
|
1244
|
+
...projectConfig,
|
|
1245
|
+
worktreeCopyPatterns: [
|
|
1246
|
+
.../* @__PURE__ */ new Set([
|
|
1247
|
+
...defaults.worktreeCopyPatterns ?? [],
|
|
1248
|
+
...projectConfig.worktreeCopyPatterns ?? []
|
|
1249
|
+
])
|
|
1250
|
+
]
|
|
1251
|
+
};
|
|
1252
|
+
}
|
|
1253
|
+
function getWorktreeCopyPatterns(config) {
|
|
1254
|
+
return config.worktreeCopyPatterns ?? [];
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1257
|
+
// dist/fileUtils.js
|
|
1258
|
+
import * as fs9 from "fs";
|
|
1259
|
+
import * as path9 from "path";
|
|
1260
|
+
import fg from "fast-glob";
|
|
1261
|
+
async function copyFilesWithPatterns(sourceRoot, destRoot, patterns) {
|
|
1262
|
+
const copied = [];
|
|
1263
|
+
const failed = [];
|
|
1264
|
+
if (patterns.length === 0) {
|
|
1265
|
+
return { copied, failed };
|
|
1266
|
+
}
|
|
1267
|
+
for (const pattern of patterns) {
|
|
1268
|
+
try {
|
|
1269
|
+
const files = await fg(pattern, {
|
|
1270
|
+
cwd: sourceRoot,
|
|
1271
|
+
absolute: true,
|
|
1272
|
+
onlyFiles: true,
|
|
1273
|
+
dot: true
|
|
1274
|
+
// .env 같은 dotfile도 매칭
|
|
1275
|
+
});
|
|
1276
|
+
for (const absolutePath of files) {
|
|
1277
|
+
try {
|
|
1278
|
+
await copySingleFile(absolutePath, sourceRoot, destRoot);
|
|
1279
|
+
const relativePath = path9.relative(sourceRoot, absolutePath);
|
|
1280
|
+
copied.push(relativePath);
|
|
1281
|
+
} catch {
|
|
1282
|
+
const relativePath = path9.relative(sourceRoot, absolutePath);
|
|
1283
|
+
failed.push(relativePath);
|
|
1284
|
+
}
|
|
1285
|
+
}
|
|
1286
|
+
} catch {
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
return { copied, failed };
|
|
1290
|
+
}
|
|
1291
|
+
async function copySingleFile(absolutePath, sourceRoot, destRoot) {
|
|
1292
|
+
const relativePath = path9.relative(sourceRoot, absolutePath);
|
|
1293
|
+
const destPath = path9.join(destRoot, relativePath);
|
|
1294
|
+
const destDir = path9.dirname(destPath);
|
|
1295
|
+
await fs9.promises.mkdir(destDir, { recursive: true });
|
|
1296
|
+
await fs9.promises.copyFile(absolutePath, destPath);
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1089
1299
|
// dist/index.js
|
|
1090
1300
|
process.on("SIGINT", () => {
|
|
1091
1301
|
process.exit(130);
|
|
@@ -1135,13 +1345,13 @@ function getProjectHash(workspaceRoot) {
|
|
|
1135
1345
|
}
|
|
1136
1346
|
function getSessionsPath(workspaceRoot) {
|
|
1137
1347
|
const projectHash = getProjectHash(workspaceRoot);
|
|
1138
|
-
const projectName =
|
|
1139
|
-
return
|
|
1348
|
+
const projectName = path10.basename(workspaceRoot);
|
|
1349
|
+
return path10.join(os4.homedir(), ".code-squad", "sessions", `${projectName}-${projectHash}.json`);
|
|
1140
1350
|
}
|
|
1141
1351
|
async function loadLocalThreads(workspaceRoot) {
|
|
1142
1352
|
const sessionsPath = getSessionsPath(workspaceRoot);
|
|
1143
1353
|
try {
|
|
1144
|
-
const content = await
|
|
1354
|
+
const content = await fs10.promises.readFile(sessionsPath, "utf-8");
|
|
1145
1355
|
const data = JSON.parse(content);
|
|
1146
1356
|
return data.localThreads || [];
|
|
1147
1357
|
} catch {
|
|
@@ -1150,9 +1360,9 @@ async function loadLocalThreads(workspaceRoot) {
|
|
|
1150
1360
|
}
|
|
1151
1361
|
async function saveLocalThreads(workspaceRoot, threads) {
|
|
1152
1362
|
const sessionsPath = getSessionsPath(workspaceRoot);
|
|
1153
|
-
const dir =
|
|
1154
|
-
await
|
|
1155
|
-
await
|
|
1363
|
+
const dir = path10.dirname(sessionsPath);
|
|
1364
|
+
await fs10.promises.mkdir(dir, { recursive: true });
|
|
1365
|
+
await fs10.promises.writeFile(sessionsPath, JSON.stringify({ localThreads: threads }, null, 2));
|
|
1156
1366
|
}
|
|
1157
1367
|
async function addLocalThread(workspaceRoot, name) {
|
|
1158
1368
|
const threads = await loadLocalThreads(workspaceRoot);
|
|
@@ -1232,13 +1442,13 @@ async function listThreads(workspaceRoot) {
|
|
|
1232
1442
|
}
|
|
1233
1443
|
}
|
|
1234
1444
|
async function createWorktree(workspaceRoot, name) {
|
|
1235
|
-
const repoName =
|
|
1236
|
-
const defaultBasePath =
|
|
1445
|
+
const repoName = path10.basename(workspaceRoot);
|
|
1446
|
+
const defaultBasePath = path10.join(path10.dirname(workspaceRoot), `${repoName}.worktree`);
|
|
1237
1447
|
let worktreeName;
|
|
1238
1448
|
let worktreePath;
|
|
1239
1449
|
if (name) {
|
|
1240
1450
|
worktreeName = name;
|
|
1241
|
-
worktreePath =
|
|
1451
|
+
worktreePath = path10.join(defaultBasePath, name);
|
|
1242
1452
|
} else {
|
|
1243
1453
|
const form = await newWorktreeForm(defaultBasePath);
|
|
1244
1454
|
if (!form) {
|
|
@@ -1251,24 +1461,39 @@ async function createWorktree(workspaceRoot, name) {
|
|
|
1251
1461
|
try {
|
|
1252
1462
|
await gitAdapter.createWorktree(worktreePath, worktreeName, workspaceRoot);
|
|
1253
1463
|
console.log(chalk2.green(`\u2713 Created worktree: ${worktreeName}`));
|
|
1464
|
+
await copyWorktreeFiles(workspaceRoot, worktreePath);
|
|
1254
1465
|
await writeCdFile(worktreePath);
|
|
1255
1466
|
} catch (error) {
|
|
1256
1467
|
console.error(chalk2.red(`Failed to create worktree: ${error.message}`));
|
|
1257
1468
|
process.exit(1);
|
|
1258
1469
|
}
|
|
1259
1470
|
}
|
|
1471
|
+
async function copyWorktreeFiles(sourceRoot, destRoot) {
|
|
1472
|
+
const config = await loadConfig(sourceRoot);
|
|
1473
|
+
const patterns = getWorktreeCopyPatterns(config);
|
|
1474
|
+
if (patterns.length === 0) {
|
|
1475
|
+
return;
|
|
1476
|
+
}
|
|
1477
|
+
const { copied, failed } = await copyFilesWithPatterns(sourceRoot, destRoot, patterns);
|
|
1478
|
+
if (copied.length > 0) {
|
|
1479
|
+
console.log(chalk2.green(`\u2713 Copied ${copied.length} file(s) to worktree`));
|
|
1480
|
+
}
|
|
1481
|
+
if (failed.length > 0) {
|
|
1482
|
+
console.log(chalk2.yellow(`\u26A0 Failed to copy ${failed.length} file(s)`));
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1260
1485
|
async function writeCdFile(targetPath) {
|
|
1261
1486
|
const cdFile = process.env.CSQ_CD_FILE;
|
|
1262
1487
|
if (cdFile) {
|
|
1263
|
-
await
|
|
1488
|
+
await fs10.promises.writeFile(cdFile, targetPath);
|
|
1264
1489
|
}
|
|
1265
1490
|
}
|
|
1266
1491
|
async function openNewTerminal(targetPath) {
|
|
1267
1492
|
const { exec: exec2 } = await import("child_process");
|
|
1268
1493
|
const escapedPath = targetPath.replace(/'/g, "'\\''");
|
|
1269
|
-
const hasIterm = await new Promise((
|
|
1494
|
+
const hasIterm = await new Promise((resolve2) => {
|
|
1270
1495
|
exec2('mdfind "kMDItemCFBundleIdentifier == com.googlecode.iterm2"', (error, stdout) => {
|
|
1271
|
-
|
|
1496
|
+
resolve2(!error && stdout.trim().length > 0);
|
|
1272
1497
|
});
|
|
1273
1498
|
});
|
|
1274
1499
|
if (hasIterm) {
|
|
@@ -1281,13 +1506,13 @@ tell application "iTerm2"
|
|
|
1281
1506
|
end tell
|
|
1282
1507
|
end tell
|
|
1283
1508
|
end tell`;
|
|
1284
|
-
return new Promise((
|
|
1509
|
+
return new Promise((resolve2) => {
|
|
1285
1510
|
exec2(`osascript -e '${script}'`, (error) => {
|
|
1286
1511
|
if (error) {
|
|
1287
1512
|
console.error(chalk2.red("Failed to open iTerm2 split pane"));
|
|
1288
|
-
|
|
1513
|
+
resolve2(false);
|
|
1289
1514
|
} else {
|
|
1290
|
-
|
|
1515
|
+
resolve2(true);
|
|
1291
1516
|
}
|
|
1292
1517
|
});
|
|
1293
1518
|
});
|
|
@@ -1297,13 +1522,13 @@ tell application "Terminal"
|
|
|
1297
1522
|
activate
|
|
1298
1523
|
do script "cd '${escapedPath}'"
|
|
1299
1524
|
end tell`;
|
|
1300
|
-
return new Promise((
|
|
1525
|
+
return new Promise((resolve2) => {
|
|
1301
1526
|
exec2(`osascript -e '${terminalScript}'`, (error) => {
|
|
1302
1527
|
if (error) {
|
|
1303
1528
|
console.error(chalk2.red("Failed to open Terminal"));
|
|
1304
|
-
|
|
1529
|
+
resolve2(false);
|
|
1305
1530
|
} else {
|
|
1306
|
-
|
|
1531
|
+
resolve2(true);
|
|
1307
1532
|
}
|
|
1308
1533
|
});
|
|
1309
1534
|
});
|
|
@@ -1311,7 +1536,14 @@ end tell`;
|
|
|
1311
1536
|
async function interactiveMode(workspaceRoot) {
|
|
1312
1537
|
const result = await runInteraction(workspaceRoot);
|
|
1313
1538
|
if (result?.cdPath) {
|
|
1314
|
-
|
|
1539
|
+
if (process.env.CSQ_CD_FILE) {
|
|
1540
|
+
console.log(result.cdPath);
|
|
1541
|
+
} else {
|
|
1542
|
+
console.log(chalk2.dim("\nRun this to switch:"));
|
|
1543
|
+
console.log(chalk2.cyan(` cd "${result.cdPath}"`));
|
|
1544
|
+
console.log(chalk2.dim("\nTip: Add to ~/.zshrc for auto-cd:"));
|
|
1545
|
+
console.log(chalk2.dim(' eval "$(csq --init)"'));
|
|
1546
|
+
}
|
|
1315
1547
|
}
|
|
1316
1548
|
}
|
|
1317
1549
|
async function persistentInteractiveMode(workspaceRoot) {
|
|
@@ -1354,7 +1586,7 @@ async function executeDelete(thread, workspaceRoot) {
|
|
|
1354
1586
|
}
|
|
1355
1587
|
async function runInteraction(workspaceRoot, _persistent = false) {
|
|
1356
1588
|
const threads = await getAllThreads(workspaceRoot);
|
|
1357
|
-
const repoName =
|
|
1589
|
+
const repoName = path10.basename(workspaceRoot);
|
|
1358
1590
|
const choice = await selectThread(threads, repoName);
|
|
1359
1591
|
if (choice.type === "exit") {
|
|
1360
1592
|
return { exit: true };
|
|
@@ -1385,7 +1617,7 @@ async function runInteraction(workspaceRoot, _persistent = false) {
|
|
|
1385
1617
|
return null;
|
|
1386
1618
|
}
|
|
1387
1619
|
if (newType === "worktree") {
|
|
1388
|
-
const defaultBasePath =
|
|
1620
|
+
const defaultBasePath = path10.join(path10.dirname(workspaceRoot), `${repoName}.worktree`);
|
|
1389
1621
|
const form = await newWorktreeForm(defaultBasePath);
|
|
1390
1622
|
if (!form) {
|
|
1391
1623
|
return null;
|
|
@@ -1393,6 +1625,7 @@ async function runInteraction(workspaceRoot, _persistent = false) {
|
|
|
1393
1625
|
try {
|
|
1394
1626
|
await gitAdapter.createWorktree(form.path, form.name, workspaceRoot);
|
|
1395
1627
|
console.log(chalk2.green(`\u2713 Created worktree: ${form.name}`));
|
|
1628
|
+
await copyWorktreeFiles(workspaceRoot, form.path);
|
|
1396
1629
|
targetPath = form.path;
|
|
1397
1630
|
} catch (error) {
|
|
1398
1631
|
console.error(chalk2.red(`Failed to create worktree: ${error.message}`));
|