diff --git a/packages/release-bot/src/apply-plan.ts b/packages/release-bot/src/apply-plan.ts index 505023a..d6bdb96 100644 --- a/packages/release-bot/src/apply-plan.ts +++ b/packages/release-bot/src/apply-plan.ts @@ -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, +): Promise { + 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[] = [] diff --git a/packages/release-bot/tests/apply-plan.test.ts b/packages/release-bot/tests/apply-plan.test.ts index d855c38..b94449b 100644 --- a/packages/release-bot/tests/apply-plan.test.ts +++ b/packages/release-bot/tests/apply-plan.test.ts @@ -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 { 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',