@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.
Files changed (373) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/LICENSE +22 -0
  3. package/NOTICE.md +19 -0
  4. package/README.md +270 -0
  5. package/dist/apply-patch.js +402 -0
  6. package/dist/artifact-error.js +8 -0
  7. package/dist/artifact-tools.js +377 -0
  8. package/dist/cli.js +597 -0
  9. package/dist/config.js +224 -0
  10. package/dist/db/client.js +29 -0
  11. package/dist/db/migrations.js +189 -0
  12. package/dist/db/schema.js +85 -0
  13. package/dist/git-worktrees.js +255 -0
  14. package/dist/git.js +41 -0
  15. package/dist/incoming-artifacts.js +378 -0
  16. package/dist/local-agent-adapters.js +653 -0
  17. package/dist/local-agent-availability.js +119 -0
  18. package/dist/local-agent-path.js +25 -0
  19. package/dist/local-agent-profiles.js +136 -0
  20. package/dist/local-agent-runtime.js +48 -0
  21. package/dist/local-agent-store.js +145 -0
  22. package/dist/local-agent-targets.js +80 -0
  23. package/dist/logger.js +69 -0
  24. package/dist/mcp/server-instructions.js +78 -0
  25. package/dist/mcp-sessions.js +56 -0
  26. package/dist/oauth-provider.js +237 -0
  27. package/dist/oauth-store.js +138 -0
  28. package/dist/pi-tools.js +81 -0
  29. package/dist/process-platform.js +49 -0
  30. package/dist/process-sessions.js +337 -0
  31. package/dist/request-meta.js +9 -0
  32. package/dist/review-checkpoints.js +219 -0
  33. package/dist/roots.js +37 -0
  34. package/dist/server-shutdown.js +12 -0
  35. package/dist/server.js +1596 -0
  36. package/dist/skills.js +89 -0
  37. package/dist/ui/.vite/manifest.json +2521 -0
  38. package/dist/ui/assets/abap-CLvhMVsD.js +1 -0
  39. package/dist/ui/assets/actionscript-3--17pq3dv.js +1 -0
  40. package/dist/ui/assets/ada-C5qYipkI.js +1 -0
  41. package/dist/ui/assets/andromeeda-vGVdxbeo.js +1 -0
  42. package/dist/ui/assets/angular-html-CovppXt5.js +1 -0
  43. package/dist/ui/assets/angular-ts-0Y9l6YXu.js +1 -0
  44. package/dist/ui/assets/apache-U0d_L8uA.js +1 -0
  45. package/dist/ui/assets/apex-CGTLDQj6.js +1 -0
  46. package/dist/ui/assets/apl-BmBhiklA.js +1 -0
  47. package/dist/ui/assets/applescript-CCn79oCD.js +1 -0
  48. package/dist/ui/assets/ara-4CJ0cIlV.js +1 -0
  49. package/dist/ui/assets/asciidoc-DE70LPWp.js +1 -0
  50. package/dist/ui/assets/asm-Cmm7eHzH.js +1 -0
  51. package/dist/ui/assets/astro-BAmqcqyV.js +1 -0
  52. package/dist/ui/assets/aurora-x-CDeNXAV0.js +1 -0
  53. package/dist/ui/assets/awk-BWXHIvNe.js +1 -0
  54. package/dist/ui/assets/ayu-dark-DluEY0Gj.js +1 -0
  55. package/dist/ui/assets/ayu-light-C3h-C4tm.js +1 -0
  56. package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  57. package/dist/ui/assets/ballerina-B7ZEbQpA.js +1 -0
  58. package/dist/ui/assets/bat-Bo4NYOV-.js +1 -0
  59. package/dist/ui/assets/beancount-D-usSTwE.js +1 -0
  60. package/dist/ui/assets/berry-DKpUyyne.js +1 -0
  61. package/dist/ui/assets/bibtex-Ci_nEsc7.js +1 -0
  62. package/dist/ui/assets/bicep-CUHmPFLl.js +1 -0
  63. package/dist/ui/assets/bird2-C2hNVINV.js +1 -0
  64. package/dist/ui/assets/blade-BjFcmRJo.js +1 -0
  65. package/dist/ui/assets/bsl-BkkzgIyY.js +1 -0
  66. package/dist/ui/assets/c-CaOJn4x0.js +1 -0
  67. package/dist/ui/assets/c3-CnJL0r0V.js +1 -0
  68. package/dist/ui/assets/cadence-CQ2zXKGN.js +1 -0
  69. package/dist/ui/assets/cairo-DLTphjLi.js +1 -0
  70. package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
  71. package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
  72. package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
  73. package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
  74. package/dist/ui/assets/clarity-SemFz856.js +1 -0
  75. package/dist/ui/assets/clojure-DqKBuwfJ.js +1 -0
  76. package/dist/ui/assets/cmake-Bj61d0ZC.js +1 -0
  77. package/dist/ui/assets/cobol-DR4zWFMt.js +1 -0
  78. package/dist/ui/assets/codeowners-C8r90Shi.js +1 -0
  79. package/dist/ui/assets/codeql-oeQT6MSM.js +1 -0
  80. package/dist/ui/assets/coffee-ReGSThmM.js +1 -0
  81. package/dist/ui/assets/common-lisp-Cv5bFMCO.js +1 -0
  82. package/dist/ui/assets/coq-BrsZFFmf.js +1 -0
  83. package/dist/ui/assets/cpp-CnlQh6MO.js +1 -0
  84. package/dist/ui/assets/crystal-BrpPbH1U.js +1 -0
  85. package/dist/ui/assets/csharp-Ct8U2NOr.js +1 -0
  86. package/dist/ui/assets/css-DRBEvyPU.js +1 -0
  87. package/dist/ui/assets/csv-Dx-8-gkx.js +1 -0
  88. package/dist/ui/assets/cue-CE9AQfxI.js +1 -0
  89. package/dist/ui/assets/cypher-ClKdZ_lG.js +1 -0
  90. package/dist/ui/assets/d-qD-0Kul2.js +1 -0
  91. package/dist/ui/assets/dark-plus-Cs2F2srj.js +1 -0
  92. package/dist/ui/assets/dart-DkHntEIa.js +1 -0
  93. package/dist/ui/assets/dax-BkyTk9wS.js +1 -0
  94. package/dist/ui/assets/desktop-Dlh5hvp9.js +1 -0
  95. package/dist/ui/assets/diff-woXpYk--.js +1 -0
  96. package/dist/ui/assets/docker-IyjqRm3v.js +1 -0
  97. package/dist/ui/assets/dotenv-_5a1GRtc.js +1 -0
  98. package/dist/ui/assets/dracula-BHWKrbxM.js +1 -0
  99. package/dist/ui/assets/dracula-soft-5eyTD99u.js +1 -0
  100. package/dist/ui/assets/dream-maker-DW3nJb8Q.js +1 -0
  101. package/dist/ui/assets/edge-cfwpdvl9.js +1 -0
  102. package/dist/ui/assets/elixir-7owrJxb6.js +1 -0
  103. package/dist/ui/assets/elm-udiOjODk.js +1 -0
  104. package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +1 -0
  105. package/dist/ui/assets/erb-8ctXHMkS.js +1 -0
  106. package/dist/ui/assets/erlang-Cphh6RMH.js +1 -0
  107. package/dist/ui/assets/everforest-dark-sB-x3p7T.js +1 -0
  108. package/dist/ui/assets/everforest-light-Df2xbC6M.js +1 -0
  109. package/dist/ui/assets/fennel-DQxkIbk2.js +1 -0
  110. package/dist/ui/assets/fish-BJitypiv.js +1 -0
  111. package/dist/ui/assets/fluent-C03EYrpw.js +1 -0
  112. package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
  113. package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +1 -0
  114. package/dist/ui/assets/fsharp-D13ZGOAj.js +1 -0
  115. package/dist/ui/assets/gdresource-C0sCabJj.js +1 -0
  116. package/dist/ui/assets/gdscript-Cp2uCuqX.js +1 -0
  117. package/dist/ui/assets/gdshader-CBce3t8t.js +1 -0
  118. package/dist/ui/assets/genie-CV2tkWYe.js +1 -0
  119. package/dist/ui/assets/gherkin-DExj1W_8.js +1 -0
  120. package/dist/ui/assets/git-commit-BSykSTBG.js +1 -0
  121. package/dist/ui/assets/git-rebase-P0V_qK1w.js +1 -0
  122. package/dist/ui/assets/github-dark-C-LZuMrd.js +1 -0
  123. package/dist/ui/assets/github-dark-default-DXG-b-1a.js +1 -0
  124. package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  125. package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  126. package/dist/ui/assets/github-light-EUqPIrTm.js +1 -0
  127. package/dist/ui/assets/github-light-default-BXViO-2h.js +1 -0
  128. package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  129. package/dist/ui/assets/gleam-CSRkHgEL.js +1 -0
  130. package/dist/ui/assets/glimmer-js-CZ14ED7U.js +1 -0
  131. package/dist/ui/assets/glimmer-ts-DtBSFP-o.js +1 -0
  132. package/dist/ui/assets/glsl-BX2BkZJK.js +1 -0
  133. package/dist/ui/assets/gn-ilITqXS6.js +1 -0
  134. package/dist/ui/assets/gnuplot-7GGW24-e.js +1 -0
  135. package/dist/ui/assets/go-BJwz_mda.js +1 -0
  136. package/dist/ui/assets/graphql-Dj_cPv4w.js +1 -0
  137. package/dist/ui/assets/groovy-CacY0gHj.js +1 -0
  138. package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  139. package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  140. package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  141. package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  142. package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  143. package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  144. package/dist/ui/assets/hack-DGRkd8xn.js +1 -0
  145. package/dist/ui/assets/haml-BAPSvujW.js +1 -0
  146. package/dist/ui/assets/handlebars-PYksdULG.js +1 -0
  147. package/dist/ui/assets/haskell-D8IpX4py.js +1 -0
  148. package/dist/ui/assets/haxe-OTjmBuCE.js +1 -0
  149. package/dist/ui/assets/hcl-Dh228itO.js +1 -0
  150. package/dist/ui/assets/heavy-payload-BjE0LSUi.js +4 -0
  151. package/dist/ui/assets/hjson-CxZEssPk.js +1 -0
  152. package/dist/ui/assets/hlsl-Cvrh5tZx.js +1 -0
  153. package/dist/ui/assets/horizon-CE9ld1lL.js +1 -0
  154. package/dist/ui/assets/horizon-bright-Br1oVSNq.js +1 -0
  155. package/dist/ui/assets/houston-CsvMBhTu.js +1 -0
  156. package/dist/ui/assets/html-DloAPGZ1.js +1 -0
  157. package/dist/ui/assets/html-derivative-C6q86ZrS.js +1 -0
  158. package/dist/ui/assets/http-fPvYDvHA.js +1 -0
  159. package/dist/ui/assets/hurl-Dbir4WvE.js +1 -0
  160. package/dist/ui/assets/hxml-B0Qn7Nwc.js +1 -0
  161. package/dist/ui/assets/hy-CZbG8q4J.js +1 -0
  162. package/dist/ui/assets/imba-DsUTQ-LC.js +1 -0
  163. package/dist/ui/assets/ini-B5eOa1yu.js +1 -0
  164. package/dist/ui/assets/java-DvkqXg3z.js +1 -0
  165. package/dist/ui/assets/javascript-TONTV6Ty.js +1 -0
  166. package/dist/ui/assets/jinja-OM1F5Gct.js +1 -0
  167. package/dist/ui/assets/jison-CBttugts.js +1 -0
  168. package/dist/ui/assets/json-Db5oY-7J.js +1 -0
  169. package/dist/ui/assets/json5-BR5RXkoi.js +1 -0
  170. package/dist/ui/assets/jsonc-CYpm1nAK.js +1 -0
  171. package/dist/ui/assets/jsonl-CmCQp5Yx.js +1 -0
  172. package/dist/ui/assets/jsonnet-CJTPZ8u_.js +1 -0
  173. package/dist/ui/assets/jssm-DXw9l8Rf.js +1 -0
  174. package/dist/ui/assets/jsx-DKeJCgsc.js +1 -0
  175. package/dist/ui/assets/julia-NlIPhXaL.js +1 -0
  176. package/dist/ui/assets/just-BXBJB-mX.js +1 -0
  177. package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
  178. package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +1 -0
  179. package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +1 -0
  180. package/dist/ui/assets/kdl-CsD5j6eV.js +1 -0
  181. package/dist/ui/assets/kotlin-DhhofPvG.js +1 -0
  182. package/dist/ui/assets/kusto-BUv0MjJC.js +1 -0
  183. package/dist/ui/assets/laserwave-C_8bwKvT.js +1 -0
  184. package/dist/ui/assets/latex-CGK-6yDy.js +1 -0
  185. package/dist/ui/assets/lean-CewbzKMR.js +1 -0
  186. package/dist/ui/assets/less-DVTAwKKz.js +1 -0
  187. package/dist/ui/assets/light-plus-DVQuIRkW.js +1 -0
  188. package/dist/ui/assets/liquid-D7waQ0MY.js +1 -0
  189. package/dist/ui/assets/llvm-Cm23YOpf.js +1 -0
  190. package/dist/ui/assets/log-BNLmms1o.js +1 -0
  191. package/dist/ui/assets/logo-Cluzi2Zq.js +1 -0
  192. package/dist/ui/assets/lua-C_kkt4h1.js +1 -0
  193. package/dist/ui/assets/luau-CNKltnaQ.js +1 -0
  194. package/dist/ui/assets/make-Dixweg8N.js +1 -0
  195. package/dist/ui/assets/markdown-BYOwaDjH.js +1 -0
  196. package/dist/ui/assets/marko-BokXuCts.js +1 -0
  197. package/dist/ui/assets/material-theme-Bm3Qr25_.js +1 -0
  198. package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +1 -0
  199. package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +1 -0
  200. package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  201. package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  202. package/dist/ui/assets/matlab-D7qyCx1q.js +1 -0
  203. package/dist/ui/assets/mdc-Bk0nnUJA.js +1 -0
  204. package/dist/ui/assets/mdx-DQZ5AkYe.js +1 -0
  205. package/dist/ui/assets/mermaid-Bk4SNUv9.js +1 -0
  206. package/dist/ui/assets/min-dark-BSWPekZh.js +1 -0
  207. package/dist/ui/assets/min-light-DDpmG2fV.js +1 -0
  208. package/dist/ui/assets/mipsasm-BMqwQI7S.js +1 -0
  209. package/dist/ui/assets/mojo-BgCJLMeH.js +1 -0
  210. package/dist/ui/assets/monokai-CdkpiU2Y.js +1 -0
  211. package/dist/ui/assets/moonbit-CaWjb8XO.js +1 -0
  212. package/dist/ui/assets/move-B1IS1UjX.js +1 -0
  213. package/dist/ui/assets/narrat-_X_XdTYD.js +1 -0
  214. package/dist/ui/assets/nextflow-Bbiyy34d.js +1 -0
  215. package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +1 -0
  216. package/dist/ui/assets/nginx-jM6NF9TV.js +1 -0
  217. package/dist/ui/assets/night-owl-DhmEMT88.js +1 -0
  218. package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +1 -0
  219. package/dist/ui/assets/nim-hYsL-WKb.js +1 -0
  220. package/dist/ui/assets/nix-IvuFDN5E.js +1 -0
  221. package/dist/ui/assets/nord-Cb4Vim4T.js +1 -0
  222. package/dist/ui/assets/nushell-DcLAeLz5.js +1 -0
  223. package/dist/ui/assets/objective-c-D1A_Heim.js +1 -0
  224. package/dist/ui/assets/objective-cpp-BsSzOQcm.js +1 -0
  225. package/dist/ui/assets/ocaml-O90oeIOV.js +1 -0
  226. package/dist/ui/assets/odin-B1RWQWA5.js +1 -0
  227. package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +1 -0
  228. package/dist/ui/assets/one-light-D7Lr4KcI.js +1 -0
  229. package/dist/ui/assets/openscad-BUDT5pXO.js +1 -0
  230. package/dist/ui/assets/pascal-4ZHwLPI5.js +1 -0
  231. package/dist/ui/assets/perl-DBI_cUHJ.js +1 -0
  232. package/dist/ui/assets/php-BX_aQhFl.js +1 -0
  233. package/dist/ui/assets/pierre-dark-sU4Zdns8.js +1 -0
  234. package/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +1 -0
  235. package/dist/ui/assets/pierre-light-DWBk51d8.js +1 -0
  236. package/dist/ui/assets/pierre-light-soft-CodEzPxf.js +1 -0
  237. package/dist/ui/assets/pkl-ot-7Btpt.js +1 -0
  238. package/dist/ui/assets/plastic-DQwYfKfQ.js +1 -0
  239. package/dist/ui/assets/plsql-DGHpHOYJ.js +1 -0
  240. package/dist/ui/assets/po-BiJDBrnU.js +1 -0
  241. package/dist/ui/assets/poimandres-DRFjx7u4.js +1 -0
  242. package/dist/ui/assets/polar-C7UOKdEL.js +1 -0
  243. package/dist/ui/assets/postcss-BXeXVLqQ.js +1 -0
  244. package/dist/ui/assets/powerquery-DNMTfnFr.js +1 -0
  245. package/dist/ui/assets/powershell-DshXNtvi.js +1 -0
  246. package/dist/ui/assets/prisma-BsRQq5mF.js +1 -0
  247. package/dist/ui/assets/prolog-iXnhIJG7.js +1 -0
  248. package/dist/ui/assets/proto-DB4EqR-F.js +1 -0
  249. package/dist/ui/assets/pug-DwFAYy1e.js +1 -0
  250. package/dist/ui/assets/puppet-CDv2pdJW.js +1 -0
  251. package/dist/ui/assets/purescript-9MfHhQsQ.js +1 -0
  252. package/dist/ui/assets/python-gzcpVVnB.js +1 -0
  253. package/dist/ui/assets/qml-eLSwQUKt.js +1 -0
  254. package/dist/ui/assets/qmldir-DCQb3MpD.js +1 -0
  255. package/dist/ui/assets/qss-Fe1Jh2GI.js +1 -0
  256. package/dist/ui/assets/r-BMnQsMLf.js +1 -0
  257. package/dist/ui/assets/racket-DcIDlBhZ.js +1 -0
  258. package/dist/ui/assets/raku-B3gFvitq.js +1 -0
  259. package/dist/ui/assets/razor-CgciiMyw.js +1 -0
  260. package/dist/ui/assets/red-CJ3rzSJv.js +1 -0
  261. package/dist/ui/assets/reg-CRGYupPL.js +1 -0
  262. package/dist/ui/assets/regexp-ZrURNrn5.js +1 -0
  263. package/dist/ui/assets/rel-BtDbiS_P.js +1 -0
  264. package/dist/ui/assets/review-payload-HGkpJjjm.js +1 -0
  265. package/dist/ui/assets/riscv-Ckw8ddFX.js +1 -0
  266. package/dist/ui/assets/ron-VUp2lXgN.js +1 -0
  267. package/dist/ui/assets/rose-pine-BthvhNj6.js +1 -0
  268. package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
  269. package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +1 -0
  270. package/dist/ui/assets/rosmsg-CAekHB0j.js +1 -0
  271. package/dist/ui/assets/rst-EoAOr3M6.js +1 -0
  272. package/dist/ui/assets/ruby-Dqx5_Rqw.js +1 -0
  273. package/dist/ui/assets/rust-Cfkwpbl8.js +1 -0
  274. package/dist/ui/assets/sas-Bf6xPLSX.js +1 -0
  275. package/dist/ui/assets/sass-DXrisJhu.js +1 -0
  276. package/dist/ui/assets/scala-DKOlJaKm.js +1 -0
  277. package/dist/ui/assets/scheme-DQCgrYNe.js +1 -0
  278. package/dist/ui/assets/scrollbar-DX4Ujotb.js +287 -0
  279. package/dist/ui/assets/scss-DDpW3yTd.js +1 -0
  280. package/dist/ui/assets/sdbl-bTVj8UrX.js +1 -0
  281. package/dist/ui/assets/shaderlab-TOUzSsQk.js +1 -0
  282. package/dist/ui/assets/shellscript-DayAQ-W9.js +1 -0
  283. package/dist/ui/assets/shellsession-jPr_lSnA.js +1 -0
  284. package/dist/ui/assets/slack-dark-DnToyrRv.js +1 -0
  285. package/dist/ui/assets/slack-ochin-B2OO5cIa.js +1 -0
  286. package/dist/ui/assets/smalltalk-B16xEiuN.js +1 -0
  287. package/dist/ui/assets/snazzy-light-4G7pJPwS.js +1 -0
  288. package/dist/ui/assets/solarized-dark-DV17i1UV.js +1 -0
  289. package/dist/ui/assets/solarized-light-DSh2HLQt.js +1 -0
  290. package/dist/ui/assets/solidity-CKzVLygQ.js +1 -0
  291. package/dist/ui/assets/soy-X9adks8G.js +1 -0
  292. package/dist/ui/assets/sparql-D_iOobhT.js +1 -0
  293. package/dist/ui/assets/splunk-BC2Px7Mm.js +1 -0
  294. package/dist/ui/assets/sql-Bmt09AIR.js +1 -0
  295. package/dist/ui/assets/ssh-config-BgfXC-Er.js +1 -0
  296. package/dist/ui/assets/stata-DVkNpH8r.js +1 -0
  297. package/dist/ui/assets/stylus-B6D30XZt.js +1 -0
  298. package/dist/ui/assets/surrealql-eEXzMb8j.js +1 -0
  299. package/dist/ui/assets/svelte-CFoBxZF3.js +1 -0
  300. package/dist/ui/assets/swift-DonLKvLd.js +1 -0
  301. package/dist/ui/assets/synthwave-84-nFMaYfgc.js +1 -0
  302. package/dist/ui/assets/system-verilog-DJ5XKQeo.js +1 -0
  303. package/dist/ui/assets/systemd-BxMlprV5.js +1 -0
  304. package/dist/ui/assets/talonscript-CohzipZa.js +1 -0
  305. package/dist/ui/assets/tasl-DMoTqEGO.js +1 -0
  306. package/dist/ui/assets/tcl-CZd0xW_V.js +1 -0
  307. package/dist/ui/assets/templ-Da_324JF.js +1 -0
  308. package/dist/ui/assets/terraform-DswuEJGm.js +1 -0
  309. package/dist/ui/assets/tex-HAzlmKJ0.js +1 -0
  310. package/dist/ui/assets/tokyo-night-oM2G3aXe.js +1 -0
  311. package/dist/ui/assets/toml-CcmNWLt0.js +1 -0
  312. package/dist/ui/assets/ts-tags-7iLrNH8p.js +1 -0
  313. package/dist/ui/assets/tsv-sltzmVWM.js +1 -0
  314. package/dist/ui/assets/tsx-gZaXf8PJ.js +1 -0
  315. package/dist/ui/assets/turtle-ByJddavk.js +1 -0
  316. package/dist/ui/assets/twig-CLpQ7p1N.js +1 -0
  317. package/dist/ui/assets/typescript-B2WWCRI2.js +1 -0
  318. package/dist/ui/assets/typespec-B88KGewJ.js +1 -0
  319. package/dist/ui/assets/typst-DI99ib-x.js +1 -0
  320. package/dist/ui/assets/v-DETTlOr0.js +1 -0
  321. package/dist/ui/assets/vala-zf12oZj6.js +1 -0
  322. package/dist/ui/assets/vb-Djn5o6TS.js +1 -0
  323. package/dist/ui/assets/verilog-CiiDBU1e.js +1 -0
  324. package/dist/ui/assets/vesper-D5bVUKB1.js +1 -0
  325. package/dist/ui/assets/vhdl-BroJfC0k.js +1 -0
  326. package/dist/ui/assets/viml-DvXPmvsu.js +1 -0
  327. package/dist/ui/assets/vitesse-black-fwtXNY1n.js +1 -0
  328. package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
  329. package/dist/ui/assets/vitesse-light-VbXTXTou.js +1 -0
  330. package/dist/ui/assets/vue-No_8Jygd.js +1 -0
  331. package/dist/ui/assets/vue-html-kHJg98Kk.js +1 -0
  332. package/dist/ui/assets/vue-vine-Df4cEYaN.js +1 -0
  333. package/dist/ui/assets/vyper-CgoNMtux.js +1 -0
  334. package/dist/ui/assets/wasm-BnjxR4X6.js +1 -0
  335. package/dist/ui/assets/wasm-ByWQv1Qj.js +1 -0
  336. package/dist/ui/assets/wenyan-C8pVoKbM.js +1 -0
  337. package/dist/ui/assets/wgsl-BsKzXJz4.js +1 -0
  338. package/dist/ui/assets/wikitext-ClFFjSW2.js +1 -0
  339. package/dist/ui/assets/wit-DdvCle-K.js +1 -0
  340. package/dist/ui/assets/wolfram-DLL8P-h_.js +1 -0
  341. package/dist/ui/assets/workspace-app-C_wsC6VL.js +117 -0
  342. package/dist/ui/assets/workspace-app-DHvE2ojW.css +1 -0
  343. package/dist/ui/assets/xml-DUZ05dpG.js +1 -0
  344. package/dist/ui/assets/xsl-Bwp3w2OF.js +1 -0
  345. package/dist/ui/assets/yaml-IA_-TEM1.js +1 -0
  346. package/dist/ui/assets/zenscript-BnlCZFoB.js +1 -0
  347. package/dist/ui/assets/zig-CMLA9XwU.js +1 -0
  348. package/dist/ui/workspace-app.html +15 -0
  349. package/dist/user-config.js +97 -0
  350. package/dist/workspace-store.js +162 -0
  351. package/dist/workspaces.js +528 -0
  352. package/docs/agent-profile-schema.md +119 -0
  353. package/docs/artifact-exchange.md +63 -0
  354. package/docs/chatgpt-coding-workflow.md +183 -0
  355. package/docs/configuration.md +197 -0
  356. package/docs/gotchas.md +243 -0
  357. package/docs/roadmap.md +195 -0
  358. package/docs/security.md +142 -0
  359. package/docs/setup.md +132 -0
  360. package/docs/versioning.md +189 -0
  361. package/examples/agents/claude-implementer.md +30 -0
  362. package/examples/agents/codex-explorer.md +27 -0
  363. package/examples/agents/codex-qa-tester.md +29 -0
  364. package/examples/agents/codex-worker.md +25 -0
  365. package/examples/agents/copilot-reviewer.md +25 -0
  366. package/examples/agents/cursor-agent-worker.md +26 -0
  367. package/examples/agents/opencode-explorer.md +27 -0
  368. package/examples/agents/pi-reviewer.md +27 -0
  369. package/package.json +102 -0
  370. package/scripts/dev-server.mjs +120 -0
  371. package/scripts/fix-node-pty-permissions.mjs +22 -0
  372. package/scripts/release-version.mjs +207 -0
  373. 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
+ ```
@@ -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.