@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/docs/roadmap.md
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# ForgeRelay Roadmap
|
|
2
|
+
|
|
3
|
+
ForgeRelay is the local development control plane between an MCP host and the
|
|
4
|
+
user's real development environment. The project intentionally stays focused on
|
|
5
|
+
workspace, filesystem, process, Git, code-intelligence, hook, and delegated
|
|
6
|
+
local-agent capabilities rather than rebuilding the host model runtime.
|
|
7
|
+
|
|
8
|
+
## Architecture boundary
|
|
9
|
+
|
|
10
|
+
The MCP host owns capabilities such as:
|
|
11
|
+
|
|
12
|
+
- reasoning and conversation;
|
|
13
|
+
- planning and asking the user questions;
|
|
14
|
+
- web and multimodal tools;
|
|
15
|
+
- top-level conversation lifecycle and compaction.
|
|
16
|
+
|
|
17
|
+
ForgeRelay owns capabilities such as:
|
|
18
|
+
|
|
19
|
+
- workspace identity and persistence;
|
|
20
|
+
- filesystem operations;
|
|
21
|
+
- local process execution;
|
|
22
|
+
- Git and managed worktrees;
|
|
23
|
+
- review/checkpoint primitives;
|
|
24
|
+
- code intelligence;
|
|
25
|
+
- lifecycle hooks;
|
|
26
|
+
- provider-backed local subagents.
|
|
27
|
+
|
|
28
|
+
Long-term memory is intentionally outside ForgeRelay. A separate context system
|
|
29
|
+
can be integrated later without coupling memory policy to the local coding
|
|
30
|
+
runtime.
|
|
31
|
+
|
|
32
|
+
## Explicit non-goals
|
|
33
|
+
|
|
34
|
+
ForgeRelay does not plan to add:
|
|
35
|
+
|
|
36
|
+
- an operating-system shell sandbox;
|
|
37
|
+
- a project memory/autonomous memory system;
|
|
38
|
+
- a plugin marketplace/runtime;
|
|
39
|
+
- a second conversation/session runtime;
|
|
40
|
+
- host-owned commands such as plan mode, context inspection, or model selection;
|
|
41
|
+
- automatic installation and management of language servers.
|
|
42
|
+
|
|
43
|
+
Shell execution remains a trusted local-user capability. Workspace filesystem
|
|
44
|
+
containment must not be described as a shell sandbox.
|
|
45
|
+
|
|
46
|
+
## 0.1 — ForgeRelay foundation
|
|
47
|
+
|
|
48
|
+
The initial independent release establishes:
|
|
49
|
+
|
|
50
|
+
- ForgeRelay product/package/CLI identity;
|
|
51
|
+
- standard SemVer and tag-triggered GitHub/npm releases;
|
|
52
|
+
- preserved upstream MIT attribution and provenance checks;
|
|
53
|
+
- directory-based workspace reuse;
|
|
54
|
+
- checkout-first behavior;
|
|
55
|
+
- branch-backed managed worktrees using `forgerelay/*` branches;
|
|
56
|
+
- safe `close_worktree` fast-forward lifecycle;
|
|
57
|
+
- persisted worktree branch/target metadata;
|
|
58
|
+
- existing local coding-agent profile/provider integration;
|
|
59
|
+
- compatibility with legacy DevSpace configuration/state identifiers.
|
|
60
|
+
|
|
61
|
+
## 0.2 — Hooks v1
|
|
62
|
+
|
|
63
|
+
Hooks are the next priority because they provide a general policy extension point
|
|
64
|
+
without hardcoding project-specific commands into Git/workspace logic.
|
|
65
|
+
|
|
66
|
+
Initial events:
|
|
67
|
+
|
|
68
|
+
- `WorkspaceOpen`
|
|
69
|
+
- `BeforeTool`
|
|
70
|
+
- `AfterTool`
|
|
71
|
+
- `AfterToolFailure`
|
|
72
|
+
- `AfterFileChange`
|
|
73
|
+
- `BeforeWorktreeClose`
|
|
74
|
+
- `AfterWorktreeClose`
|
|
75
|
+
- `SubagentStart`
|
|
76
|
+
- `SubagentStop`
|
|
77
|
+
|
|
78
|
+
Initial handler type:
|
|
79
|
+
|
|
80
|
+
- local command
|
|
81
|
+
|
|
82
|
+
The first implementation should define a deep hook engine contract and keep MCP
|
|
83
|
+
tool handlers thin. HTTP/prompt/agent-style handlers can be evaluated later if
|
|
84
|
+
there is a concrete need.
|
|
85
|
+
|
|
86
|
+
`BeforeWorktreeClose` should become the natural place for user-configured test,
|
|
87
|
+
typecheck, formatting, or security verification before a managed branch is
|
|
88
|
+
integrated.
|
|
89
|
+
|
|
90
|
+
## 0.3 — LSP code intelligence v1
|
|
91
|
+
|
|
92
|
+
LSP is moderate implementation complexity if ForgeRelay does not become a
|
|
93
|
+
language-server installer.
|
|
94
|
+
|
|
95
|
+
The first version should launch only language servers already available on the
|
|
96
|
+
user's machine or explicitly configured by the user/project.
|
|
97
|
+
|
|
98
|
+
Initial operations:
|
|
99
|
+
|
|
100
|
+
- diagnostics;
|
|
101
|
+
- definition;
|
|
102
|
+
- references;
|
|
103
|
+
- document symbols;
|
|
104
|
+
- workspace symbols;
|
|
105
|
+
- hover/type information.
|
|
106
|
+
|
|
107
|
+
Prefer one deep MCP capability such as:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
code_intelligence({
|
|
111
|
+
workspaceId,
|
|
112
|
+
operation,
|
|
113
|
+
path,
|
|
114
|
+
line,
|
|
115
|
+
column,
|
|
116
|
+
query
|
|
117
|
+
})
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
rather than one MCP tool per language or language-server method.
|
|
121
|
+
|
|
122
|
+
Candidate servers include `typescript-language-server`/tsserver, Pyright,
|
|
123
|
+
`rust-analyzer`, `gopls`, and `clangd`, but ForgeRelay should treat server
|
|
124
|
+
commands/configuration as external dependencies.
|
|
125
|
+
|
|
126
|
+
## 0.4 — First-class subagent MCP
|
|
127
|
+
|
|
128
|
+
ForgeRelay already owns provider adapters and resumable local agent sessions.
|
|
129
|
+
The next step is to remove the current `bash -> forgerelay agents ...` indirection
|
|
130
|
+
for MCP hosts.
|
|
131
|
+
|
|
132
|
+
A compact interface should reuse the existing provider adapter registry:
|
|
133
|
+
|
|
134
|
+
```text
|
|
135
|
+
subagent({
|
|
136
|
+
action: "run" | "list" | "show" | "cancel",
|
|
137
|
+
workspaceId,
|
|
138
|
+
profile,
|
|
139
|
+
provider,
|
|
140
|
+
prompt,
|
|
141
|
+
agentId
|
|
142
|
+
})
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
The parent agent chooses an available provider/profile such as Codex or Claude.
|
|
146
|
+
ForgeRelay launches, tracks, resumes, and cancels the provider-backed worker when
|
|
147
|
+
the underlying provider supports those operations.
|
|
148
|
+
|
|
149
|
+
This is intentionally provider-backed delegation, not an attempt to emulate a
|
|
150
|
+
host-native subagent implementation.
|
|
151
|
+
|
|
152
|
+
## Worktree and history refinements
|
|
153
|
+
|
|
154
|
+
These can land alongside the main release lines when the underlying interfaces
|
|
155
|
+
are ready:
|
|
156
|
+
|
|
157
|
+
- `.worktreeinclude`-style explicit copying of selected gitignored files;
|
|
158
|
+
- hook-backed worktree close verification;
|
|
159
|
+
- stale managed-worktree recovery and cleanup;
|
|
160
|
+
- checkpoint/list/restore primitives based on the existing Git snapshot engine;
|
|
161
|
+
- retention/GC for stale workspace sessions, conversation bindings, and review
|
|
162
|
+
refs.
|
|
163
|
+
|
|
164
|
+
Checkpoint restore must protect concurrent/external user edits rather than
|
|
165
|
+
blindly overwriting a working tree.
|
|
166
|
+
|
|
167
|
+
## Later: task orchestration
|
|
168
|
+
|
|
169
|
+
After first-class subagents are stable, ForgeRelay may add a small persistent
|
|
170
|
+
task graph for parent/worker coordination:
|
|
171
|
+
|
|
172
|
+
- task identity/title/status;
|
|
173
|
+
- dependencies;
|
|
174
|
+
- assigned local-agent session;
|
|
175
|
+
- workspace/worktree association;
|
|
176
|
+
- structured result/error state.
|
|
177
|
+
|
|
178
|
+
Start with DAG-style parent/child orchestration. Peer-to-peer agent-team messaging
|
|
179
|
+
should only be added if real workflows demonstrate that the simpler task model is
|
|
180
|
+
insufficient.
|
|
181
|
+
|
|
182
|
+
## Compatibility policy
|
|
183
|
+
|
|
184
|
+
New public names use ForgeRelay:
|
|
185
|
+
|
|
186
|
+
- `@akira-tl/forgerelay`
|
|
187
|
+
- `forgerelay`
|
|
188
|
+
- `FORGERELAY_*`
|
|
189
|
+
- `~/.forgerelay`
|
|
190
|
+
- `.forgerelay`
|
|
191
|
+
- `forgerelay/*` managed branches
|
|
192
|
+
|
|
193
|
+
Legacy `DEVSPACE_*`, `~/.devspace`, `.devspace`, old managed branch names, and
|
|
194
|
+
selected persisted internal identifiers remain readable during migration where
|
|
195
|
+
removing compatibility would orphan real user state.
|
package/docs/security.md
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Security Model
|
|
2
|
+
|
|
3
|
+
ForgeRelay exposes local coding capabilities over MCP. Treat a connected client
|
|
4
|
+
as a trusted coding operator with access to the capabilities you expose.
|
|
5
|
+
|
|
6
|
+
## Allowed workspace roots
|
|
7
|
+
|
|
8
|
+
ForgeRelay only opens workspaces under configured roots. Keep the root list as
|
|
9
|
+
narrow as practical.
|
|
10
|
+
|
|
11
|
+
Example:
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
~/personal,~/work
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Do not use your entire home directory unless that is intentionally the access
|
|
18
|
+
boundary you want.
|
|
19
|
+
|
|
20
|
+
Filesystem-oriented tools validate workspace-relative paths and reject paths
|
|
21
|
+
that escape the opened workspace or configured roots.
|
|
22
|
+
|
|
23
|
+
## Owner-password OAuth
|
|
24
|
+
|
|
25
|
+
New installations store local configuration in:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
~/.forgerelay/config.json
|
|
29
|
+
~/.forgerelay/auth.json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`auth.json` contains the Owner password and should remain private. When a client
|
|
33
|
+
connects, ForgeRelay presents an approval page where that password authorizes
|
|
34
|
+
the connection.
|
|
35
|
+
|
|
36
|
+
For environment-only deployments:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
FORGERELAY_OAUTH_OWNER_TOKEN="$(openssl rand -base64 32)"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The token must be at least 16 characters.
|
|
43
|
+
|
|
44
|
+
Existing `~/.devspace` configuration and `DEVSPACE_*` variables remain readable
|
|
45
|
+
for migration compatibility when the new ForgeRelay equivalents are absent.
|
|
46
|
+
|
|
47
|
+
## Public URL and tunnels
|
|
48
|
+
|
|
49
|
+
ForgeRelay needs `FORGERELAY_PUBLIC_BASE_URL` when an MCP client reaches it
|
|
50
|
+
through a public HTTPS origin.
|
|
51
|
+
|
|
52
|
+
Use the origin without `/mcp`:
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
https://forge.example.com
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The client connects to:
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
https://forge.example.com/mcp
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
ForgeRelay does not manage the tunnel. Your tunnel or reverse proxy should point
|
|
65
|
+
to the local server, normally:
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
http://127.0.0.1:7676
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
By default, ForgeRelay derives allowed Host headers from the local host and
|
|
72
|
+
configured public URL. `FORGERELAY_ALLOWED_HOSTS=*` disables that allowlist and
|
|
73
|
+
should only be used intentionally.
|
|
74
|
+
|
|
75
|
+
## Shell execution is not sandboxed
|
|
76
|
+
|
|
77
|
+
This boundary is important:
|
|
78
|
+
|
|
79
|
+
**Filesystem path containment is not a shell sandbox.**
|
|
80
|
+
|
|
81
|
+
ForgeRelay's file tools are scoped to the opened workspace, but shell commands
|
|
82
|
+
run with the authority of the local operating-system user that started
|
|
83
|
+
ForgeRelay. A shell command can therefore access resources that the local user
|
|
84
|
+
can access, including paths outside the workspace.
|
|
85
|
+
|
|
86
|
+
ForgeRelay intentionally does not add its own OS sandbox. Many development
|
|
87
|
+
workflows need compilers, package managers, system tools, credentials, external
|
|
88
|
+
repositories, local services, and other resources outside a narrow workspace
|
|
89
|
+
sandbox, and MCP currently does not provide a clean universal interaction model
|
|
90
|
+
for dynamically crossing such a boundary.
|
|
91
|
+
|
|
92
|
+
The security model is therefore based on:
|
|
93
|
+
|
|
94
|
+
- strong authentication;
|
|
95
|
+
- narrow allowed project roots for filesystem tools;
|
|
96
|
+
- a trusted MCP client/model relationship;
|
|
97
|
+
- explicit tool calls and observable local execution;
|
|
98
|
+
- the user's existing OS/account permissions.
|
|
99
|
+
|
|
100
|
+
Do not describe ForgeRelay as a sandboxed coding environment.
|
|
101
|
+
|
|
102
|
+
## Git and managed worktrees
|
|
103
|
+
|
|
104
|
+
Managed worktrees are branch-backed and visible in the source repository.
|
|
105
|
+
ForgeRelay refuses unsafe close operations when:
|
|
106
|
+
|
|
107
|
+
- the source checkout is dirty;
|
|
108
|
+
- the source checkout left the recorded target branch;
|
|
109
|
+
- source and worktree histories diverged;
|
|
110
|
+
- the managed worktree is on the wrong branch.
|
|
111
|
+
|
|
112
|
+
Integration is fast-forward-only, so a failed close does not intentionally put
|
|
113
|
+
the source checkout into a merge-conflict state.
|
|
114
|
+
|
|
115
|
+
## Native artifact download
|
|
116
|
+
|
|
117
|
+
When enabled, `download_artifact` accepts only the supported native file value
|
|
118
|
+
provided by the MCP host. It does not accept arbitrary signed URLs, local paths,
|
|
119
|
+
embedded credentials, or base64 strings as substitutes.
|
|
120
|
+
|
|
121
|
+
Downloads are streamed, size-limited, created without overwrite, and published
|
|
122
|
+
as owner-only files. See [Native File Download](artifact-exchange.md).
|
|
123
|
+
|
|
124
|
+
## Logging
|
|
125
|
+
|
|
126
|
+
ForgeRelay logs requests/tool calls by default. Shell command previews are off
|
|
127
|
+
unless explicitly enabled:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
FORGERELAY_LOG_SHELL_COMMANDS=1
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Command arguments can contain secrets, so only enable command-preview logging
|
|
134
|
+
when necessary.
|
|
135
|
+
|
|
136
|
+
## Package provenance
|
|
137
|
+
|
|
138
|
+
ForgeRelay is derived from the MIT-licensed DevSpace project. Public releases
|
|
139
|
+
preserve the upstream copyright/license and include `NOTICE.md`. The release
|
|
140
|
+
check fails if required attribution is removed.
|
|
141
|
+
|
|
142
|
+
See [NOTICE.md](../NOTICE.md) and [LICENSE](../LICENSE).
|
package/docs/setup.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Setup Guide
|
|
2
|
+
|
|
3
|
+
This guide is for users who want ChatGPT or another MCP host to work in local
|
|
4
|
+
projects through ForgeRelay.
|
|
5
|
+
|
|
6
|
+
## Requirements
|
|
7
|
+
|
|
8
|
+
- Node `>=22.19 <27`
|
|
9
|
+
- npm
|
|
10
|
+
- Git
|
|
11
|
+
- Bash, including Git Bash or WSL on Windows
|
|
12
|
+
- a public HTTPS URL when the MCP host cannot connect directly to localhost
|
|
13
|
+
|
|
14
|
+
ForgeRelay does not create the public tunnel for you. Use Cloudflare Tunnel,
|
|
15
|
+
ngrok, Pinggy, Tailscale Funnel, or your own HTTPS reverse proxy.
|
|
16
|
+
|
|
17
|
+
## Install and configure
|
|
18
|
+
|
|
19
|
+
Run:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx @akira-tl/forgerelay init
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The setup flow asks for the allowed project roots, local port, and public base
|
|
26
|
+
URL.
|
|
27
|
+
|
|
28
|
+
### Project roots
|
|
29
|
+
|
|
30
|
+
Choose only the folders the connected MCP host should be able to open.
|
|
31
|
+
|
|
32
|
+
Examples:
|
|
33
|
+
|
|
34
|
+
```text
|
|
35
|
+
~/personal,~/work
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
/Users/alice/dev,/Users/alice/work
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
C:\Users\alice\dev,C:\Users\alice\work
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Local port
|
|
47
|
+
|
|
48
|
+
The default is `7676`.
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
http://127.0.0.1:7676/mcp
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Public base URL
|
|
55
|
+
|
|
56
|
+
Point your tunnel or reverse proxy at:
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
http://127.0.0.1:7676
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Enter the public origin without `/mcp`:
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
https://your-tunnel-host.example.com
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Configure the MCP client with:
|
|
69
|
+
|
|
70
|
+
```text
|
|
71
|
+
https://your-tunnel-host.example.com/mcp
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Start the server
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npx @akira-tl/forgerelay serve
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
For a one-run public URL override:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
FORGERELAY_PUBLIC_BASE_URL="https://new-tunnel.example.com" \
|
|
84
|
+
npx @akira-tl/forgerelay serve
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
For a stable public URL:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
npx @akira-tl/forgerelay config set publicBaseUrl https://forge.example.com
|
|
91
|
+
npx @akira-tl/forgerelay serve
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Approve the client
|
|
95
|
+
|
|
96
|
+
When ChatGPT, Claude, or another MCP client connects, ForgeRelay displays an
|
|
97
|
+
Owner-password approval page. Enter the Owner password printed during setup.
|
|
98
|
+
|
|
99
|
+
New installations use:
|
|
100
|
+
|
|
101
|
+
```text
|
|
102
|
+
~/.forgerelay/config.json
|
|
103
|
+
~/.forgerelay/auth.json
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Keep `auth.json` private.
|
|
107
|
+
|
|
108
|
+
### Existing DevSpace configuration
|
|
109
|
+
|
|
110
|
+
During migration, if `~/.forgerelay` does not exist but `~/.devspace` does,
|
|
111
|
+
ForgeRelay reuses the legacy directory automatically. `FORGERELAY_CONFIG_DIR`
|
|
112
|
+
takes precedence over the legacy `DEVSPACE_CONFIG_DIR` environment variable.
|
|
113
|
+
|
|
114
|
+
You do not need to move a working legacy config before starting ForgeRelay.
|
|
115
|
+
|
|
116
|
+
## Check the setup
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
npx @akira-tl/forgerelay doctor
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
The doctor command reports the resolved config, Node runtime, platform, Git,
|
|
123
|
+
Bash, public URL, allowed hosts, and native SQLite dependency status.
|
|
124
|
+
|
|
125
|
+
## Running from a local checkout
|
|
126
|
+
|
|
127
|
+
For ForgeRelay development itself:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
npm install --include=dev
|
|
131
|
+
npm run dev
|
|
132
|
+
```
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Versioning and Release Management
|
|
2
|
+
|
|
3
|
+
ForgeRelay is published as `@akira-tl/forgerelay` from the
|
|
4
|
+
`Akira-TL/forgerelay` GitHub repository.
|
|
5
|
+
|
|
6
|
+
## Version format
|
|
7
|
+
|
|
8
|
+
ForgeRelay uses standard Semantic Versioning:
|
|
9
|
+
|
|
10
|
+
```text
|
|
11
|
+
MAJOR.MINOR.PATCH
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The initial independent release is:
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
0.1.0
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The old temporary fork version format (`X.Y.Z-akira.N`) is no longer used.
|
|
21
|
+
Upstream DevSpace provenance and baseline information belong in Git history,
|
|
22
|
+
`NOTICE.md`, and release notes rather than ForgeRelay's public version number.
|
|
23
|
+
|
|
24
|
+
While the project is below `1.0.0`:
|
|
25
|
+
|
|
26
|
+
- patch releases are backward-compatible fixes and small refinements;
|
|
27
|
+
- minor releases may add substantial runtime capabilities and may include
|
|
28
|
+
explicitly documented pre-1.0 interface changes;
|
|
29
|
+
- `1.0.0` marks the first stable public runtime/tool contract.
|
|
30
|
+
|
|
31
|
+
## Changelog policy
|
|
32
|
+
|
|
33
|
+
All user-visible changes first land under:
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
## [Unreleased]
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Use the usual categories when relevant:
|
|
40
|
+
|
|
41
|
+
- Added
|
|
42
|
+
- Changed
|
|
43
|
+
- Fixed
|
|
44
|
+
- Security
|
|
45
|
+
- Removed
|
|
46
|
+
- Compatibility
|
|
47
|
+
|
|
48
|
+
The release helper promotes `Unreleased` into a dated release section. It
|
|
49
|
+
refuses to bump a version when `Unreleased` is empty.
|
|
50
|
+
|
|
51
|
+
## Release commands
|
|
52
|
+
|
|
53
|
+
Check package, lockfile, repository, changelog, and attribution metadata:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm run release:check
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Prepare the next patch release:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npm run release:patch
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`npm run release:next` is an alias for a patch release.
|
|
66
|
+
|
|
67
|
+
Prepare a minor or major release:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm run release:minor
|
|
71
|
+
npm run release:major
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The bump commands update:
|
|
75
|
+
|
|
76
|
+
- `package.json`
|
|
77
|
+
- root package metadata in `package-lock.json`
|
|
78
|
+
- `CHANGELOG.md`
|
|
79
|
+
|
|
80
|
+
They do not commit, tag, push, or publish.
|
|
81
|
+
|
|
82
|
+
Run the full local release gate with:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npm run release:verify
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Validate a specific tag with:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npm run release:tag-check -- v0.1.0
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
A release tag must exactly equal `v` followed by the package version, and
|
|
95
|
+
`Unreleased` must be empty.
|
|
96
|
+
|
|
97
|
+
## Tag-triggered publishing
|
|
98
|
+
|
|
99
|
+
`.github/workflows/release.yml` runs for tags matching `v*.*.*` in the
|
|
100
|
+
`Akira-TL/forgerelay` repository. The release helper performs the strict SemVer
|
|
101
|
+
validation; tags that only match the broad GitHub glob but not the package
|
|
102
|
+
version are rejected.
|
|
103
|
+
|
|
104
|
+
For a valid tag, the workflow:
|
|
105
|
+
|
|
106
|
+
1. checks out the tagged commit with full Git history;
|
|
107
|
+
2. verifies the tagged commit is contained in `origin/main`;
|
|
108
|
+
3. installs dependencies;
|
|
109
|
+
4. checks the tag against `package.json` and `CHANGELOG.md`;
|
|
110
|
+
5. runs `npm run release:verify`;
|
|
111
|
+
6. runs `npm pack --dry-run`;
|
|
112
|
+
7. checks whether the exact npm version is already published;
|
|
113
|
+
8. publishes `@akira-tl/forgerelay` when necessary;
|
|
114
|
+
9. creates the matching GitHub Release after npm publication succeeds.
|
|
115
|
+
|
|
116
|
+
The npm existence check makes the workflow safely restartable when npm
|
|
117
|
+
publication succeeds but GitHub Release creation fails afterward.
|
|
118
|
+
|
|
119
|
+
## First public npm release
|
|
120
|
+
|
|
121
|
+
Before the first public release, rename the GitHub repository to:
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
Akira-TL/forgerelay
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
and update the local `origin` remote if Git does not update it automatically.
|
|
128
|
+
The package metadata and release workflow intentionally target the final
|
|
129
|
+
ForgeRelay repository name.
|
|
130
|
+
|
|
131
|
+
If `@akira-tl/forgerelay` does not yet exist on npm, GitHub Actions can bootstrap
|
|
132
|
+
it with a temporary npm publishing token:
|
|
133
|
+
|
|
134
|
+
1. create an npm token that can publish packages in the `@akira-tl` scope;
|
|
135
|
+
2. add it to `Akira-TL/forgerelay` as the Actions secret `NPM_TOKEN`;
|
|
136
|
+
3. push the first verified ForgeRelay release tag;
|
|
137
|
+
4. let the tag workflow publish the package;
|
|
138
|
+
5. configure npm Trusted Publishing for the package using:
|
|
139
|
+
- owner: `Akira-TL`
|
|
140
|
+
- repository: `forgerelay`
|
|
141
|
+
- workflow filename: `release.yml`
|
|
142
|
+
6. delete the `NPM_TOKEN` GitHub secret.
|
|
143
|
+
|
|
144
|
+
After Trusted Publishing is configured, normal releases use GitHub Actions OIDC
|
|
145
|
+
through the workflow's `id-token: write` permission and do not need a long-lived
|
|
146
|
+
npm publishing token.
|
|
147
|
+
|
|
148
|
+
## Normal release procedure
|
|
149
|
+
|
|
150
|
+
1. Put all intended user-visible changes under `Unreleased`.
|
|
151
|
+
2. Run `npm run release:check`.
|
|
152
|
+
3. Run the appropriate `release:patch`, `release:minor`, or `release:major`
|
|
153
|
+
command.
|
|
154
|
+
4. Review the generated version and changelog diff.
|
|
155
|
+
5. Run `npm run release:verify`.
|
|
156
|
+
6. Commit the release-ready code and metadata and push `main`.
|
|
157
|
+
7. Create the exact version tag, for example:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
git tag v0.2.0
|
|
161
|
+
git push origin v0.2.0
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
The tag push is the publication action.
|
|
165
|
+
|
|
166
|
+
## Attribution guardrails
|
|
167
|
+
|
|
168
|
+
`release:check` intentionally verifies that public packages keep the required
|
|
169
|
+
upstream provenance:
|
|
170
|
+
|
|
171
|
+
- `LICENSE` must preserve `Copyright (c) 2026 Waishnav`;
|
|
172
|
+
- `LICENSE` records Akira-TL's modifications without replacing the upstream
|
|
173
|
+
notice;
|
|
174
|
+
- `NOTICE.md` must identify `https://github.com/Waishnav/devspace`;
|
|
175
|
+
- `NOTICE.md` must state that ForgeRelay is independently maintained by Akira-TL;
|
|
176
|
+
- the npm package must include `NOTICE.md`.
|
|
177
|
+
|
|
178
|
+
Do not weaken these checks as part of ordinary branding or release work.
|
|
179
|
+
|
|
180
|
+
## Compatibility identifiers
|
|
181
|
+
|
|
182
|
+
The ForgeRelay rename does not require destructive migration of internal state.
|
|
183
|
+
Some persisted identifiers deliberately keep historical DevSpace names when
|
|
184
|
+
changing them would orphan existing data, including older SQLite schema/file
|
|
185
|
+
identifiers and review Git refs. These are storage compatibility details, not
|
|
186
|
+
public product branding.
|
|
187
|
+
|
|
188
|
+
New user-facing configuration, managed branches, CLI output, package metadata,
|
|
189
|
+
and release names use ForgeRelay.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: forgerelay-agent/v1
|
|
3
|
+
name: claude-implementer
|
|
4
|
+
description: Implementation profile for multi-file changes, careful refactors, and failing test repair.
|
|
5
|
+
provider: claude
|
|
6
|
+
model: sonnet
|
|
7
|
+
thinking: high
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Take ownership of the requested implementation while keeping the change narrow.
|
|
11
|
+
Start by locating the smallest set of files that define the behavior, then make
|
|
12
|
+
the change in the existing style.
|
|
13
|
+
|
|
14
|
+
Working rules:
|
|
15
|
+
|
|
16
|
+
- Preserve existing public behavior unless the prompt explicitly asks to change it.
|
|
17
|
+
- Avoid broad rewrites, dependency churn, formatting-only edits, and speculative cleanup.
|
|
18
|
+
- Update or add focused tests when behavior changes.
|
|
19
|
+
- Run the most relevant checks available for the touched area, or explain why they could not run.
|
|
20
|
+
- If the task is ambiguous or blocked by missing context, stop with a clear blocker instead of guessing.
|
|
21
|
+
|
|
22
|
+
Report:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
summary:
|
|
26
|
+
tests_run:
|
|
27
|
+
blockers:
|
|
28
|
+
risks:
|
|
29
|
+
follow_up_needed:
|
|
30
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: forgerelay-agent/v1
|
|
3
|
+
name: codex-explorer
|
|
4
|
+
description: Read-only profile for bounded codebase questions, architecture tracing, and risk discovery.
|
|
5
|
+
provider: codex
|
|
6
|
+
model: gpt-5.4-mini
|
|
7
|
+
thinking: high
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Investigate without editing. Use this profile to answer bounded questions such
|
|
11
|
+
as how a feature works, where a behavior is implemented, what depends on a
|
|
12
|
+
module, or which files are relevant before a change.
|
|
13
|
+
|
|
14
|
+
- Do not modify files.
|
|
15
|
+
- Prefer direct evidence from code over broad repository summaries.
|
|
16
|
+
- Cite file paths, symbols, and commands that support the conclusion.
|
|
17
|
+
- Separate confirmed facts from inferences.
|
|
18
|
+
- Call out unknowns that would require running the app, inspecting external state, or asking the user.
|
|
19
|
+
|
|
20
|
+
Report:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
answer:
|
|
24
|
+
evidence:
|
|
25
|
+
relevant_files:
|
|
26
|
+
unknowns:
|
|
27
|
+
```
|