Skip to content
27 changes: 27 additions & 0 deletions packages/opencode/test/script/version.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { describe, expect, test } from "bun:test"
import { readFileSync } from "fs"
import { join } from "path"

describe("build script version format", () => {
const scriptPath = join(
__dirname,
"../../../script/src/index.ts",
)

test("script must contain integration branch regex pattern", () => {
const content = readFileSync(scriptPath, "utf-8")
expect(content).toContain('/^integration\\/(\\d{4}-\\d{2}-\\d{2}-\\d{2}-\\d{2})$/')
})

test("script must check for integration match and return short version", () => {
const content = readFileSync(scriptPath, "utf-8")
expect(content).toContain('const integrationMatch = CHANNEL.match')
expect(content).toContain('if (integrationMatch)')
expect(content).toContain('return integrationMatch[1]')
})

test("script must fall back to old preview format for non-integration branches", () => {
const content = readFileSync(scriptPath, "utf-8")
expect(content).toContain('0.0.0-${CHANNEL}')
})
})
10 changes: 9 additions & 1 deletion packages/script/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,15 @@ const IS_PREVIEW = CHANNEL !== "latest"

const VERSION = await (async () => {
if (env.OPENCODE_VERSION) return env.OPENCODE_VERSION
if (IS_PREVIEW) return `0.0.0-${CHANNEL}-${new Date().toISOString().slice(0, 16).replace(/[-:T]/g, "")}`
if (IS_PREVIEW) {
// Check if we're on an integration branch and extract the timestamp
const integrationMatch = CHANNEL.match(/^integration\/(\d{4}-\d{2}-\d{2}-\d{2}-\d{2})$/)
if (integrationMatch) {
return integrationMatch[1] // Return just the timestamp (e.g., "2026-03-08-21-02")
}
// Otherwise use the old preview format for other branches
return `0.0.0-${CHANNEL}-${new Date().toISOString().slice(0, 16).replace(/[-:T]/g, "")}`
}
const version = await fetch("https://registry.npmjs.org/opencode-ai/latest")
.then((res) => {
if (!res.ok) throw new Error(res.statusText)
Expand Down