fix(release-bot): sync otel version constant on release (#522)

The release plan bumps packages/otel/package.json but not the PACKAGE_VERSION constant in packages/otel/src/version.ts, so the version-sync guard test fails validation after any otel bump. Sync the constant alongside the manifest and fail closed if it is missing.
This commit is contained in:
Jack Chen authored and GitHub committed 2026-08-16 14:56:55 +08:00
1 parent 3bd5ad17f3
commit 75ca42984f
2 files changed
+41

No files matched your search

+25
View File
@@ -9,11 +9,14 @@ const TEMPLATE_MANIFESTS = [
'packages/create-oma-app/templates/security/package.json',
] as const
const OTEL_VERSION_CONSTANT_PATH = 'packages/otel/src/version.ts'
export const RELEASE_PLAN_PATHS = [
'CHANGELOG.md',
'package-lock.json',
'packages/core/package.json',
'packages/otel/package.json',
OTEL_VERSION_CONSTANT_PATH,
'packages/create-oma-app/package.json',
...TEMPLATE_MANIFESTS,
] as const
@@ -50,6 +53,7 @@ export async function applyReleasePlan(
manifest => { manifest.version = plan.nextVersions.otel },
changed,
)
await updateOtelVersionConstant(repoRoot, plan.nextVersions.otel, changed)
}
for (const path of TEMPLATE_MANIFESTS) {
@@ -187,6 +191,27 @@ async function updateManifest(
}
}
async function updateOtelVersionConstant(
repoRoot: string,
nextVersion: string,
changed: Set<string>,
): Promise<void> {
if (!/^\d+\.\d+\.\d+$/.test(nextVersion)) {
throw new Error(`Refusing to write an invalid otel version constant: "${nextVersion}".`)
}
const absolute = join(repoRoot, OTEL_VERSION_CONSTANT_PATH)
const oldContent = await readFile(absolute, 'utf8')
const newContent = oldContent.replace(
/export const PACKAGE_VERSION = '[^']+'/,
`export const PACKAGE_VERSION = '${nextVersion}'`,
)
if (newContent === oldContent) {
throw new Error(`${OTEL_VERSION_CONSTANT_PATH} does not declare a PACKAGE_VERSION constant.`)
}
await writeFile(absolute, newContent)
changed.add(OTEL_VERSION_CONSTANT_PATH)
}
function wrapBullet(text: string, width = 80): string {
const words = text.trim().split(/\s+/)
const lines: string[] = []
@@ -77,6 +77,21 @@ describe('release plan materialization', () => {
expect(Math.max(...changelog.split('\n').map(line => line.length))).toBeLessThanOrEqual(80)
})
it('bumps the otel version constant alongside package.json when otel releases', async () => {
const root = await createFixture()
const otelPlan: ReleasePlan = {
...plan,
nextVersions: { ...plan.nextVersions, otel: '0.1.2' },
bumps: { ...plan.bumps, otel: 'patch' },
}
const changed = await applyReleasePlan(root, otelPlan)
expect(changed).toContain('packages/otel/src/version.ts')
expect(await version(root, 'packages/otel/package.json')).toBe('0.1.2')
const versionTs = await readFile(join(root, 'packages/otel/src/version.ts'), 'utf8')
expect(versionTs).toContain("export const PACKAGE_VERSION = '0.1.2'")
})
it('unwraps hard-wrapped changelog prose for GitHub Release rendering', () => {
const changelog = insertReleaseEntry(
'# Changelog\n\n## Unreleased\n\n## 1.14.0 - 2026-08-01\n\nOld.\n',
@@ -100,6 +115,7 @@ async function createFixture(): Promise<string> {
temporaryRoots.push(root)
await writeJson(root, 'packages/core/package.json', { name: '@open-multi-agent/core', version: '1.14.0' })
await writeJson(root, 'packages/otel/package.json', { name: '@open-multi-agent/otel', version: '0.1.1' })
await writeText(root, 'packages/otel/src/version.ts', "export const PACKAGE_VERSION = '0.1.1'\n")
await writeJson(root, 'packages/create-oma-app/package.json', { name: 'create-oma-app', version: '0.7.0' })
for (const path of [
'packages/create-oma-app/template/package.json',