Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2) - #235

Merged
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64
Jul 29, 2026
Merged

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)#235
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64

Conversation

@jack-champagne

@jack-champagnejack-champagne commented Jul 29, 2026

Copy link
Copy Markdown
Member

Stacked on #234retarget this base to main before merging #234 (see warning at the bottom).

VS Code Remote-Containers installs the extension inside the container, so an arm64 devcontainer (the common case on Apple Silicon) needs a native linux-arm64 binary. We only vendored linux-x64 and darwin-arm64, so those users had nothing to install.

This ships as part of 0.1.2, not a follow-up 0.1.3

No v0.1.2 tag or release exists yet, so the version is still open. That matters because #234 establishes that a version's target set is fixed at publish time: publish 0.1.2 without linux-arm64 and arm64 Linux clients resolve down to the stale 0.0.2 universal, with no way to retrofit the target into that published version. Landing both PRs under one v0.1.2 tag means a single Marketplace version covering every target, and no stale window.

linux-arm64 is a real target, not a cover — there is a working binary for it, so it should run, not display advice.

Changes

  • fork (ci(amicode): build and release a linux-arm64 binary opencode#101, released as v1.17.3-amicode.13): opencode-linux-arm64 added to the release build. It was already a valid target in script/build.ts; bun cross-compiles it from the x64 runner the same way darwin-arm64 is built.
  • opencode.lock.json pinned to amicode.13, now with three platforms
  • SUPPORTED gains linux-arm64 and is exported, so a new test asserts it matches the lock exactly — the two live in different files and drifting either way ships a binary the extension refuses to launch (or advertises a platform with nothing to vendor)
  • release.yml: seven vsixes — four installable (universal + 3 lean) as Release assets, three covers. Marketplace publish goes to six platform entries. The pairwise mv shuffle became a loop since it no longer generalizes to three.
  • ci.yml: fetch + gate-check all three binaries
  • boot-smoke now runs on ubuntu-24.04-arm — free for public repos, and the only place a linux-arm64 binary is ever executed. The fork cross-compiles it, so this job is its native smoke test (boot_smoke.mjs boots the server and probes /event).

Verified

  • boot-smoke (ubuntu-24.04-arm)green — the cross-compiled binary boots and serves SSE on real aarch64
  • file on the vendored binary: ELF 64-bit LSB executable, ARM aarch64, sha256-verified against the lock
  • 814/814 tests, typecheck clean
  • three-way mv shuffle dry-run: exactly one platform present per vsce package call, all restored

⚠️ Merge order

Do not merge #234 with --delete-branch while this PR points at it — that auto-closes this PR. Retarget this one to main first, then merge both.

A missing target platform is not neutral on the VS Code Marketplace: a client
whose target has no entry resolves down to the newest *universal* version on
the listing and installs it silently. Ours is 0.0.2, published before the
platform split, so from 0.0.3 through 0.1.1 every Windows and Intel-Mac
install landed on a stale build reporting itself as the latest version.
Publish binary-less cover packages for win32-x64, win32-arm64 and darwin-x64
(2.5MB each, vs ~100MB for the universal fat vsix) so those clients resolve to
the current version, and give them somewhere to go: unsupportedHostAdvice()
points Windows at WSL, with a "Reopen in WSL" action when the WSL extension is
present to provide the command. Fail the build if a cover package ships a
binary.
Windows is served by amicode-linux-x64.vsix inside the WSL host, never by
win32-*; declare extensionKind: ["workspace"] so that placement is explicit
rather than inferred. Document the install story in the README, which had none.
VS Code Remote-Containers installs the extension INSIDE the container, so an
arm64 devcontainer (the common case on Apple Silicon) needs a native binary.
We only vendored linux-x64 and darwin-arm64, so those users had nothing.
- opencode.lock.json gains linux-arm64 (sha pinned from the fork release)
- SUPPORTED gains linux-arm64, and is now exported so a test can assert it
matches the lock exactly — the two live in different files and drifting
either way ships a binary the extension refuses to launch
- ci.yml + release.yml fetch and gate-check all three binaries; release.yml
packages a third lean vsix and publishes it to the Marketplace
- boot-smoke runs on ubuntu-24.04-arm, which is free for public repos and is
the only place a linux-arm64 binary gets executed (the fork cross-compiles
it, so this is its native smoke test)
@jack-champagnejack-champagne changed the title Ship a linux-arm64 build for arm64 devcontainersShip a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)Jul 29, 2026
@jack-champagne
jack-champagne changed the base branch from fix/win32-marketplace-fallback to mainJuly 29, 2026 15:52
@jack-champagne
jack-champagne merged commit 7cc9ba7 into mainJul 29, 2026
6 checks passed
@jack-champagne
jack-champagne deleted the feat/linux-arm64 branch July 29, 2026 15:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2) - #235

Merged
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64
Jul 29, 2026
Merged

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)#235
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64

Conversation

@jack-champagne

@jack-champagnejack-champagne commented Jul 29, 2026

Copy link
Copy Markdown
Member

Stacked on #234retarget this base to main before merging #234 (see warning at the bottom).

VS Code Remote-Containers installs the extension inside the container, so an arm64 devcontainer (the common case on Apple Silicon) needs a native linux-arm64 binary. We only vendored linux-x64 and darwin-arm64, so those users had nothing to install.

This ships as part of 0.1.2, not a follow-up 0.1.3

No v0.1.2 tag or release exists yet, so the version is still open. That matters because #234 establishes that a version's target set is fixed at publish time: publish 0.1.2 without linux-arm64 and arm64 Linux clients resolve down to the stale 0.0.2 universal, with no way to retrofit the target into that published version. Landing both PRs under one v0.1.2 tag means a single Marketplace version covering every target, and no stale window.

linux-arm64 is a real target, not a cover — there is a working binary for it, so it should run, not display advice.

Changes

  • fork (ci(amicode): build and release a linux-arm64 binary opencode#101, released as v1.17.3-amicode.13): opencode-linux-arm64 added to the release build. It was already a valid target in script/build.ts; bun cross-compiles it from the x64 runner the same way darwin-arm64 is built.
  • opencode.lock.json pinned to amicode.13, now with three platforms
  • SUPPORTED gains linux-arm64 and is exported, so a new test asserts it matches the lock exactly — the two live in different files and drifting either way ships a binary the extension refuses to launch (or advertises a platform with nothing to vendor)
  • release.yml: seven vsixes — four installable (universal + 3 lean) as Release assets, three covers. Marketplace publish goes to six platform entries. The pairwise mv shuffle became a loop since it no longer generalizes to three.
  • ci.yml: fetch + gate-check all three binaries
  • boot-smoke now runs on ubuntu-24.04-arm — free for public repos, and the only place a linux-arm64 binary is ever executed. The fork cross-compiles it, so this job is its native smoke test (boot_smoke.mjs boots the server and probes /event).

Verified

  • boot-smoke (ubuntu-24.04-arm)green — the cross-compiled binary boots and serves SSE on real aarch64
  • file on the vendored binary: ELF 64-bit LSB executable, ARM aarch64, sha256-verified against the lock
  • 814/814 tests, typecheck clean
  • three-way mv shuffle dry-run: exactly one platform present per vsce package call, all restored

⚠️ Merge order

Do not merge #234 with --delete-branch while this PR points at it — that auto-closes this PR. Retarget this one to main first, then merge both.

A missing target platform is not neutral on the VS Code Marketplace: a client
whose target has no entry resolves down to the newest *universal* version on
the listing and installs it silently. Ours is 0.0.2, published before the
platform split, so from 0.0.3 through 0.1.1 every Windows and Intel-Mac
install landed on a stale build reporting itself as the latest version.
Publish binary-less cover packages for win32-x64, win32-arm64 and darwin-x64
(2.5MB each, vs ~100MB for the universal fat vsix) so those clients resolve to
the current version, and give them somewhere to go: unsupportedHostAdvice()
points Windows at WSL, with a "Reopen in WSL" action when the WSL extension is
present to provide the command. Fail the build if a cover package ships a
binary.
Windows is served by amicode-linux-x64.vsix inside the WSL host, never by
win32-*; declare extensionKind: ["workspace"] so that placement is explicit
rather than inferred. Document the install story in the README, which had none.
VS Code Remote-Containers installs the extension INSIDE the container, so an
arm64 devcontainer (the common case on Apple Silicon) needs a native binary.
We only vendored linux-x64 and darwin-arm64, so those users had nothing.
- opencode.lock.json gains linux-arm64 (sha pinned from the fork release)
- SUPPORTED gains linux-arm64, and is now exported so a test can assert it
matches the lock exactly — the two live in different files and drifting
either way ships a binary the extension refuses to launch
- ci.yml + release.yml fetch and gate-check all three binaries; release.yml
packages a third lean vsix and publishes it to the Marketplace
- boot-smoke runs on ubuntu-24.04-arm, which is free for public repos and is
the only place a linux-arm64 binary gets executed (the fork cross-compiles
it, so this is its native smoke test)
@jack-champagnejack-champagne changed the title Ship a linux-arm64 build for arm64 devcontainersShip a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)Jul 29, 2026
@jack-champagne
jack-champagne changed the base branch from fix/win32-marketplace-fallback to mainJuly 29, 2026 15:52
@jack-champagne
jack-champagne merged commit 7cc9ba7 into mainJul 29, 2026
6 checks passed
@jack-champagne
jack-champagne deleted the feat/linux-arm64 branch July 29, 2026 15:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2) - #235

Merged
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64
Jul 29, 2026
Merged

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)#235
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64

Conversation

@jack-champagne

@jack-champagnejack-champagne commented Jul 29, 2026

Copy link
Copy Markdown
Member

Stacked on #234retarget this base to main before merging #234 (see warning at the bottom).

VS Code Remote-Containers installs the extension inside the container, so an arm64 devcontainer (the common case on Apple Silicon) needs a native linux-arm64 binary. We only vendored linux-x64 and darwin-arm64, so those users had nothing to install.

This ships as part of 0.1.2, not a follow-up 0.1.3

No v0.1.2 tag or release exists yet, so the version is still open. That matters because #234 establishes that a version's target set is fixed at publish time: publish 0.1.2 without linux-arm64 and arm64 Linux clients resolve down to the stale 0.0.2 universal, with no way to retrofit the target into that published version. Landing both PRs under one v0.1.2 tag means a single Marketplace version covering every target, and no stale window.

linux-arm64 is a real target, not a cover — there is a working binary for it, so it should run, not display advice.

Changes

  • fork (ci(amicode): build and release a linux-arm64 binary opencode#101, released as v1.17.3-amicode.13): opencode-linux-arm64 added to the release build. It was already a valid target in script/build.ts; bun cross-compiles it from the x64 runner the same way darwin-arm64 is built.
  • opencode.lock.json pinned to amicode.13, now with three platforms
  • SUPPORTED gains linux-arm64 and is exported, so a new test asserts it matches the lock exactly — the two live in different files and drifting either way ships a binary the extension refuses to launch (or advertises a platform with nothing to vendor)
  • release.yml: seven vsixes — four installable (universal + 3 lean) as Release assets, three covers. Marketplace publish goes to six platform entries. The pairwise mv shuffle became a loop since it no longer generalizes to three.
  • ci.yml: fetch + gate-check all three binaries
  • boot-smoke now runs on ubuntu-24.04-arm — free for public repos, and the only place a linux-arm64 binary is ever executed. The fork cross-compiles it, so this job is its native smoke test (boot_smoke.mjs boots the server and probes /event).

Verified

  • boot-smoke (ubuntu-24.04-arm)green — the cross-compiled binary boots and serves SSE on real aarch64
  • file on the vendored binary: ELF 64-bit LSB executable, ARM aarch64, sha256-verified against the lock
  • 814/814 tests, typecheck clean
  • three-way mv shuffle dry-run: exactly one platform present per vsce package call, all restored

⚠️ Merge order

Do not merge #234 with --delete-branch while this PR points at it — that auto-closes this PR. Retarget this one to main first, then merge both.

A missing target platform is not neutral on the VS Code Marketplace: a client
whose target has no entry resolves down to the newest *universal* version on
the listing and installs it silently. Ours is 0.0.2, published before the
platform split, so from 0.0.3 through 0.1.1 every Windows and Intel-Mac
install landed on a stale build reporting itself as the latest version.
Publish binary-less cover packages for win32-x64, win32-arm64 and darwin-x64
(2.5MB each, vs ~100MB for the universal fat vsix) so those clients resolve to
the current version, and give them somewhere to go: unsupportedHostAdvice()
points Windows at WSL, with a "Reopen in WSL" action when the WSL extension is
present to provide the command. Fail the build if a cover package ships a
binary.
Windows is served by amicode-linux-x64.vsix inside the WSL host, never by
win32-*; declare extensionKind: ["workspace"] so that placement is explicit
rather than inferred. Document the install story in the README, which had none.
VS Code Remote-Containers installs the extension INSIDE the container, so an
arm64 devcontainer (the common case on Apple Silicon) needs a native binary.
We only vendored linux-x64 and darwin-arm64, so those users had nothing.
- opencode.lock.json gains linux-arm64 (sha pinned from the fork release)
- SUPPORTED gains linux-arm64, and is now exported so a test can assert it
matches the lock exactly — the two live in different files and drifting
either way ships a binary the extension refuses to launch
- ci.yml + release.yml fetch and gate-check all three binaries; release.yml
packages a third lean vsix and publishes it to the Marketplace
- boot-smoke runs on ubuntu-24.04-arm, which is free for public repos and is
the only place a linux-arm64 binary gets executed (the fork cross-compiles
it, so this is its native smoke test)
@jack-champagnejack-champagne changed the title Ship a linux-arm64 build for arm64 devcontainersShip a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)Jul 29, 2026
@jack-champagne
jack-champagne changed the base branch from fix/win32-marketplace-fallback to mainJuly 29, 2026 15:52
@jack-champagne
jack-champagne merged commit 7cc9ba7 into mainJul 29, 2026
6 checks passed
@jack-champagne
jack-champagne deleted the feat/linux-arm64 branch July 29, 2026 15:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2) - #235

Merged
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64
Jul 29, 2026
Merged

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)#235
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64

Conversation

@jack-champagne

@jack-champagnejack-champagne commented Jul 29, 2026

Copy link
Copy Markdown
Member

Stacked on #234retarget this base to main before merging #234 (see warning at the bottom).

VS Code Remote-Containers installs the extension inside the container, so an arm64 devcontainer (the common case on Apple Silicon) needs a native linux-arm64 binary. We only vendored linux-x64 and darwin-arm64, so those users had nothing to install.

This ships as part of 0.1.2, not a follow-up 0.1.3

No v0.1.2 tag or release exists yet, so the version is still open. That matters because #234 establishes that a version's target set is fixed at publish time: publish 0.1.2 without linux-arm64 and arm64 Linux clients resolve down to the stale 0.0.2 universal, with no way to retrofit the target into that published version. Landing both PRs under one v0.1.2 tag means a single Marketplace version covering every target, and no stale window.

linux-arm64 is a real target, not a cover — there is a working binary for it, so it should run, not display advice.

Changes

  • fork (ci(amicode): build and release a linux-arm64 binary opencode#101, released as v1.17.3-amicode.13): opencode-linux-arm64 added to the release build. It was already a valid target in script/build.ts; bun cross-compiles it from the x64 runner the same way darwin-arm64 is built.
  • opencode.lock.json pinned to amicode.13, now with three platforms
  • SUPPORTED gains linux-arm64 and is exported, so a new test asserts it matches the lock exactly — the two live in different files and drifting either way ships a binary the extension refuses to launch (or advertises a platform with nothing to vendor)
  • release.yml: seven vsixes — four installable (universal + 3 lean) as Release assets, three covers. Marketplace publish goes to six platform entries. The pairwise mv shuffle became a loop since it no longer generalizes to three.
  • ci.yml: fetch + gate-check all three binaries
  • boot-smoke now runs on ubuntu-24.04-arm — free for public repos, and the only place a linux-arm64 binary is ever executed. The fork cross-compiles it, so this job is its native smoke test (boot_smoke.mjs boots the server and probes /event).

Verified

  • boot-smoke (ubuntu-24.04-arm)green — the cross-compiled binary boots and serves SSE on real aarch64
  • file on the vendored binary: ELF 64-bit LSB executable, ARM aarch64, sha256-verified against the lock
  • 814/814 tests, typecheck clean
  • three-way mv shuffle dry-run: exactly one platform present per vsce package call, all restored

⚠️ Merge order

Do not merge #234 with --delete-branch while this PR points at it — that auto-closes this PR. Retarget this one to main first, then merge both.

A missing target platform is not neutral on the VS Code Marketplace: a client
whose target has no entry resolves down to the newest *universal* version on
the listing and installs it silently. Ours is 0.0.2, published before the
platform split, so from 0.0.3 through 0.1.1 every Windows and Intel-Mac
install landed on a stale build reporting itself as the latest version.
Publish binary-less cover packages for win32-x64, win32-arm64 and darwin-x64
(2.5MB each, vs ~100MB for the universal fat vsix) so those clients resolve to
the current version, and give them somewhere to go: unsupportedHostAdvice()
points Windows at WSL, with a "Reopen in WSL" action when the WSL extension is
present to provide the command. Fail the build if a cover package ships a
binary.
Windows is served by amicode-linux-x64.vsix inside the WSL host, never by
win32-*; declare extensionKind: ["workspace"] so that placement is explicit
rather than inferred. Document the install story in the README, which had none.
VS Code Remote-Containers installs the extension INSIDE the container, so an
arm64 devcontainer (the common case on Apple Silicon) needs a native binary.
We only vendored linux-x64 and darwin-arm64, so those users had nothing.
- opencode.lock.json gains linux-arm64 (sha pinned from the fork release)
- SUPPORTED gains linux-arm64, and is now exported so a test can assert it
matches the lock exactly — the two live in different files and drifting
either way ships a binary the extension refuses to launch
- ci.yml + release.yml fetch and gate-check all three binaries; release.yml
packages a third lean vsix and publishes it to the Marketplace
- boot-smoke runs on ubuntu-24.04-arm, which is free for public repos and is
the only place a linux-arm64 binary gets executed (the fork cross-compiles
it, so this is its native smoke test)
@jack-champagnejack-champagne changed the title Ship a linux-arm64 build for arm64 devcontainersShip a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)Jul 29, 2026
@jack-champagne
jack-champagne changed the base branch from fix/win32-marketplace-fallback to mainJuly 29, 2026 15:52
@jack-champagne
jack-champagne merged commit 7cc9ba7 into mainJul 29, 2026
6 checks passed
@jack-champagne
jack-champagne deleted the feat/linux-arm64 branch July 29, 2026 15:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2) - #235

Merged
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64
Jul 29, 2026
Merged

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)#235
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64

Conversation

@jack-champagne

@jack-champagnejack-champagne commented Jul 29, 2026

Copy link
Copy Markdown
Member

Stacked on #234retarget this base to main before merging #234 (see warning at the bottom).

VS Code Remote-Containers installs the extension inside the container, so an arm64 devcontainer (the common case on Apple Silicon) needs a native linux-arm64 binary. We only vendored linux-x64 and darwin-arm64, so those users had nothing to install.

This ships as part of 0.1.2, not a follow-up 0.1.3

No v0.1.2 tag or release exists yet, so the version is still open. That matters because #234 establishes that a version's target set is fixed at publish time: publish 0.1.2 without linux-arm64 and arm64 Linux clients resolve down to the stale 0.0.2 universal, with no way to retrofit the target into that published version. Landing both PRs under one v0.1.2 tag means a single Marketplace version covering every target, and no stale window.

linux-arm64 is a real target, not a cover — there is a working binary for it, so it should run, not display advice.

Changes

  • fork (ci(amicode): build and release a linux-arm64 binary opencode#101, released as v1.17.3-amicode.13): opencode-linux-arm64 added to the release build. It was already a valid target in script/build.ts; bun cross-compiles it from the x64 runner the same way darwin-arm64 is built.
  • opencode.lock.json pinned to amicode.13, now with three platforms
  • SUPPORTED gains linux-arm64 and is exported, so a new test asserts it matches the lock exactly — the two live in different files and drifting either way ships a binary the extension refuses to launch (or advertises a platform with nothing to vendor)
  • release.yml: seven vsixes — four installable (universal + 3 lean) as Release assets, three covers. Marketplace publish goes to six platform entries. The pairwise mv shuffle became a loop since it no longer generalizes to three.
  • ci.yml: fetch + gate-check all three binaries
  • boot-smoke now runs on ubuntu-24.04-arm — free for public repos, and the only place a linux-arm64 binary is ever executed. The fork cross-compiles it, so this job is its native smoke test (boot_smoke.mjs boots the server and probes /event).

Verified

  • boot-smoke (ubuntu-24.04-arm)green — the cross-compiled binary boots and serves SSE on real aarch64
  • file on the vendored binary: ELF 64-bit LSB executable, ARM aarch64, sha256-verified against the lock
  • 814/814 tests, typecheck clean
  • three-way mv shuffle dry-run: exactly one platform present per vsce package call, all restored

⚠️ Merge order

Do not merge #234 with --delete-branch while this PR points at it — that auto-closes this PR. Retarget this one to main first, then merge both.

A missing target platform is not neutral on the VS Code Marketplace: a client
whose target has no entry resolves down to the newest *universal* version on
the listing and installs it silently. Ours is 0.0.2, published before the
platform split, so from 0.0.3 through 0.1.1 every Windows and Intel-Mac
install landed on a stale build reporting itself as the latest version.
Publish binary-less cover packages for win32-x64, win32-arm64 and darwin-x64
(2.5MB each, vs ~100MB for the universal fat vsix) so those clients resolve to
the current version, and give them somewhere to go: unsupportedHostAdvice()
points Windows at WSL, with a "Reopen in WSL" action when the WSL extension is
present to provide the command. Fail the build if a cover package ships a
binary.
Windows is served by amicode-linux-x64.vsix inside the WSL host, never by
win32-*; declare extensionKind: ["workspace"] so that placement is explicit
rather than inferred. Document the install story in the README, which had none.
VS Code Remote-Containers installs the extension INSIDE the container, so an
arm64 devcontainer (the common case on Apple Silicon) needs a native binary.
We only vendored linux-x64 and darwin-arm64, so those users had nothing.
- opencode.lock.json gains linux-arm64 (sha pinned from the fork release)
- SUPPORTED gains linux-arm64, and is now exported so a test can assert it
matches the lock exactly — the two live in different files and drifting
either way ships a binary the extension refuses to launch
- ci.yml + release.yml fetch and gate-check all three binaries; release.yml
packages a third lean vsix and publishes it to the Marketplace
- boot-smoke runs on ubuntu-24.04-arm, which is free for public repos and is
the only place a linux-arm64 binary gets executed (the fork cross-compiles
it, so this is its native smoke test)
@jack-champagnejack-champagne changed the title Ship a linux-arm64 build for arm64 devcontainersShip a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)Jul 29, 2026
@jack-champagne
jack-champagne changed the base branch from fix/win32-marketplace-fallback to mainJuly 29, 2026 15:52
@jack-champagne
jack-champagne merged commit 7cc9ba7 into mainJul 29, 2026
6 checks passed
@jack-champagne
jack-champagne deleted the feat/linux-arm64 branch July 29, 2026 15:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2) - #235

Merged
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64
Jul 29, 2026
Merged

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)#235
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64

Conversation

@jack-champagne

@jack-champagnejack-champagne commented Jul 29, 2026

Copy link
Copy Markdown
Member

Stacked on #234retarget this base to main before merging #234 (see warning at the bottom).

VS Code Remote-Containers installs the extension inside the container, so an arm64 devcontainer (the common case on Apple Silicon) needs a native linux-arm64 binary. We only vendored linux-x64 and darwin-arm64, so those users had nothing to install.

This ships as part of 0.1.2, not a follow-up 0.1.3

No v0.1.2 tag or release exists yet, so the version is still open. That matters because #234 establishes that a version's target set is fixed at publish time: publish 0.1.2 without linux-arm64 and arm64 Linux clients resolve down to the stale 0.0.2 universal, with no way to retrofit the target into that published version. Landing both PRs under one v0.1.2 tag means a single Marketplace version covering every target, and no stale window.

linux-arm64 is a real target, not a cover — there is a working binary for it, so it should run, not display advice.

Changes

  • fork (ci(amicode): build and release a linux-arm64 binary opencode#101, released as v1.17.3-amicode.13): opencode-linux-arm64 added to the release build. It was already a valid target in script/build.ts; bun cross-compiles it from the x64 runner the same way darwin-arm64 is built.
  • opencode.lock.json pinned to amicode.13, now with three platforms
  • SUPPORTED gains linux-arm64 and is exported, so a new test asserts it matches the lock exactly — the two live in different files and drifting either way ships a binary the extension refuses to launch (or advertises a platform with nothing to vendor)
  • release.yml: seven vsixes — four installable (universal + 3 lean) as Release assets, three covers. Marketplace publish goes to six platform entries. The pairwise mv shuffle became a loop since it no longer generalizes to three.
  • ci.yml: fetch + gate-check all three binaries
  • boot-smoke now runs on ubuntu-24.04-arm — free for public repos, and the only place a linux-arm64 binary is ever executed. The fork cross-compiles it, so this job is its native smoke test (boot_smoke.mjs boots the server and probes /event).

Verified

  • boot-smoke (ubuntu-24.04-arm)green — the cross-compiled binary boots and serves SSE on real aarch64
  • file on the vendored binary: ELF 64-bit LSB executable, ARM aarch64, sha256-verified against the lock
  • 814/814 tests, typecheck clean
  • three-way mv shuffle dry-run: exactly one platform present per vsce package call, all restored

⚠️ Merge order

Do not merge #234 with --delete-branch while this PR points at it — that auto-closes this PR. Retarget this one to main first, then merge both.

A missing target platform is not neutral on the VS Code Marketplace: a client
whose target has no entry resolves down to the newest *universal* version on
the listing and installs it silently. Ours is 0.0.2, published before the
platform split, so from 0.0.3 through 0.1.1 every Windows and Intel-Mac
install landed on a stale build reporting itself as the latest version.
Publish binary-less cover packages for win32-x64, win32-arm64 and darwin-x64
(2.5MB each, vs ~100MB for the universal fat vsix) so those clients resolve to
the current version, and give them somewhere to go: unsupportedHostAdvice()
points Windows at WSL, with a "Reopen in WSL" action when the WSL extension is
present to provide the command. Fail the build if a cover package ships a
binary.
Windows is served by amicode-linux-x64.vsix inside the WSL host, never by
win32-*; declare extensionKind: ["workspace"] so that placement is explicit
rather than inferred. Document the install story in the README, which had none.
VS Code Remote-Containers installs the extension INSIDE the container, so an
arm64 devcontainer (the common case on Apple Silicon) needs a native binary.
We only vendored linux-x64 and darwin-arm64, so those users had nothing.
- opencode.lock.json gains linux-arm64 (sha pinned from the fork release)
- SUPPORTED gains linux-arm64, and is now exported so a test can assert it
matches the lock exactly — the two live in different files and drifting
either way ships a binary the extension refuses to launch
- ci.yml + release.yml fetch and gate-check all three binaries; release.yml
packages a third lean vsix and publishes it to the Marketplace
- boot-smoke runs on ubuntu-24.04-arm, which is free for public repos and is
the only place a linux-arm64 binary gets executed (the fork cross-compiles
it, so this is its native smoke test)
@jack-champagnejack-champagne changed the title Ship a linux-arm64 build for arm64 devcontainersShip a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)Jul 29, 2026
@jack-champagne
jack-champagne changed the base branch from fix/win32-marketplace-fallback to mainJuly 29, 2026 15:52
@jack-champagne
jack-champagne merged commit 7cc9ba7 into mainJul 29, 2026
6 checks passed
@jack-champagne
jack-champagne deleted the feat/linux-arm64 branch July 29, 2026 15:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2) - #235

Merged
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64
Jul 29, 2026
Merged

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)#235
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64

Conversation

@jack-champagne

@jack-champagnejack-champagne commented Jul 29, 2026

Copy link
Copy Markdown
Member

Stacked on #234retarget this base to main before merging #234 (see warning at the bottom).

VS Code Remote-Containers installs the extension inside the container, so an arm64 devcontainer (the common case on Apple Silicon) needs a native linux-arm64 binary. We only vendored linux-x64 and darwin-arm64, so those users had nothing to install.

This ships as part of 0.1.2, not a follow-up 0.1.3

No v0.1.2 tag or release exists yet, so the version is still open. That matters because #234 establishes that a version's target set is fixed at publish time: publish 0.1.2 without linux-arm64 and arm64 Linux clients resolve down to the stale 0.0.2 universal, with no way to retrofit the target into that published version. Landing both PRs under one v0.1.2 tag means a single Marketplace version covering every target, and no stale window.

linux-arm64 is a real target, not a cover — there is a working binary for it, so it should run, not display advice.

Changes

  • fork (ci(amicode): build and release a linux-arm64 binary opencode#101, released as v1.17.3-amicode.13): opencode-linux-arm64 added to the release build. It was already a valid target in script/build.ts; bun cross-compiles it from the x64 runner the same way darwin-arm64 is built.
  • opencode.lock.json pinned to amicode.13, now with three platforms
  • SUPPORTED gains linux-arm64 and is exported, so a new test asserts it matches the lock exactly — the two live in different files and drifting either way ships a binary the extension refuses to launch (or advertises a platform with nothing to vendor)
  • release.yml: seven vsixes — four installable (universal + 3 lean) as Release assets, three covers. Marketplace publish goes to six platform entries. The pairwise mv shuffle became a loop since it no longer generalizes to three.
  • ci.yml: fetch + gate-check all three binaries
  • boot-smoke now runs on ubuntu-24.04-arm — free for public repos, and the only place a linux-arm64 binary is ever executed. The fork cross-compiles it, so this job is its native smoke test (boot_smoke.mjs boots the server and probes /event).

Verified

  • boot-smoke (ubuntu-24.04-arm)green — the cross-compiled binary boots and serves SSE on real aarch64
  • file on the vendored binary: ELF 64-bit LSB executable, ARM aarch64, sha256-verified against the lock
  • 814/814 tests, typecheck clean
  • three-way mv shuffle dry-run: exactly one platform present per vsce package call, all restored

⚠️ Merge order

Do not merge #234 with --delete-branch while this PR points at it — that auto-closes this PR. Retarget this one to main first, then merge both.

A missing target platform is not neutral on the VS Code Marketplace: a client
whose target has no entry resolves down to the newest *universal* version on
the listing and installs it silently. Ours is 0.0.2, published before the
platform split, so from 0.0.3 through 0.1.1 every Windows and Intel-Mac
install landed on a stale build reporting itself as the latest version.
Publish binary-less cover packages for win32-x64, win32-arm64 and darwin-x64
(2.5MB each, vs ~100MB for the universal fat vsix) so those clients resolve to
the current version, and give them somewhere to go: unsupportedHostAdvice()
points Windows at WSL, with a "Reopen in WSL" action when the WSL extension is
present to provide the command. Fail the build if a cover package ships a
binary.
Windows is served by amicode-linux-x64.vsix inside the WSL host, never by
win32-*; declare extensionKind: ["workspace"] so that placement is explicit
rather than inferred. Document the install story in the README, which had none.
VS Code Remote-Containers installs the extension INSIDE the container, so an
arm64 devcontainer (the common case on Apple Silicon) needs a native binary.
We only vendored linux-x64 and darwin-arm64, so those users had nothing.
- opencode.lock.json gains linux-arm64 (sha pinned from the fork release)
- SUPPORTED gains linux-arm64, and is now exported so a test can assert it
matches the lock exactly — the two live in different files and drifting
either way ships a binary the extension refuses to launch
- ci.yml + release.yml fetch and gate-check all three binaries; release.yml
packages a third lean vsix and publishes it to the Marketplace
- boot-smoke runs on ubuntu-24.04-arm, which is free for public repos and is
the only place a linux-arm64 binary gets executed (the fork cross-compiles
it, so this is its native smoke test)
@jack-champagnejack-champagne changed the title Ship a linux-arm64 build for arm64 devcontainersShip a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)Jul 29, 2026
@jack-champagne
jack-champagne changed the base branch from fix/win32-marketplace-fallback to mainJuly 29, 2026 15:52
@jack-champagne
jack-champagne merged commit 7cc9ba7 into mainJul 29, 2026
6 checks passed
@jack-champagne
jack-champagne deleted the feat/linux-arm64 branch July 29, 2026 15:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2) - #235

Merged
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64
Jul 29, 2026
Merged

Ship a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)#235
jack-champagne merged 2 commits into
mainfrom
feat/linux-arm64

Conversation

@jack-champagne

@jack-champagnejack-champagne commented Jul 29, 2026

Copy link
Copy Markdown
Member

Stacked on #234retarget this base to main before merging #234 (see warning at the bottom).

VS Code Remote-Containers installs the extension inside the container, so an arm64 devcontainer (the common case on Apple Silicon) needs a native linux-arm64 binary. We only vendored linux-x64 and darwin-arm64, so those users had nothing to install.

This ships as part of 0.1.2, not a follow-up 0.1.3

No v0.1.2 tag or release exists yet, so the version is still open. That matters because #234 establishes that a version's target set is fixed at publish time: publish 0.1.2 without linux-arm64 and arm64 Linux clients resolve down to the stale 0.0.2 universal, with no way to retrofit the target into that published version. Landing both PRs under one v0.1.2 tag means a single Marketplace version covering every target, and no stale window.

linux-arm64 is a real target, not a cover — there is a working binary for it, so it should run, not display advice.

Changes

  • fork (ci(amicode): build and release a linux-arm64 binary opencode#101, released as v1.17.3-amicode.13): opencode-linux-arm64 added to the release build. It was already a valid target in script/build.ts; bun cross-compiles it from the x64 runner the same way darwin-arm64 is built.
  • opencode.lock.json pinned to amicode.13, now with three platforms
  • SUPPORTED gains linux-arm64 and is exported, so a new test asserts it matches the lock exactly — the two live in different files and drifting either way ships a binary the extension refuses to launch (or advertises a platform with nothing to vendor)
  • release.yml: seven vsixes — four installable (universal + 3 lean) as Release assets, three covers. Marketplace publish goes to six platform entries. The pairwise mv shuffle became a loop since it no longer generalizes to three.
  • ci.yml: fetch + gate-check all three binaries
  • boot-smoke now runs on ubuntu-24.04-arm — free for public repos, and the only place a linux-arm64 binary is ever executed. The fork cross-compiles it, so this job is its native smoke test (boot_smoke.mjs boots the server and probes /event).

Verified

  • boot-smoke (ubuntu-24.04-arm)green — the cross-compiled binary boots and serves SSE on real aarch64
  • file on the vendored binary: ELF 64-bit LSB executable, ARM aarch64, sha256-verified against the lock
  • 814/814 tests, typecheck clean
  • three-way mv shuffle dry-run: exactly one platform present per vsce package call, all restored

⚠️ Merge order

Do not merge #234 with --delete-branch while this PR points at it — that auto-closes this PR. Retarget this one to main first, then merge both.

A missing target platform is not neutral on the VS Code Marketplace: a client
whose target has no entry resolves down to the newest *universal* version on
the listing and installs it silently. Ours is 0.0.2, published before the
platform split, so from 0.0.3 through 0.1.1 every Windows and Intel-Mac
install landed on a stale build reporting itself as the latest version.
Publish binary-less cover packages for win32-x64, win32-arm64 and darwin-x64
(2.5MB each, vs ~100MB for the universal fat vsix) so those clients resolve to
the current version, and give them somewhere to go: unsupportedHostAdvice()
points Windows at WSL, with a "Reopen in WSL" action when the WSL extension is
present to provide the command. Fail the build if a cover package ships a
binary.
Windows is served by amicode-linux-x64.vsix inside the WSL host, never by
win32-*; declare extensionKind: ["workspace"] so that placement is explicit
rather than inferred. Document the install story in the README, which had none.
VS Code Remote-Containers installs the extension INSIDE the container, so an
arm64 devcontainer (the common case on Apple Silicon) needs a native binary.
We only vendored linux-x64 and darwin-arm64, so those users had nothing.
- opencode.lock.json gains linux-arm64 (sha pinned from the fork release)
- SUPPORTED gains linux-arm64, and is now exported so a test can assert it
matches the lock exactly — the two live in different files and drifting
either way ships a binary the extension refuses to launch
- ci.yml + release.yml fetch and gate-check all three binaries; release.yml
packages a third lean vsix and publishes it to the Marketplace
- boot-smoke runs on ubuntu-24.04-arm, which is free for public repos and is
the only place a linux-arm64 binary gets executed (the fork cross-compiles
it, so this is its native smoke test)
@jack-champagnejack-champagne changed the title Ship a linux-arm64 build for arm64 devcontainersShip a linux-arm64 build for arm64 devcontainers (rides in 0.1.2)Jul 29, 2026
@jack-champagne
jack-champagne changed the base branch from fix/win32-marketplace-fallback to mainJuly 29, 2026 15:52
@jack-champagne
jack-champagne merged commit 7cc9ba7 into mainJul 29, 2026
6 checks passed
@jack-champagne
jack-champagne deleted the feat/linux-arm64 branch July 29, 2026 15:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne