Repository navigation
build: ship as OpenCodeAI at 0.8.0, and refresh the docs that drifted - #64
Merged
Merged
Conversation
Three consumer-facing documents had drifted from the tree they describe. The test count in the README and the changelog predates the terminal work by 124 tests, and the package table still rendered dynamic NuGet badges for packages that are not published, so both resolved to an error rather than a status. The project status also claimed the first published package was the only thing missing, which its own next bullet and the known issues already contradict. The terminals guide never received the lifetime contract that shipped with the terminal work. A caller reading it could not learn that canceling a read leaves the connection usable, that undelivered frames queue and the queue is not history, that termination delivers what it already holds before reporting its outcome, that disposal abandons unread frames, or that a send carries a thirty-second budget it can configure. That is now one shared section for both families, relaying the exact contract to the runtime architecture that owns it, and the changelog records the same addition with its SendTimeout option. Every sample now leads with OPENCODE_PASSWORD. Upstream reads that name first and calls OPENCODE_SERVER_PASSWORD its legacy name, still honored, so the fallback survives as a single sentence on the page that owns the explanation rather than as the name every example teaches. The launcher has landed, so the packaging canon states where it ships instead of where it will ship, and every guide page now carries the Date line the documentation rules require.
The first NuGet.org release will be a 0.8.0-preview.N prerelease rather than 0.1.0, iterating the preview and patch numbers toward 1.0.0. Nothing is published yet, so nothing migrates: the single-sourced VersionPrefix moves and every place that quoted the old number follows it. Prose that named an exact release number now names the release instead, because that number changes with each preview while the version prefix and the nightly format do not. The roadmap's open question narrows accordingly: the prerelease-versus-stable decision is made, and only the release-notes flow stays open.
nuget.org reserves the OpenCode. prefix for an unrelated owner, which is why every push of OpenCode.Sdk was refused with a 409 the publish lane reported as success. An upload probe confirmed the reservation is dot-terminated, so OpenCodeAI.Sdk is accepted, and the first release ships under that identity while the dispute runs its course. Only the package id moves. Neither project declared a PackageId before, so both inherited their assembly name; each now sets its own and nothing else changes. The shipped assemblies stay OpenCode.Sdk.dll and OpenCode.Sdk.Extensions.dll, every public namespace stays OpenCode.Sdk, the public API baseline is untouched, and consumer source needs no edit at all: a project reference packs as a dependency on OpenCodeAI.Sdk, so the two artifacts still resolve each other. The install commands, package table, badge targets, and GitHub Packages links follow the ids, the publish workflow's header names the ids the Trusted Publishing policy has to cover, and the packaging canon records that the ids and the assembly names are deliberately different things.
The fixture contract guard landed with the snapshot refresh and runs on every target framework, so the suite is four tests larger than the number the readme and the changelog carry.
Blind-Striker
force-pushed
the
build/package-id-opencodeai
branch
from
September 8, 2026 19:00
b711528 to
5a341b9
Compare
The standalone door defaulted to `opencode serve`, described in its own summary as upstream's default command shape. Upstream has no such default: its standalone mode re-invokes the executable it is already running, because the CLI is opencode. An SDK cannot do that, so it has to name a binary, and the one it should name is the one the line this SDK speaks to installs. That CLI package declares exactly one executable and calls it `opencode2`. Nothing exercised the old value. Every test supplies its own command, pointing at the pinned submodule through bun, so the default was never spawned by anything and the mismatch survived: the readme tells a reader to install `opencode2`, and the quick start then called `StartAsync()` with a default that looked for `opencode`. That is the first sample on the package page, sold as needing nothing running in advance. A caller who wants a different binary still passes `Command`; a caller whose executable is missing gets a spawn failure naming it.
The root readme is the package page, and it announced that the package does not exist: "Nothing is on NuGet.org yet", an install command that "will not resolve", and three grey coming-soon badges. That text is embedded at pack time and a published package's readme cannot be edited afterwards, so it had to go before the first push rather than after it. The wording is now evergreen — the commands say what to run, and a live version badge says whether a version exists — so it is correct both before and after a publish, and does not need editing again at the next one. Twenty-three relative links are now absolute. NuGet.org renders the embedded readme with a restricted subset that blanks any non-absolute link, so the whole documentation table, the licence, the changelog and every guide link resolved to nothing on the package page. They still work on GitHub. The package id differs from the assembly name, and nothing a consumer reads said so. Installing `OpenCodeAI.Sdk` and writing `using OpenCode.Sdk;` now has an explanation where it is needed: a note under both install blocks, the known-issue entry, and the package description itself, which also gives the search index the name people will look for. Corrections found alongside it: the readme stated a pin two refreshes stale, so it now relays to the file that owns the pin instead of repeating a value that rots; the changelog gained the `f9bc223` entry it never received and lost the migration notes written for nightly consumers of an API no one has published; the guide counted 27 client families where the baseline has 28, missing `Rpc`; the guide's install section installed nothing; the roadmap and the security policy still named the old package ids; and a workflow rule pointed at a path that moved in the public/private split. Upstream's MIT notice now travels with the snapshot derived from it, in THIRD-PARTY-NOTICES.md, packed beside the licence.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three commits that together make the repository publishable.
docs:refresh status claims and document terminal lifetimeThe test count in the README and the changelog predated the terminal work by 124 tests, and the package table still rendered dynamic NuGet badges for packages that are not published, so both resolved to an error rather than a status. The terminals guide never received the lifetime contract that shipped with PR #61: a caller could not learn that canceling a read leaves the connection usable, that undelivered frames queue, that disposal abandons them, or that a send carries a configurable 30-second budget. That is now one shared section relaying the exact contract to the runtime architecture that owns it.
Every sample also leads with
OPENCODE_PASSWORD; upstream reads that name first and callsOPENCODE_SERVER_PASSWORDits legacy name, so the fallback survives as one sentence on the page that owns the explanation. Every guide page now carries theDate:line the documentation rules require.build:move the version line to 0.8.0The first NuGet.org release will be a
0.8.0-preview.Nprerelease, iterating the preview and patch numbers toward1.0.0. Nothing is published yet, so nothing migrates. Prose that named an exact release number now names the release instead, because that number changes with each preview while the version prefix and the nightly format do not.build:publish under the OpenCodeAI package idsnuget.org reserves the
OpenCode.prefix for an unrelated owner, which is why every push ofOpenCode.Sdkwas refused with a 409 the publish lane reported as success. An upload probe confirmed the reservation is dot-terminated, soOpenCodeAI.Sdkis accepted.Only the package id moves. Neither project declared a
PackageIdbefore, so both inherited their assembly name; each now sets its own. The shipped assemblies stayOpenCode.Sdk.dllandOpenCode.Sdk.Extensions.dll, every public namespace staysOpenCode.Sdk, the public API baseline is untouched, and consumer source needs no edit — a project reference packs as a dependency onOpenCodeAI.Sdk, verified by inspecting the produced nuspec.Gates on the final tree: analyzers, Release build with zero warnings, both format passes, and 5,134/5,134 tests.