@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
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Native File Download
|
|
2
|
+
|
|
3
|
+
ForgeRelay can save a file attached to or generated by an MCP host directly into
|
|
4
|
+
an already-open workspace.
|
|
5
|
+
|
|
6
|
+
Enable the capability with:
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
FORGERELAY_ARTIFACTS=1 forgerelay serve
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The legacy `DEVSPACE_ARTIFACTS` variable remains a fallback during migration.
|
|
13
|
+
|
|
14
|
+
## Workflow
|
|
15
|
+
|
|
16
|
+
1. Open the destination project with `open_workspace`.
|
|
17
|
+
2. Call `download_artifact` with the native file value supplied by the MCP host,
|
|
18
|
+
the existing `workspaceId`, and a workspace-relative destination path.
|
|
19
|
+
3. Use the returned normalized path with ordinary ForgeRelay file tools.
|
|
20
|
+
|
|
21
|
+
The tool creates missing parent directories and refuses to overwrite an existing
|
|
22
|
+
destination.
|
|
23
|
+
|
|
24
|
+
## Input boundary
|
|
25
|
+
|
|
26
|
+
The `file` input must be the native value supplied by the MCP connector. Do not
|
|
27
|
+
replace it with:
|
|
28
|
+
|
|
29
|
+
- an arbitrary URL string;
|
|
30
|
+
- a local host path guessed by the model;
|
|
31
|
+
- base64 content;
|
|
32
|
+
- embedded credentials;
|
|
33
|
+
- an expanded object containing unsupported fields.
|
|
34
|
+
|
|
35
|
+
Signed URLs/native connector objects should not be copied into shell commands or
|
|
36
|
+
logs.
|
|
37
|
+
|
|
38
|
+
## Limits
|
|
39
|
+
|
|
40
|
+
Downloads are streamed under the configured maximum:
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
FORGERELAY_ARTIFACT_MAX_FILE_BYTES
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The default is 100 MiB (`104857600`). Partial temporary files use a private
|
|
47
|
+
ForgeRelay prefix and are published without overwrite after successful transfer.
|
|
48
|
+
|
|
49
|
+
The secure native-file publication implementation is currently exposed on Linux
|
|
50
|
+
where the required descriptor-anchored filesystem path is available.
|
|
51
|
+
|
|
52
|
+
## Non-goals
|
|
53
|
+
|
|
54
|
+
There is currently no:
|
|
55
|
+
|
|
56
|
+
- artifact quota or artifact-root database;
|
|
57
|
+
- TTL/pinning system;
|
|
58
|
+
- automatic background artifact cleanup service;
|
|
59
|
+
- arbitrary URL download mode;
|
|
60
|
+
- conflict/overwrite mode.
|
|
61
|
+
|
|
62
|
+
Use normal workspace tools for explicit inspection, replacement, movement,
|
|
63
|
+
renaming, or deletion after the file is present.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# ChatGPT Coding Workflow
|
|
2
|
+
|
|
3
|
+
ForgeRelay gives ChatGPT and other MCP hosts a local coding workspace with an
|
|
4
|
+
explicit lifecycle instead of treating every request as a fresh temporary
|
|
5
|
+
checkout.
|
|
6
|
+
|
|
7
|
+
## Workspace identity
|
|
8
|
+
|
|
9
|
+
`open_workspace` returns a `workspaceId`. Continue using that ID for later tools
|
|
10
|
+
in the same directory.
|
|
11
|
+
|
|
12
|
+
Workspace identity follows the canonical opened directory rather than the
|
|
13
|
+
conversation/request identity. Reopening the same checkout reuses the same
|
|
14
|
+
active workspace even from another conversation. Conversation metadata is used
|
|
15
|
+
only to decide whether bootstrap context such as project instructions should be
|
|
16
|
+
repeated to that conversation.
|
|
17
|
+
|
|
18
|
+
A Git worktree directory is a separate workspace identity from its source
|
|
19
|
+
checkout.
|
|
20
|
+
|
|
21
|
+
## Checkout-first behavior
|
|
22
|
+
|
|
23
|
+
Checkout mode is the default:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
open_workspace(path="~/project")
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
ForgeRelay works directly in that directory. It does not silently create an
|
|
30
|
+
isolated checkout.
|
|
31
|
+
|
|
32
|
+
Use worktree mode only when the user explicitly requests isolated or parallel
|
|
33
|
+
work:
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
open_workspace(path="~/project", mode="worktree")
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Managed worktrees
|
|
40
|
+
|
|
41
|
+
New ForgeRelay worktrees are branch-backed, not detached. A managed branch looks
|
|
42
|
+
like:
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
forgerelay/<repo>-<id>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The worktree normally lives under:
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
~/.forgerelay/worktrees
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Existing configured/legacy roots remain supported.
|
|
55
|
+
|
|
56
|
+
The recorded target branch is the local branch that should receive completed
|
|
57
|
+
work. An explicit `baseRef` must identify a local branch.
|
|
58
|
+
|
|
59
|
+
By default, a repeated worktree request for the same source/target reuses the
|
|
60
|
+
existing managed worktree. An explicit new-worktree request creates another
|
|
61
|
+
parallel branch/worktree.
|
|
62
|
+
|
|
63
|
+
`open_workspace` also returns known managed worktree paths and branch metadata
|
|
64
|
+
so a specific existing worktree can be reopened directly.
|
|
65
|
+
|
|
66
|
+
## Closing a managed worktree
|
|
67
|
+
|
|
68
|
+
After the task is complete and verified, call `close_worktree` with the managed
|
|
69
|
+
workspace ID and a commit message.
|
|
70
|
+
|
|
71
|
+
ForgeRelay:
|
|
72
|
+
|
|
73
|
+
1. verifies the source checkout remains on the expected target branch;
|
|
74
|
+
2. requires the source checkout to be clean;
|
|
75
|
+
3. verifies the managed worktree is on its recorded branch;
|
|
76
|
+
4. commits remaining worktree changes when needed;
|
|
77
|
+
5. rechecks cleanliness and source state;
|
|
78
|
+
6. requires the source HEAD to be an ancestor of the managed worktree commit;
|
|
79
|
+
7. fast-forwards the target branch;
|
|
80
|
+
8. removes the managed worktree;
|
|
81
|
+
9. deletes the already-merged managed branch.
|
|
82
|
+
|
|
83
|
+
If histories diverge, close is refused and the worktree is preserved. Rebase and
|
|
84
|
+
verify inside the worktree, then retry. The source checkout is not intentionally
|
|
85
|
+
placed into a merge-conflict state.
|
|
86
|
+
|
|
87
|
+
Legacy `devspace/*` managed branches remain closable when they are already stored
|
|
88
|
+
in workspace metadata; only new managed branches use `forgerelay/*`.
|
|
89
|
+
|
|
90
|
+
## Project instructions
|
|
91
|
+
|
|
92
|
+
When a workspace opens, ForgeRelay loads root-level instruction files when they
|
|
93
|
+
exist:
|
|
94
|
+
|
|
95
|
+
```text
|
|
96
|
+
AGENTS.md
|
|
97
|
+
AGENTS.MD
|
|
98
|
+
CLAUDE.md
|
|
99
|
+
CLAUDE.MD
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Nested instruction files are returned as available paths rather than all being
|
|
103
|
+
injected eagerly. Read the relevant nested file before working under that path.
|
|
104
|
+
|
|
105
|
+
## Agent Skills
|
|
106
|
+
|
|
107
|
+
ForgeRelay discovers standard Agent Skills from:
|
|
108
|
+
|
|
109
|
+
- `~/.agents/skills`
|
|
110
|
+
- project `.agents/skills`
|
|
111
|
+
- the active ForgeRelay config directory's `skills` folder
|
|
112
|
+
- `FORGERELAY_AGENT_DIR/skills` (defaults to `~/.codex/skills`)
|
|
113
|
+
- paths from `FORGERELAY_SKILL_PATHS`
|
|
114
|
+
|
|
115
|
+
When a task matches an advertised skill, read its `SKILL.md` before using other
|
|
116
|
+
files in the skill directory.
|
|
117
|
+
|
|
118
|
+
`FORGERELAY_SKILLS=0` hides skills.
|
|
119
|
+
|
|
120
|
+
## Local subagent profiles
|
|
121
|
+
|
|
122
|
+
With `FORGERELAY_SUBAGENTS=1`, profiles are discovered from the active global
|
|
123
|
+
config directory plus:
|
|
124
|
+
|
|
125
|
+
```text
|
|
126
|
+
.forgerelay/agents/*.md
|
|
127
|
+
.devspace/agents/*.md # migration compatibility
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The workspace result exposes only compact profile metadata so the host can
|
|
131
|
+
choose a provider/profile without loading full provider launch details.
|
|
132
|
+
|
|
133
|
+
The current model-facing delegation 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 this CLI indirection can be
|
|
142
|
+
removed.
|
|
143
|
+
|
|
144
|
+
## Tool modes
|
|
145
|
+
|
|
146
|
+
Default `FORGERELAY_TOOL_MODE=minimal` exposes:
|
|
147
|
+
|
|
148
|
+
```text
|
|
149
|
+
open_workspace
|
|
150
|
+
read
|
|
151
|
+
write
|
|
152
|
+
edit
|
|
153
|
+
bash
|
|
154
|
+
close_worktree
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
The exact lifecycle tools available depend on the active server configuration.
|
|
158
|
+
In minimal mode, normal shell inspection commands such as `rg`, `find`, and `ls`
|
|
159
|
+
can be used rather than dedicated MCP search tools.
|
|
160
|
+
|
|
161
|
+
`FORGERELAY_TOOL_MODE=full` adds dedicated search/directory tools.
|
|
162
|
+
|
|
163
|
+
Experimental `FORGERELAY_TOOL_MODE=codex` provides a smaller Codex-shaped
|
|
164
|
+
surface including `apply_patch`, `exec_command`, and `write_stdin`.
|
|
165
|
+
|
|
166
|
+
## Change review UI
|
|
167
|
+
|
|
168
|
+
By default `FORGERELAY_WIDGETS=full` attaches ChatGPT Apps-compatible UI to the
|
|
169
|
+
normal workspace/file/edit/shell tools.
|
|
170
|
+
|
|
171
|
+
`FORGERELAY_WIDGETS=changes` exposes aggregate `show_changes` behavior and keeps
|
|
172
|
+
widget usage focused on workspace/change review.
|
|
173
|
+
|
|
174
|
+
`FORGERELAY_WIDGETS=off` disables widget UI.
|
|
175
|
+
|
|
176
|
+
## Legacy configuration
|
|
177
|
+
|
|
178
|
+
`FORGERELAY_*` is the canonical environment-variable prefix. Equivalent
|
|
179
|
+
`DEVSPACE_*` variables remain accepted as fallbacks during migration.
|
|
180
|
+
|
|
181
|
+
Likewise, an existing `~/.devspace` configuration/state setup is reused when the
|
|
182
|
+
new ForgeRelay location does not yet exist. See
|
|
183
|
+
[Configuration Reference](configuration.md) for the compatibility rules.
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Configuration Reference
|
|
2
|
+
|
|
3
|
+
ForgeRelay can be configured through `forgerelay init`, persisted config files,
|
|
4
|
+
or environment variables.
|
|
5
|
+
|
|
6
|
+
## Config directory
|
|
7
|
+
|
|
8
|
+
New installations use:
|
|
9
|
+
|
|
10
|
+
```text
|
|
11
|
+
~/.forgerelay/config.json
|
|
12
|
+
~/.forgerelay/auth.json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Override the directory with:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
FORGERELAY_CONFIG_DIR=/path/to/config npx @akira-tl/forgerelay serve
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
For migration compatibility, `DEVSPACE_CONFIG_DIR` is accepted when
|
|
22
|
+
`FORGERELAY_CONFIG_DIR` is unset. Without either variable, ForgeRelay uses
|
|
23
|
+
`~/.forgerelay` unless that directory is absent and an existing `~/.devspace`
|
|
24
|
+
directory is present; in that case the legacy directory is reused.
|
|
25
|
+
|
|
26
|
+
## Commands
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npx @akira-tl/forgerelay init
|
|
30
|
+
npx @akira-tl/forgerelay serve
|
|
31
|
+
npx @akira-tl/forgerelay doctor
|
|
32
|
+
npx @akira-tl/forgerelay config get
|
|
33
|
+
npx @akira-tl/forgerelay config set publicBaseUrl https://forge.example.com
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Environment variable compatibility
|
|
37
|
+
|
|
38
|
+
The public prefix is `FORGERELAY_*`.
|
|
39
|
+
|
|
40
|
+
During the rename transition, the equivalent `DEVSPACE_*` variable remains a
|
|
41
|
+
fallback when the ForgeRelay variable is unset. For example:
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
FORGERELAY_ALLOWED_ROOTS
|
|
45
|
+
↓ if unset
|
|
46
|
+
DEVSPACE_ALLOWED_ROOTS
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
When both are present, `FORGERELAY_*` wins.
|
|
50
|
+
|
|
51
|
+
## Core variables
|
|
52
|
+
|
|
53
|
+
| Variable | Purpose |
|
|
54
|
+
| --- | --- |
|
|
55
|
+
| `HOST` | Local bind host. Defaults to `127.0.0.1`. |
|
|
56
|
+
| `PORT` | Local port. Defaults to `7676`. |
|
|
57
|
+
| `FORGERELAY_ALLOWED_ROOTS` | Comma-separated roots that workspaces may open. |
|
|
58
|
+
| `FORGERELAY_PUBLIC_BASE_URL` | Public origin, without `/mcp`. |
|
|
59
|
+
| `FORGERELAY_ALLOWED_HOSTS` | Optional Host-header allowlist override. |
|
|
60
|
+
| `FORGERELAY_OAUTH_OWNER_TOKEN` | Owner password. Must be at least 16 characters. |
|
|
61
|
+
| `FORGERELAY_STATE_DIR` | SQLite state directory. New default: `~/.local/share/forgerelay`. |
|
|
62
|
+
| `FORGERELAY_WORKTREE_ROOT` | Managed worktree directory. New default: `~/.forgerelay/worktrees`. |
|
|
63
|
+
| `FORGERELAY_WORKFLOW_INSTRUCTIONS` | Replace the built-in workflow policy while retaining the capability contract. |
|
|
64
|
+
| `FORGERELAY_APPEND_INSTRUCTIONS` | Append project/operator workflow policy. |
|
|
65
|
+
|
|
66
|
+
If an existing legacy state/worktree directory is present and the new default is
|
|
67
|
+
not, ForgeRelay reuses the legacy location rather than orphaning stored state.
|
|
68
|
+
Persisted `stateDir` and `worktreeRoot` values in `config.json` also continue to
|
|
69
|
+
win over defaults.
|
|
70
|
+
|
|
71
|
+
## Native artifact download
|
|
72
|
+
|
|
73
|
+
Native-file download is disabled by default. Enable it with:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
FORGERELAY_ARTIFACTS=1 npx @akira-tl/forgerelay serve
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
| Variable | Default | Purpose |
|
|
80
|
+
| --- | --- | --- |
|
|
81
|
+
| `FORGERELAY_ARTIFACTS` | `0` | Expose `download_artifact` for trusted native files. |
|
|
82
|
+
| `FORGERELAY_ARTIFACT_MAX_FILE_BYTES` | `104857600` | Maximum streamed size of one file (100 MiB). |
|
|
83
|
+
|
|
84
|
+
The same settings may be persisted as `artifactsEnabled` and
|
|
85
|
+
`artifactMaxFileBytes` in `config.json`.
|
|
86
|
+
|
|
87
|
+
The tool currently supports the secure native-file publication path on Linux.
|
|
88
|
+
See [Native File Download](artifact-exchange.md).
|
|
89
|
+
|
|
90
|
+
## OAuth
|
|
91
|
+
|
|
92
|
+
ForgeRelay uses a single-user Owner-password OAuth approval flow.
|
|
93
|
+
|
|
94
|
+
| Variable | Default |
|
|
95
|
+
| --- | --- |
|
|
96
|
+
| `FORGERELAY_OAUTH_ACCESS_TOKEN_TTL_SECONDS` | `3600` |
|
|
97
|
+
| `FORGERELAY_OAUTH_REFRESH_TOKEN_TTL_SECONDS` | `2592000` |
|
|
98
|
+
| `FORGERELAY_OAUTH_SCOPES` | legacy-compatible internal scope `devspace` |
|
|
99
|
+
| `FORGERELAY_OAUTH_ALLOWED_REDIRECT_HOSTS` | `chatgpt.com,localhost,127.0.0.1` |
|
|
100
|
+
|
|
101
|
+
The default OAuth scope intentionally remains the legacy internal value during
|
|
102
|
+
the rename so existing registrations/state do not need a destructive migration.
|
|
103
|
+
This is a protocol compatibility identifier, not product branding.
|
|
104
|
+
|
|
105
|
+
MCP clients discover metadata from:
|
|
106
|
+
|
|
107
|
+
```text
|
|
108
|
+
/.well-known/oauth-protected-resource/mcp
|
|
109
|
+
/.well-known/oauth-authorization-server
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Tool modes
|
|
113
|
+
|
|
114
|
+
`FORGERELAY_TOOL_MODE` controls the exposed MCP tool surface.
|
|
115
|
+
|
|
116
|
+
| Value | Behavior |
|
|
117
|
+
| --- | --- |
|
|
118
|
+
| `minimal` | Default. Exposes `open_workspace`, `read`, `write`, `edit`, and `bash`. |
|
|
119
|
+
| `full` | Adds dedicated `grep`, `glob`, and `ls` tools. |
|
|
120
|
+
| `codex` | Experimental Codex-shaped tool surface using `open_workspace`, `read`, `apply_patch`, `exec_command`, and `write_stdin`. |
|
|
121
|
+
|
|
122
|
+
`FORGERELAY_MINIMAL_TOOLS` remains a compatibility-style boolean alias when the
|
|
123
|
+
explicit tool mode is unset. The corresponding legacy `DEVSPACE_*` names are
|
|
124
|
+
also accepted.
|
|
125
|
+
|
|
126
|
+
Codex-mode commands run without a PTY by default. `tty: true` enables interactive
|
|
127
|
+
programs when the optional `node-pty` dependency is available.
|
|
128
|
+
|
|
129
|
+
## Widgets
|
|
130
|
+
|
|
131
|
+
`FORGERELAY_WIDGETS` controls ChatGPT Apps-compatible UI attachments.
|
|
132
|
+
|
|
133
|
+
| Value | Behavior |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| `full` | Default. Attach UI to exposed workspace/file/edit/shell tools. |
|
|
136
|
+
| `changes` | Attach UI to `open_workspace` and aggregate `show_changes`. |
|
|
137
|
+
| `off` | Disable widget UI. |
|
|
138
|
+
|
|
139
|
+
## Skills and subagents
|
|
140
|
+
|
|
141
|
+
| Variable | Purpose |
|
|
142
|
+
| --- | --- |
|
|
143
|
+
| `FORGERELAY_SKILLS` | Set to `0` to hide skills. Enabled by default. |
|
|
144
|
+
| `FORGERELAY_SUBAGENTS` | Set to `1` to expose configured subagent profiles. |
|
|
145
|
+
| `FORGERELAY_AGENT_DIR` | Defaults to `~/.codex`; its `skills` child is loaded for compatibility. |
|
|
146
|
+
| `FORGERELAY_SKILL_PATHS` | Optional comma-separated additional skill directories. |
|
|
147
|
+
|
|
148
|
+
Standard Agent Skills are discovered from:
|
|
149
|
+
|
|
150
|
+
- `~/.agents/skills`
|
|
151
|
+
- project `.agents/skills`
|
|
152
|
+
- the active ForgeRelay config directory's `skills` folder
|
|
153
|
+
- `FORGERELAY_AGENT_DIR/skills`
|
|
154
|
+
- paths from `FORGERELAY_SKILL_PATHS`
|
|
155
|
+
|
|
156
|
+
When subagents are enabled, profiles are discovered from:
|
|
157
|
+
|
|
158
|
+
- `~/.forgerelay/agents/*.md` for new installations;
|
|
159
|
+
- project `.forgerelay/agents/*.md`;
|
|
160
|
+
- active legacy config directory `~/.devspace/agents/*.md` when reused;
|
|
161
|
+
- project `.devspace/agents/*.md` for migration compatibility.
|
|
162
|
+
|
|
163
|
+
The bundled `subagent-delegation` skill teaches the current CLI workflow:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
forgerelay agents ls
|
|
167
|
+
forgerelay agents run <profile-or-provider-or-id> "<prompt>"
|
|
168
|
+
forgerelay agents show <id>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Logging
|
|
172
|
+
|
|
173
|
+
| Variable | Default |
|
|
174
|
+
| --- | --- |
|
|
175
|
+
| `FORGERELAY_LOG_LEVEL` | `info` |
|
|
176
|
+
| `FORGERELAY_LOG_FORMAT` | `json` |
|
|
177
|
+
| `FORGERELAY_LOG_REQUESTS` | `1` |
|
|
178
|
+
| `FORGERELAY_LOG_ASSETS` | `0` |
|
|
179
|
+
| `FORGERELAY_LOG_TOOL_CALLS` | `1` |
|
|
180
|
+
| `FORGERELAY_LOG_SHELL_COMMANDS` | `0` |
|
|
181
|
+
| `FORGERELAY_TRUST_PROXY` | `0` |
|
|
182
|
+
|
|
183
|
+
Set `FORGERELAY_LOG_FORMAT=pretty` for local debugging. Enable shell command
|
|
184
|
+
previews only when intentionally needed; they can reveal sensitive arguments.
|
|
185
|
+
|
|
186
|
+
## Environment-only example
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
FORGERELAY_OAUTH_OWNER_TOKEN="$(openssl rand -base64 32)" \
|
|
190
|
+
FORGERELAY_ALLOWED_ROOTS="$HOME/personal,$HOME/work" \
|
|
191
|
+
FORGERELAY_PUBLIC_BASE_URL="https://forge.example.com" \
|
|
192
|
+
FORGERELAY_WORKTREE_ROOT="$HOME/.forgerelay/worktrees" \
|
|
193
|
+
FORGERELAY_ARTIFACTS="1" \
|
|
194
|
+
FORGERELAY_TOOL_MODE="minimal" \
|
|
195
|
+
FORGERELAY_WIDGETS="full" \
|
|
196
|
+
npx @akira-tl/forgerelay serve
|
|
197
|
+
```
|
package/docs/gotchas.md
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# Troubleshooting Gotchas
|
|
2
|
+
|
|
3
|
+
## `forgerelay` command not found
|
|
4
|
+
|
|
5
|
+
Use `npx`:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx @akira-tl/forgerelay init
|
|
9
|
+
npx @akira-tl/forgerelay serve
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
If installed globally, confirm npm's global bin directory is on `PATH`.
|
|
13
|
+
|
|
14
|
+
## Unsupported Node version
|
|
15
|
+
|
|
16
|
+
ForgeRelay requires Node `>=22.19 <27`.
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
node --version
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## `better-sqlite3` could not load
|
|
23
|
+
|
|
24
|
+
Native dependencies may have been installed under a different Node runtime.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm rebuild better-sqlite3
|
|
28
|
+
npx @akira-tl/forgerelay doctor
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Existing DevSpace config is still being used
|
|
32
|
+
|
|
33
|
+
This is intentional migration behavior. If `~/.forgerelay` does not exist but
|
|
34
|
+
`~/.devspace` does, ForgeRelay reuses the legacy config directory so existing
|
|
35
|
+
OAuth/state configuration is not silently abandoned.
|
|
36
|
+
|
|
37
|
+
Check the resolved directory:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
forgerelay doctor
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
To force a new location, set:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
FORGERELAY_CONFIG_DIR="$HOME/.forgerelay" forgerelay init
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Do not delete the old directory until you have confirmed which persisted state,
|
|
50
|
+
worktrees, skills, and profiles you still need.
|
|
51
|
+
|
|
52
|
+
## Public URL includes `/mcp`
|
|
53
|
+
|
|
54
|
+
Store the public **origin**:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
https://your-tunnel-host.example.com
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The MCP client uses:
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
https://your-tunnel-host.example.com/mcp
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Fix a persisted URL with:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
forgerelay config set publicBaseUrl https://your-tunnel-host.example.com
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Tunnel URL changed
|
|
73
|
+
|
|
74
|
+
For one run:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
FORGERELAY_PUBLIC_BASE_URL="https://new-tunnel.example.com" forgerelay serve
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
For a stable URL:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
forgerelay config set publicBaseUrl https://forge.example.com
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Host-header or 403 problems
|
|
87
|
+
|
|
88
|
+
Run:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
forgerelay doctor
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Confirm the public hostname appears in the resolved allowed hosts.
|
|
95
|
+
|
|
96
|
+
For intentional local debugging only:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
FORGERELAY_ALLOWED_HOSTS="*" forgerelay serve
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## OAuth redirect host rejected
|
|
103
|
+
|
|
104
|
+
The default allowed redirect hosts are:
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
chatgpt.com
|
|
108
|
+
localhost
|
|
109
|
+
127.0.0.1
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
For another MCP client:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
FORGERELAY_OAUTH_ALLOWED_REDIRECT_HOSTS="chatgpt.com,example.com" forgerelay serve
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Owner password not accepted
|
|
119
|
+
|
|
120
|
+
Check the auth file reported by:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
forgerelay doctor
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
New installs normally use:
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
~/.forgerelay/auth.json
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
A migrated install may still use `~/.devspace/auth.json`.
|
|
133
|
+
|
|
134
|
+
Regenerate setup intentionally with:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
forgerelay init --force
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Unknown `workspaceId`
|
|
141
|
+
|
|
142
|
+
Reopen the project with `open_workspace` and use the returned ID. Active
|
|
143
|
+
workspace identity is directory-based; reopening the same canonical checkout
|
|
144
|
+
reuses its workspace ID when the stored session remains valid.
|
|
145
|
+
|
|
146
|
+
Worktree directories have their own workspace identities.
|
|
147
|
+
|
|
148
|
+
## Worktree mode fails
|
|
149
|
+
|
|
150
|
+
Managed worktrees require:
|
|
151
|
+
|
|
152
|
+
- Git;
|
|
153
|
+
- a repository with at least one commit;
|
|
154
|
+
- an attached local source branch;
|
|
155
|
+
- a local `baseRef` when one is explicitly supplied.
|
|
156
|
+
|
|
157
|
+
New managed branches use:
|
|
158
|
+
|
|
159
|
+
```text
|
|
160
|
+
forgerelay/*
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Legacy persisted `devspace/*` branches remain valid and closable.
|
|
164
|
+
|
|
165
|
+
Uncommitted source-checkout changes are not automatically copied into a newly
|
|
166
|
+
created worktree.
|
|
167
|
+
|
|
168
|
+
## `close_worktree` refuses to finish
|
|
169
|
+
|
|
170
|
+
Close is deliberately refused when:
|
|
171
|
+
|
|
172
|
+
- the source checkout is dirty;
|
|
173
|
+
- the source checkout is no longer on the recorded target branch;
|
|
174
|
+
- the managed worktree is on the wrong branch;
|
|
175
|
+
- source and managed histories diverged.
|
|
176
|
+
|
|
177
|
+
Integration is fast-forward-only. If histories diverge, rebase and verify inside
|
|
178
|
+
the managed worktree, then retry. ForgeRelay does not intentionally leave the
|
|
179
|
+
source checkout in a merge-conflict state.
|
|
180
|
+
|
|
181
|
+
## Windows shell commands fail
|
|
182
|
+
|
|
183
|
+
ForgeRelay shell execution requires Bash. Native PowerShell and `cmd.exe` command
|
|
184
|
+
execution are not currently supported by the shell runtime.
|
|
185
|
+
|
|
186
|
+
Use Git Bash, WSL, MSYS2, or Cygwin Bash, then run:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
forgerelay doctor
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Skills do not appear
|
|
193
|
+
|
|
194
|
+
Skills are enabled by default. Check:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
FORGERELAY_SKILLS=1 forgerelay serve
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Standard paths include:
|
|
201
|
+
|
|
202
|
+
- `~/.agents/skills`
|
|
203
|
+
- project `.agents/skills`
|
|
204
|
+
- active ForgeRelay config `skills` directory
|
|
205
|
+
- `FORGERELAY_AGENT_DIR/skills`
|
|
206
|
+
- additional `FORGERELAY_SKILL_PATHS`
|
|
207
|
+
|
|
208
|
+
## Subagent profiles do not appear
|
|
209
|
+
|
|
210
|
+
Enable subagents:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
FORGERELAY_SUBAGENTS=1 forgerelay serve
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
New profile locations include:
|
|
217
|
+
|
|
218
|
+
```text
|
|
219
|
+
~/.forgerelay/agents/*.md
|
|
220
|
+
.forgerelay/agents/*.md
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Legacy `.devspace/agents` paths remain supported.
|
|
224
|
+
|
|
225
|
+
`forgerelay agents ls` lists sessions, not profile definitions. The compact
|
|
226
|
+
profile catalog is returned through `open_workspace`.
|
|
227
|
+
|
|
228
|
+
## Review/change card does not appear
|
|
229
|
+
|
|
230
|
+
Per-tool widgets default to:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
FORGERELAY_WIDGETS=full
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Use `FORGERELAY_WIDGETS=changes` for aggregate `show_changes`, or `off` to
|
|
237
|
+
disable UI. Plain MCP clients may ignore ChatGPT Apps widget metadata.
|
|
238
|
+
|
|
239
|
+
## Data retention
|
|
240
|
+
|
|
241
|
+
ForgeRelay does not yet automatically prune all persisted workspace sessions,
|
|
242
|
+
conversation bindings, or review refs. Retention/GC remains roadmap work; do not
|
|
243
|
+
assume inactive records are deleted automatically.
|