fix(auto-update): implement channel-based version fetching

Add support for npm dist-tag channels (@beta, @next, @canary) in auto-update mechanism. Users pinned to oh-my-opencode@beta now correctly fetch and compare against beta channel instead of stable latest.

- Add extractChannel() to detect channel from version string
- Modify getLatestVersion() to accept channel parameter
- Update auto-update flow to use channel-aware fetching
- Add comprehensive tests for channel detection and fetching
- Resolves #687

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
sisyphus-dev-ai
2026-01-11 09:56:09 +00:00
parent f27e93bcc8
commit 612e9b3e03
4 changed files with 161 additions and 29 deletions
+102 -1
View File
@@ -1,5 +1,5 @@
import { describe, test, expect } from "bun:test"
import { isPrereleaseVersion, isDistTag, isPrereleaseOrDistTag } from "./index"
import { isPrereleaseVersion, isDistTag, isPrereleaseOrDistTag, extractChannel } from "./index"
describe("auto-update-checker", () => {
describe("isPrereleaseVersion", () => {
@@ -150,4 +150,105 @@ describe("auto-update-checker", () => {
expect(result).toBe(false)
})
})
describe("extractChannel", () => {
test("extracts beta from dist-tag", () => {
// #given beta dist-tag
const version = "beta"
// #when extracting channel
const result = extractChannel(version)
// #then returns beta
expect(result).toBe("beta")
})
test("extracts next from dist-tag", () => {
// #given next dist-tag
const version = "next"
// #when extracting channel
const result = extractChannel(version)
// #then returns next
expect(result).toBe("next")
})
test("extracts canary from dist-tag", () => {
// #given canary dist-tag
const version = "canary"
// #when extracting channel
const result = extractChannel(version)
// #then returns canary
expect(result).toBe("canary")
})
test("extracts beta from prerelease version", () => {
// #given beta prerelease version
const version = "3.0.0-beta.1"
// #when extracting channel
const result = extractChannel(version)
// #then returns beta
expect(result).toBe("beta")
})
test("extracts alpha from prerelease version", () => {
// #given alpha prerelease version
const version = "1.0.0-alpha"
// #when extracting channel
const result = extractChannel(version)
// #then returns alpha
expect(result).toBe("alpha")
})
test("extracts rc from prerelease version", () => {
// #given rc prerelease version
const version = "2.0.0-rc.1"
// #when extracting channel
const result = extractChannel(version)
// #then returns rc
expect(result).toBe("rc")
})
test("returns latest for stable version", () => {
// #given stable version
const version = "2.14.0"
// #when extracting channel
const result = extractChannel(version)
// #then returns latest
expect(result).toBe("latest")
})
test("returns latest for null", () => {
// #given null version
const version = null
// #when extracting channel
const result = extractChannel(version)
// #then returns latest
expect(result).toBe("latest")
})
test("handles complex prerelease identifiers", () => {
// #given complex prerelease
const version = "3.0.0-beta.1.experimental"
// #when extracting channel
const result = extractChannel(version)
// #then returns beta
expect(result).toBe("beta")
})
})
})