@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.
- package/CHANGELOG.md +27 -0
- package/README.md +19 -11
- package/capabilities/workspace/managed-worktrees/GUIDE.md +4 -2
- package/dist/cli/config/migrate.js +5 -2
- package/dist/cli/init/setup-config.js +0 -2
- package/dist/cli/setup-support.js +3 -2
- package/dist/mcp/server/core/schemas.js +6 -0
- package/dist/mcp/server/workspace/runtime/workspace-open-presentation.js +4 -2
- package/dist/mcp/server/workspace/runtime/workspace-open-schema.js +6 -1
- package/dist/mcp/server/workspace/runtime/workspace-open.js +19 -13
- package/dist/runtime/config/definition/general-config.js +4 -3
- package/dist/runtime/config/external-mcp-config.js +4 -3
- package/dist/runtime/config/user-config.js +4 -1
- package/dist/runtime/config/validation/ports.js +9 -0
- package/dist/runtime/logging/logger.js +19 -19
- package/dist/ui/.vite/manifest.json +276 -276
- package/dist/ui/activity-panel-app.html +2 -2
- package/dist/ui/assets/activity-panel-app-Dq2xLIrs.css +1 -0
- package/dist/ui/assets/{activity-panel-app-BeDiwd7D.js → activity-panel-app-hkM8rX3z.js} +1 -1
- package/dist/ui/assets/{angular-html-DuoCE7nn.js → angular-html-UD0GEFFl.js} +1 -1
- package/dist/ui/assets/{angular-ts-D5tGk0hL.js → angular-ts-B2awh-Q1.js} +1 -1
- package/dist/ui/assets/{apl-lciOTPbw.js → apl-CpbhnJc8.js} +1 -1
- package/dist/ui/assets/{astro-vJbqfNnJ.js → astro-CkVVuF5B.js} +1 -1
- package/dist/ui/assets/{blade-C7655Q4K.js → blade-czG58aop.js} +1 -1
- package/dist/ui/assets/{c-DdHp1Jrw.js → c-DSq6h06b.js} +1 -1
- package/dist/ui/assets/{cobol-DgvzQxZP.js → cobol-CYnmhT2E.js} +1 -1
- package/dist/ui/assets/{coffee-BIjVUOUd.js → coffee-ClLhNqd5.js} +1 -1
- package/dist/ui/assets/{cpp-CU8tGzvI.js → cpp-BZDC6U43.js} +1 -1
- package/dist/ui/assets/{crystal-CUQAwsg9.js → crystal-BN9jCJyU.js} +1 -1
- package/dist/ui/assets/{css-DtMTqD3F.js → css-8dMfiihi.js} +1 -1
- package/dist/ui/assets/{edge-DoCX9RnL.js → edge-DemPBRNz.js} +1 -1
- package/dist/ui/assets/{elixir-DJxV9_U6.js → elixir-bLdHW8dz.js} +1 -1
- package/dist/ui/assets/{elm-DIgWqK4r.js → elm-DlZPcXmu.js} +1 -1
- package/dist/ui/assets/{erb-BHxP0c_e.js → erb-wmTqbHwm.js} +1 -1
- package/dist/ui/assets/{git-rebase-HbI_Vo8d.js → git-rebase-BqrZJVYO.js} +1 -1
- package/dist/ui/assets/{glimmer-js-CthY4Ty_.js → glimmer-js-CkPzdNHI.js} +1 -1
- package/dist/ui/assets/{glimmer-ts-B2-_A1Xz.js → glimmer-ts-Bd0vTdJC.js} +1 -1
- package/dist/ui/assets/{glsl-D9V9gq98.js → glsl-DKK0Kibz.js} +1 -1
- package/dist/ui/assets/{graphql-CddeAaS3.js → graphql-DmFr8ZvB.js} +1 -1
- package/dist/ui/assets/{hack-D_loGkOT.js → hack-BQcuk9lx.js} +1 -1
- package/dist/ui/assets/{haml-BoWDczd0.js → haml-Dbx0cG5B.js} +1 -1
- package/dist/ui/assets/{handlebars-ZoSOvw9y.js → handlebars-D0nD8yLi.js} +1 -1
- package/dist/ui/assets/{heavy-payload-DO34LwoZ.js → heavy-payload-CPOM8G8z.js} +3 -3
- package/dist/ui/assets/{html-CE-obXVo.js → html-9xkoIci1.js} +1 -1
- package/dist/ui/assets/{html-derivative-Cd-smAbW.js → html-derivative-Cg7n4YW0.js} +1 -1
- package/dist/ui/assets/{http-CZrkbrSl.js → http-Ckt_4_pP.js} +1 -1
- package/dist/ui/assets/{hurl-CxTuxBt1.js → hurl-BxMgqn9u.js} +1 -1
- package/dist/ui/assets/{java-BshLjCat.js → java-DxijgO-5.js} +1 -1
- package/dist/ui/assets/{javascript-D2pxQTiX.js → javascript-CusLzlRb.js} +1 -1
- package/dist/ui/assets/{jinja-kbfPP7-F.js → jinja-DBTRfImq.js} +1 -1
- package/dist/ui/assets/{jison-C2mt9l1M.js → jison-oCbVte0g.js} +1 -1
- package/dist/ui/assets/{json-DU_rg_AU.js → json-uq2yfoO2.js} +1 -1
- package/dist/ui/assets/{jsx-D_8aQMlx.js → jsx-B3AfJWyQ.js} +1 -1
- package/dist/ui/assets/{julia-BmefTaVV.js → julia-BFvq-UTm.js} +1 -1
- package/dist/ui/assets/{just-DXV8vk1S.js → just-Ck0W9Rcj.js} +1 -1
- package/dist/ui/assets/{latex-Cjm2MvGW.js → latex-BjKhTmaO.js} +1 -1
- package/dist/ui/assets/{liquid-DyQDlo0u.js → liquid-CsaE0q4b.js} +1 -1
- package/dist/ui/assets/{lua-B2A1vzzy.js → lua-D0MSBhv0.js} +1 -1
- package/dist/ui/assets/{marko-B9vOkXOU.js → marko-CTLxSPPr.js} +1 -1
- package/dist/ui/assets/{mdc-D42m6spU.js → mdc-BwDM_Bct.js} +1 -1
- package/dist/ui/assets/{nginx-TpfVxSUY.js → nginx-C5Q5rNaB.js} +1 -1
- package/dist/ui/assets/{nim-CJr5T1FK.js → nim-BjKHRt6k.js} +1 -1
- package/dist/ui/assets/{perl-cJZcsdm9.js → perl-BrABfniL.js} +1 -1
- package/dist/ui/assets/{php-CSZL5KRT.js → php-BWY__Khq.js} +1 -1
- package/dist/ui/assets/{pug-B1eMKzuA.js → pug-BD4PlwIK.js} +1 -1
- package/dist/ui/assets/{qml-Dl2_7zc9.js → qml-yQtdZNrK.js} +1 -1
- package/dist/ui/assets/{r-F0aaO9gG.js → r-D0tlixrf.js} +1 -1
- package/dist/ui/assets/{razor-BPnkSMCw.js → razor-CsmyuKJs.js} +1 -1
- package/dist/ui/assets/{regexp-BnGHMFbv.js → regexp-BXU4cTCD.js} +1 -1
- package/dist/ui/assets/{rst-B3CO7WYO.js → rst-CGlzAlrM.js} +1 -1
- package/dist/ui/assets/{ruby-B6VMzT1T.js → ruby-CRKDbfJj.js} +1 -1
- package/dist/ui/assets/{sas-Df2lHVuU.js → sas-CKDY6iPG.js} +1 -1
- package/dist/ui/assets/{scss-4XxI6sgu.js → scss-BCoXLSqD.js} +1 -1
- package/dist/ui/assets/{shellscript-DYASCN4r.js → shellscript-BVuRs_tF.js} +1 -1
- package/dist/ui/assets/{shellsession-Br6AGJO_.js → shellsession-alj1b7vN.js} +1 -1
- package/dist/ui/assets/{soy-p3ZNq1We.js → soy-BbQDrw9i.js} +1 -1
- package/dist/ui/assets/{sql-CAdv2OXL.js → sql-BdcqHaEA.js} +1 -1
- package/dist/ui/assets/{stata-Dx7yUbG_.js → stata-5IC5m_XB.js} +1 -1
- package/dist/ui/assets/{surrealql-6YsE8HQa.js → surrealql-BfVFLYzV.js} +1 -1
- package/dist/ui/assets/{svelte-YgzedwpD.js → svelte-B22aFi25.js} +1 -1
- package/dist/ui/assets/{templ-Bahqx3uD.js → templ-BRo7TcBX.js} +1 -1
- package/dist/ui/assets/{tex-o6fTQjkH.js → tex-CYhw-JbD.js} +1 -1
- package/dist/ui/assets/{ts-tags-BO-Co0Ju.js → ts-tags-C56aGOzq.js} +1 -1
- package/dist/ui/assets/{tsx-DtQe5AoH.js → tsx-IkFyQoro.js} +1 -1
- package/dist/ui/assets/{twig-BcUs6Kqc.js → twig-NkXaxf7l.js} +1 -1
- package/dist/ui/assets/{typescript-BPtM8h4u.js → typescript-AgbZakqy.js} +1 -1
- package/dist/ui/assets/{vue-5KkGUzJJ.js → vue-Cxz1Rk-f.js} +1 -1
- package/dist/ui/assets/{vue-html-Df_Xfsz9.js → vue-html-DWHLzP-w.js} +1 -1
- package/dist/ui/assets/{vue-vine-hUIe_u_Y.js → vue-vine-WR64TKte.js} +1 -1
- package/dist/ui/assets/{xml-C3Jy7as5.js → xml-CNdUn7jo.js} +1 -1
- package/dist/ui/assets/{xsl-BnF9OuFo.js → xsl-DLRRUZ98.js} +1 -1
- package/dist/ui/assets/{yaml-DyrFgCou.js → yaml-gltXViA8.js} +1 -1
- package/dist/workspace-colors.js +54 -0
- package/dist/workspaces/git/git-worktrees.js +53 -14
- package/dist/workspaces/inventory.js +2 -0
- package/dist/workspaces/presentation/workspace-presentation.js +13 -0
- package/dist/workspaces/relay/workspace-relay.js +3 -0
- package/dist/workspaces/sessions.js +28 -8
- package/dist/workspaces.js +9 -9
- package/docs/chatgpt-coding-workflow.md +16 -8
- package/docs/gotchas.md +2 -2
- package/package.json +2 -1
- package/schemas/v1/config.user.schema.json +2 -2
- package/scripts/ci/cmd-acceptance.mjs +3 -85
- package/scripts/ci/gates/acceptance-runtime.mjs +45 -0
- package/scripts/ci/gates/platform-tests.mjs +27 -17
- package/scripts/ci/gates/prepare-windows-shell-runtime.mjs +45 -0
- package/scripts/ci/gates/test-shard.mjs +29 -7
- package/scripts/ci/powershell51-acceptance.mjs +10 -91
- package/scripts/ci/pwsh-acceptance.mjs +7 -87
- package/scripts/ci/windows-product-acceptance.mjs +55 -0
- package/scripts/release/release-gate.test.mjs +121 -13
- package/scripts/release-parity.mjs +12 -1
- package/dist/ui/assets/activity-panel-app-DkfJzTZ3.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./java-
|
|
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-
|
|
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
|
|
191
|
-
|
|
192
|
-
|
|
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.
|
|
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
|
-
|
|
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("
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
workspace.worktree.
|
|
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;
|
package/dist/workspaces.js
CHANGED
|
@@ -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 =
|
|
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
|
|
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.
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
-
|
|
152
|
-
- a local `baseRef`
|
|
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
|
+
"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": "
|
|
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.",
|