@kb-labs/release-manager-cli 2.119.0 → 2.119.1-canary.b53bbee1d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/cli/commands/build.js.map +1 -1
  2. package/dist/cli/commands/changelog.js.map +1 -1
  3. package/dist/cli/commands/checks.js.map +1 -1
  4. package/dist/cli/commands/deliver.js.map +1 -1
  5. package/dist/cli/commands/git.d.ts +2 -0
  6. package/dist/cli/commands/git.js +11 -4
  7. package/dist/cli/commands/git.js.map +1 -1
  8. package/dist/cli/commands/pack.js.map +1 -1
  9. package/dist/cli/commands/plan.js.map +1 -1
  10. package/dist/cli/commands/promote.js.map +1 -1
  11. package/dist/cli/commands/publish.js.map +1 -1
  12. package/dist/cli/commands/report.js.map +1 -1
  13. package/dist/cli/commands/rollback.js.map +1 -1
  14. package/dist/cli/commands/run.js.map +1 -1
  15. package/dist/cli/commands/stage-plan.js.map +1 -1
  16. package/dist/cli/commands/stage.js.map +1 -1
  17. package/dist/cli/commands/status.js.map +1 -1
  18. package/dist/cli/commands/verify-clean-install.js.map +1 -1
  19. package/dist/cli/commands/verify.js.map +1 -1
  20. package/dist/cli/commands/version.d.ts +2 -0
  21. package/dist/cli/commands/version.js +11 -4
  22. package/dist/cli/commands/version.js.map +1 -1
  23. package/dist/contracts/release.schema.js.map +1 -1
  24. package/dist/index.js +13 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/manifest.js +13 -0
  27. package/dist/manifest.js.map +1 -1
  28. package/dist/manifest.json +1309 -0
  29. package/dist/rest/handlers/build-handler.js.map +1 -1
  30. package/dist/rest/handlers/changelog-generate-handler.js.map +1 -1
  31. package/dist/rest/handlers/changelog-handler.js.map +1 -1
  32. package/dist/rest/handlers/changelog-save-handler.js.map +1 -1
  33. package/dist/rest/handlers/checklist-handler.js.map +1 -1
  34. package/dist/rest/handlers/generate-handler.d.ts +2 -2
  35. package/dist/rest/handlers/generate-handler.js.map +1 -1
  36. package/dist/rest/handlers/get-checks-handler.js.map +1 -1
  37. package/dist/rest/handlers/git-timeline-handler.js.map +1 -1
  38. package/dist/rest/handlers/history-changelog-handler.js.map +1 -1
  39. package/dist/rest/handlers/history-handler.js.map +1 -1
  40. package/dist/rest/handlers/history-plan-handler.d.ts +1 -1
  41. package/dist/rest/handlers/history-plan-handler.js.map +1 -1
  42. package/dist/rest/handlers/history-report-handler.d.ts +1 -1
  43. package/dist/rest/handlers/history-report-handler.js.map +1 -1
  44. package/dist/rest/handlers/plan-handler.d.ts +1 -1
  45. package/dist/rest/handlers/plan-handler.js.map +1 -1
  46. package/dist/rest/handlers/preview-handler.js.map +1 -1
  47. package/dist/rest/handlers/report-handler.d.ts +1 -1
  48. package/dist/rest/handlers/report-handler.js.map +1 -1
  49. package/dist/rest/handlers/reset-handler.js.map +1 -1
  50. package/dist/rest/handlers/run-checks-handler.js.map +1 -1
  51. package/dist/rest/handlers/run-handler.d.ts +1 -1
  52. package/dist/rest/handlers/run-handler.js.map +1 -1
  53. package/dist/rest/handlers/scopes-handler.js.map +1 -1
  54. package/dist/rest/handlers/status-handler.js.map +1 -1
  55. package/dist/setup/handler.js.map +1 -1
  56. package/dist/widgets/117.js +32 -0
  57. package/dist/widgets/165.js +1 -0
  58. package/dist/widgets/326.js +1 -0
  59. package/dist/widgets/370.js +1 -0
  60. package/dist/widgets/405.js +1 -0
  61. package/dist/widgets/46.js +445 -0
  62. package/dist/widgets/50.js +1 -0
  63. package/dist/widgets/546.js +1 -0
  64. package/dist/widgets/648.js +1 -0
  65. package/dist/widgets/669.js +1 -0
  66. package/dist/widgets/707.js +1 -0
  67. package/dist/widgets/775.js +1 -0
  68. package/dist/widgets/78.js +1 -0
  69. package/dist/widgets/832.js +96 -0
  70. package/dist/widgets/875.js +25 -0
  71. package/dist/widgets/945.js +1 -0
  72. package/dist/widgets/968.js +9 -0
  73. package/dist/widgets/__federation_expose_ReleasePage.js +1 -0
  74. package/dist/widgets/mf-manifest.json +229 -0
  75. package/dist/widgets/mf-stats.json +256 -0
  76. package/dist/widgets/remoteEntry.js +7 -0
  77. package/dist/workflows/templates/dry-run.yaml +37 -0
  78. package/dist/workflows/templates/full-release.yaml +58 -0
  79. package/dist/workflows/templates/hotfix.yaml +40 -0
  80. package/package.json +8 -8
@@ -92,13 +92,18 @@ var version_default = defineCommand({
92
92
  const cwd = ctx.cwd || process.cwd();
93
93
  const repoRoot = await findRepoRoot(cwd);
94
94
  const fileConfig = await useConfig();
95
- const config = { ...fileConfig, ...flags.bump && { bump: flags.bump } };
95
+ const config = {
96
+ ...fileConfig,
97
+ ...flags.bump && { bump: flags.bump },
98
+ ...flags.channel && { channel: flags.channel }
99
+ };
96
100
  const plan = await planRelease({
97
101
  cwd: repoRoot,
98
102
  config,
99
103
  scope: flags.scope,
100
104
  flow: flags.flow,
101
- bumpOverride: flags.bump
105
+ bumpOverride: flags.bump,
106
+ channel: config.channel
102
107
  });
103
108
  return {
104
109
  summary: `Bump versions for ${plan.packages.length} package(s)`,
@@ -116,7 +121,8 @@ var version_default = defineCommand({
116
121
  const fileConfig = await useConfig();
117
122
  const config = {
118
123
  ...fileConfig,
119
- ...flags.bump && { bump: flags.bump }
124
+ ...flags.bump && { bump: flags.bump },
125
+ ...flags.channel && { channel: flags.channel }
120
126
  };
121
127
  const planLoader = useLoader("Planning version bumps...");
122
128
  planLoader.start();
@@ -125,7 +131,8 @@ var version_default = defineCommand({
125
131
  config,
126
132
  scope: flags.scope,
127
133
  flow: flags.flow,
128
- bumpOverride: flags.bump});
134
+ bumpOverride: flags.bump,
135
+ channel: config.channel});
129
136
  ctx.platform?.logger?.debug?.("Release plan resolved", { source, reason });
130
137
  planLoader.succeed(
131
138
  `${source === "artifact" ? "Loaded" : "Planned"} ${plan.packages.length} package(s)`
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/utils.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/resolve-plan.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/cli/commands/version.ts"],"names":["planRelease"],"mappings":"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","file":"version.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Plan resolution shared by the atomic release steps that must act on the\n * SAME plan (`release:version` → `release:git`).\n *\n * Why this exists: each step used to call planRelease() independently and\n * hope the results matched. They don't have to — planning is a function of\n * disk state, and the step in between mutates exactly that state. A plan\n * re-derived after `release:version` sees the bumped versions as the new\n * baseline and bumps again, so the tag/commit message end up one version\n * ahead of the package.json files actually being committed.\n *\n * The plan written by `release:plan` is the single source of truth for a\n * pipeline run. It is only reused when it provably describes the current\n * state of the working tree, so a stale artifact (plan.json is committed to\n * the repo, so one is always present) can never be adopted silently.\n */\n\nimport { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport {\n planRelease,\n type ReleasePlan,\n type ReleaseConfig,\n type VersionBump,\n type ReleaseChannel,\n} from '@kb-labs/release-manager-core';\nimport { scopeToDir } from './utils';\n\n/**\n * Which side of the version bump the caller sits on — determines which field\n * of the plan the on-disk package.json versions are expected to match.\n */\nexport type PlanStage =\n /** `release:version`: bump not applied yet, disk should still be at currentVersion. */\n | 'pre-bump'\n /** `release:git`: bump already applied, disk should be at nextVersion. */\n | 'post-bump';\n\nexport interface ResolvePlanOptions {\n repoRoot: string;\n config: ReleaseConfig;\n scope?: string;\n flow?: string;\n bumpOverride?: VersionBump;\n channel?: ReleaseChannel;\n stage: PlanStage;\n}\n\nexport interface ResolvedPlan {\n plan: ReleasePlan;\n /** 'artifact' — reused the plan from `release:plan`; 'computed' — planned fresh. */\n source: 'artifact' | 'computed';\n /** Why the artifact was rejected, when source is 'computed' and one existed. */\n reason?: string;\n}\n\nexport function releasePlanPath(repoRoot: string, scope?: string): string {\n return join(repoRoot, '.kb', 'release', 'plans', scopeToDir(scope ?? 'root'), 'current', 'plan.json');\n}\n\nasync function readDiskVersion(packagePath: string): Promise<string | undefined> {\n try {\n const raw = await readFile(join(packagePath, 'package.json'), 'utf-8');\n return (JSON.parse(raw) as { version?: string }).version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Reject the persisted plan unless every package it covers is on disk at the\n * version this stage expects. That single check subsumes staleness, partial\n * runs, and out-of-band edits: any of them show up as a version mismatch.\n */\nasync function validateAgainstDisk(plan: ReleasePlan, stage: PlanStage): Promise<string | undefined> {\n const expectedField = stage === 'pre-bump' ? 'currentVersion' : 'nextVersion';\n\n for (const pkg of plan.packages) {\n const onDisk = await readDiskVersion(pkg.path);\n if (onDisk === undefined) {\n return `${pkg.name}: package.json not readable at ${pkg.path}`;\n }\n const expected = pkg[expectedField];\n if (onDisk !== expected) {\n return `${pkg.name}: expected ${expectedField} ${expected} on disk, found ${onDisk}`;\n }\n }\n\n return undefined;\n}\n\n/**\n * Load the plan produced by `release:plan` when it matches this run and the\n * working tree; otherwise plan fresh.\n */\nexport async function resolvePlan(options: ResolvePlanOptions): Promise<ResolvedPlan> {\n const { repoRoot, config, scope, flow, bumpOverride, channel, stage } = options;\n\n const computeFresh = async (reason?: string): Promise<ResolvedPlan> => ({\n plan: await planRelease({ cwd: repoRoot, config, scope, flow, bumpOverride, channel }),\n source: 'computed',\n ...(reason ? { reason } : {}),\n });\n\n let persisted: ReleasePlan;\n try {\n persisted = JSON.parse(await readFile(releasePlanPath(repoRoot, scope), 'utf-8')) as ReleasePlan;\n } catch {\n return computeFresh();\n }\n\n if (!Array.isArray(persisted.packages) || persisted.packages.length === 0) {\n return computeFresh('persisted plan has no packages');\n }\n\n // All flows share one scope-derived artifact path, so an unrelated flow's\n // plan can legitimately be sitting there. Never adopt it.\n if ((persisted.flow ?? undefined) !== (flow ?? undefined)) {\n return computeFresh(`persisted plan is for flow \"${persisted.flow ?? '<none>'}\", requested \"${flow ?? '<none>'}\"`);\n }\n if ((persisted.scope ?? undefined) !== (scope ?? undefined)) {\n return computeFresh(`persisted plan is for scope \"${persisted.scope ?? '<none>'}\", requested \"${scope ?? '<none>'}\"`);\n }\n if (channel !== undefined && persisted.channel !== channel) {\n return computeFresh(`persisted plan is for channel \"${persisted.channel}\", requested \"${channel}\"`);\n }\n\n const mismatch = await validateAgainstDisk(persisted, stage);\n if (mismatch) {\n return computeFresh(`persisted plan does not match working tree (${mismatch})`);\n }\n\n return { plan: persisted, source: 'artifact' };\n}\n","/**\n * Release version command — bump versions in package.json files.\n * Atomic step: reads plan, updates package.json versions, emits output marker for workflow.\n */\n\nimport { defineCommand, type CLIInput, type CommandResult, type PluginContextV3, useLoader, useConfig } from '@kb-labs/sdk';\nimport {\n planRelease,\n updatePackageVersions,\n type ReleaseConfig,\n type VersionBump,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { resolvePlan } from '../../shared/resolve-plan';\n\ninterface VersionFlags {\n scope?: string;\n flow?: string;\n bump?: 'patch' | 'minor' | 'major' | 'auto';\n 'dry-run'?: boolean;\n json?: boolean;\n}\n\ntype ReleaseVersionResult = CommandResult<unknown>;\n\nfunction buildVersionSections(\n updates: Array<{ package: string; from: string; to: string; updated: boolean }>,\n dryRun: boolean,\n symbols: { success: string; error: string },\n): Array<{ header?: string; items: string[] }> {\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n if (dryRun) {\n sections.push({\n header: 'Would update (dry-run)',\n items: updates.map(u => `${symbols.success} ${u.package}: ${u.from} → ${u.to}`),\n });\n return sections;\n }\n\n const succeeded = updates.filter(u => u.updated);\n const failed = updates.filter(u => !u.updated);\n\n if (succeeded.length > 0) {\n sections.push({\n header: 'Updated',\n items: succeeded.map(u => `${symbols.success} ${u.package}: ${u.from} → ${u.to}`),\n });\n }\n\n if (failed.length > 0) {\n sections.push({\n header: 'Failed',\n items: failed.map(u => `${symbols.error} ${u.package}: ${u.from} → ${u.to}`),\n });\n }\n\n return sections;\n}\n\nexport default defineCommand({\n id: 'release:version',\n description: 'Bump package.json versions according to release plan',\n\n handler: {\n async intent(ctx: PluginContextV3, input: CLIInput<VersionFlags>) {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = { ...fileConfig, ...(flags.bump && { bump: flags.bump }) };\n\n const plan = await planRelease({\n cwd: repoRoot,\n config,\n scope: flags.scope,\n flow: flags.flow,\n bumpOverride: flags.bump as VersionBump | undefined,\n });\n\n return {\n summary: `Bump versions for ${plan.packages.length} package(s)`,\n operations: plan.packages.map(p => ({\n type: 'update' as const,\n resource: 'package-version',\n details: { package: p.name, from: p.currentVersion ?? 'unknown', to: p.nextVersion ?? 'unknown' },\n })),\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<VersionFlags>): Promise<ReleaseVersionResult> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = {\n ...fileConfig,\n ...(flags.bump && { bump: flags.bump }),\n };\n\n const planLoader = useLoader('Planning version bumps...');\n planLoader.start();\n // `flow` is mandatory here: without it planRelease() falls back to the\n // global package set, and a lockstep strategy then levels EVERY package\n // in the repo — including other flows' — onto this flow's version.\n const { plan, source, reason } = await resolvePlan({\n repoRoot,\n config,\n scope: flags.scope,\n flow: flags.flow,\n bumpOverride: flags.bump as VersionBump | undefined,\n stage: 'pre-bump',\n });\n ctx.platform?.logger?.debug?.('Release plan resolved', { source, reason });\n planLoader.succeed(\n `${source === 'artifact' ? 'Loaded' : 'Planned'} ${plan.packages.length} package(s)`,\n );\n\n if (plan.packages.length === 0) {\n const msg = `No packages found${flags.scope ? ` matching scope: ${flags.scope}` : ''}`;\n if (flags.json) { ctx.ui?.json?.({ ok: true, updated: 0, updates: [], message: msg }); }\n else { ctx.ui?.write?.(msg); }\n console.log('::kb-output::' + JSON.stringify({ ok: true, updated: 0 }));\n return { ok: true, result: { ok: true, updated: 0, updates: [] } };\n }\n\n const versionLoader = useLoader(`Bumping ${plan.packages.length} package version(s)...`);\n versionLoader.start();\n\n const updates = await updatePackageVersions(plan);\n const updated = updates.filter(u => u.updated).length;\n const ok = updates.every(u => u.updated);\n\n if (ok) {\n versionLoader.succeed(`Bumped ${updated} package version(s)`);\n } else {\n versionLoader.fail(`${updates.filter(u => !u.updated).length} update(s) failed`);\n }\n\n console.log('::kb-output::' + JSON.stringify({ ok, updated }));\n\n if (flags.json) {\n ctx.ui?.json?.({ ok, updated, updates });\n return ok ? { ok: true, result: { ok, updated, updates } } : { ok: false, error: 'Command failed', result: { ok, updated, updates } };\n }\n\n ctx.ui?.sideBox?.({\n title: 'Version Bump',\n sections: buildVersionSections(updates, false, ctx.ui.symbols),\n status: ok ? 'success' : 'error',\n });\n\n return ok ? { ok: true, result: { ok, updated, updates } } : { ok: false, error: 'Command failed', result: { ok, updated, updates } };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/shared/utils.ts","../../../src/shared/resolve-plan.ts","../../../src/cli/commands/version.ts"],"names":["planRelease"],"mappings":"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","file":"version.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Plan resolution shared by the atomic release steps that must act on the\n * SAME plan (`release:version` → `release:git`).\n *\n * Why this exists: each step used to call planRelease() independently and\n * hope the results matched. They don't have to — planning is a function of\n * disk state, and the step in between mutates exactly that state. A plan\n * re-derived after `release:version` sees the bumped versions as the new\n * baseline and bumps again, so the tag/commit message end up one version\n * ahead of the package.json files actually being committed.\n *\n * The plan written by `release:plan` is the single source of truth for a\n * pipeline run. It is only reused when it provably describes the current\n * state of the working tree, so a stale artifact (plan.json is committed to\n * the repo, so one is always present) can never be adopted silently.\n */\n\nimport { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport {\n planRelease,\n type ReleasePlan,\n type ReleaseConfig,\n type VersionBump,\n type ReleaseChannel,\n} from '@kb-labs/release-manager-core';\nimport { scopeToDir } from './utils';\n\n/**\n * Which side of the version bump the caller sits on — determines which field\n * of the plan the on-disk package.json versions are expected to match.\n */\nexport type PlanStage =\n /** `release:version`: bump not applied yet, disk should still be at currentVersion. */\n | 'pre-bump'\n /** `release:git`: bump already applied, disk should be at nextVersion. */\n | 'post-bump';\n\nexport interface ResolvePlanOptions {\n repoRoot: string;\n config: ReleaseConfig;\n scope?: string;\n flow?: string;\n bumpOverride?: VersionBump;\n channel?: ReleaseChannel;\n stage: PlanStage;\n}\n\nexport interface ResolvedPlan {\n plan: ReleasePlan;\n /** 'artifact' — reused the plan from `release:plan`; 'computed' — planned fresh. */\n source: 'artifact' | 'computed';\n /** Why the artifact was rejected, when source is 'computed' and one existed. */\n reason?: string;\n}\n\nexport function releasePlanPath(repoRoot: string, scope?: string): string {\n return join(repoRoot, '.kb', 'release', 'plans', scopeToDir(scope ?? 'root'), 'current', 'plan.json');\n}\n\nasync function readDiskVersion(packagePath: string): Promise<string | undefined> {\n try {\n const raw = await readFile(join(packagePath, 'package.json'), 'utf-8');\n return (JSON.parse(raw) as { version?: string }).version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Reject the persisted plan unless every package it covers is on disk at the\n * version this stage expects. That single check subsumes staleness, partial\n * runs, and out-of-band edits: any of them show up as a version mismatch.\n */\nasync function validateAgainstDisk(plan: ReleasePlan, stage: PlanStage): Promise<string | undefined> {\n const expectedField = stage === 'pre-bump' ? 'currentVersion' : 'nextVersion';\n\n for (const pkg of plan.packages) {\n const onDisk = await readDiskVersion(pkg.path);\n if (onDisk === undefined) {\n return `${pkg.name}: package.json not readable at ${pkg.path}`;\n }\n const expected = pkg[expectedField];\n if (onDisk !== expected) {\n return `${pkg.name}: expected ${expectedField} ${expected} on disk, found ${onDisk}`;\n }\n }\n\n return undefined;\n}\n\n/**\n * Load the plan produced by `release:plan` when it matches this run and the\n * working tree; otherwise plan fresh.\n */\nexport async function resolvePlan(options: ResolvePlanOptions): Promise<ResolvedPlan> {\n const { repoRoot, config, scope, flow, bumpOverride, channel, stage } = options;\n\n const computeFresh = async (reason?: string): Promise<ResolvedPlan> => ({\n plan: await planRelease({ cwd: repoRoot, config, scope, flow, bumpOverride, channel }),\n source: 'computed',\n ...(reason ? { reason } : {}),\n });\n\n let persisted: ReleasePlan;\n try {\n persisted = JSON.parse(await readFile(releasePlanPath(repoRoot, scope), 'utf-8')) as ReleasePlan;\n } catch {\n return computeFresh();\n }\n\n if (!Array.isArray(persisted.packages) || persisted.packages.length === 0) {\n return computeFresh('persisted plan has no packages');\n }\n\n // All flows share one scope-derived artifact path, so an unrelated flow's\n // plan can legitimately be sitting there. Never adopt it.\n if ((persisted.flow ?? undefined) !== (flow ?? undefined)) {\n return computeFresh(`persisted plan is for flow \"${persisted.flow ?? '<none>'}\", requested \"${flow ?? '<none>'}\"`);\n }\n if ((persisted.scope ?? undefined) !== (scope ?? undefined)) {\n return computeFresh(`persisted plan is for scope \"${persisted.scope ?? '<none>'}\", requested \"${scope ?? '<none>'}\"`);\n }\n if (channel !== undefined && persisted.channel !== channel) {\n return computeFresh(`persisted plan is for channel \"${persisted.channel}\", requested \"${channel}\"`);\n }\n\n const mismatch = await validateAgainstDisk(persisted, stage);\n if (mismatch) {\n return computeFresh(`persisted plan does not match working tree (${mismatch})`);\n }\n\n return { plan: persisted, source: 'artifact' };\n}\n","/**\n * Release version command — bump versions in package.json files.\n * Atomic step: reads plan, updates package.json versions, emits output marker for workflow.\n */\n\nimport { defineCommand, type CLIInput, type CommandResult, type PluginContextV3, useLoader, useConfig } from '@kb-labs/sdk';\nimport {\n planRelease,\n updatePackageVersions,\n type ReleaseConfig,\n type ReleaseChannel,\n type VersionBump,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { resolvePlan } from '../../shared/resolve-plan';\n\ninterface VersionFlags {\n scope?: string;\n flow?: string;\n bump?: 'patch' | 'minor' | 'major' | 'auto';\n channel?: ReleaseChannel;\n 'dry-run'?: boolean;\n json?: boolean;\n}\n\ntype ReleaseVersionResult = CommandResult<unknown>;\n\nfunction buildVersionSections(\n updates: Array<{ package: string; from: string; to: string; updated: boolean }>,\n dryRun: boolean,\n symbols: { success: string; error: string },\n): Array<{ header?: string; items: string[] }> {\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n if (dryRun) {\n sections.push({\n header: 'Would update (dry-run)',\n items: updates.map(u => `${symbols.success} ${u.package}: ${u.from} → ${u.to}`),\n });\n return sections;\n }\n\n const succeeded = updates.filter(u => u.updated);\n const failed = updates.filter(u => !u.updated);\n\n if (succeeded.length > 0) {\n sections.push({\n header: 'Updated',\n items: succeeded.map(u => `${symbols.success} ${u.package}: ${u.from} → ${u.to}`),\n });\n }\n\n if (failed.length > 0) {\n sections.push({\n header: 'Failed',\n items: failed.map(u => `${symbols.error} ${u.package}: ${u.from} → ${u.to}`),\n });\n }\n\n return sections;\n}\n\nexport default defineCommand({\n id: 'release:version',\n description: 'Bump package.json versions according to release plan',\n\n handler: {\n async intent(ctx: PluginContextV3, input: CLIInput<VersionFlags>) {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = {\n ...fileConfig,\n ...(flags.bump && { bump: flags.bump }),\n ...(flags.channel && { channel: flags.channel }),\n };\n\n const plan = await planRelease({\n cwd: repoRoot,\n config,\n scope: flags.scope,\n flow: flags.flow,\n bumpOverride: flags.bump as VersionBump | undefined,\n channel: config.channel,\n });\n\n return {\n summary: `Bump versions for ${plan.packages.length} package(s)`,\n operations: plan.packages.map(p => ({\n type: 'update' as const,\n resource: 'package-version',\n details: { package: p.name, from: p.currentVersion ?? 'unknown', to: p.nextVersion ?? 'unknown' },\n })),\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<VersionFlags>): Promise<ReleaseVersionResult> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = {\n ...fileConfig,\n ...(flags.bump && { bump: flags.bump }),\n ...(flags.channel && { channel: flags.channel }),\n };\n\n const planLoader = useLoader('Planning version bumps...');\n planLoader.start();\n // `flow` is mandatory here: without it planRelease() falls back to the\n // global package set, and a lockstep strategy then levels EVERY package\n // in the repo — including other flows' — onto this flow's version.\n //\n // `channel` must ALSO be threaded through explicitly (not left to\n // resolvePlan/planRelease's 'stable' default): if the persisted plan.json\n // is stale relative to the working tree (e.g. a canary run, which never\n // commits its bumped package.json files back to git — see\n // release-build-candidate.yml's \"Apply planned package versions\" step —\n // so the plan.json checked out for a later commit can legitimately still\n // reflect an older release), resolvePlan() correctly rejects it and\n // recomputes fresh via planRelease(). Without an explicit channel here,\n // that recompute silently defaults to 'stable' and drops the\n // -canary.<sha> suffix from EVERY package's nextVersion — not just one —\n // producing a plain version that only gets caught downstream if\n // something happens to compare that one package's sealed version\n // against the expected canary version (see prepare-release-index.mjs /\n // \"Verify sealed platform version\").\n const { plan, source, reason } = await resolvePlan({\n repoRoot,\n config,\n scope: flags.scope,\n flow: flags.flow,\n bumpOverride: flags.bump as VersionBump | undefined,\n channel: config.channel,\n stage: 'pre-bump',\n });\n ctx.platform?.logger?.debug?.('Release plan resolved', { source, reason });\n planLoader.succeed(\n `${source === 'artifact' ? 'Loaded' : 'Planned'} ${plan.packages.length} package(s)`,\n );\n\n if (plan.packages.length === 0) {\n const msg = `No packages found${flags.scope ? ` matching scope: ${flags.scope}` : ''}`;\n if (flags.json) { ctx.ui?.json?.({ ok: true, updated: 0, updates: [], message: msg }); }\n else { ctx.ui?.write?.(msg); }\n console.log('::kb-output::' + JSON.stringify({ ok: true, updated: 0 }));\n return { ok: true, result: { ok: true, updated: 0, updates: [] } };\n }\n\n const versionLoader = useLoader(`Bumping ${plan.packages.length} package version(s)...`);\n versionLoader.start();\n\n const updates = await updatePackageVersions(plan);\n const updated = updates.filter(u => u.updated).length;\n const ok = updates.every(u => u.updated);\n\n if (ok) {\n versionLoader.succeed(`Bumped ${updated} package version(s)`);\n } else {\n versionLoader.fail(`${updates.filter(u => !u.updated).length} update(s) failed`);\n }\n\n console.log('::kb-output::' + JSON.stringify({ ok, updated }));\n\n if (flags.json) {\n ctx.ui?.json?.({ ok, updated, updates });\n return ok ? { ok: true, result: { ok, updated, updates } } : { ok: false, error: 'Command failed', result: { ok, updated, updates } };\n }\n\n ctx.ui?.sideBox?.({\n title: 'Version Bump',\n sections: buildVersionSections(updates, false, ctx.ui.symbols),\n status: ok ? 'success' : 'error',\n });\n\n return ok ? { ok: true, result: { ok, updated, updates } } : { ok: false, error: 'Command failed', result: { ok, updated, updates } };\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/contracts/release.schema.ts"],"names":[],"mappings":";;;AAEO,IAAM,iBAAA,GAAoB,EAC9B,MAAA,CAAO;AAAA,EACN,UAAU,CAAA,CAAE,KAAA;AAAA,IACV,EAAE,MAAA,CAAO;AAAA,MACP,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,MACf,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,MACf,cAAA,EAAgB,EAAE,MAAA,EAAO;AAAA,MACzB,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,MACtB,IAAA,EAAM,EAAE,IAAA,CAAK,CAAC,SAAS,OAAA,EAAS,OAAA,EAAS,MAAM,CAAU,CAAA;AAAA,MACzD,WAAA,EAAa,EAAE,OAAA,EAAQ;AAAA,MACvB,cAAc,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,KAC5C;AAAA,GACH;AAAA,EACA,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,eAAA,EAAiB,EAAE,OAAA,EAAQ;AAAA,EAC3B,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,QAAQ,CAAU;AAC/C,CAAC,EACA,WAAA;AAEI,IAAM,mBAAA,GAAsB,EAChC,MAAA,CAAO;AAAA,EACN,aAAA,EAAe,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EAC9B,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,EACb,OAAA,EAAS,EACN,MAAA,CAAO;AAAA,IACN,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,IACf,GAAA,EAAK,EAAE,MAAA,EAAO;AAAA,IACd,MAAA,EAAQ,EAAE,MAAA,EAAO;AAAA,IACjB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC7B,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAC9B,EACA,WAAA,EAAY;AAAA,EACf,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,YAAY,YAAA,EAAc,YAAA,EAAc,WAAA,EAAa,UAAU,CAAU,CAAA;AAAA,EACpG,IAAA,EAAM,kBAAkB,QAAA,EAAS;AAAA,EACjC,MAAA,EAAQ,EACL,MAAA,CAAO;AAAA,IACN,EAAA,EAAI,EAAE,OAAA,EAAQ;AAAA,IACd,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC7B,WAAW,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IACxC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC/B,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS;AAAA,IAC/C,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,IACnB,QAAQ,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,GACtC,EACA,WAAA;AACL,CAAC,EACA,WAAA","file":"release.schema.js","sourcesContent":["import { z } from 'zod';\n\nexport const ReleasePlanSchema = z\n .object({\n packages: z.array(\n z.object({\n name: z.string(),\n path: z.string(),\n currentVersion: z.string(),\n nextVersion: z.string(),\n bump: z.enum(['patch', 'minor', 'major', 'auto'] as const),\n isPublished: z.boolean(),\n dependencies: z.array(z.string()).optional(),\n })\n ),\n strategy: z.string(),\n registry: z.string(),\n rollbackEnabled: z.boolean(),\n channel: z.enum(['stable', 'canary'] as const),\n })\n .passthrough();\n\nexport const ReleaseReportSchema = z\n .object({\n schemaVersion: z.literal('1.0'),\n ts: z.string(),\n context: z\n .object({\n repo: z.string(),\n cwd: z.string(),\n branch: z.string(),\n profile: z.string().optional(),\n dryRun: z.boolean().optional(),\n })\n .passthrough(),\n stage: z.enum(['planning', 'checking', 'versioning', 'publishing', 'verifying', 'rollback'] as const),\n plan: ReleasePlanSchema.optional(),\n result: z\n .object({\n ok: z.boolean(),\n version: z.string().optional(),\n published: z.array(z.string()).optional(),\n changelog: z.string().optional(),\n checks: z.record(z.string(), z.any()).optional(),\n timingMs: z.number(),\n errors: z.array(z.string()).optional(),\n })\n .passthrough(),\n })\n .passthrough();\n\nexport type ReleasePlanContract = z.infer<typeof ReleasePlanSchema>;\nexport type ReleaseReportContract = z.infer<typeof ReleaseReportSchema>;\n\n\n"]}
1
+ {"version":3,"sources":["../../src/contracts/release.schema.ts"],"names":[],"mappings":";;;AAEO,IAAM,iBAAA,GAAoB,EAC9B,MAAA,CAAO;AAAA,EACN,UAAU,CAAA,CAAE,KAAA;AAAA,IACV,EAAE,MAAA,CAAO;AAAA,MACP,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,MACf,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,MACf,cAAA,EAAgB,EAAE,MAAA,EAAO;AAAA,MACzB,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,MACtB,IAAA,EAAM,EAAE,IAAA,CAAK,CAAC,SAAS,OAAA,EAAS,OAAA,EAAS,MAAM,CAAU,CAAA;AAAA,MACzD,WAAA,EAAa,EAAE,OAAA,EAAQ;AAAA,MACvB,cAAc,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,KAC5C;AAAA,GACH;AAAA,EACA,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,eAAA,EAAiB,EAAE,OAAA,EAAQ;AAAA,EAC3B,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,QAAQ,CAAU;AAC/C,CAAC,EACA,WAAA;AAEI,IAAM,mBAAA,GAAsB,EAChC,MAAA,CAAO;AAAA,EACN,aAAA,EAAe,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EAC9B,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,EACb,OAAA,EAAS,EACN,MAAA,CAAO;AAAA,IACN,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,IACf,GAAA,EAAK,EAAE,MAAA,EAAO;AAAA,IACd,MAAA,EAAQ,EAAE,MAAA,EAAO;AAAA,IACjB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC7B,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAC9B,EACA,WAAA,EAAY;AAAA,EACf,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,YAAY,YAAA,EAAc,YAAA,EAAc,WAAA,EAAa,UAAU,CAAU,CAAA;AAAA,EACpG,IAAA,EAAM,kBAAkB,QAAA,EAAS;AAAA,EACjC,MAAA,EAAQ,EACL,MAAA,CAAO;AAAA,IACN,EAAA,EAAI,EAAE,OAAA,EAAQ;AAAA,IACd,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC7B,WAAW,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IACxC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC/B,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS;AAAA,IAC/C,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,IACnB,QAAQ,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,GACtC,EACA,WAAA;AACL,CAAC,EACA,WAAA","file":"release.schema.js","sourcesContent":["import { z } from 'zod';\n\nexport const ReleasePlanSchema = z\n .object({\n packages: z.array(\n z.object({\n name: z.string(),\n path: z.string(),\n currentVersion: z.string(),\n nextVersion: z.string(),\n bump: z.enum(['patch', 'minor', 'major', 'auto'] as const),\n isPublished: z.boolean(),\n dependencies: z.array(z.string()).optional(),\n })\n ),\n strategy: z.string(),\n registry: z.string(),\n rollbackEnabled: z.boolean(),\n channel: z.enum(['stable', 'canary'] as const),\n })\n .passthrough();\n\nexport const ReleaseReportSchema = z\n .object({\n schemaVersion: z.literal('1.0'),\n ts: z.string(),\n context: z\n .object({\n repo: z.string(),\n cwd: z.string(),\n branch: z.string(),\n profile: z.string().optional(),\n dryRun: z.boolean().optional(),\n })\n .passthrough(),\n stage: z.enum(['planning', 'checking', 'versioning', 'publishing', 'verifying', 'rollback'] as const),\n plan: ReleasePlanSchema.optional(),\n result: z\n .object({\n ok: z.boolean(),\n version: z.string().optional(),\n published: z.array(z.string()).optional(),\n changelog: z.string().optional(),\n checks: z.record(z.string(), z.any()).optional(),\n timingMs: z.number(),\n errors: z.array(z.string()).optional(),\n })\n .passthrough(),\n })\n .passthrough();\n\nexport type ReleasePlanContract = z.infer<typeof ReleasePlanSchema>;\nexport type ReleaseReportContract = z.infer<typeof ReleaseReportSchema>;\n\n\n"]}
package/dist/index.js CHANGED
@@ -497,12 +497,19 @@ var manifest = {
497
497
  default: "auto",
498
498
  description: "Version bump override"
499
499
  },
500
+ channel: {
501
+ type: "string",
502
+ choices: ["stable", "canary"],
503
+ default: "stable",
504
+ description: "Release channel \u2014 must match the channel `release plan` used, so a stale/rejected persisted plan is recomputed under the same channel instead of silently falling back to stable"
505
+ },
500
506
  "dry-run": { type: "boolean", description: "Show what would be bumped without writing" },
501
507
  json: { type: "boolean", description: "Output in JSON format" }
502
508
  }),
503
509
  examples: [
504
510
  "kb release version",
505
511
  "kb release version --bump minor",
512
+ "kb release version --channel canary",
506
513
  "kb release version --dry-run",
507
514
  "kb release version --scope platform --json"
508
515
  ]
@@ -523,6 +530,12 @@ var manifest = {
523
530
  choices: ["patch", "minor", "major", "auto"],
524
531
  description: "Version bump override (used to reload plan)"
525
532
  },
533
+ channel: {
534
+ type: "string",
535
+ choices: ["stable", "canary"],
536
+ default: "stable",
537
+ description: "Release channel \u2014 must match the channel `release plan`/`release version` used, so a stale/rejected persisted plan is recomputed under the same channel instead of silently falling back to stable"
538
+ },
526
539
  "dry-run": { type: "boolean", description: "Skip git operations" },
527
540
  "no-verify": { type: "boolean", description: "Pass --no-verify to git push" },
528
541
  json: { type: "boolean", description: "Output in JSON format" }