@phake/lanework 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/cli.mjs +58 -0
- package/dist-local/client/android-chrome-192x192.png +0 -0
- package/dist-local/client/android-chrome-512x512.png +0 -0
- package/dist-local/client/apple-touch-icon.png +0 -0
- package/dist-local/client/assets/Tag01Icon-DNgtGZ3r.js +1 -0
- package/dist-local/client/assets/abap-CLvhMVsD.js +1 -0
- package/dist-local/client/assets/actionscript-3--17pq3dv.js +1 -0
- package/dist-local/client/assets/ada-C5qYipkI.js +1 -0
- package/dist-local/client/assets/andromeeda-vGVdxbeo.js +1 -0
- package/dist-local/client/assets/angular-html-DrvEcI8G.js +1 -0
- package/dist-local/client/assets/angular-ts-D8CUV3s9.js +1 -0
- package/dist-local/client/assets/apache-U0d_L8uA.js +1 -0
- package/dist-local/client/assets/apex-VAyPSnFM.js +1 -0
- package/dist-local/client/assets/apl-PcM4Dp7k.js +1 -0
- package/dist-local/client/assets/app-DMYVKfjU.css +2 -0
- package/dist-local/client/assets/applescript-CCn79oCD.js +1 -0
- package/dist-local/client/assets/ara-4CJ0cIlV.js +1 -0
- package/dist-local/client/assets/asciidoc-DE70LPWp.js +1 -0
- package/dist-local/client/assets/asm-Cmm7eHzH.js +1 -0
- package/dist-local/client/assets/astro-DcteBnKj.js +1 -0
- package/dist-local/client/assets/aurora-x-CDeNXAV0.js +1 -0
- package/dist-local/client/assets/awk-BWXHIvNe.js +1 -0
- package/dist-local/client/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/dist-local/client/assets/ayu-light-C3h-C4tm.js +1 -0
- package/dist-local/client/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/dist-local/client/assets/ballerina-B7ZEbQpA.js +1 -0
- package/dist-local/client/assets/bat-Bo4NYOV-.js +1 -0
- package/dist-local/client/assets/beancount-D-usSTwE.js +1 -0
- package/dist-local/client/assets/berry-DKpUyyne.js +1 -0
- package/dist-local/client/assets/bibtex-Ci_nEsc7.js +1 -0
- package/dist-local/client/assets/bicep-CUHmPFLl.js +1 -0
- package/dist-local/client/assets/bird2-C6vDhewU.js +1 -0
- package/dist-local/client/assets/blade-6YnoPBU8.js +1 -0
- package/dist-local/client/assets/board._owner._repo-DyrvTwhk.js +1 -0
- package/dist-local/client/assets/board._owner._repo-hvj6B94q.js +38 -0
- package/dist-local/client/assets/bsl-BkkzgIyY.js +1 -0
- package/dist-local/client/assets/c-PpPxyn8g.js +1 -0
- package/dist-local/client/assets/c3-BFHwR3_K.js +1 -0
- package/dist-local/client/assets/cadence-CQ2zXKGN.js +1 -0
- package/dist-local/client/assets/cairo-DLTphjLi.js +1 -0
- package/dist-local/client/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
- package/dist-local/client/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
- package/dist-local/client/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
- package/dist-local/client/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
- package/dist-local/client/assets/chunk-Cyuzqnbw.js +1 -0
- package/dist-local/client/assets/clarity-SemFz856.js +1 -0
- package/dist-local/client/assets/clojure-DqKBuwfJ.js +1 -0
- package/dist-local/client/assets/cmake-Bj61d0ZC.js +1 -0
- package/dist-local/client/assets/cobol-IOjEjPmG.js +1 -0
- package/dist-local/client/assets/codeowners-C8r90Shi.js +1 -0
- package/dist-local/client/assets/codeql-oeQT6MSM.js +1 -0
- package/dist-local/client/assets/coffee-B5TREocO.js +1 -0
- package/dist-local/client/assets/common-lisp-Cv5bFMCO.js +1 -0
- package/dist-local/client/assets/coq-BrsZFFmf.js +1 -0
- package/dist-local/client/assets/cpp-C4ceAJBi.js +1 -0
- package/dist-local/client/assets/crystal-CgtjlE18.js +1 -0
- package/dist-local/client/assets/csharp-oqKa8noW.js +1 -0
- package/dist-local/client/assets/css-Dflf0SUa.js +1 -0
- package/dist-local/client/assets/csv-Dx-8-gkx.js +1 -0
- package/dist-local/client/assets/cue-CE9AQfxI.js +1 -0
- package/dist-local/client/assets/cypher-ClKdZ_lG.js +1 -0
- package/dist-local/client/assets/d-qD-0Kul2.js +1 -0
- package/dist-local/client/assets/dark-plus-Cs2F2srj.js +1 -0
- package/dist-local/client/assets/dart-CnvKMtbv.js +1 -0
- package/dist-local/client/assets/dax-BkyTk9wS.js +1 -0
- package/dist-local/client/assets/desktop-Dlh5hvp9.js +1 -0
- package/dist-local/client/assets/diff-woXpYk--.js +1 -0
- package/dist-local/client/assets/dist-DZ2bn-Z6.js +153 -0
- package/dist-local/client/assets/docker-IyjqRm3v.js +1 -0
- package/dist-local/client/assets/dotenv-_5a1GRtc.js +1 -0
- package/dist-local/client/assets/dracula-BHWKrbxM.js +1 -0
- package/dist-local/client/assets/dracula-soft-5eyTD99u.js +1 -0
- package/dist-local/client/assets/dream-maker-DW3nJb8Q.js +1 -0
- package/dist-local/client/assets/edge-DoVTVjme.js +1 -0
- package/dist-local/client/assets/elixir-CzgPtVDf.js +1 -0
- package/dist-local/client/assets/elm-Cm7sFdI1.js +1 -0
- package/dist-local/client/assets/emacs-lisp-B4R74twV.js +1 -0
- package/dist-local/client/assets/erb-p0q977En.js +1 -0
- package/dist-local/client/assets/erlang-Cphh6RMH.js +1 -0
- package/dist-local/client/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/dist-local/client/assets/everforest-light-Df2xbC6M.js +1 -0
- package/dist-local/client/assets/fennel-DQxkIbk2.js +1 -0
- package/dist-local/client/assets/fish-BJitypiv.js +1 -0
- package/dist-local/client/assets/fluent-C03EYrpw.js +1 -0
- package/dist-local/client/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
- package/dist-local/client/assets/fortran-free-form-CYNrtFtB.js +1 -0
- package/dist-local/client/assets/fsharp-D13ZGOAj.js +1 -0
- package/dist-local/client/assets/gdresource-C0sCabJj.js +1 -0
- package/dist-local/client/assets/gdscript-Cp2uCuqX.js +1 -0
- package/dist-local/client/assets/gdshader-CBce3t8t.js +1 -0
- package/dist-local/client/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist-local/client/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist-local/client/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist-local/client/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist-local/client/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
- package/dist-local/client/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
- package/dist-local/client/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
- package/dist-local/client/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
- package/dist-local/client/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
- package/dist-local/client/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
- package/dist-local/client/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist-local/client/assets/gemini-2_FJD5P-.js +1 -0
- package/dist-local/client/assets/genie-CV2tkWYe.js +1 -0
- package/dist-local/client/assets/gherkin-DExj1W_8.js +1 -0
- package/dist-local/client/assets/git-commit-BSykSTBG.js +1 -0
- package/dist-local/client/assets/git-rebase-D2tSwjJb.js +1 -0
- package/dist-local/client/assets/github-dark-C-LZuMrd.js +1 -0
- package/dist-local/client/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/dist-local/client/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/dist-local/client/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/dist-local/client/assets/github-light-EUqPIrTm.js +1 -0
- package/dist-local/client/assets/github-light-default-BXViO-2h.js +1 -0
- package/dist-local/client/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/dist-local/client/assets/gleam-CSRkHgEL.js +1 -0
- package/dist-local/client/assets/glimmer-js-JMWzPMQ2.js +1 -0
- package/dist-local/client/assets/glimmer-ts-DG5GCT78.js +1 -0
- package/dist-local/client/assets/glsl-MPwHyiXQ.js +1 -0
- package/dist-local/client/assets/gn-ilITqXS6.js +1 -0
- package/dist-local/client/assets/gnuplot-7GGW24-e.js +1 -0
- package/dist-local/client/assets/go-rLFTqkRN.js +1 -0
- package/dist-local/client/assets/graphql-NW854Khs.js +1 -0
- package/dist-local/client/assets/groovy-CacY0gHj.js +1 -0
- package/dist-local/client/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/dist-local/client/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/dist-local/client/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/dist-local/client/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/dist-local/client/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/dist-local/client/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/dist-local/client/assets/guide-BXJBZbQA.js +115 -0
- package/dist-local/client/assets/hack-C4J_0T1S.js +1 -0
- package/dist-local/client/assets/haml-qGg_91I2.js +1 -0
- package/dist-local/client/assets/handlebars-BU7OV8YS.js +1 -0
- package/dist-local/client/assets/haskell-D8IpX4py.js +1 -0
- package/dist-local/client/assets/haxe-OTjmBuCE.js +1 -0
- package/dist-local/client/assets/hcl-Dh228itO.js +1 -0
- package/dist-local/client/assets/hjson-CxZEssPk.js +1 -0
- package/dist-local/client/assets/hlsl-Cvrh5tZx.js +1 -0
- package/dist-local/client/assets/horizon-CE9ld1lL.js +1 -0
- package/dist-local/client/assets/horizon-bright-DSNQnXHK.js +1 -0
- package/dist-local/client/assets/houston-CsvMBhTu.js +1 -0
- package/dist-local/client/assets/html-derivative-CWPAmHEG.js +1 -0
- package/dist-local/client/assets/html-x4KE3xEi.js +1 -0
- package/dist-local/client/assets/http-HvMG3K54.js +1 -0
- package/dist-local/client/assets/hurl-CLh1t2ES.js +1 -0
- package/dist-local/client/assets/hxml-B0Qn7Nwc.js +1 -0
- package/dist-local/client/assets/hy-CZbG8q4J.js +1 -0
- package/dist-local/client/assets/imba-DsUTQ-LC.js +1 -0
- package/dist-local/client/assets/index-TbIMjf2L.js +12 -0
- package/dist-local/client/assets/ini-B5eOa1yu.js +1 -0
- package/dist-local/client/assets/java-Cst_eZTE.js +1 -0
- package/dist-local/client/assets/javascript-i_rUTyCW.js +1 -0
- package/dist-local/client/assets/jinja-ISwn25cN.js +1 -0
- package/dist-local/client/assets/jison-D9Fg2JgN.js +1 -0
- package/dist-local/client/assets/json-DS5j4FfK.js +1 -0
- package/dist-local/client/assets/json5-BR5RXkoi.js +1 -0
- package/dist-local/client/assets/jsonc-CYpm1nAK.js +1 -0
- package/dist-local/client/assets/jsonl-CmCQp5Yx.js +1 -0
- package/dist-local/client/assets/jsonnet-CJTPZ8u_.js +1 -0
- package/dist-local/client/assets/jssm-DXw9l8Rf.js +1 -0
- package/dist-local/client/assets/jsx-CFyhNHav.js +1 -0
- package/dist-local/client/assets/julia-BRnC1exM.js +1 -0
- package/dist-local/client/assets/just-BWbKChh7.js +1 -0
- package/dist-local/client/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
- package/dist-local/client/assets/kanagawa-lotus-BN08jTvb.js +1 -0
- package/dist-local/client/assets/kanagawa-wave-CTweb8Dz.js +1 -0
- package/dist-local/client/assets/kdl-CsD5j6eV.js +1 -0
- package/dist-local/client/assets/kotlin-DhhofPvG.js +1 -0
- package/dist-local/client/assets/kusto-C7mF5XQf.js +1 -0
- package/dist-local/client/assets/laserwave-C_8bwKvT.js +1 -0
- package/dist-local/client/assets/latex-DoFV6f5B.js +1 -0
- package/dist-local/client/assets/lean-CewbzKMR.js +1 -0
- package/dist-local/client/assets/less-DVTAwKKz.js +1 -0
- package/dist-local/client/assets/light-plus-DVQuIRkW.js +1 -0
- package/dist-local/client/assets/link-CUk1Z0N6.js +1 -0
- package/dist-local/client/assets/liquid-BGxpJKqJ.js +1 -0
- package/dist-local/client/assets/llvm-Cm23YOpf.js +1 -0
- package/dist-local/client/assets/log-BNLmms1o.js +1 -0
- package/dist-local/client/assets/logo-Cluzi2Zq.js +1 -0
- package/dist-local/client/assets/lua-VoGSg0xb.js +1 -0
- package/dist-local/client/assets/luau-FMPmPwt6.js +1 -0
- package/dist-local/client/assets/make-Dixweg8N.js +1 -0
- package/dist-local/client/assets/markdown-BYOwaDjH.js +1 -0
- package/dist-local/client/assets/marko-E8KxKzjy.js +1 -0
- package/dist-local/client/assets/material-theme-Bm3Qr25_.js +1 -0
- package/dist-local/client/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/dist-local/client/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/dist-local/client/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/dist-local/client/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/dist-local/client/assets/matlab-D7qyCx1q.js +1 -0
- package/dist-local/client/assets/mdc-ytrN0-8H.js +1 -0
- package/dist-local/client/assets/mdx-DQZ5AkYe.js +1 -0
- package/dist-local/client/assets/mermaid-Bk4SNUv9.js +1 -0
- package/dist-local/client/assets/min-dark-BSWPekZh.js +1 -0
- package/dist-local/client/assets/min-light-DDpmG2fV.js +1 -0
- package/dist-local/client/assets/mipsasm-BMqwQI7S.js +1 -0
- package/dist-local/client/assets/mojo-BgCJLMeH.js +1 -0
- package/dist-local/client/assets/monokai-CdkpiU2Y.js +1 -0
- package/dist-local/client/assets/moonbit-CaWjb8XO.js +1 -0
- package/dist-local/client/assets/move-B1IS1UjX.js +1 -0
- package/dist-local/client/assets/narrat-_X_XdTYD.js +1 -0
- package/dist-local/client/assets/nextflow-BJtWHP5T.js +1 -0
- package/dist-local/client/assets/nextflow-groovy-DJMQeKeT.js +1 -0
- package/dist-local/client/assets/nginx-CgHaWcsO.js +1 -0
- package/dist-local/client/assets/night-owl-DhmEMT88.js +1 -0
- package/dist-local/client/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/dist-local/client/assets/nim-xKCzf2o0.js +1 -0
- package/dist-local/client/assets/nix-IvuFDN5E.js +1 -0
- package/dist-local/client/assets/nord-Cb4Vim4T.js +1 -0
- package/dist-local/client/assets/nushell-DcLAeLz5.js +1 -0
- package/dist-local/client/assets/objective-c-D1A_Heim.js +1 -0
- package/dist-local/client/assets/objective-cpp-BsSzOQcm.js +1 -0
- package/dist-local/client/assets/ocaml-O90oeIOV.js +1 -0
- package/dist-local/client/assets/odin-B1RWQWA5.js +1 -0
- package/dist-local/client/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/dist-local/client/assets/one-light-D7Lr4KcI.js +1 -0
- package/dist-local/client/assets/openscad-BUDT5pXO.js +1 -0
- package/dist-local/client/assets/pascal-4ZHwLPI5.js +1 -0
- package/dist-local/client/assets/perl-CAUsHq6V.js +1 -0
- package/dist-local/client/assets/php-Cn4rjz2P.js +1 -0
- package/dist-local/client/assets/pkl-ot-7Btpt.js +1 -0
- package/dist-local/client/assets/plastic-DQwYfKfQ.js +1 -0
- package/dist-local/client/assets/plsql-DGHpHOYJ.js +1 -0
- package/dist-local/client/assets/po-BiJDBrnU.js +1 -0
- package/dist-local/client/assets/poimandres-DRFjx7u4.js +1 -0
- package/dist-local/client/assets/polar-C7UOKdEL.js +1 -0
- package/dist-local/client/assets/postcss-BXeXVLqQ.js +1 -0
- package/dist-local/client/assets/powerquery-DNMTfnFr.js +1 -0
- package/dist-local/client/assets/powershell-DshXNtvi.js +1 -0
- package/dist-local/client/assets/prisma-BsRQq5mF.js +1 -0
- package/dist-local/client/assets/prolog-iXnhIJG7.js +1 -0
- package/dist-local/client/assets/proto-DB4EqR-F.js +1 -0
- package/dist-local/client/assets/pug-DD9HHTGS.js +1 -0
- package/dist-local/client/assets/puppet-CDv2pdJW.js +1 -0
- package/dist-local/client/assets/purescript-9MfHhQsQ.js +1 -0
- package/dist-local/client/assets/python-gzcpVVnB.js +1 -0
- package/dist-local/client/assets/qml-DcW_sT3t.js +1 -0
- package/dist-local/client/assets/qmldir-DCQb3MpD.js +1 -0
- package/dist-local/client/assets/qss-Fe1Jh2GI.js +1 -0
- package/dist-local/client/assets/r-D2d3McyU.js +1 -0
- package/dist-local/client/assets/racket-DcIDlBhZ.js +1 -0
- package/dist-local/client/assets/raku-B3gFvitq.js +1 -0
- package/dist-local/client/assets/razor-30Cugjh2.js +1 -0
- package/dist-local/client/assets/red-CJ3rzSJv.js +1 -0
- package/dist-local/client/assets/reg-CRGYupPL.js +1 -0
- package/dist-local/client/assets/regexp-Bu0flJgP.js +1 -0
- package/dist-local/client/assets/rel-BtDbiS_P.js +1 -0
- package/dist-local/client/assets/review-status-RAnd_eAC.js +43 -0
- package/dist-local/client/assets/reviews-core-BKrjFeCa.js +1 -0
- package/dist-local/client/assets/riscv-Ckw8ddFX.js +1 -0
- package/dist-local/client/assets/ron-VUp2lXgN.js +1 -0
- package/dist-local/client/assets/rose-pine-BthvhNj6.js +1 -0
- package/dist-local/client/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
- package/dist-local/client/assets/rose-pine-moon-hon4tzzS.js +1 -0
- package/dist-local/client/assets/rosmsg-CAekHB0j.js +1 -0
- package/dist-local/client/assets/routes-DhFdKFMi.js +12 -0
- package/dist-local/client/assets/rst-BIOjc2k6.js +1 -0
- package/dist-local/client/assets/ruby-BA7kcl5p.js +1 -0
- package/dist-local/client/assets/rust-Cfkwpbl8.js +1 -0
- package/dist-local/client/assets/sas-BHVT2N5I.js +1 -0
- package/dist-local/client/assets/sass-DXrisJhu.js +1 -0
- package/dist-local/client/assets/scala-DKOlJaKm.js +1 -0
- package/dist-local/client/assets/scheme-DQCgrYNe.js +1 -0
- package/dist-local/client/assets/scss-DdIrFDxD.js +1 -0
- package/dist-local/client/assets/sdbl-bTVj8UrX.js +1 -0
- package/dist-local/client/assets/shaderlab-TOUzSsQk.js +1 -0
- package/dist-local/client/assets/shellscript-BbTp1yjG.js +1 -0
- package/dist-local/client/assets/shellsession-BmAC8SMF.js +1 -0
- package/dist-local/client/assets/slack-dark-DnToyrRv.js +1 -0
- package/dist-local/client/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/dist-local/client/assets/smalltalk-B16xEiuN.js +1 -0
- package/dist-local/client/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/dist-local/client/assets/solarized-dark-DV17i1UV.js +1 -0
- package/dist-local/client/assets/solarized-light-DSh2HLQt.js +1 -0
- package/dist-local/client/assets/solidity-CKzVLygQ.js +1 -0
- package/dist-local/client/assets/soy-B5vCsGAN.js +1 -0
- package/dist-local/client/assets/sparql-D_iOobhT.js +1 -0
- package/dist-local/client/assets/splunk-BC2Px7Mm.js +1 -0
- package/dist-local/client/assets/sql-DCFvu5RM.js +1 -0
- package/dist-local/client/assets/ssh-config-BgfXC-Er.js +1 -0
- package/dist-local/client/assets/stata-h02h04e7.js +1 -0
- package/dist-local/client/assets/stylus-B6D30XZt.js +1 -0
- package/dist-local/client/assets/surrealql-DxccxuMd.js +1 -0
- package/dist-local/client/assets/svelte-CsxBlEum.js +1 -0
- package/dist-local/client/assets/swift-DonLKvLd.js +1 -0
- package/dist-local/client/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/dist-local/client/assets/system-verilog-DJ5XKQeo.js +1 -0
- package/dist-local/client/assets/systemd-BxMlprV5.js +1 -0
- package/dist-local/client/assets/talonscript-CohzipZa.js +1 -0
- package/dist-local/client/assets/tasl-DMoTqEGO.js +1 -0
- package/dist-local/client/assets/tcl-CZd0xW_V.js +1 -0
- package/dist-local/client/assets/templ-DmkwoHql.js +1 -0
- package/dist-local/client/assets/terraform-DswuEJGm.js +1 -0
- package/dist-local/client/assets/tex-B0f_hYr8.js +1 -0
- package/dist-local/client/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/dist-local/client/assets/toml-CcmNWLt0.js +1 -0
- package/dist-local/client/assets/ts-tags-CTs7_HT0.js +1 -0
- package/dist-local/client/assets/tsv-sltzmVWM.js +1 -0
- package/dist-local/client/assets/tsx-DFvk7AwW.js +1 -0
- package/dist-local/client/assets/turtle-ByJddavk.js +1 -0
- package/dist-local/client/assets/twig-DgtEA5Er.js +1 -0
- package/dist-local/client/assets/typescript-DHTLvXzV.js +1 -0
- package/dist-local/client/assets/typespec-BRdr0IET.js +1 -0
- package/dist-local/client/assets/typst-DI99ib-x.js +1 -0
- package/dist-local/client/assets/v-DETTlOr0.js +1 -0
- package/dist-local/client/assets/vala-zf12oZj6.js +1 -0
- package/dist-local/client/assets/vb-Djn5o6TS.js +1 -0
- package/dist-local/client/assets/verilog-CiiDBU1e.js +1 -0
- package/dist-local/client/assets/vesper-DdrHHSXu.js +1 -0
- package/dist-local/client/assets/vhdl-BroJfC0k.js +1 -0
- package/dist-local/client/assets/viml-DvXPmvsu.js +1 -0
- package/dist-local/client/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/dist-local/client/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/dist-local/client/assets/vitesse-light-VbXTXTou.js +1 -0
- package/dist-local/client/assets/vue-CUpaeZ-j.js +1 -0
- package/dist-local/client/assets/vue-html-DQch_7VQ.js +1 -0
- package/dist-local/client/assets/vue-vine-BCPDker4.js +1 -0
- package/dist-local/client/assets/vyper-CgoNMtux.js +1 -0
- package/dist-local/client/assets/wasm-BnjxR4X6.js +1 -0
- package/dist-local/client/assets/wasm-ByWQv1Qj.js +1 -0
- package/dist-local/client/assets/wenyan-C8pVoKbM.js +1 -0
- package/dist-local/client/assets/wgsl-BsKzXJz4.js +1 -0
- package/dist-local/client/assets/wikitext-ClFFjSW2.js +1 -0
- package/dist-local/client/assets/wit-DdvCle-K.js +1 -0
- package/dist-local/client/assets/wolfram-DLL8P-h_.js +1 -0
- package/dist-local/client/assets/xml-C33zriiW.js +1 -0
- package/dist-local/client/assets/xsl-BFS2wyMt.js +1 -0
- package/dist-local/client/assets/yaml-w0rMsuN4.js +1 -0
- package/dist-local/client/assets/zenscript-BnlCZFoB.js +1 -0
- package/dist-local/client/assets/zig-CMLA9XwU.js +1 -0
- package/dist-local/client/favicon-16x16.png +0 -0
- package/dist-local/client/favicon-32x32.png +0 -0
- package/dist-local/client/favicon.ico +0 -0
- package/dist-local/client/logo.png +0 -0
- package/dist-local/client/og.png +0 -0
- package/dist-local/client/og.svg +46 -0
- package/dist-local/client/robots.txt +4 -0
- package/dist-local/client/site.webmanifest +11 -0
- package/dist-local/client/sitemap.xml +13 -0
- package/dist-local/server/assets/__root-DimVnCpV.js +17 -0
- package/dist-local/server/assets/_tanstack-start-manifest_v-CNDxZb5c.js +56 -0
- package/dist-local/server/assets/auth-CtuIV0ur.js +40490 -0
- package/dist-local/server/assets/board._owner._repo-BgLMPzjG.js +832 -0
- package/dist-local/server/assets/board._owner._repo-BxCYRjn3.js +25 -0
- package/dist-local/server/assets/board._owner._repo-WPs_mhzX.js +128 -0
- package/dist-local/server/assets/bun-sqlite-dialect-BW9W1_Ps-C3nGW4Q3.js +163 -0
- package/dist-local/server/assets/core-RrmWoKne.js +5 -0
- package/dist-local/server/assets/createServerRpc-CpE5MlHa.js +12 -0
- package/dist-local/server/assets/d1-sqlite-dialect-BLC8LXE6-DXI0R5Oj.js +112 -0
- package/dist-local/server/assets/default-query-compiler-PEcjLdrv.js +1719 -0
- package/dist-local/server/assets/dist-CMO4nMbf.js +342 -0
- package/dist-local/server/assets/empty-plugin-adapters-CrnNP3b2.js +5 -0
- package/dist-local/server/assets/env-impl-DoaQIVbP.js +297 -0
- package/dist-local/server/assets/gemini-DkmTawm4.js +514 -0
- package/dist-local/server/assets/github-cUIlMgs7.js +251 -0
- package/dist-local/server/assets/guide--QQ0qbuz.js +534 -0
- package/dist-local/server/assets/guide-DZLtOn4o.js +49 -0
- package/dist-local/server/assets/kysely-adapter-RaEPPBf_.js +2 -0
- package/dist-local/server/assets/kysely-migration-tables-JkVUjPF_-DAJvukps.js +19 -0
- package/dist-local/server/assets/local-fs-BDgGK9ve.js +61 -0
- package/dist-local/server/assets/node-sqlite-dialect-COyVl62m.js +163 -0
- package/dist-local/server/assets/review-status-CdlhgE_Y.js +1501 -0
- package/dist-local/server/assets/reviews-BOK_eOYa.js +194 -0
- package/dist-local/server/assets/router-CaG3M3Zu.js +188 -0
- package/dist-local/server/assets/routes-BBbg2JyL.js +1036 -0
- package/dist-local/server/assets/routes-BlJSk7OV.js +27 -0
- package/dist-local/server/assets/skeleton-Cpl83ip3.js +93 -0
- package/dist-local/server/assets/start-BJllm2D8.js +4 -0
- package/dist-local/server/server.js +5778 -0
- package/package.json +62 -0
- package/server.mjs +160 -0
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
import { a as REVIEW_COLUMNS } from "./github-cUIlMgs7.js";
|
|
2
|
+
import { s as cn } from "./skeleton-Cpl83ip3.js";
|
|
3
|
+
import { a as TooltipTrigger, n as Tooltip, r as TooltipContent, t as Route } from "./guide-DZLtOn4o.js";
|
|
4
|
+
import { n as AppShell, t as STATUS_META } from "./review-status-CdlhgE_Y.js";
|
|
5
|
+
import { a as CodexLight, h as SiteHeader, i as CodexDark, l as CardContent, m as GitHubLoginButton, n as CursorDark, o as ClaudeAiIcon, r as CursorLight, s as Card, t as Gemini } from "./gemini-DkmTawm4.js";
|
|
6
|
+
import { useEffect, useState } from "react";
|
|
7
|
+
import { Link } from "@tanstack/react-router";
|
|
8
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { HugeiconsIcon } from "@hugeicons/react";
|
|
10
|
+
import { ArrowLeft01Icon, ArrowRight01Icon, Copy01Icon, FileDownloadIcon, FileEditIcon, Folder01Icon, Rocket01Icon, Tick02Icon } from "@hugeicons/core-free-icons";
|
|
11
|
+
//#region ../../packages/shared/src/content/agents-template.ts
|
|
12
|
+
var AGENTS_TEMPLATE = `# Instructions for AI agents
|
|
13
|
+
|
|
14
|
+
These guidelines define how AI agents (Claude Code, Codex, Cursor, …) should work
|
|
15
|
+
on this repository. Follow them for code-related tasks while respecting the user's
|
|
16
|
+
latest explicit instructions.
|
|
17
|
+
|
|
18
|
+
**Conflict order:** the user's latest explicit request wins, then the most specific
|
|
19
|
+
local repository instruction, then these general rules.
|
|
20
|
+
|
|
21
|
+
## Where artifacts go
|
|
22
|
+
|
|
23
|
+
All agent working files live under \`.agents/\`. Use \`YYYY-MM-DD\` for every dated
|
|
24
|
+
filename so it sorts chronologically.
|
|
25
|
+
|
|
26
|
+
| Artifact | Path | When to write it |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| Plan | \`.agents/todo.md\` | Before any substantial edit (3–5 concrete steps). |
|
|
29
|
+
| Review checklist | \`.agents/reviews/<status>/YYYY-MM-DD-<slug>.md\` | Behavior-changing work with real design decisions. |
|
|
30
|
+
| Lesson | \`.agents/lessons/YYYY-MM-DD/<slug>.md\` | After a durable correction likely to recur. |
|
|
31
|
+
| Bug report | \`.agents/bugs/YYYY-MM-DD/<slug>.md\` | Ambiguous / recurring / production-impacting bug. |
|
|
32
|
+
|
|
33
|
+
For **read-only requests** (review, translation, explanation), do not create, edit,
|
|
34
|
+
or delete these files unless the user explicitly authorizes it.
|
|
35
|
+
|
|
36
|
+
## Review gate
|
|
37
|
+
|
|
38
|
+
Before implementing behavior-changing work, write a review checklist to
|
|
39
|
+
\`.agents/reviews/<status>/YYYY-MM-DD-<slug>.md\` and wait for the user to check every
|
|
40
|
+
box. **Implementation starts ONLY after all items are \`[x]\`.**
|
|
41
|
+
|
|
42
|
+
Reviews are bucketed by **status** (the folder), not by date:
|
|
43
|
+
|
|
44
|
+
| status | meaning |
|
|
45
|
+
| --- | --- |
|
|
46
|
+
| \`todo\` | Plan written, boxes not all checked — awaiting review. New checklists start here. |
|
|
47
|
+
| \`processing\` | Approved (all gating boxes \`[x]\`) and being implemented. |
|
|
48
|
+
| \`done\` | Shipped and verified. |
|
|
49
|
+
| \`dropped\` | Superseded or abandoned. |
|
|
50
|
+
|
|
51
|
+
**Lifecycle:** create in \`todo/\` → move to \`processing/\` when approved → move to
|
|
52
|
+
\`done/\` once shipped (or \`dropped/\`). Moving a file is a plain rename — keep the
|
|
53
|
+
\`YYYY-MM-DD-<slug>.md\` name so it still sorts. The creation date never changes.
|
|
54
|
+
|
|
55
|
+
### Checklist frontmatter
|
|
56
|
+
|
|
57
|
+
Start each file with a YAML frontmatter block, then a \`# Review: …\` heading:
|
|
58
|
+
|
|
59
|
+
\`\`\`yaml
|
|
60
|
+
---
|
|
61
|
+
assignees: ["your-github-login"]
|
|
62
|
+
created_at: YYYY-MM-DD 00:00:00Z # the filename date
|
|
63
|
+
priority: medium # low | medium | high
|
|
64
|
+
tags: ["area-a", "area-b"] # your own controlled vocabulary
|
|
65
|
+
---
|
|
66
|
+
\`\`\`
|
|
67
|
+
|
|
68
|
+
Do **not** add a \`status:\` field — the folder encodes it. After the frontmatter,
|
|
69
|
+
add a "How to review" note (the user flips \`- [ ]\` to \`- [x]\` per item and writes
|
|
70
|
+
\`> notes\` under items they disagree with), group items by topic, include a Context
|
|
71
|
+
section, an explicit **out of scope** section, and a **files touched** table.
|
|
72
|
+
Mutually-exclusive options appear as separate "pick ONE" boxes with a recommendation.
|
|
73
|
+
If the user edits the checklist directly, treat their edits as decisions.
|
|
74
|
+
|
|
75
|
+
> The Kanban board reads exactly these signals: the **column** from the folder, and
|
|
76
|
+
> **date / priority / assignees / tags / progress** from the frontmatter + the
|
|
77
|
+
> \`- [ ]\` / \`- [x]\` checkboxes.
|
|
78
|
+
|
|
79
|
+
## Workflow
|
|
80
|
+
|
|
81
|
+
1. **Clarify & plan** — write \`.agents/todo.md\` (3–5 steps) before substantial edits; ask when ambiguous.
|
|
82
|
+
2. **Review gate** — for behavior-changing work with real design decisions (above).
|
|
83
|
+
3. **Subagents** — offload bounded research/exploration; keep the critical path in the main agent.
|
|
84
|
+
4. **Self-improvement** — record durable corrections in \`.agents/lessons/…\`.
|
|
85
|
+
5. **Verify before done** — never mark complete without proving it works; report changed files, verification result, and remaining risk; end with a "What's next for you" handoff.
|
|
86
|
+
6. **Demand elegance, balanced** — smallest correct change that fits the project style; don't over-engineer.
|
|
87
|
+
7. **Bug reports before fixes** — for ambiguous / recurring / production bugs, write \`.agents/bugs/…\` first and confirm before editing code.
|
|
88
|
+
|
|
89
|
+
## Gotchas
|
|
90
|
+
|
|
91
|
+
- Don't start edits without \`.agents/todo.md\`.
|
|
92
|
+
- Don't declare test failures "pre-existing" without proof (diff against the original).
|
|
93
|
+
- Don't implement full scope on a vague "ok" — confirm the exact scope first.
|
|
94
|
+
- Implement in reviewable chunks; pause for review between them.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
<!-- Add your project-specific Domain Rules and Gotchas below this line. -->
|
|
99
|
+
`;
|
|
100
|
+
var EXAMPLE_REVIEW = `---
|
|
101
|
+
assignees: ["your-github-login"]
|
|
102
|
+
created_at: 2026-06-21 00:00:00Z
|
|
103
|
+
priority: high
|
|
104
|
+
tags: ["auth", "api"]
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
# Review: Add rate limiting to the public API
|
|
108
|
+
|
|
109
|
+
**How to review:** flip \`- [ ]\` to \`- [x]\` for each item you agree with. Under any
|
|
110
|
+
item you disagree with, add a \`> ...\` note. I implement only after every box is \`[x]\`.
|
|
111
|
+
|
|
112
|
+
## Context (what exists)
|
|
113
|
+
- Current endpoints, no limits, token-based auth…
|
|
114
|
+
|
|
115
|
+
## Decisions
|
|
116
|
+
- [ ] **D1.** Limit to 100 requests/min per token (sliding window).
|
|
117
|
+
- [ ] **D2.** Respond with \`429\` + a \`Retry-After\` header when exceeded.
|
|
118
|
+
|
|
119
|
+
## Out of scope
|
|
120
|
+
- Per-route custom limits, billing-tier quotas.
|
|
121
|
+
|
|
122
|
+
## Files touched
|
|
123
|
+
| File | Change |
|
|
124
|
+
| --- | --- |
|
|
125
|
+
| \`src/...\` | … |
|
|
126
|
+
`;
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region ../../packages/shared/src/routes/guide.tsx?tsr-split=component
|
|
129
|
+
function GuidePage() {
|
|
130
|
+
const { user } = Route.useLoaderData();
|
|
131
|
+
if (user) return /* @__PURE__ */ jsxs(AppShell, {
|
|
132
|
+
user,
|
|
133
|
+
children: [/* @__PURE__ */ jsx(GuideHeader, {}), /* @__PURE__ */ jsx("div", {
|
|
134
|
+
className: "min-h-0 flex-1 overflow-y-auto",
|
|
135
|
+
children: /* @__PURE__ */ jsx(GuideBody, {})
|
|
136
|
+
})]
|
|
137
|
+
});
|
|
138
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
139
|
+
className: "min-h-screen overflow-y-auto",
|
|
140
|
+
children: [/* @__PURE__ */ jsx(SiteHeader, { actions: /* @__PURE__ */ jsx(GitHubLoginButton, {
|
|
141
|
+
size: "sm",
|
|
142
|
+
children: "Continue with GitHub"
|
|
143
|
+
}) }), /* @__PURE__ */ jsx("div", {
|
|
144
|
+
className: "pt-16",
|
|
145
|
+
children: /* @__PURE__ */ jsx(GuideBody, {})
|
|
146
|
+
})]
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
function GuideHeader() {
|
|
150
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
151
|
+
className: "px-6 pt-5 pb-4",
|
|
152
|
+
children: [
|
|
153
|
+
/* @__PURE__ */ jsxs(Link, {
|
|
154
|
+
to: "/",
|
|
155
|
+
className: "mb-3 inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",
|
|
156
|
+
children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
|
|
157
|
+
icon: ArrowLeft01Icon,
|
|
158
|
+
className: "size-4"
|
|
159
|
+
}), "Back to board"]
|
|
160
|
+
}),
|
|
161
|
+
/* @__PURE__ */ jsx("div", {
|
|
162
|
+
className: "text-sm text-muted-foreground",
|
|
163
|
+
children: "Documentation"
|
|
164
|
+
}),
|
|
165
|
+
/* @__PURE__ */ jsx("h1", {
|
|
166
|
+
className: "mt-1 font-heading text-2xl font-semibold tracking-tight",
|
|
167
|
+
children: "How to use"
|
|
168
|
+
})
|
|
169
|
+
]
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function GuideBody() {
|
|
173
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
174
|
+
className: "mx-auto w-full max-w-3xl animate-in space-y-10 px-6 py-8 fade-in duration-500 motion-reduce:animate-none",
|
|
175
|
+
children: [
|
|
176
|
+
/* @__PURE__ */ jsxs("section", {
|
|
177
|
+
className: "space-y-3",
|
|
178
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
179
|
+
className: "font-heading text-xl font-semibold",
|
|
180
|
+
children: "Turn agent reviews into a board"
|
|
181
|
+
}), /* @__PURE__ */ jsxs("p", {
|
|
182
|
+
className: "text-sm leading-relaxed text-muted-foreground",
|
|
183
|
+
children: [
|
|
184
|
+
"This app visualizes the",
|
|
185
|
+
" ",
|
|
186
|
+
/* @__PURE__ */ jsx("code", {
|
|
187
|
+
className: "rounded bg-muted px-1.5 py-0.5 text-xs",
|
|
188
|
+
children: ".agents/reviews"
|
|
189
|
+
}),
|
|
190
|
+
" folder of a GitHub repo. Your coding agent — Claude Code, Codex, Cursor, … — writes a review checklist per piece of work; the board groups them into columns and reads their metadata. Set it up once by adding an instructions file to your repo."
|
|
191
|
+
]
|
|
192
|
+
})]
|
|
193
|
+
}),
|
|
194
|
+
/* @__PURE__ */ jsxs("section", {
|
|
195
|
+
className: "space-y-3",
|
|
196
|
+
children: [/* @__PURE__ */ jsx(SectionTitle, {
|
|
197
|
+
icon: Folder01Icon,
|
|
198
|
+
children: "How files map to the board"
|
|
199
|
+
}), /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, {
|
|
200
|
+
className: "space-y-4 pt-6 text-sm",
|
|
201
|
+
children: [
|
|
202
|
+
/* @__PURE__ */ jsx("p", {
|
|
203
|
+
className: "font-mono text-xs text-muted-foreground",
|
|
204
|
+
children: ".agents/reviews/"
|
|
205
|
+
}),
|
|
206
|
+
/* @__PURE__ */ jsx("div", {
|
|
207
|
+
className: "flex flex-col gap-2",
|
|
208
|
+
children: REVIEW_COLUMNS.map((col) => {
|
|
209
|
+
const m = STATUS_META[col];
|
|
210
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
211
|
+
className: "flex items-center gap-3",
|
|
212
|
+
children: [
|
|
213
|
+
/* @__PURE__ */ jsxs("code", {
|
|
214
|
+
className: "w-28 font-mono text-xs text-foreground",
|
|
215
|
+
children: [col, "/"]
|
|
216
|
+
}),
|
|
217
|
+
/* @__PURE__ */ jsx(HugeiconsIcon, {
|
|
218
|
+
icon: ArrowRight01Icon,
|
|
219
|
+
className: "size-4 text-muted-foreground"
|
|
220
|
+
}),
|
|
221
|
+
/* @__PURE__ */ jsxs("span", {
|
|
222
|
+
className: "inline-flex items-center gap-1.5 rounded-full bg-muted px-2.5 py-1 text-xs font-medium",
|
|
223
|
+
children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
|
|
224
|
+
icon: m.icon,
|
|
225
|
+
className: cn("size-3.5", m.color)
|
|
226
|
+
}), m.label]
|
|
227
|
+
})
|
|
228
|
+
]
|
|
229
|
+
}, col);
|
|
230
|
+
})
|
|
231
|
+
}),
|
|
232
|
+
/* @__PURE__ */ jsxs("p", {
|
|
233
|
+
className: "text-muted-foreground",
|
|
234
|
+
children: [
|
|
235
|
+
"Each card reads its ",
|
|
236
|
+
/* @__PURE__ */ jsx("strong", { children: "column" }),
|
|
237
|
+
" from the folder, and",
|
|
238
|
+
" ",
|
|
239
|
+
/* @__PURE__ */ jsx("strong", { children: "date · priority · assignees · tags · progress" }),
|
|
240
|
+
" from the file's YAML frontmatter plus its ",
|
|
241
|
+
/* @__PURE__ */ jsx("code", {
|
|
242
|
+
className: "rounded bg-muted px-1 py-0.5 text-xs",
|
|
243
|
+
children: "- [ ]"
|
|
244
|
+
}),
|
|
245
|
+
" ",
|
|
246
|
+
"/ ",
|
|
247
|
+
/* @__PURE__ */ jsx("code", {
|
|
248
|
+
className: "rounded bg-muted px-1 py-0.5 text-xs",
|
|
249
|
+
children: "- [x]"
|
|
250
|
+
}),
|
|
251
|
+
" checkboxes."
|
|
252
|
+
]
|
|
253
|
+
})
|
|
254
|
+
]
|
|
255
|
+
}) })]
|
|
256
|
+
}),
|
|
257
|
+
/* @__PURE__ */ jsxs("section", {
|
|
258
|
+
className: "space-y-4",
|
|
259
|
+
children: [
|
|
260
|
+
/* @__PURE__ */ jsx(SectionTitle, {
|
|
261
|
+
icon: Rocket01Icon,
|
|
262
|
+
children: "Set it up"
|
|
263
|
+
}),
|
|
264
|
+
/* @__PURE__ */ jsxs(Step, {
|
|
265
|
+
n: 1,
|
|
266
|
+
title: "Add an instructions file to your repo",
|
|
267
|
+
children: [/* @__PURE__ */ jsxs("p", {
|
|
268
|
+
className: "text-sm text-muted-foreground",
|
|
269
|
+
children: [/* @__PURE__ */ jsx("code", {
|
|
270
|
+
className: "rounded bg-muted px-1.5 py-0.5 text-xs",
|
|
271
|
+
children: "AGENTS.md"
|
|
272
|
+
}), " is the cross-tool standard. Drop it at your repo root — most agents pick it up automatically."]
|
|
273
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
274
|
+
className: "mt-4 grid gap-3 sm:grid-cols-2",
|
|
275
|
+
children: [
|
|
276
|
+
/* @__PURE__ */ jsx(ToolRow, {
|
|
277
|
+
index: 0,
|
|
278
|
+
icon: /* @__PURE__ */ jsx(ClaudeAiIcon, { className: "size-5" }),
|
|
279
|
+
tool: "Claude Code",
|
|
280
|
+
file: "CLAUDE.md or AGENTS.md"
|
|
281
|
+
}),
|
|
282
|
+
/* @__PURE__ */ jsx(ToolRow, {
|
|
283
|
+
index: 1,
|
|
284
|
+
icon: /* @__PURE__ */ jsx(ThemedIcon, {
|
|
285
|
+
Light: CodexLight,
|
|
286
|
+
Dark: CodexDark
|
|
287
|
+
}),
|
|
288
|
+
tool: "OpenAI Codex",
|
|
289
|
+
file: "AGENTS.md"
|
|
290
|
+
}),
|
|
291
|
+
/* @__PURE__ */ jsx(ToolRow, {
|
|
292
|
+
index: 2,
|
|
293
|
+
icon: /* @__PURE__ */ jsx(ThemedIcon, {
|
|
294
|
+
Light: CursorLight,
|
|
295
|
+
Dark: CursorDark
|
|
296
|
+
}),
|
|
297
|
+
tool: "Cursor",
|
|
298
|
+
file: "AGENTS.md / .cursor/rules"
|
|
299
|
+
}),
|
|
300
|
+
/* @__PURE__ */ jsx(ToolRow, {
|
|
301
|
+
index: 3,
|
|
302
|
+
icon: /* @__PURE__ */ jsx(Gemini, { className: "size-5" }),
|
|
303
|
+
tool: "Gemini CLI & others",
|
|
304
|
+
file: "AGENTS.md / GEMINI.md"
|
|
305
|
+
})
|
|
306
|
+
]
|
|
307
|
+
})]
|
|
308
|
+
}),
|
|
309
|
+
/* @__PURE__ */ jsxs(Step, {
|
|
310
|
+
n: 2,
|
|
311
|
+
title: "Paste this standardized template",
|
|
312
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
313
|
+
className: "mb-3 text-sm text-muted-foreground",
|
|
314
|
+
children: "Project-agnostic. Add your own Domain Rules & Gotchas below the marked line, and swap in your own tag vocabulary."
|
|
315
|
+
}), /* @__PURE__ */ jsx(CodeBlock, {
|
|
316
|
+
code: AGENTS_TEMPLATE,
|
|
317
|
+
filename: "AGENTS.md",
|
|
318
|
+
icon: /* @__PURE__ */ jsx(ClaudeAiIcon, { className: "size-5" })
|
|
319
|
+
})]
|
|
320
|
+
}),
|
|
321
|
+
/* @__PURE__ */ jsx(Step, {
|
|
322
|
+
n: 3,
|
|
323
|
+
title: "Let the agent write a review",
|
|
324
|
+
children: /* @__PURE__ */ jsxs("p", {
|
|
325
|
+
className: "text-sm text-muted-foreground",
|
|
326
|
+
children: [
|
|
327
|
+
"Ask your agent to plan a behavior-changing task. Following the rules above, it writes a checklist to",
|
|
328
|
+
" ",
|
|
329
|
+
/* @__PURE__ */ jsx("code", {
|
|
330
|
+
className: "rounded bg-muted px-1.5 py-0.5 text-xs",
|
|
331
|
+
children: ".agents/reviews/todo/YYYY-MM-DD-<slug>.md"
|
|
332
|
+
}),
|
|
333
|
+
". You approve by flipping every ",
|
|
334
|
+
/* @__PURE__ */ jsx("code", {
|
|
335
|
+
className: "rounded bg-muted px-1 py-0.5 text-xs",
|
|
336
|
+
children: "- [ ]"
|
|
337
|
+
}),
|
|
338
|
+
" ",
|
|
339
|
+
"to ",
|
|
340
|
+
/* @__PURE__ */ jsx("code", {
|
|
341
|
+
className: "rounded bg-muted px-1 py-0.5 text-xs",
|
|
342
|
+
children: "- [x]"
|
|
343
|
+
}),
|
|
344
|
+
"; it then moves the file to ",
|
|
345
|
+
/* @__PURE__ */ jsx("code", {
|
|
346
|
+
className: "rounded bg-muted px-1 py-0.5 text-xs",
|
|
347
|
+
children: "processing/"
|
|
348
|
+
}),
|
|
349
|
+
/* @__PURE__ */ jsx(HugeiconsIcon, {
|
|
350
|
+
icon: ArrowRight01Icon,
|
|
351
|
+
className: "mx-1 inline size-3.5 align-[-0.2em]"
|
|
352
|
+
}),
|
|
353
|
+
/* @__PURE__ */ jsx("code", {
|
|
354
|
+
className: "rounded bg-muted px-1 py-0.5 text-xs",
|
|
355
|
+
children: "done/"
|
|
356
|
+
}),
|
|
357
|
+
"."
|
|
358
|
+
]
|
|
359
|
+
})
|
|
360
|
+
}),
|
|
361
|
+
/* @__PURE__ */ jsx(Step, {
|
|
362
|
+
n: 4,
|
|
363
|
+
title: "Open the repo here",
|
|
364
|
+
children: /* @__PURE__ */ jsxs("p", {
|
|
365
|
+
className: "text-sm text-muted-foreground",
|
|
366
|
+
children: [
|
|
367
|
+
"Use the repo switcher (top-left) or the",
|
|
368
|
+
" ",
|
|
369
|
+
/* @__PURE__ */ jsx(Link, {
|
|
370
|
+
to: "/",
|
|
371
|
+
className: "underline underline-offset-2 hover:text-foreground",
|
|
372
|
+
children: "projects page"
|
|
373
|
+
}),
|
|
374
|
+
" ",
|
|
375
|
+
"to open the board. Cards appear as the agent creates and moves review files."
|
|
376
|
+
]
|
|
377
|
+
})
|
|
378
|
+
})
|
|
379
|
+
]
|
|
380
|
+
}),
|
|
381
|
+
/* @__PURE__ */ jsxs("section", {
|
|
382
|
+
className: "space-y-3",
|
|
383
|
+
children: [/* @__PURE__ */ jsx(SectionTitle, {
|
|
384
|
+
icon: FileEditIcon,
|
|
385
|
+
children: "Example review file"
|
|
386
|
+
}), /* @__PURE__ */ jsx(CodeBlock, {
|
|
387
|
+
code: EXAMPLE_REVIEW,
|
|
388
|
+
filename: "2026-06-21-rate-limiting.md"
|
|
389
|
+
})]
|
|
390
|
+
})
|
|
391
|
+
]
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
function SectionTitle({ icon, children }) {
|
|
395
|
+
return /* @__PURE__ */ jsxs("h2", {
|
|
396
|
+
className: "flex items-center gap-2 font-heading text-lg font-semibold",
|
|
397
|
+
children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
|
|
398
|
+
icon,
|
|
399
|
+
className: "size-5 text-primary"
|
|
400
|
+
}), children]
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
function Step({ n, title, children }) {
|
|
404
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
405
|
+
className: "flex gap-3",
|
|
406
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
407
|
+
className: "mt-0.5 grid size-6 shrink-0 place-items-center rounded-full bg-primary text-xs font-semibold text-primary-foreground",
|
|
408
|
+
children: n
|
|
409
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
410
|
+
className: "min-w-0 flex-1",
|
|
411
|
+
children: [/* @__PURE__ */ jsx("h3", {
|
|
412
|
+
className: "font-medium",
|
|
413
|
+
children: title
|
|
414
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
415
|
+
className: "mt-1",
|
|
416
|
+
children
|
|
417
|
+
})]
|
|
418
|
+
})]
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
function ToolRow({ icon, tool, file, index = 0 }) {
|
|
422
|
+
return /* @__PURE__ */ jsxs(Card, {
|
|
423
|
+
size: "sm",
|
|
424
|
+
style: { animationDelay: `${index * 60}ms` },
|
|
425
|
+
className: "group relative animate-in gap-0 overflow-hidden p-4 fade-in slide-in-from-bottom-2 fill-mode-both duration-500 ease-out transition-[box-shadow,transform,--tw-ring-color] hover:-translate-y-0.5 hover:shadow-md hover:ring-foreground/20 motion-reduce:animate-none",
|
|
426
|
+
children: [/* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute -right-8 -top-8 size-20 rounded-full bg-primary/10 opacity-0 blur-2xl transition-opacity duration-300 group-hover:opacity-100" }), /* @__PURE__ */ jsxs("div", {
|
|
427
|
+
className: "flex items-center gap-3",
|
|
428
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
429
|
+
className: "grid size-10 shrink-0 place-items-center rounded-xl bg-gradient-to-b from-background to-muted ring-1 ring-foreground/10 transition-transform duration-200 group-hover:scale-105",
|
|
430
|
+
children: icon
|
|
431
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
432
|
+
className: "min-w-0 flex-1",
|
|
433
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
434
|
+
className: "truncate text-sm font-medium",
|
|
435
|
+
children: tool
|
|
436
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
437
|
+
className: "mt-1 inline-flex max-w-full items-center gap-1.5 rounded-md bg-muted px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground",
|
|
438
|
+
children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
|
|
439
|
+
icon: FileEditIcon,
|
|
440
|
+
className: "size-3 shrink-0"
|
|
441
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
442
|
+
className: "truncate",
|
|
443
|
+
children: file
|
|
444
|
+
})]
|
|
445
|
+
})]
|
|
446
|
+
})]
|
|
447
|
+
})]
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
function ThemedIcon({ Light, Dark }) {
|
|
451
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Light, { className: "size-5 dark:hidden" }), /* @__PURE__ */ jsx(Dark, { className: "hidden size-5 dark:block" })] });
|
|
452
|
+
}
|
|
453
|
+
function CodeBlock({ code, filename, lang = "markdown", icon }) {
|
|
454
|
+
const [copied, setCopied] = useState(false);
|
|
455
|
+
const [html, setHtml] = useState(null);
|
|
456
|
+
useEffect(() => {
|
|
457
|
+
let active = true;
|
|
458
|
+
import("shiki").then(({ codeToHtml }) => codeToHtml(code, {
|
|
459
|
+
lang,
|
|
460
|
+
themes: {
|
|
461
|
+
light: "github-light",
|
|
462
|
+
dark: "github-dark"
|
|
463
|
+
}
|
|
464
|
+
})).then((out) => active && setHtml(out)).catch(() => active && setHtml(null));
|
|
465
|
+
return () => {
|
|
466
|
+
active = false;
|
|
467
|
+
};
|
|
468
|
+
}, [code, lang]);
|
|
469
|
+
const ext = filename.split(".").pop()?.toUpperCase() ?? "TXT";
|
|
470
|
+
function copy() {
|
|
471
|
+
navigator.clipboard.writeText(code).then(() => {
|
|
472
|
+
setCopied(true);
|
|
473
|
+
setTimeout(() => setCopied(false), 1500);
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
function download() {
|
|
477
|
+
const url = URL.createObjectURL(new Blob([code], { type: "text/plain;charset=utf-8" }));
|
|
478
|
+
const a = document.createElement("a");
|
|
479
|
+
a.href = url;
|
|
480
|
+
a.download = filename;
|
|
481
|
+
a.click();
|
|
482
|
+
URL.revokeObjectURL(url);
|
|
483
|
+
}
|
|
484
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
485
|
+
className: "overflow-hidden rounded-xl border bg-card",
|
|
486
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
487
|
+
className: "flex items-center justify-between gap-2 border-b bg-muted/40 px-3 py-2",
|
|
488
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
489
|
+
className: "flex min-w-0 items-center gap-2",
|
|
490
|
+
children: [icon ? /* @__PURE__ */ jsx("span", {
|
|
491
|
+
className: "grid size-5 shrink-0 place-items-center",
|
|
492
|
+
children: icon
|
|
493
|
+
}) : /* @__PURE__ */ jsx("span", {
|
|
494
|
+
className: "grid size-5 shrink-0 place-items-center rounded bg-foreground/85 font-mono text-[9px] font-bold text-background",
|
|
495
|
+
children: ext
|
|
496
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
497
|
+
className: "truncate font-mono text-xs text-muted-foreground",
|
|
498
|
+
children: filename
|
|
499
|
+
})]
|
|
500
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
501
|
+
className: "flex items-center gap-0.5",
|
|
502
|
+
children: [/* @__PURE__ */ jsx(CodeAction, {
|
|
503
|
+
onClick: download,
|
|
504
|
+
icon: FileDownloadIcon,
|
|
505
|
+
label: "Download"
|
|
506
|
+
}), /* @__PURE__ */ jsx(CodeAction, {
|
|
507
|
+
onClick: copy,
|
|
508
|
+
icon: copied ? Tick02Icon : Copy01Icon,
|
|
509
|
+
label: copied ? "Copied" : "Copy"
|
|
510
|
+
})]
|
|
511
|
+
})]
|
|
512
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
513
|
+
className: "shiki-block max-h-[460px] overflow-auto",
|
|
514
|
+
children: html ? /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: html } }) : /* @__PURE__ */ jsx("pre", {
|
|
515
|
+
className: "m-0 p-4 font-mono text-xs leading-relaxed text-foreground",
|
|
516
|
+
children: code
|
|
517
|
+
})
|
|
518
|
+
})]
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
function CodeAction({ onClick, icon, label }) {
|
|
522
|
+
return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx("button", {
|
|
523
|
+
type: "button",
|
|
524
|
+
onClick,
|
|
525
|
+
"aria-label": label,
|
|
526
|
+
className: "grid size-7 place-items-center rounded-md text-muted-foreground transition-colors hover:bg-foreground/10 hover:text-foreground",
|
|
527
|
+
children: /* @__PURE__ */ jsx(HugeiconsIcon, {
|
|
528
|
+
icon,
|
|
529
|
+
className: "size-4"
|
|
530
|
+
})
|
|
531
|
+
}) }), /* @__PURE__ */ jsx(TooltipContent, { children: label })] });
|
|
532
|
+
}
|
|
533
|
+
//#endregion
|
|
534
|
+
export { GuidePage as component };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { o as getSessionUser, s as cn } from "./skeleton-Cpl83ip3.js";
|
|
2
|
+
import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { Tooltip } from "@base-ui/react/tooltip";
|
|
5
|
+
//#region ../../packages/shared/src/components/ui/tooltip.tsx
|
|
6
|
+
function TooltipProvider({ delay = 0, ...props }) {
|
|
7
|
+
return /* @__PURE__ */ jsx(Tooltip.Provider, {
|
|
8
|
+
"data-slot": "tooltip-provider",
|
|
9
|
+
delay,
|
|
10
|
+
...props
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function Tooltip$1({ ...props }) {
|
|
14
|
+
return /* @__PURE__ */ jsx(Tooltip.Root, {
|
|
15
|
+
"data-slot": "tooltip",
|
|
16
|
+
...props
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function TooltipTrigger({ ...props }) {
|
|
20
|
+
return /* @__PURE__ */ jsx(Tooltip.Trigger, {
|
|
21
|
+
"data-slot": "tooltip-trigger",
|
|
22
|
+
...props
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function TooltipContent({ className, side = "top", sideOffset = 4, align = "center", alignOffset = 0, children, ...props }) {
|
|
26
|
+
return /* @__PURE__ */ jsx(Tooltip.Portal, { children: /* @__PURE__ */ jsx(Tooltip.Positioner, {
|
|
27
|
+
align,
|
|
28
|
+
alignOffset,
|
|
29
|
+
side,
|
|
30
|
+
sideOffset,
|
|
31
|
+
className: "isolate z-50",
|
|
32
|
+
children: /* @__PURE__ */ jsxs(Tooltip.Popup, {
|
|
33
|
+
"data-slot": "tooltip-content",
|
|
34
|
+
className: cn("z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-xl bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-lg data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
|
|
35
|
+
...props,
|
|
36
|
+
children: [children, /* @__PURE__ */ jsx(Tooltip.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:translate-x-[1.5px] data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:translate-x-[-1.5px] data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:translate-x-[-1.5px] data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:translate-x-[1.5px] data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5" })]
|
|
37
|
+
})
|
|
38
|
+
}) });
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region ../../packages/shared/src/routes/guide.tsx
|
|
42
|
+
var $$splitComponentImporter = () => import("./guide--QQ0qbuz.js");
|
|
43
|
+
var Route = createFileRoute("/guide")({
|
|
44
|
+
loader: async () => ({ user: await getSessionUser() }),
|
|
45
|
+
head: () => ({ meta: [{ title: "How to use - Lanework" }] }),
|
|
46
|
+
component: lazyRouteComponent($$splitComponentImporter, "component")
|
|
47
|
+
});
|
|
48
|
+
//#endregion
|
|
49
|
+
export { TooltipTrigger as a, TooltipProvider as i, Tooltip$1 as n, TooltipContent as r, Route as t };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region ../../node_modules/.bun/@better-auth+kysely-adapter@1.6.20+4fd37f7b742805ac/node_modules/@better-auth/kysely-adapter/dist/kysely-migration-tables-JkVUjPF_.mjs
|
|
2
|
+
/**
|
|
3
|
+
* Kysely's internal migration table names, mirrored as local constants.
|
|
4
|
+
*
|
|
5
|
+
* Kysely 0.29 moved these from its main entry to the `kysely/migration`
|
|
6
|
+
* subpath (which 0.28 lacks), and the main entry now exports only type stubs
|
|
7
|
+
* with no runtime value, which breaks strict ESM bundlers such as Turbopack.
|
|
8
|
+
* The values are a stable part of Kysely's public migration contract, so
|
|
9
|
+
* mirroring them lets the SQLite dialects run on both Kysely 0.28 and 0.29
|
|
10
|
+
* without importing from a moving path.
|
|
11
|
+
* TODO: Revisit this mirror if Better Auth drops Kysely 0.28 support and can
|
|
12
|
+
* depend on Kysely's `kysely/migration` export.
|
|
13
|
+
*
|
|
14
|
+
* @see https://github.com/better-auth/better-auth/issues/9810
|
|
15
|
+
*/
|
|
16
|
+
var DEFAULT_MIGRATION_TABLE = "kysely_migration";
|
|
17
|
+
var DEFAULT_MIGRATION_LOCK_TABLE = "kysely_migration_lock";
|
|
18
|
+
//#endregion
|
|
19
|
+
export { DEFAULT_MIGRATION_TABLE as n, DEFAULT_MIGRATION_LOCK_TABLE as t };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { a as REVIEW_COLUMNS, o as REVIEW_ROOT, s as buildReviewCard } from "./github-cUIlMgs7.js";
|
|
2
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
3
|
+
import { join, resolve, sep } from "node:path";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
//#region ../../packages/shared/src/lib/local-fs.ts
|
|
6
|
+
/** Target directory: the dir the CLI was launched in (or LANEWORK_DIR). */
|
|
7
|
+
function localRoot() {
|
|
8
|
+
return process.env.LANEWORK_DIR || process.cwd();
|
|
9
|
+
}
|
|
10
|
+
/** A short, human-friendly name for the local "repo" (the folder name). */
|
|
11
|
+
function localRepoName() {
|
|
12
|
+
const parts = localRoot().split(sep).filter(Boolean);
|
|
13
|
+
return parts[parts.length - 1] || "local";
|
|
14
|
+
}
|
|
15
|
+
/** Absolute path to `<root>/.agents/reviews`. */
|
|
16
|
+
function reviewsDir() {
|
|
17
|
+
return join(localRoot(), REVIEW_ROOT);
|
|
18
|
+
}
|
|
19
|
+
/** Short content hash used as the card's `sha` (changes when the file changes). */
|
|
20
|
+
function contentSha(text) {
|
|
21
|
+
return createHash("sha1").update(text).digest("hex").slice(0, 12);
|
|
22
|
+
}
|
|
23
|
+
/** Every review card under `<root>/.agents/reviews/<column>/*.md`. */
|
|
24
|
+
async function listLocalReviewCards() {
|
|
25
|
+
const base = reviewsDir();
|
|
26
|
+
const cards = [];
|
|
27
|
+
for (const column of REVIEW_COLUMNS) {
|
|
28
|
+
const dir = join(base, column);
|
|
29
|
+
let entries;
|
|
30
|
+
try {
|
|
31
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
32
|
+
} catch {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
for (const entry of entries) {
|
|
36
|
+
if (!entry.isFile() || !entry.name.endsWith(".md")) continue;
|
|
37
|
+
const text = await readFile(join(dir, entry.name), "utf8").catch(() => void 0);
|
|
38
|
+
cards.push(buildReviewCard({
|
|
39
|
+
path: `${REVIEW_ROOT}/${column}/${entry.name}`,
|
|
40
|
+
column,
|
|
41
|
+
fileName: entry.name,
|
|
42
|
+
sha: text ? contentSha(text) : entry.name,
|
|
43
|
+
text
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return cards;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Markdown content of a single review file. `repoPath` is the repo-relative path
|
|
51
|
+
* (e.g. `.agents/reviews/todo/foo.md`) already validated by the caller; we still
|
|
52
|
+
* re-anchor it under the root and reject any path that escapes it.
|
|
53
|
+
*/
|
|
54
|
+
async function getLocalCardContent(repoPath) {
|
|
55
|
+
const root = resolve(localRoot());
|
|
56
|
+
const full = resolve(root, repoPath);
|
|
57
|
+
if (full !== root && !full.startsWith(root + sep)) throw new Error("path outside project root");
|
|
58
|
+
return readFile(full, "utf8");
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { getLocalCardContent, listLocalReviewCards, localRepoName };
|