Files
openwork/apps/orchestrator/scripts/publish-npm.mjs
Omar McAdam db10a7b5ba build: centralize the pinned opencode version (#1075)
Keep OpenCode version selection predictable by reading a single repo-wide constant and packaging that pin into orchestrator builds. Remove env and latest-release fallbacks so desktop, workers, snapshots, and CI stay aligned.

Co-authored-by: Omar McAdam <omar@OpenWork-Studio.localdomain>
2026-03-20 12:30:24 -07:00

140 lines
4.3 KiB
JavaScript
Executable File

#!/usr/bin/env node
import { spawnSync } from "node:child_process"
import { existsSync } from "node:fs"
import { chmodSync, mkdirSync, readFileSync, rmSync, writeFileSync, copyFileSync } from "node:fs"
import { basename, dirname, join, resolve } from "node:path"
import { fileURLToPath } from "node:url"
const root = resolve(fileURLToPath(new URL("..", import.meta.url)))
const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"))
const version = String(pkg.version || "").trim()
if (!version) {
throw new Error("openwork-orchestrator version missing in apps/orchestrator/package.json")
}
const outroot = join(root, "dist", "npm")
rmSync(outroot, { recursive: true, force: true })
mkdirSync(outroot, { recursive: true })
const constantsSrc = resolve(root, "..", "..", "constants.json")
if (!existsSync(constantsSrc)) {
throw new Error(`Missing constants.json at ${constantsSrc}`)
}
const tag = String(process.env.NPM_TAG || "").trim()
const dry = String(process.env.DRY_RUN || "").trim() === "1"
const targets = [
{ id: "darwin-arm64", bun: "bun-darwin-arm64", os: "darwin", cpu: "arm64" },
{ id: "darwin-x64", bun: "bun-darwin-x64", os: "darwin", cpu: "x64" },
{ id: "linux-x64", bun: "bun-linux-x64", os: "linux", cpu: "x64" },
{ id: "linux-arm64", bun: "bun-linux-arm64", os: "linux", cpu: "arm64" },
{ id: "windows-x64", bun: "bun-windows-x64", os: "win32", cpu: "x64" },
]
function run(cmd, args, cwd) {
const res = spawnSync(cmd, args, { cwd, stdio: "inherit" })
if (res.status !== 0) {
process.exit(res.status ?? 1)
}
}
function writeJson(filepath, data) {
writeFileSync(filepath, `${JSON.stringify(data, null, 2)}\n`, "utf8")
}
function platformPkgName(target) {
const platform = target.id.split("-")[0]
const arch = target.id.split("-").slice(1).join("-")
return `openwork-orchestrator-${platform}-${arch}`
}
const optionalDependencies = {}
const published = []
for (const target of targets) {
const name = platformPkgName(target)
optionalDependencies[name] = version
const ext = target.id.startsWith("windows") ? ".exe" : ""
const src = join(root, "dist", "bin", `openwork-${target.bun}${ext}`)
if (!existsSync(src)) {
throw new Error(`Missing openwork binary at ${src}. Run: pnpm --filter openwork-orchestrator build:bin:all`)
}
const dir = join(outroot, name)
const bindir = join(dir, "bin")
mkdirSync(bindir, { recursive: true })
const dest = join(bindir, `openwork${ext}`)
copyFileSync(src, dest)
if (!target.id.startsWith("windows")) {
chmodSync(dest, 0o755)
}
writeJson(join(dir, "package.json"), {
name,
version,
description: "Platform binary for openwork-orchestrator",
license: "MIT",
os: [target.os],
cpu: [target.cpu],
bin: {
openwork: `./bin/openwork${ext}`,
"openwork-orchestrator": `./bin/openwork${ext}`,
},
files: ["bin"],
})
published.push({ name, dir })
}
const meta = join(outroot, "openwork-orchestrator")
mkdirSync(join(meta, "bin"), { recursive: true })
const wrapperSrc = join(root, "bin", "openwork")
if (!existsSync(wrapperSrc)) {
throw new Error(`Missing wrapper at ${wrapperSrc}`)
}
copyFileSync(wrapperSrc, join(meta, "bin", "openwork"))
chmodSync(join(meta, "bin", "openwork"), 0o755)
const postinstallSrc = join(root, "scripts", "postinstall.mjs")
if (!existsSync(postinstallSrc)) {
throw new Error(`Missing postinstall at ${postinstallSrc}`)
}
copyFileSync(postinstallSrc, join(meta, basename(postinstallSrc)))
copyFileSync(constantsSrc, join(meta, "constants.json"))
writeJson(join(meta, "package.json"), {
name: "openwork-orchestrator",
version,
description: "OpenWork host orchestrator for opencode + OpenWork server + opencode-router",
license: "MIT",
bin: {
openwork: "./bin/openwork",
"openwork-orchestrator": "./bin/openwork",
},
scripts: {
postinstall: "bun ./postinstall.mjs || node ./postinstall.mjs",
},
optionalDependencies,
files: ["bin", "postinstall.mjs", "constants.json"],
})
published.push({ name: "openwork-orchestrator", dir: meta })
for (const item of published) {
if (dry) {
console.log(`Packing (dry run) ${item.name} from ${item.dir}`)
run("npm", ["pack"], item.dir)
continue
}
const args = ["publish", "--access", "public"]
if (tag) args.push("--tag", tag)
console.log(`Publishing ${item.name} from ${item.dir}`)
run("npm", args, item.dir)
}