agent-orchestrator/frontend/scripts/nightly-version.mjs

37 lines
1.7 KiB
JavaScript

// Pure version math shared by the nightly CI workflow. Kept dependency-free
// ESM so `node scripts/nightly-version.mjs` runs it directly in CI and vitest
// unit-tests it. The app does NOT compute versions; it only reads its injected
// app.getVersion(), so this lives in scripts/, not src/.
const SEMVER = /^(\d+)\.(\d+)\.(\d+)$/;
// computeNightlyVersion builds X.Y.(Z+1)-nightly.<YYYYMMDDHHMM>+<shortSha>.
// Next-patch base keeps a nightly ahead of the last stable and behind the next.
// The fixed-width UTC timestamp makes prerelease ids order by build time; the
// sha is semver build metadata (ignored for ordering, kept for traceability).
export function computeNightlyVersion(latestStableTag, now, shortSha) {
const bare = String(latestStableTag).replace(/^(desktop-)?v/, "");
const m = SEMVER.exec(bare);
if (!m) {
throw new Error(`nightly-version: base tag is not X.Y.Z: ${latestStableTag}`);
}
const [major, minor, patch] = [Number(m[1]), Number(m[2]), Number(m[3])];
const ts =
String(now.getUTCFullYear()) +
String(now.getUTCMonth() + 1).padStart(2, "0") +
String(now.getUTCDate()).padStart(2, "0") +
String(now.getUTCHours()).padStart(2, "0") +
String(now.getUTCMinutes()).padStart(2, "0");
return `${major}.${minor}.${patch + 1}-nightly.${ts}+${shortSha}`;
}
// CLI entry for CI: node scripts/nightly-version.mjs <latestStableTag> <shortSha>
if (import.meta.url === `file://${process.argv[1]}`) {
const [, , latestStableTag, shortSha] = process.argv;
if (!latestStableTag || !shortSha) {
process.stderr.write("usage: node nightly-version.mjs <latestStableTag> <shortSha>\n");
process.exit(2);
}
process.stdout.write(computeNightlyVersion(latestStableTag, new Date(), shortSha));
}