@akira-tl/forgerelay 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/CHANGELOG.md +45 -0
- package/LICENSE +22 -0
- package/NOTICE.md +19 -0
- package/README.md +270 -0
- package/dist/apply-patch.js +402 -0
- package/dist/artifact-error.js +8 -0
- package/dist/artifact-tools.js +377 -0
- package/dist/cli.js +597 -0
- package/dist/config.js +224 -0
- package/dist/db/client.js +29 -0
- package/dist/db/migrations.js +189 -0
- package/dist/db/schema.js +85 -0
- package/dist/git-worktrees.js +255 -0
- package/dist/git.js +41 -0
- package/dist/incoming-artifacts.js +378 -0
- package/dist/local-agent-adapters.js +653 -0
- package/dist/local-agent-availability.js +119 -0
- package/dist/local-agent-path.js +25 -0
- package/dist/local-agent-profiles.js +136 -0
- package/dist/local-agent-runtime.js +48 -0
- package/dist/local-agent-store.js +145 -0
- package/dist/local-agent-targets.js +80 -0
- package/dist/logger.js +69 -0
- package/dist/mcp/server-instructions.js +78 -0
- package/dist/mcp-sessions.js +56 -0
- package/dist/oauth-provider.js +237 -0
- package/dist/oauth-store.js +138 -0
- package/dist/pi-tools.js +81 -0
- package/dist/process-platform.js +49 -0
- package/dist/process-sessions.js +337 -0
- package/dist/request-meta.js +9 -0
- package/dist/review-checkpoints.js +219 -0
- package/dist/roots.js +37 -0
- package/dist/server-shutdown.js +12 -0
- package/dist/server.js +1596 -0
- package/dist/skills.js +89 -0
- package/dist/ui/.vite/manifest.json +2521 -0
- package/dist/ui/assets/abap-CLvhMVsD.js +1 -0
- package/dist/ui/assets/actionscript-3--17pq3dv.js +1 -0
- package/dist/ui/assets/ada-C5qYipkI.js +1 -0
- package/dist/ui/assets/andromeeda-vGVdxbeo.js +1 -0
- package/dist/ui/assets/angular-html-CovppXt5.js +1 -0
- package/dist/ui/assets/angular-ts-0Y9l6YXu.js +1 -0
- package/dist/ui/assets/apache-U0d_L8uA.js +1 -0
- package/dist/ui/assets/apex-CGTLDQj6.js +1 -0
- package/dist/ui/assets/apl-BmBhiklA.js +1 -0
- package/dist/ui/assets/applescript-CCn79oCD.js +1 -0
- package/dist/ui/assets/ara-4CJ0cIlV.js +1 -0
- package/dist/ui/assets/asciidoc-DE70LPWp.js +1 -0
- package/dist/ui/assets/asm-Cmm7eHzH.js +1 -0
- package/dist/ui/assets/astro-BAmqcqyV.js +1 -0
- package/dist/ui/assets/aurora-x-CDeNXAV0.js +1 -0
- package/dist/ui/assets/awk-BWXHIvNe.js +1 -0
- package/dist/ui/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/dist/ui/assets/ayu-light-C3h-C4tm.js +1 -0
- package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/dist/ui/assets/ballerina-B7ZEbQpA.js +1 -0
- package/dist/ui/assets/bat-Bo4NYOV-.js +1 -0
- package/dist/ui/assets/beancount-D-usSTwE.js +1 -0
- package/dist/ui/assets/berry-DKpUyyne.js +1 -0
- package/dist/ui/assets/bibtex-Ci_nEsc7.js +1 -0
- package/dist/ui/assets/bicep-CUHmPFLl.js +1 -0
- package/dist/ui/assets/bird2-C2hNVINV.js +1 -0
- package/dist/ui/assets/blade-BjFcmRJo.js +1 -0
- package/dist/ui/assets/bsl-BkkzgIyY.js +1 -0
- package/dist/ui/assets/c-CaOJn4x0.js +1 -0
- package/dist/ui/assets/c3-CnJL0r0V.js +1 -0
- package/dist/ui/assets/cadence-CQ2zXKGN.js +1 -0
- package/dist/ui/assets/cairo-DLTphjLi.js +1 -0
- package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
- package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
- package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
- package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
- package/dist/ui/assets/clarity-SemFz856.js +1 -0
- package/dist/ui/assets/clojure-DqKBuwfJ.js +1 -0
- package/dist/ui/assets/cmake-Bj61d0ZC.js +1 -0
- package/dist/ui/assets/cobol-DR4zWFMt.js +1 -0
- package/dist/ui/assets/codeowners-C8r90Shi.js +1 -0
- package/dist/ui/assets/codeql-oeQT6MSM.js +1 -0
- package/dist/ui/assets/coffee-ReGSThmM.js +1 -0
- package/dist/ui/assets/common-lisp-Cv5bFMCO.js +1 -0
- package/dist/ui/assets/coq-BrsZFFmf.js +1 -0
- package/dist/ui/assets/cpp-CnlQh6MO.js +1 -0
- package/dist/ui/assets/crystal-BrpPbH1U.js +1 -0
- package/dist/ui/assets/csharp-Ct8U2NOr.js +1 -0
- package/dist/ui/assets/css-DRBEvyPU.js +1 -0
- package/dist/ui/assets/csv-Dx-8-gkx.js +1 -0
- package/dist/ui/assets/cue-CE9AQfxI.js +1 -0
- package/dist/ui/assets/cypher-ClKdZ_lG.js +1 -0
- package/dist/ui/assets/d-qD-0Kul2.js +1 -0
- package/dist/ui/assets/dark-plus-Cs2F2srj.js +1 -0
- package/dist/ui/assets/dart-DkHntEIa.js +1 -0
- package/dist/ui/assets/dax-BkyTk9wS.js +1 -0
- package/dist/ui/assets/desktop-Dlh5hvp9.js +1 -0
- package/dist/ui/assets/diff-woXpYk--.js +1 -0
- package/dist/ui/assets/docker-IyjqRm3v.js +1 -0
- package/dist/ui/assets/dotenv-_5a1GRtc.js +1 -0
- package/dist/ui/assets/dracula-BHWKrbxM.js +1 -0
- package/dist/ui/assets/dracula-soft-5eyTD99u.js +1 -0
- package/dist/ui/assets/dream-maker-DW3nJb8Q.js +1 -0
- package/dist/ui/assets/edge-cfwpdvl9.js +1 -0
- package/dist/ui/assets/elixir-7owrJxb6.js +1 -0
- package/dist/ui/assets/elm-udiOjODk.js +1 -0
- package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +1 -0
- package/dist/ui/assets/erb-8ctXHMkS.js +1 -0
- package/dist/ui/assets/erlang-Cphh6RMH.js +1 -0
- package/dist/ui/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/dist/ui/assets/everforest-light-Df2xbC6M.js +1 -0
- package/dist/ui/assets/fennel-DQxkIbk2.js +1 -0
- package/dist/ui/assets/fish-BJitypiv.js +1 -0
- package/dist/ui/assets/fluent-C03EYrpw.js +1 -0
- package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
- package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +1 -0
- package/dist/ui/assets/fsharp-D13ZGOAj.js +1 -0
- package/dist/ui/assets/gdresource-C0sCabJj.js +1 -0
- package/dist/ui/assets/gdscript-Cp2uCuqX.js +1 -0
- package/dist/ui/assets/gdshader-CBce3t8t.js +1 -0
- package/dist/ui/assets/genie-CV2tkWYe.js +1 -0
- package/dist/ui/assets/gherkin-DExj1W_8.js +1 -0
- package/dist/ui/assets/git-commit-BSykSTBG.js +1 -0
- package/dist/ui/assets/git-rebase-P0V_qK1w.js +1 -0
- package/dist/ui/assets/github-dark-C-LZuMrd.js +1 -0
- package/dist/ui/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/dist/ui/assets/github-light-EUqPIrTm.js +1 -0
- package/dist/ui/assets/github-light-default-BXViO-2h.js +1 -0
- package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/dist/ui/assets/gleam-CSRkHgEL.js +1 -0
- package/dist/ui/assets/glimmer-js-CZ14ED7U.js +1 -0
- package/dist/ui/assets/glimmer-ts-DtBSFP-o.js +1 -0
- package/dist/ui/assets/glsl-BX2BkZJK.js +1 -0
- package/dist/ui/assets/gn-ilITqXS6.js +1 -0
- package/dist/ui/assets/gnuplot-7GGW24-e.js +1 -0
- package/dist/ui/assets/go-BJwz_mda.js +1 -0
- package/dist/ui/assets/graphql-Dj_cPv4w.js +1 -0
- package/dist/ui/assets/groovy-CacY0gHj.js +1 -0
- package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/dist/ui/assets/hack-DGRkd8xn.js +1 -0
- package/dist/ui/assets/haml-BAPSvujW.js +1 -0
- package/dist/ui/assets/handlebars-PYksdULG.js +1 -0
- package/dist/ui/assets/haskell-D8IpX4py.js +1 -0
- package/dist/ui/assets/haxe-OTjmBuCE.js +1 -0
- package/dist/ui/assets/hcl-Dh228itO.js +1 -0
- package/dist/ui/assets/heavy-payload-BjE0LSUi.js +4 -0
- package/dist/ui/assets/hjson-CxZEssPk.js +1 -0
- package/dist/ui/assets/hlsl-Cvrh5tZx.js +1 -0
- package/dist/ui/assets/horizon-CE9ld1lL.js +1 -0
- package/dist/ui/assets/horizon-bright-Br1oVSNq.js +1 -0
- package/dist/ui/assets/houston-CsvMBhTu.js +1 -0
- package/dist/ui/assets/html-DloAPGZ1.js +1 -0
- package/dist/ui/assets/html-derivative-C6q86ZrS.js +1 -0
- package/dist/ui/assets/http-fPvYDvHA.js +1 -0
- package/dist/ui/assets/hurl-Dbir4WvE.js +1 -0
- package/dist/ui/assets/hxml-B0Qn7Nwc.js +1 -0
- package/dist/ui/assets/hy-CZbG8q4J.js +1 -0
- package/dist/ui/assets/imba-DsUTQ-LC.js +1 -0
- package/dist/ui/assets/ini-B5eOa1yu.js +1 -0
- package/dist/ui/assets/java-DvkqXg3z.js +1 -0
- package/dist/ui/assets/javascript-TONTV6Ty.js +1 -0
- package/dist/ui/assets/jinja-OM1F5Gct.js +1 -0
- package/dist/ui/assets/jison-CBttugts.js +1 -0
- package/dist/ui/assets/json-Db5oY-7J.js +1 -0
- package/dist/ui/assets/json5-BR5RXkoi.js +1 -0
- package/dist/ui/assets/jsonc-CYpm1nAK.js +1 -0
- package/dist/ui/assets/jsonl-CmCQp5Yx.js +1 -0
- package/dist/ui/assets/jsonnet-CJTPZ8u_.js +1 -0
- package/dist/ui/assets/jssm-DXw9l8Rf.js +1 -0
- package/dist/ui/assets/jsx-DKeJCgsc.js +1 -0
- package/dist/ui/assets/julia-NlIPhXaL.js +1 -0
- package/dist/ui/assets/just-BXBJB-mX.js +1 -0
- package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
- package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +1 -0
- package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +1 -0
- package/dist/ui/assets/kdl-CsD5j6eV.js +1 -0
- package/dist/ui/assets/kotlin-DhhofPvG.js +1 -0
- package/dist/ui/assets/kusto-BUv0MjJC.js +1 -0
- package/dist/ui/assets/laserwave-C_8bwKvT.js +1 -0
- package/dist/ui/assets/latex-CGK-6yDy.js +1 -0
- package/dist/ui/assets/lean-CewbzKMR.js +1 -0
- package/dist/ui/assets/less-DVTAwKKz.js +1 -0
- package/dist/ui/assets/light-plus-DVQuIRkW.js +1 -0
- package/dist/ui/assets/liquid-D7waQ0MY.js +1 -0
- package/dist/ui/assets/llvm-Cm23YOpf.js +1 -0
- package/dist/ui/assets/log-BNLmms1o.js +1 -0
- package/dist/ui/assets/logo-Cluzi2Zq.js +1 -0
- package/dist/ui/assets/lua-C_kkt4h1.js +1 -0
- package/dist/ui/assets/luau-CNKltnaQ.js +1 -0
- package/dist/ui/assets/make-Dixweg8N.js +1 -0
- package/dist/ui/assets/markdown-BYOwaDjH.js +1 -0
- package/dist/ui/assets/marko-BokXuCts.js +1 -0
- package/dist/ui/assets/material-theme-Bm3Qr25_.js +1 -0
- package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/dist/ui/assets/matlab-D7qyCx1q.js +1 -0
- package/dist/ui/assets/mdc-Bk0nnUJA.js +1 -0
- package/dist/ui/assets/mdx-DQZ5AkYe.js +1 -0
- package/dist/ui/assets/mermaid-Bk4SNUv9.js +1 -0
- package/dist/ui/assets/min-dark-BSWPekZh.js +1 -0
- package/dist/ui/assets/min-light-DDpmG2fV.js +1 -0
- package/dist/ui/assets/mipsasm-BMqwQI7S.js +1 -0
- package/dist/ui/assets/mojo-BgCJLMeH.js +1 -0
- package/dist/ui/assets/monokai-CdkpiU2Y.js +1 -0
- package/dist/ui/assets/moonbit-CaWjb8XO.js +1 -0
- package/dist/ui/assets/move-B1IS1UjX.js +1 -0
- package/dist/ui/assets/narrat-_X_XdTYD.js +1 -0
- package/dist/ui/assets/nextflow-Bbiyy34d.js +1 -0
- package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +1 -0
- package/dist/ui/assets/nginx-jM6NF9TV.js +1 -0
- package/dist/ui/assets/night-owl-DhmEMT88.js +1 -0
- package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/dist/ui/assets/nim-hYsL-WKb.js +1 -0
- package/dist/ui/assets/nix-IvuFDN5E.js +1 -0
- package/dist/ui/assets/nord-Cb4Vim4T.js +1 -0
- package/dist/ui/assets/nushell-DcLAeLz5.js +1 -0
- package/dist/ui/assets/objective-c-D1A_Heim.js +1 -0
- package/dist/ui/assets/objective-cpp-BsSzOQcm.js +1 -0
- package/dist/ui/assets/ocaml-O90oeIOV.js +1 -0
- package/dist/ui/assets/odin-B1RWQWA5.js +1 -0
- package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/dist/ui/assets/one-light-D7Lr4KcI.js +1 -0
- package/dist/ui/assets/openscad-BUDT5pXO.js +1 -0
- package/dist/ui/assets/pascal-4ZHwLPI5.js +1 -0
- package/dist/ui/assets/perl-DBI_cUHJ.js +1 -0
- package/dist/ui/assets/php-BX_aQhFl.js +1 -0
- package/dist/ui/assets/pierre-dark-sU4Zdns8.js +1 -0
- package/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +1 -0
- package/dist/ui/assets/pierre-light-DWBk51d8.js +1 -0
- package/dist/ui/assets/pierre-light-soft-CodEzPxf.js +1 -0
- package/dist/ui/assets/pkl-ot-7Btpt.js +1 -0
- package/dist/ui/assets/plastic-DQwYfKfQ.js +1 -0
- package/dist/ui/assets/plsql-DGHpHOYJ.js +1 -0
- package/dist/ui/assets/po-BiJDBrnU.js +1 -0
- package/dist/ui/assets/poimandres-DRFjx7u4.js +1 -0
- package/dist/ui/assets/polar-C7UOKdEL.js +1 -0
- package/dist/ui/assets/postcss-BXeXVLqQ.js +1 -0
- package/dist/ui/assets/powerquery-DNMTfnFr.js +1 -0
- package/dist/ui/assets/powershell-DshXNtvi.js +1 -0
- package/dist/ui/assets/prisma-BsRQq5mF.js +1 -0
- package/dist/ui/assets/prolog-iXnhIJG7.js +1 -0
- package/dist/ui/assets/proto-DB4EqR-F.js +1 -0
- package/dist/ui/assets/pug-DwFAYy1e.js +1 -0
- package/dist/ui/assets/puppet-CDv2pdJW.js +1 -0
- package/dist/ui/assets/purescript-9MfHhQsQ.js +1 -0
- package/dist/ui/assets/python-gzcpVVnB.js +1 -0
- package/dist/ui/assets/qml-eLSwQUKt.js +1 -0
- package/dist/ui/assets/qmldir-DCQb3MpD.js +1 -0
- package/dist/ui/assets/qss-Fe1Jh2GI.js +1 -0
- package/dist/ui/assets/r-BMnQsMLf.js +1 -0
- package/dist/ui/assets/racket-DcIDlBhZ.js +1 -0
- package/dist/ui/assets/raku-B3gFvitq.js +1 -0
- package/dist/ui/assets/razor-CgciiMyw.js +1 -0
- package/dist/ui/assets/red-CJ3rzSJv.js +1 -0
- package/dist/ui/assets/reg-CRGYupPL.js +1 -0
- package/dist/ui/assets/regexp-ZrURNrn5.js +1 -0
- package/dist/ui/assets/rel-BtDbiS_P.js +1 -0
- package/dist/ui/assets/review-payload-HGkpJjjm.js +1 -0
- package/dist/ui/assets/riscv-Ckw8ddFX.js +1 -0
- package/dist/ui/assets/ron-VUp2lXgN.js +1 -0
- package/dist/ui/assets/rose-pine-BthvhNj6.js +1 -0
- package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
- package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +1 -0
- package/dist/ui/assets/rosmsg-CAekHB0j.js +1 -0
- package/dist/ui/assets/rst-EoAOr3M6.js +1 -0
- package/dist/ui/assets/ruby-Dqx5_Rqw.js +1 -0
- package/dist/ui/assets/rust-Cfkwpbl8.js +1 -0
- package/dist/ui/assets/sas-Bf6xPLSX.js +1 -0
- package/dist/ui/assets/sass-DXrisJhu.js +1 -0
- package/dist/ui/assets/scala-DKOlJaKm.js +1 -0
- package/dist/ui/assets/scheme-DQCgrYNe.js +1 -0
- package/dist/ui/assets/scrollbar-DX4Ujotb.js +287 -0
- package/dist/ui/assets/scss-DDpW3yTd.js +1 -0
- package/dist/ui/assets/sdbl-bTVj8UrX.js +1 -0
- package/dist/ui/assets/shaderlab-TOUzSsQk.js +1 -0
- package/dist/ui/assets/shellscript-DayAQ-W9.js +1 -0
- package/dist/ui/assets/shellsession-jPr_lSnA.js +1 -0
- package/dist/ui/assets/slack-dark-DnToyrRv.js +1 -0
- package/dist/ui/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/dist/ui/assets/smalltalk-B16xEiuN.js +1 -0
- package/dist/ui/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/dist/ui/assets/solarized-dark-DV17i1UV.js +1 -0
- package/dist/ui/assets/solarized-light-DSh2HLQt.js +1 -0
- package/dist/ui/assets/solidity-CKzVLygQ.js +1 -0
- package/dist/ui/assets/soy-X9adks8G.js +1 -0
- package/dist/ui/assets/sparql-D_iOobhT.js +1 -0
- package/dist/ui/assets/splunk-BC2Px7Mm.js +1 -0
- package/dist/ui/assets/sql-Bmt09AIR.js +1 -0
- package/dist/ui/assets/ssh-config-BgfXC-Er.js +1 -0
- package/dist/ui/assets/stata-DVkNpH8r.js +1 -0
- package/dist/ui/assets/stylus-B6D30XZt.js +1 -0
- package/dist/ui/assets/surrealql-eEXzMb8j.js +1 -0
- package/dist/ui/assets/svelte-CFoBxZF3.js +1 -0
- package/dist/ui/assets/swift-DonLKvLd.js +1 -0
- package/dist/ui/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/dist/ui/assets/system-verilog-DJ5XKQeo.js +1 -0
- package/dist/ui/assets/systemd-BxMlprV5.js +1 -0
- package/dist/ui/assets/talonscript-CohzipZa.js +1 -0
- package/dist/ui/assets/tasl-DMoTqEGO.js +1 -0
- package/dist/ui/assets/tcl-CZd0xW_V.js +1 -0
- package/dist/ui/assets/templ-Da_324JF.js +1 -0
- package/dist/ui/assets/terraform-DswuEJGm.js +1 -0
- package/dist/ui/assets/tex-HAzlmKJ0.js +1 -0
- package/dist/ui/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/dist/ui/assets/toml-CcmNWLt0.js +1 -0
- package/dist/ui/assets/ts-tags-7iLrNH8p.js +1 -0
- package/dist/ui/assets/tsv-sltzmVWM.js +1 -0
- package/dist/ui/assets/tsx-gZaXf8PJ.js +1 -0
- package/dist/ui/assets/turtle-ByJddavk.js +1 -0
- package/dist/ui/assets/twig-CLpQ7p1N.js +1 -0
- package/dist/ui/assets/typescript-B2WWCRI2.js +1 -0
- package/dist/ui/assets/typespec-B88KGewJ.js +1 -0
- package/dist/ui/assets/typst-DI99ib-x.js +1 -0
- package/dist/ui/assets/v-DETTlOr0.js +1 -0
- package/dist/ui/assets/vala-zf12oZj6.js +1 -0
- package/dist/ui/assets/vb-Djn5o6TS.js +1 -0
- package/dist/ui/assets/verilog-CiiDBU1e.js +1 -0
- package/dist/ui/assets/vesper-D5bVUKB1.js +1 -0
- package/dist/ui/assets/vhdl-BroJfC0k.js +1 -0
- package/dist/ui/assets/viml-DvXPmvsu.js +1 -0
- package/dist/ui/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/dist/ui/assets/vitesse-light-VbXTXTou.js +1 -0
- package/dist/ui/assets/vue-No_8Jygd.js +1 -0
- package/dist/ui/assets/vue-html-kHJg98Kk.js +1 -0
- package/dist/ui/assets/vue-vine-Df4cEYaN.js +1 -0
- package/dist/ui/assets/vyper-CgoNMtux.js +1 -0
- package/dist/ui/assets/wasm-BnjxR4X6.js +1 -0
- package/dist/ui/assets/wasm-ByWQv1Qj.js +1 -0
- package/dist/ui/assets/wenyan-C8pVoKbM.js +1 -0
- package/dist/ui/assets/wgsl-BsKzXJz4.js +1 -0
- package/dist/ui/assets/wikitext-ClFFjSW2.js +1 -0
- package/dist/ui/assets/wit-DdvCle-K.js +1 -0
- package/dist/ui/assets/wolfram-DLL8P-h_.js +1 -0
- package/dist/ui/assets/workspace-app-C_wsC6VL.js +117 -0
- package/dist/ui/assets/workspace-app-DHvE2ojW.css +1 -0
- package/dist/ui/assets/xml-DUZ05dpG.js +1 -0
- package/dist/ui/assets/xsl-Bwp3w2OF.js +1 -0
- package/dist/ui/assets/yaml-IA_-TEM1.js +1 -0
- package/dist/ui/assets/zenscript-BnlCZFoB.js +1 -0
- package/dist/ui/assets/zig-CMLA9XwU.js +1 -0
- package/dist/ui/workspace-app.html +15 -0
- package/dist/user-config.js +97 -0
- package/dist/workspace-store.js +162 -0
- package/dist/workspaces.js +528 -0
- package/docs/agent-profile-schema.md +119 -0
- package/docs/artifact-exchange.md +63 -0
- package/docs/chatgpt-coding-workflow.md +183 -0
- package/docs/configuration.md +197 -0
- package/docs/gotchas.md +243 -0
- package/docs/roadmap.md +195 -0
- package/docs/security.md +142 -0
- package/docs/setup.md +132 -0
- package/docs/versioning.md +189 -0
- package/examples/agents/claude-implementer.md +30 -0
- package/examples/agents/codex-explorer.md +27 -0
- package/examples/agents/codex-qa-tester.md +29 -0
- package/examples/agents/codex-worker.md +25 -0
- package/examples/agents/copilot-reviewer.md +25 -0
- package/examples/agents/cursor-agent-worker.md +26 -0
- package/examples/agents/opencode-explorer.md +27 -0
- package/examples/agents/pi-reviewer.md +27 -0
- package/package.json +102 -0
- package/scripts/dev-server.mjs +120 -0
- package/scripts/fix-node-pty-permissions.mjs +22 -0
- package/scripts/release-version.mjs +207 -0
- package/skills/subagent-delegation/SKILL.md +132 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable ForgeRelay changes are documented here.
|
|
4
|
+
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
## [0.1.0] - 2026-08-09
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Initial ForgeRelay release, independently maintained by Akira-TL and based on the MIT-licensed DevSpace project by Waishnav.
|
|
12
|
+
- Reusable workspace identity based on the actual checkout or worktree directory rather than request or conversation identity.
|
|
13
|
+
- Branch-backed managed worktrees with explicit source, target-branch, and branch metadata.
|
|
14
|
+
- `close_worktree` lifecycle that commits remaining worktree changes, requires safe fast-forward integration, and cleans up the managed worktree and branch.
|
|
15
|
+
- Persistent worktree branch and target-branch metadata in the workspace store.
|
|
16
|
+
- Local coding-agent profiles and provider adapters for Codex, Claude, OpenCode, Pi, Cursor, and Copilot integrations already supported by the runtime.
|
|
17
|
+
- Tag-triggered GitHub Actions publishing for npm and GitHub Releases.
|
|
18
|
+
- Release metadata validation, package inspection, attribution checks, and standard SemVer release helpers.
|
|
19
|
+
- `NOTICE.md` and release-time attribution checks preserving the upstream MIT copyright and provenance.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Product identity is now ForgeRelay, published as `@akira-tl/forgerelay` with the `forgerelay` CLI.
|
|
24
|
+
- Versioning now follows independent stable SemVer beginning at `0.1.0` instead of the temporary `X.Y.Z-akira.N` fork version format.
|
|
25
|
+
- New managed worktrees use dedicated `forgerelay/*` branches instead of detached HEADs or the earlier `devspace/*` prefix.
|
|
26
|
+
- Worktree creation is reserved for explicitly requested isolated or parallel work; ordinary work continues in the user's checkout.
|
|
27
|
+
- New configuration prefers `FORGERELAY_*` variables and `~/.forgerelay` while retaining legacy DevSpace configuration compatibility.
|
|
28
|
+
- New default state and worktree directories use ForgeRelay naming when no legacy state needs to be reused.
|
|
29
|
+
- MCP lifecycle instructions direct agents to reuse directory workspaces and close completed managed worktrees safely.
|
|
30
|
+
- Project file modifications are directed through dedicated edit/write capabilities rather than shell-based file mutation.
|
|
31
|
+
|
|
32
|
+
### Compatibility
|
|
33
|
+
|
|
34
|
+
- Existing `DEVSPACE_*` environment variables remain accepted as fallbacks while `FORGERELAY_*` takes precedence.
|
|
35
|
+
- Existing `~/.devspace` configuration is reused automatically when `~/.forgerelay` does not yet exist.
|
|
36
|
+
- Existing DevSpace state directories and managed worktree metadata remain readable so upgrades do not orphan active work.
|
|
37
|
+
- Legacy internal persistence identifiers such as the existing SQLite schema names and review Git refs are intentionally retained where renaming would break stored state.
|
|
38
|
+
- Existing `@akira-tl/devspace` and upstream `@waishnav/devspace` install paths remain recognized by Pi PATH cleanup logic.
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Reopening the same directory no longer creates a different workspace solely because the request came from another conversation.
|
|
43
|
+
- Worktree reuse resolves the actual target branch instead of treating the string `HEAD` as a stable reuse identity.
|
|
44
|
+
- Managed worktree close refuses dirty, wrong-branch, or diverged source checkouts instead of putting the source checkout into a merge-conflict state.
|
|
45
|
+
- Pi subagent PATH handling correctly removes ForgeRelay's own `node_modules/.bin` entry after the package rename.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Waishnav
|
|
4
|
+
Copyright (c) 2026 Akira-TL, modifications
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
package/NOTICE.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# ForgeRelay Notice
|
|
2
|
+
|
|
3
|
+
ForgeRelay is independently maintained by Akira-TL and contains substantial modifications to the upstream DevSpace project.
|
|
4
|
+
|
|
5
|
+
## Upstream origin
|
|
6
|
+
|
|
7
|
+
The original DevSpace project was created by Waishnav and is available at:
|
|
8
|
+
|
|
9
|
+
- https://github.com/Waishnav/devspace
|
|
10
|
+
|
|
11
|
+
The upstream project is distributed under the MIT License. Its original copyright notice and the MIT permission notice are preserved in `LICENSE` and must remain included in copies or substantial portions of this software.
|
|
12
|
+
|
|
13
|
+
## ForgeRelay modifications
|
|
14
|
+
|
|
15
|
+
ForgeRelay is a separately named and independently released derivative project. Changes maintained by Akira-TL include, among other work, workspace identity and persistence, branch-backed managed worktrees and close lifecycle, MCP workflow behavior, local coding-agent integration, release infrastructure, and ForgeRelay-specific configuration/runtime behavior.
|
|
16
|
+
|
|
17
|
+
ForgeRelay releases are not official releases of the upstream DevSpace project, and the ForgeRelay name and distribution should not be interpreted as endorsement by or affiliation with the upstream author.
|
|
18
|
+
|
|
19
|
+
Git history is intentionally retained so the provenance of upstream and later modifications remains inspectable.
|
package/README.md
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# ForgeRelay
|
|
2
|
+
|
|
3
|
+
**Give MCP coding agents a real local workspace.**
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@akira-tl/forgerelay)
|
|
6
|
+
[](https://github.com/Akira-TL/forgerelay/actions/workflows/ci.yml)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
9
|
+
ForgeRelay is a self-hosted MCP server that lets ChatGPT and other MCP-capable
|
|
10
|
+
hosts work on the repositories already on your machine. The host gets explicit
|
|
11
|
+
tools for files, shell commands, Git, managed worktrees, change review, and
|
|
12
|
+
optional local-agent delegation. Your project stays in your normal development
|
|
13
|
+
environment, with the same compilers, package managers, credentials, and Git
|
|
14
|
+
installation you already use.
|
|
15
|
+
|
|
16
|
+
It is not a model and it is not another coding-agent UI. ForgeRelay sits between
|
|
17
|
+
the host and your local development tools and handles the parts that need to run
|
|
18
|
+
on your machine.
|
|
19
|
+
|
|
20
|
+
> [!NOTE]
|
|
21
|
+
> ForgeRelay is an independently maintained derivative of the MIT-licensed
|
|
22
|
+
> [Waishnav/devspace](https://github.com/Waishnav/devspace) project. It is not an
|
|
23
|
+
> official DevSpace release. The original copyright notice and license are kept
|
|
24
|
+
> in [LICENSE](LICENSE), with additional provenance in [NOTICE.md](NOTICE.md).
|
|
25
|
+
|
|
26
|
+
## Quick start
|
|
27
|
+
|
|
28
|
+
ForgeRelay requires Node `>=22.19 <27`, npm, Git, and a Bash-compatible shell.
|
|
29
|
+
|
|
30
|
+
Install it globally:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install -g @akira-tl/forgerelay
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Then configure and start it:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
forgerelay init
|
|
40
|
+
forgerelay serve
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Or run it directly with `npx`:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npx @akira-tl/forgerelay init
|
|
47
|
+
npx @akira-tl/forgerelay serve
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The default local MCP endpoint is:
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
http://127.0.0.1:7676/mcp
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
If the MCP host cannot reach localhost, put ForgeRelay behind a public HTTPS
|
|
57
|
+
tunnel or reverse proxy such as Cloudflare Tunnel, ngrok, Pinggy, Tailscale
|
|
58
|
+
Funnel, or your own proxy. During setup, enter the public origin without `/mcp`:
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
https://your-tunnel-host.example.com
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The client then connects to:
|
|
65
|
+
|
|
66
|
+
```text
|
|
67
|
+
https://your-tunnel-host.example.com/mcp
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
ForgeRelay uses an Owner-password OAuth approval flow. `forgerelay init` prints
|
|
71
|
+
the password and stores it in the active config directory. New installations use:
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
~/.forgerelay/config.json
|
|
75
|
+
~/.forgerelay/auth.json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Keep `auth.json` private.
|
|
79
|
+
|
|
80
|
+
## What it gives an MCP host
|
|
81
|
+
|
|
82
|
+
Once a workspace is open, the host can:
|
|
83
|
+
|
|
84
|
+
- read, create, edit, and search files inside that workspace;
|
|
85
|
+
- run your local tests, builds, package scripts, Git commands, and shell tools;
|
|
86
|
+
- reuse the same workspace when the same checkout is opened again;
|
|
87
|
+
- follow repository instructions from `AGENTS.md` and `CLAUDE.md`;
|
|
88
|
+
- discover Agent Skills and configured local subagent profiles;
|
|
89
|
+
- create a branch-backed Git worktree when you explicitly ask for isolated or
|
|
90
|
+
parallel work;
|
|
91
|
+
- close a managed worktree by committing its remaining changes and
|
|
92
|
+
fast-forwarding the target branch when that can be done safely;
|
|
93
|
+
- show aggregate changes through optional ChatGPT Apps-compatible UI cards.
|
|
94
|
+
|
|
95
|
+
Normal work happens in your existing checkout. ForgeRelay does not silently move
|
|
96
|
+
every task into a worktree.
|
|
97
|
+
|
|
98
|
+
## Worktrees without the usual cleanup mess
|
|
99
|
+
|
|
100
|
+
A new managed worktree gets its own `forgerelay/*` branch instead of a detached
|
|
101
|
+
HEAD. It remains visible from the source repository with ordinary Git commands:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
git worktree list
|
|
105
|
+
git branch
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
When `close_worktree` succeeds, ForgeRelay:
|
|
109
|
+
|
|
110
|
+
1. checks that the source checkout is clean and still on the expected target branch;
|
|
111
|
+
2. commits any remaining worktree changes;
|
|
112
|
+
3. checks that the target can advance without a merge commit or conflict;
|
|
113
|
+
4. fast-forwards the target branch;
|
|
114
|
+
5. removes the worktree and the already-merged managed branch.
|
|
115
|
+
|
|
116
|
+
If the histories have diverged, the close is refused and the worktree is left in
|
|
117
|
+
place. ForgeRelay does not put the source checkout into a merge-conflict state.
|
|
118
|
+
You can rebase and verify inside the worktree, then retry the close.
|
|
119
|
+
|
|
120
|
+
## Local coding agents
|
|
121
|
+
|
|
122
|
+
ForgeRelay can delegate work to local coding runtimes through user-defined
|
|
123
|
+
profiles. The current adapter layer supports Codex, Claude, OpenCode, Pi,
|
|
124
|
+
Cursor, and Copilot where the corresponding local integration is available.
|
|
125
|
+
|
|
126
|
+
Profiles can live in:
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
~/.forgerelay/agents/*.md
|
|
130
|
+
.forgerelay/agents/*.md
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The current CLI workflow is:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
forgerelay agents ls
|
|
137
|
+
forgerelay agents run <profile-or-provider-or-id> "<prompt>"
|
|
138
|
+
forgerelay agents show <id>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
A first-class MCP subagent interface is planned so a parent agent can use the
|
|
142
|
+
same runtime without going through the CLI.
|
|
143
|
+
|
|
144
|
+
See [Agent Profile Schema](docs/agent-profile-schema.md) for the profile format.
|
|
145
|
+
|
|
146
|
+
## Configuration and upgrades from DevSpace
|
|
147
|
+
|
|
148
|
+
New configuration uses the `FORGERELAY_*` prefix. For example:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
FORGERELAY_ALLOWED_ROOTS="$HOME/projects" \
|
|
152
|
+
FORGERELAY_PUBLIC_BASE_URL="https://forge.example.com" \
|
|
153
|
+
forgerelay serve
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Existing `DEVSPACE_*` variables are still accepted as fallbacks during the
|
|
157
|
+
rename transition. When both names are present, `FORGERELAY_*` wins.
|
|
158
|
+
|
|
159
|
+
The same rule applies to persisted configuration. ForgeRelay prefers
|
|
160
|
+
`~/.forgerelay`, but if that directory does not exist and an existing
|
|
161
|
+
`~/.devspace` setup does, ForgeRelay keeps using the legacy directory rather
|
|
162
|
+
than orphaning OAuth credentials, workspace state, or managed worktrees.
|
|
163
|
+
|
|
164
|
+
Project-level `.devspace/agents` profiles are also still readable for migration
|
|
165
|
+
compatibility. New project configuration should use `.forgerelay`.
|
|
166
|
+
|
|
167
|
+
See [Configuration Reference](docs/configuration.md) for all supported options.
|
|
168
|
+
|
|
169
|
+
## Security model
|
|
170
|
+
|
|
171
|
+
A connected MCP host can make real changes to local projects through ForgeRelay,
|
|
172
|
+
using the same local account that runs the server. That trust boundary matters.
|
|
173
|
+
|
|
174
|
+
Filesystem tools enforce configured workspace and allowed-root boundaries. Shell
|
|
175
|
+
commands are different: they run with the authority of your local user and are
|
|
176
|
+
**not** contained by an operating-system sandbox added by ForgeRelay.
|
|
177
|
+
|
|
178
|
+
Only connect hosts you trust, keep the Owner password private, and expose only
|
|
179
|
+
the project roots you actually want the host to use.
|
|
180
|
+
|
|
181
|
+
See [Security Model](docs/security.md) for the full boundary and threat model.
|
|
182
|
+
|
|
183
|
+
## Platform support
|
|
184
|
+
|
|
185
|
+
| Platform | Status | Notes |
|
|
186
|
+
| --- | --- | --- |
|
|
187
|
+
| Linux | Supported | Requires Node, npm, Git, and Bash. |
|
|
188
|
+
| macOS | Supported | Requires Node, npm, Git, and Bash. |
|
|
189
|
+
| Windows with Git Bash, WSL, MSYS2, or Cygwin Bash | Supported | Git Bash is the simplest native Windows setup. |
|
|
190
|
+
| Windows PowerShell or `cmd.exe` only | Not supported yet | Install Git Bash or use WSL. |
|
|
191
|
+
|
|
192
|
+
You can check the local runtime with:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
forgerelay doctor
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Where ForgeRelay is going
|
|
199
|
+
|
|
200
|
+
The next additions are focused on making the local execution layer more useful,
|
|
201
|
+
not on turning ForgeRelay into another all-in-one agent framework:
|
|
202
|
+
|
|
203
|
+
1. lifecycle hooks;
|
|
204
|
+
2. LSP-backed code intelligence;
|
|
205
|
+
3. first-class MCP subagent delegation;
|
|
206
|
+
4. stronger worktree verification and recovery;
|
|
207
|
+
5. checkpoint/rewind and retention improvements.
|
|
208
|
+
|
|
209
|
+
ForgeRelay does not plan to add its own shell sandbox, long-term memory system,
|
|
210
|
+
or plugin marketplace. Conversation, planning, web access, and other host-native
|
|
211
|
+
capabilities stay with the MCP host. Long-term context can be provided by a
|
|
212
|
+
separate service instead of being mixed into the workspace runtime.
|
|
213
|
+
|
|
214
|
+
See [Roadmap](docs/roadmap.md) for the current plan.
|
|
215
|
+
|
|
216
|
+
## Releases
|
|
217
|
+
|
|
218
|
+
ForgeRelay uses standard SemVer, starting at `0.1.0`.
|
|
219
|
+
|
|
220
|
+
Prepare a release with:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
npm run release:check
|
|
224
|
+
npm run release:patch
|
|
225
|
+
npm run release:minor
|
|
226
|
+
npm run release:major
|
|
227
|
+
npm run release:verify
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Pushing a matching `vX.Y.Z` tag to `Akira-TL/forgerelay` is the publish action.
|
|
231
|
+
GitHub Actions verifies the tagged commit, publishes `@akira-tl/forgerelay` to
|
|
232
|
+
npm, and creates the matching GitHub Release.
|
|
233
|
+
|
|
234
|
+
See [Versioning and Release Management](docs/versioning.md) for the bootstrap and
|
|
235
|
+
Trusted Publishing setup.
|
|
236
|
+
|
|
237
|
+
## Documentation
|
|
238
|
+
|
|
239
|
+
- [Setup Guide](docs/setup.md)
|
|
240
|
+
- [ChatGPT Coding Workflow](docs/chatgpt-coding-workflow.md)
|
|
241
|
+
- [Configuration Reference](docs/configuration.md)
|
|
242
|
+
- [Agent Profile Schema](docs/agent-profile-schema.md)
|
|
243
|
+
- [Native File Download](docs/artifact-exchange.md)
|
|
244
|
+
- [Security Model](docs/security.md)
|
|
245
|
+
- [Troubleshooting](docs/gotchas.md)
|
|
246
|
+
- [Roadmap](docs/roadmap.md)
|
|
247
|
+
- [Versioning and Release Management](docs/versioning.md)
|
|
248
|
+
- [Changelog](CHANGELOG.md)
|
|
249
|
+
- [Attribution Notice](NOTICE.md)
|
|
250
|
+
|
|
251
|
+
## Upstream and attribution
|
|
252
|
+
|
|
253
|
+
ForgeRelay is based on the original
|
|
254
|
+
[Waishnav/devspace](https://github.com/Waishnav/devspace) project by Waishnav,
|
|
255
|
+
released under the MIT License. ForgeRelay has its own name, package, release
|
|
256
|
+
stream, runtime changes, and roadmap, but the upstream provenance remains part of
|
|
257
|
+
the project.
|
|
258
|
+
|
|
259
|
+
The original copyright notice remains in [LICENSE](LICENSE). See
|
|
260
|
+
[NOTICE.md](NOTICE.md) for the attribution and modification notice.
|
|
261
|
+
|
|
262
|
+
## Local development
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
npm install --include=dev
|
|
266
|
+
npm run dev
|
|
267
|
+
npm run typecheck
|
|
268
|
+
npm test
|
|
269
|
+
npm run build
|
|
270
|
+
```
|