Skip to content

build: ship as OpenCodeAI at 0.8.0, and refresh the docs that drifted - #64

Merged
Blind-Striker merged 6 commits into
masterfrom
build/package-id-opencodeai
Sep 8, 2026
Merged

Blind-Striker merged 6 commits into
masterfrom
build/package-id-opencodeai

Conversation

@Blind-Striker

Copy link
Copy Markdown
Collaborator

Three commits that together make the repository publishable.

docs: refresh status claims and document terminal lifetime

The 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 calls OPENCODE_SERVER_PASSWORD its legacy name, so the fallback survives as one sentence on the page that owns the explanation. Every guide page now carries the Date: line the documentation rules require.

build: move the version line to 0.8.0

The first NuGet.org release will be a 0.8.0-preview.N prerelease, iterating the preview and patch numbers toward 1.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 ids

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.

Only the package id moves. Neither project declared a PackageId before, so both inherited their assembly name; each now sets its own. 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 — a project reference packs as a dependency on OpenCodeAI.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.

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
Blind-Striker force-pushed the build/package-id-opencodeai branch from b711528 to 5a341b9 Compare September 8, 2026 19:00
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.
@Blind-Striker
Blind-Striker merged commit 2fd13bb into master Sep 8, 2026
4 checks passed
@Blind-Striker
Blind-Striker deleted the build/package-id-opencodeai branch September 14, 2026 12:55
Sign up for free to 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