@akira-tl/forgerelay 1.2.3 → 1.2.5

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 (114) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +19 -11
  3. package/capabilities/workspace/managed-worktrees/GUIDE.md +4 -2
  4. package/dist/cli/config/migrate.js +5 -2
  5. package/dist/cli/init/setup-config.js +0 -2
  6. package/dist/cli/setup-support.js +3 -2
  7. package/dist/mcp/server/core/schemas.js +6 -0
  8. package/dist/mcp/server/workspace/runtime/workspace-open-presentation.js +4 -2
  9. package/dist/mcp/server/workspace/runtime/workspace-open-schema.js +6 -1
  10. package/dist/mcp/server/workspace/runtime/workspace-open.js +19 -13
  11. package/dist/runtime/config/definition/general-config.js +4 -3
  12. package/dist/runtime/config/external-mcp-config.js +4 -3
  13. package/dist/runtime/config/user-config.js +4 -1
  14. package/dist/runtime/config/validation/ports.js +9 -0
  15. package/dist/runtime/logging/logger.js +19 -19
  16. package/dist/ui/.vite/manifest.json +276 -276
  17. package/dist/ui/activity-panel-app.html +2 -2
  18. package/dist/ui/assets/activity-panel-app-Dq2xLIrs.css +1 -0
  19. package/dist/ui/assets/{activity-panel-app-BeDiwd7D.js → activity-panel-app-hkM8rX3z.js} +1 -1
  20. package/dist/ui/assets/{angular-html-DuoCE7nn.js → angular-html-UD0GEFFl.js} +1 -1
  21. package/dist/ui/assets/{angular-ts-D5tGk0hL.js → angular-ts-B2awh-Q1.js} +1 -1
  22. package/dist/ui/assets/{apl-lciOTPbw.js → apl-CpbhnJc8.js} +1 -1
  23. package/dist/ui/assets/{astro-vJbqfNnJ.js → astro-CkVVuF5B.js} +1 -1
  24. package/dist/ui/assets/{blade-C7655Q4K.js → blade-czG58aop.js} +1 -1
  25. package/dist/ui/assets/{c-DdHp1Jrw.js → c-DSq6h06b.js} +1 -1
  26. package/dist/ui/assets/{cobol-DgvzQxZP.js → cobol-CYnmhT2E.js} +1 -1
  27. package/dist/ui/assets/{coffee-BIjVUOUd.js → coffee-ClLhNqd5.js} +1 -1
  28. package/dist/ui/assets/{cpp-CU8tGzvI.js → cpp-BZDC6U43.js} +1 -1
  29. package/dist/ui/assets/{crystal-CUQAwsg9.js → crystal-BN9jCJyU.js} +1 -1
  30. package/dist/ui/assets/{css-DtMTqD3F.js → css-8dMfiihi.js} +1 -1
  31. package/dist/ui/assets/{edge-DoCX9RnL.js → edge-DemPBRNz.js} +1 -1
  32. package/dist/ui/assets/{elixir-DJxV9_U6.js → elixir-bLdHW8dz.js} +1 -1
  33. package/dist/ui/assets/{elm-DIgWqK4r.js → elm-DlZPcXmu.js} +1 -1
  34. package/dist/ui/assets/{erb-BHxP0c_e.js → erb-wmTqbHwm.js} +1 -1
  35. package/dist/ui/assets/{git-rebase-HbI_Vo8d.js → git-rebase-BqrZJVYO.js} +1 -1
  36. package/dist/ui/assets/{glimmer-js-CthY4Ty_.js → glimmer-js-CkPzdNHI.js} +1 -1
  37. package/dist/ui/assets/{glimmer-ts-B2-_A1Xz.js → glimmer-ts-Bd0vTdJC.js} +1 -1
  38. package/dist/ui/assets/{glsl-D9V9gq98.js → glsl-DKK0Kibz.js} +1 -1
  39. package/dist/ui/assets/{graphql-CddeAaS3.js → graphql-DmFr8ZvB.js} +1 -1
  40. package/dist/ui/assets/{hack-D_loGkOT.js → hack-BQcuk9lx.js} +1 -1
  41. package/dist/ui/assets/{haml-BoWDczd0.js → haml-Dbx0cG5B.js} +1 -1
  42. package/dist/ui/assets/{handlebars-ZoSOvw9y.js → handlebars-D0nD8yLi.js} +1 -1
  43. package/dist/ui/assets/{heavy-payload-DO34LwoZ.js → heavy-payload-CPOM8G8z.js} +3 -3
  44. package/dist/ui/assets/{html-CE-obXVo.js → html-9xkoIci1.js} +1 -1
  45. package/dist/ui/assets/{html-derivative-Cd-smAbW.js → html-derivative-Cg7n4YW0.js} +1 -1
  46. package/dist/ui/assets/{http-CZrkbrSl.js → http-Ckt_4_pP.js} +1 -1
  47. package/dist/ui/assets/{hurl-CxTuxBt1.js → hurl-BxMgqn9u.js} +1 -1
  48. package/dist/ui/assets/{java-BshLjCat.js → java-DxijgO-5.js} +1 -1
  49. package/dist/ui/assets/{javascript-D2pxQTiX.js → javascript-CusLzlRb.js} +1 -1
  50. package/dist/ui/assets/{jinja-kbfPP7-F.js → jinja-DBTRfImq.js} +1 -1
  51. package/dist/ui/assets/{jison-C2mt9l1M.js → jison-oCbVte0g.js} +1 -1
  52. package/dist/ui/assets/{json-DU_rg_AU.js → json-uq2yfoO2.js} +1 -1
  53. package/dist/ui/assets/{jsx-D_8aQMlx.js → jsx-B3AfJWyQ.js} +1 -1
  54. package/dist/ui/assets/{julia-BmefTaVV.js → julia-BFvq-UTm.js} +1 -1
  55. package/dist/ui/assets/{just-DXV8vk1S.js → just-Ck0W9Rcj.js} +1 -1
  56. package/dist/ui/assets/{latex-Cjm2MvGW.js → latex-BjKhTmaO.js} +1 -1
  57. package/dist/ui/assets/{liquid-DyQDlo0u.js → liquid-CsaE0q4b.js} +1 -1
  58. package/dist/ui/assets/{lua-B2A1vzzy.js → lua-D0MSBhv0.js} +1 -1
  59. package/dist/ui/assets/{marko-B9vOkXOU.js → marko-CTLxSPPr.js} +1 -1
  60. package/dist/ui/assets/{mdc-D42m6spU.js → mdc-BwDM_Bct.js} +1 -1
  61. package/dist/ui/assets/{nginx-TpfVxSUY.js → nginx-C5Q5rNaB.js} +1 -1
  62. package/dist/ui/assets/{nim-CJr5T1FK.js → nim-BjKHRt6k.js} +1 -1
  63. package/dist/ui/assets/{perl-cJZcsdm9.js → perl-BrABfniL.js} +1 -1
  64. package/dist/ui/assets/{php-CSZL5KRT.js → php-BWY__Khq.js} +1 -1
  65. package/dist/ui/assets/{pug-B1eMKzuA.js → pug-BD4PlwIK.js} +1 -1
  66. package/dist/ui/assets/{qml-Dl2_7zc9.js → qml-yQtdZNrK.js} +1 -1
  67. package/dist/ui/assets/{r-F0aaO9gG.js → r-D0tlixrf.js} +1 -1
  68. package/dist/ui/assets/{razor-BPnkSMCw.js → razor-CsmyuKJs.js} +1 -1
  69. package/dist/ui/assets/{regexp-BnGHMFbv.js → regexp-BXU4cTCD.js} +1 -1
  70. package/dist/ui/assets/{rst-B3CO7WYO.js → rst-CGlzAlrM.js} +1 -1
  71. package/dist/ui/assets/{ruby-B6VMzT1T.js → ruby-CRKDbfJj.js} +1 -1
  72. package/dist/ui/assets/{sas-Df2lHVuU.js → sas-CKDY6iPG.js} +1 -1
  73. package/dist/ui/assets/{scss-4XxI6sgu.js → scss-BCoXLSqD.js} +1 -1
  74. package/dist/ui/assets/{shellscript-DYASCN4r.js → shellscript-BVuRs_tF.js} +1 -1
  75. package/dist/ui/assets/{shellsession-Br6AGJO_.js → shellsession-alj1b7vN.js} +1 -1
  76. package/dist/ui/assets/{soy-p3ZNq1We.js → soy-BbQDrw9i.js} +1 -1
  77. package/dist/ui/assets/{sql-CAdv2OXL.js → sql-BdcqHaEA.js} +1 -1
  78. package/dist/ui/assets/{stata-Dx7yUbG_.js → stata-5IC5m_XB.js} +1 -1
  79. package/dist/ui/assets/{surrealql-6YsE8HQa.js → surrealql-BfVFLYzV.js} +1 -1
  80. package/dist/ui/assets/{svelte-YgzedwpD.js → svelte-B22aFi25.js} +1 -1
  81. package/dist/ui/assets/{templ-Bahqx3uD.js → templ-BRo7TcBX.js} +1 -1
  82. package/dist/ui/assets/{tex-o6fTQjkH.js → tex-CYhw-JbD.js} +1 -1
  83. package/dist/ui/assets/{ts-tags-BO-Co0Ju.js → ts-tags-C56aGOzq.js} +1 -1
  84. package/dist/ui/assets/{tsx-DtQe5AoH.js → tsx-IkFyQoro.js} +1 -1
  85. package/dist/ui/assets/{twig-BcUs6Kqc.js → twig-NkXaxf7l.js} +1 -1
  86. package/dist/ui/assets/{typescript-BPtM8h4u.js → typescript-AgbZakqy.js} +1 -1
  87. package/dist/ui/assets/{vue-5KkGUzJJ.js → vue-Cxz1Rk-f.js} +1 -1
  88. package/dist/ui/assets/{vue-html-Df_Xfsz9.js → vue-html-DWHLzP-w.js} +1 -1
  89. package/dist/ui/assets/{vue-vine-hUIe_u_Y.js → vue-vine-WR64TKte.js} +1 -1
  90. package/dist/ui/assets/{xml-C3Jy7as5.js → xml-CNdUn7jo.js} +1 -1
  91. package/dist/ui/assets/{xsl-BnF9OuFo.js → xsl-DLRRUZ98.js} +1 -1
  92. package/dist/ui/assets/{yaml-DyrFgCou.js → yaml-gltXViA8.js} +1 -1
  93. package/dist/workspace-colors.js +54 -0
  94. package/dist/workspaces/git/git-worktrees.js +53 -14
  95. package/dist/workspaces/inventory.js +2 -0
  96. package/dist/workspaces/presentation/workspace-presentation.js +13 -0
  97. package/dist/workspaces/relay/workspace-relay.js +3 -0
  98. package/dist/workspaces/sessions.js +28 -8
  99. package/dist/workspaces.js +9 -9
  100. package/docs/chatgpt-coding-workflow.md +16 -8
  101. package/docs/gotchas.md +2 -2
  102. package/package.json +2 -1
  103. package/schemas/v1/config.user.schema.json +2 -2
  104. package/scripts/ci/cmd-acceptance.mjs +3 -85
  105. package/scripts/ci/gates/acceptance-runtime.mjs +45 -0
  106. package/scripts/ci/gates/platform-tests.mjs +27 -17
  107. package/scripts/ci/gates/prepare-windows-shell-runtime.mjs +45 -0
  108. package/scripts/ci/gates/test-shard.mjs +29 -7
  109. package/scripts/ci/powershell51-acceptance.mjs +10 -91
  110. package/scripts/ci/pwsh-acceptance.mjs +7 -87
  111. package/scripts/ci/windows-product-acceptance.mjs +55 -0
  112. package/scripts/release/release-gate.test.mjs +121 -13
  113. package/scripts/release-parity.mjs +12 -1
  114. package/dist/ui/assets/activity-panel-app-DkfJzTZ3.css +0 -1
@@ -1 +1 @@
1
- import{t as e}from"./java-BshLjCat.js";import{t}from"./heavy-payload-DO34LwoZ.js";var n=t({default:()=>i}),r=Object.freeze(JSON.parse(`{"displayName":"XML","name":"xml","patterns":[{"begin":"(<\\\\?)\\\\s*([-0-9A-Z_a-z]+)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.xml"}},"end":"(\\\\?>)","name":"meta.tag.preprocessor.xml","patterns":[{"match":" ([-A-Za-z]+)","name":"entity.other.attribute-name.xml"},{"include":"#doublequotedString"},{"include":"#singlequotedString"}]},{"begin":"(<!)(DOCTYPE)\\\\s+([:A-Z_a-z][-.0-:A-Z_a-z]*)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"keyword.other.doctype.xml"},"3":{"name":"variable.language.documentroot.xml"}},"end":"\\\\s*(>)","name":"meta.tag.sgml.doctype.xml","patterns":[{"include":"#internalSubset"}]},{"include":"#comments"},{"begin":"(<)((?:([-0-9A-Z_a-z]+)(:))?([-0-:A-Z_a-z]+))(?=(\\\\s[^>]*)?></\\\\2>)","beginCaptures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.xml"},"3":{"name":"entity.name.tag.namespace.xml"},"4":{"name":"punctuation.separator.namespace.xml"},"5":{"name":"entity.name.tag.localname.xml"}},"end":"(>)(</)((?:([-0-9A-Z_a-z]+)(:))?([-0-:A-Z_a-z]+))(>)","endCaptures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"punctuation.definition.tag.xml"},"3":{"name":"entity.name.tag.xml"},"4":{"name":"entity.name.tag.namespace.xml"},"5":{"name":"punctuation.separator.namespace.xml"},"6":{"name":"entity.name.tag.localname.xml"},"7":{"name":"punctuation.definition.tag.xml"}},"name":"meta.tag.no-content.xml","patterns":[{"include":"#tagStuff"}]},{"begin":"(</?)(?:([-.\\\\w]+)((:)))?([-.:\\\\w]+)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.namespace.xml"},"3":{"name":"entity.name.tag.xml"},"4":{"name":"punctuation.separator.namespace.xml"},"5":{"name":"entity.name.tag.localname.xml"}},"end":"(/?>)","name":"meta.tag.xml","patterns":[{"include":"#tagStuff"}]},{"include":"#entity"},{"include":"#bare-ampersand"},{"begin":"<%@","beginCaptures":{"0":{"name":"punctuation.section.embedded.begin.xml"}},"end":"%>","endCaptures":{"0":{"name":"punctuation.section.embedded.end.xml"}},"name":"source.java-props.embedded.xml","patterns":[{"match":"page|include|taglib","name":"keyword.other.page-props.xml"}]},{"begin":"<%[!=]?(?!--)","beginCaptures":{"0":{"name":"punctuation.section.embedded.begin.xml"}},"end":"(?!--)%>","endCaptures":{"0":{"name":"punctuation.section.embedded.end.xml"}},"name":"source.java.embedded.xml","patterns":[{"include":"source.java"}]},{"begin":"<!\\\\[CDATA\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"]]>","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.unquoted.cdata.xml"}],"repository":{"EntityDecl":{"begin":"(<!)(ENTITY)\\\\s+(%\\\\s+)?([:A-Z_a-z][-.0-:A-Z_a-z]*)(\\\\s+(?:SYSTEM|PUBLIC)\\\\s+)?","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"keyword.other.entity.xml"},"3":{"name":"punctuation.definition.entity.xml"},"4":{"name":"variable.language.entity.xml"},"5":{"name":"keyword.other.entitytype.xml"}},"end":"(>)","patterns":[{"include":"#doublequotedString"},{"include":"#singlequotedString"}]},"bare-ampersand":{"match":"&","name":"invalid.illegal.bad-ampersand.xml"},"comments":{"patterns":[{"begin":"<%--","captures":{"0":{"name":"punctuation.definition.comment.xml"},"end":"--%>","name":"comment.block.xml"}},{"begin":"<!--","captures":{"0":{"name":"punctuation.definition.comment.xml"}},"end":"-->","name":"comment.block.xml","patterns":[{"begin":"--(?!>)","captures":{"0":{"name":"invalid.illegal.bad-comments-or-CDATA.xml"}}}]}]},"doublequotedString":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.double.xml","patterns":[{"include":"#entity"},{"include":"#bare-ampersand"}]},"entity":{"captures":{"1":{"name":"punctuation.definition.constant.xml"},"3":{"name":"punctuation.definition.constant.xml"}},"match":"(&)([:A-Z_a-z][-.0-:A-Z_a-z]*|#[0-9]+|#x\\\\h+)(;)","name":"constant.character.entity.xml"},"internalSubset":{"begin":"(\\\\[)","captures":{"1":{"name":"punctuation.definition.constant.xml"}},"end":"(])","name":"meta.internalsubset.xml","patterns":[{"include":"#EntityDecl"},{"include":"#parameterEntity"},{"include":"#comments"}]},"parameterEntity":{"captures":{"1":{"name":"punctuation.definition.constant.xml"},"3":{"name":"punctuation.definition.constant.xml"}},"match":"(%)([:A-Z_a-z][-.0-:A-Z_a-z]*)(;)","name":"constant.character.parameter-entity.xml"},"singlequotedString":{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.single.xml","patterns":[{"include":"#entity"},{"include":"#bare-ampersand"}]},"tagStuff":{"patterns":[{"captures":{"1":{"name":"entity.other.attribute-name.namespace.xml"},"2":{"name":"entity.other.attribute-name.xml"},"3":{"name":"punctuation.separator.namespace.xml"},"4":{"name":"entity.other.attribute-name.localname.xml"}},"match":"(?:^|\\\\s+)(?:([-.\\\\w]+)((:)))?([-.:\\\\w]+)\\\\s*="},{"include":"#doublequotedString"},{"include":"#singlequotedString"}]}},"scopeName":"text.xml","embeddedLangs":["java"]}`)),i=[...e,r];export{n,i as t};
1
+ import{t as e}from"./java-DxijgO-5.js";import{t}from"./heavy-payload-CPOM8G8z.js";var n=t({default:()=>i}),r=Object.freeze(JSON.parse(`{"displayName":"XML","name":"xml","patterns":[{"begin":"(<\\\\?)\\\\s*([-0-9A-Z_a-z]+)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.xml"}},"end":"(\\\\?>)","name":"meta.tag.preprocessor.xml","patterns":[{"match":" ([-A-Za-z]+)","name":"entity.other.attribute-name.xml"},{"include":"#doublequotedString"},{"include":"#singlequotedString"}]},{"begin":"(<!)(DOCTYPE)\\\\s+([:A-Z_a-z][-.0-:A-Z_a-z]*)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"keyword.other.doctype.xml"},"3":{"name":"variable.language.documentroot.xml"}},"end":"\\\\s*(>)","name":"meta.tag.sgml.doctype.xml","patterns":[{"include":"#internalSubset"}]},{"include":"#comments"},{"begin":"(<)((?:([-0-9A-Z_a-z]+)(:))?([-0-:A-Z_a-z]+))(?=(\\\\s[^>]*)?></\\\\2>)","beginCaptures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.xml"},"3":{"name":"entity.name.tag.namespace.xml"},"4":{"name":"punctuation.separator.namespace.xml"},"5":{"name":"entity.name.tag.localname.xml"}},"end":"(>)(</)((?:([-0-9A-Z_a-z]+)(:))?([-0-:A-Z_a-z]+))(>)","endCaptures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"punctuation.definition.tag.xml"},"3":{"name":"entity.name.tag.xml"},"4":{"name":"entity.name.tag.namespace.xml"},"5":{"name":"punctuation.separator.namespace.xml"},"6":{"name":"entity.name.tag.localname.xml"},"7":{"name":"punctuation.definition.tag.xml"}},"name":"meta.tag.no-content.xml","patterns":[{"include":"#tagStuff"}]},{"begin":"(</?)(?:([-.\\\\w]+)((:)))?([-.:\\\\w]+)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.namespace.xml"},"3":{"name":"entity.name.tag.xml"},"4":{"name":"punctuation.separator.namespace.xml"},"5":{"name":"entity.name.tag.localname.xml"}},"end":"(/?>)","name":"meta.tag.xml","patterns":[{"include":"#tagStuff"}]},{"include":"#entity"},{"include":"#bare-ampersand"},{"begin":"<%@","beginCaptures":{"0":{"name":"punctuation.section.embedded.begin.xml"}},"end":"%>","endCaptures":{"0":{"name":"punctuation.section.embedded.end.xml"}},"name":"source.java-props.embedded.xml","patterns":[{"match":"page|include|taglib","name":"keyword.other.page-props.xml"}]},{"begin":"<%[!=]?(?!--)","beginCaptures":{"0":{"name":"punctuation.section.embedded.begin.xml"}},"end":"(?!--)%>","endCaptures":{"0":{"name":"punctuation.section.embedded.end.xml"}},"name":"source.java.embedded.xml","patterns":[{"include":"source.java"}]},{"begin":"<!\\\\[CDATA\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"]]>","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.unquoted.cdata.xml"}],"repository":{"EntityDecl":{"begin":"(<!)(ENTITY)\\\\s+(%\\\\s+)?([:A-Z_a-z][-.0-:A-Z_a-z]*)(\\\\s+(?:SYSTEM|PUBLIC)\\\\s+)?","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"keyword.other.entity.xml"},"3":{"name":"punctuation.definition.entity.xml"},"4":{"name":"variable.language.entity.xml"},"5":{"name":"keyword.other.entitytype.xml"}},"end":"(>)","patterns":[{"include":"#doublequotedString"},{"include":"#singlequotedString"}]},"bare-ampersand":{"match":"&","name":"invalid.illegal.bad-ampersand.xml"},"comments":{"patterns":[{"begin":"<%--","captures":{"0":{"name":"punctuation.definition.comment.xml"},"end":"--%>","name":"comment.block.xml"}},{"begin":"<!--","captures":{"0":{"name":"punctuation.definition.comment.xml"}},"end":"-->","name":"comment.block.xml","patterns":[{"begin":"--(?!>)","captures":{"0":{"name":"invalid.illegal.bad-comments-or-CDATA.xml"}}}]}]},"doublequotedString":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.double.xml","patterns":[{"include":"#entity"},{"include":"#bare-ampersand"}]},"entity":{"captures":{"1":{"name":"punctuation.definition.constant.xml"},"3":{"name":"punctuation.definition.constant.xml"}},"match":"(&)([:A-Z_a-z][-.0-:A-Z_a-z]*|#[0-9]+|#x\\\\h+)(;)","name":"constant.character.entity.xml"},"internalSubset":{"begin":"(\\\\[)","captures":{"1":{"name":"punctuation.definition.constant.xml"}},"end":"(])","name":"meta.internalsubset.xml","patterns":[{"include":"#EntityDecl"},{"include":"#parameterEntity"},{"include":"#comments"}]},"parameterEntity":{"captures":{"1":{"name":"punctuation.definition.constant.xml"},"3":{"name":"punctuation.definition.constant.xml"}},"match":"(%)([:A-Z_a-z][-.0-:A-Z_a-z]*)(;)","name":"constant.character.parameter-entity.xml"},"singlequotedString":{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.single.xml","patterns":[{"include":"#entity"},{"include":"#bare-ampersand"}]},"tagStuff":{"patterns":[{"captures":{"1":{"name":"entity.other.attribute-name.namespace.xml"},"2":{"name":"entity.other.attribute-name.xml"},"3":{"name":"punctuation.separator.namespace.xml"},"4":{"name":"entity.other.attribute-name.localname.xml"}},"match":"(?:^|\\\\s+)(?:([-.\\\\w]+)((:)))?([-.:\\\\w]+)\\\\s*="},{"include":"#doublequotedString"},{"include":"#singlequotedString"}]}},"scopeName":"text.xml","embeddedLangs":["java"]}`)),i=[...e,r];export{n,i as t};
@@ -1 +1 @@
1
- import{t as e}from"./xml-C3Jy7as5.js";var t=Object.freeze(JSON.parse(`{"displayName":"XSL","name":"xsl","patterns":[{"begin":"(<)(xsl)((:))(template)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.namespace.xml"},"3":{"name":"entity.name.tag.xml"},"4":{"name":"punctuation.separator.namespace.xml"},"5":{"name":"entity.name.tag.localname.xml"}},"end":"(>)","name":"meta.tag.xml.template","patterns":[{"captures":{"1":{"name":"entity.other.attribute-name.namespace.xml"},"2":{"name":"entity.other.attribute-name.xml"},"3":{"name":"punctuation.separator.namespace.xml"},"4":{"name":"entity.other.attribute-name.localname.xml"}},"match":" (?:([-0-9A-Z_a-z]+)((:)))?([-A-Za-z]+)"},{"include":"#doublequotedString"},{"include":"#singlequotedString"}]},{"include":"text.xml"}],"repository":{"doublequotedString":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.double.xml"},"singlequotedString":{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.single.xml"}},"scopeName":"text.xml.xsl","embeddedLangs":["xml"]}`)),n=[...e,t];export{n as default};
1
+ import{t as e}from"./xml-CNdUn7jo.js";var t=Object.freeze(JSON.parse(`{"displayName":"XSL","name":"xsl","patterns":[{"begin":"(<)(xsl)((:))(template)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.namespace.xml"},"3":{"name":"entity.name.tag.xml"},"4":{"name":"punctuation.separator.namespace.xml"},"5":{"name":"entity.name.tag.localname.xml"}},"end":"(>)","name":"meta.tag.xml.template","patterns":[{"captures":{"1":{"name":"entity.other.attribute-name.namespace.xml"},"2":{"name":"entity.other.attribute-name.xml"},"3":{"name":"punctuation.separator.namespace.xml"},"4":{"name":"entity.other.attribute-name.localname.xml"}},"match":" (?:([-0-9A-Z_a-z]+)((:)))?([-A-Za-z]+)"},{"include":"#doublequotedString"},{"include":"#singlequotedString"}]},{"include":"text.xml"}],"repository":{"doublequotedString":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.double.xml"},"singlequotedString":{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.single.xml"}},"scopeName":"text.xml.xsl","embeddedLangs":["xml"]}`)),n=[...e,t];export{n as default};
@@ -1 +1 @@
1
- import{t as e}from"./heavy-payload-DO34LwoZ.js";var t=e({default:()=>n}),n=[Object.freeze(JSON.parse(`{"displayName":"YAML","fileTypes":["yaml","yml","rviz","reek","clang-format","yaml-tmlanguage","syntax","sublime-syntax"],"firstLineMatch":"^%YAML( ?1.\\\\d+)?","name":"yaml","patterns":[{"include":"#comment"},{"include":"#property"},{"include":"#directive"},{"match":"^---","name":"entity.other.document.begin.yaml"},{"match":"^\\\\.{3}","name":"entity.other.document.end.yaml"},{"include":"#node"}],"repository":{"block-collection":{"patterns":[{"include":"#block-sequence"},{"include":"#block-mapping"}]},"block-mapping":{"patterns":[{"include":"#block-pair"}]},"block-node":{"patterns":[{"include":"#prototype"},{"include":"#block-scalar"},{"include":"#block-collection"},{"include":"#flow-scalar-plain-out"},{"include":"#flow-node"}]},"block-pair":{"patterns":[{"begin":"\\\\?","beginCaptures":{"1":{"name":"punctuation.definition.key-value.begin.yaml"}},"end":"(?=\\\\?)|^ *(:)|(:)","endCaptures":{"1":{"name":"punctuation.separator.key-value.mapping.yaml"},"2":{"name":"invalid.illegal.expected-newline.yaml"}},"name":"meta.block-mapping.yaml","patterns":[{"include":"#block-node"}]},{"begin":"(?=(?:[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?]\\\\S)([^:\\\\s]|:\\\\S|\\\\s+(?![#\\\\s]))*\\\\s*:(\\\\s|$))","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))","patterns":[{"include":"#flow-scalar-plain-out-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?]\\\\S","beginCaptures":{"0":{"name":"entity.name.tag.yaml"}},"contentName":"entity.name.tag.yaml","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))","name":"string.unquoted.plain.out.yaml"}]},{"match":":(?=\\\\s|$)","name":"punctuation.separator.key-value.mapping.yaml"}]},"block-scalar":{"begin":"(?:(\\\\|)|(>))([1-9])?([-+])?(.*\\\\n?)","beginCaptures":{"1":{"name":"keyword.control.flow.block-scalar.literal.yaml"},"2":{"name":"keyword.control.flow.block-scalar.folded.yaml"},"3":{"name":"constant.numeric.indentation-indicator.yaml"},"4":{"name":"storage.modifier.chomping-indicator.yaml"},"5":{"patterns":[{"include":"#comment"},{"match":".+","name":"invalid.illegal.expected-comment-or-newline.yaml"}]}},"end":"^(?=\\\\S)|(?!\\\\G)","patterns":[{"begin":"^( +)(?! )","end":"^(?!\\\\1|\\\\s*$)","name":"string.unquoted.block.yaml"}]},"block-sequence":{"match":"(-)(?!\\\\S)","name":"punctuation.definition.block.sequence.item.yaml"},"comment":{"begin":"(?:^([\\\\t ]*)|[\\\\t ]+)(?=#\\\\p{print}*$)","beginCaptures":{"1":{"name":"punctuation.whitespace.comment.leading.yaml"}},"end":"(?!\\\\G)","patterns":[{"begin":"#","beginCaptures":{"0":{"name":"punctuation.definition.comment.yaml"}},"end":"\\\\n","name":"comment.line.number-sign.yaml"}]},"directive":{"begin":"^%","beginCaptures":{"0":{"name":"punctuation.definition.directive.begin.yaml"}},"end":"(?=$|[\\\\t ]+($|#))","name":"meta.directive.yaml","patterns":[{"captures":{"1":{"name":"keyword.other.directive.yaml.yaml"},"2":{"name":"constant.numeric.yaml-version.yaml"}},"match":"\\\\G(YAML)[\\\\t ]+(\\\\d+\\\\.\\\\d+)"},{"captures":{"1":{"name":"keyword.other.directive.tag.yaml"},"2":{"name":"storage.type.tag-handle.yaml"},"3":{"name":"support.type.tag-prefix.yaml"}},"match":"\\\\G(TAG)(?:[\\\\t ]+(!(?:[-0-9A-Za-z]*!)?)(?:[\\\\t ]+(!(?:%\\\\h{2}|[]!#$\\\\&-;=?-\\\\[_a-z~])*|(?![]!,\\\\[{}])(?:%\\\\h{2}|[]!#$\\\\&-;=?-\\\\[_a-z~])+))?)?"},{"captures":{"1":{"name":"support.other.directive.reserved.yaml"},"2":{"name":"string.unquoted.directive-name.yaml"},"3":{"name":"string.unquoted.directive-parameter.yaml"}},"match":"\\\\G(\\\\w+)(?:[\\\\t ]+(\\\\w+)(?:[\\\\t ]+(\\\\w+))?)?"},{"match":"\\\\S+","name":"invalid.illegal.unrecognized.yaml"}]},"flow-alias":{"captures":{"1":{"name":"keyword.control.flow.alias.yaml"},"2":{"name":"punctuation.definition.alias.yaml"},"3":{"name":"variable.other.alias.yaml"},"4":{"name":"invalid.illegal.character.anchor.yaml"}},"match":"((\\\\*))([^],/\\\\[{}\\\\s]+)([^],}\\\\s]\\\\S*)?"},"flow-collection":{"patterns":[{"include":"#flow-sequence"},{"include":"#flow-mapping"}]},"flow-mapping":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.mapping.begin.yaml"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.mapping.end.yaml"}},"name":"meta.flow-mapping.yaml","patterns":[{"include":"#prototype"},{"match":",","name":"punctuation.separator.mapping.yaml"},{"include":"#flow-pair"}]},"flow-node":{"patterns":[{"include":"#prototype"},{"include":"#flow-alias"},{"include":"#flow-collection"},{"include":"#flow-scalar"}]},"flow-pair":{"patterns":[{"begin":"\\\\?","beginCaptures":{"0":{"name":"punctuation.definition.key-value.begin.yaml"}},"end":"(?=[],}])","name":"meta.flow-pair.explicit.yaml","patterns":[{"include":"#prototype"},{"include":"#flow-pair"},{"include":"#flow-node"},{"begin":":(?=\\\\s|$|[],\\\\[{}])","beginCaptures":{"0":{"name":"punctuation.separator.key-value.mapping.yaml"}},"end":"(?=[],}])","patterns":[{"include":"#flow-value"}]}]},{"begin":"(?=(?:[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?][^],\\\\[{}\\\\s])([^],:\\\\[{}\\\\s]|:[^],\\\\[{}\\\\s]|\\\\s+(?![#\\\\s]))*\\\\s*:(\\\\s|$))","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])","name":"meta.flow-pair.key.yaml","patterns":[{"include":"#flow-scalar-plain-in-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?][^],\\\\[{}\\\\s]","beginCaptures":{"0":{"name":"entity.name.tag.yaml"}},"contentName":"entity.name.tag.yaml","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])","name":"string.unquoted.plain.in.yaml"}]},{"include":"#flow-node"},{"begin":":(?=\\\\s|$|[],\\\\[{}])","captures":{"0":{"name":"punctuation.separator.key-value.mapping.yaml"}},"end":"(?=[],}])","name":"meta.flow-pair.yaml","patterns":[{"include":"#flow-value"}]}]},"flow-scalar":{"patterns":[{"include":"#flow-scalar-double-quoted"},{"include":"#flow-scalar-single-quoted"},{"include":"#flow-scalar-plain-in"}]},"flow-scalar-double-quoted":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.yaml"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.yaml"}},"name":"string.quoted.double.yaml","patterns":[{"match":"\\\\\\\\([ \\"/0LN\\\\\\\\_abefnprtv]|x\\\\d\\\\d|u\\\\d{4}|U\\\\d{8})","name":"constant.character.escape.yaml"},{"match":"\\\\\\\\\\\\n","name":"constant.character.escape.double-quoted.newline.yaml"}]},"flow-scalar-plain-in":{"patterns":[{"include":"#flow-scalar-plain-in-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?][^],\\\\[{}\\\\s]","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])","name":"string.unquoted.plain.in.yaml"}]},"flow-scalar-plain-in-implicit-type":{"patterns":[{"captures":{"1":{"name":"constant.language.null.yaml"},"2":{"name":"constant.language.boolean.yaml"},"3":{"name":"constant.numeric.integer.yaml"},"4":{"name":"constant.numeric.float.yaml"},"5":{"name":"constant.other.timestamp.yaml"},"6":{"name":"constant.language.value.yaml"},"7":{"name":"constant.language.merge.yaml"}},"match":"(?:(null|Null|NULL|~)|([Yy]|yes|Yes|YES|[Nn]|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)|([-+]?0b[01_]+|[-+]?0[0-7_]+|[-+]?(?:0|[1-9][0-9_]*)|[-+]?0x[_\\\\h]+|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)|([-+]?(?:[0-9][0-9_]*)?\\\\.[.0-9]*(?:[Ee][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))|(\\\\d{4}-\\\\d{2}-\\\\d{2}|\\\\d{4}-\\\\d{1,2}-\\\\d{1,2}(?:[Tt]|[\\\\t ]+)\\\\d{1,2}:\\\\d{2}:\\\\d{2}(?:\\\\.\\\\d*)?(?:[\\\\t ]*Z|[-+]\\\\d{1,2}(?::\\\\d{1,2})?)?)|(=)|(<<))(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])"}]},"flow-scalar-plain-out":{"patterns":[{"include":"#flow-scalar-plain-out-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?]\\\\S","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))","name":"string.unquoted.plain.out.yaml"}]},"flow-scalar-plain-out-implicit-type":{"patterns":[{"captures":{"1":{"name":"constant.language.null.yaml"},"2":{"name":"constant.language.boolean.yaml"},"3":{"name":"constant.numeric.integer.yaml"},"4":{"name":"constant.numeric.float.yaml"},"5":{"name":"constant.other.timestamp.yaml"},"6":{"name":"constant.language.value.yaml"},"7":{"name":"constant.language.merge.yaml"}},"match":"(?:(null|Null|NULL|~)|([Yy]|yes|Yes|YES|[Nn]|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)|([-+]?0b[01_]+|[-+]?0[0-7_]+|[-+]?(?:0|[1-9][0-9_]*)|[-+]?0x[_\\\\h]+|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)|([-+]?(?:[0-9][0-9_]*)?\\\\.[.0-9]*(?:[Ee][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))|(\\\\d{4}-\\\\d{2}-\\\\d{2}|\\\\d{4}-\\\\d{1,2}-\\\\d{1,2}(?:[Tt]|[\\\\t ]+)\\\\d{1,2}:\\\\d{2}:\\\\d{2}(?:\\\\.\\\\d*)?(?:[\\\\t ]*Z|[-+]\\\\d{1,2}(?::\\\\d{1,2})?)?)|(=)|(<<))(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))"}]},"flow-scalar-single-quoted":{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.yaml"}},"end":"'(?!')","endCaptures":{"0":{"name":"punctuation.definition.string.end.yaml"}},"name":"string.quoted.single.yaml","patterns":[{"match":"''","name":"constant.character.escape.single-quoted.yaml"}]},"flow-sequence":{"begin":"\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.sequence.begin.yaml"}},"end":"]","endCaptures":{"0":{"name":"punctuation.definition.sequence.end.yaml"}},"name":"meta.flow-sequence.yaml","patterns":[{"include":"#prototype"},{"match":",","name":"punctuation.separator.sequence.yaml"},{"include":"#flow-pair"},{"include":"#flow-node"}]},"flow-value":{"patterns":[{"begin":"\\\\G(?![],}])","end":"(?=[],}])","name":"meta.flow-pair.value.yaml","patterns":[{"include":"#flow-node"}]}]},"node":{"patterns":[{"include":"#block-node"}]},"property":{"begin":"(?=[!\\\\&])","end":"(?!\\\\G)","name":"meta.property.yaml","patterns":[{"captures":{"1":{"name":"keyword.control.property.anchor.yaml"},"2":{"name":"punctuation.definition.anchor.yaml"},"3":{"name":"entity.name.type.anchor.yaml"},"4":{"name":"invalid.illegal.character.anchor.yaml"}},"match":"\\\\G((&))([^],/\\\\[{}\\\\s]+)(\\\\S+)?"},{"match":"\\\\G!(?:<(?:%\\\\h{2}|[]!#$\\\\&-;=?-\\\\[_a-z~])+>|(?:[-0-9A-Za-z]*!)?(?:%\\\\h{2}|[#$\\\\&-+\\\\--;=?-Z_a-z~])+|)(?=[\\\\t ]|$)","name":"storage.type.tag-handle.yaml"},{"match":"\\\\S+","name":"invalid.illegal.tag-handle.yaml"}]},"prototype":{"patterns":[{"include":"#comment"},{"include":"#property"}]}},"scopeName":"source.yaml","aliases":["yml"]}`))];export{t as n,n as t};
1
+ import{t as e}from"./heavy-payload-CPOM8G8z.js";var t=e({default:()=>n}),n=[Object.freeze(JSON.parse(`{"displayName":"YAML","fileTypes":["yaml","yml","rviz","reek","clang-format","yaml-tmlanguage","syntax","sublime-syntax"],"firstLineMatch":"^%YAML( ?1.\\\\d+)?","name":"yaml","patterns":[{"include":"#comment"},{"include":"#property"},{"include":"#directive"},{"match":"^---","name":"entity.other.document.begin.yaml"},{"match":"^\\\\.{3}","name":"entity.other.document.end.yaml"},{"include":"#node"}],"repository":{"block-collection":{"patterns":[{"include":"#block-sequence"},{"include":"#block-mapping"}]},"block-mapping":{"patterns":[{"include":"#block-pair"}]},"block-node":{"patterns":[{"include":"#prototype"},{"include":"#block-scalar"},{"include":"#block-collection"},{"include":"#flow-scalar-plain-out"},{"include":"#flow-node"}]},"block-pair":{"patterns":[{"begin":"\\\\?","beginCaptures":{"1":{"name":"punctuation.definition.key-value.begin.yaml"}},"end":"(?=\\\\?)|^ *(:)|(:)","endCaptures":{"1":{"name":"punctuation.separator.key-value.mapping.yaml"},"2":{"name":"invalid.illegal.expected-newline.yaml"}},"name":"meta.block-mapping.yaml","patterns":[{"include":"#block-node"}]},{"begin":"(?=(?:[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?]\\\\S)([^:\\\\s]|:\\\\S|\\\\s+(?![#\\\\s]))*\\\\s*:(\\\\s|$))","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))","patterns":[{"include":"#flow-scalar-plain-out-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?]\\\\S","beginCaptures":{"0":{"name":"entity.name.tag.yaml"}},"contentName":"entity.name.tag.yaml","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))","name":"string.unquoted.plain.out.yaml"}]},{"match":":(?=\\\\s|$)","name":"punctuation.separator.key-value.mapping.yaml"}]},"block-scalar":{"begin":"(?:(\\\\|)|(>))([1-9])?([-+])?(.*\\\\n?)","beginCaptures":{"1":{"name":"keyword.control.flow.block-scalar.literal.yaml"},"2":{"name":"keyword.control.flow.block-scalar.folded.yaml"},"3":{"name":"constant.numeric.indentation-indicator.yaml"},"4":{"name":"storage.modifier.chomping-indicator.yaml"},"5":{"patterns":[{"include":"#comment"},{"match":".+","name":"invalid.illegal.expected-comment-or-newline.yaml"}]}},"end":"^(?=\\\\S)|(?!\\\\G)","patterns":[{"begin":"^( +)(?! )","end":"^(?!\\\\1|\\\\s*$)","name":"string.unquoted.block.yaml"}]},"block-sequence":{"match":"(-)(?!\\\\S)","name":"punctuation.definition.block.sequence.item.yaml"},"comment":{"begin":"(?:^([\\\\t ]*)|[\\\\t ]+)(?=#\\\\p{print}*$)","beginCaptures":{"1":{"name":"punctuation.whitespace.comment.leading.yaml"}},"end":"(?!\\\\G)","patterns":[{"begin":"#","beginCaptures":{"0":{"name":"punctuation.definition.comment.yaml"}},"end":"\\\\n","name":"comment.line.number-sign.yaml"}]},"directive":{"begin":"^%","beginCaptures":{"0":{"name":"punctuation.definition.directive.begin.yaml"}},"end":"(?=$|[\\\\t ]+($|#))","name":"meta.directive.yaml","patterns":[{"captures":{"1":{"name":"keyword.other.directive.yaml.yaml"},"2":{"name":"constant.numeric.yaml-version.yaml"}},"match":"\\\\G(YAML)[\\\\t ]+(\\\\d+\\\\.\\\\d+)"},{"captures":{"1":{"name":"keyword.other.directive.tag.yaml"},"2":{"name":"storage.type.tag-handle.yaml"},"3":{"name":"support.type.tag-prefix.yaml"}},"match":"\\\\G(TAG)(?:[\\\\t ]+(!(?:[-0-9A-Za-z]*!)?)(?:[\\\\t ]+(!(?:%\\\\h{2}|[]!#$\\\\&-;=?-\\\\[_a-z~])*|(?![]!,\\\\[{}])(?:%\\\\h{2}|[]!#$\\\\&-;=?-\\\\[_a-z~])+))?)?"},{"captures":{"1":{"name":"support.other.directive.reserved.yaml"},"2":{"name":"string.unquoted.directive-name.yaml"},"3":{"name":"string.unquoted.directive-parameter.yaml"}},"match":"\\\\G(\\\\w+)(?:[\\\\t ]+(\\\\w+)(?:[\\\\t ]+(\\\\w+))?)?"},{"match":"\\\\S+","name":"invalid.illegal.unrecognized.yaml"}]},"flow-alias":{"captures":{"1":{"name":"keyword.control.flow.alias.yaml"},"2":{"name":"punctuation.definition.alias.yaml"},"3":{"name":"variable.other.alias.yaml"},"4":{"name":"invalid.illegal.character.anchor.yaml"}},"match":"((\\\\*))([^],/\\\\[{}\\\\s]+)([^],}\\\\s]\\\\S*)?"},"flow-collection":{"patterns":[{"include":"#flow-sequence"},{"include":"#flow-mapping"}]},"flow-mapping":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.mapping.begin.yaml"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.mapping.end.yaml"}},"name":"meta.flow-mapping.yaml","patterns":[{"include":"#prototype"},{"match":",","name":"punctuation.separator.mapping.yaml"},{"include":"#flow-pair"}]},"flow-node":{"patterns":[{"include":"#prototype"},{"include":"#flow-alias"},{"include":"#flow-collection"},{"include":"#flow-scalar"}]},"flow-pair":{"patterns":[{"begin":"\\\\?","beginCaptures":{"0":{"name":"punctuation.definition.key-value.begin.yaml"}},"end":"(?=[],}])","name":"meta.flow-pair.explicit.yaml","patterns":[{"include":"#prototype"},{"include":"#flow-pair"},{"include":"#flow-node"},{"begin":":(?=\\\\s|$|[],\\\\[{}])","beginCaptures":{"0":{"name":"punctuation.separator.key-value.mapping.yaml"}},"end":"(?=[],}])","patterns":[{"include":"#flow-value"}]}]},{"begin":"(?=(?:[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?][^],\\\\[{}\\\\s])([^],:\\\\[{}\\\\s]|:[^],\\\\[{}\\\\s]|\\\\s+(?![#\\\\s]))*\\\\s*:(\\\\s|$))","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])","name":"meta.flow-pair.key.yaml","patterns":[{"include":"#flow-scalar-plain-in-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?][^],\\\\[{}\\\\s]","beginCaptures":{"0":{"name":"entity.name.tag.yaml"}},"contentName":"entity.name.tag.yaml","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])","name":"string.unquoted.plain.in.yaml"}]},{"include":"#flow-node"},{"begin":":(?=\\\\s|$|[],\\\\[{}])","captures":{"0":{"name":"punctuation.separator.key-value.mapping.yaml"}},"end":"(?=[],}])","name":"meta.flow-pair.yaml","patterns":[{"include":"#flow-value"}]}]},"flow-scalar":{"patterns":[{"include":"#flow-scalar-double-quoted"},{"include":"#flow-scalar-single-quoted"},{"include":"#flow-scalar-plain-in"}]},"flow-scalar-double-quoted":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.yaml"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.yaml"}},"name":"string.quoted.double.yaml","patterns":[{"match":"\\\\\\\\([ \\"/0LN\\\\\\\\_abefnprtv]|x\\\\d\\\\d|u\\\\d{4}|U\\\\d{8})","name":"constant.character.escape.yaml"},{"match":"\\\\\\\\\\\\n","name":"constant.character.escape.double-quoted.newline.yaml"}]},"flow-scalar-plain-in":{"patterns":[{"include":"#flow-scalar-plain-in-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?][^],\\\\[{}\\\\s]","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])","name":"string.unquoted.plain.in.yaml"}]},"flow-scalar-plain-in-implicit-type":{"patterns":[{"captures":{"1":{"name":"constant.language.null.yaml"},"2":{"name":"constant.language.boolean.yaml"},"3":{"name":"constant.numeric.integer.yaml"},"4":{"name":"constant.numeric.float.yaml"},"5":{"name":"constant.other.timestamp.yaml"},"6":{"name":"constant.language.value.yaml"},"7":{"name":"constant.language.merge.yaml"}},"match":"(?:(null|Null|NULL|~)|([Yy]|yes|Yes|YES|[Nn]|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)|([-+]?0b[01_]+|[-+]?0[0-7_]+|[-+]?(?:0|[1-9][0-9_]*)|[-+]?0x[_\\\\h]+|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)|([-+]?(?:[0-9][0-9_]*)?\\\\.[.0-9]*(?:[Ee][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))|(\\\\d{4}-\\\\d{2}-\\\\d{2}|\\\\d{4}-\\\\d{1,2}-\\\\d{1,2}(?:[Tt]|[\\\\t ]+)\\\\d{1,2}:\\\\d{2}:\\\\d{2}(?:\\\\.\\\\d*)?(?:[\\\\t ]*Z|[-+]\\\\d{1,2}(?::\\\\d{1,2})?)?)|(=)|(<<))(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$)|\\\\s*:[],\\\\[{}]|\\\\s*[],\\\\[{}])"}]},"flow-scalar-plain-out":{"patterns":[{"include":"#flow-scalar-plain-out-implicit-type"},{"begin":"[^-\\\\]!\\"#%\\\\&'*,:>?@\\\\[\`{|}\\\\s]|[-:?]\\\\S","end":"(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))","name":"string.unquoted.plain.out.yaml"}]},"flow-scalar-plain-out-implicit-type":{"patterns":[{"captures":{"1":{"name":"constant.language.null.yaml"},"2":{"name":"constant.language.boolean.yaml"},"3":{"name":"constant.numeric.integer.yaml"},"4":{"name":"constant.numeric.float.yaml"},"5":{"name":"constant.other.timestamp.yaml"},"6":{"name":"constant.language.value.yaml"},"7":{"name":"constant.language.merge.yaml"}},"match":"(?:(null|Null|NULL|~)|([Yy]|yes|Yes|YES|[Nn]|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)|([-+]?0b[01_]+|[-+]?0[0-7_]+|[-+]?(?:0|[1-9][0-9_]*)|[-+]?0x[_\\\\h]+|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)|([-+]?(?:[0-9][0-9_]*)?\\\\.[.0-9]*(?:[Ee][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))|(\\\\d{4}-\\\\d{2}-\\\\d{2}|\\\\d{4}-\\\\d{1,2}-\\\\d{1,2}(?:[Tt]|[\\\\t ]+)\\\\d{1,2}:\\\\d{2}:\\\\d{2}(?:\\\\.\\\\d*)?(?:[\\\\t ]*Z|[-+]\\\\d{1,2}(?::\\\\d{1,2})?)?)|(=)|(<<))(?=\\\\s*$|\\\\s+#|\\\\s*:(\\\\s|$))"}]},"flow-scalar-single-quoted":{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.yaml"}},"end":"'(?!')","endCaptures":{"0":{"name":"punctuation.definition.string.end.yaml"}},"name":"string.quoted.single.yaml","patterns":[{"match":"''","name":"constant.character.escape.single-quoted.yaml"}]},"flow-sequence":{"begin":"\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.sequence.begin.yaml"}},"end":"]","endCaptures":{"0":{"name":"punctuation.definition.sequence.end.yaml"}},"name":"meta.flow-sequence.yaml","patterns":[{"include":"#prototype"},{"match":",","name":"punctuation.separator.sequence.yaml"},{"include":"#flow-pair"},{"include":"#flow-node"}]},"flow-value":{"patterns":[{"begin":"\\\\G(?![],}])","end":"(?=[],}])","name":"meta.flow-pair.value.yaml","patterns":[{"include":"#flow-node"}]}]},"node":{"patterns":[{"include":"#block-node"}]},"property":{"begin":"(?=[!\\\\&])","end":"(?!\\\\G)","name":"meta.property.yaml","patterns":[{"captures":{"1":{"name":"keyword.control.property.anchor.yaml"},"2":{"name":"punctuation.definition.anchor.yaml"},"3":{"name":"entity.name.type.anchor.yaml"},"4":{"name":"invalid.illegal.character.anchor.yaml"}},"match":"\\\\G((&))([^],/\\\\[{}\\\\s]+)(\\\\S+)?"},{"match":"\\\\G!(?:<(?:%\\\\h{2}|[]!#$\\\\&-;=?-\\\\[_a-z~])+>|(?:[-0-9A-Za-z]*!)?(?:%\\\\h{2}|[#$\\\\&-+\\\\--;=?-Z_a-z~])+|)(?=[\\\\t ]|$)","name":"storage.type.tag-handle.yaml"},{"match":"\\\\S+","name":"invalid.illegal.tag-handle.yaml"}]},"prototype":{"patterns":[{"include":"#comment"},{"include":"#property"}]}},"scopeName":"source.yaml","aliases":["yml"]}`))];export{t as n,n as t};
@@ -0,0 +1,54 @@
1
+ export const WORKSPACE_COLOR_SLOTS = [
2
+ "red",
3
+ "green",
4
+ "yellow",
5
+ "blue",
6
+ "magenta",
7
+ "cyan",
8
+ "white",
9
+ "redBright",
10
+ "greenBright",
11
+ "yellowBright",
12
+ "blueBright",
13
+ "magentaBright",
14
+ "cyanBright",
15
+ "whiteBright",
16
+ ];
17
+ export function workspaceIdentityName(value) {
18
+ const trimmed = value.replace(/[\\/]+$/g, "");
19
+ if (!trimmed)
20
+ return value;
21
+ const parts = trimmed.split(/[\\/]/);
22
+ return parts.at(-1) || value;
23
+ }
24
+ export class WorkspaceColorAllocator {
25
+ assignments = new Map();
26
+ uniqueOwners = new Map();
27
+ colorFor(value) {
28
+ const existing = this.assignments.get(value);
29
+ if (existing)
30
+ return existing;
31
+ const preferredIndex = stableWorkspaceColorIndex(value);
32
+ for (let offset = 0; offset < WORKSPACE_COLOR_SLOTS.length; offset += 1) {
33
+ const slot = WORKSPACE_COLOR_SLOTS[(preferredIndex + offset) % WORKSPACE_COLOR_SLOTS.length];
34
+ if (!slot || this.uniqueOwners.has(slot))
35
+ continue;
36
+ this.uniqueOwners.set(slot, value);
37
+ this.assignments.set(value, slot);
38
+ return slot;
39
+ }
40
+ return WORKSPACE_COLOR_SLOTS[preferredIndex] ?? WORKSPACE_COLOR_SLOTS[0];
41
+ }
42
+ }
43
+ const defaultWorkspaceColorAllocator = new WorkspaceColorAllocator();
44
+ export function workspaceColorFor(value) {
45
+ return defaultWorkspaceColorAllocator.colorFor(value);
46
+ }
47
+ export function stableWorkspaceColorIndex(value) {
48
+ let hash = 2166136261;
49
+ for (let index = 0; index < value.length; index += 1) {
50
+ hash ^= value.charCodeAt(index);
51
+ hash = Math.imul(hash, 16777619);
52
+ }
53
+ return (hash >>> 0) % WORKSPACE_COLOR_SLOTS.length;
54
+ }
@@ -154,7 +154,7 @@ export async function closeManagedWorktree(input) {
154
154
  export async function resolveManagedWorktreeBase(input) {
155
155
  const sourcePath = assertAllowedPath(input.sourcePath, input.config.allowedRoots);
156
156
  const sourceRoot = await resolveGitRoot(sourcePath, input.config.allowedRoots);
157
- const resolved = await resolveWorktreeBase(sourceRoot, input.baseRef);
157
+ const resolved = await resolveWorktreeBase(sourceRoot, input.baseRef, input.targetBranch);
158
158
  return { sourceRoot, ...resolved };
159
159
  }
160
160
  async function resolveGitRoot(path, allowedRoots) {
@@ -186,26 +186,60 @@ async function assertGitRootAllowed(gitRoot, allowedRoots) {
186
186
  return assertAllowedPath(canonicalGitRoot, allowedRoots);
187
187
  }
188
188
  }
189
- async function resolveWorktreeBase(sourceRoot, requestedBaseRef) {
190
- const targetBranch = requestedBaseRef && requestedBaseRef !== "HEAD"
191
- ? normalizeLocalBranchName(requestedBaseRef)
192
- : await currentBranch(sourceRoot);
189
+ async function resolveWorktreeBase(sourceRoot, requestedBaseRef, requestedTargetBranch) {
190
+ const sourceBranch = await currentBranch(sourceRoot);
191
+ const localBase = requestedBaseRef && requestedBaseRef !== "HEAD"
192
+ ? await resolveLocalBranch(sourceRoot, requestedBaseRef)
193
+ : undefined;
194
+ const targetBranch = requestedTargetBranch
195
+ ? normalizeLocalBranchName(requestedTargetBranch)
196
+ : localBase?.branch ?? sourceBranch;
193
197
  if (!targetBranch) {
194
- throw new GitWorktreeError("GIT_WORKTREE_SOURCE_DETACHED", "Cannot create a managed worktree from a detached source checkout. Switch the source checkout to the branch that should receive the finished work first.");
198
+ throw new GitWorktreeError("GIT_WORKTREE_SOURCE_DETACHED", "Cannot create a managed worktree from a detached source checkout without a local target branch. Supply targetBranch or use a local branch as baseRef so ForgeRelay knows which branch may receive the finished work.");
195
199
  }
196
200
  try {
197
- const baseSha = (await git(["rev-parse", "--verify", `refs/heads/${targetBranch}^{commit}`], sourceRoot)).trim();
198
- return {
199
- baseRef: requestedBaseRef ?? "HEAD",
200
- baseSha,
201
- targetBranch,
202
- };
201
+ await git(["rev-parse", "--verify", `refs/heads/${targetBranch}^{commit}`], sourceRoot);
203
202
  }
204
203
  catch {
205
- if (!requestedBaseRef || requestedBaseRef === "HEAD") {
204
+ if (!requestedTargetBranch && (!requestedBaseRef || requestedBaseRef === "HEAD")) {
206
205
  throw new GitWorktreeError("GIT_REPOSITORY_HAS_NO_COMMITS", "Cannot open workspace in worktree mode because the current branch has no commits yet. Create an initial commit first, or use checkout mode.");
207
206
  }
208
- throw new GitWorktreeError("GIT_INVALID_BASE_REF", `Cannot create a managed worktree because baseRef ${JSON.stringify(requestedBaseRef)} is not a local branch. Managed worktrees must start from the local branch they will eventually merge back into.`);
207
+ throw new GitWorktreeError("GIT_INVALID_TARGET_BRANCH", `Cannot create a managed worktree because targetBranch ${JSON.stringify(targetBranch)} is not an existing local branch.`);
208
+ }
209
+ let baseSha;
210
+ if (!requestedBaseRef || requestedBaseRef === "HEAD") {
211
+ try {
212
+ baseSha = (await git(["rev-parse", "--verify", "HEAD^{commit}"], sourceRoot)).trim();
213
+ }
214
+ catch {
215
+ throw new GitWorktreeError("GIT_REPOSITORY_HAS_NO_COMMITS", "Cannot open workspace in worktree mode because the source checkout has no commits yet. Create an initial commit first, or use checkout mode.");
216
+ }
217
+ }
218
+ else if (localBase) {
219
+ baseSha = localBase.sha;
220
+ }
221
+ else {
222
+ try {
223
+ baseSha = (await git(["rev-parse", "--verify", "--end-of-options", `${requestedBaseRef}^{commit}`], sourceRoot)).trim();
224
+ }
225
+ catch {
226
+ throw new GitWorktreeError("GIT_INVALID_BASE_REF", `Cannot create a managed worktree because baseRef ${JSON.stringify(requestedBaseRef)} does not resolve to a commit.`);
227
+ }
228
+ }
229
+ return {
230
+ baseRef: requestedBaseRef ?? "HEAD",
231
+ baseSha,
232
+ targetBranch,
233
+ };
234
+ }
235
+ async function resolveLocalBranch(sourceRoot, ref) {
236
+ const branch = normalizeLocalBranchName(ref);
237
+ try {
238
+ const sha = (await git(["rev-parse", "--verify", `refs/heads/${branch}^{commit}`], sourceRoot)).trim();
239
+ return { branch, sha };
240
+ }
241
+ catch {
242
+ return undefined;
209
243
  }
210
244
  }
211
245
  async function currentBranch(cwd) {
@@ -216,6 +250,11 @@ async function currentBranch(cwd) {
216
250
  return "";
217
251
  }
218
252
  }
253
+ export function managedWorktreeUsesPinnedBase(baseRef, targetBranch) {
254
+ if (!baseRef || baseRef === "HEAD" || !targetBranch)
255
+ return false;
256
+ return normalizeLocalBranchName(baseRef) !== targetBranch;
257
+ }
219
258
  function normalizeLocalBranchName(value) {
220
259
  return value.startsWith("refs/heads/") ? value.slice("refs/heads/".length) : value;
221
260
  }
@@ -104,6 +104,8 @@ export class WorkspaceInventoryService {
104
104
  state,
105
105
  mode: session.mode,
106
106
  sourceRoot: session.sourceRoot,
107
+ baseRef: session.baseRef,
108
+ baseSha: session.baseSha,
107
109
  branch: session.branch,
108
110
  targetBranch: session.targetBranch,
109
111
  managed: session.managed,
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { workspaceColorFor, workspaceIdentityName } from "../../workspace-colors.js";
2
3
  const PRESENTATION_FIELDS = [
3
4
  "workspaceId",
4
5
  "kind",
@@ -8,6 +9,7 @@ const PRESENTATION_FIELDS = [
8
9
  "path",
9
10
  "mode",
10
11
  "sourceRoot",
12
+ "workspaceColor",
11
13
  "workspaceReused",
12
14
  "includeBootstrapContext",
13
15
  "worktree",
@@ -20,6 +22,17 @@ export function compactWorkspacePresentation(card) {
20
22
  if (value !== undefined)
21
23
  presentation[field] = value;
22
24
  }
25
+ if (presentation.workspaceColor === undefined) {
26
+ const root = typeof card.root === "string" ? card.root : undefined;
27
+ const name = typeof card.name === "string" ? card.name : undefined;
28
+ const identity = root
29
+ ? workspaceIdentityName(root)
30
+ : name
31
+ ? workspaceIdentityName(name)
32
+ : undefined;
33
+ if (identity)
34
+ presentation.workspaceColor = workspaceColorFor(identity);
35
+ }
23
36
  const executionContext = projectExecutionContext(card.executionContext);
24
37
  if (executionContext)
25
38
  presentation.executionContext = executionContext;
@@ -72,6 +72,8 @@ export class RemoteWorkspaceRelay {
72
72
  projection.state = state;
73
73
  }
74
74
  copyStringField(remoteInspection, projection, "sourceRoot");
75
+ copyStringField(remoteInspection, projection, "baseRef");
76
+ copyStringField(remoteInspection, projection, "baseSha");
75
77
  copyStringField(remoteInspection, projection, "branch");
76
78
  copyStringField(remoteInspection, projection, "targetBranch");
77
79
  copyBooleanField(remoteInspection, projection, "managed");
@@ -95,6 +97,7 @@ export class RemoteWorkspaceRelay {
95
97
  path: input.path,
96
98
  ...(input.mode ? { mode: input.mode } : {}),
97
99
  ...(input.baseRef ? { baseRef: input.baseRef } : {}),
100
+ ...(input.targetBranch ? { targetBranch: input.targetBranch } : {}),
98
101
  ...(input.newWorktree !== undefined ? { newWorktree: input.newWorktree } : {}),
99
102
  ...(input.newWorkspace !== undefined ? { newWorkspace: input.newWorkspace } : {}),
100
103
  ...(input.context !== undefined ? { context: input.context } : {}),
@@ -2,7 +2,7 @@ import { stat } from "node:fs/promises";
2
2
  import { resolve } from "node:path";
3
3
  import { loadCapabilityGuides } from "../mcp/server/core/capabilities.js";
4
4
  import { resolveProjectContext } from "./state/project-context.js";
5
- import { createManagedWorktree, discardFreshManagedWorktree, } from "./git/git-worktrees.js";
5
+ import { createManagedWorktree, discardFreshManagedWorktree, managedWorktreeUsesPinnedBase, } from "./git/git-worktrees.js";
6
6
  import { cleanupManagedWorktreeState, inspectManagedWorktreeRecovery, prepareManagedWorktreeRepair, rollbackManagedWorktreeRepair, } from "./git/worktree-recovery.js";
7
7
  import { AccessDeniedError, assertAllowedPath } from "../mcp/filesystem/roots.js";
8
8
  import { loadSubagentProfiles } from "../subagents/profiles.js";
@@ -44,17 +44,35 @@ export class WorkspaceSessionService {
44
44
  this.pendingOpens.delete(operationKey);
45
45
  }
46
46
  }
47
+ worktreeReuseIdentity(sourceKey, worktree) {
48
+ const pinnedBaseSha = managedWorktreeUsesPinnedBase(worktree.baseRef, worktree.targetBranch)
49
+ ? worktree.baseSha
50
+ : undefined;
51
+ return {
52
+ targetKey: JSON.stringify(pinnedBaseSha
53
+ ? ["worktree", sourceKey, worktree.targetBranch, pinnedBaseSha]
54
+ : ["worktree", sourceKey, worktree.targetBranch]),
55
+ ...(pinnedBaseSha ? { pinnedBaseSha } : {}),
56
+ };
57
+ }
58
+ worktreeSessionMatchesReuseBase(session, pinnedBaseSha) {
59
+ const sessionPinnedBaseSha = managedWorktreeUsesPinnedBase(session.baseRef, session.targetBranch)
60
+ ? session.baseSha
61
+ : undefined;
62
+ return sessionPinnedBaseSha === pinnedBaseSha;
63
+ }
47
64
  async workspaceTargetKeys(workspace) {
48
65
  if (workspace.mode === "checkout") {
49
66
  return [JSON.stringify(["checkout", await canonicalPath(workspace.root), null])];
50
67
  }
51
68
  const keys = [JSON.stringify(["worktree-path", await canonicalPath(workspace.root)])];
52
69
  if (workspace.sourceRoot && workspace.worktree?.targetBranch) {
53
- keys.push(JSON.stringify([
54
- "worktree",
55
- await canonicalPath(workspace.sourceRoot),
56
- workspace.worktree.targetBranch,
57
- ]));
70
+ const sourceKey = await canonicalPath(workspace.sourceRoot);
71
+ keys.push(this.worktreeReuseIdentity(sourceKey, {
72
+ baseRef: workspace.worktree.baseRef,
73
+ baseSha: workspace.worktree.baseSha,
74
+ targetBranch: workspace.worktree.targetBranch,
75
+ }).targetKey);
58
76
  }
59
77
  return keys;
60
78
  }
@@ -206,7 +224,7 @@ export class WorkspaceSessionService {
206
224
  }
207
225
  return undefined;
208
226
  }
209
- async findReusableWorktreeContextBySource(sourceKey, targetBranch) {
227
+ async findReusableWorktreeContextBySource(sourceKey, targetBranch, pinnedBaseSha) {
210
228
  const sessions = this.store ? this.store.listSessions({ mode: "worktree" }) : this.activeSessions("worktree");
211
229
  const closedMatches = [];
212
230
  for (const session of sessions) {
@@ -215,12 +233,14 @@ export class WorkspaceSessionService {
215
233
  if (await canonicalPath(session.sourceRoot) !== sourceKey)
216
234
  continue;
217
235
  if (session.status === "closed") {
218
- if (session.managed)
236
+ if (pinnedBaseSha === undefined && session.managed)
219
237
  closedMatches.push(session);
220
238
  continue;
221
239
  }
222
240
  if (session.status !== "active")
223
241
  continue;
242
+ if (!this.worktreeSessionMatchesReuseBase(session, pinnedBaseSha))
243
+ continue;
224
244
  const root = await this.validSessionRoot(session);
225
245
  if (!root)
226
246
  continue;
@@ -290,24 +290,25 @@ export class WorkspaceRegistry {
290
290
  }
291
291
  const resolvedBase = await resolveManagedWorktreeBase({
292
292
  sourcePath: path,
293
- baseRef: input.baseRef,
293
+ baseRef: input.baseRef, targetBranch: input.targetBranch,
294
294
  config: this.config,
295
295
  });
296
296
  const sourceKey = await canonicalPath(resolvedBase.sourceRoot);
297
- const targetKey = JSON.stringify(["worktree", sourceKey, resolvedBase.targetBranch]);
297
+ const { targetKey, pinnedBaseSha } = this.sessions.worktreeReuseIdentity(sourceKey, resolvedBase);
298
298
  if (input.newWorktree) {
299
- const context = await this.openWorktreeWorkspace(path, input.baseRef);
299
+ const context = await this.openWorktreeWorkspace(path, input.baseRef, input.targetBranch);
300
300
  return this.sessions.withConversationContext(context, conversationScopeId, targetKey, bootstrapContext);
301
301
  }
302
302
  const boundContext = await this.sessions.boundConversationContext(conversationScopeId, targetKey, "worktree", async (session) => session.mode === "worktree" &&
303
303
  session.sourceRoot !== undefined &&
304
304
  await canonicalPath(session.sourceRoot) === sourceKey &&
305
- session.targetBranch === resolvedBase.targetBranch, bootstrapContext);
305
+ session.targetBranch === resolvedBase.targetBranch &&
306
+ this.sessions.worktreeSessionMatchesReuseBase(session, pinnedBaseSha), bootstrapContext);
306
307
  if (boundContext)
307
308
  return boundContext;
308
309
  const context = await this.sessions.openOnce(targetKey, async () => {
309
- const reusableContext = await this.sessions.findReusableWorktreeContextBySource(sourceKey, resolvedBase.targetBranch);
310
- return reusableContext ?? this.openWorktreeWorkspace(path, input.baseRef);
310
+ const reusableContext = await this.sessions.findReusableWorktreeContextBySource(sourceKey, resolvedBase.targetBranch, pinnedBaseSha);
311
+ return reusableContext ?? this.openWorktreeWorkspace(path, input.baseRef, input.targetBranch);
311
312
  });
312
313
  return this.sessions.withConversationContext(context, conversationScopeId, targetKey, bootstrapContext);
313
314
  }
@@ -346,10 +347,9 @@ export class WorkspaceRegistry {
346
347
  }
347
348
  return this.createWorkspaceContext({ root, mode: "checkout" });
348
349
  }
349
- async openWorktreeWorkspace(path, baseRef) {
350
+ async openWorktreeWorkspace(path, baseRef, targetBranch) {
350
351
  const worktree = await createManagedWorktree({
351
- sourcePath: path,
352
- baseRef,
352
+ sourcePath: path, baseRef, targetBranch,
353
353
  config: this.config,
354
354
  });
355
355
  return this.createWorkspaceContext({
@@ -121,11 +121,17 @@ The worktree normally lives under:
121
121
  Existing configured/legacy roots remain supported.
122
122
 
123
123
  The recorded target branch is the local branch that should receive completed
124
- work. An explicit `baseRef` must identify a local branch.
125
-
126
- By default, a repeated worktree request for the same source/target reuses the
127
- existing managed worktree. An explicit new-worktree request creates another
128
- parallel branch/worktree.
124
+ work. `baseRef` independently selects the starting commit for the managed branch
125
+ and may be a local branch, tag, commit SHA, or another ref that resolves to a
126
+ commit. `targetBranch` may be supplied explicitly; otherwise ForgeRelay uses a
127
+ local-branch `baseRef` when available, then the source checkout's current local
128
+ branch. A detached source therefore needs an explicit local target when the base
129
+ does not itself identify one.
130
+
131
+ By default, a repeated branch-following request for the same source/target reuses
132
+ the existing managed worktree. Explicit historical bases also include their
133
+ resolved `baseSha` in reuse identity so distinct pinned bases cannot alias each
134
+ other. An explicit new-worktree request creates another parallel branch/worktree.
129
135
 
130
136
  `open_workspace` also returns known managed worktree paths and branch metadata
131
137
  so a specific existing worktree can be reopened directly.
@@ -154,9 +160,11 @@ placed into a merge-conflict state.
154
160
  A successful managed close now preserves the Workspace identity as `closed` even
155
161
  though the physical worktree and managed branch are removed. Reopen that Workspace
156
162
  with `open_workspace(workspaceId="ws_...")`; ForgeRelay creates fresh worktree
157
- backing from the recorded source/target relationship and returns the same Workspace
158
- ID. If the source checkout or target branch can no longer provide valid backing, the
159
- open fails and the durable Workspace record remains closed.
163
+ backing from the current recorded target branch and returns the same Workspace ID.
164
+ An original historical `baseRef` applies only to the backing that was created from
165
+ it; reopen does not pin the persistent Workspace back to that old commit. If the
166
+ source checkout or target branch can no longer provide valid backing, the open
167
+ fails and the durable Workspace record remains closed.
160
168
 
161
169
  `close_workspace(action="delete")` is never an implicit discard for active isolated
162
170
  work. An active managed worktree still requires `commitMessage` and completes the
package/docs/gotchas.md CHANGED
@@ -148,8 +148,8 @@ Managed worktrees require:
148
148
 
149
149
  - Git;
150
150
  - a repository with at least one commit;
151
- - an attached local source branch;
152
- - a local `baseRef` when one is explicitly supplied.
151
+ - a `baseRef` that resolves to a commit when one is explicitly supplied;
152
+ - an existing local `targetBranch` for final integration. ForgeRelay normally derives it from a local-branch `baseRef` or the attached source branch; a detached source must supply one explicitly when it cannot otherwise be derived.
153
153
 
154
154
  New managed branches use:
155
155
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akira-tl/forgerelay",
3
- "version": "1.2.3",
3
+ "version": "1.2.5",
4
4
  "description": "Local development control plane for MCP coding agents.",
5
5
  "type": "module",
6
6
  "homepage": "https://github.com/Akira-TL/forgerelay#readme",
@@ -60,6 +60,7 @@
60
60
  "ci:test-shard": "node scripts/ci/gates/test-shard.mjs",
61
61
  "ci:platform-tests": "node scripts/ci/gates/platform-tests.mjs",
62
62
  "ci:prepare-windows-product": "node scripts/ci/gates/prepare-windows-product.mjs",
63
+ "ci:prepare-windows-shell-runtime": "node scripts/ci/gates/prepare-windows-shell-runtime.mjs",
63
64
  "ci:verify": "node scripts/ci/verify.mjs",
64
65
  "release:parity": "node scripts/release-parity.mjs",
65
66
  "release:pack": "node scripts/release/pack.mjs",
@@ -26,7 +26,7 @@
26
26
  }
27
27
  },
28
28
  "port": {
29
- "description": "Local listening port.",
29
+ "description": "Local listening port (1-65535).",
30
30
  "type": "integer",
31
31
  "minimum": 1,
32
32
  "maximum": 65535,
@@ -431,7 +431,7 @@
431
431
  "x-forgerelay-sensitivity": "public",
432
432
  "x-forgerelay-interpolation": "none",
433
433
  "x-forgerelay-execution-effect": "none",
434
- "x-forgerelay-computed-default": "Detected launcher shell with the recorded compatibility fallback used when needed."
434
+ "x-forgerelay-computed-default": "Platform compatibility default unless an explicit shell preference is recorded."
435
435
  },
436
436
  "shellInstructions": {
437
437
  "description": "Enable ForgeRelay-owned runtime shell instructions.",