Skip to content

fix(install): scan releases for CLI asset instead of blindly using latest tag#19478

Closed
johnnykang101 wants to merge 171 commits intoanomalyco:devfrom
CobuilderLabs:fix/installer-missing-cli-asset
Closed

fix(install): scan releases for CLI asset instead of blindly using latest tag#19478
johnnykang101 wants to merge 171 commits intoanomalyco:devfrom
CobuilderLabs:fix/installer-missing-cli-asset

Conversation

@johnnykang101
Copy link
Copy Markdown

Summary

  • cb-v0.19.0 was tagged before CLI build jobs completed, leaving only Electron assets — the installer picked it as "latest" and 404'd on the missing CLI binary
  • Fix: walk recent releases via GitHub API and pick the first tag that actually has the required platform asset (up to 3 pages / 30 releases)
  • Prevents silent 404 failures on any future partial/incomplete release

Test plan

  • Run curl -fsSL https://raw.githubusercontent.com/CobuilderLabs/opencode/main/install.sh | bash on linux-x64 — should resolve to cb-v0.18.5 (or whichever has the asset) and install successfully
  • Verify installer still works normally when latest release IS complete
  • Verify error message fires if no release in first 30 has the asset

🤖 Generated with Claude Code

johnnykang101 and others added 30 commits March 26, 2026 09:43
- Add 9Router as a named ProviderID in schema.ts (9router)
- Add 9Router to popularProviders list in use-providers.ts
- New DialogConnect9Router: pre-filled form (baseURL + JWT token)
  with Claude Sonnet/Opus/Haiku defaults via openai-compatible SDK
- Update DialogSelectProvider: 9Router appears as a static "popular"
  entry with a "Local" tag, routes to the dedicated connect dialog
- New DialogOnboarding: welcome wizard shown on first launch when no
  providers are connected; leads directly to provider selection
- OnboardingCheck in RouterRoot: detects zero connected providers on
  mount and shows the onboarding dialog (localStorage-gated)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove API key field entirely. 9Router is a local container that
doesn't require auth — connection is just a baseURL. A dummy apiKey
is set in options only to satisfy the openai-compatible SDK constructor.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fetch /v1/models from the running 9Router container, show a
checklist of available models (all selected by default), and
register only the ones the user picks. Includes select/deselect all
toggle and a count summary.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Single button now tests the connection and fetches models in one step.
On success: green dot + "Connected — N models available" + checklist.
On failure: red dot + inline error message.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add useGlobalSync import to app.tsx (used in OnboardingCheck)
- Explicitly type all new Set() calls as Set<string> to satisfy
  TypeScript inference in dialog-connect-9router.tsx

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Interactive terminal wizard (opencode onboard) for first-run setup.
Supports 9Router (URL + model picker) and API key providers
(Anthropic, OpenAI, OpenRouter, Google).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
If enabled_providers exists in config, 9router was being filtered out.
Now onboard adds it to the list automatically.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CI: typecheck on every PR targeting main
- CD: auto-release on merge to main with semver bump and release notes
  - feat commits → minor bump
  - fix/chore → patch bump
  - breaking change → major bump

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Syncs anomalyco/opencode dev → our dev branch every Monday at 6am UTC.
- Clean merge: auto-pushes to dev
- Conflicts: opens a PR for manual resolution

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…isions

Tags now follow cb-vX.Y.Z pattern (e.g. cb-v0.1.0) so they never
conflict with upstream anomalyco/opencode tags (v0.0.45, v1.4.0, etc).
Release titles display as 'CoBuilder vX.Y.Z' for clarity.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CLI command renamed from opencode → cobuilder
- package.json version reset to 0.1.1 (CoBuilder versioning)
- build.ts: output binary named cobuilder, uploads to cb-vX.Y.Z tags
- cd.yml: builds platform binaries (linux/darwin/windows x64/arm64)
  and attaches them to each release
- install.sh: one-line curl install with platform detection,
  PATH setup, and automatic onboarding

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces --generate-notes (PR-only) with categorized commit log.
Notes are grouped into Features / Bug Fixes / Maintenance sections
and link Full Changelog between our own cb-v* tags only.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Strip conventional commit prefixes from user-visible notes
- Capitalize entries automatically
- Sections: Added / Fixed / Changed / Security / Breaking Changes
- Include release date in header
- Full Changelog link scoped to cb-v* tags only

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Security layers added (TypeScript/Bun adaptations):
- SSRF protection: blocks cloud metadata, private IPs, localhost by default
- Prompt injection scanner: detects override/jailbreak/exfil patterns
- Path traversal prevention: canonicalize + base-escape detection
- Token bucket rate limiter: per-key cost-aware limiting
- Merkle-chained audit log: tamper-evident append-only event log
- HTTP security headers: CSP, HSTS, X-Frame, X-Content-Type

CI hardened with:
- Lint job
- Dependency audit (bun audit)
- Secret scanning (TruffleHog --only-verified)
- SAST (CodeQL for TypeScript)
- Unit tests (bun test) with security module coverage

Inspired by OpenFang's 16-layer defense-in-depth architecture.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
build.ts uses 'gh release upload cb-vX.Y.Z' which requires the release
to already exist. Previously we created it after the build — reversed order.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Persist active session to checkpoint.json on each user message.
On next launch, detect interrupted sessions and offer to resume.
Checkpoint clears on clean exit (code 0) so it only exists after crashes.

Inspired by Claude Code's auto-dream session continuity pattern.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Script.version fetches from opencode-ai npm registry (unavailable for
our fork) and falls back to '0.0.0-main-timestamp'. This caused
'gh release upload cb-v0.0.0-main-...' to target a non-existent release.

Now pass COBUILDER_RELEASE_TAG=cb-vX.Y.Z from CD workflow so build.ts
uploads to the correct release tag regardless of Script.version.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Inspired by Claude Code's auto-dream memory consolidation:

- SQLite FTS5 memory store: per-session summaries indexed for search
- Deterministic summarization: extracts user requests + tool actions
- Memory injection: top 3-5 relevant past sessions prepended to system prompt
- Lifecycle hook: auto-summarize when session is archived/closed
- Project-scoped: memories are per working directory

Memory hierarchy:
  Working memory (context window)
    → Session memory (SQLite messages, persisted)
      → Long-term memory (FTS5-searchable summaries, injected at next start)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ll guide

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…lanations

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… avatar style

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the >_ terminal box with the pixel-art Jindo mascot, clipped
to the same rounded square with a gradient border that ties into the
CoBuilder wordmark. README updated to use a single unified logo image.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
johnnykang101 and others added 20 commits March 27, 2026 15:41
- Onboard: single-model select via prompts.select()
- Onboard: restore security modules multiselect step
- Onboard: restore MCP recommended tools step + recommended.ts
- Onboard: fix outro text 'Run cobuilder to start building'
- Onboard: fix placeholder 'What do you want to build?'
- Config: restore workflow.paths schema key + injection code
- Installation: fix update check URL → CobuilderLabs/opencode
- Flag: restore COBUILDER_AUTOPILOT dynamic getter
- Index: restore --autopilot flag
- Permission: restore autopilot auto-approve logic
- TUI: restore Autopilot badge in prompt mode line
- TUI: block agent cycle (Build/Plan switch) in autopilot mode

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
A.1 - Ambient title bar progress: document.title shows ⟳ prefix while
  generation is active, resets to plain title on cleanup

A.2 - Jump-to-active scroll button: scroll button changes from ↓ to
  ↑ active while generation is running, scrolling to the active turn
  element instead of scrolling to absolute bottom

A.3 - Streaming tok/s indicator: shows ~340 tok/s below the thinking
  shimmer while output tokens are arriving, hidden at rest
The tok/s streaming effect references turnUsage() but the memo was
never declared in this branch. Ported from feat/ux-parity-claude-code.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- .cobuilder/patches/: 3 patches capturing all CoBuilder-specific features
- .cobuilder/reapply-patches.sh: script to reapply patches after upstream sync
- sync-upstream.yml: reapply patches after merge, open PR on patch conflict

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace all "opencode/OpenCode" identity references with "CoBuilder"
  in all 7 system prompt files (default, anthropic, beast, codex, gpt,
  gemini, trinity) — also update feedback URLs to CobuilderLabs/opencode
- Fix TUI tool output truncation: show only first primitive value,
  capped at 60 chars, instead of all key=value pairs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Includes new patch 0127 for system prompt rebranding and TUI tool
output truncation fix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- copilot-gpt-5.txt: "opencode" → "CoBuilder"
- installation/index.ts: remove anomalyco/tap brew references, check
  for cobuilder formula instead; tap path updated to CobuilderLabs/tap

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Zen (opencode provider): 19 models from models.dev, MiniMax M2.5 Free
  pre-selected as default, free models work without API key
- GitHub Copilot: 21 models from models.dev, directs user to
  `cobuilder providers login` for OAuth auth after model selection

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…entry

- Zen/Copilot setup now adds their provider ID to enabled_providers so
  the selected model isn't filtered out when CoBuilder starts
- 9Router setup now writes auth.json entry so /connect shows it as
  already authenticated instead of prompting for an API key

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The login/connect flow was filtered by enabled_providers, hiding
providers the user hadn't enabled yet. Now shows all non-disabled
providers so users can connect to any of the 75+ supported providers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The provider.list API endpoint was filtering by enabled_providers,
which caused /connect to only show already-enabled providers. Now
shows all non-disabled providers so GitHub Copilot and others appear.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When selecting 9Router in the /connect provider dialog, show a URL
input pre-populated with the default baseURL (http://localhost:20123/v1)
instead of the generic API key prompt. On confirm, updates both the
provider config baseURL and the auth entry.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Change "opencode -s <id>" → "cobuilder -s <id>" in session exit screen
- Match 9Router by name as well as id in /connect dialog to ensure URL
  prompt is shown regardless of how the provider ID is stored at runtime

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replicate the onboarding flow inside the /connect TUI dialog:
- Fetch models from the 9Router URL on confirm
- Show a DialogSelect with all fetched models
- Save URL + models + selected model to config then close

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixes TS2353 typecheck errors — the SDK options type uses 'config'
not 'body' as the field name for the PATCH /config request body.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
`[data-component="file"]` uses `content-visibility: auto` which causes
Windows Chrome to report off-screen elements as hidden, failing
Playwright's toBeVisible() checks. Add scrollIntoViewIfNeeded() before
visibility assertions to force rendering.

Also increase file-tree test timeout to 120s and add explicit wait on
the toggle button to handle slower Windows CI runners.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
fix(e2e): resolve Windows CI failures caused by content-visibility: auto
…test tag

Releases like cb-v0.19.0 may be tagged before all build jobs complete,
leaving only Electron assets and no CLI binary. The installer now walks
recent releases via the GitHub API and picks the first one that actually
has the required platform asset, preventing silent 404 failures.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions github-actions bot added needs:issue needs:compliance This means the issue will auto-close after 2 hours. labels Mar 28, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Thanks for your contribution!

This PR doesn't have a linked issue. All PRs must reference an existing issue.

Please:

  1. Open an issue describing the bug/feature (if one doesn't exist)
  2. Add Fixes #<number> or Closes #<number> to this PR description

See CONTRIBUTING.md for details.

@github-actions
Copy link
Copy Markdown
Contributor

This PR doesn't fully meet our contributing guidelines and PR template.

What needs to be fixed:

  • PR description is missing required template sections. Please use the PR template.

Please edit this PR description to address the above within 2 hours, or it will be automatically closed.

If you believe this was flagged incorrectly, please let a maintainer know.

CoBuilder CEO and others added 2 commits March 27, 2026 18:24
…ter all jobs succeed

Root cause of cb-v0.19.0 breakage: release was published immediately on tag
creation, before build jobs completed. Any build failure left a "hollow"
release with missing assets.

Three-part permanent fix:
1. Create release as --draft (not published)
2. Restore missing CLI build job (build-cli) — builds all platform binaries
   via `bun run build` in packages/opencode and uploads to the draft release
3. Add publish job that only runs after ALL jobs succeed (build-cli +
   desktop-linux + desktop-windows), converting the draft to --latest

A failed build job now leaves the release as an unpublished draft instead
of a broken published release that breaks the installer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add --disable-print-preview to chromium args to prevent Control+P
  from triggering browser print dialog instead of palette
- Add --no-sandbox and --disable-dev-shm-usage for CI stability
- Increase global test timeout to 90s and expect timeout to 20s in CI
- Increase waitTerminalReady/waitTerminalFocusIdle defaults to 30s
- Add test.setTimeout(180s) to workspace creation and session model
  restore tests that contain nested 60s polls
- Add test.setTimeout(120s) to non-git workspace test

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

This pull request has been automatically closed because it was not updated to meet our contributing guidelines within the 2-hour window.

Feel free to open a new pull request that follows our guidelines.

@github-actions github-actions bot removed the needs:compliance This means the issue will auto-close after 2 hours. label Mar 28, 2026
@github-actions github-actions bot closed this Mar 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant